diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..8957940 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: NGnius +liberapay: NGnius diff --git a/.gitignore b/.gitignore index 29507bb..42c58cf 100644 --- a/.gitignore +++ b/.gitignore @@ -45,6 +45,7 @@ yalc.lock /bin/backend /backend/target /backend/out +/src/rust/target # packaged teasers *.zip diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 400e1cd..b270307 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -3,25 +3,64 @@ version = 3 [[package]] -name = "async-recursion" +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b015a331cc64ebd1774ba119538573603427eaace0a1950c423ab971f903796" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "anyhow" +version = "1.0.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener", +] + +[[package]] +name = "async-recursion" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] name = "async-trait" -version = "0.1.64" +version = "0.1.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd7fce9ba8c3c042128ce72d8b2ddbf3a05747efb67ea0313c635e10bda47a2" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -30,12 +69,33 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +[[package]] +name = "beef" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" + [[package]] name = "bitflags" version = "1.3.2" @@ -43,35 +103,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] -name = "block-buffer" -version = "0.10.3" +name = "bitflags" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ "generic-array", ] -[[package]] -name = "buf_redux" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b953a6887648bb07a535631f2bc00fbdb2a2216f135552cb3f534ed136b9c07f" -dependencies = [ - "memchr", - "safemem", -] - [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] [[package]] name = "cfg-if" @@ -80,34 +145,66 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "cpufeatures" -version = "0.2.5" +name = "convert_case" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cpufeatures" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" dependencies = [ "libc", ] [[package]] -name = "crypto-common" -version = "0.1.6" +name = "crc32fast" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ - "generic-array", - "typenum", + "cfg-if", +] + +[[package]] +name = "deranged" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 1.0.109", ] [[package]] name = "digest" -version = "0.10.6" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "block-buffer", - "crypto-common", + "generic-array", ] +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + [[package]] name = "encoding" version = "0.2.33" @@ -172,24 +269,65 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f258a7194e7f7c2a7837a8913aeab7fd8c383457034fa20ce4dd3dcb813e8eb8" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + [[package]] name = "fantastic-rs" -version = "0.4.2" +version = "0.5.0" dependencies = [ "log", + "nrpc 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "prost", "serde", "serde_json", "simplelog", + "sysfuss", + "tokio", "usdpl-back", + "usdpl-build 0.11.0", ] [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ - "instant", + "crc32fast", + "libz-sys", + "miniz_oxide", ] [[package]] @@ -200,18 +338,33 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] [[package]] -name = "futures-channel" -version = "0.3.26" +name = "futures" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -219,31 +372,63 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.26" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" + +[[package]] +name = "futures-executor" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" + +[[package]] +name = "futures-macro" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] [[package]] name = "futures-sink" -version = "0.3.26" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.26" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-util" -version = "0.3.26" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ + "futures-channel", "futures-core", + "futures-io", + "futures-macro", "futures-sink", "futures-task", + "memchr", "pin-project-lite", "pin-utils", "slab", @@ -251,9 +436,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.6" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -261,9 +446,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" dependencies = [ "cfg-if", "libc", @@ -281,127 +466,60 @@ dependencies = [ ] [[package]] -name = "h2" -version = "0.3.15" +name = "gimli" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" [[package]] name = "hashbrown" -version = "0.12.3" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" [[package]] -name = "headers" -version = "0.3.8" +name = "heck" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" -dependencies = [ - "base64", - "bitflags", - "bytes", - "headers-core", - "http", - "httpdate", - "mime", - "sha1", -] - -[[package]] -name = "headers-core" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" -dependencies = [ - "http", -] +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.2.6" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" + +[[package]] +name = "home" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" dependencies = [ - "libc", + "windows-sys", ] [[package]] name = "http" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", "itoa", ] -[[package]] -name = "http-body" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - [[package]] name = "httparse" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" -[[package]] -name = "httpdate" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" - -[[package]] -name = "hyper" -version = "0.14.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e011372fa0b68db8350aa7a248930ecc7839bf46d8485577d69f117a75f164c" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - [[package]] name = "idna" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -409,101 +527,218 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ - "autocfg", + "equivalent", "hashbrown", ] [[package]] -name = "instant" -version = "0.1.12" +name = "itertools" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ - "cfg-if", + "either", ] [[package]] name = "itoa" -version = "1.0.5" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.139" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" + +[[package]] +name = "libz-sys" +version = "1.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] [[package]] name = "log" -version = "0.4.17" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "logos" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c000ca4d908ff18ac99b93a062cb8958d331c3220719c52e77cb19cc6ac5d2c1" dependencies = [ - "cfg-if", + "logos-derive", +] + +[[package]] +name = "logos-codegen" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc487311295e0002e452025d6b580b77bb17286de87b57138f3b5db711cded68" +dependencies = [ + "beef", + "fnv", + "proc-macro2", + "quote", + "regex-syntax 0.6.29", + "syn 2.0.39", +] + +[[package]] +name = "logos-derive" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbfc0d229f1f42d790440136d941afd806bc9e949e2bcb8faa813b0f00d1267e" +dependencies = [ + "logos-codegen", ] [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] -name = "mime" -version = "0.3.16" +name = "miette" +version = "5.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" - -[[package]] -name = "mime_guess" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +checksum = "59bb584eaeeab6bd0226ccf3509a69d7936d148cf3d036ad350abe35e8c6856e" dependencies = [ - "mime", - "unicase", + "miette-derive", + "once_cell", + "thiserror", + "unicode-width", +] + +[[package]] +name = "miette-derive" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", ] [[package]] name = "mio" -version = "0.8.6" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", - "log", "wasi", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] -name = "multipart" -version = "0.18.0" +name = "multimap" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00dec633863867f29cb39df64a397cdf4a6354708ddd7759f70c7fb51c5f9182" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + +[[package]] +name = "nrpc" +version = "0.10.0" dependencies = [ - "buf_redux", - "httparse", - "log", - "mime", - "mime_guess", - "quick-error", - "rand", - "safemem", - "tempfile", - "twoway", + "async-trait", + "bytes", + "futures", + "prost", +] + +[[package]] +name = "nrpc" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb8807391415c7f5673c2431e723597bbf6a5c2f510aab30dc8d48d0c76f5d26" +dependencies = [ + "async-trait", + "bytes", + "futures", + "prost", +] + +[[package]] +name = "nrpc-build" +version = "0.10.0" +dependencies = [ + "nrpc 0.10.0", + "prettyplease 0.2.15", + "proc-macro2", + "prost-build", + "prost-types", + "protox", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "nrpc-build" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6d47eea1ccd03b060da4b19bec6ac8addcd0129c03b15905a158cd20389d6a4" +dependencies = [ + "nrpc 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "prettyplease 0.2.15", + "proc-macro2", + "prost-build", + "prost-types", + "protox", + "quote", + "syn 2.0.39", ] [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ "hermit-abi", "libc", @@ -519,42 +754,70 @@ dependencies = [ ] [[package]] -name = "once_cell" -version = "1.17.1" +name = "object" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" - -[[package]] -name = "percent-encoding" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" - -[[package]] -name = "pin-project" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" dependencies = [ - "pin-project-internal", + "memchr", ] [[package]] -name = "pin-project-internal" -version = "1.0.12" +name = "once_cell" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ - "proc-macro2", - "quote", - "syn", + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "percent-encoding" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" + +[[package]] +name = "petgraph" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +dependencies = [ + "fixedbitset", + "indexmap", ] [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -562,6 +825,18 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -569,25 +844,133 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] -name = "proc-macro2" -version = "1.0.51" +name = "prettyplease" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +dependencies = [ + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "prettyplease" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" +dependencies = [ + "proc-macro2", + "syn 2.0.39", +] + +[[package]] +name = "proc-macro2" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" dependencies = [ "unicode-ident", ] [[package]] -name = "quick-error" -version = "1.2.3" +name = "prost" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" +dependencies = [ + "bytes", + "heck", + "itertools", + "lazy_static", + "log", + "multimap", + "petgraph", + "prettyplease 0.1.25", + "prost", + "prost-types", + "regex", + "syn 1.0.109", + "tempfile", + "which", +] + +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "prost-reflect" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b823de344848e011658ac981009100818b322421676740546f8b52ed5249428" +dependencies = [ + "logos", + "miette", + "once_cell", + "prost", + "prost-types", +] + +[[package]] +name = "prost-types" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +dependencies = [ + "prost", +] + +[[package]] +name = "protox" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24022a7eb88547eaba87a1db7954c9c4cb4a143565c4e8f2b7f3e76eed63db2d" +dependencies = [ + "bytes", + "miette", + "prost", + "prost-reflect", + "prost-types", + "protox-parse", + "thiserror", +] + +[[package]] +name = "protox-parse" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712a2a651fa4466e67df6c967df5d7fc6cbffac89afc7b834f97ec49846c9c11" +dependencies = [ + "logos", + "miette", + "prost-types", + "thiserror", +] [[package]] name = "quote" -version = "1.0.23" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -623,120 +1006,213 @@ dependencies = [ ] [[package]] -name = "redox_syscall" -version = "0.2.16" +name = "ratchet_core" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags", -] - -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - -[[package]] -name = "rustls-pemfile" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eebeaeb360c87bfb72e84abdb3447159c0eaececf1bef2aecd65a8be949d1c9" +checksum = "faed301a9f297e8cd3617a2bc79ed17eefa88d5873ed08517c96628b48d1f386" dependencies = [ "base64", + "bitflags 1.3.2", + "bytes", + "derive_more", + "either", + "fnv", + "http", + "httparse", + "log", + "rand", + "ratchet_ext", + "sha-1", + "thiserror", + "tokio", + "tokio-util", + "url", +] + +[[package]] +name = "ratchet_deflate" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77238362df52f64482e0bd1c413d2d3d0e20052056ba4d88918ef2e962c86f11" +dependencies = [ + "bytes", + "flate2", + "http", + "log", + "ratchet_ext", + "thiserror", +] + +[[package]] +name = "ratchet_ext" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35f5bf3bd015a94b77730229e895e03af945627984ee5c4f95d40fd9227ea36b" +dependencies = [ + "bytes", + "http", + "httparse", +] + +[[package]] +name = "ratchet_rs" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62d326d7cd4227a7f58b36c1efb16b348f7e2e43e1d1ef032e9b094ff6cec583" +dependencies = [ + "ratchet_core", + "ratchet_deflate", + "ratchet_ext", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax 0.8.2", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.2", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ad981d6c340a49cdc40a1028d9c6084ec7e9fa33fcb839cab656a267071e234" +dependencies = [ + "bitflags 2.4.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", ] [[package]] name = "ryu" -version = "1.0.12" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] -name = "safemem" -version = "0.3.3" +name = "scopeguard" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] -name = "scoped-tls" -version = "1.0.1" +name = "semver" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] name = "serde" -version = "1.0.152" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.152" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] name = "serde_json" -version = "1.0.93" +version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cad406b69c91885b5107daf2c29572f6c8cdb3c66826821e286c533490c0bc76" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ "itoa", "ryu", "serde", ] -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - [[package]] name = "sha-1" -version = "0.10.1" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" dependencies = [ + "block-buffer", "cfg-if", "cpufeatures", "digest", + "opaque-debug", ] [[package]] -name = "sha1" -version = "0.10.5" +name = "signal-hook-registry" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" dependencies = [ - "cfg-if", - "cpufeatures", - "digest", + "libc", ] [[package]] name = "simplelog" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48dfff04aade74dd495b007c831cd6f4e0cee19c344dd9dc0884c0289b70a786" +checksum = "acee08041c5de3d5048c8b3f6f13fafb3026b24ba43c6a695a0c76179b844369" dependencies = [ "log", "termcolor", @@ -745,28 +1221,34 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] [[package]] -name = "socket2" -version = "0.4.7" +name = "smallvec" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" + +[[package]] +name = "socket2" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", - "winapi", + "windows-sys", ] [[package]] name = "syn" -version = "1.0.107" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", @@ -774,17 +1256,31 @@ dependencies = [ ] [[package]] -name = "tempfile" -version = "3.3.0" +name = "syn" +version = "2.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sysfuss" +version = "0.3.0" + +[[package]] +name = "tempfile" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if", "fastrand", - "libc", "redox_syscall", - "remove_dir_all", - "winapi", + "rustix", + "windows-sys", ] [[package]] @@ -798,33 +1294,35 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.38" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.38" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] name = "time" -version = "0.3.19" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53250a3b3fed8ff8fd988587d8925d26a83ac3845d9e03b220b37f34c2b8d6c2" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" dependencies = [ + "deranged", "itoa", "libc", "num_threads", + "powerfmt", "serde", "time-core", "time-macros", @@ -832,15 +1330,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.7" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a460aeb8de6dcb0f381e1ee05f1cd56fcf5a5f6eb8187ff3d8f0b11078d38b7c" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" dependencies = [ "time-core", ] @@ -862,145 +1360,65 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.25.0" +version = "1.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e00990ebabbe4c14c08aca901caed183ecd5c09562a12c824bb53d3c3fd3af" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" dependencies = [ - "autocfg", + "backtrace", "bytes", "libc", - "memchr", "mio", "num_cpus", + "parking_lot", "pin-project-lite", + "signal-hook-registry", "socket2", - "windows-sys 0.42.0", + "tokio-macros", + "windows-sys", ] [[package]] -name = "tokio-stream" -version = "0.1.12" +name = "tokio-macros" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb52b74f05dbf495a8fba459fdc331812b96aa086d9eb78101fa0d4569c3313" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f714dd15bead90401d77e04243611caec13726c2408afd5b31901dfcdcb3b181" -dependencies = [ - "futures-util", - "log", - "tokio", - "tungstenite", + "proc-macro2", + "quote", + "syn 2.0.39", ] [[package]] name = "tokio-util" -version = "0.7.7" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" dependencies = [ "bytes", "futures-core", "futures-sink", + "log", "pin-project-lite", "tokio", - "tracing", -] - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" -dependencies = [ - "cfg-if", - "log", - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" - -[[package]] -name = "tungstenite" -version = "0.17.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" -dependencies = [ - "base64", - "byteorder", - "bytes", - "http", - "httparse", - "log", - "rand", - "sha-1", - "thiserror", - "url", - "utf-8", -] - -[[package]] -name = "twoway" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b11b2b5241ba34be09c3cc85a36e56e48f9888862e19cedf23336d35316ed1" -dependencies = [ - "memchr", ] [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" - -[[package]] -name = "unicase" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -dependencies = [ - "version_check", -] +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" -version = "0.3.10" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.6" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" @@ -1012,10 +1430,16 @@ dependencies = [ ] [[package]] -name = "url" -version = "2.3.1" +name = "unicode-width" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" + +[[package]] +name = "url" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" dependencies = [ "form_urlencoded", "idna", @@ -1024,34 +1448,66 @@ dependencies = [ [[package]] name = "usdpl-back" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d185cc6e3f5d305e6e97f1b5cadf1da78bac6b62ea3457802d250708c315306" +checksum = "ee83f5c29870d706b5254d52c70bb2a6cba5b796c5ca46a776f781f9770c22ba" dependencies = [ + "async-lock", "async-recursion", "async-trait", "bytes", "gettext-ng", "log", + "nrpc 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "prost", + "ratchet_rs", "tokio", + "usdpl-build 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "usdpl-core", - "warp", +] + +[[package]] +name = "usdpl-build" +version = "0.11.0" +dependencies = [ + "nrpc-build 0.10.0", + "prettyplease 0.2.15", + "proc-macro2", + "prost-build", + "prost-types", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "usdpl-build" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b732dfafa3876eb2acc3ff17ffc8ed370662e68de3bdf541fbbddaa71ebf52be" +dependencies = [ + "nrpc-build 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "prettyplease 0.2.15", + "proc-macro2", + "prost-build", + "prost-types", + "quote", + "syn 2.0.39", ] [[package]] name = "usdpl-core" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd73bec3df5bed5862cab15aaa645d76c388e00128a14c372806907e2f331960" +checksum = "dad1ff724f8214657706c4c877181d68d65a4db1c782e0a08a74402fe7c480f5" dependencies = [ "base64", ] [[package]] -name = "utf-8" -version = "0.7.6" +name = "vcpkg" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" @@ -1059,53 +1515,24 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" -[[package]] -name = "want" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" -dependencies = [ - "log", - "try-lock", -] - -[[package]] -name = "warp" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed7b8be92646fc3d18b06147664ebc5f48d222686cb11a8755e561a735aacc6d" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "headers", - "http", - "hyper", - "log", - "mime", - "mime_guess", - "multipart", - "percent-encoding", - "pin-project", - "rustls-pemfile", - "scoped-tls", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-stream", - "tokio-tungstenite", - "tokio-util", - "tower-service", - "tracing", -] - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + [[package]] name = "winapi" version = "0.3.9" @@ -1124,9 +1551,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -1139,33 +1566,18 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.42.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" -version = "0.42.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -1178,42 +1590,42 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_msvc" -version = "0.42.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_i686_gnu" -version = "0.42.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_msvc" -version = "0.42.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_x86_64_gnu" -version = "0.42.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_msvc" -version = "0.42.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" diff --git a/backend/Cargo.toml b/backend/Cargo.toml index d887464..87498ff 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,17 +1,33 @@ [package] name = "fantastic-rs" -version = "0.4.2" +version = "0.5.0" edition = "2021" +authors = ["NGnius (Graham) "] +description = "Backend (superuser) functionality for Fantastic" +license = "GPL-3.0-only" +repository = "https://git.ngni.us/NG-SD-Plugins/Fantastic" +keywords = ["utility", "fan-control", "root", "decky"] +readme = "../README.md" + [dependencies] -usdpl-back = { version = "0.10", features = ["blocking", "decky"]} +usdpl-back = { version = "0.11", features = ["blocking", "decky"]} serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" +nrpc = { version = "0.10", default-features = false } #path = "../../nRPC/nrpc" } +prost = "0.11" +tokio = { version = "1", features = ["sync", "rt"] } + +sysfuss = { version = "0.3", features = ["derive"], path = "../../sysfs-nav" } + # logging log = "0.4" simplelog = "0.12" +[build-dependencies] +usdpl-build = { version = "0.11", path = "../../usdpl-rs/usdpl-build" } + [profile.release] debug = false strip = true diff --git a/backend/build.rs b/backend/build.rs new file mode 100644 index 0000000..d77b62e --- /dev/null +++ b/backend/build.rs @@ -0,0 +1,9 @@ +fn main() { + //println!("CWD: {}", std::env::current_dir().unwrap().display()); + usdpl_build::back::build([ + format!("{}/protos/fantastic.proto", std::env::current_dir().unwrap().display()) + ].into_iter(), + [ + format!("{}/protos/", std::env::current_dir().unwrap().display()) + ].into_iter()) +} diff --git a/backend/protos/fantastic.proto b/backend/protos/fantastic.proto new file mode 100644 index 0000000..72eaa1d --- /dev/null +++ b/backend/protos/fantastic.proto @@ -0,0 +1,136 @@ +syntax = "proto3"; + +package fantastic; + +// The most amazing fan service +service Fan { + // Send back the exact same message as received + rpc echo (EchoMessage) returns (EchoMessage); + + // Hello world + rpc hello (NameMessage) returns (HelloResponse); + + // Fantastic version info + rpc version (Empty) returns (VersionMessage); + + // Fantastic version number string + rpc version_str (Empty) returns (VersionDisplayMessage); + + // Rust name (fantastic) + rpc name (Empty) returns (NameMessage); + + // Get fan speed + rpc get_fan_rpm (Empty) returns (stream RpmMessage); + + // Get system temperature + rpc get_temperature (Empty) returns (stream TemperatureMessage); + + // Set custom fan control enabled + rpc set_enable (EnablementMessage) returns (EnablementMessage); + + // Get custon fan control status + rpc get_enable (Empty) returns (EnablementMessage); + + // Set fan control interpolation + rpc set_interpolate (EnablementMessage) returns (EnablementMessage); + + // Get fan control interpolation + rpc get_interpolate (Empty) returns (EnablementMessage); + + // Get fan control curve + rpc get_curve_x (Empty) returns (CurveMessageX); + + // Get fan control curve + rpc get_curve_y (Empty) returns (CurveMessageY); + + // Add a new point to the fan curve + rpc add_curve_point (GraphPoint) returns (Empty); + + // Remove a point from the fan curve + rpc remove_curve_point (IndexMessage) returns (Empty); + + /* + .register("echo", api::echo) + .register("hello", api::hello) + .register("version", api::version) + .register("name", api::name) + .register("get_fan_rpm", api::get_fan_rpm) + .register("get_temperature", api::get_temperature) + .register("set_enable", api::set_enable_gen(&runtime)) + .register("get_enable", api::get_enable_gen(&runtime)) + .register("set_interpolate", api::set_interpolate_gen(&runtime)) + .register("get_interpolate", api::get_interpolate_gen(&runtime)) + .register("get_curve", api::get_curve_gen(&runtime)) + .register("add_curve_point", api::add_curve_point_gen(&runtime)) + .register("remove_curve_point", api::remove_curve_point_gen(&runtime)) + */ +} + +// The request and response message for Echo +message EchoMessage { + string msg = 1; +} + +message NameMessage { + string name = 1; +} + +message HelloResponse { + string phrase = 1; +} + +message Empty { + bool ok = 1; +} + +message VersionMessage { + int32 major = 1; + int32 minor = 2; + int32 patch = 3; + //string display = 4; +} + +message VersionDisplayMessage { + string display = 1; +} + +message VersionStr { + string version_str = 1; +} + +message RpmMessage { + uint32 rpm = 1; +} + +message TemperatureMessage { + double temperature = 1; +} + +message EnablementMessage { + bool is_enabled = 1; +} + +message GraphPoint { + double x = 1; + double y = 2; +} + +/*message CurveMessage { + //repeated GraphPoint points = 1; + repeated double x = 1; + repeated double y = 2; +}*/ + +message CurveMessageX { + //repeated GraphPoint points = 1; + repeated double x = 1; +} + +message CurveMessageY { + //repeated GraphPoint points = 1; + repeated double y = 2; +} + +message IndexMessage { + uint32 index = 1; +} diff --git a/backend/src/api.rs b/backend/src/api.rs index 9ae5953..d3f541b 100644 --- a/backend/src/api.rs +++ b/backend/src/api.rs @@ -1,259 +1,224 @@ -use usdpl_back::core::serdes::Primitive; +use crate::services::fantastic::*; + +use usdpl_back::nrpc::_helpers::futures::{StreamExt, FutureExt}; use super::control::ControlRuntime; -use super::json::GraphPointJson; pub const VERSION: &'static str = env!("CARGO_PKG_VERSION"); pub const NAME: &'static str = env!("CARGO_PKG_NAME"); -pub fn hello(params: Vec) -> Vec { - if let Some(Primitive::String(name)) = params.get(0) { - vec![Primitive::String(format!("Hello {}", name))] - } else { - vec![] - } +const FAN_READ_PERIOD: std::time::Duration = std::time::Duration::from_millis(1000); +const TEMPERATURE_READ_PERIOD: std::time::Duration = std::time::Duration::from_millis(2000); + +pub struct FanService { + ctrl: ControlRuntime, } -pub fn echo(params: Vec) -> Vec { - params -} - -pub fn version(_: Vec) -> Vec { - vec![VERSION.into()] -} - -pub fn name(_: Vec) -> Vec { - vec![NAME.into()] -} - -pub fn get_fan_rpm(_: Vec) -> Vec { - if let Some(rpm) = crate::sys::read_fan() { - log::debug!("get_fan_rpm() success: {}", rpm); - vec![rpm.into()] - } else { - log::error!("get_fan_rpm failed to read fan speed"); - Vec::new() - } -} - -pub fn get_temperature(_: Vec) -> Vec { - if let Some(temperature) = crate::sys::read_thermal_zone(0) { - let real_temp = temperature as f64 / 1000.0; - log::debug!("get_temperature() success: {}", real_temp); - vec![real_temp.into()] - } else { - log::error!("get_fan_rpm failed to read fan speed"); - Vec::new() - } -} - -pub fn set_enable_gen(runtime: &ControlRuntime) -> impl Fn(Vec) -> Vec { - let runtime_settings = runtime.settings_clone(); - let runtime_state = runtime.state_clone(); - move |params| { - if let Some(Primitive::Bool(enabled)) = params.get(0) { - let mut settings = match runtime_settings.write() { - Ok(x) => x, - Err(e) => { - log::error!("set_enable failed to acquire settings write lock: {}", e); - return vec![]; - } - }; - if settings.enable != *enabled { - settings.enable = *enabled; - let mut state = match runtime_state.write() { - Ok(x) => x, - Err(e) => { - log::error!("set_enable failed to acquire state write lock: {}", e); - return vec![]; - } - }; - state.dirty = true; - log::debug!("set_enable({}) success", enabled); - } - vec![(*enabled).into()] - } else { - Vec::new() +impl FanService { + pub fn new(runtime: ControlRuntime) -> Self { + runtime.run(); + Self { + ctrl: runtime, } } } -pub fn get_enable_gen(runtime: &ControlRuntime) -> impl Fn(Vec) -> Vec { - let runtime_settings = runtime.settings_clone(); - move |_| { - let lock = match runtime_settings.read() { - Ok(x) => x, - Err(e) => { - log::error!("get_enable failed to acquire settings read lock: {}", e); - return vec![]; - } - }; - log::debug!("get_enable() success"); - vec![lock.enable.into()] - } +fn once_true() -> impl std::iter::Iterator { + // iters over [true, false, false, ...] + std::iter::once(true).chain(std::iter::repeat(false)) } -pub fn set_interpolate_gen(runtime: &ControlRuntime) -> impl Fn(Vec) -> Vec { - let runtime_settings = runtime.settings_clone(); - let runtime_state = runtime.state_clone(); - move |params| { - if let Some(Primitive::Bool(enabled)) = params.get(0) { - let mut settings = match runtime_settings.write() { - Ok(x) => x, - Err(e) => { - log::error!("set_enable failed to acquire settings write lock: {}", e); - return vec![]; - } - }; - if settings.interpolate != *enabled { - settings.interpolate = *enabled; - let mut state = match runtime_state.write() { - Ok(x) => x, - Err(e) => { - log::error!("set_interpolate failed to acquire state write lock: {}", e); - return vec![]; - } - }; - state.dirty = true; - log::debug!("set_interpolate({}) success", enabled); - } - vec![(*enabled).into()] - } else { - Vec::new() +#[usdpl_back::nrpc::_helpers::async_trait::async_trait] +impl<'a> IFan<'a> for FanService { + async fn echo( + &mut self, + input: EchoMessage, + ) -> Result> { + Ok(input) } - } -} - -pub fn get_interpolate_gen(runtime: &ControlRuntime) -> impl Fn(Vec) -> Vec { - let runtime_settings = runtime.settings_clone(); - move |_| { - let lock = match runtime_settings.read() { - Ok(x) => x, - Err(e) => { - log::error!("get_interpolate failed to acquire settings read lock: {}", e); - return vec![]; - } - }; - log::debug!("get_interpolate() success"); - vec![lock.interpolate.into()] - } -} - -fn curve_to_json(curve: &Vec) -> serde_json::Result { - let mut curve_points = Vec::::with_capacity(curve.len()); - for point in curve.iter() { - curve_points.push(point.clone().into()); - } - serde_json::to_string(&curve_points) -} - -pub fn get_curve_gen(runtime: &ControlRuntime) -> impl Fn(Vec) -> Vec { - let runtime_settings = runtime.settings_clone(); - move |_| { - let lock = match runtime_settings.read() { - Ok(x) => x, - Err(e) => { - log::error!("get_curve failed to acquire settings read lock: {}", e); - return vec![]; - } - }; - let json_str = match curve_to_json(&lock.curve) { - Ok(x) => x, - Err(e) => { - log::error!("get_curve failed to serialize points: {}", e); - return vec![]; - } - }; - log::debug!("get_curve() success"); - vec![Primitive::Json(json_str)] - } -} - -pub fn add_curve_point_gen(runtime: &ControlRuntime) -> impl Fn(Vec) -> Vec { - let runtime_settings = runtime.settings_clone(); - let runtime_state = runtime.state_clone(); - move |params| { - if let Some(Primitive::Json(json_str)) = params.get(0) { - let mut settings = match runtime_settings.write() { - Ok(x) => x, - Err(e) => { - log::error!("add_curve_point failed to acquire settings write lock: {}", e); - return vec![]; + async fn hello( + &mut self, + input: NameMessage, + ) -> Result> { + Ok(HelloResponse { + phrase: format!("Hello {}", input.name) + }) + } + async fn version( + &mut self, + _input: Empty, + ) -> Result> { + Ok( + VersionMessage { + major: 0, + minor: 0, + patch: 0, + //display: VERSION.to_string(), } - }; - let new_point: GraphPointJson = match serde_json::from_str(&json_str) { - Ok(x) => x, - Err(e) => { - log::error!("add_curve_point failed deserialize point json: {}", e); - return vec![]; + ) + } + async fn version_str( + &mut self, + _input: Empty, + ) -> Result> { + Ok( + VersionDisplayMessage { + display: VERSION.to_owned(), } - }; - let version = settings.version; - settings.curve.push(super::datastructs::GraphPoint::from_json(new_point, version)); + ) + } + async fn name( + &mut self, + _input: Empty, + ) -> Result> { + Ok( + NameMessage { + name: NAME.to_string(), + } + ) + } + async fn get_fan_rpm<'b: 'a>( + &mut self, + _input: Empty, + ) -> Result< + usdpl_back::nrpc::ServiceServerStream<'b, RpmMessage>, + Box, + > { + let hwmon = self.ctrl.hwmon_clone(); + let stream = usdpl_back::nrpc::_helpers::futures::stream::iter(once_true()).then(move |is_first| { + let hwmon = hwmon.clone(); + tokio::task::spawn_blocking( + /* tokio::time::sleep(..) is not Unpin (but this is)... *grumble grumble* */ + move || if !is_first { std::thread::sleep(FAN_READ_PERIOD); }) + .map(move |_| { + if let Some(rpm) = crate::sys::read_fan(&hwmon) { + log::debug!("get_fan_rpm() success: {}", rpm); + Ok(RpmMessage { rpm: rpm as u32 }) + } else { + Err(usdpl_back::nrpc::ServiceError::Method(Box::::from("Failed to read fan speed"))) + } + }) + }); + Ok(Box::new(stream)) + } + + async fn get_temperature<'b: 'a>( + &mut self, + _input: Empty, + ) -> Result< + usdpl_back::nrpc::ServiceServerStream<'b, TemperatureMessage>, + Box, + > { + let thermal_zone = self.ctrl.thermal_zone_clone(); + let stream = usdpl_back::nrpc::_helpers::futures::stream::iter(once_true()).then(move |is_first| { + let thermal_zone = thermal_zone.clone(); + tokio::task::spawn_blocking( + /* tokio::time::sleep(..) is not Unpin (but this is)... *grumble grumble* */ + move || if !is_first { std::thread::sleep(TEMPERATURE_READ_PERIOD); }) + .map(move |_| { + if let Some(temperature) = crate::sys::read_thermal_zone(&thermal_zone) { + let real_temp = temperature as f64 / 1000.0; + log::debug!("get_temperature() success: {}", real_temp); + Ok(TemperatureMessage { temperature: real_temp }) + } else { + Err(usdpl_back::nrpc::ServiceError::Method(Box::::from("get_temperature failed to read thermal zone 0"))) + } + }) + }); + Ok(Box::new(stream)) + } + + async fn set_enable( + &mut self, + input: EnablementMessage, + ) -> Result>{ + let mut settings = self.ctrl.settings().write().await; + if settings.enable != input.is_enabled { + let mut state = self.ctrl.state().write().await; + settings.enable = input.is_enabled; + state.dirty = true; + } + log::debug!("set_enable({}) success", input.is_enabled); + Ok(input) + } + async fn get_enable( + &mut self, + _input: Empty, + ) -> Result>{ + let is_enabled = self.ctrl.settings().read().await.enable; + log::debug!("get_enable() success"); + Ok(EnablementMessage { is_enabled }) + } + async fn set_interpolate( + &mut self, + input: EnablementMessage, + ) -> Result>{ + let mut settings = self.ctrl.settings().write().await; + if settings.interpolate != input.is_enabled { + let mut state = self.ctrl.state().write().await; + settings.interpolate = input.is_enabled; + state.dirty = true; + } + log::debug!("set_interpolate({}) success", input.is_enabled); + Ok(input) + } + async fn get_interpolate( + &mut self, + _input: Empty, + ) -> Result>{ + let is_enabled = self.ctrl.settings().read().await.interpolate; + log::debug!("get_interpolate() success"); + Ok(EnablementMessage { is_enabled }) + } + async fn get_curve_x( + &mut self, + _input: Empty, + ) -> Result>{ + let settings = self.ctrl.settings().read().await; + let x = settings.curve.iter().map(|p| p.x).collect(); + log::debug!("get_curve_x() success"); + Ok(CurveMessageX { x }) + } + async fn get_curve_y( + &mut self, + _input: Empty, + ) -> Result>{ + let settings = self.ctrl.settings().read().await; + let y = settings.curve.iter().map(|p| p.y).collect(); + log::debug!("get_curve_x() success"); + Ok(CurveMessageY { y }) + } + async fn add_curve_point( + &mut self, + point: GraphPoint, + ) -> Result>{ + let mut settings = self.ctrl.settings().write().await; + settings.curve.push(super::datastructs::GraphPoint { + x: point.x, + y: point.y + }); settings.sort_curve(); - let mut state = match runtime_state.write() { - Ok(x) => x, - Err(e) => { - log::error!("add_curve_point failed to acquire state write lock: {}", e); - return vec![]; - } - }; + let mut state = self.ctrl.state().write().await; state.dirty = true; - let json_str = match curve_to_json(&settings.curve) { - Ok(x) => x, - Err(e) => { - log::error!("add_curve_point failed to serialize points: {}", e); - return vec![]; - } - }; - log::debug!("add_curve_point({}) success", json_str); - vec![Primitive::Json(json_str)] - } else { - Vec::new() + log::debug!("add_curve_point(point: {:?}) success", point); + Ok(Empty { ok: true }) } - } -} - -pub fn remove_curve_point_gen(runtime: &ControlRuntime) -> impl Fn(Vec) -> Vec { - let runtime_settings = runtime.settings_clone(); - let runtime_state = runtime.state_clone(); - move |params| { - if let Some(Primitive::F64(index)) = params.get(0) { - let mut settings = match runtime_settings.write() { - Ok(x) => x, - Err(e) => { - log::error!("remove_curve_point failed to acquire settings write lock: {}", e); - return vec![]; - } - }; - let rounded = index.round(); - if rounded >= 0.0 && rounded < settings.curve.len() as _ { - let index = rounded as usize; - settings.curve.swap_remove(index); + async fn remove_curve_point( + &mut self, + input: IndexMessage, + ) -> Result>{ + let mut settings = self.ctrl.settings().write().await; + let i = input.index as usize; + if settings.curve.len() > i { + settings.curve.swap_remove(i); settings.sort_curve(); - let mut state = match runtime_state.write() { - Ok(x) => x, - Err(e) => { - log::error!("remove_curve_point failed to acquire state write lock: {}", e); - return vec![]; - } - }; + let mut state = self.ctrl.state().write().await; state.dirty = true; - let json_str = match curve_to_json(&settings.curve) { - Ok(x) => x, - Err(e) => { - log::error!("remove_curve_point failed to serialize points: {}", e); - return vec![]; - } - }; - log::debug!("remove_curve_point({}) success", json_str); - vec![Primitive::Json(json_str)] + log::debug!("remove_curve_point(point: {}) success", input.index); + Ok(Empty { ok: true }) } else { - log::error!("remove_curve_point received index out of bounds: {} indexing array of length {}", index, settings.curve.len()); - return vec![]; + log::debug!("remove_curve_point(index: {}) failed", input.index); + Ok(Empty { ok: false }) } - } else { - Vec::new() } - } } diff --git a/backend/src/control.rs b/backend/src/control.rs index c53a455..b1c11d5 100644 --- a/backend/src/control.rs +++ b/backend/src/control.rs @@ -1,18 +1,24 @@ //! Fan control -use std::sync::{RwLock, Arc}; +use std::sync::Arc; +use tokio::sync::RwLock; use std::thread; use std::time::{Duration, Instant}; +use sysfuss::{HwMonPath, BasicEntityPath}; + use super::datastructs::{Settings, State, GraphPoint}; use super::json::SettingsJson; const VALVE_FAN_SERVICE: &str = "jupiter-fan-control.service"; +const SYSFS_ROOT: &str = "/"; pub struct ControlRuntime { settings: Arc>, state: Arc>, + hwmon: Arc, + thermal_zone: Arc, } impl ControlRuntime { @@ -22,6 +28,8 @@ impl ControlRuntime { Self { settings: Arc::new(RwLock::new(super::json::SettingsJson::open(settings_p).unwrap_or_default().into())), state: Arc::new(RwLock::new(new_state)), + hwmon: Arc::new(crate::sys::find_hwmon(SYSFS_ROOT)), + thermal_zone: Arc::new(crate::sys::find_thermal_zone(SYSFS_ROOT)) } } @@ -33,9 +41,35 @@ impl ControlRuntime { self.state.clone() } + pub(crate) fn settings(&self) -> &'_ RwLock { + &self.settings + } + + pub(crate) fn state(&self) -> &'_ RwLock { + &self.state + } + + /*pub(crate) fn hwmon(&self) -> &'_ HwMonPath { + &self.hwmon + }*/ + + pub(crate) fn hwmon_clone(&self) -> Arc { + self.hwmon.clone() + } + + /*pub(crate) fn thermal_zone(&self) -> &'_ BasicEntityPath { + &self.thermal_zone + }*/ + + pub(crate) fn thermal_zone_clone(&self) -> Arc { + self.thermal_zone.clone() + } + pub fn run(&self) -> thread::JoinHandle<()> { let runtime_settings = self.settings_clone(); let runtime_state = self.state_clone(); + let runtime_hwmon = self.hwmon.clone(); + let runtime_thermal_zone = self.thermal_zone.clone(); thread::spawn(move || { let sleep_duration = Duration::from_millis(1000); let mut start_time = Instant::now(); @@ -44,70 +78,34 @@ impl ControlRuntime { // resumed from sleep; do fan re-init log::debug!("Detected resume from sleep, overriding fan again"); { - let state = match runtime_state.read() { - Ok(x) => x, - Err(e) => { - log::error!("runtime failed to acquire state read lock: {}", e); - continue; - } - }; - let settings = match runtime_settings.read() { - Ok(x) => x, - Err(e) => { - log::error!("runtime failed to acquire settings read lock: {}", e); - continue; - } - }; + let state = runtime_state.blocking_read(); + let settings = runtime_settings.blocking_read(); if settings.enable { - Self::on_set_enable(&settings, &state); + Self::on_set_enable(&settings, &state, &runtime_hwmon); } } } start_time = Instant::now(); { // save to file - let state = match runtime_state.read() { - Ok(x) => x, - Err(e) => { - log::error!("runtime failed to acquire state read lock: {}", e); - continue; - } - }; + let state = runtime_state.blocking_read(); if state.dirty { // save settings to file - let settings = match runtime_settings.read() { - Ok(x) => x, - Err(e) => { - log::error!("runtime failed to acquire settings read lock: {}", e); - continue; - } - }; + let settings = runtime_settings.blocking_read(); let settings_json: SettingsJson = settings.clone().into(); if let Err(e) = settings_json.save(settings_path(&state.home)) { log::error!("SettingsJson.save({}) error: {}", settings_path(&state.home).display(), e); } - Self::on_set_enable(&settings, &state); + Self::on_set_enable(&settings, &state, &runtime_hwmon); drop(state); - let mut state = match runtime_state.write() { - Ok(x) => x, - Err(e) => { - log::error!("runtime failed to acquire state write lock: {}", e); - continue; - } - }; + let mut state = runtime_state.blocking_write(); state.dirty = false; } } { // fan control - let settings = match runtime_settings.read() { - Ok(x) => x, - Err(e) => { - log::error!("runtime failed to acquire settings read lock: {}", e); - continue; - } - }; + let settings = runtime_settings.blocking_read(); if settings.enable { Self::enforce_jupiter_status(true); - Self::do_fan_control(&settings); + Self::do_fan_control(&settings, &runtime_hwmon, &runtime_thermal_zone); } } thread::sleep(sleep_duration); @@ -115,15 +113,15 @@ impl ControlRuntime { }) } - fn on_set_enable(settings: &Settings, _state: &State) { + fn on_set_enable(settings: &Settings, _state: &State, hwmon: &HwMonPath) { // stop/start jupiter fan control (since the client-side way of doing this was removed :( ) Self::enforce_jupiter_status(settings.enable); - if let Err(e) = crate::sys::write_fan_recalc(settings.enable) { + if let Err(e) = crate::sys::write_fan_recalc(hwmon, settings.enable) { log::error!("runtime failed to write to fan recalculate file: {}", e); } } - fn do_fan_control(settings: &Settings) { + fn do_fan_control(settings: &Settings, hwmon: &HwMonPath, thermal_zone: &BasicEntityPath) { /* curve = self.settings["curve"] fan_ratio = 0 # unnecessary in Python, but stupid without @@ -142,7 +140,7 @@ impl ControlRuntime { fan_ratio = self.step_fan(self, index, temperature_ratio) set_fan_target(int((fan_ratio * FAN_MAXIMUM) + FAN_MINIMUM)) */ - let fan_ratio: f64 = if let Some(thermal_zone) = crate::sys::read_thermal_zone(0) { + let fan_ratio: f64 = if let Some(thermal_zone) = crate::sys::read_thermal_zone(thermal_zone) { let temperature_ratio = (((thermal_zone as f64)/1000.0) - settings.temperature_bounds.min) / (settings.temperature_bounds.max - settings.temperature_bounds.min); let mut index = None; @@ -161,7 +159,7 @@ impl ControlRuntime { 1.0 }; let fan_speed: u64 = ((fan_ratio * (settings.fan_bounds.max - settings.fan_bounds.min)) + settings.fan_bounds.min) as _; - if let Err(e) = crate::sys::write_fan_target(fan_speed) { + if let Err(e) = crate::sys::write_fan_target(hwmon, fan_speed) { log::error!("runtime failed to write to fan target file: {}", e); } } diff --git a/backend/src/main.rs b/backend/src/main.rs index 0142f1f..3c7fb65 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -6,7 +6,13 @@ mod sys; use simplelog::{WriteLogger, LevelFilter}; -use usdpl_back::Instance; +#[allow(missing_docs)] +#[allow(dead_code)] +pub mod services { + include!(concat!(env!("OUT_DIR"), "/mod.rs")); +} + +use services::fantastic::FanServer; const PORT: u16 = 44444; @@ -20,9 +26,14 @@ fn main() -> Result<(), ()> { log::info!("Starting back-end ({} v{})", api::NAME, api::VERSION); println!("Starting back-end ({} v{})", api::NAME, api::VERSION); - let runtime = control::ControlRuntime::new(); - runtime.run(); - Instance::new(PORT) + usdpl_back::Server::new(PORT) + .register(FanServer::new( + api::FanService::new(control::ControlRuntime::new()) + )) + .run_blocking() + .unwrap(); + Ok(()) + /*Instance::new(PORT) .register("echo", api::echo) .register("hello", api::hello) .register("version", api::version) @@ -36,7 +47,7 @@ fn main() -> Result<(), ()> { .register("get_curve", api::get_curve_gen(&runtime)) .register("add_curve_point", api::add_curve_point_gen(&runtime)) .register("remove_curve_point", api::remove_curve_point_gen(&runtime)) - .run_blocking() + .run_blocking()*/ //Ok(()) //println!("Hello, world!"); } diff --git a/backend/src/sys.rs b/backend/src/sys.rs index 298284b..85706d2 100644 --- a/backend/src/sys.rs +++ b/backend/src/sys.rs @@ -1,19 +1,83 @@ -use usdpl_back::api::files::*; +use sysfuss::{SysPath, capability::attributes, SysEntityAttributesExt}; +use sysfuss::{BasicEntityPath, HwMonPath, HwMonAttribute, HwMonAttributeType, HwMonAttributeItem}; -const HWMON_INDEX: usize = 5; +const HWMON_INDEX: u64 = 5; -pub fn read_fan() -> Option { - read_single(format!("/sys/class/hwmon/hwmon{}/fan1_input", HWMON_INDEX)).ok() +pub const RECALCULATE_ATTR: HwMonAttribute = HwMonAttribute::custom("recalculate"); +pub const FAN1_INPUT_ATTR: HwMonAttribute = HwMonAttribute::new(HwMonAttributeType::Fan, 1, HwMonAttributeItem::Input); +pub const FAN1_LABEL_ATTR: HwMonAttribute = HwMonAttribute::new(HwMonAttributeType::Fan, 1, HwMonAttributeItem::Label); +pub const FAN1_TARGET_ATTR: HwMonAttribute = HwMonAttribute::custom("fan1_target"); + +const HWMON_NEEDS: [HwMonAttribute; 3] = [ + //RECALCULATE_ATTR, + FAN1_INPUT_ATTR, + FAN1_TARGET_ATTR, + FAN1_LABEL_ATTR, +]; + +pub fn read_fan(hwmon: &HwMonPath) -> Option { + match hwmon.attribute(FAN1_INPUT_ATTR){ + Ok(x) => Some(x), + Err(e) => { + log::error!("Failed read_fan(): {}", e); + None + }, + } } -pub fn read_thermal_zone(index: u8) -> Option { - read_single(format!("/sys/class/thermal/thermal_zone{}/temp", index)).ok() +pub fn read_thermal_zone(entity: &BasicEntityPath) -> Option { + match entity.attribute("temp".to_owned()) { + Ok(x) => Some(x), + Err(e) => { + log::error!("Failed read_thermal_zone(): {}", e); + None + }, + } } -pub fn write_fan_recalc(enabled: bool) -> Result<(), std::io::Error> { - write_single(format!("/sys/class/hwmon/hwmon{}/recalculate", HWMON_INDEX), enabled as u8) +pub fn write_fan_recalc(hwmon: &HwMonPath, enabled: bool) -> Result<(), std::io::Error> { + hwmon.set(RECALCULATE_ATTR, enabled as u8) + //write_single(format!("/sys/class/hwmon/hwmon{}/recalculate", HWMON_INDEX), enabled as u8) } -pub fn write_fan_target(rpm: u64) -> Result<(), std::io::Error> { - write_single(format!("/sys/class/hwmon/hwmon{}/fan1_target", HWMON_INDEX), rpm) +pub fn write_fan_target(hwmon: &HwMonPath, rpm: u64) -> Result<(), std::io::Error> { + hwmon.set(FAN1_TARGET_ATTR, rpm) + //write_single(format!("/sys/class/hwmon/hwmon{}/fan1_target", HWMON_INDEX), rpm) +} + +pub fn find_hwmon>(path: P) -> HwMonPath { + let syspath = SysPath::path(path); + match syspath.hwmon(attributes(HWMON_NEEDS.into_iter())) + { + Err(e) => { + log::error!("sysfs hwmon iter error: {}", e); + syspath.hwmon_by_index(HWMON_INDEX) + }, + Ok(mut iter) => { + iter.next() + .unwrap_or_else(|| { + log::error!("sysfs hwmon iter empty: [no capable results]"); + syspath.hwmon_by_index(HWMON_INDEX) + }) + } + } +} + +pub fn find_thermal_zone>(path: P) -> BasicEntityPath { + let syspath = SysPath::path(path); + match syspath.class("thermal", + |ent: &BasicEntityPath| ent.exists(&"temp".to_owned()) && ent.exists(&"type".to_owned()) && ent.attribute("type".to_owned()).map(|val: String| val.to_lowercase() != "processor").unwrap_or(false)) + { + Err(e) => { + log::error!("sysfs thermal class iter error: {}", e); + BasicEntityPath::new("/sys/class/thermal/thermal_zone0") + }, + Ok(mut iter) => { + iter.next() + .unwrap_or_else(|| { + log::error!("sysfs thermal class iter empty: [no capable results]"); + BasicEntityPath::new("/sys/class/thermal/thermal_zone0") + }) + } + } } diff --git a/package.json b/package.json index c3415c9..dc37dca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "Fantastic", - "version": "0.4.2", + "version": "0.5.0", "description": "A template to quickly create decky plugins from scratch, based on TypeScript and webpack", "scripts": { "build": "shx rm -rf dist && rollup -c", @@ -32,17 +32,17 @@ "@rollup/plugin-replace": "^4.0.0", "@rollup/plugin-typescript": "^8.5.0", "@types/react": "16.14.0", - "@types/webpack": "^5.28.1", + "@types/webpack": "^5.28.2", "rollup": "^2.79.1", "rollup-plugin-import-assets": "^1.1.1", "shx": "^0.3.4", - "tslib": "^2.5.2", + "tslib": "^2.6.2", "typescript": "^4.9.5" }, "dependencies": { - "decky-frontend-lib": "~3.21.1", - "react-icons": "^4.9.0", - "usdpl-front": "file:src/usdpl" + "decky-frontend-lib": "~3.22.0", + "fantastic-wasm": "file:src/rust/pkg", + "react-icons": "^4.10.1" }, "pnpm": { "peerDependencyRules": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 90abdc7..327d527 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,14 +6,14 @@ settings: dependencies: decky-frontend-lib: - specifier: ~3.21.1 - version: 3.21.1 + specifier: ~3.22.0 + version: 3.22.0 + fantastic-wasm: + specifier: file:src/rust/pkg + version: file:src/rust/pkg react-icons: - specifier: ^4.9.0 - version: 4.9.0 - usdpl-front: - specifier: file:src/usdpl - version: file:src/usdpl + specifier: ^4.10.1 + version: 4.10.1 devDependencies: '@rollup/plugin-commonjs': @@ -30,13 +30,13 @@ devDependencies: version: 4.0.0(rollup@2.79.1) '@rollup/plugin-typescript': specifier: ^8.5.0 - version: 8.5.0(rollup@2.79.1)(tslib@2.5.2)(typescript@4.9.5) + version: 8.5.0(rollup@2.79.1)(tslib@2.6.2)(typescript@4.9.5) '@types/react': specifier: 16.14.0 version: 16.14.0 '@types/webpack': - specifier: ^5.28.1 - version: 5.28.1 + specifier: ^5.28.2 + version: 5.28.2 rollup: specifier: ^2.79.1 version: 2.79.1 @@ -47,8 +47,8 @@ devDependencies: specifier: ^0.3.4 version: 0.3.4 tslib: - specifier: ^2.5.2 - version: 2.5.2 + specifier: ^2.6.2 + version: 2.6.2 typescript: specifier: ^4.9.5 version: 4.9.5 @@ -61,11 +61,11 @@ packages: dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/trace-mapping': 0.3.19 dev: true - /@jridgewell/resolve-uri@3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} dev: true @@ -74,26 +74,22 @@ packages: engines: {node: '>=6.0.0'} dev: true - /@jridgewell/source-map@0.3.3: - resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==} + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - - /@jridgewell/sourcemap-codec@1.4.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + '@jridgewell/trace-mapping': 0.3.19 dev: true /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true - /@jridgewell/trace-mapping@0.3.18: - resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + /@jridgewell/trace-mapping@0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 dev: true /@rollup/plugin-commonjs@21.1.0(rollup@2.79.1): @@ -108,7 +104,7 @@ packages: glob: 7.2.3 is-reference: 1.2.1 magic-string: 0.25.9 - resolve: 1.22.2 + resolve: 1.22.4 rollup: 2.79.1 dev: true @@ -132,7 +128,7 @@ packages: deepmerge: 4.3.1 is-builtin-module: 3.2.1 is-module: 1.0.0 - resolve: 1.22.2 + resolve: 1.22.4 rollup: 2.79.1 dev: true @@ -146,7 +142,7 @@ packages: rollup: 2.79.1 dev: true - /@rollup/plugin-typescript@8.5.0(rollup@2.79.1)(tslib@2.5.2)(typescript@4.9.5): + /@rollup/plugin-typescript@8.5.0(rollup@2.79.1)(tslib@2.6.2)(typescript@4.9.5): resolution: {integrity: sha512-wMv1/scv0m/rXx21wD2IsBbJFba8wGF3ErJIr6IKRfRj49S85Lszbxb4DCo8iILpluTjk2GAAu9CoZt4G3ppgQ==} engines: {node: '>=8.0.0'} peerDependencies: @@ -158,9 +154,9 @@ packages: optional: true dependencies: '@rollup/pluginutils': 3.1.0(rollup@2.79.1) - resolve: 1.22.2 + resolve: 1.22.4 rollup: 2.79.1 - tslib: 2.5.2 + tslib: 2.6.2 typescript: 4.9.5 dev: true @@ -179,12 +175,12 @@ packages: /@types/eslint-scope@3.7.4: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: - '@types/eslint': 8.40.0 + '@types/eslint': 8.44.2 '@types/estree': 1.0.1 dev: true - /@types/eslint@8.40.0: - resolution: {integrity: sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==} + /@types/eslint@8.44.2: + resolution: {integrity: sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==} dependencies: '@types/estree': 1.0.1 '@types/json-schema': 7.0.12 @@ -202,8 +198,8 @@ packages: resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} dev: true - /@types/node@20.2.5: - resolution: {integrity: sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==} + /@types/node@20.5.9: + resolution: {integrity: sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==} dev: true /@types/prop-types@15.7.5: @@ -220,15 +216,15 @@ packages: /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 20.2.5 + '@types/node': 20.5.9 dev: true - /@types/webpack@5.28.1: - resolution: {integrity: sha512-qw1MqGZclCoBrpiSe/hokSgQM/su8Ocpl3L/YHE0L6moyaypg4+5F7Uzq7NgaPKPxUxUbQ4fLPLpDWdR27bCZw==} + /@types/webpack@5.28.2: + resolution: {integrity: sha512-7tcxyrIOd7WGimZIcWU6pDsNh2edGGnwYExOvd3l/nMvuxqwVPrFXnnTbYCnplqV9BJoU7Mo2mfFtiH8CNFvYw==} dependencies: - '@types/node': 20.2.5 + '@types/node': 20.5.9 tapable: 2.2.1 - webpack: 5.84.1 + webpack: 5.88.2 transitivePeerDependencies: - '@swc/core' - esbuild @@ -350,16 +346,16 @@ packages: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} dev: true - /acorn-import-assertions@1.9.0(acorn@8.8.2): + /acorn-import-assertions@1.9.0(acorn@8.10.0): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.8.2 + acorn: 8.10.0 dev: true - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} hasBin: true dev: true @@ -391,16 +387,15 @@ packages: balanced-match: 1.0.2 concat-map: 0.0.1 dev: true - - /browserslist@4.21.7: - resolution: {integrity: sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==} + /browserslist@4.21.10: + resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001489 - electron-to-chromium: 1.4.413 - node-releases: 2.0.12 - update-browserslist-db: 1.0.11(browserslist@4.21.7) + caniuse-lite: 1.0.30001525 + electron-to-chromium: 1.4.508 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.10) dev: true /buffer-from@1.1.2: @@ -412,8 +407,8 @@ packages: engines: {node: '>=6'} dev: true - /caniuse-lite@1.0.30001489: - resolution: {integrity: sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==} + /caniuse-lite@1.0.30001525: + resolution: {integrity: sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q==} dev: true /chrome-trace-event@1.0.3: @@ -437,8 +432,8 @@ packages: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} dev: true - /decky-frontend-lib@3.21.1: - resolution: {integrity: sha512-30605ET9qqZ6St6I9WmMmLGgSrTIdMwo7xy85+lRaF1miUd2icOGEJjwnbVcZDdkal+1fJ3tNEDXlchVfG4TrA==} + /decky-frontend-lib@3.22.0: + resolution: {integrity: sha512-MJ0y0bhNMHJyMVxHht3O0L0GxdT9sckUmh35HG7/ERqyZQsfKpDqOeW6pC1R07SnuWwgbl4fY3tzjlrb7qUeoA==} dev: false /deepmerge@4.3.1: @@ -446,20 +441,20 @@ packages: engines: {node: '>=0.10.0'} dev: true - /electron-to-chromium@1.4.413: - resolution: {integrity: sha512-Gd+/OAhRca06dkVxIQo/W7dr6Nmk9cx6lQdZ19GvFp51k5B/lUAokm6SJfNkdV8kFLsC3Z4sLTyEHWCnB1Efbw==} + /electron-to-chromium@1.4.508: + resolution: {integrity: sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==} dev: true - /enhanced-resolve@5.14.1: - resolution: {integrity: sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==} + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 dev: true - /es-module-lexer@1.2.1: - resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} + /es-module-lexer@1.3.0: + resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} dev: true /escalade@3.1.1: @@ -521,8 +516,8 @@ packages: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true @@ -587,8 +582,8 @@ packages: builtin-modules: 3.3.0 dev: true - /is-core-module@2.12.1: - resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} dependencies: has: 1.0.3 dev: true @@ -607,7 +602,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.2.5 + '@types/node': 20.5.9 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -661,8 +656,8 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true - /node-releases@2.0.12: - resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} dev: true /once@1.4.0: @@ -700,8 +695,8 @@ packages: safe-buffer: 5.2.1 dev: true - /react-icons@4.9.0: - resolution: {integrity: sha512-ijUnFr//ycebOqujtqtV9PFS7JjhWg0QU6ykURVHuL4cbofvRCf3f6GMn9+fBktEFQOIVZnuAYLZdiyadRQRFg==} + /react-icons@4.10.1: + resolution: {integrity: sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==} peerDependencies: react: '*' peerDependenciesMeta: @@ -713,14 +708,14 @@ packages: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} dependencies: - resolve: 1.22.2 + resolve: 1.22.4 dev: true - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + /resolve@1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} hasBin: true dependencies: - is-core-module: 2.12.1 + is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -746,15 +741,15 @@ packages: engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: true - /schema-utils@3.1.2: - resolution: {integrity: sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==} + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} dependencies: '@types/json-schema': 7.0.12 @@ -821,7 +816,7 @@ packages: engines: {node: '>=6'} dev: true - /terser-webpack-plugin@5.3.9(webpack@5.84.1): + /terser-webpack-plugin@5.3.9(webpack@5.88.2): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -837,27 +832,27 @@ packages: uglify-js: optional: true dependencies: - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/trace-mapping': 0.3.19 jest-worker: 27.5.1 - schema-utils: 3.1.2 + schema-utils: 3.3.0 serialize-javascript: 6.0.1 - terser: 5.17.6 - webpack: 5.84.1 + terser: 5.19.3 + webpack: 5.88.2 dev: true - /terser@5.17.6: - resolution: {integrity: sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ==} + /terser@5.19.3: + resolution: {integrity: sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg==} engines: {node: '>=10'} hasBin: true dependencies: - '@jridgewell/source-map': 0.3.3 - acorn: 8.8.2 + '@jridgewell/source-map': 0.3.5 + acorn: 8.10.0 commander: 2.20.3 source-map-support: 0.5.21 dev: true - /tslib@2.5.2: - resolution: {integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==} + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: true /typescript@4.9.5: @@ -866,13 +861,13 @@ packages: hasBin: true dev: true - /update-browserslist-db@1.0.11(browserslist@4.21.7): + /update-browserslist-db@1.0.11(browserslist@4.21.10): resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.7 + browserslist: 4.21.10 escalade: 3.1.1 picocolors: 1.0.0 dev: true @@ -900,8 +895,8 @@ packages: engines: {node: '>=10.13.0'} dev: true - /webpack@5.84.1: - resolution: {integrity: sha512-ZP4qaZ7vVn/K8WN/p990SGATmrL1qg4heP/MrVneczYtpDGJWlrgZv55vxaV2ul885Kz+25MP2kSXkPe3LZfmg==} + /webpack@5.88.2: + resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -915,12 +910,12 @@ packages: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/wasm-edit': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.8.2 - acorn-import-assertions: 1.9.0(acorn@8.8.2) - browserslist: 4.21.7 + acorn: 8.10.0 + acorn-import-assertions: 1.9.0(acorn@8.10.0) + browserslist: 4.21.10 chrome-trace-event: 1.0.3 - enhanced-resolve: 5.14.1 - es-module-lexer: 1.2.1 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.3.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -929,9 +924,9 @@ packages: loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 3.1.2 + schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.84.1) + terser-webpack-plugin: 5.3.9(webpack@5.88.2) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -944,8 +939,8 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - file:src/usdpl: - resolution: {directory: src/usdpl, type: directory} - name: usdpl-front - version: 0.10.0 + file:src/rust/pkg: + resolution: {directory: src/rust/pkg, type: directory} + name: fantastic-wasm + version: 0.5.0 dev: false diff --git a/src/backend.ts b/src/backend.ts index c02e8d4..4dc256f 100644 --- a/src/backend.ts +++ b/src/backend.ts @@ -1,7 +1,15 @@ -import {init_usdpl, target_usdpl, init_embedded, call_backend} from "usdpl-front"; +//import {init_usdpl, target_usdpl, init_embedded, call_backend} from "usdpl-front"; + +import { init_embedded, target_usdpl } from "fantastic-wasm"; +import { Fan } from "fantastic-wasm"; + +//@ts-ignore +//const Fan = {}; const USDPL_PORT: number = 44444; +var FAN_CLIENT: Fan | undefined = undefined; + // Utility export function resolve(promise: Promise, setter: any) { @@ -26,7 +34,7 @@ export function execute(promise: Promise) { export async function initBackend() { // init usdpl await init_embedded(); - init_usdpl(USDPL_PORT); + FAN_CLIENT = new Fan(USDPL_PORT); console.log("FANTASTIC: USDPL started for framework: " + target_usdpl()); //setReady(true); } @@ -34,45 +42,62 @@ export async function initBackend() { // Back-end functions export async function setEnabled(value: boolean): Promise { - return (await call_backend("set_enable", [value]))[0]; + return (await FAN_CLIENT!.set_enable(value))?? value; + //return (await call_backend("set_enable", [value]))[0]; } export async function getEnabled(): Promise { - return (await call_backend("get_enable", []))[0]; + return (await FAN_CLIENT!.get_enable(true)) ?? false; } export async function setInterpolate(value: boolean): Promise { - return (await call_backend("set_interpolate", [value]))[0]; + return (await FAN_CLIENT!.set_interpolate(value)) ?? value; + //return (await call_backend("set_interpolate", [value]))[0]; } export async function getInterpolate(): Promise { - return (await call_backend("get_interpolate", []))[0]; + return (await FAN_CLIENT!.get_interpolate(true)) ?? false; + //return (await call_backend("get_interpolate", []))[0]; } export async function getVersion(): Promise { - return (await call_backend("version", []))[0]; + return (await FAN_CLIENT!.version_str(true)) ?? "version"; + //return (await call_backend("version", []))[0]; } export async function getName(): Promise { - return (await call_backend("name", []))[0]; + return (await FAN_CLIENT!.name(true))?? "broken"; + //return (await call_backend("name", []))[0]; } export async function getCurve(): Promise<{"x": number, "y": number}[]> { - return (await call_backend("get_curve", []))[0]; + var x_s = (await FAN_CLIENT!.get_curve_x(true))?? []; + var y_s = (await FAN_CLIENT!.get_curve_y(true))?? []; + let result: {"x": number, "y": number}[] = []; + for (let i = 0; i < x_s.length && i < y_s.length; i++) { + result.push({ + x: x_s[i], + y: y_s[i], + }); + } + return result; } export async function addCurvePoint(point: {"x": number, "y": number}): Promise<{"x": number, "y": number}[]> { - return (await call_backend("add_curve_point", [point]))[0]; + await FAN_CLIENT!.add_curve_point(point.x, point.y); + return getCurve(); } export async function removeCurvePoint(index: number): Promise<{"x": number, "y": number}[]> { - return (await call_backend("remove_curve_point", [index]))[0]; + await FAN_CLIENT!.remove_curve_point(index); + return getCurve(); + //return (await call_backend("remove_curve_point", [index]))[0]; } -export async function getFanRpm(): Promise { - return (await call_backend("get_fan_rpm", []))[0]; +export async function getFanRpm(callback: (rpm: number) => void): Promise { + return (await FAN_CLIENT!.get_fan_rpm(true, callback)); } -export async function getTemperature(): Promise { - return (await call_backend("get_temperature", []))[0]; +export async function getTemperature(callback: (temp: number) => void): Promise { + return (await FAN_CLIENT!.get_temperature(true, callback)); } diff --git a/src/index.tsx b/src/index.tsx index 0c9d459..910a439 100755 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,17 +1,19 @@ import { definePlugin, - DialogButton, PanelSection, PanelSectionRow, Field, ServerAPI, ToggleField, staticClasses, + Navigation, } from "decky-frontend-lib"; import { VFC, useState } from "react"; import { FaFan } from "react-icons/fa"; import { SiOnlyfans } from "react-icons/si"; +import { version_usdpl } from "fantastic-wasm"; + import * as backend from "./backend"; import {Canvas} from "./canvas"; @@ -22,10 +24,15 @@ var usdplReady: boolean = false; var name: string = ""; var version: string = ""; -var egg = 0; var curve_backup: {x: number, y: number}[] = []; +var tempCache: number = -1337; +var setTemperature_display = (_: number) => {}; + +var fanRpmCache: number = -273; +var setFanRpm_display = (_: number) => {}; + const Content: VFC<{ serverAPI: ServerAPI }> = ({serverAPI}) => { // const [result, setResult] = useState(); @@ -53,8 +60,16 @@ const Content: VFC<{ serverAPI: ServerAPI }> = ({serverAPI}) => { curve_backup = value; } - const [temperatureGlobal, setTemperature] = useState(-273.15); - const [fanRpmGlobal, setFanRpm] = useState(-1337); + const [temperatureGlobal, setTemperature] = useState(tempCache); + const [fanRpmGlobal, setFanRpm] = useState(fanRpmCache); + setTemperature_display = (x) => { + setTemperature(x); + tempCache = x; + }; + setFanRpm_display = (x) => { + setFanRpm(x); + fanRpmCache = x; + }; function setEnable(enable: boolean) { setEnableInternal(enable); @@ -205,23 +220,27 @@ const Content: VFC<{ serverAPI: ServerAPI }> = ({serverAPI}) => { backend.resolve(backend.getEnabled(), setEnable); backend.resolve(backend.getInterpolate(), setInterpol); backend.resolve(backend.getCurve(), setCurve); - backend.resolve(backend.getTemperature(), setTemperature); - backend.resolve(backend.getFanRpm(), setFanRpm); + backend.resolve(backend.getTemperature(setTemperature_display), (_: any) => {}); + backend.resolve(backend.getFanRpm(setFanRpm_display), (_: any) => {}); if (periodicHook != null) { clearInterval(periodicHook); } - periodicHook = setInterval(function() { + /*periodicHook = setInterval(function() { backend.resolve(backend.getTemperature(), setTemperature); backend.resolve(backend.getFanRpm(), setFanRpm); - }, 1000); + }, 1000);*/ } if (!usdplReady) { return ( - - + + + If you can read this, something probably went wrong :( + + ); } @@ -285,37 +304,32 @@ const Content: VFC<{ serverAPI: ServerAPI }> = ({serverAPI}) => { { egg++; }}> - {egg % 10 == 9 ? "by NGnius" : "v" + version} + onClick={()=> { Navigation.NavigateToExternalWeb("https://git.ngni.us/NG-SD-Plugins/Fantastic/releases"); }}> + {"v" + version} + { (version?.includes("alpha") || version?.includes("beta")) && + { Navigation.NavigateToExternalWeb("https://git.ngni.us/NG-SD-Plugins/usdpl-rs"); }}> + v{version_usdpl()} + + } ); }; -const DeckyPluginRouterTest: VFC = () => { - return ( -
- Hello World! - {}}> - Go to Store - -
- ); -}; +(async function(){ + if (!usdplReady) { + await backend.initBackend(); + usdplReady = true; + backend.getEnabled(); + name = await backend.getName(); + version = await backend.getVersion(); + } +})(); export default definePlugin((serverApi: ServerAPI) => { - serverApi.routerHook.addRoute("/decky-plugin-test", DeckyPluginRouterTest, { - exact: true, - }); - - (async function(){ - await backend.initBackend(); - usdplReady = true; - backend.getEnabled(); - name = await backend.getName(); - version = await backend.getVersion(); - })(); let ico = ; let now = new Date(); @@ -329,7 +343,6 @@ export default definePlugin((serverApi: ServerAPI) => { icon: ico, onDismount() { clearInterval(periodicHook!); - serverApi.routerHook.removeRoute("/decky-plugin-test"); }, }; }); diff --git a/src/rust/Cargo.lock b/src/rust/Cargo.lock new file mode 100644 index 0000000..830d9da --- /dev/null +++ b/src/rust/Cargo.lock @@ -0,0 +1,993 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" +dependencies = [ + "memchr", +] + +[[package]] +name = "anyhow" +version = "1.0.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" + +[[package]] +name = "async-trait" +version = "0.1.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.29", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "beef" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" + +[[package]] +name = "bumpalo" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "fantastic-wasm" +version = "0.5.0" +dependencies = [ + "nrpc", + "prost", + "usdpl-build", + "usdpl-front", +] + +[[package]] +name = "fastrand" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "futures" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-executor" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-macro" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.29", +] + +[[package]] +name = "futures-sink" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "gloo-net" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ac9e8288ae2c632fa9f8657ac70bfe38a1530f345282d7ba66a1f70b72b7dc4" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "http", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "js-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.147" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" + +[[package]] +name = "linux-raw-sys" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "logos" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c000ca4d908ff18ac99b93a062cb8958d331c3220719c52e77cb19cc6ac5d2c1" +dependencies = [ + "logos-derive", +] + +[[package]] +name = "logos-codegen" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc487311295e0002e452025d6b580b77bb17286de87b57138f3b5db711cded68" +dependencies = [ + "beef", + "fnv", + "proc-macro2", + "quote", + "regex-syntax 0.6.29", + "syn 2.0.29", +] + +[[package]] +name = "logos-derive" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbfc0d229f1f42d790440136d941afd806bc9e949e2bcb8faa813b0f00d1267e" +dependencies = [ + "logos-codegen", +] + +[[package]] +name = "memchr" +version = "2.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5486aed0026218e61b8a01d5fbd5a0a134649abb71a0e53b7bc088529dced86e" + +[[package]] +name = "miette" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59bb584eaeeab6bd0226ccf3509a69d7936d148cf3d036ad350abe35e8c6856e" +dependencies = [ + "miette-derive", + "once_cell", + "thiserror", + "unicode-width", +] + +[[package]] +name = "miette-derive" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.29", +] + +[[package]] +name = "multimap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + +[[package]] +name = "nrpc" +version = "0.10.0" +dependencies = [ + "async-trait", + "bytes", + "futures", + "prost", +] + +[[package]] +name = "nrpc-build" +version = "0.10.0" +dependencies = [ + "nrpc", + "prettyplease 0.2.12", + "proc-macro2", + "prost-build", + "prost-types", + "protox", + "quote", + "syn 2.0.29", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "petgraph" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pin-project" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.29", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "prettyplease" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +dependencies = [ + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "prettyplease" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62" +dependencies = [ + "proc-macro2", + "syn 2.0.29", +] + +[[package]] +name = "proc-macro2" +version = "1.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" +dependencies = [ + "bytes", + "heck", + "itertools", + "lazy_static", + "log", + "multimap", + "petgraph", + "prettyplease 0.1.25", + "prost", + "prost-types", + "regex", + "syn 1.0.109", + "tempfile", + "which", +] + +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "prost-reflect" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b823de344848e011658ac981009100818b322421676740546f8b52ed5249428" +dependencies = [ + "logos", + "miette", + "once_cell", + "prost", + "prost-types", +] + +[[package]] +name = "prost-types" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +dependencies = [ + "prost", +] + +[[package]] +name = "protox" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24022a7eb88547eaba87a1db7954c9c4cb4a143565c4e8f2b7f3e76eed63db2d" +dependencies = [ + "bytes", + "miette", + "prost", + "prost-reflect", + "prost-types", + "protox-parse", + "thiserror", +] + +[[package]] +name = "protox-parse" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712a2a651fa4466e67df6c967df5d7fc6cbffac89afc7b834f97ec49846c9c11" +dependencies = [ + "logos", + "miette", + "prost-types", + "thiserror", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "regex" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12de2eff854e5fa4b1295edd650e227e9d8fb0c9e90b12e7f36d6a6811791a29" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax 0.7.5", +] + +[[package]] +name = "regex-automata" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" + +[[package]] +name = "rustix" +version = "0.38.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0c3dde1fc030af041adc40e79c0e7fbcf431dd24870053d187d7c66e4b87453" +dependencies = [ + "bitflags 2.4.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "serde" +version = "1.0.188" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.188" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.29", +] + +[[package]] +name = "serde_json" +version = "1.0.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" +dependencies = [ + "cfg-if", + "fastrand", + "redox_syscall", + "rustix", + "windows-sys", +] + +[[package]] +name = "thiserror" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.29", +] + +[[package]] +name = "unicode-ident" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" + +[[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + +[[package]] +name = "usdpl-build" +version = "0.11.0" +dependencies = [ + "nrpc-build", + "prettyplease 0.2.12", + "proc-macro2", + "prost-build", + "prost-types", + "quote", + "syn 2.0.29", +] + +[[package]] +name = "usdpl-core" +version = "0.11.0" +dependencies = [ + "base64", +] + +[[package]] +name = "usdpl-front" +version = "0.11.0" +dependencies = [ + "console_error_panic_hook", + "futures", + "futures-channel", + "gloo-net", + "js-sys", + "log", + "nrpc", + "prost", + "usdpl-core", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.29", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.29", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" + +[[package]] +name = "web-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "which" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +dependencies = [ + "either", + "libc", + "once_cell", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" diff --git a/src/rust/Cargo.toml b/src/rust/Cargo.toml new file mode 100644 index 0000000..44d8f7e --- /dev/null +++ b/src/rust/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "fantastic-wasm" +version = "0.5.0" +edition = "2021" +authors = ["NGnius (Graham) "] +description = "Frontend bindings for fan control functionality" +license = "GPL-3.0-only" +repository = "https://git.ngni.us/NG-SD-Plugins/Fantastic" +keywords = ["utility", "fan-control", "root", "decky"] +readme = "../../README.md" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +usdpl-front = { version = "0.11" } +nrpc = { version = "0.10", path = "../../../nRPC/nrpc", default-features = false } +prost = "0.11" + +[build-dependencies] +usdpl-build = { version = "0.11", path = "../../../usdpl-rs/usdpl-build" } + +[features] +debug = ["usdpl-front/debug"] +decky = ["usdpl-front/decky"] + +[profile.release] +# Tell `rustc` to optimize for small code size. +opt-level = "s" +debug = false +strip = true +lto = true +codegen-units = 4 diff --git a/src/rust/build.rs b/src/rust/build.rs new file mode 100644 index 0000000..6cb4f89 --- /dev/null +++ b/src/rust/build.rs @@ -0,0 +1,15 @@ +fn main() { + println!("CWD: {}", std::env::current_dir().unwrap().display()); + usdpl_build::front::build( + [format!( + "{}/../../backend-rs/protos/fantastic.proto", + std::env::current_dir().unwrap().display() + )] + .into_iter(), + [format!( + "{}/../../backend-rs/protos/", + std::env::current_dir().unwrap().display() + )] + .into_iter(), + ) +} diff --git a/src/rust/build.sh b/src/rust/build.sh new file mode 100755 index 0000000..b91cbe0 --- /dev/null +++ b/src/rust/build.sh @@ -0,0 +1,19 @@ +#!/bin/bash +if [ -n "$1" ]; then + if [ "$1" == "--help" ]; then + echo "Usage: +$0 [decky|crankshaft|]" + exit 0 + elif [ "$1" == "decky" ]; then + echo "Building WASM module for decky framework" + RUSTFLAGS="--cfg aes_compact" wasm-pack build --target web --features decky,$2 + else + echo "Unsupported plugin framework \`$1\`" + exit 1 + fi +else + echo "WARNING: Building for any plugin framework, which may not work for every framework" + RUSTFLAGS="--cfg aes_compact" wasm-pack build --target web --features debug,$2 +fi + +python3 ./scripts/generate_embedded_wasm.py diff --git a/src/rust/scripts/generate_embedded_wasm.py b/src/rust/scripts/generate_embedded_wasm.py new file mode 100644 index 0000000..5470f3d --- /dev/null +++ b/src/rust/scripts/generate_embedded_wasm.py @@ -0,0 +1,45 @@ +import base64 + +if __name__ == "__main__": + print("Embedding WASM into js") + # assumption: current working directory (relative to this script) is ../ + # assumption: release wasm binary at ./pkg/usdpl_bg.wasm + with open("./pkg/fantastic_wasm_bg.wasm", mode="rb") as infile: + with open("./pkg/fantastic_wasm.js", mode="ab") as outfile: + outfile.write("\n\n// USDPL customization\nconst encoded = \"".encode()) + encoded = base64.b64encode(infile.read()) + outfile.write(encoded) + outfile.write("\";\n\n".encode()) + outfile.write( +"""function asciiToBinary(str) { + if (typeof atob === 'function') { + return atob(str) + } else { + return new Buffer(str, 'base64').toString('binary'); + } +} + +function decode() { + var binaryString = asciiToBinary(encoded); + var bytes = new Uint8Array(binaryString.length); + for (var i = 0; i < binaryString.length; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + return (async function() { + return new Response(bytes.buffer, { + status: 200, + statusText: 'OK', + headers: { + 'Content-Type': 'application/wasm' + } + }); + })(); +} + +export function init_embedded() { + return __wbg_init(decode()) +} +""".encode()) + with open("./pkg/fantastic_wasm.d.ts", "a") as outfile: + outfile.write("\n\n// USDPL customization\nexport function init_embedded();\n") + print("Done: Embedded WASM into js") diff --git a/src/rust/src/lib.rs b/src/rust/src/lib.rs new file mode 100644 index 0000000..1d13bf6 --- /dev/null +++ b/src/rust/src/lib.rs @@ -0,0 +1,7 @@ +#[allow(missing_docs)] +#[allow(dead_code)] +pub mod services { + include!(concat!(env!("OUT_DIR"), "/mod.rs")); +} + +pub use usdpl_front; diff --git a/src/usdpl/README.md b/src/usdpl/README.md deleted file mode 100644 index fd771f8..0000000 --- a/src/usdpl/README.md +++ /dev/null @@ -1,9 +0,0 @@ -[![Crates.io](https://img.shields.io/crates/v/usdpl-front?style=flat-square)](https://crates.io/crates/usdpl-front) - -# usdpl-front-front - -Front-end library to be called from Javascript. -Targets WASM. - -In true Javascript tradition, this part of the library does not support error handling. - diff --git a/src/usdpl/package.json b/src/usdpl/package.json deleted file mode 100644 index 15d0344..0000000 --- a/src/usdpl/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "usdpl-front", - "collaborators": [ - "NGnius (Graham) " - ], - "description": "Universal Steam Deck Plugin Library front-end designed for WASM", - "version": "0.10.0", - "license": "GPL-3.0-only", - "repository": { - "type": "git", - "url": "https://github.com/NGnius/usdpl-rs" - }, - "files": [ - "usdpl_front_bg.wasm", - "usdpl_front.js", - "usdpl_front.d.ts" - ], - "module": "usdpl_front.js", - "types": "usdpl_front.d.ts", - "sideEffects": false -} \ No newline at end of file diff --git a/src/usdpl/rebuild.sh b/src/usdpl/rebuild.sh deleted file mode 100755 index 5d6c8e5..0000000 --- a/src/usdpl/rebuild.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -git clone https://github.com/NGnius/usdpl-rs usdpl-rs -cd usdpl-rs/usdpl-front/ - -./build.sh $1 $2 - -cd ../.. - -cp -f ./usdpl-rs/usdpl-front/pkg/* ./ -#rm ./.gitignore - -rm -rf ./usdpl-rs diff --git a/src/usdpl/usdpl_front.d.ts b/src/usdpl/usdpl_front.d.ts deleted file mode 100644 index 9477118..0000000 --- a/src/usdpl/usdpl_front.d.ts +++ /dev/null @@ -1,105 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** -* Initialize the front-end library -* @param {number} port -*/ -export function init_usdpl(port: number): void; -/** -* Get the targeted plugin framework, or "any" if unknown -* @returns {string} -*/ -export function target_usdpl(): string; -/** -* Get the UDSPL front-end version -* @returns {string} -*/ -export function version_usdpl(): string; -/** -* Get the targeted plugin framework, or "any" if unknown -* @param {string} key -* @param {any} value -* @returns {any} -*/ -export function set_value(key: string, value: any): any; -/** -* Get the targeted plugin framework, or "any" if unknown -* @param {string} key -* @returns {any} -*/ -export function get_value(key: string): any; -/** -* Call a function on the back-end. -* Returns null (None) if this fails for any reason. -* @param {string} name -* @param {any[]} parameters -* @returns {Promise} -*/ -export function call_backend(name: string, parameters: any[]): Promise; -/** -* Initialize translation strings for the front-end -* @param {string} locale -* @returns {Promise} -*/ -export function init_tr(locale: string): Promise; -/** -* Translate a phrase, equivalent to tr_n(msg_id, 0) -* @param {string} msg_id -* @returns {string} -*/ -export function tr(msg_id: string): string; -/** -* Translate a phrase, retrieving the plural form for `n` items -* @param {string} msg_id -* @param {number} n -* @returns {string} -*/ -export function tr_n(msg_id: string, n: number): string; - -export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; - -export interface InitOutput { - readonly memory: WebAssembly.Memory; - readonly init_usdpl: (a: number) => void; - readonly target_usdpl: (a: number) => void; - readonly version_usdpl: (a: number) => void; - readonly set_value: (a: number, b: number, c: number) => number; - readonly get_value: (a: number, b: number) => number; - readonly call_backend: (a: number, b: number, c: number, d: number) => number; - readonly init_tr: (a: number, b: number) => number; - readonly tr: (a: number, b: number, c: number) => void; - readonly tr_n: (a: number, b: number, c: number, d: number) => void; - readonly __wbindgen_export_0: (a: number) => number; - readonly __wbindgen_export_1: (a: number, b: number, c: number) => number; - readonly __wbindgen_export_2: WebAssembly.Table; - readonly __wbindgen_export_3: (a: number, b: number, c: number) => void; - readonly __wbindgen_add_to_stack_pointer: (a: number) => number; - readonly __wbindgen_export_4: (a: number, b: number) => void; - readonly __wbindgen_export_5: (a: number) => void; - readonly __wbindgen_export_6: (a: number, b: number, c: number, d: number) => void; -} - -export type SyncInitInput = BufferSource | WebAssembly.Module; -/** -* Instantiates the given `module`, which can either be bytes or -* a precompiled `WebAssembly.Module`. -* -* @param {SyncInitInput} module -* -* @returns {InitOutput} -*/ -export function initSync(module: SyncInitInput): InitOutput; - -/** -* If `module_or_path` is {RequestInfo} or {URL}, makes a request and -* for everything else, calls `WebAssembly.instantiate` directly. -* -* @param {InitInput | Promise} module_or_path -* -* @returns {Promise} -*/ -export default function init (module_or_path?: InitInput | Promise): Promise; - - -// USDPL customization -export function init_embedded(); diff --git a/src/usdpl/usdpl_front.js b/src/usdpl/usdpl_front.js deleted file mode 100644 index 012ee25..0000000 --- a/src/usdpl/usdpl_front.js +++ /dev/null @@ -1,605 +0,0 @@ -let wasm; - -const heap = new Array(128).fill(undefined); - -heap.push(undefined, null, true, false); - -function getObject(idx) { return heap[idx]; } - -let heap_next = heap.length; - -function dropObject(idx) { - if (idx < 132) return; - heap[idx] = heap_next; - heap_next = idx; -} - -function takeObject(idx) { - const ret = getObject(idx); - dropObject(idx); - return ret; -} - -const cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); - -cachedTextDecoder.decode(); - -let cachedUint8Memory0 = null; - -function getUint8Memory0() { - if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { - cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); - } - return cachedUint8Memory0; -} - -function getStringFromWasm0(ptr, len) { - return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); -} - -function addHeapObject(obj) { - if (heap_next === heap.length) heap.push(heap.length + 1); - const idx = heap_next; - heap_next = heap[idx]; - - heap[idx] = obj; - return idx; -} - -let WASM_VECTOR_LEN = 0; - -const cachedTextEncoder = new TextEncoder('utf-8'); - -const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' - ? function (arg, view) { - return cachedTextEncoder.encodeInto(arg, view); -} - : function (arg, view) { - const buf = cachedTextEncoder.encode(arg); - view.set(buf); - return { - read: arg.length, - written: buf.length - }; -}); - -function passStringToWasm0(arg, malloc, realloc) { - - if (realloc === undefined) { - const buf = cachedTextEncoder.encode(arg); - const ptr = malloc(buf.length); - getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); - WASM_VECTOR_LEN = buf.length; - return ptr; - } - - let len = arg.length; - let ptr = malloc(len); - - const mem = getUint8Memory0(); - - let offset = 0; - - for (; offset < len; offset++) { - const code = arg.charCodeAt(offset); - if (code > 0x7F) break; - mem[ptr + offset] = code; - } - - if (offset !== len) { - if (offset !== 0) { - arg = arg.slice(offset); - } - ptr = realloc(ptr, len, len = offset + arg.length * 3); - const view = getUint8Memory0().subarray(ptr + offset, ptr + len); - const ret = encodeString(arg, view); - - offset += ret.written; - } - - WASM_VECTOR_LEN = offset; - return ptr; -} - -function isLikeNone(x) { - return x === undefined || x === null; -} - -let cachedInt32Memory0 = null; - -function getInt32Memory0() { - if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { - cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); - } - return cachedInt32Memory0; -} - -let cachedFloat64Memory0 = null; - -function getFloat64Memory0() { - if (cachedFloat64Memory0 === null || cachedFloat64Memory0.byteLength === 0) { - cachedFloat64Memory0 = new Float64Array(wasm.memory.buffer); - } - return cachedFloat64Memory0; -} - -function makeMutClosure(arg0, arg1, dtor, f) { - const state = { a: arg0, b: arg1, cnt: 1, dtor }; - const real = (...args) => { - // First up with a closure we increment the internal reference - // count. This ensures that the Rust closure environment won't - // be deallocated while we're invoking it. - state.cnt++; - const a = state.a; - state.a = 0; - try { - return f(a, state.b, ...args); - } finally { - if (--state.cnt === 0) { - wasm.__wbindgen_export_2.get(state.dtor)(a, state.b); - - } else { - state.a = a; - } - } - }; - real.original = state; - - return real; -} -function __wbg_adapter_26(arg0, arg1, arg2) { - wasm.__wbindgen_export_3(arg0, arg1, addHeapObject(arg2)); -} - -/** -* Initialize the front-end library -* @param {number} port -*/ -export function init_usdpl(port) { - wasm.init_usdpl(port); -} - -/** -* Get the targeted plugin framework, or "any" if unknown -* @returns {string} -*/ -export function target_usdpl() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.target_usdpl(retptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_export_4(r0, r1); - } -} - -/** -* Get the UDSPL front-end version -* @returns {string} -*/ -export function version_usdpl() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.version_usdpl(retptr); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_export_4(r0, r1); - } -} - -/** -* Get the targeted plugin framework, or "any" if unknown -* @param {string} key -* @param {any} value -* @returns {any} -*/ -export function set_value(key, value) { - const ptr0 = passStringToWasm0(key, wasm.__wbindgen_export_0, wasm.__wbindgen_export_1); - const len0 = WASM_VECTOR_LEN; - const ret = wasm.set_value(ptr0, len0, addHeapObject(value)); - return takeObject(ret); -} - -/** -* Get the targeted plugin framework, or "any" if unknown -* @param {string} key -* @returns {any} -*/ -export function get_value(key) { - const ptr0 = passStringToWasm0(key, wasm.__wbindgen_export_0, wasm.__wbindgen_export_1); - const len0 = WASM_VECTOR_LEN; - const ret = wasm.get_value(ptr0, len0); - return takeObject(ret); -} - -let cachedUint32Memory0 = null; - -function getUint32Memory0() { - if (cachedUint32Memory0 === null || cachedUint32Memory0.byteLength === 0) { - cachedUint32Memory0 = new Uint32Array(wasm.memory.buffer); - } - return cachedUint32Memory0; -} - -function passArrayJsValueToWasm0(array, malloc) { - const ptr = malloc(array.length * 4); - const mem = getUint32Memory0(); - for (let i = 0; i < array.length; i++) { - mem[ptr / 4 + i] = addHeapObject(array[i]); - } - WASM_VECTOR_LEN = array.length; - return ptr; -} -/** -* Call a function on the back-end. -* Returns null (None) if this fails for any reason. -* @param {string} name -* @param {any[]} parameters -* @returns {Promise} -*/ -export function call_backend(name, parameters) { - const ptr0 = passStringToWasm0(name, wasm.__wbindgen_export_0, wasm.__wbindgen_export_1); - const len0 = WASM_VECTOR_LEN; - const ptr1 = passArrayJsValueToWasm0(parameters, wasm.__wbindgen_export_0); - const len1 = WASM_VECTOR_LEN; - const ret = wasm.call_backend(ptr0, len0, ptr1, len1); - return takeObject(ret); -} - -/** -* Initialize translation strings for the front-end -* @param {string} locale -* @returns {Promise} -*/ -export function init_tr(locale) { - const ptr0 = passStringToWasm0(locale, wasm.__wbindgen_export_0, wasm.__wbindgen_export_1); - const len0 = WASM_VECTOR_LEN; - const ret = wasm.init_tr(ptr0, len0); - return takeObject(ret); -} - -/** -* Translate a phrase, equivalent to tr_n(msg_id, 0) -* @param {string} msg_id -* @returns {string} -*/ -export function tr(msg_id) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0(msg_id, wasm.__wbindgen_export_0, wasm.__wbindgen_export_1); - const len0 = WASM_VECTOR_LEN; - wasm.tr(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_export_4(r0, r1); - } -} - -/** -* Translate a phrase, retrieving the plural form for `n` items -* @param {string} msg_id -* @param {number} n -* @returns {string} -*/ -export function tr_n(msg_id, n) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passStringToWasm0(msg_id, wasm.__wbindgen_export_0, wasm.__wbindgen_export_1); - const len0 = WASM_VECTOR_LEN; - wasm.tr_n(retptr, ptr0, len0, n); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - return getStringFromWasm0(r0, r1); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - wasm.__wbindgen_export_4(r0, r1); - } -} - -function handleError(f, args) { - try { - return f.apply(this, args); - } catch (e) { - wasm.__wbindgen_export_5(addHeapObject(e)); - } -} -function __wbg_adapter_58(arg0, arg1, arg2, arg3) { - wasm.__wbindgen_export_6(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3)); -} - -async function load(module, imports) { - if (typeof Response === 'function' && module instanceof Response) { - if (typeof WebAssembly.instantiateStreaming === 'function') { - try { - return await WebAssembly.instantiateStreaming(module, imports); - - } catch (e) { - if (module.headers.get('Content-Type') != 'application/wasm') { - console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); - - } else { - throw e; - } - } - } - - const bytes = await module.arrayBuffer(); - return await WebAssembly.instantiate(bytes, imports); - - } else { - const instance = await WebAssembly.instantiate(module, imports); - - if (instance instanceof WebAssembly.Instance) { - return { instance, module }; - - } else { - return instance; - } - } -} - -function getImports() { - const imports = {}; - imports.wbg = {}; - imports.wbg.__wbindgen_object_drop_ref = function(arg0) { - takeObject(arg0); - }; - imports.wbg.__wbindgen_string_new = function(arg0, arg1) { - const ret = getStringFromWasm0(arg0, arg1); - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_string_get = function(arg0, arg1) { - const obj = getObject(arg1); - const ret = typeof(obj) === 'string' ? obj : undefined; - var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_export_0, wasm.__wbindgen_export_1); - var len0 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len0; - getInt32Memory0()[arg0 / 4 + 0] = ptr0; - }; - imports.wbg.__wbindgen_object_clone_ref = function(arg0) { - const ret = getObject(arg0); - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_number_new = function(arg0) { - const ret = arg0; - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_boolean_get = function(arg0) { - const v = getObject(arg0); - const ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; - return ret; - }; - imports.wbg.__wbindgen_number_get = function(arg0, arg1) { - const obj = getObject(arg1); - const ret = typeof(obj) === 'number' ? obj : undefined; - getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret; - getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); - }; - imports.wbg.__wbindgen_is_null = function(arg0) { - const ret = getObject(arg0) === null; - return ret; - }; - imports.wbg.__wbindgen_is_undefined = function(arg0) { - const ret = getObject(arg0) === undefined; - return ret; - }; - imports.wbg.__wbg_instanceof_Window_e266f02eee43b570 = function(arg0) { - let result; - try { - result = getObject(arg0) instanceof Window; - } catch { - result = false; - } - const ret = result; - return ret; - }; - imports.wbg.__wbg_fetch_465e8cb61a0f43ea = function(arg0, arg1) { - const ret = getObject(arg0).fetch(getObject(arg1)); - return addHeapObject(ret); - }; - imports.wbg.__wbg_instanceof_Response_fb3a4df648c1859b = function(arg0) { - let result; - try { - result = getObject(arg0) instanceof Response; - } catch { - result = false; - } - const ret = result; - return ret; - }; - imports.wbg.__wbg_text_f61464d781b099f0 = function() { return handleError(function (arg0) { - const ret = getObject(arg0).text(); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_newwithstrandinit_c45f0dc6da26fd03 = function() { return handleError(function (arg0, arg1, arg2) { - const ret = new Request(getStringFromWasm0(arg0, arg1), getObject(arg2)); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbindgen_cb_drop = function(arg0) { - const obj = takeObject(arg0).original; - if (obj.cnt-- == 1) { - obj.a = 0; - return true; - } - const ret = false; - return ret; - }; - imports.wbg.__wbg_newnoargs_2b8b6bd7753c76ba = function(arg0, arg1) { - const ret = new Function(getStringFromWasm0(arg0, arg1)); - return addHeapObject(ret); - }; - imports.wbg.__wbg_call_95d1ea488d03e4e8 = function() { return handleError(function (arg0, arg1) { - const ret = getObject(arg0).call(getObject(arg1)); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_new_f9876326328f45ed = function() { - const ret = new Object(); - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_is_string = function(arg0) { - const ret = typeof(getObject(arg0)) === 'string'; - return ret; - }; - imports.wbg.__wbg_self_e7c1f827057f6584 = function() { return handleError(function () { - const ret = self.self; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_window_a09ec664e14b1b81 = function() { return handleError(function () { - const ret = window.window; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_globalThis_87cbb8506fecf3a9 = function() { return handleError(function () { - const ret = globalThis.globalThis; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_global_c85a9259e621f3db = function() { return handleError(function () { - const ret = global.global; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_newwithlength_0da6f12fbc1ab6eb = function(arg0) { - const ret = new Array(arg0 >>> 0); - return addHeapObject(ret); - }; - imports.wbg.__wbg_set_17224bc548dd1d7b = function(arg0, arg1, arg2) { - getObject(arg0)[arg1 >>> 0] = takeObject(arg2); - }; - imports.wbg.__wbg_call_9495de66fdbe016b = function() { return handleError(function (arg0, arg1, arg2) { - const ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_new_9d3a9ce4282a18a8 = function(arg0, arg1) { - try { - var state0 = {a: arg0, b: arg1}; - var cb0 = (arg0, arg1) => { - const a = state0.a; - state0.a = 0; - try { - return __wbg_adapter_58(a, state0.b, arg0, arg1); - } finally { - state0.a = a; - } - }; - const ret = new Promise(cb0); - return addHeapObject(ret); - } finally { - state0.a = state0.b = 0; - } - }; - imports.wbg.__wbg_resolve_fd40f858d9db1a04 = function(arg0) { - const ret = Promise.resolve(getObject(arg0)); - return addHeapObject(ret); - }; - imports.wbg.__wbg_then_ec5db6d509eb475f = function(arg0, arg1) { - const ret = getObject(arg0).then(getObject(arg1)); - return addHeapObject(ret); - }; - imports.wbg.__wbg_then_f753623316e2873a = function(arg0, arg1, arg2) { - const ret = getObject(arg0).then(getObject(arg1), getObject(arg2)); - return addHeapObject(ret); - }; - imports.wbg.__wbg_set_6aa458a4ebdb65cb = function() { return handleError(function (arg0, arg1, arg2) { - const ret = Reflect.set(getObject(arg0), getObject(arg1), getObject(arg2)); - return ret; - }, arguments) }; - imports.wbg.__wbg_parse_3ac95b51fc312db8 = function() { return handleError(function (arg0, arg1) { - const ret = JSON.parse(getStringFromWasm0(arg0, arg1)); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_stringify_029a979dfb73aa17 = function() { return handleError(function (arg0) { - const ret = JSON.stringify(getObject(arg0)); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbindgen_throw = function(arg0, arg1) { - throw new Error(getStringFromWasm0(arg0, arg1)); - }; - imports.wbg.__wbindgen_closure_wrapper386 = function(arg0, arg1, arg2) { - const ret = makeMutClosure(arg0, arg1, 75, __wbg_adapter_26); - return addHeapObject(ret); - }; - - return imports; -} - -function initMemory(imports, maybe_memory) { - -} - -function finalizeInit(instance, module) { - wasm = instance.exports; - init.__wbindgen_wasm_module = module; - cachedFloat64Memory0 = null; - cachedInt32Memory0 = null; - cachedUint32Memory0 = null; - cachedUint8Memory0 = null; - - - return wasm; -} - -function initSync(module) { - const imports = getImports(); - - initMemory(imports); - - if (!(module instanceof WebAssembly.Module)) { - module = new WebAssembly.Module(module); - } - - const instance = new WebAssembly.Instance(module, imports); - - return finalizeInit(instance, module); -} - -async function init(input) { - if (typeof input === 'undefined') { - input = new URL('usdpl_front_bg.wasm', import.meta.url); - } - const imports = getImports(); - - if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { - input = fetch(input); - } - - initMemory(imports); - - const { instance, module } = await load(await input, imports); - - return finalizeInit(instance, module); -} - -export { initSync } -export default init; - - -// USDPL customization -const encoded = "AGFzbQEAAAABtwEbYAJ/fwBgAn9/AX9gAX8AYAN/f38AYAR/f39/AGADf39/AX9gAX8Bf2AAAGAAAX9gBX9/f39/AGAEf39/fwF/YAV/f39/fwF/YAF/AX5gA39/fwF+YAR/fn9/AGAGf39/f39/AX9gBn9/f39/fwBgBX9/fn9/AGAFf399f38AYAV/f3x/fwBgBH99f38AYAR/fH9/AGACfn8AYAd/f39/f39/AX9gA35/fwF/YAF8AX9gAn9/AX4CqgkjA3diZxpfX3diaW5kZ2VuX29iamVjdF9kcm9wX3JlZgACA3diZxVfX3diaW5kZ2VuX3N0cmluZ19uZXcAAQN3YmcVX193YmluZGdlbl9zdHJpbmdfZ2V0AAADd2JnG19fd2JpbmRnZW5fb2JqZWN0X2Nsb25lX3JlZgAGA3diZxVfX3diaW5kZ2VuX251bWJlcl9uZXcAGQN3YmcWX193YmluZGdlbl9ib29sZWFuX2dldAAGA3diZxVfX3diaW5kZ2VuX251bWJlcl9nZXQAAAN3YmcSX193YmluZGdlbl9pc19udWxsAAYDd2JnF19fd2JpbmRnZW5faXNfdW5kZWZpbmVkAAYDd2JnKF9fd2JnX2luc3RhbmNlb2ZfV2luZG93X2UyNjZmMDJlZWU0M2I1NzAABgN3YmccX193YmdfZmV0Y2hfNDY1ZThjYjYxYTBmNDNlYQABA3diZypfX3diZ19pbnN0YW5jZW9mX1Jlc3BvbnNlX2ZiM2E0ZGY2NDhjMTg1OWIABgN3YmcbX193YmdfdGV4dF9mNjE0NjRkNzgxYjA5OWYwAAYDd2JnKF9fd2JnX25ld3dpdGhzdHJhbmRpbml0X2M0NWYwZGM2ZGEyNmZkMDMABQN3YmcSX193YmluZGdlbl9jYl9kcm9wAAYDd2JnIF9fd2JnX25ld25vYXJnc18yYjhiNmJkNzc1M2M3NmJhAAEDd2JnG19fd2JnX2NhbGxfOTVkMWVhNDg4ZDAzZTRlOAABA3diZxpfX3diZ19uZXdfZjk4NzYzMjYzMjhmNDVlZAAIA3diZxRfX3diaW5kZ2VuX2lzX3N0cmluZwAGA3diZxtfX3diZ19zZWxmX2U3YzFmODI3MDU3ZjY1ODQACAN3YmcdX193Ymdfd2luZG93X2EwOWVjNjY0ZTE0YjFiODEA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BGoiAyACQYABaiACQShqEIQCIAIoAghFBEAgAigCDCIEQYQBTwRAIAQQAAsgAigCgAEiBEGEAU8EQCAEEAALIAIoAigiBEGEAU8EQCAEEAALIAMoAgAiA0GEAU8EQCADEAALQQEhAyAAKAKUBCIEQYQBSQ0BIAQQAAwBC0G4gMAAQRUQlgMACyAAIAM6AJgEIAJB4AJqJAAgAUEARwuhDAEFfyMAQZACayIDJAAgAQJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAS0AYEEBaw4EBwACAwELAAsgASABKQMANwMIIANByABqIAFBEGpBKBCiAxogASABLwFcOwFeIAEQETYCOCABQThqIgQQvwEgBBDCASADQaQBakEGNgIAIANBnAFqQQc2AgAgAyABQd4AajYCoAEgA0HQisAANgKYASADQQg2ApQBIAMgAUEIajYCkAEgA0EDNgLMASADQQQ2AsQBIANBpIrAADYCwAEgA0EANgK4ASADIANBkAFqNgLIASADQYABaiADQbgBahBBIAFBxABqIANBiAFqKAIANgIAIAEgAykDgAE3AjwgA0G4AWogA0HIAGpBKBCiAxogA0GQAWogA0G4AWoQgQEgAygCkAEhBSADKAKUASIGRQ0LIAFB0ABqIAMoApgBIgc2AgAgAUHMAGogBjYCACABIAU2AkggA0GQAWogBiAHEDcgA0HAAWoiBSADQZgBaikDADcDACADIAMpA5ABNwO4ASADQfAAaiADQbgBahC8ASAFIANB+ABqKAIANgIAIAMgAykDcDcDuAEgAyADQbgBahCMAjYCkAEgBCADQZABahCwASADKAKQASIFQYQBTwRAIAUQAAsgA0FAayABQUBrKAIAIAFBxABqKAIAIAQQ8wEgAygCRCEFIAMoAkANCiABIAU2AlQgA0E4ahDtASADKAI4RQ0GIAEgAygCPDYCWCABIAFB2ABqKAIAIAFB1ABqKAIAEAoQSDYCaAsgA0EwaiABQegAaiIEIAIQjQEgAygCMCIGQQJGDQYgAygCNCEFIAQQrwEgBg0IIANBKGogBRDyASADKAIsIQUgAygCKA0IIAEgBTYCaCADQSBqIAQQ9gEgAygCICEEIAFB9ABqIAMoAiQiBTYCACABIAQ2AnAgBA0BIAEgBRBINgJsCyADQRhqIAFB7ABqIgQgAhCNASADKAIYIgJBAkYNASADKAIcIQUgBBCvASACDQAgA0EQaiAFEPEBIAMoAhQhBCADKAIQRQ0CIAQhBQsgASgCaCICQYQBSQ0GIAIQAAwGCyAAQQs2AgBBBAwKCyADQQhqIAQQAiADKAIIIgVFBEAgA0EANgK8AQwECyADKAIMIQIgAyAFNgK8ASADIAI2AsABIAMgAjYCuAEgAyADQbgBahCxAiADQbgBaiADKAIAIAMoAgQQ5QIgAygCvAFFDQMgA0GIAWogA0HAAWoiBigCACICNgIAIAMgAykDuAE3A4ABIANBuAFqIAMoAoQBIAIQmwEgAygCuAEiAkEKRwRAIAMoArwBIQUgA0GQAWogBkEoEKIDGiADQfABaiADQZgBaikDADcDACADQfgBaiADQaABaikDADcDACADQYACaiADQagBaikDADcDACADIAMpA5ABNwPoASADQYABahCaAiAEQYQBTwRAIAQQAAsgASgCaCIEQYQBTwRAIAQQAAsgASgCWCIEQYQBTwRAIAQQAAsgASgCVCIEQYQBTwRAIAQQAAsgAUHIAGoQmgIgAUE8ahCaAiABKAI4IgFBhAFJDQkgARAADAkLIAMgAykCvAE3A4gCIANBiAJqEKoBIQUgA0GAAWoQmgIgBEGEAU8EQCAEEAALIAEoAmgiAkGEAU8EQCACEAALIAEoAlgiAkGEAU8EQCACEAALIAEoAlQiAkGEAU8EQCACEAALIAFByABqEJoCIAFBPGoQmgIgASgCOCIBQYQBSQ0HIAEQAAwHC0HAgsAAQSNB9InAABD3AQALQbyFwABBK0HYisAAEPcBAAsgAEELNgIAQQMMBgtBvIXAAEErQeiKwAAQ9wEACyABKAJYIgJBhAFPBEAgAhAACyABKAJUIgJBhAFJDQAgAhAACyABQcgAahCaAgsgAUE8ahCaAiABKAI4IgFBhAFJDQAgARAAC0EKIQILIAAgBTYCBCAAIAI2AgAgACADKQPoATcDCCAAQRBqIANB8AFqKQMANwMAIABBGGogA0H4AWopAwA3AwAgAEEgaiADQYACaikDADcDAEEBCzoAYCADQZACaiQAC4YMAgp/An4jAEHQAmsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAC0A2AJBAWsOAwcCAQALIAAgAEGoAWpBqAEQogMaCwJAIAAtAKABQQFrDgMFAQACCyAAQQhqIQQgAEGYAWotAABBAWsOAwcAAwILAAsgACgCACEDIAIgACgCBCIENgLIASACIAM2AsQBIAIgBDYCwAEgAkEoaiACQcABahCxAiACQTBqIAIoAiggAigCLBDlAiACQcwCaiACQThqKAIANgIAIAIgAikDMDcCxAIgAEEIaiIEIAJBwAFqQZABEKIDGiAAQZgBakEAOgAACyAAQYgBaiAAQZQBaigCADYCACAAQYABaiIDIABBjAFqKQIANwIAQYjswABBiOzAACkDACIMQgF8NwMAIAJB6ABqQQRyIAMQ0QEgAkEJNgJoQZDswAAvAQAhAyACQcgBaiACQegAakEoEKIDGiAAQRBqIAJBwAFqQTAQogMaIABB6ABqQQA6AAAgAEHkAGogAzsBACAAIAw3AwgLIAJBwAFqIAQgARAnIAIoAsABQQtGDQIgAkFAayACQcABakEoEKIDGiAEEK4BAkACQCACKAJAIghBeGoOAwEGAAYLIAIoAkQhAUHU7MAAKAIABEAQ4wILQdTswABBADYCACABQYQBSQ0JIAEQAAwJCyACQcgAaigCACEBIAJBzABqKAIAIQUgAigCRCEGIAJBGGpB5ILAABDnASACKQMYIQwgAikDICENIAJBwAFqIAUQayACQYABaiIJIAJByAFqIgopAwA3AwAgAiACKQPAATcDeCACIA03A3AgAiAMNwNoIAIgATYCzAEgAiABIAVBGGwiA2oiBzYCyAEgAiABNgLEASACIAY2AsABIAVFDQYgAkG4AWohBQNAIAEoAgQiBkUEQCABQRhqIQcMBwsgASgCACELIAIgASgCCDYCqAEgAiAGNgKkASACIAs2AqABIAUgAUEUaigCADYCACACIAEpAgw3A7ABIAJBkAFqIAJB6ABqIAJBoAFqIAJBsAFqEEsgAigClAEEQCACQZABahCmAiACQZABahDKAgsgAUEYaiEBIANBaGoiAw0ACwwFC0HAgsAAQSNBgIzAABD3AQALQcCCwABBI0GwgsAAEPcBAAtBAyEDIABBAzoAoAEgAEEDOgCYAUEBIQEMBgtBwILAAEEjQfCLwAAQ9wEAC0HU7MAAKAIABEAQ4wILQdTswABBADYCAEEBIQEMAgsgAiAHNgLEAQsgAkHAAWoQuwEg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IAAoAgQoAgwRBQALrQcCBn8CfiMAQTBrIgMkACADQf8BOgAPIANBEGogASADQQ9qQQEgAigCICIGEQQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAy0AEEEERwRAIAMpAxAiCUL/AYNCBlINAQsgAy0AD0F/ag4KExACAwQFBgcJCAELIAAgCTcCBAwTCyAAQQU6AAQMEgsgA0F/NgIoIANBEGogASADQShqQQQgBhEEACADLQAQQQRHBEAgAzEAEEIGUg0NCyADNQIoIQlBBCEFQQIhBAwQCyADQn83AyggA0EQaiABIANBKGpBCCAGEQQAIAMtABBBBEcEQCADMQAQQgZSDQsLIAMpAygiCkIghiEJIApCIIinIQdBCCEFQQMhBAwPCyADQX82AiggA0EQaiABIANBKGpBBCAGEQQAIAMtABBBBEcEQCADKQMQIglC/wGDQgZSDQkLIAM1AighCUEEIQRBBCEFDA4LIANCfzcDICADQShqIAEgA0EgakEIIAYRBAAgAy0AKEEERwRAIAMpAygiCUL/AYNCBlINBwsgAyADKQMgIgk3AhQgCUIgiKchByADKQMQIQlBCCEFQQUhBAwNCyADQX82AiggA0EQaiABIANBKGpBBCAGEQQAIAMtABBBBEcEQCADKQMQIglC/wGDQgZSDQULIAM1AighCUEEIQVBBiEEDAwLIANCfzcDICADQShqIAEgA0EgakEIIAYRBAAgAy0AKEEERwRAIAMpAygiCUL/AYNCBlINAwsgAyADKQMgIgk3AhQgCUIgiKchByADKQMQIQlBCCEFQQchBAwLCyADQRBqIAEgAhBFIAMoAhRFDQggAygCGCEHIAMpAxAhCSADKAIcIQVBCSEEDAoLIANBEGogASACEL4BIAMoAhBFDQggACADKQIUNwIEDAoLIAAgCTcCBAwJCyAAIAk3AgQMCAsgACAJNwIEDAcLIAAgCTcCBAwGCyAAIAM1AhAgAzUCFEIghoQ3AgQMBQsgACADNQIQIAM1AhRCIIaENwIEDAQLIANBEGogASACEEUgAygCFARAIAMoAhghByADKQMQIQkgAygCHCEFQQEhBAwDCyAAIAMpAxg3AgQMAwsgACADKQMYNwIEDAILQQghBCADQRhqKAIAIQUgAy0AFCEICyAA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IANBGGogA0HgAGoQngMgAygCHEUEQCAAIAY2AgQgAEEANgIAIABBCGogBDYCAAwCCwJAAkACQCACRQRAQQEhAQwBCyACQX9MDQIgAkEBEPcCIgFFDQELIANBADYCQCADIAE2AjwgAyACNgI4IAQgAksEfyADQThqQQAgBBCFASADKAJAIQUgAygCPAUgAQsgBWogBiAEEKIDGiADIAQgBWoiAjYCQCADKAI4IAJrQQJNBEAgA0E4aiACQQMQhQEgAygCQCECCyADKAI8IgEgAmoiBEGYzsAALwAAIgU7AAAgBEECakGazsAALQAAIgY6AAAgAyACQQNqIgI2AkAgAyADKQMwNwNIIANB0ABqIANByABqED4gAygCUARAA0AgA0HoAGogA0HYAGopAwA3AwAgAyADKQNQNwNgIANBEGogA0HgAGoQnQMgAygCECEHIAMoAjggAmsgAygCFCIESQRAIANBOGogAiAEEIUBIAMoAkAhAiADKAI8IQELIAEgAmogByAEEKIDGiADIAIgBGoiAjYCQCADQQhqIANB4ABqEJ4DIAMoAgwEQCADKAI4IAJrQQJNBEAgA0E4aiACQQMQhQEgAygCQCECCyADKAI8IgEgAmoiBCAFOwAAIARBAmogBjoAACADIAJBA2oiAjYCQAsgA0HQAGogA0HIAGoQPiADKAJQDQALCyAAIAMpAzg3AgQgAEEBNgIAIABBDGogA0FAaygCADYCAAwDCyACQQEQmwMACxCYAgALIABB5MzAADYCBCAAQQA2AgAgAEEIakEANgIACyADQfAAaiQAC9AEAgR/Bn4gACAAKAI4IAJqNgI4AkAgAAJ/AkACQAJAIAAoAjwiBUUEQAwBCwJ+IAJBCCAFayIEIAIgBEkbIgZBA00EQEIADAELQQQhAyABNQAACyEHIAAgACkDMCADQQFyIAZJBEAgASADajMAACADQQN0rYYgB4QhByADQQJyIQMLIAMgBkkEfiABIANqMQAAIANBA3SthiAHhAUgBwsgBUEDdEE4ca2GhCIHNwMwIAQgAksNASAAIAApAxggB4UiCCAAKQMIfCIJIAApAxAiCkINiSAKIAApAwB8IgqFIgt8IgwgC0IRiYU3AxAgACAMQiCJNwMIIAAgCSAIQhCJhSIIQhWJIAggCkIgiXwiCIU3AxggACAHIAiFNwMACyACIARrIgJBB3EhAyAEIAJBeHEiAkkEQCAAKQMIIQggACkDECEHIAApAwAhCSAAKQMYIQoDQCAIIAEgBGopAAAiCyAKhSIIfCIKIAcgCXwiCSAHQg2JhSIHfCIMIAdCEYmFIQcgCiAIQhCJhSIIQhWJIAggCUIgiXwiCYUhCiAMQiCJIQggCSALhSEJIARBCGoiBCACSQ0ACyAAIAc3AxAgACAJNwMAIAAgCjcDGCAAIAg3AwgLIANBA0sNAUIAIQdBAAwCCyACIAVqIQMMAgsgASAEajUAACEHQQQLIgJBAXIgA0kEQCABIAIgBGpqMwAAIAJBA3SthiAHhCEHIAJBAnIhAgsgAiADSQR+IAEgAiAEamoxAAAgAkEDdK2GIAeEBSAHCzcDMAsgACADNgI8C5oFAgZ/A34jAEEwayIDJAAgA0H/AToAByADQQhqIAEgA0EHakEBIAIoAiARBAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADLQAIQQRHBEAgAykDCCIKQv8Bg0IGUg0BC0ECIQQgAy0AB0F/ag4KAgMNBAoFBgkIBwELIAAgCjcCBAwNCyAAQQU6AAQMDAsgA0EIaiABIAIQYSADKQMIIQogAygCFCIHRQ0IIAMoAighBSADKQMgIQsgAykDGCEJIAMoAhAhCEEAIQQMCgsgA0EIaiABIAIQjgEgAykDCCEKIAMoAhQiB0UNByADKAIgIQUgAykDGCEJIAMoAhAhCEEBIQQMCQtBAyEEDAgLQQUhBAwHCyAAQQU6AAQMBwsgA0EIaiABIAIQRSADKAIMIgFFDQQgAa0gAykDECIJQiCGhCEKIAlCIIinIQUgAygCCCEGQQkhBAwFCyADQQhqIAEgAhBRIAMoAgwiAQRAIAGtIAMpAxAiCUIghoQhCiAJQiCIpyEFIAMoAgghBkEIIQQMBQsgACADKQMQNwIEDAULIANBCGogASACED8gAygCDCIBBEAgAa0gAykDECIJQiCGhCEKIAlCIIinIQUgAygCCCEGQQchBAwECyAAIAMpAxA3AgQMBAsgA0EIaiABIAIQRSADKAIMIgEEQCABrSADKQMQIglCIIaEIQogCUIgiKchBSADKAIIIQZBBCEEDAMLIAAgAykDEDcCBAwDCyAAIAo3AgQMAgsgACADKQMQNwIEDAELIAAgCzcCICAAIAk3AhggACAHNgIUIAAgCDYCECAAIAo3AgggACAGNgIEIAAgBDYCACAAIAVBAWo2AigMAQsgAEEKNgIACyADQTBqJAAL+QQBCn8jAEEwayIDJAAgA0EDOgAoIANCgICAgIAENwMgIANBADYCGCADQQA2AhAgAyABNgIMIAMgADYCCAJ/AkACQCACKAIAIgpFBEAgAkEUaigCACIARQ0BIAIoAhAhASAAQQN0IQUgAEF/akH/////AXFBAWohByACKAIIIQADQCAAQQRqKAIAIgQEQCADKAIIIAAoAgAgBCADKAIMKAIMEQUADQQLIAEoAgAgA0EIaiABQQRqKAIAEQEADQMgAUEIaiEBIABBCGohACAFQXhqIgUNAAsMAQsgAigCBCIARQ0AIABBBXQhCyAAQX9qQf///z9xQQFqIQcgAigCCCEAA0AgAEEEaigCACIBBEAgAygCCCAAKAIAIAEgAygCDCgCDBEFAA0DCyADIAUgCmoiBEEcai0AADoAKCADIARBFGopAgA3AyAgBEEQaigCACEGIAIoAhAhCEEAIQlBACEBAkACQAJAIARBDGooAgBBAWsOAgACAQsgBkEDdCAIaiIMQQRqKAIAQYMBRw0BIAwoAgAoAgAhBgtBASEBCyADIAY2AhQgAyABNgIQIARBCGooAgAhAQJAAkACQCAEQQRqKAIAQQFrDgIAAgELIAFBA3QgCGoiBkEEaigCAEGDAUcNASAGKAIAKAIAIQELQQEhCQsgAyABNgIcIAMgCTYCGCAIIAQoAgBBA3RqIgEoAgAgA0EIaiABKAIEEQEADQIgAEEIaiEAIAsgBUEgaiIFRw0ACwsgByACQQxqKAIASQRAIAMoAgggAigCCCAHQQN0aiIAKAIAIAAoAgQgAygCDCgCDBEFAA0BC0EADAELQQELIANBMGokAAvRBAEKfyMAQUBqIgMkACACKAIAIQkgAigCCCEIIANBOGohCiADQTBqIQsgA0EoaiEMA0AgAigCCCIFIAIoAgAiBEYEQCACQSAQywIgAigCACEEIAIoAgghBQsgAyAGNgIUIANBADYCECADIAQgBWs2AgwgAyACKAIEIAVqNgIIIANBGGogAUEAIANBCGoQqAECQAJAAkACQAJAAkACQAJAIAMtABgiBUEERgRAIAMoAhAiBQ0BIABBBDoAACAAIAIo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IAQ2AgQgASAAIAJqNgIACyABEIEDDQEgARCXAyICQRBBCBDmAiADak0NASABIAMQqAMhACABIAMQugIgACACIANrIgMQugIgACADED0MAQsgBA8LIAEQqgMgARCBAxoLvwMBAX8jAEFAaiICJAACQAJAAkACQAJAAkAgAC0AAEEBaw4DAQIDAAsgAiAAKAIENgIEQRRBARD3AiIARQ0EIABBEGpBxMfAACgAADYAACAAQQhqQbzHwAApAAA3AAAgAEG0x8AAKQAANwAAIAJBFDYCECACIAA2AgwgAkEUNgIIIAJBNGpBAzYCACACQTxqQQI2AgAgAkEkakHtADYCACACQazFwAA2AjAgAkEANgIoIAJB7gA2AhwgAiACQRhqNgI4IAIgAkEEajYCICACIAJBCGo2AhggASACQShqENgBIQAgAigCCEUNAyACKAIMECsMAwsgAC0AASEAIAJBNGpBATYCACACQTxqQQE2AgAgAkGov8AANgIwIAJBADYCKCACQe8ANgIMIAIgAEEgc0E/cUECdCIAQcjHwABqKAIANgIcIAIgAEHIycAAaigCADYCGCACIAJBCGo2AjggAiACQRhqNgIIIAEgAkEoahDYASEADAILIAAoAgQiACgCACAAKAIEIAEQnAMhAAwBCyAAKAIEIgAoAgAgASAAQQRqKAIAKAIQEQEAIQALIAJBQGskACAADwtBFEEBEJsDAAuPAwIKfwV+IwBBIGsiBCQAIAFBEGohCCABIAIQQyEPIAFBHGooAgAiCUFoaiEKIAEoAhAiByAPp3EhBiAPQhmIQv8Ag0KBgoSIkKDAgAF+IREgAigCCCELIAIoAgQhDAJAAkACQANAIAYgCWopAAAiECARhSIOQn+FIA5C//379+/fv/9+fINCgIGChIiQoMCAf4MhDgNAIA5QBEAgECAQQgGGg0KAgYKEiJCgwIB/g1BFDQMgBiANQQhqIg1qIAdxIQYMAgsgDnohEiAOQn98IA6DIQ4gDCALIApBACASp0EDdiAGaiAHcWtBGGxqIgUoAgQgBSgCCBDRAkUNAAsLIAUNAQsgBEEQaiACQQhqKAIANgIAIARBHGogA0EIaigCADYCACAEIAIpAgA3AwggBCADKQIANwIUIAggDyAEQQhqIAEQRCAAQQA2AgQMAQsgACAFKQIMNwIAIAUgAykCADcC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AkACQCAALQAAIgNBfGpBAiADQQNLG0H/AXFBAWsOAgECAAsgAkEcakEBNgIAIAJBJGpBADYCACACQeyfwAA2AhggAkH8ncAANgIgIAJBADYCECABIAJBEGoQ2AEMAgsgAkEcakEBNgIAIAJBJGpBADYCACACQcifwAA2AhggAkH8ncAANgIgIAJBADYCECABIAJBEGoQ2AEMAQsgAiAANgIMIAJBHGpBAjYCACACQSRqQQE2AgAgAkGgn8AANgIYIAJBADYCECACQcIANgIsIAIgAkEoajYCICACIAJBDGo2AiggASACQRBqENgBCyACQTBqJAAL6gECAn8BfiMAQSBrIgMkACAAKAIARQRAIABBfzYCACADQRhqIABBHGopAgA3AwAgA0EQaiAAQRRqKQIANwMAIABBDGoiBCkCACEFIARBADYCACADIAU3AwggA0EIahDaAgJAIABBJGooAgBBAkYNACAAQShqKAIAIgRBhAFJDQAgBBAACyAAIAE2AiQgAEEoaiACNgIAIABBCGoiAigCACEBIAJBADYCACAAIAAoAgBBAWo2AgAgAQRAIAAoAgQgASgCBBECAAsgA0EgaiQADwtB4LbAAEEQIANBCGpB8LbAAEGwuMAAELQBAAvpAQIDfwJ+IwBBIGsiAyQAIANBEGogASACEEUCQAJAIAMoAhQiBARAIAMoAhAhBSADIAMpAxgiBz4CCCADIAQ2AgQgAyAFNgIAIANBEGogASACEFMgAygCFCIBRQ0BIAMoAhAhAiADKQMYIQYgACADKQMANwIAIAAgBj4CFCAAIAE2AhAgACACNgIMIABBCGogA0EIaigCADYCACAAIAZCIIinIAdCIIinajYCGAwCCyADKQMYIQYgAEEANgIEIAAgBjcCCAwBCyADKQMYIQYgAEEANgIEIAAgBjcCCCADEJoCCyADQSBqJAAL0AEBBX8jAEEgayIDJAAgAAJ/QQAgAkEBaiIEIAJJDQAaIAEoAgAiAkEBdCIFIAQgBSAESxsiBEEEIARBBEsbIgVBBHQhBCAFQYCAgMAASUEDdCEGAkAgAgRAIAEoAgQhByADQQg2AhggAyACQQR0NgIUIAMgBzYCEAwBCyADQQA2AhgLIAMgBCAGIANBEGoQlwEgAygCBCEEIAMoAgAEQCADQQhqKAIADAELIAEgBTYCACABIAQ2AgRBgYCAgHgLNgIEIAAgBDYCACADQSBqJAALzwEBBX8jAEEgayIDJAAgAAJ/QQAgAkEBaiIEIAJJDQAaIAEoAgAiAkEBdCIFIAQgBSAESxsiBEEEIARBBEsbIgVBGGwhBCAFQdaq1SpJQQJ0IQYCQCACBEAgASgCBCEHIANBBDYCGCADIAJBGGw2AhQgAyAHNgIQDAELIANBADYCGAsgAyAEIAYgA0EQahCXASADKAIEIQQgAygCAARAIANBCGooAgAMAQsgASAFNgIAIAEgBDYCBEGBgICAeAs2AgQgACAENgIAIANBIGokAAvQAQEFfyMAQSBrIgMkACAAAn9BACACQQFqIgQgAkkNABogASgCACICQQF0IgUgBCAFIARLGyIEQQQgBEEESxsiBUEMbCEEIAVBq9Wq1QBJQQJ0IQYCQCACBEAgASgCBCEHIANBBDYCGCADIAJBDGw2AhQgAyAHNgIQDAELIANBADYCGAsgAyAEIAYgA0EQahCXASADKAIEIQQgAygCAARAIANBCGooAgAMAQsgASAFNgIAIAEgBDYCBEGBgICAeAs2AgQgACAENgIAIANBIGokAAvPAQEFfyMAQSBrIgMkACAAAn9BACACQQFqIgQgAkkNABogASgCACICQQF0IgUgBCAFIARLGyIEQQQgBEEESxsiBUEobCEEIAVBtObMGUlBA3QhBgJAIAIEQCABKAIEIQcgA0EINgIYIAMgAkEobDYCFCADIAc2AhAMAQsgA0EANgIYCyADIAQgBiADQRBqEJcBIAMoAgQhBCADKAIABEAgA0EIaigCAAwBCyABIAU2AgAgASAENgIEQYGAgIB4CzYCBCAAIAQ2AgAgA0EgaiQAC9ABAQV/IwBBIGsiAyQAIAACf0EAIAJBAWoiBCACSQ0AGiABKAIAIgJBAXQiBSAEIAUgBEsbIgRBBCAEQQRLGyIFQQJ0IQQgBUGAgICAAklBAnQhBgJAIAIEQCABKAIEIQcgA0EENgIYIAMgAkECdDYCFCADIAc2AhAMAQsgA0EANgIYCyADIAQgBiADQRBqEJcBIAMoAgQhBCADKAIABEAgA0EIaigCAAwBCyABIAU2AgAgASAENgIEQYGAgIB4CzYCBCAAIAQ2AgAgA0EgaiQAC8kBAQV/IwBBMGsiAiQAIAJBCGpBgAgQ3gEgAkEANgIYIAIgAikDCDcDECACQSBqIAEgAkEQahCDAQJAIAItACBBBkYEQCACKAIkIQUgAigCFCEEIAIgAigCGCIDEN4BIAIoAgAhBiACKAIEIAQgAxCiAyEEIAAgBTYCDCAAIAM2AgggACAENgIEIAAgBjYCAAwBCyACIAIpAyA3AyggAkEoahCpASEDIABBADYCBCAAIAM2AgALIAJBEGoQmgIgARC4ASACQTBqJAAL4AEBAn8jAEEgayICJAAgAiAANgIMIAIgASgCAEG85MAAQREgASgCBCgCDBEFADoAGCACIAE2AhQgAkEAOgAZIAJBADYCECACQRBqIAJBDGpBrOTAABBfIQACfyACLQAYIgEgACgCACIDRQ0AGiABQf8BcSEAQQEgAA0AGiACKAIUIQACQCADQQFHDQAgAi0AGUUNACAALQAYQQRxDQBBASAAKAIAQYjQwABBASAAKAIEKAIMEQUADQEaCyAAKAIAQcfOwABBASAAKAIEKAIMEQUACyACQSBqJABB/wFxQQBHC70BAgJ/AX4jAEEgayIDJAAgA0GACBDeASADQQA2AhAgAyADKQMANwMIIANBGGogASADQQhqQeyQwAAQVgJAAkACQAJ/IAMtABhBBkYEQCADKAIcDAELIAMpAxgiBUL/AYNCBlINASAFQiCIpwshASADKAIQIgQgAUkNAiADKAIMIAEgAhDqASAAQQY6AAAgACABNgIEDAELIAAgBTcCAAsgA0EIahCaAiADQSBqJAAPCyABIARB1JHAABCHAwALzAEBAn8jAEEgayIDJAACQAJAIAEgAmoiAiABSQ0AIAAoAgAiAUEBdCIEIAIgBCACSxsiAkEIIAJBCEsbIgJBf3NBH3YhBAJAIAEEQCADQQE2AhggAyABNgIUIAMgAEEEaigCADYCEAwBCyADQQA2AhgLIAMgAiAEIANBEGoQmAEgAygCBCEBIAMoAgBFBEAgACACNgIAIAAgATYCBAwCCyADQQhqKAIAIgBBgYCAgHhGDQEgAEUNACABIAAQmwMACxCYAgALIANBIGokAAvMAQECfyMAQSBrIgMkAAJAAkAgASACaiICIAFJDQAgACgCACIBQQF0IgQgAiAEIAJLGyICQQggAkEISxsiAkF/c0EfdiEEAkAgAQRAIANBATYCGCADIAE2AhQgAyAAQQRqKAIANgIQDAELIANB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AygCEEUEQCAAIAMpAwg3AgAgAyABKAIINgIADAELIAMpAwgiBUL/AYNCBFEEQCAAQZCNwAA2AgQgAEECNgIADAELIAAgBTcCAAsgAygCBCADKAIANgIIIANBIGokAA8LIAQgAkHcjMAAEIYDAAumAQEBfyMAQTBrIgMkACADQQQ6AAggAyABNgIQIANBKGogAkEQaikCADcDACADQSBqIAJBCGopAgA3AwAgAyACKQIANwMYAkAgA0EIakHQksAAIANBGGoQOgRAIAMtAAhBBEYEQCAAQfiSwAA2AgQgAEECNgIADAILIAAgAykDCDcCAAwBCyAAQQQ6AAAgAy0ACEEERg0AIANBCGoQiAILIANBMGokAAupAQEDfyMAQTBrIgIkACABKAIERQRAIAEoAgwhAyACQRBqIgRBADYCACACQoCAgIAQNwMIIAIgAkEIajYCFCACQShqIANBEGopAgA3AwAgAkEgaiADQQhqKQIANwMAIAIgAykCADcDGCACQRRqQdi+wAAgAkEYahA6GiABQQhqIAQoAgA2AgAgASACKQMINwIACyAAQdzGwAA2AgQgACABNgIAIAJBMGokAAudAQEBfyMAQUBqIgQkACAEIAI2AjggBCABNgI0IAQgAjYCMCAEQQhqIARBMGoQsQIgBEEgaiAEKAIIIAQoAgwQ5QIgBEE4aiIBIARBKGooAgA2AgAgBCAEKQMgNwMwIARBEGogBEEwaiADEFAgASAEQRhqKAIANgIAIAQgBCkDEDcDMCAEIARBMGoQsQIgACAEKQMANwMAIARBQGskAAusAQEDfyMAQSBrIgMkACADQgA3AwggA0EBOgAcIANBCGoQhgIiAiACKAIAQQFqIgQ2AgACQCAEBEAgAigCCA0BIAJBfzYCCCACQQxqIgQQiQIgAkEYakHQucAANgIAIAJBFGogAkEIajYCACACQRBqIAE2AgAgBCAANgIAIAJBADYCCCACEPQBIANBIGokAA8LAAtB4LbAAEEQIANBCGpB8LbAAEG8ucAAELQBAAubAQEBfyMAQUBqIgMkACADIAI2AjggAyABNgI0IAMgAjYCMCADQQhqIANBMGoQsQIgA0EgaiADKAIIIAMoAgwQ5QIgA0E4aiIBIANBKGooAgA2AgAgAyADKQMgNwMwIANBEGogA0EwahBSIAEgA0EYaigCADYC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QCAAEAALAkAgAS0AAEUNACABKAIEIgBBhAFJDQAgABAACyABQRBqJAALeQECfyMAQRBrIgQkACAEQQhqIAEQ8AECQCAEKAIMIANPBEAgBCgCCCEFAkAgA0EBRwRAIAIgBSADEKIDGgwBCyACIAUtAAA6AAALIABBBDoAACABIAEpAwAgA618NwMADAELIABCgoCAgICzgAg3AgALIARBEGokAAuHAQIBfwF+IwBBEGsiASQAQbDtwAApAwBQBEBBwO3AAAJ+AkAgAEUNACAAKQMAIABCADcDAEIBUg0AIAApAwghAiAAKQMQDAELIAFCAjcDCCABQgE3AwAgASkDACECIAEpAwgLNwMAQbjtwAAgAjcDAEGw7cAAQgE3AwALIAFBEGokAEG47cAAC4EBAQF/IwBBEGsiASQAIAFB8rLAAEEEEAE2AgggAUGIs8AAQQQQATYCDCABIAAgAUEIaiABQQxqEOIBIAEoAgwiAEGEAU8EQCAAEAALIAEoAggiAEGEAU8EQCAAEAALAkAgAS0AAEUNACABKAIEIgBBhAFJDQAgABAACyABQRBqJAALeQEBfyMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBFGpBAjYCACADQRxqQQI2AgAgA0EsakHwADYCACADQaDPwAA2AhAgA0EANgIIIANB8AA2AiQgAyADQSBqNgIYIAMgAzYCKCADIANBBGo2AiAgA0EIaiACEKgCAAt5AQF/IwBBMGsiAyQAIAMgATYCBCADIAA2AgAgA0EUakECNgIAIANBHGpBAjYCACADQSxqQfAANgIAIANB0NPAADYCECADQQA2AgggA0HwADYCJCADIANBIGo2AhggAyADQQRqNgIoIAMgAzYCICADQQhqIAIQqAIAC3kBAX8jAEEwayIDJAAgAyABNgIEIAMgADYCACADQRRqQQI2AgAgA0EcakECNgIAIANBLGpB8AA2AgAgA0Hw08AANgIQIANBADYCCCADQfAANgIkIAMgA0EgajYCGCADIANBBGo2AiggAyADNgIgIANBCGogAhCoAgALeQEBfyMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBFGpBAjYCACADQRxqQQI2AgAgA0EsakHwADYCACADQaTUwAA2AhAgA0EANgIIIANB8AA2AiQgAyADQSBqNgIYIAMgA0EEajYCKCADIAM2AiAgA0EIaiACEKgCAAt0AQR/IwBBEGsiASQAIAAoAggiAiAAKAIEIgNHBEAgAiADa0ECdkECdCECA0AgAygCACIEQYQBTwRAIAQQAAsgA0EEaiEDIAJBfGoiAg0ACwsgASAAKAIMNgIMIAEgACgCADYCCCABQQhqEJkCIAFBEGokAAtsAQF/IwBBMGsiAyQAIAMgATYCKCADIAA2AiQgAyABNgIgIANBCGogA0EgahCxAiADQRBqIAMoAgggAygCDBDlAiADQShqIANBGGooAgA2AgAgAyADKQMQNwMgIANBIGogAhDPASADQTBqJAALaQEBfyMAQTBrIgIkACACIAE2AiggAiAANgIkIAIgATYCICACQQhqIAJBIGoQsQIgAkEQaiACKAIIIAIoAgwQ5QIgAkEoaiACQRhqKAIANgIAIAIgAikDEDcDICACQSBqEGggAkEwaiQAC3IBA38jAEEgayICJAACf0EBIAAgARBbDQAaIAEoAgQhAyABKAIAIQQgAkEANgIcIAJBnM7AADYCGCACQQE2AhQgAkHMzsAANgIQIAJBADYCCEEBIAQgAyACQQhqEDoNABogAEEEaiABEFsLIAJBIGokAAt5AQF/AkACQCAARQ0AIAAoAgAhASAAQQA2AgAgACgCBCEAAkAgAQ4CAQIACyAAQYQBSQ0AIAAQAAsQVyEAC0H07MAAKAIAIQFB9OzAACAANgIAQfDswAAoAgBB8OzAAEEBNgIARSABQYQBSXJFBEAgARAAC0H07MAAC3wBA38gACAAEKoDIgBBCBDmAiAAayICEKgDIQBB7PDAACABIAJrIgE2AgBB9PDAACAANgIAIAAgAUEBcjYCBEEIQQgQ5gIhAkEUQQgQ5gIhA0EQQQgQ5gIhBCAAIAEQqAMgBCADIAJBCGtqajYCBEGA8cAAQYCAgAE2AgALcwAjAEEwayIBJABB2OzAAC0AAARAIAFBFGpBAjYCACABQRxqQQE2AgAgAUHoxcAANgIQIAFBADYCCCABQfAANgIkIAEgADYCLCABIAFBIGo2AhggASABQSxqNgIgIAFBCGpBkMbAABCoAgALIAFBMGokAAt2AQF/IAAtAAQhASAALQAFBEAgAUH/AXEhASAAAn9BASABDQAaIAAoAgAiAS0AGEEEcUUEQCABKAIAQYPQwABBAiABKAIEKAIMEQUADAELIAEoAgBBgtDAAEEBIAEoAgQoAgwRBQALIgE6AAQLIAFB/wFxQQBHC2oBAX8jAEEgayICJABBtOzAACgCAEUEQEHgj8AAQStBrJDAABD3AQALIAJBGGogAEEIaigCADYCACACIAApAgA3AxAgAkEIaiACQRBqIAEQVSACKAIIIQAgAigCDCACQSBqJABBgQEgABsLawECfyMAQSBrIgIkACACQQhqIAEoAgAQAgJAIAIoAggiAwRAIAIoAgwhASACIAM2AhQgAiABNgIYIAIgATYCECACIAJBEGoQsQIgACACKAIAIAIoAgQQ5QIMAQsgAEEANgIECyACQSBqJAALawECfyABQQRqKAIAIQMCQAJAAkAgAUEIaigCACIBRQRAQQEhAgwBCyABQX9MDQEgAUEBEPcCIgJFDQILIAIgAyABEKIDIQIgACABNgIIIAAgAjYCBCAAIAE2AgAPCxCYAgALIAFBARCbAwALWQEBfyMAQSBrIgIkACACIAAoAgA2AgQgAkEYaiABQRBqKQIANwMAIAJBEGogAUEIaikCADcDACACIAEpAgA3AwggAkEEakHIj8AAIAJBCGoQOiACQSBqJAALWQEBfyMAQSBrIgIkACACIAAoAgA2AgQgAkEYaiABQRBqKQIANwMAIAJBEGogAUEIaikCADcDACACIAEpAgA3AwggAkEEakGol8AAIAJBCGoQOiACQSBqJAALYQEDfyAAIAEQywIgACgCBCIEIAAoAggiAmohAwJAAkAgAUECTwRAIANBACABQX9qIgEQowMaIAQgASACaiICaiEDDAELIAFFDQELIANBADoAACACQQFqIQILIAAgAjYCCAtZAQF/IwBBIGsiAiQAIAIgACgCADYCBCACQRhqIAFBEGopAgA3AwAgAkEQaiABQQhqKQIANwMAIAIgASkCADcDCCACQQRqQdi+wAAgAkEIahA6IAJBIGokAAtZAQF/IwBBIGsiAiQAIAIgACgCADYCBCACQRhqIAFBEGopAgA3AwAgAkEQaiABQQhqKQIANwMAIAIgASkCADcDCCACQQRqQczMwAAgAkEIahA6IAJBIGokAAtZAQF/IwBBIGsiAiQAIAIgACgCADYCBCACQRhqIAFBEGopAgA3AwAgAkEQaiABQQhqKQIANwMAIAIgASkCADcDCCACQQRqQZTSwAAgAkEIahA6IAJBIGokAAtTAQJ/IwBBIGsiAiQAIAAoAgQhAyAAKAIAIAJBGGogAUEQaikCADcDACACQRBqIAFBCGopAgA3AwAgAiABKQIANwMIIAMgAkEIahA6IAJBIGokAAtWAQF/IwBBIGsiAiQAIAIgADYCBCACQRhqIAFBEGopAgA3AwAgAkEQaiABQQhqKQIANwMAIAIgASkCADcDCCACQQRqQciPwAAgAkEIahA6IAJBIGokAAuTAQIBfwJ+IwBBEGsiASQAQZDswAAgADsBAEGI7MAAQgA3AwAgAUGMkMAAEOcBIAEpAwghAiABKQMAIQNBtOzAACgCAARAQajswAAoAgAEQBCcARCrAgsLQbTswABByJ3AADYCAEGo7MAAQgA3AwBBmOzAACADNwMAQaDswAAgAjcDAEGw7MAAQQA2AgAgAUEQaiQAC1YBAX8jAEEgayICJAAgAiAANgIEIAJBGGogAUEQaikCADcDACACQRBqIAFBCGopAgA3AwAgAiABKQIANwMIIAJBBGpBqJfAACACQQhqEDogAkEgaiQAC1YBAX8jAEEgayICJAAgAiAANgIEIAJBGGogAUEQaikCADcDACACQRBqIAFBCGopAgA3AwAgAiABKQIANwMIIAJBBGpBlNLAACACQQhqEDogAkEgaiQAC2YBAX8jAEFAaiIBJAAgAUEBOgAPIABBADYCCCAAQoCAgIAQNwIAIAFBEGogAEGMjsAAEL4CIAFBD2ogAUEQahCTAQRAQaSOwABBNyABQThqQdyOwABBuI/AABC0AQALIAFBQGskAAtIAQJ/AkAgAUUEQEEBIQIMAQsgAUEATgRAIAEgAUF/c0EfdiIDEPcCIgINASABIAMQmwMACxCYAgALIAAgAjYCBCAAIAE2AgALYgEBfyMAQSBrIgMkACAAKAIAIANBCGogASACEDAgAygCCARAIAMgAykCDDcDGEGIsMAAQSsgA0EYakG0sMAAQaCxwAAQtAEACyADKAIMIANBEGooAgAQlwIgA0EgaiQAQQALaQEDfyMAQRBrIgEkAAJAQQBBzLnAACgCABEGACICBEAgACgCACgCACIAIAAoAgBBAWoiAzYCACADRQ0BIAIgABC2ASABQRBqJAAPC0GiusAAQcYAIAFBCGpB6LrAAEHIu8AAELQBAAsAC1YBAn8CQCAAQQNwQQNzQQNwIgRFBEAMAQtBACEAA0AgACACRwRAIAAgAWpBPToAACAAQQFqIQNBASEAIAMgBEkNAQwCCwsgAiACQcigwAAQwwEACyADC1oBAX8jAEEQayIEJAAgASgCACACKAIAIAMoAgAQHiEBIARBCGoQvQIgAAJ/IAQoAghFBEAgACABQQBHOgABQQAMAQsgACAEKAIMNgIEQQELOgAAIARBEGokAAtUAQF/IwBBMGsiASQAIAFBEGpBkJDAAEEGEIUCIAFBKGogAUEYaigCADYCACABIAEpAxA3AyAgAUEIaiABQSBqELECIAAgASkDCDcDACABQTBqJAALWQECfyAAKAIMIgIgACgCACIDRgRAIAAQqwEgACgCDCECIAAoAgAhAwsgACgCBCAAKAIIIAJqIgJBACADIAIgA0kba0ECdGogATYCACAAIAAoAgxBAWo2AgwLRwECfwJAIAAoAgAiAkUNACACIABBFGooAgAiASAANQIQIAJBAWqtfqdqQX9qQQAgAWtxIgFqQQlqRQ0AIAAoAgwgAWsQKwsLYAECfyMAQRBrIgEkACABQeiCwABBFRCFAkEMQQQQ9wIiAkUEQEEMQQQQmwMACyACIAEpAwA3AgAgAkEIaiABQQhqKAIANgIAIABB4IDAADYCBCAAIAI2AgAgAUEQaiQAC2ECAX8BfiMAQRBrIgIkAEEAIAEoAgARBgAiAQRAIAEgASkDACIDQgF8NwMAIAAgASkDCDcDCCAAIAM3AwAgAkEQaiQADwtBsJTAAEHGACACQQhqQfiUwABB2JXAABC0AQALSgEBfyMAQSBrIgAkACAAQRRqQQE2AgAgAEEcakEANgIAIABB5MvAADYCECAAQcjLwAA2AhggAEEANgIIIABBCGpBvMzAABCoAgALTQEBfyMAQTBrIgEkACABQRBqEN0BIAFBKGogAUEYaigCADYCACABIAEpAxA3AyAgAUEIaiABQSBqELECIAAgASkDCDcDACABQTBqJAALZwEBfyMAQSBrIgMkACADIAI2AgwgA0EQaiICQYACOwEEIAJBBmpBADoAACACQf0FNgIAIANBEGogACABIANBDGoQJQRAQcCcwABBIiADQRhqQeyXwABBtJ3AABC0AQALIANBIGokAAtMAQJ/IAAoAggiAQRAIAAoAgQhACABQQR0IQEDQCAALQAAIgJBfmpBB0kgAkVyRQRAIABBBGoQmgILIABBEGohACABQXBqIgENAAsLC1YBAn8gASgCACECIAFBADYCAAJAIAIEQCABKAIEIQNBCEEEEPcCIgFFDQEgASADNgIEIAEgAjYCACAAQdiywAA2AgQgACABNgIADwsAC0EIQQQQmwMAC1IBA38jAEEQayIBJAAgAUEIahCPAhC0AiABKAIMIQICQCABKAIIRQRAQQEhAwwBCyACQYQBSQ0AIAIQAAsgACACNgIEIAAgAzYCACABQRBqJAALSwECfyMAQRBrIgEkACABIABBeGo2AgggAC0AFCAAQQE6ABQgASABQQhqNgIMQQFxRQRAIAFBDGoQ4AELIAFBCGoQtQEgAUEQaiQAC18BA38jAEEQayIBJAACQCAAKAIMIgIEQCAAKAIIIgNFDQEgASACNgIIIAEgADYCBCABIAM2AgAgARC2AgALQfC+wABBK0HMxsAAEPcBAAtB8L7AAEErQbzGwAAQ9wEAC1ACAn8CfiABQRBqKAIAIgIgASkDACIEIAKtIgUgBCAFVBunIgNJBEAgAyACQcyEwAAQhgMACyAAIAIgA2s2AgQgACABQQxqKAIAIANqNgIAC0gBA38jAEEQayICJAAgAiABNgIMQQEhASACQQxqKAIAEBJBAUYgAigCDCEDBEBBACEBCyAAIAM2AgQgACABNgIAIAJBEGokAAtIAQN/IwBBEGsiAiQAIAIgATYCDEEBIQEgAkEMaigCABALQQBHIAIoAgwhAwRAQQAhAQsgACADNgIEIAAgATYCACACQRBqJAALSgEBfyMAQRBrIgQkACABIAIgAygCABANIQEgBEEIahC9AiAAAn8gASAEKAIIIgFFDQAaIAQoAgwLNgIEIAAgATYCACAEQRBqJAALWAECfyMAQRBrIgEkACABIAA2AgRBAEHMucAAKAIAEQYAIgIEQCACIAAQtgEgAUEQaiQADwsgAUEEahC1AUGiusAAQcYAIAFBCGpB6LrAAEHIu8AAELQBAAtYAQF/IwBBIGsiACQAIABBDGpBATYCACAAQRRqQQE2AgAgAEGomMAANgIIIABBADYCACAAQQc2AhwgAEHIm8AANgIYIAAgAEEYajYCECAAQdCbwAAQqAIAC0YBAX8jAEEQayICJAAgASgCABAMIQEgAkEIahC9AiAAAn8gASACKAIIIgFFDQAaIAIoAgwLNgIEIAAgATYCACACQRBqJAALUgEBfyMAQSBrIgMkACADQQxqQQE2AgAgA0EUakEANgIAIANBnM7AADYCECADQQA2AgAgAyABNgIcIAMgADYCGCADIANBGGo2AgggAyACEKgCAAtTAQF/IwBBIGsiAiQAIAJBDGpBATYCACACQRRqQQE2AgAgAkHAz8AANgIIIAJBADYCACACQYQBNgIcIAIgADYCGCACIAJBGGo2AhAgAiABEKgCAAtDAQN/AkAgAkUNAANAIAAtAAAiBCABLQAAIgVGBEAgAEEBaiEAIAFBAWohASACQX9qIgINAQwCCwsgBCAFayEDCyADC0sBAX8jAEEQayICJAAgAkEIaiAAIAFBARCMAQJAIAIoAgwiAEGBgICAeEcEQCAARQ0BIAIoAgggABCbAwALIAJBEGokAA8LEJgCAAtIAQF/IwBBEGsiAiQAIAJBCGogACABEH8CQCACKAIMIgBBgYCAgHhHBEAgAEUNASACKAIIIAAQmwMACyACQRBqJAAPCxCYAgALSAEBfyMAQRBrIgIkACACQQhqIAAgARB8AkAgAigCDCIAQYGAgIB4RwRAIABFDQEgAigCCCAAEJsDAAsgAkEQaiQADwsQmAIAC0gBAX8jAEEQayICJAAgAkEIaiAAIAEQfQJAIAIoAgwiAEGBgICAeEcEQCAARQ0BIAIoAgggABCbAwALIAJBEGokAA8LEJgCAAtIAQF/IwBBEGsiAiQAIAJBCGogACABEH4CQCACKAIMIgBBgYCAgHhHBEAgAEUNASACKAIIIAAQmwMACyACQRBqJAAPCxCYAgALSwEBfyMAQRBrIgMkACADQQhqIAAgASACEIwBAkAgAygCDCIAQYGAgIB4RwRAIABFDQEgAygCCCAAEJsDAAsgA0EQaiQADwsQmAIAC00BAn8jAEEQayICJAAgACgCACEDIABBADYCACADRQRAQai3wABBHBCWAwALIAIgAzYCDCADQQhqQQAgARB6IAJBDGoQrwEgAkEQaiQAC00BAn8jAEEQayICJAAgACgCACEDIABBADYCACADRQRAQai3wABBHBCWAwALIAIgAzYCDCADQQhqQQEgARB6IAJBDGoQrwEgAkEQaiQAC0MBAn8jAEEQayIBJAAgASAAQXhqNgIIIAAtABQgAEEBOgAUIAEgAUEIajYCDEEBcUUEQCABQQxqEOABCyABQRBqJAALSQEBfyMAQRBrIgIkACACQQhqIAAgARCAAQJAIAIoAgwiAEGBgICAeEcEQCAARQ0BIAIoAgggABCbAwALIAJBEGokAA8LEJgCAAtOAQF/IwBBEGsiBCQAIAEoAgAgAigCACADKAIAEBkhASAEQQhqEL0CIAQoAgwhAiAAIAQoAggiAzYCACAAIAIgASADGzYCBCAEQRBqJAALSQEDfyMAQRBrIgMkACADQQhqIAIQ3gEgAygCCCEEIAAgAygCDCIFNgIEIAAgBDYCACAFIAEgAhCiAxogACACNgIIIANBEGokAAtQAQF/QSBBBBD3AiIBRQRAQSBBBBCbAwALIAFCgYCAgBA3AgAgASAAKQIANwIIIAFBEGogAEEIaikCADcCACABQRhqIABBEGopAgA3AgAgAQtKAQF/IwBBsAFrIgEkACABIABBqAEQogMiACAANgKsASAAQawBakGsgcAAEKcDIAAtAKABQQNGBEAgAEEIahCsAgsgAEGwAWokAAtFAQJ/IAAtAABBA0YEQCAAKAIEIgEoAgAgASgCBCgCABECACABKAIEIgIoAgQEQCACKAIIGiABKAIAECsLIAAoAgQQKwsLSAEBfyAAKAIAIgEEQCABIAAoAgQoAgARAgAgACgCBCIBKAIEBEAgASgCCBogACgCABArCyAAKAIIIABBDGooAgAoAgwRAgALC0gBAX8gACgCACIAKAIAIAAoAggiA2sgAkkEQCAAIAMgAhCEASAAKAIIIQMLIAAoAgQgA2ogASACEKIDGiAAIAIgA2o2AghBAAtIAQF/IAAoAgAiACgCACAAKAIIIgNrIAJJBEAgACADIAIQhQEgACgCCCEDCyAAKAIEIANqIAEgAhCiAxogACACIANqNgIIQQALPgECfyMAQRBrIgEkACABQQhqIABBCGooAgAiAjYCACABIAApAgA3AwAgASgCBCACEAEgARCaAiABQRBqJAALQQECfyAAKAIIIgEEQCAAKAIEIQAgAUECdCEBA0AgACgCACICQYQBTwRAIAIQAAsgAEEEaiEAIAFBfGoiAQ0ACwsLTwEBfyAAKAIAIgAgACgCAEF/aiIBNgIAAkAgAQ0AIABBDGoiARCVASABKAIABEAgASgCBBAr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7MAAKAIAIABrECsLCzEAAkACfwJAAkAgAC0AkAEOBAADAwEDCyAAQYQBagwBCyAAEK4BIABB+ABqCxCaAgsLLwEBfyMAQRBrIgIkACACIAAoAgA2AgwgAkEMaiABEGogAkEMahCOAiACQRBqJAALLgEBfyAAKAIEBEAgAEEEahCOAiAAKAIAIgFBhAFPBEAgARAACyAAQQhqEKkCCwskACMAQRBrIgAkACAAQQhqIAEQvwIgAEEIahDOASAAQRBqJAALMwEBf0E0QQQQ9wIiAUUEQEE0QQQQmwMACyABQoGAgIAQNwIAIAFBCGogAEEsEKIDGiABCzIBAX8gACABKAIAIAEoAggiAksEfyABIAIQngIgASgCCAUgAgs2AgQgACABKAIENgIACzIBAX8gACABKAIAIAEoAggiAksEfyABIAIQnwIgASgCCAUgAgs2AgQgACABKAIENgIACy4BAX8gASgCACICBEAgAEEBNgIIIAAgAjYCBCAAIAEoAgQ2AgAPCyAAQQA2AggLIwEBfwJ/QQEgARAJRQ0AGkEACyECIAAgATYCBCAAIAI2AgALMAEBfyABQXhqIgIgAigCAEEBaiICNgIAIAJFBEAACyAAQdC5wAA2AgQgACABNgIACy0BAX8jAEEQayIBJAAgAUEIaiAAQQhqKAIANgIAIAEgACkCADcDACABEKwBAAskACAAKAIAQXBqIgAQmgIgAEEMaigCACIAQYQBTwRAIAAQAAsLMQEBf0EEQQQQ9wIiAkUEQEEEQQQQmwMACyACIAE2AgAgAEGAt8AANgIEIAAgAjYCAAsxAQF/QQRBBBD3AiICRQRAQQRBBBCbAwALIAIgATYCACAAQZS3wAA2AgQgACACNgIACycAIAAgACgCBEEBcSABckECcjYCBCAAIAFqIgAgACgCBEEBcjYCBAsmAQF/IwBBEGsiASQAIAEgAEF4ajYCDCABQQxqELUBIAFBEGokAAsmAAJAIABFDQAgACABKAIAEQIAIAEoAgRFDQAgASgCCBogABArCws6AQJ/QZDtwAAtAAAhAUGQ7cAAQQA6AABBlO3AACgCACECQZTtwABBADYCACAAIAI2AgQgACABNgIACzEAIABBAzoAICAAQoCAgICABDcCGCAAQQA2AhAgAEEANgIIIAAgAjYCBCAAIAE2AgALMgEBfyABKAIAQZu/wABBCyABKAIEKAIMEQUAIQIgAEEAOgAFIAAgAjoABCAAIAE2AgALIAEBfwJAIABBBGooAgAiAUUNACAAKAIARQ0AIAEQKwsLJgEBfyMAQRBrIgMkACADIAE2AgwgAyAANgIIIANBCGogAhD4AQALEwAgACABKQAANwABIABBADoAAAsmAQF/IABBB2oiASAASQRAQbCxwABBM0G0ssAAEIoDAAsgAUEDdgsjAAJAIAFB/P///wdNBEAgACABQQQgAhDoAiIADQELAAsgAAsjACACIAIoAgRBfnE2AgQgACABQQFyNgIEIAAgAWogATYCAAseACAAKAIAIgCtQgAgAKx9IABBf0oiABsgACABEFoLKgACQAJAAkAgAC0AqgEOBAACAgECCyAAQYABahC4AQ8LIABBCGoQrgELCyUAIABFBEBB57vAAEEyEJYDAAsgACACIAMgBCAFIAEoAhARCwALHQAgACgCACgCACABKAIMQQAgAmtBGGxqQWhqEEMLEQAgACgCAARAIAAoAgQQKwsLIAEBfyAAKAIAIAAoAggiAmsgAUkEQCAAIAIgARD/AQsLIwAgAEUEQEHnu8AAQTIQlgMACyAAIAIgAyAEIAEoAhARFAALIwAgAEUEQEHnu8AAQTIQlgMACyAAIAIgAyAEIAEoAhARBAALIwAgAEUEQEHnu8AAQTIQlgMACyAAIAIgAyAEIAEoAhARCgALIwAgAEUEQEHnu8AAQTIQlgMACyAAIAIgAyAEIAEoAhARFQALIwAgAEUEQEHnu8AAQTIQlgMACyAAIAIgAyAEIAEoAhARDgALFwAgASADRgR/IAAgAiABEPkBRQVBAAsLHgAgACABQQNyNgIEIAAgAWoiACAAKAIEQQFyNgIECyEAIABFBEBB57vAAEEyEJYDAAsgACACIAMgASgCEBEDAAsUACAAKAIABEAgAEEEaigCABArCwsaACAAKAIAKAIAIAEoAgwgAkEEdGtBcGoQQwsdACABKAIARQRAAAsgAEHYssAANgIEIAAgATYCAAsfACAARQRAQcC0wABBMhCWAwALIAAgAiABKAIQEQAACx8AIABFBEBB8LnAAEEyEJYDAAsgACACIAEoAhARAAALHwAgAEUEQEHnu8AAQTIQlgMACyAAIAIgASgCEBEBAAsXACAAKAIABEAgABCpAiAAQQxqEKkCCwsfAQF/IAAoAgQgACgCCBABIAAoAgAEQCAAKAIEECsLCx4BAX9B9OzAACEBQfDswAAoAgAEfyABBSAAEMsBCwsZAQF/IAAoAhAiAQR/IAEFIABBFGooAgALCxkAIAEgAiADEJcCIABBBDoAACAAIAM2AgQLFwAgAEEEaigCACAAQQhqKAIAIAEQnAMLEgBBAEEZIABBAXZrIABBH0YbCxYAIAAgAUEBcjYCBCAAIAFqIAE2AgALFgAgAEEEaigCACAAQQhqKAIAIAEQLwsTAEHI7MAAKAIABEAQmQEQpAILCxcAQeDswAAoAgBFBEAgABBvC0Hc7MAACxcAIAAgAjYCCCAAIAE2AgQgACACNgIACxAAIAAgAWpBf2pBACABa3ELEgAgAC0AAEEERwRAIAAQiAILCwwAIAAgASACIAMQLgsLACABBEAgABArCwsPACAAQQF0IgBBACAAa3ILGQAgASgCAEHUzsAAQQsgASgCBCgCDBEFAAsZACABKAIAQd/OwABBDiABKAIEKAIMEQUACxkAIAEoAgBB6OTAAEEFIAEoAgQoAgwRBQALEwAgACgCACgCCCABIAIQlwJBAAsSACABIAIgAxCXAiAAQQQ6AAALCgAgAEEIahCaAgsPACAAKAIABEAgABCvAQsLFAAgACgCACABIAAoAgQoAgwRAQALDwAgACABIAIgAyAEECkACw4AIAAoAgAgARBwGkEACxAAIAAoAgggASACEJcCQQALEAAgACgCACABIAIQlwJBAAsIACAAIAEQSQsRACAAKAIAIAAoAgQgARCcAwsQACAAIAI2AgQgACABNgIACxYAQZTtwAAgADYCAEGQ7cAAQQE6AAALEwAgAEHsxsAANgIEIAAgATYCAAsNACAALQAEQQJxQQF2Cw8AIAAgAUEEaikCADcDAAsQACABIAAoAgAgACgCBBAsCw0AIAAgASACEJcCQQALCgBBACAAayAAcQsLACAALQAEQQNxRQsMACAAIAFBA3I2AgQLDQAgACgCACAAKAIEagsNACAAKAIAIAEQWEEACw4AIAAoAgAaA0AMAAsACwwAIAAgASACEMQBAAsMACAAIAEgAhDFAQALDAAgACABIAIQxgEACw0AIAA1AgBBASABEFoLDAAgACABIAIQwQIACw0AIAAoAgAgASACEEcLDQAgACkDAEEBIAEQWgsNACAAMwEAQQEgARBaCw4AIAAoAgAtAAAgARBdCwsAIAAjAGokACMACwoAIAAgASACEDsLCwAgACACIAEQoQELBwAgABCaAgsNACABQeiVwABBAhAsCwsAIAAoAgAgARBKCwsAIAAgAUHdABAiCwkAIAAgARAhAAsKACAAKAIEQXhxCwoAIAAoAgRBAXELCgAgACgCDEEBcQsKACAAKAIMQQF2CxoAIAAgAUGY7cAAKAIAIgBB8QAgABsRAAAACwoAIAIgACABECwLDAAgACABKQIANwMACwwAIAAgASkCCDcDAAsLACAAKAIAIAEQWwsNACABQejSwABBAhAsCwoAIAAgASACEDULCgAgACABIAIQWQsLACAAIAEgAhCWAQsHACAAEMEBCwkAIABBBDoAAAsJACAAQQA2AgALCAAgACABEBoLBwAgACABagsHACAAIAFrCwcAIABBCGoLBwAgAEF4agsHACAAENoBCwcAIAAQjgILBABBAQsLAELys9u82+mRJQsNAELIteDPyobb04l/Cw0AQu/Fjf7k3bzN8wALDABCs7b38aLcov4ECwMAAQsDAAELC91rBABBgIDAAAu0VQEAAAAEAAAABAAAAAIAAAADAAAAAwAAAAEAAAAEAAAABAAAAAQAAAAFAAAABQAAAP//////////YHVud3JhcF90aHJvd2AgZmFpbGVkAAAACQAAAAwAAAAEAAAACgAAAAkAAAAMAAAABAAAAAsAAAAKAAAAUAAQAAwAAAANAAAADgAAAAwAAAAPAAAAEAAAAGABAAAIAAAAEQAAABIAAAAgAgAACAAAABMAAAAUAAAABAAAAAQAAAAVAAAAFgAAABQAAAAEAAAABAAAABcAAAAYAAAAL3Jvb3QvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvd2FzbS1iaW5kZ2VuLWZ1dHVyZXMtMC40LjM0L3NyYy9saWIucnPUABAAXAAAANoAAAAVAAAAYGFzeW5jIGZuYCByZXN1bWVkIGFmdGVyIGNvbXBsZXRpb24AGQAAAGZhaWxlZCB0byBmaWxsIGJ1ZmZlcmZhaWxlZCB0byBmaWxsIHdob2xlIGJ1ZmZlcn0BEAAbAAAAJQAAAC9ydXN0Yy9mYzU5NGYxNTY2OTY4MGZhNzBkMjU1ZmFlYzNjYTNmYjUwN2MzNDA1L2xpYnJhcnkvc3RkL3NyYy9pby9pbXBscy5ycwCkARAASwAAAPIAAAANAAAAL3J1c3RjL2ZjNTk0ZjE1NjY5NjgwZmE3MGQyNTVmYWVjM2NhM2ZiNTA3YzM0MDUvbGlicmFyeS9zdGQvc3JjL2lvL2N1cnNvci5ycwACEABMAAAA6wAAAAoAAAAvcnVzdGMvZmM1OTRmMTU2Njk2ODBmYTcwZDI1NWZhZWMzY2EzZmI1MDdjMzQwNS9saWJyYXJ5L3N0ZC9zcmMvaW8vcmVhZGJ1Zi5ycwAAAFwCEABNAAAAIQEAACsAAABjYWxsZWQgYE9wdGlvbjo6dW53cmFwKClgIG9uIGEgYE5vbmVgIHZhbHVlY2FsbGVkIGBSZXN1bHQ6OnVud3JhcCgpYCBvbiBhbiBgRXJyYCB2YWx1ZQAAFAAAAAAAAAABAAAAGgAAAC9yb290Ly5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL2Jhc2U2NC0wLjEzLjEvc3JjL2NodW5rZWRfZW5jb2Rlci5ycwAAJAMQAFoAAAAtAAAAGgAAACQDEABaAAAANwAAAEQAAAAkAxAAWgAAADoAAAAnAAAAL3Jvb3QvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvYmFzZTY0LTAuMTMuMS9zcmMvZW5jb2RlLnJzAAAAsAMQAFEAAAC2AAAAIAAAALADEABRAAAAtwAAACUAAACwAxAAUQAAAPwAAAAcAAAAsAMQAFEAAAD9AAAAIQAAALADEABRAAAAEwEAAC4AAACwAxAAUQAAABMBAAAJAAAAsAMQAFEAAAAUAQAACQAAALADEABRAAAACwEAAC4AAACwAxAAUQAAAAsBAAAJAAAAsAMQAFEAAAANAQAADwAAALADEABRAAAADAEAAAkAAACwAxAAUQAAAA8BAAAJAAAAsAMQAFEAAACgAAAAKgAAAHVzZHBsLWZyb250L3NyYy9jb25uZWN0aW9uLnJzAAAA1AQQAB0AAAAZAAAAJgAAAFBPU1RodHRwOi8vdXNkcGwuOi91c2RwbC9jYWxsAAAACAUQAAwAAAAUBRAAAQAAABUFEAABAAAAFgUQAAsAAABsb2NhbGhvc3QAAABEBRAACQAAANQEEAAdAAAALQAAACQAAADUBBAAHQAAADQAAAAnAAAA1AQQAB0AAABJAAAAJgAAAEV4cGVjdGVkIGNhbGwgcmVzcG9uc2UgbWVzc2FnZSwgZ290IHNvbWV0aGluZyBlbHNldXNkcGwtZnJvbnQvc3JjL2xpYi5yc7oFEAAWAAAAcAAAAE4AAAC6BRAAFgAAAG8AAAABAAAAugUQABYAAACfAAAAJgAAALoFEAAWAAAAngAAAAEAAAAvcnVzdGMvZmM1OTRmMTU2Njk2ODBmYTcwZDI1NWZhZWMzY2EzZmI1MDdjMzQwNS9saWJyYXJ5L3N0ZC9zcmMvaW8vbW9kLnJzAAAAEAYQAEkAAABTAQAAGAAAAHN0cmVhbSBkaWQgbm90IGNvbnRhaW4gdmFsaWQgVVRGLTgAAGwGEAAiAAAAFQAAABAGEABJAAAAhwEAABsAAAAvcnVzdGMvZmM1OTRmMTU2Njk2ODBmYTcwZDI1NWZhZWMzY2EzZmI1MDdjMzQwNS9saWJyYXJ5L3N0ZC9zcmMvaW8vcmVhZGJ1Zi5ycwAAAKwGEABNAAAAywAAADYAAAAbAAAADAAAAAQAAAAcAAAAHQAAAB4AAABhIERpc3BsYXkgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3IgdW5leHBlY3RlZGx5AB8AAAAAAAAAAQAAACAAAAAvcnVzdGMvZmM1OTRmMTU2Njk2ODBmYTcwZDI1NWZhZWMzY2EzZmI1MDdjMzQwNS9saWJyYXJ5L2FsbG9jL3NyYy9zdHJpbmcucnMAbAcQAEsAAADoCQAACQAAAB8AAAAEAAAABAAAACEAAAAiAAAAIwAAAGNhbGxlZCBgT3B0aW9uOjp1bndyYXAoKWAgb24gYSBgTm9uZWAgdmFsdWUAJAAAADAuMTAuMHVzZHBsLWZyb250L3NyYy9saWIucnMWCBAAFgAAAGEAAAAYAAAAFggQABYAAABpAAAAGAAAABYIEAAWAAAAwwAAAEAAAAAWCBAAFgAAANEAAABAAAAAJQAAAAwAAAAEAAAAJgAAACcAAAAoAAAAKQAAACoAAAArAAAALAAAAC9jYXlsb24vc3JjL3VzZHBsX2Zyb250L3VzZHBsLXJzL3VzZHBsLWNvcmUvc3JjL3NlcmRlcy90cmFpdHMucnOUCBAAQAAAAHYAAAAcAAAALQAAABgAAAAIAAAALgAAAC8AAAAwAAAAMQAAADIAAAAzAAAANAAAADUAAABgdW53cmFwX3Rocm93YCBmYWlsZWRmYWlsZWQgdG8gd3JpdGUgd2hvbGUgYnVmZmVyAAAAJQkQABwAAAAXAAAANgAAAAwAAAAEAAAANwAAADgAAAA5AAAAZm9ybWF0dGVyIGVycm9yAGgJEAAPAAAAKAAAAC9ydXN0Yy9mYzU5NGYxNTY2OTY4MGZhNzBkMjU1ZmFlYzNjYTNmYjUwN2MzNDA1L2xpYnJhcnkvc3RkL3NyYy9pby9tb2QucnMAAACECRAASQAAACQFAAAWAAAAhAkQAEkAAAAoBQAADQAAAGFkdmFuY2luZyBpbyBzbGljZXMgYmV5b25kIHRoZWlyIGxlbmd0aADwCRAAJwAAAIQJEABJAAAAJgUAAA0AAABjYW5ub3QgYWNjZXNzIGEgVGhyZWFkIExvY2FsIFN0b3JhZ2UgdmFsdWUgZHVyaW5nIG9yIGFmdGVyIGRlc3RydWN0aW9uAAA6AAAAAAAAAAEAAAA7AAAAL3J1c3RjL2ZjNTk0ZjE1NjY5NjgwZmE3MGQyNTVmYWVjM2NhM2ZiNTA3YzM0MDUvbGlicmFyeS9zdGQvc3JjL3RocmVhZC9sb2NhbC5ycwCIChAATwAAAKYBAAAJAAAAKCkAACUAAAAMAAAABAAAADwAAAA9AAAAHgAAAGEgRGlzcGxheSBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvciB1bmV4cGVjdGVkbHkAOgAAAAAAAAABAAAAIAAAAC9ydXN0Yy9mYzU5NGYxNTY2OTY4MGZhNzBkMjU1ZmFlYzNjYTNmYjUwN2MzNDA1L2xpYnJhcnkvYWxsb2Mvc3JjL3N0cmluZy5ycwBMCxAASwAAAOgJAAAJAAAAOgAAAAQAAAAEAAAAPgAAAD8AAABAAAAAY2FsbGVkIGBPcHRpb246OnVud3JhcCgpYCBvbiBhIGBOb25lYCB2YWx1ZQA6AAAAAAAAAAEAAABBAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogAAD8CxAAKgAAAC9yb290Ly5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL2Jhc2U2NC0wLjEzLjEvc3JjL2RlY29kZS5ycwAAADAMEABRAAAA2QEAAB8AAAAwDBAAUQAAAN8BAAAfAAAAMAwQAFEAAADoAQAAHwAAADAMEABRAAAA8QEAAB8AAAAwDBAAUQAAAPoBAAAfAAAAMAwQAFEAAAADAgAAHwAAADAMEABRAAAADAIAAB8AAAAwDBAAUQAAABUCAAAfAAAAMAwQAFEAAAAKAQAAJAAAADAMEABRAAAACwEAACkAAAAwDBAAUQAAADEBAAAWAAAAMAwQAFEAAAA0AQAAGgAAADAMEABRAAAASAEAAA4AAAAwDBAAUQAAAEsBAAASAAAAMAwQAFEAAABfAQAAEwAAAEltcG9zc2libGU6IG11c3Qgb25seSBoYXZlIDAgdG8gOCBpbnB1dCBieXRlcyBpbiBsYXN0IGNodW5rLCB3aXRoIG5vIGludmFsaWQgbGVuZ3Roc3QNEABUAAAAMAwQAFEAAACkAQAADgAAADAMEABRAAAAuAEAAAkAAABPdmVyZmxvdyB3aGVuIGNhbGN1bGF0aW5nIG91dHB1dCBidWZmZXIgbGVuZ3RoAAAwDBAAUQAAAJ0AAAAKAAAAMAwQAFEAAACiAAAAIQAAAFdyaXRpbmcgdG8gYSBTdHJpbmcgc2hvdWxkbid0IGZhaWwvcm9vdC8uY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9iYXNlNjQtMC4xMy4xL3NyYy9lbmNvZGUucnMAYg4QAFEAAABTAAAADgAAAAAAAAD//////////3VzZHBsLWZyb250L3NyYy9jb252ZXJ0LnJzAADQDhAAGgAAACAAAAAnAAAAY3JhbmtzaGFmdAAA/A4QAAoAAABkZWNreQAAABAPEAAFAAAAYW55ACAPEAADAAAATG9hZEVycm9yOiBJbygpACwPEAAOAAAAOg8QAAEAAABMb2FkRXJyb3I6IEludmFsaWREYXRhAABMDxAAFgAAAExvYWRFcnJvcjogVG9vU21hbGxCdWZmZXIAAABsDxAAGQAAAER1bXBFcnJvcjogSW8oAACQDxAADgAAADoPEAABAAAARHVtcEVycm9yOiBVbnN1cHBvcnRlZAAAsA8QABYAAABEdW1wRXJyb3I6IFRvb1NtYWxsQnVmZmVyAAAA0A8QABkAAAAvcm9vdC8uY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9iYXNlNjQtMC4xMy4xL3NyYy9lbmNvZGUucnMAAAD0DxAAUQAAADsBAAAJAAAAISIjJCUmJygpKissLTAxMjM0NTY3ODlAQUJDREVGR0hJSktMTU5QUVJTVFVWWFlaW2BhYmNkZWhpamtsbXBxckFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5KywuL0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Li8wMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LV9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsv////////////////////////////////////////////AAECAwQFBgcICQoLDP//DQ4PEBESExQVFv///////xcYGRobHB0eHyAhIiMkJf8mJygpKiss/y0uLzD/////MTIzNDU2//83ODk6Ozz//z0+P/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8+P////zQ1Njc4OTo7PD3/////////AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBn///////8aGxwdHh8gISIjJCUmJygpKissLS4vMDEyM///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAE2Nzg5Ojs8PT4//////////wIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRob////////HB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDX//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wABAgMEBQYHCAkKC/////////8MDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJf///////yYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z7//zQ1Njc4OTo7PD3/////////AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBn/////P/8aGxwdHh8gISIjJCUmJygpKissLS4vMDEyM///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Pv///z80NTY3ODk6Ozw9/////////wABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZ////////GhscHR4fICEiIyQlJicoKSorLC0uLzAxMjP/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////mBEQAFgREAAYERAA2BAQAJgQEABYEBAA2BYQANgVEADYFBAA2BMQANgSEADYERAAY2FsbGVkIGBSZXN1bHQ6OnVud3JhcCgpYCBvbiBhbiBgRXJyYCB2YWx1ZQBDAAAACAAAAAQAAABEAAAAL3Jvb3QvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvYmFzZTY0LTAuMTMuMS9zcmMvY2h1bmtlZF9lbmNvZGVyLnJzAABEGBAAWgAAAGgAAAAwAAAAT3ZlcmZsb3cgd2hlbiBjYWxjdWxhdGluZyBudW1iZXIgb2YgY2h1bmtzIGluIGlucHV0L3Jvb3QvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvYmFzZTY0LTAuMTMuMS9zcmMvZGVjb2RlLnJz4xgQAFEAAADDAAAACgAAAEUAAAAIAAAABAAAAEYAAABHAAAARQAAAAgAAAAEAAAASAAAAGJvZHltZXRob2Rtb2Rlc2FtZS1vcmlnaW5uby1jb3JzY29yc25hdmlnYXRlYXR0ZW1wdGVkIHRvIGNvbnZlcnQgaW52YWxpZCBSZXF1ZXN0TW9kZSBpbnRvIEpTVmFsdWUvcm9vdC8uY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy93ZWItc3lzLTAuMy42MS9zcmMvZmVhdHVyZXMvZ2VuX1JlcXVlc3RNb2RlLnJzAAAAyRkQAGQAAAADAAAAAQAAAGNsb3N1cmUgaW52b2tlZCByZWN1cnNpdmVseSBvciBhZnRlciBiZWluZyBkcm9wcGVkAABMAAAABAAAAAQAAABNAAAATgAAAGFscmVhZHkgYm9ycm93ZWRPAAAAAAAAAAEAAABQAAAAYWxyZWFkeSBtdXRhYmx5IGJvcnJvd2VkTwAAAAAAAAABAAAAUQAAAC9yb290Ly5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL3dhc20tYmluZGdlbi1mdXR1cmVzLTAuNC4zNC9zcmMvcXVldWUucnMAANAaEABeAAAAGgAAAC4AAADQGhAAXgAAAB0AAAApAAAA0BoQAF4AAAAyAAAAGgAAAGFscmVhZHkgYm9ycm93ZWRSAAAAAAAAAAEAAABQAAAAUwAAAAQAAAAEAAAAVAAAAFUAAABTAAAABAAAAAQAAABWAAAAVwAAAEZuT25jZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2Uvcm9vdC8uY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy93YXNtLWJpbmRnZW4tZnV0dXJlcy0wLjQuMzQvc3JjL2xpYi5yc8QbEABcAAAApQAAAA8AAADEGxAAXAAAAIUAAAAnAAAAxBsQAFwAAACvAAAAJAAAAC9yb290Ly5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL3dhc20tYmluZGdlbi1mdXR1cmVzLTAuNC4zNC9zcmMvdGFzay9zaW5nbGV0aHJlYWQucnMAAFAcEABqAAAAIQAAABUAAABYAAAAWQAAAFoAAABbAAAAXAAAAFAcEABqAAAAVQAAACUAAABjbG9zdXJlIGludm9rZWQgcmVjdXJzaXZlbHkgb3IgYWZ0ZXIgYmVpbmcgZHJvcHBlZGNhbm5vdCBhY2Nlc3MgYSBUaHJlYWQgTG9jYWwgU3RvcmFnZSB2YWx1ZSBkdXJpbmcgb3IgYWZ0ZXIgZGVzdHJ1Y3Rpb25eAAAAAAAAAAEAAAA7AAAAL3J1c3RjL2ZjNTk0ZjE1NjY5NjgwZmE3MGQyNTVmYWVjM2NhM2ZiNTA3YzM0MDUvbGlicmFyeS9zdGQvc3JjL3RocmVhZC9sb2NhbC5ycwB4HRAATwAAAKYBAAAJAAAAXwAAAHJldHVybiB0aGlzY2xvc3VyZSBpbnZva2VkIHJlY3Vyc2l2ZWx5IG9yIGFmdGVyIGJlaW5nIGRyb3BwZWRjYW5ub3QgYWNjZXNzIGEgVGhyZWFkIExvY2FsIFN0b3JhZ2UgdmFsdWUgZHVyaW5nIG9yIGFmdGVyIGRlc3RydWN0aW9uAGwAAAAAAAAAAQAAADsAAAAvcnVzdGMvZmM1OTRmMTU2Njk2ODBmYTcwZDI1NWZhZWMzY2EzZmI1MDdjMzQwNS9saWJyYXJ5L3N0ZC9zcmMvdGhyZWFkL2xvY2FsLnJzAHAeEABPAAAApgEAAAkAAABUcmllZCB0byBzaHJpbmsgdG8gYSBsYXJnZXIgY2FwYWNpdHnQHhAAJAAAAC9ydXN0Yy9mYzU5NGYxNTY2OTY4MGZhNzBkMjU1ZmFlYzNjYTNmYjUwN2MzNDA1L2xpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMucnP8HhAATAAAAKoBAAAJAAAAcgAAAAQAAAAEAAAAcwAAAHQAAAB1AAAAY2FsbGVkIGBPcHRpb246OnVud3JhcCgpYCBvbiBhIGBOb25lYCB2YWx1ZUFjY2Vzc0Vycm9yAABwHxAAAAAAAHVuY2F0ZWdvcml6ZWQgZXJyb3JvdGhlciBlcnJvcm91dCBvZiBtZW1vcnl1bmV4cGVjdGVkIGVuZCBvZiBmaWxldW5zdXBwb3J0ZWRvcGVyYXRpb24gaW50ZXJydXB0ZWRhcmd1bWVudCBsaXN0IHRvbyBsb25naW52YWxpZCBmaWxlbmFtZXRvbyBtYW55IGxpbmtzY3Jvc3MtZGV2aWNlIGxpbmsgb3IgcmVuYW1lZGVhZGxvY2tleGVjdXRhYmxlIGZpbGUgYnVzeXJlc291cmNlIGJ1c3lmaWxlIHRvbyBsYXJnZWZpbGVzeXN0ZW0gcXVvdGEgZXhjZWVkZWRzZWVrIG9uIHVuc2Vla2FibGUgZmlsZW5vIHN0b3JhZ2Ugc3BhY2V3cml0ZSB6ZXJvdGltZWQgb3V0aW52YWxpZCBkYXRhaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzdGFsZSBuZXR3b3JrIGZpbGUgaGFuZGxlZmlsZXN5c3RlbSBsb29wIG9yIGluZGlyZWN0aW9uIGxpbWl0IChlLmcuIHN5bWxpbmsgbG9vcClyZWFkLW9ubHkgZmlsZXN5c3RlbSBvciBzdG9yYWdlIG1lZGl1bWRpcmVjdG9yeSBub3QgZW1wdHlpcyBhIGRpcmVjdG9yeW5vdCBhIGRpcmVjdG9yeW9wZXJhdGlvbiB3b3VsZCBibG9ja2VudGl0eSBhbHJlYWR5IGV4aXN0c2Jyb2tlbiBwaXBlbmV0d29yayBkb3duYWRkcmVzcyBub3QgYXZhaWxhYmxlYWRkcmVzcyBpbiB1c2Vub3QgY29ubmVjdGVkY29ubmVjdGlvbiBhYm9ydGVkbmV0d29yayB1bnJlYWNoYWJsZWhvc3QgdW5yZWFjaGFibGVjb25uZWN0aW9uIHJlc2V0Y29ubmVjdGlvbiByZWZ1c2VkcGVybWlzc2lvbiBkZW5pZWRlbnRpdHkgbm90IGZvdW5kIChvcyBlcnJvciApAAAAcB8QAAAAAACdIhAACwAAAKgiEAABAAAAbWVtb3J5IGFsbG9jYXRpb24gb2YgIGJ5dGVzIGZhaWxlZAoAxCIQABUAAADZIhAADgAAAGxpYnJhcnkvc3RkL3NyYy9hbGxvYy5yc/giEAAYAAAAVQEAAAkAAABsaWJyYXJ5L3N0ZC9zcmMvcGFuaWNraW5nLnJzICMQABwAAAA+AgAADwAAACAjEAAcAAAAPQIAAA8AAAB2AAAADAAAAAQAAAB3AAAAcgAAAAgAAAAEAAAAeAAAAHkAAAAQAAAABAAAAHoAAAB7AAAAcgAAAAgAAAAEAAAAfAAAAH0AAAByAAAAAAAAAAEAAAB+AAAAb3BlcmF0aW9uIHN1Y2Nlc3NmdWwOAAAAEAAAABYAAAAVAAAACwAAABYAAAANAAAACwAAABMAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAARAAAAEgAAABAAAAAQAAAAEwAAABIAAAANAAAADgAAABUAAAAMAAAACwAAABUAAAAVAAAADwAAAA4AAAATAAAAJgAAADgAAAAZAAAAFwAAAAwAAAAJAAAACgAAABAAAAAXAAAAGQAAAA4AAAANAAAAFAAAAAgAAAAbAAAANyAQACcgEAARIBAA/B8QAPEfEADbHxAAzh8QAMMfEACwHxAAjSIQAI0iEACNIhAAjSIQAI0iEACNIhAAjSIQAI0iEACNIhAAjSIQAI0iEACNIhAAjSIQAI0iEACNIhAAjSIQAI0iEACNIhAAjSIQAI0iEACNIhAAjSIQAI0iEACNIhAAfCIQAGoiEABaIhAASiIQADciEAAlIhAAGCIQAAoiEAD1IRAA6SEQAN4hEADJIRAAtCEQAKUhEACXIRAAhCEQAF4hEAAmIRAADSEQAPYgEADqIBAA4SAQANcgEADHIBAAsCAQAJcgEACJIBAAfCAQAGggEABgIBAARSAQAEhhc2ggdGFibGUgY2FwYWNpdHkgb3ZlcmZsb3fIJRAAHAAAAC9jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL2hhc2hicm93bi0wLjEyLjMvc3JjL3Jhdy9tb2QucnMA7CUQAE8AAABaAAAAKAAAAH8AAAAEAAAABAAAAIAAAACBAAAAggAAAGxpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMucnNjYXBhY2l0eSBvdmVyZmxvdwAAAIAmEAARAAAAZCYQABwAAAAGAgAABQAAAGEgZm9ybWF0dGluZyB0cmFpdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvcgB/AAAAAAAAAAEAAAAgAAAAbGlicmFyeS9hbGxvYy9zcmMvZm10LnJz8CYQABgAAABkAgAACQAAAO+/vQBjYWxsZWQgYE9wdGlvbjo6dW53cmFwKClgIG9uIGEgYE5vbmVgIHZhbHVlKS4uAABIJxAAAgAAAEJvcnJvd0Vycm9yQm9ycm93TXV0RXJyb3IAaW5kZXggb3V0IG9mIGJvdW5kczogdGhlIGxlbiBpcyAgYnV0IHRoZSBpbmRleCBpcyBuJxAAIAAAAI4nEAASAAAAiAAAAAAAAAABAAAAiQAAABwnEAAAAAAAYDogABwnEAAAAAAAyScQAAIAAACIAAAADAAAAAQAAACKAAAAiwAAAIwAAAAgICAgIHsKLAosICB7IH0gfSgKKCwAAACIAAAABAAAAAQAAACNAAAAbGlicmFyeS9jb3JlL3NyYy9mbXQvbnVtLnJzABwoEAAbAAAAZQAAABQAAAAweDAwMDEwMjAzMDQwNTA2MDcwODA5MTAxMTEyMTMxNDE1MTYxNzE4MTkyMDIxMjIyMzI0MjUyNjI3MjgyOTMwMzEzMjMzMzQzNTM2MzczODM5NDA0MTQyNDM0NDQ1NDY0NzQ4NDk1MDUxNTI1MzU0NTU1NjU3NTg1OTYwNjE2MjYzNjQ2NTY2Njc2ODY5NzA3MTcyNzM3NDc1NzY3Nzc4Nzk4MDgxODI4Mzg0ODU4Njg3ODg4OTkwOTE5MjkzOTQ5NTk2OTc5ODk5AACIAAAABAAAAAQAAACOAAAAjwAAAJAAAABsaWJyYXJ5L2NvcmUvc3JjL2ZtdC9tb2QucnMALCkQABsAAAB6CQAAHgAAACwpEAAbAAAAgQkAABYAAAAoKWxpYnJhcnkvY29yZS9zcmMvc2xpY2UvbWVtY2hyLnJzAABqKRAAIAAAAGgAAAAnAAAAcmFuZ2Ugc3RhcnQgaW5kZXggIG91dCBvZiByYW5nZSBmb3Igc2xpY2Ugb2YgbGVuZ3RoIJwpEAASAAAArikQACIAAAByYW5nZSBlbmQgaW5kZXgg4CkQABAAAACuKRAAIgAAAHNsaWNlIGluZGV4IHN0YXJ0cyBhdCAgYnV0IGVuZHMgYXQgAAAqEAAWAAAAFioQAA0AAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB9tXAAAszAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMDAwMDAwMDAwMDAwMDAwQEBAQEAEG01sAAC9EVWy4uLl1ieXRlIGluZGV4ICBpcyBvdXQgb2YgYm91bmRzIG9mIGAAADkrEAALAAAARCsQABYAAADIJxAAAQAAAGJlZ2luIDw9IGVuZCAoIDw9ICkgd2hlbiBzbGljaW5nIGAAAHQrEAAOAAAAgisQAAQAAACGKxAAEAAAAMgnEAABAAAAIGlzIG5vdCBhIGNoYXIgYm91bmRhcnk7IGl0IGlzIGluc2lkZSAgKGJ5dGVzICkgb2YgYDkrEAALAAAAuCsQACYAAADeKxAACAAAAOYrEAAGAAAAyCcQAAEAAABsaWJyYXJ5L2NvcmUvc3JjL3N0ci9tb2QucnMAFCwQABsAAAAHAQAAHQAAAGxpYnJhcnkvY29yZS9zcmMvdW5pY29kZS9wcmludGFibGUucnMAAABALBAAJQAAAAoAAAAcAAAAQCwQACUAAAAaAAAAKAAAAAABAwUFBgYCBwYIBwkRChwLGQwaDRAODA8EEAMSEhMJFgEXBBgBGQMaBxsBHAIfFiADKwMtCy4BMAMxAjIBpwKpAqoEqwj6AvsF/QL+A/8JrXh5i42iMFdYi4yQHN0OD0tM+/wuLz9cXV/ihI2OkZKpsbq7xcbJyt7k5f8ABBESKTE0Nzo7PUlKXYSOkqmxtLq7xsrOz+TlAAQNDhESKTE0OjtFRklKXmRlhJGbncnOzw0RKTo7RUlXW1xeX2RljZGptLq7xcnf5OXwDRFFSWRlgISyvL6/1dfw8YOFi6Smvr/Fx8/a20iYvc3Gzs9JTk9XWV5fiY6Psba3v8HGx9cRFhdbXPb3/v+AbXHe3w4fbm8cHV99fq6vf7u8FhceH0ZHTk9YWlxefn+1xdTV3PDx9XJzj3R1liYuL6evt7/Hz9ffmkCXmDCPH9LUzv9OT1pbBwgPECcv7u9ubzc9P0JFkJFTZ3XIydDR2Nnn/v8AIF8igt8EgkQIGwQGEYGsDoCrBR8JgRsDGQgBBC8ENAQHAwEHBgcRClAPEgdVBwMEHAoJAwgDBwMCAwMDDAQFAwsGAQ4VBU4HGwdXBwIGFwxQBEMDLQMBBBEGDww6BB0lXyBtBGolgMgFgrADGgaC/QNZBxYJGAkUDBQMagYKBhoGWQcrBUYKLAQMBAEDMQssBBoGCwOArAYKBi8xTQOApAg8Aw8DPAc4CCsFgv8RGAgvES0DIQ8hD4CMBIKXGQsViJQFLwU7BwIOGAmAviJ0DIDWGgwFgP8FgN8M8p0DNwmBXBSAuAiAywUKGDsDCgY4CEYIDAZ0Cx4DWgRZCYCDGBwKFglMBICKBqukDBcEMaEEgdomBwwFBYCmEIH1BwEgKgZMBICNBIC+AxsDDw0ABgEBAwEEAgUHBwIICAkCCgULAg4EEAERAhIFExEUARUCFwIZDRwFHQgfASQBagRrAq8DsQK8As8C0QLUDNUJ1gLXAtoB4AXhAucE6ALuIPAE+AL6A/sBDCc7Pk5Pj56en3uLk5aisrqGsQYHCTY9Plbz0NEEFBg2N1ZXf6qur7014BKHiY6eBA0OERIpMTQ6RUZJSk5PZGVctrcbHAcICgsUFzY5Oqip2NkJN5CRqAcKOz5maY+SEW9fv+7vWmL0/P9TVJqbLi8nKFWdoKGjpKeorbq8xAYLDBUdOj9FUaanzM2gBxkaIiU+P+fs7//FxgQgIyUmKDM4OkhKTFBTVVZYWlxeYGNlZmtzeH1/iqSqr7DA0K6vbm++k14iewUDBC0DZgMBLy6Agh0DMQ8cBCQJHgUrBUQEDiqAqgYkBCQEKAg0C05DgTcJFgoIGDtFOQNjCAkwFgUhAxsFAUA4BEsFLwQKBwkHQCAnBAwJNgM6BRoHBAwHUEk3Mw0zBy4ICoEmUksrCCoWGiYcFBcJTgQkCUQNGQcKBkgIJwl1C0I+KgY7BQoGUQYBBRADBYCLYh5ICAqApl4iRQsKBg0TOgYKNiwEF4C5PGRTDEgJCkZFG0gIUw1JBwqA9kYKHQNHSTcDDggKBjkHCoE2GQc7AxxWAQ8yDYObZnULgMSKTGMNhDAQFo+qgkehuYI5ByoEXAYmCkYKKAUTgrBbZUsEOQcRQAULAg6X+AiE1ioJoueBMw8BHQYOBAiBjIkEawUNAwkHEJJgRwl0PID2CnMIcBVGehQMFAxXCRmAh4FHA4VCDxWEUB8GBoDVKwU+IQFwLQMaBAKBQB8ROgUBgdAqguaA9ylMBAoEAoMRREw9gMI8BgEEVQUbNAKBDiwEZAxWCoCuOB0NLAQJBwIOBoCag9gEEQMNA3cEXwYMBAEPDAQ4CAoGKAgiToFUDB0DCQc2CA4ECQcJB4DLJQqEBmxpYnJhcnkvY29yZS9zcmMvdW5pY29kZS91bmljb2RlX2RhdGEucnOIAAAABAAAAAQAAACRAAAAVHJ5RnJvbVNsaWNlRXJyb3JTb21lTm9uZQAAAIgAAAAEAAAABAAAAJIAAABFcnJvclV0ZjhFcnJvcnZhbGlkX3VwX3RvZXJyb3JfbGVuAACIAAAABAAAAAQAAACTAAAAAAMAAIMEIACRBWAAXROgABIXIB8MIGAf7yygKyowICxvpuAsAqhgLR77YC4A/iA2nv9gNv0B4TYBCiE3JA3hN6sOYTkvGKE5MBxhSPMeoUxANGFQ8GqhUU9vIVKdvKFSAM9hU2XRoVMA2iFUAODhVa7iYVfs5CFZ0OihWSAA7lnwAX9aAHAABwAtAQEBAgECAQFICzAVEAFlBwIGAgIBBCMBHhtbCzoJCQEYBAEJAQMBBSsDPAgqGAEgNwEBAQQIBAEDBwoCHQE6AQEBAgQIAQkBCgIaAQICOQEEAgQCAgMDAR4CAwELAjkBBAUBAgQBFAIWBgEBOgEBAgEECAEHAwoCHgE7AQEBDAEJASgBAwE3AQEDBQMBBAcCCwIdAToBAgECAQMBBQIHAgsCHAI5AgEBAgQIAQkBCgIdAUgBBAECAwEBCAFRAQIHDAhiAQIJCwdJAhsBAQEBATcOAQUBAgULASQJAWYEAQYBAgICGQIEAxAEDQECAgYBDwEAAwADHQIeAh4CQAIBBwgBAgsJAS0DAQF1AiIBdgMEAgkBBgPbAgIBOgEBBwEBAQECCAYKAgEwHzEEMAcBAQUBKAkMAiAEAgIBAzgBAQIDAQEDOggCApgDAQ0BBwQBBgEDAsZAAAHDIQADjQFgIAAGaQIABAEKIAJQAgABAwEEARkCBQGXAhoSDQEmCBkLLgMwAQIEAgInAUMGAgICAgwBCAEvATMBAQMCAgUCAQEqAggB7gECAQQBAAEAEBAQAAIAAeIBlQUAAwECBQQoAwQBpQIABAACUANGCzEEewE2DykBAgIKAzEEAgIHAT0DJAUBCD4BDAI0CQoEAgFfAwIBAQIGAQIBnQEDCBUCOQIBAQEBFgEOBwMFwwgCAwEBFwFRAQIGAQECAQECAQLrAQIEBgIBAhsCVQgCAQECagEBAQIGAQFlAwIEAQUACQEC9QEKAgEBBAGQBAICBAEgCigGAgQIAQkGAgMuDQECAAcBBgEBUhYCBwECAQJ6BgMBAQIBBwEBSAIDAQEBAAILAjQFBQEBAQABBg8ABTsHAAE/BFEBAAIALgIXAAEBAwQFCAgCBx4ElAMANwQyCAEOARYFAQ8ABwERAgcBAgEFZAGgBwABPQQABAAHbQcAYIDwAAAEMhAAKAAAAD8BAAAJAEGQ7MAACwJpegBHCXByb2R1Y2VycwEMcHJvY2Vzc2VkLWJ5AgZ3YWxydXMGMC4xOS4wDHdhc20tYmluZGdlbhIwLjIuODQgKGNlYThjYzNkMik="; - -function asciiToBinary(str) { - if (typeof atob === 'function') { - return atob(str) - } else { - return new Buffer(str, 'base64').toString('binary'); - } -} - -function decode() { - var binaryString = asciiToBinary(encoded); - var bytes = new Uint8Array(binaryString.length); - for (var i = 0; i < binaryString.length; i++) { - bytes[i] = binaryString.charCodeAt(i); - } - return (async function() {return new Response(bytes.buffer);})(); -} - -export function init_embedded() { - return init(decode()) -} diff --git a/src/usdpl/usdpl_front_bg.wasm b/src/usdpl/usdpl_front_bg.wasm deleted file mode 100644 index 625d642..0000000 Binary files a/src/usdpl/usdpl_front_bg.wasm and /dev/null differ diff --git a/src/usdpl/usdpl_front_bg.wasm.d.ts b/src/usdpl/usdpl_front_bg.wasm.d.ts deleted file mode 100644 index 959d805..0000000 --- a/src/usdpl/usdpl_front_bg.wasm.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -export const memory: WebAssembly.Memory; -export function init_usdpl(a: number): void; -export function target_usdpl(a: number): void; -export function version_usdpl(a: number): void; -export function set_value(a: number, b: number, c: number): number; -export function get_value(a: number, b: number): number; -export function call_backend(a: number, b: number, c: number, d: number): number; -export function init_tr(a: number, b: number): number; -export function tr(a: number, b: number, c: number): void; -export function tr_n(a: number, b: number, c: number, d: number): void; -export function __wbindgen_export_0(a: number): number; -export function __wbindgen_export_1(a: number, b: number, c: number): number; -export const __wbindgen_export_2: WebAssembly.Table; -export function __wbindgen_export_3(a: number, b: number, c: number): void; -export function __wbindgen_add_to_stack_pointer(a: number): number; -export function __wbindgen_export_4(a: number, b: number): void; -export function __wbindgen_export_5(a: number): void; -export function __wbindgen_export_6(a: number, b: number, c: number, d: number): void;