From 3e018f528a4b9fda7273defb66052bc3eafc0f2d Mon Sep 17 00:00:00 2001 From: flemming-it Date: Fri, 10 Jul 2026 12:44:32 +0200 Subject: [PATCH] text.anonymize.legal-de 0.1.0: WASM bridge to the judge-ner host service NER anonymization of German legal texts (plain text + DOCX) via the JuraNER model by Harshil Darji (MIT). The transformer model runs in the judge-ner host service; this module forwards documents over loopback HTTP and maps responses onto the capability contract. --- .forgejo/workflows/ci.yml | 66 ++++ .gitignore | 3 + Cargo.lock | 645 ++++++++++++++++++++++++++++++++++++++ Cargo.toml | 53 ++++ LICENSE | 73 +++++ MODULE.de.md | 103 ++++++ MODULE.md | 102 ++++++ NOTICE | 21 ++ STORE.yaml | 27 ++ assets/icon.svg | 8 + module.wasm | Bin 0 -> 363295 bytes module.yaml | 112 +++++++ rust-toolchain.toml | 5 + src/anonymize.rs | 439 ++++++++++++++++++++++++++ src/lib.rs | 124 ++++++++ 15 files changed, 1781 insertions(+) create mode 100644 .forgejo/workflows/ci.yml create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 LICENSE create mode 100644 MODULE.de.md create mode 100644 MODULE.md create mode 100644 NOTICE create mode 100644 STORE.yaml create mode 100644 assets/icon.svg create mode 100644 module.wasm create mode 100644 module.yaml create mode 100644 rust-toolchain.toml create mode 100644 src/anonymize.rs create mode 100644 src/lib.rs diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml new file mode 100644 index 0000000..d3c2ab5 --- /dev/null +++ b/.forgejo/workflows/ci.yml @@ -0,0 +1,66 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +env: + CARGO_TERM_COLOR: always + RUSTFLAGS: "-D warnings" + RUST_TOOLCHAIN: "1.86" + CARGO_NET_GIT_FETCH_WITH_CLI: "true" + +jobs: + ci: + name: Linux x86_64 (Forgejo) + runs-on: ubuntu-latest + steps: + - name: Checkout text-anonymize-legal-de via external URL + run: | + set -eu + mkdir -p "$GITHUB_WORKSPACE" + cd "$GITHUB_WORKSPACE" + git init -q + git remote add origin \ + "https://x-access-token:${GITHUB_TOKEN}@git.flemming.ai/${GITHUB_REPOSITORY}.git" + git fetch --depth=1 origin "$GITHUB_SHA" + git checkout -q FETCH_HEAD + + - name: Configure git URL rewrite for SDK fetch + env: + SDK_PAT: ${{ secrets.MODULE_SDK_PAT }} + run: | + git config --global \ + "url.https://x-access-token:${SDK_PAT}@git.flemming.ai/.insteadOf" \ + "https://git.flemming.ai/" + + - name: Install system dependencies + run: | + apt-get update -qq + apt-get install -y --no-install-recommends \ + curl ca-certificates build-essential pkg-config libssl-dev git + + - name: Install Rust toolchain + run: | + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \ + | sh -s -- -y --profile minimal \ + --default-toolchain "$RUST_TOOLCHAIN" \ + --target wasm32-wasip2 --component rustfmt --component clippy + echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" + + - name: Cargo fmt --check + run: cargo fmt --all -- --check + + - name: Cargo clippy + run: cargo clippy --all-targets -- -D warnings + + - name: Cargo build (host) + run: cargo build --all-targets + + - name: Cargo test (host) + run: cargo test --all-targets + + - name: Cargo build (wasm32-wasip2) + run: cargo build --release --target wasm32-wasip2 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dd0b2ac --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +target/ +Cargo.lock.bak +.DS_Store diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..a9d755f --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,645 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "anyhow" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" + +[[package]] +name = "bytes" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chain-module-sdk" +version = "0.1.2" +source = "git+https://git.flemming.ai/fai/chain-module-sdk-rust.git?branch=main#98e98e9371f7409560a1ef08bc0923d9a2506449" +dependencies = [ + "chain-module-sdk-macros", + "serde", + "serde_json", + "thiserror", + "wit-bindgen 0.36.0", +] + +[[package]] +name = "chain-module-sdk-macros" +version = "0.1.2" +source = "git+https://git.flemming.ai/fai/chain-module-sdk-rust.git?branch=main#98e98e9371f7409560a1ef08bc0923d9a2506449" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "http" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "leb128" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c83bff1d572d6b9aeef67ddfc8448e4a3737909cb28e81f97c791b9018703e52" + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "memchr" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "spdx" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e17e880bafaeb362a7b751ec46bdc5b61445a188f80e0606e68167cd540fa3" +dependencies = [ + "smallvec", +] + +[[package]] +name = "syn" +version = "2.0.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "text_anonymize_legal_de" +version = "0.1.0" +dependencies = [ + "base64", + "chain-module-sdk", + "serde", + "serde_json", + "thiserror", + "waki", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "waki" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2db2daf1dfbadf228fd8b3c22b96a359135fd673b3d2c203274ee6a0df9c77" +dependencies = [ + "anyhow", + "form_urlencoded", + "http", + "serde", + "waki-macros", + "wit-bindgen 0.34.0", +] + +[[package]] +name = "waki-macros" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a061143f321cc5eeb523f60bdbcd45cfc3ee8851f8cf24f7a4b963bddc5642eb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "wasm-encoder" +version = "0.219.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8aa79bcd666a043b58f5fa62b221b0b914dd901e6f620e8ab7371057a797f3e1" +dependencies = [ + "leb128", + "wasmparser 0.219.2", +] + +[[package]] +name = "wasm-encoder" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e913f9242315ca39eff82aee0e19ee7a372155717ff0eb082c741e435ce25ed1" +dependencies = [ + "leb128", + "wasmparser 0.220.1", +] + +[[package]] +name = "wasm-metadata" +version = "0.219.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1ef51bd442042a2a7b562dddb6016ead52c4abab254c376dcffc83add2c9c34" +dependencies = [ + "anyhow", + "indexmap", + "serde", + "serde_derive", + "serde_json", + "spdx", + "wasm-encoder 0.219.2", + "wasmparser 0.219.2", +] + +[[package]] +name = "wasm-metadata" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185dfcd27fa5db2e6a23906b54c28199935f71d9a27a1a27b3a88d6fee2afae7" +dependencies = [ + "anyhow", + "indexmap", + "serde", + "serde_derive", + "serde_json", + "spdx", + "wasm-encoder 0.220.1", + "wasmparser 0.220.1", +] + +[[package]] +name = "wasmparser" +version = "0.219.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5220ee4c6ffcc0cb9d7c47398052203bc902c8ef3985b0c8134118440c0b2921" +dependencies = [ + "ahash", + "bitflags", + "hashbrown 0.14.5", + "indexmap", + "semver", +] + +[[package]] +name = "wasmparser" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d07b6a3b550fefa1a914b6d54fc175dd11c3392da11eee604e6ffc759805d25" +dependencies = [ + "ahash", + "bitflags", + "hashbrown 0.14.5", + "indexmap", + "semver", +] + +[[package]] +name = "wit-bindgen" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e11ad55616555605a60a8b2d1d89e006c2076f46c465c892cc2c153b20d4b30" +dependencies = [ + "wit-bindgen-rt 0.34.0", + "wit-bindgen-rust-macro 0.34.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a2b3e15cd6068f233926e7d8c7c588b2ec4fb7cc7bf3824115e7c7e2a8485a3" +dependencies = [ + "wit-bindgen-rt 0.36.0", + "wit-bindgen-rust-macro 0.36.0", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "163cee59d3d5ceec0b256735f3ab0dccac434afb0ec38c406276de9c5a11e906" +dependencies = [ + "anyhow", + "heck", + "wit-parser 0.219.2", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b632a5a0fa2409489bd49c9e6d99fcc61bb3d4ce9d1907d44662e75a28c71172" +dependencies = [ + "anyhow", + "heck", + "wit-parser 0.220.1", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744845cde309b8fa32408d6fb67456449278c66ea4dcd96de29797b302721f02" +dependencies = [ + "bitflags", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7947d0131c7c9da3f01dfde0ab8bd4c4cf3c5bd49b6dba0ae640f1fa752572ea" +dependencies = [ + "bitflags", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6919521fc7807f927a739181db93100ca7ed03c29509b84d5f96b27b2e49a9a" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata 0.219.2", + "wit-bindgen-core 0.34.0", + "wit-component 0.219.2", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4329de4186ee30e2ef30a0533f9b3c123c019a237a7c82d692807bf1b3ee2697" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata 0.220.1", + "wit-bindgen-core 0.36.0", + "wit-component 0.220.1", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c967731fc5d50244d7241ecfc9302a8929db508eea3c601fbc5371b196ba38a5" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core 0.34.0", + "wit-bindgen-rust 0.34.0", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "177fb7ee1484d113b4792cc480b1ba57664bbc951b42a4beebe573502135b1fc" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core 0.36.0", + "wit-bindgen-rust 0.36.0", +] + +[[package]] +name = "wit-component" +version = "0.219.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b8479a29d81c063264c3ab89d496787ef78f8345317a2dcf6dece0f129e5fcd" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.219.2", + "wasm-metadata 0.219.2", + "wasmparser 0.219.2", + "wit-parser 0.219.2", +] + +[[package]] +name = "wit-component" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b505603761ed400c90ed30261f44a768317348e49f1864e82ecdc3b2744e5627" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.220.1", + "wasm-metadata 0.220.1", + "wasmparser 0.220.1", + "wit-parser 0.220.1", +] + +[[package]] +name = "wit-parser" +version = "0.219.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca004bb251010fe956f4a5b9d4bf86b4e415064160dd6669569939e8cbf2504f" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.219.2", +] + +[[package]] +name = "wit-parser" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae2a7999ed18efe59be8de2db9cb2b7f84d88b27818c79353dfc53131840fe1a" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.220.1", +] + +[[package]] +name = "zerocopy" +version = "0.8.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75726053136156d419e285b9b7eddaaea9e3fea6ce32eed44a89901f0bd98de1" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4714fd92cf900833d49538023a9b3915155210801d1c1169eba513b2addefd71" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..456c17a --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,53 @@ +# Standalone Cargo.toml — targets wasm32-wasip2. +# +# Build: +# cargo build --release --target wasm32-wasip2 +# +# Local link-install into the running hub: +# fai install --link $(pwd) + +[package] +name = "text_anonymize_legal_de" +version = "0.1.0" +edition = "2024" +license = "UNLICENSED" +publish = false +description = "F∆I module providing text.anonymize.legal-de — bridge to the judge-ner host service (JuraNER anonymization of German legal texts)" + +[lib] +# cdylib for the wasm artifact, rlib so unit tests can link the +# request/response mapping on the host. +crate-type = ["cdylib", "rlib"] + +[dependencies] +chain-module-sdk = { git = "https://git.flemming.ai/fai/chain-module-sdk-rust.git", branch = "main" } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +base64 = "0.22" +thiserror = "2" + +# WASI-0.2 HTTP client. Only compiled into the wasm32-wasip2 build. +[target.'cfg(target_arch = "wasm32")'.dependencies] +waki = "0.5" + +[dev-dependencies] +serde_json = "1" + +[profile.release] +opt-level = "s" +lto = true +codegen-units = 1 +strip = "symbols" + +[lints.rust] +unsafe_op_in_unsafe_fn = "warn" + +[lints.clippy] +unwrap_used = "deny" +expect_used = "deny" +panic = "deny" +print_stdout = "deny" +print_stderr = "deny" + +[workspace] +# Empty so this package is NOT picked up by a parent. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..cdde5b2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,73 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright 2026 Flemming.AI + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/MODULE.de.md b/MODULE.de.md new file mode 100644 index 0000000..7f0f4a9 --- /dev/null +++ b/MODULE.de.md @@ -0,0 +1,103 @@ +# text.anonymize.legal-de + +NER-basierte Anonymisierung deutscher juristischer Texte (JuraNER). +Brückenmodul: das Transformers-Modell läuft im **judge-ner +Host-Service** (`fai_judge/host_services/judge-ner/`); dieses +WASM-Modul reicht das Dokument per Loopback-HTTP weiter und bildet +die Antwort auf den Capability-Contract ab. + +## Capability + +- `text.anonymize.legal-de@0.1.0` + +## Eingaben + +| Name | Typ | Beschreibung | +| ---------- | ----- | ------------ | +| `request` | json | `{"mode":"text"\|"docx","options":{...}}` — siehe unten. | +| `document` | bytes | UTF-8-Klartext (mode=text) oder eine DOCX-Datei (mode=docx). | +| `endpoint` | text | Optionale judge-ner-Basis-URL. Default `http://127.0.0.1:8756`. | + +### `request.options` (alle optional) + +| Schlüssel | Default | Bedeutung | +| --------- | ------- | --------- | +| `importance_levels` | `["High"]` | Zu anonymisierende Entitätsklassen (`High`/`Mid`/`Low`). | +| `confidence_threshold` | `0.8` | Minimale NER-Konfidenz (0.0–1.0). | +| `manual_phrases` | `[]` | Zusätzlich zu schwärzende Phrasen (Label `RED`). | +| `maintain_consistency` | `true` | Gleiche Oberflächenform erhält überall dasselbe ⟦TYPE#⟧-Token. | +| `remove_rubrum` | `false` | Rubrum-Block erkennen und durch Platzhalter ersetzen. | + +## Ausgaben + +| Name | Typ | Beschreibung | +| ---------- | ----- | ------------ | +| `result` | json | `{"replacements": [...], "text": "..."}` — `text` (der anonymisierte Text) nur bei mode=text. `statistics` und `rubrum` werden vom Service durchgereicht, wenn vorhanden. | +| `document` | bytes | Das anonymisierte Dokument: UTF-8-Text (`text/plain`) bei mode=text, das umgeschriebene DOCX bei mode=docx. | + +Jeder `replacements`-Eintrag: +`{text, label, label_description, start, end, score, line_number, +anonymized}`; im DOCX-Modus zusätzlich `run_id_start`, +`char_in_start`, `run_id_end`, `char_in_end` zur Adressierung der +exakten `w:t`-Knoten des Originaldokuments. Einträge mit +`"anonymized": null` wurden erkannt, aber nicht ersetzt +(Importance-Level nicht ausgewählt). + +## Berechtigungen & benötigte Services + +```yaml +permissions: + - "net: localhost" + - "net: 127.0.0.1" +requires_services: + - judge-ner +``` + +Der Hub führt Steps mit diesem Modul nur aus, wenn der Operator einen +`judge-ner`-Service-Endpunkt in `~/.chain/config.yaml` (`services:`) +deklariert hat. Beachte: Der erste judge-ner-Start lädt das +JuraNER-Modell von HuggingFace — bis dahin antwortet der Service mit +503 und dieses Modul schlägt mit einer klaren „NER model not +available"-Meldung fehl. + +## Einrichtung des judge-ner-Host-Services + +Das NER-Modell (JuraNER von Harshil Darji, MIT — transformers + torch) +kann nicht in der WASM-Sandbox laufen; es läuft als Host-Service. + +```bash +# 1. Service starten (Docker; ~1 GB Modell-Download beim ersten Start, +# persistiert im Named Volume — spätere Starts sind offline-fähig) +docker run -d --name judge-ner \ + -p 8756:8756 \ + -v judge-ner-models:/models \ + judge-ner + +# 2. Beim Hub registrieren (~/.chain/config.yaml) +# services: +# judge-ner: +# endpoint: http://127.0.0.1:8756 +# health_check: +# url: http://127.0.0.1:8756/health + +# 3. Prüfen +curl -s localhost:8756/health # {"status":"ok","model_loaded":true} +chain service status judge-ner +``` + +Quellcode und Image-Build: `fai_judge/host_services/judge-ner/` +(`docker build -t judge-ner .`). + +## Fehler + +- Fehlerhafte `request`, Nicht-UTF-8-Textdokument oder 4xx vom + Service → `invalid input: ...` +- Service nicht erreichbar, 5xx, fehlerhafte Service-Antwort → + `internal error: judge-ner at ...` + +## Build + +```bash +cargo test +cargo build --release --target wasm32-wasip2 +``` diff --git a/MODULE.md b/MODULE.md new file mode 100644 index 0000000..0bd3367 --- /dev/null +++ b/MODULE.md @@ -0,0 +1,102 @@ +# text.anonymize.legal-de + +NER-based anonymization of German legal texts (JuraNER). Bridge +module: the transformers model runs in the **judge-ner host service** +(`fai_judge/host_services/judge-ner/`); this WASM module forwards the +document over loopback HTTP and maps the response onto the capability +contract. + +## Capability + +- `text.anonymize.legal-de@0.1.0` + +## Inputs + +| Name | Type | Description | +| ---------- | ----- | ----------- | +| `request` | json | `{"mode":"text"\|"docx","options":{...}}` — see below. | +| `document` | bytes | UTF-8 plain text (mode=text) or a DOCX file (mode=docx). | +| `endpoint` | text | Optional judge-ner base URL. Default `http://127.0.0.1:8756`. | + +### `request.options` (all optional) + +| Key | Default | Meaning | +| --- | ------- | ------- | +| `importance_levels` | `["High"]` | Entity classes to anonymize (`High`/`Mid`/`Low`). | +| `confidence_threshold` | `0.8` | Minimum NER confidence (0.0–1.0). | +| `manual_phrases` | `[]` | Additional phrases to redact (label `RED`). | +| `maintain_consistency` | `true` | Same surface form gets the same ⟦TYPE#⟧ token everywhere. | +| `remove_rubrum` | `false` | Detect the rubrum block and replace it with a placeholder. | + +## Outputs + +| Name | Type | Description | +| ---------- | ----- | ----------- | +| `result` | json | `{"replacements": [...], "text": "..."}` — `text` (the anonymized text) only for mode=text. `statistics` and `rubrum` are passed through from the service when present. | +| `document` | bytes | The anonymized document: UTF-8 text (`text/plain`) for mode=text, the rewritten DOCX for mode=docx. | + +Each `replacements` entry: +`{text, label, label_description, start, end, score, line_number, +anonymized}`; DOCX mode additionally carries `run_id_start`, +`char_in_start`, `run_id_end`, `char_in_end` addressing the exact +`w:t` nodes of the original document. Entries with +`"anonymized": null` were detected but not replaced (importance level +not selected). + +## Permissions & required services + +```yaml +permissions: + - "net: localhost" + - "net: 127.0.0.1" +requires_services: + - judge-ner +``` + +The hub refuses to dispatch a step to this module unless the operator +declared a `judge-ner` service endpoint in `~/.chain/config.yaml` +(`services:`). Note the first judge-ner start downloads the JuraNER +model from HuggingFace — until then the service answers 503 and this +module fails with a clear "NER model not available" error. + +## Setting up the judge-ner host service + +The NER model (JuraNER by Harshil Darji, MIT — transformers + torch) +cannot run inside the WASM sandbox; it runs as a host service. + +```bash +# 1. Start the service (Docker; ~1 GB model download on first start, +# persisted in the named volume — later starts are offline-capable) +docker run -d --name judge-ner \ + -p 8756:8756 \ + -v judge-ner-models:/models \ + judge-ner + +# 2. Register it with the hub (~/.chain/config.yaml) +# services: +# judge-ner: +# endpoint: http://127.0.0.1:8756 +# health_check: +# url: http://127.0.0.1:8756/health + +# 3. Verify +curl -s localhost:8756/health # {"status":"ok","model_loaded":true} +chain service status judge-ner +``` + +Source and image build: `fai_judge/host_services/judge-ner/` +(`docker build -t judge-ner .`). + +## Errors + +- Malformed `request`, non-UTF-8 text document, or a 4xx from the + service → `invalid input: ...` +- Service unreachable, 5xx, malformed service response → + `internal error: judge-ner at ...` + +## Build + +```bash +cargo test +cargo build --release --target wasm32-wasip2 +``` diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..61fcdb0 --- /dev/null +++ b/NOTICE @@ -0,0 +1,21 @@ +text-anonymize-legal-de +Copyright 2026 Flemming.AI + +This product includes software developed by Dr. Stefan Flemming +and contributors (https://flemming.ai/). + +------------------------------------------------------------------ +Third-party acknowledgments + +This module is a bridge to the judge-ner host service, which builds +on the JuraNER named-entity-recognition model and anonymization +pipeline by Harshil Darji (MIT License): + + - Model: https://huggingface.co/harshildarji/JuraNER + - Related work: https://github.com/harshildarji/German-NER-BERT + +The WASM module itself contains none of that code; it forwards +documents to the host service over loopback HTTP. + +JSON (de)serialization uses `serde` + `serde_json` +(MIT OR Apache-2.0). diff --git a/STORE.yaml b/STORE.yaml new file mode 100644 index 0000000..d4487a7 --- /dev/null +++ b/STORE.yaml @@ -0,0 +1,27 @@ +schema_version: 1 + +author: + name: "Flemming.AI" + email: chain@flemming.ai + url: https://flemming.ai +license: Apache-2.0 + +tagline: + en: "NER anonymization for German legal texts (JuraNER)" + de: "NER-Anonymisierung für deutsche Rechtstexte (JuraNER)" + +description: + en: "Transformer-based anonymization of German legal documents (plain text and DOCX) using the JuraNER model by Harshil Darji (MIT, HTW Berlin research). Detects persons, addresses, courts, file numbers and more; replaces them with consistent ⟦TYPE#⟧ tokens. Requires the judge-ner host service (Docker) — the NER model runs outside the WASM sandbox." + de: "Transformer-basierte Anonymisierung deutscher Rechtsdokumente (Klartext und DOCX) mit dem JuraNER-Modell von Harshil Darji (MIT, HTW-Berlin-Forschung). Erkennt Personen, Adressen, Gerichte, Aktenzeichen u. v. m. und ersetzt sie durch konsistente ⟦TYP#⟧-Token. Benötigt den judge-ner-Host-Service (Docker) — das NER-Modell läuft außerhalb der WASM-Sandbox." + +category: text-processing +tags: [legal, german, anonymization, ner, gdpr, requires-host-service] + +assets: + icon: assets/icon.svg + +documentation: + long_description: MODULE.md + +links: + repository: https://git.flemming.ai/chain-modules/text-anonymize-legal-de diff --git a/assets/icon.svg b/assets/icon.svg new file mode 100644 index 0000000..c10d99a --- /dev/null +++ b/assets/icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/module.wasm b/module.wasm new file mode 100644 index 0000000000000000000000000000000000000000..58c4f62f02ba2037acec99d79234bb08c30eae26 GIT binary patch literal 363295 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%0Doh@}O8 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

u^Q`h` z4C;ieX~tkveqs!D^jJGW;Dqi3NB+b;+#T=FC**d=@-YNrzdOKoyxC8ENX zPv;k3(7Sqc`umD;FX3{#%m`j;XFD&5wpy3QoK~)!T|GIG615nrqgQ`7hzWrXCMMbR zPo47AT4V2o=Rf-!CI1xrWn(j>Lq|eT=mwRwum!BsM=wm8;AvywDGFM|ajrcASERGX z6sO#;ifCyu`U}xf@+VzHg+^xdKBY!;m9RMatCVnm{Trvzy&K0`5+nX_pXP1`2}{p3 zhCb+uF{W{BoCO7{F-?-C#m+nm5ruq89{%pHeE0x0)o1fDyV-GiQ((5fFIF79G})9j zWh>rKP@yCqvN!3L!7$C@BloxQ%+qcKA> zCX$Ji1E(E$X|B}!0sC?;w3Z1KBO;M65y?JNii8(+L!<_)F4CweX6tQZz7R2jcgXqN z;ZD&Eb88xyiA9BBPSFW`)xi`beIglXbk^2qEYtY|S{7^zet2}7UTDzmc7f1^tMY{X z^n&>VtkR*KRy}yX!x5&J4%54`bm38Q7Lr$ZBfkezvZG-h1g+DfeZ*p@{8V>i;)q( zsYjvQG2}n3B(meJzL2Piy!>{WyMqkhQMut)v&@{O7=(SI*9cBg2&lEa_bX+)Gf`o@ z7D;5$3)s_|AQOo;ib#csG$Wj=l`$*QiI0g!1hh;I!djvcF)h)E{&i}>VnI9;8s5^V zX%(RvA0JEfM(%E2y?0YGRE#*{u%7-7wkgVKKNoG$M~^F{CP*t)&f&?hqhF8rj=m%f z07zDy3L4tG|zFO=(8IxBBrG6%ZWZPxVUPjo!fjcm{whM z#Wd48czO`izA2a%u6kfh`ydDwUdLJ-*B7j}{(yp|X#r7J^HS>2RlHhHe`)b&xsojB z@80r(RUhY*9lGV-=(otMkK>)D*cn~@+gZ5sW@!w`zI7HNKAsSd!AbJ+jsiy3K8!Ja z`kehVWa5~uW)zZ^17sS+=5sQ5Sn<-zYlFRzOWI^tc}=NV545Dbc~r~8ifb$ME(`UL zbdGfN7n%~aw;x!bAxqB;qhMI)e%apo`U-^<1u}&kKPfT=royLVVnZENsh_|o_W3a0 zskc5|+Dy>m)A!adWUkt=a&p^wLS}LtwZ7ph_2B4N!+Ffk(p2LAg&8PUZ2l1HSmX;m zq}8ni;vFk^u^V6vNw2SHc&vSkF-+Q|Y&BjNyzEI)qRJ)FHR^raaJ6VvSI5~Yf(Z*1 zyBUhb!AYor*ugy7uTHXgPyK@}#`%i4KS;=aNpUg2<5n^-oMA>9^ zv_dWVaOA}&((j~?ZgmvhNHggAU>ftyE`{Bz6By`^^(+HkNkCds3jr^$;{UbUo3pP?u36V>Yj5 zPhVM`i17UOI{6km`5&58>U+gbjcds|oOS3xP!J*?f)1=)fbgjaU%%Q-_Ub<-~@tng0hyjN>m-*is;Ub40V`1~?X&Ha{q$01w2T~JYwa;j<``wQ0eEC3o7G9X{S*}DlqMq&cz>P&!bPrC#6G(O# zt5fcI+%HY~&mH%lg&6#jI6oihwCBqIEc2uu9@Iy3*wGl{vbR1%z9+PkQLR~%FnXRo zvN2sQ#s<1kfvOR0`jQ0p}X?x zdv_kdcr`1p)&wLXbn*W3|5wYgo-dh-NgzaRz2#W9hUxghmt(mK;$CvW+qhJh4J_oE z?d-*5B(o+-FX8XKS{Uk$hb!=f+$XcYhX|I9?EYe-|Dh9aWSV)f(^_%tB~fV|5KDXz z68J4sR$fRW>GsO7Eannig&rJ&~}W})7Zu~@}QED)AdT$T11;@ zN>!9ydc3|8gFDPyXlNrRlj25t(bgJQ$_I=MT7T}-)6MLsW;%+iNnwOxD@~)BjHEOT z+#CJA8%cm`bJ93~BcC6)P9vKETr_fRxsKqhEmw;mD3cw=hiM{CI+R|oiL_hMqQ+(Y ziX6xF8OCE058lEmTlg0#IA-K!B*3ub59m{@tgM(yrV5t2(Uj1BAg`K)p>P2C8ln-X z>W;7Cj0m}a%&jZJ73ER%v<26vsz358+SOtLnL1yt!AzPxbMNr>qLkri?OD^Uvbgvb zqt^)Ya;02x%(C@|L^f(6S2cRATj!fa+;DY?vX3M$9K%&%aZs*4$hT6n<6Z$8$F&-M zspS{V`L{+mWf^t92XDpVRfNS!%Xz_}aYU|})}&p5rysN&jt9F);QPVoW+5G0v#!yY zpI*~sgn5G9Q;#9y!1yW-?|30&xB5CQ^=vzY;9Ww-hy1DQo8JgQ*&s`84w9(%DS&s- z6@dQb(kPQI&(;SGp zG5(1V%rpl@dJMnpY@+G3pv~C$!HAuX=Qq(`D@%|=(ojlNOSl59D78X4Ou5k&v6xq# z>1dF?P4S>uMa0k7slg0blb3LJcnK+x0;v!hH5zVFqdketq_nslIf8M8^#+C{)g`66WH) z4(JGTZHm!b z)dCfq=2Ns`i(mJTWQ&hPP`G%UVB)x4ohFGd72L;%SHvBgd8Uw5)Ex=wO=k6nwy+9< z{#;%h-6E`*hNL;yYv&X9h@fY9o<&V#4D(}X-xwY3-?L-(%?+8WXVaRP!5MDy0{{hr5u2q}EYq#=&Y0!uCSFQ@Ut?c8v3eEp+HA?{?J> zMt*K@zaDBY9_Cf_AGj?2Xxr1Z1a42~n5TqywhzWz?eF4UHh5D@1;NjZ-;(T-3?z2N~93KT{3%LxG$9qy!Z^mboFN zH#|twd}v)w^Pxu5{3M(-c6cva668sdRF^Ef6LEgU6DSLu%5CVbIP%FB55+j{-@>g$ zdseX;F8$UX%bhkk z4AN)nY<_PK7D@Yw5))PR7lX}qQNpcLOmv#M1M+I~UhsuzZPItfC}Nc#YlX2)!pJkR z6%-l$j`gzz^GpgwgTmF}Z&ka7pPy|_l%`~pUn&~6|DvNkorIQ=hB79TS?%Q0IEzV9 z9I3vpvc&St*1x!SLs|B*Rs(ave9lgT4MSpNP%0=6CcK z_Z=2)1vEdzM45+Sk55C{kUTm;+jDUI6ZL$rKx+o%G!*rnSOT^97jiE6%M~7~?{Z~K-a| zNH9od zBkO$D3e38L=``70tFyVu90p@NE6Y338UW}vXY+IeFw@+ZrTN29ew+Z%)7XPy1_{b1 znPfWHK9~>k2LYHPPGno|0@f}6+--X*^fj6Y!*S_)0 zHta?3d^ojtfj}KYC`-!e0uIq|t(SRHPP<2Zw-p@25P0Xo9C&NOOn6g=@TTsJH$J#f zB-|ntL9l5BF(6tot5!HTg+hu}$lg*!p;oBCMP?Uig`6Ua(SMy*@XM_z)e8R5iZZpL zoNfgUPtyuwv(5GNOmB5m2OGmf$J_sphMMv52kBsMRmE`S*ovDq8PF8_o{C&WgWYcJ zO7+LEOkQnNxOfH22C>>m{##ycM04ZnIq^}fIFkQCRE$1XpdF6@y(DMBIs$J!Ob#BK zN9TEDs=(t^IP0pzN2AqH#ygU2*0n=-COH5CFmuuyl9p!4&(Bh?&1p{ zfGrW$>H)eFB`XP+9Y$yV+gzk@7I-rH(p{|9ymM)dY%I}E?#UwWSk2u=*M=V|bW86u zn@K9BSd;RXTDEGY>G|vy6fV|aTs*Ww{T+6$U%S+>?#M$d5UI;_Y~iC6QQ>@3Vms(j z)dD=*_&<9HAGD_omWxWwurPp2uCo2U6(G^x}&Ot)(yr2IS|Yj3 zr_l6hgJ)QL{~)gaqbfTPJ*sAySb2>wJ^?lQ!tf^j|0D0+qc5wfd(Zti?{j{?I`x8r zDrKKT{ZWj7R7R7)MU&M2UF0EVgqv&Z-1NPP-JQ|HQAOWDm4v2~g8D)IAZ0{FMMXnQ zMKM4^rAZ`)7>uQ&!AKI?OAI&RMpRV1l7vK55+Bu{@0@Gxz0dDaJfgW{bSSFMIeV?W z)?9PV_nK=h1JR#r5i&)de@x^&k*0_|%)<4Nv=$NC1(0typ~ou_6{^63rM$A!;$m9& zsDepU7*)Fv?!NY;i^@JH7Usvo=BFN{C4xPtQ|BH2bvx|=Az1VyzY1Q^5yxgWD+2DR z>{4apuT;?DbO)f4;hSeIfYb|^a5ENJWG1W*{y6JI<{sbR*lZUT0Jz$HMv`#C6AJo7 z(p*Yxw9Cu4EG}wuZmL<9xeO!7nL*|sa~IgL8s5yT}ymVCd`tr)C$ZCJu#S5QZR$l@padMKf(gKe47d8 z(T~n)=L1$(M>DPS`|z)a*{*W&+9i3#`*kfgA*Nrt>GlVc*X${J`^v>@u3fs4^Ah!e z!aH6&vd7DOuMQ{SaBsp4R3_=5>|HpQdk?bu0q9Ee9oOteCxdmUgjH>Dbp;o8W4D5< zy8oYhoItH}5ibm3`LgN)iMX4|g90KMbPyDyt zP#Yvjn8c1^p{n8ce8p9nA({K~d$@ejLMuFQ3W{2(t+XuVg;fK1Xl4Mf5K%SPE|qHM zdB7OlGbyqrmLxK;n<0Lr2?2PNpIN_>PGC~q=A4;r=gvtkKuVEsTrP;#C#+FfYE6&~ z%p|g*8)ZYcAsgh)%*qDY^oRj$0^<_nxxg&LKX2FRiw%j|By|67{E4d}c?E`z10=D? z=LWyTja~}wU^-P!0lizL>@l=UymZVOAhvtJW@*i&Z0dxu$IR+nT*OyuB%?PFIs+z9?&!8 zH~9o5Z8nI>fhz|W&5?8im>$y?ph14Nl`>D%Zq+skh^+?YCsu`$sZ+BN%Ej!(=_+74 zF|HW+1Kwn7cHqeVW|Kq%R%sD$aR$heBaMV9P_NkNLjLcVH&?p%>ACGjc6V9(l0_-L zC|gYj8&Y{HWf8Vz;JfXRg69Z;k}Vku`|+Iv6*x0fzT;WI*N#G?zA^8V9IU zB!Y>6sXB)P03zSo^#3V`Sgq8Ww>>|LhKSz6J<-^?tr%lM_v-mP&hz&G~-Viq_%s|LiWoG z91+{yplJ>NBG22aC&-HR0Mq1z#RJFFwrN=7m#JdKUOXa*<=jce5&FemgDF*+ya(}Z zgZ^a~7T|gz89yXYeT&ANk5+s2V5&0kGw?Uk(UiQl+=>j`w}>0sTGc74*^g`Qz-s>TBT!#zCb? z^jWmLw=lR`%dm8^A0@~_0~kPc*cgjm7^C7szGGEmTpeD~oDjoHe=fviy8s9(^nAD+ zn-?>8At6>~D5QiiMQS|KN@a_s+Brb6bI9=R8JR{|Oq+uxT25)|xcSG)$~HOGW?MUm_!o&8+U3V2 zJo)^B3sG`EvjuK{vZXq@g!>UOpBAbtrG)c&ks?rPDEW)3L|G&VrZ<^igechm_Pco9#- z52nOOQIIWRL8FJ890|6RDuNHmAk}8&MLX1CbzD9}|ayku8qL&g><+Rr^Wa+^d z&}k-#4GkPqXlTIBAofNZ5-nPzgM9rQ^AP)rwg0P-Mr|iwTq{TL@b!5*Yy?f(+g*NO z3CWBwb|5B+K(OHv@YDc%E&+Ob5M3IQ#yEftdwcXv=E5l3WwMZ`HoQ58$4SuQ$#qhe z31b^Us%@!42_W8&L7N`J%wqQW!0dU!aniEzxE?@zRT@a+z~u46!lVePTl5q);$jtG zGkqdS@C<`77LTCYq{xb>sOgjWjNS>;QR;5AFeM5+Pg!G;j5dNAPy0-Vsu%{0#Cj&1 ze`5E%HsNHN5NKFITD%FpYsj(&^e!a|%1?cwZAPcuQDbemeS;gJNn18uF7CSZbSZl6 zn4wvD4BV>IY-K2Mtc4{TM5HS^|0I$*(N&SXQbO9yx1kOv2VHc1X))B2LEjd*=%AXB zOIT|BOPdcf#+v9~9XOf!jJrcuEyxuM_>`aXRmIn6KFj1~;-(8QsOf-SNuFJisDvoD+_ibl$Q13N%Tw7))ombnHa|&}Y=3C~o=G_IoV^n}gnS2Cx$p zBL{F`=?dO9*)V)(*0Sge5tuqG8aX`wfD?=WG$3`lz$rgB?Scs5<#*+m0$=C6B>eZk zVq4?+yo?#_oOk&CuUz-l2R?h?Jy2$=yc@b&_Ws>Es&qI!^_>V5%!M+)eE0X|C^>He z4lH`SD{5(%^I{u~$E1MGoG6LOr`Eftop%Hno;>isnF3k8{tzCpmk^gl=bhwLp;skn zHA@!xZ!p>)rZaJjfR!2<(xW8)N?1q`20Mu;g0UeR4TKt(-EraqZMzJXJVwgKiCb%o z704Bq@*&ZfS6O=j!t#E!fG1YYGT#+xdSZ1URrKmi7dgqI&fwORIos2)ihZc zQ|+x8zdI&--+rDrUmY`RBVZLeT}E_wZ^-)f1`s8KXEV%W{Eopc=CQb{_ATI? zn#^{#w=g6!5+3Slw#7reYPO}|a`8|jyb2Fxo@bTv1y3{hLqsM@qAKDaL2i^=Q}|ln z5T_n3>6S!Guxu4AQBIjhOAt|KBwJ*`^tANQliB5mvTgzrCTbZLS9LT zsQ9=f8Pe6`DcUNrY(yI{lq_t5&ud{5Qo_2G$h^qlB5ERjnt_an*Jw^yvqcMd(Uu=T zl)M_bHvAug^R_j{9>v7yk=ezX1c23;1GviqD}bv8n-jo`S$Pei6&d@_tUJheqW^DO?j!59$ajx_;;;0rjYK7`{u3;~t`cELo%djL^8C2}C^ z0+YeZ(#rUHbx{G^f6l;;WcgxdF)PW1=5r{*n&KXhhNo5`SRSy`fcTLIVbeL7l?Q=j zmL0~>92E79-To zkgn__iCDQ%qIdEwKep@$xa# z?Aw(>fcm)9`YNADc89Uu>VfHd9nCwk%O<4K$e%&1k$*@W6pLJhbftQ+?B0QR&VF$H zY&-TZ^qIW79P^H)T+!UJfj0-tIBmqTux#{~d16x7x6Y!j%>7&vj0rQ@3DCB7zbIJC zjwR`s)1`4Sf27=AhUcm5o#5=43`}=R0y0PANA#jZvW~MIo}FLF2Oh|Id>|z?BRB>8 zONRh&T;PMK*})#0^kHnmv+vAfR!(D65KEG__=z+DXATOGq<`8Wqwp@q8{) zg~;D**w5=Qi~`2#Dk9v@3NlPf0y~0PkQhH|4TLx90spsZz>G@NW(@z&9AR@1D@F+1 z;DVX;q1#v)ByrtU28n^C>_DVN2;2&bJ0-9}>Z3}(3jzy@2BftGmIc|UvBL~7(*<^4 zY}5+4%NBw#Iz6XR$p*0HnKdd_9N0(PVun5gEI6@rQz^P0Ggj_-;@I4RdP+8k6;bKT%Q-M)q+j=BaFF^mF?QW z@(FAn9D$N7F7A}ZMJROq*WN-v)$`FzV8Z5zyMJ*zw1{KLWmPW1A9p+2_?uf$yozK# ziT#&vm%PRT)5@0C*(^;>Ay>GK#reWQpmOn}IQ8R5En-z#N7D8X#aVe-k1TYQ?Lyb&%1 zWl)5}g+9|hqv^oPwAS=sIz@8dqwpOq*e)U41~|~7DBA>mZB)agk$wnv`?#s!oq1sU zhXlfwY86$(c`!XYe>JBt7Kd&_tF&&L^hLW2|Dn_nb|-I0WGxEWcxZ5mAbYjC_S2{h z%~hkBk5w?aS!MNXj1H&Rj%Rj7=7oH) z$_nxyswcvzMB3Qea59;l63`Hol$0%ly_La=f`er&uhP(9^z=pzoyI!oyuP`Js zrA6dG4HCv$ z7pH>ml{A{k%+P-G@ng;i(ah2r21ui}Nh2d*gkvR*1)&1<5&3Xc zYk2!?TzG}Yie=+rDn7z;9^YodRLAjGkv_8Dh>>yjjo*VRctbD&nN)=nfCa-;D^l#R}XOU)3odqv;fwZ@ZK#?NA2kqsG{nGcUe0ndV;_SK{RAbOh}+wQ70s@L|wnw zgwBG!BDNXm6i~#(2Nna1f6q;fcC%8^X;8fEg?cz?2*zYF7_)lKM)Pzf<58Sn&Fw$s zX|EAqnVG39%=!0Vt`t33Ik-4a-&T|fgy2H?JY_adGBRgosoz94(8gKvNi~Lw^TqZF z1>Jf~o1ZqX%iH+*Di$4DtU4%gKPSo6D;4`eoMh$t)q%vQtfs8*c5(=ZEt>&F<(?}w z*r=ThfUm27iRNn!P)zEHdL$pPl2!#+fo9ut&|fz9zn|4XWo_XMlTSlvn>xXh-%1MI z#;2JG?l9`KW0Z;SS&}j|ZWHWR}5KNXMFK7`M9x(MA__6B2ZlbT&?tWPFJs$;6eU=ZxSoV4?+Lg0gyF z_^o%uEzAh?$|7?FF+xQY%)&4#*9g9#5ug<+&U=45sp<6Dek%x#C-WyIX_mLzoo=r` z7>?%V*NxY2*tlu)2`6rWjzJOPU;p&{Izf}prfD9!4j2?`iot@vIl73Z-%{0!1y6aw z))fVB{9AkD|43O?cmqZI{z>IEBD6nu8Af~UM-e#INt{+&U!vfxH9SlRh4 zYrXLsYZct%1uMb*q!+A2$rrrfhgX36o+l05O)Cn1&kN34QScQnIDJLI+yCC0+PO{NsyzuQ=v+F1z^6TVud#WAI9r#F=nXF4(8tRS6pYv(%wC=CD%2bOUsE!jY7j*Dc-u#9Gs){DfVsJWU!;?G1rr6KK`1WC;$N} z&zcW5NPx#1|G{XaKmMrBvaS)e+Bezgc8b;+$qVrxu$Nwd|IEWJegGTah}`PIE`>1F z1Qu;qxe|P^%s5()Aw&|)>4~oVeEHnitRx+kZeWmycD1d}4vtQTe$Vqj zH$nGv3wNExd&S1lNuR#aY%X9(@+bTbCQDReDAoQYGArgK8X%cn#3)9TxKzKNA@ z7m^-iIGWeT_UXD}$i?GBvL`w1Rp%kC*T;^@2JJH0GTEqKXK`=vWRv3*fHrdXJRSDF zKS>VV=J&Y|nc>c4uGnO0IyAW6|6a7U*tAu_;|4FN9R{Mq0O@-@6<8qW{`q1ZK#YoY zlPo7AsbDc;uE6+`;mR3D1PwT#n+dc79|rp9(+WvWS=zxr9L#WcEKpM5x!2YV&ig1R*;Dq&-3};thl>VM zjX09$4KnT&qaUCkL`zOXs2h4fka*LOiZzXxtDv5*p{AZluH{J)sqV%sRKm%u?xVA$wP>K2n zi~&)5>)T{+3D|-7aS%?;!-s{y$-QJA|6=6r*?CW$3K()*l1glIU} zCJ*XX!6Xwnj!SQ2&vY=KbsU>rgB9P*vDr@BhE025*fjXyP@6NbVc0|l55Uqu*kn>@ zpTB*uY40&;N;K&B7Gx=Gk_RVjb{(7H6&-n60}ka?4^vNH{# zImm-NElzzfbRpx#Lzd2pRII2R=+SZ*hcX|=@)HX=jTi~CCDV{?jDS~(YD78Xhu!|Z z)cvW|Dy&4l&Tr*|D|H&@#>+rKPFwVb5xSk)F9|(t)qXl968m>1+Q6Z&%C9Wyqr|fE zkNw0BjJxsyhasHdwrtZ)ONt->d(#YYLJ81Bb#2d6X4H)X_fAK z+GGVTL*Ww+Txj+?Y3&*}f(jKSCL+44cF(udBuNx^v1mY;3`Lg}5@0g)?Hnt_)3{Nx z4eO0L%rrd~ZP511@jEmv4F6hp6HccH=bQD$0Nj1SkOlL)st60$7mRe;2X$rH?yzq= z%*JIpqu&4pMAtzAJPi##<}$bCZj!qd_53Bn0nUYn*gn7d+B$zY;i-{~M`%PfU=aI^ z6ZX%CFp^=<-+SrsmIeZ6maddpA~Y81?6z5XH2nAUvE<)F`5@!DuE+sMb4#u7pcS6$ zNJzCTwS(D(Z*#yfu2-%ncqF_)E8}-*HndAOAD(O@_QTKOmfW!A_NFu(hOUNqnK!YJ zuyBqnY`J>MB1US%v{emS=O`%-1eeaGQ{v7gn`?P9gBognQv3PyaXPENxR$G zBHnd?gCHjnd&s8)it&r{^jvF>e2n-IS`}qyzuM~Yd-eoz0K0ZB{$Rp*eLX=zv1D|1 zf+xUSBx$vtAe5eFDG(Y6f~StrgMhe7BNC4u#qi;F*2Qa}zWD<%hIt3ra6*y)fqZSd zC`FtG=_;Fy$*FHH)72~(&4`^-q(xF~{L+jOK$kECNje)v08xr|y3lG9#>RM+7)3ex zZcf|FiN!)HqFJAs{%NjmNDHtVU@($gU&M{^C?#@Jm>Ayh{giD`MeO|D_Z@mu#wO2n zb~B|Z$Y%AleB_?L|6F_Zn(cD`UI-6UvWGJ%=VRb~iP60bK zzp@5nv9@(@yD4TZ2Z-=M(v^F;$wN2$g0>vAnZ7}OKvLs>6boRxVet4-D{TK1k=yO_ z5C&)2EC??BonE(a?Azb`#@~JBL&vV(U-TCq{m`-R==aa;U*eZw``GK={#%bE&1xz+ zaNWTL?TS5gnl@%KQpC=CCZF0SZVX$}MMsaN2*q%h;ExVE*KI zicBiaol9RcFzhEa!TyO-$o0GX>gk`0p*- z+{rq1vgQ_8aLLr!rO9xwj8C>k0irgs3PgPtIzY4b2 zpu}yaS}cYJTL#tQ!d|?Qi#5fGcFC6+&Qyv=4A?OtG-!5DI6on4W~w_$<2~|{(>PrE zEy>R*ROxBY`OG@xBk2z02jRoRMUD^rAG`r})hoNgjV9tre35Vq+520jlQ# zLuv${vd;%zlhbE;ex)@&n zy@u#n!g1jmCiQXwhYVUqZNf=3kc(t^Yp-5gSgG`lw~XdFzS0!Dek}i^Q|nKFj255H zId9}1yYwuT3&ErN(Zt7&>G{*PpDNs;KnAQyWKi5-OrDasWb;tdTY~OK%vxD8zD82r z%?7fJ z4oC?sPb7k%f?N>4icTn(y{6~6^&<9>Gtepj#wbcVQo+uTfR=QhNDP)NJ6Duvh6nNz zNXJ-?J|%1si#2qn?0w31X?g=RQ2^<(j}_1;$S4>H(`xMA1W_{`ph3U8_DwkQj~#kI z&7|RxdzAraN!CE@1AZ0<{EnBp}_T(uY?{_;!c@B&h`MX2<;_8fN0OO zU{)zV^j?DmRH)=aKIK~D%JDX2huq~Ga33`ifb^vHyh&Y|rIuykr>9;cTdSPKh_wdI zm~CE(@O64W(ZtGASNq`LQ75s`TcjwV#Ws&FdyWOT80i@d98>p2{2k;UK)$o^8 zL<+1Bx?y+NMHm(7p5Y1lq)nX>q$g+>DY%>SwsMm_Ke^n*Dhe)}U|)E=%Xt;$Sj(|~ zqZD$FTQqGSDs4|=SnfBD9bGg-0QOzD@lTV*X|9i}uey!Azi;liwA^?Fn>ySAcyR&@ z5;r=G^_Byd;z2e_TKN8wGz-V>{9NmmTF{x`dSggwov++q-FEkwlVr3AWt}juqKG12 z82pqpuwj(n8S9!TgH2M)e1sWX)&K@hj1c=^iu^XDOMty=fI^}SVcNl(k%$DphI8%W z50AP>h?YgN#ES=(ZZHbnkzBYNT^)xSJC>(IinbqA-Nh2+PD=t~qh zZybqB-bS)w=s>V7-=?&<*jpl?(76rr_!Ckv)AG7^Z@g3o;8H^kA>Xf@ z3>FTc3Sip|{$W)#40KQ){WBXVdC2eUS#&{b%}1`E@-FKdi`QCdzufe5G~BwJC6n^# zc5R%QjyNag(^~SON%D`?886&#g|P?$G+4NrMFFd#U>`5eDIWW1x}Pp&``Ld7m|`j& zRXfGpD~>pr{=)w0+(NSO&Uh?DY}>1Qm4z#=p3WC@`xjnvJ#e%REwMm7Dp`8nqrn`S zj?_Gl_D{zPl0N$H(PaNZ_KLZ5VNlFp1?=-zu~^z-TK22vE4CKn3cSMyUb)qe8L^Bv zYPE%+%l2!k7Vh}H8*cl}fB5f)~4dPMZr(Xa1hkpIx#}7V{GzxbLTjQm*-!9gA zIg$&5FG6A;z61E&xu5ML9YdTY#(?PkMRy^6<&h-_D?K>PuUgo#$fWJKT8P6K@X4^3 zFR5RanP4UL+lD>iFotV`z1`I1#&Xr~7CSrrUy0}h&O zb)(o}AzLcEU0|r+T@3G5^_?_;my$5K#%VXw=(@mDG#F=h-3r>6ciI4`=IeJgUI!D) zUxzuJIG%*yv4^h*g#?5ffIdoro>hPXBF{n}Mi?*>vu1=rGogza%D~7m${4|^|G|jE zwsp+U5Jw<)m|etSNj13<2Wd2bR`j>>Prk7KU@>PjQLvF_Veun>apvL_>4~u8>wlgO zSpvgbM9>mVB_dvt%uh_$YnfGx=c;+>o+D80AN>9M&$@bH$DxHMfBV?6bsRV)vG&a! zS1)WtmLp}JTz7EcmScG+_)>E9!r;)t8yD|geDa#3-Gd8XPeaK$5?qVl$qz2EE zHmZk`C95d492<(DB;R8|OS+FKy;xL4|2nLt{hFf9{i|jFWqKKM<77g&^#(?UER6H$ z^U2F7bCq2l{fw#PL3z*B++e^+EGQ(?pkIFB(@FV-zr?O$m|OLTTL%OZ(ovv?p#n7$ zY$vsBNvprd2YoVi7)?DO7HD{pyv4X}r$~p(t|<5GfR{b|Jy`|1QW%dZnd%>X!|EB= zC1Eg6nGH(GlD%`Pucfx2P=vL-1*{87|3Z`UQd#M(=2gXS{;W{J>6>@j+euHh zna#Y7igWGHLW|V%8VRw2{7h~ z_V~6#PS9$r=_G35G1w}#!i+QP^|!3-;#ZzW7vtyF#k-zI7p$(?0no_w*&*DyatOcb z?T;9D{%`UfhAg4TlWK)Fi{!3`ESscs z9$4AMuRV`0bk0Ixg10#t4`Kqv2(u%W{rU1Tmd|3@XS^)r@)PAiCdRU_cv;AHr%Xvc zr@H6;k6sowLr_N8C6- z@A0y^s!WlE0Ows^R*wN`l)5NEo>bs7SIElk%)uh^V)&k{4lvKk0L!6?e%P^N$wBEO z{TC8N;zUPIem6ydllg!~16+51UO4jHrO4u|GIlP(n`y(A=v*taWjYae%n($gxix#{ zoghlEj`%?)&g&JovX~8d2ijB+(RQzaS7we<&r1X24J73f%w99bHWTVMA8RL-Ql2g11Ru1$A}S)kWQG$NF!rFoCbd(^6fB* z`08D=qkx=DsF1ECByDFh-XrKt287-o3!LdPL~)yf#*bPjA`*CFzy(do6v>r}&1SL)QeU#(LQQ)Sxop@uUbjWw)2AIgaH<)$#K zry9dj57W?xAh&}Wo}ssysV7u2eyb=aVY)*H4_OD}cSwmQ!`o)hm&%>7!c?;fQzn(R zAp`_z0k(V*)Rc`spav9dgv`&6qXey(6?WVj_wW>o{BSlVhi|7ugt3?Ktb}^fo0YIo zV9-esw+QU;MW%yVHvLZ3yk6$$3{R1DkkZ)l7sl^1bKpFTi9l%(7c;?;YUP+4hxnD1 z1z+_3_)V%T)y4Pw8s9%*ja-|qwkjiRSkqG(4GrG=L#NtWL`ncaV~X#NB3rN><0GLS zfanzE@`hiO9WnlG_30UOjrE+5a9-Vu$a&U;G#&lz?HO;Rf-vAA}emm;g*R^r?Gp9xw_Mb8lA$y zQm9L7^t5LCieJ_3uQj|!8a=^Xjh;@Y(|^YB;^lG33uEl0{M46BU9QvbLUI#Bbur;@ zoW_P?S{mn_13AG+Sf_0il$BexXM+TM^R2fP!y3a{GW7;ey>c9=psu3JK8aRto?jPA(w?SY!)QO(o91iJd;YG{p z5$>lR?%wR{9S5OybcYS^a9DYVK#!w49o{ybFHg`yQVl>?EzA>`nR(g{U@a|dTh=2g zRY}|(d~p)g zD)=JYC#;Ot#LD^z(s5{ELsciz!ZTxKqrI~NE36~0z{&}FHf%%^o-?hSs1{bx%4P$h z7_LMjyAp+!4QpcMr10wTI0P1c&a|@C-dTYa4hLC*l^4Y3pFgdn&h8bB@zN(C-M-WnPk^V@+vX4aL@;?P}YH6{{rt9`h zwXdyc`z|7vktP@SYo~=)=UECsK+2f29Zc==7ueB)oE*4_5ucF?Ja50$|ma$m$;uJX!jJjgqOdXS*0ChP~wyr4G?QIs%W8Mrf zgXRkj4@+nrX3;#c2pllo6O+fawI>|tfHEto6niL(17g?C>_{s-3l~y788ep`h%Pi* zF}865JOS;HG?NHzicArjS1u}mUtaFq>*xN~yCEKNnBr1mjo}AY6zKeD?~y(%5Z356 zsG+gSR17^qp)**Y@<>gBNnB`&IV@~POSXqXQ z0|XOnaMSiJY`_}u8)gAVB}cV7TTtuUJ7)`OH15!2yvqEgHLYowk>N-5 z5!n;bj>;d>VY+g%D;|8pZO=G)efCOGmFAaXva?k_rA7Ob=os^It`d#P}SjX z0kxx`a~TNSdU~PNNEua^8h9&;u!(p&HbE!Y1aSZfiB)(|n|Du7DYh(}bv;(Zxz{hT z79oNVh0TNkGMI;q&Uu#L}?8~XF4hOM=wvbE;S*81TjDNd1vcyjTAg%en& zc;Nykd@>bPgkN7{gr6OLKLi=|CYx@91UC>My?Z8`)I3))0#b#80wco&$ zW|zg>auCV}jWW%u%7&qA*eKI%s%#X>jK;%EYZg^D7s}=u?`if_HXq978)cd`m8}b9 z>l$U6FUr6d=Ir-qCJ@`tWhTaG7?G9B+szF&;xwI5w%&%|Wsd5s+z`q(G|C*+S-CNk zZETb|stLPPjDg|f|!GDme*o)F4TXp}jsv+~4Hc4DKPBKR%7Yx(s<}1`i1ijWRq@?VoOnS zr|jh)F5gqm%taV6N)(+G1y@1rnM|0&{T#V@AWy(<(QNQ;f-rpqz%Pt=nVuWv7==?Ue@)Yx*xKCL%y#;($Y$nqXR zCfIJL=rjdwgCD7kWseHK*cMC;wnf0bS-LT~?9N{_+dP`Npf)Ipd%YmqxZo`mJTOxr zy8;`WSm}tbC-PUH6EiPpOuIBNMA4;uY#{NiQK{hjDXN(7;#jA)~b zjm_l`(FTv~LfjE;Xfz9p|CGp1VnwA7HdRp+1{?;t%Tv0 zy_eI1O{#UB@GKX5VuP~M&XFg~UaQ!oICEYuUcI+$@1w-OloS;0i@1@VM{SDE-#X3h zi?&@NZJ}z>y{3jAaIS=SKqG zHfZ1nTpWRGt|b%QlilNHbv|Lyv0{xmi7N1esT}=|8S0*`siXR0ym)v8%U{C6e^vr& z27Qt~d+gXRuxS(W@{B3$bX|8jrG)X_&nKw=tuI@U_Zfrwi~rs0K_V8^f67O) zdQks7^8 ziUbnR2>Bt9aXc)%RV{@zng<%+-)YnN(X3wa9oNaXnF;^E1B)@g-H%05XXPS?BAFUU z3Db}^$C{H46iTao3@%O^srUqzgqM2T!W_Bdb}5~n$407JmZ`p?kvVjJF6M5&L#iGv z#O!%&464}L5m_f(&qf9#ATy7>DRT07eLx4EZ<@e_Mh?zj#-S)mq@sKnfBxfpT` z$BLf}(^DI1rNo9PG|FW7Ygz6mYX@Rt<51h<4ZQl zy+VIQi_plnqOI0#8(ywW2qd;EXGG^GLvlK;h8-OrF)Xxg9g=8A!M8DK@O*GSiK1zd z1MW5s7{@~ptU?ZYII0ARVHdj4Vzs;NUTR-&sj# zrV^;)bjCy=4@5BO_&0?|lN*svigfsCHgDD<2X@OH4aojhwyR*DL1OkS0zkqB86;%d zDluvR8hryxWK=PlVpkSN&GQSo!Kr;1KIoutjmxm{Lff$%x-Xl^$ufcRozp369!6PH3U{h!v7cy-@cnlxK1R}&~ zTB(CETXyHQ_D4-yj1W*->qV=H{UhGgR;;SbcIb_7k%Xj~5_35I!2ILf>5?P~ZO5tb z+8X|ABd#N>5!WZOb_Q|zUnt5g7}1pGik-Qn$W6e#CWe$?p`869oZH8m1b1}a#=P`i zxpm4lv}V6S#60ek=m{0@7gKNG2N|A>QAl+B$o^>?lY;4^nr!owSh&&506k(RYCK%6 zBFQNmYp~sF0_qwmuSP&!!P!^qO#V3zYGQ6GBF23FPXY*l-&0^@zH7}H?3K6=WNN%t$OeHqsh!xdacjTiM<0Hj~-EP z-~`KDxE_B_G=O`w_uS+ZDMWOJzKQip4iY_uPn&nkIDlF7!?||+RlQ0v#|?7s@^*bI zPeH4lW#6{*jr>-gDSzQ~K1otZ#*f68L`#ULb5uo=2QTp@K_q1_#kNi^AUN-lbjHAT zH=bGgC*tJXLd7X?tP zQ&lmP`DWuo3LOAwi6J8J)Gyg@JN~fRbj;9aT7IUw18DKaMyE(!+S<3zJ*3qdRL?I7 z?FrA1CcC$r5QCP|h2-q)5VUhaKNLji64eAG&QS`O~!N|Y;C0V@uypMmA z@lF(IJCR721Z>=5DJ15}2*5}lqTZ;%l8>ZjInHn z8JX@{nl~hPI=lgoH<|}W;e?js)#(Z$Aa$b76!8`j=%3#BjpE6YQxQoZ(LYYiFK}Q5}^vLN}ALp$Mla$QryjVXnI-#FR&#&tgc=&4Jqr(KGme6m z`Jpcn=6A&nU191!EB62q@eJ<4P)wj<^AG#D_m~F=4zcV@(a;?xHB^X`YUGW3iGVj3 z!mhG9*=xhi;ocE%$yzn>9H!z{cgMn+PgKHvKvLBKBN_nQ%4)`I{jr)bEBO4-Ea1zI z10SL^T7nvi9UMV>|8w0QbUQLV;VeV1Hun|R2rZm&EZ((IBmAVdjj?Q0<(5iO4F4dt zhIuC|{U$@B4BQ^M6FgSdEJ?BYDwT%APq6gV>Tpe2M^r&N7lQm(u7N-;h|s9tJp9jQ z)lc#E(1A%VYzn7;ivu~wSX3oEhC6Hvy_MKXh@7{u=ci=|#%lABjlztp_`)VH#cR=U z$ji@o_>4r8@^SwvA2ToSbF(xrzZxreprU-p>EQnn(-Fj~C!9kR4>#CsXXSj-T1&>3 zd7EQLZO!7rmJIj zmdz*th7_p)l@($kU+JNN+O+$Ofb&XXd>egW-9b9kjzb2A^xo81FG z=#q-3F~m0PbAPB@>}2?j2CfL_WG)Pao%lyuPnp9RXOA)|e$J%^s@S0kR2dM_>wdr4 z?^Cda^(9b+M2j4dRVs@(#;U!d>|adB5bbg!9e+quWwE|eNT+bSM-li|Op<&Tpx9BOEjPhJBZ@Xa$b5h! z$T+ekE-PXK=|H0>J^U~HWbF?j^@i$VI~sFD`nu<}*ePjDsHO(da z+*cNXjU(qA@)YJr5LC2kqNyjBu**tgbQ?g9;ke-mJR5}BT@P!bQ$8!S54FO@p;pj4 zh%t#sa4*C&0lFC&Eu>Q!LF&0lIHx#ln1OHahJ$hu@fv%*&fFbo~+QqT@G6 zrSUQb%1wDR4{y%L51F_~CFVrj6Hy*>gH0GDNhagcB%`dz5)mRSR#qere1=@YB0wUtTH^>JeSIoP>0IbjJH$Ph_~~r@_id7muSgQWzsJ%59hmG zkU<0WLg-CyZwC4OR6iX=<$YIumXAg>`^Pl-d>#Z}K+|7FsduMYui9J7fH1Q*l_BRu z0R;>Bi6Sx!?){Na2duJ3!8|+F$`%JIixGK7#M^?Sp@)xo51YfLI2~NZbWv|S<-C8* zAW25{01aM_ba{geuF>xCCv1jvWs$_K9#yJA%BRe(m_m-*`A#U#1TVV(+~g%xMSYwj zQ_pvZXpP&_n`&zLdY z-yWY8J^OZJSsbi-`(uf{H;jJh6RlqurB&7*G4+pcNL0*rCqIK5DL zJ*Shx!~_tUQdnln?ofWg1zNq0UdAIve{sFTXbSvpVHS<$P3(vqc}M^;sx62hk-|os zY;)N|dEwDvBxi)VA$y1jt?BMjCbFw!PczazhX1u!|D-+RF5Nfdoob*@J; zylGw5sh4$i{ae>1rDn3F&4^4OoYWQbv}{b=-NQx=u}NQL13k0?mULN^T9S~k6sSH^ zsHm=t3cDZ98hKUGT`11Zev%K(mzEnYp#nUAp^Oh!Wc=6Z{_Cu2o$Dqux8*GlxLsIX zlW*pn%Weo30!4u_5j3TE{`75k!QGk134EmT(p39 z+#yILvJkb_2!iaswF2D+de-wFL1i7;;0+C&OZ0pHs0ezg8;?wqArKooQsIR-?l@;* z+`2S-?4zc=xS)9RSJc{+BZPN=%VF8b_!&JvWSIW=XAV7Z6kKO9^I+{^x`+zdujaT& zOJ6%-Wo1=dAQ)h_Q*VnzI+=q@g&onZX{|!uQxOHOKSRFCA`C*;$7tCE$=S354h0VkG2ojK z0B8{x_}LNq=KHxR=X>0^?YFP}%Z@sL408w8aAGr3(*X|{=WC3`Iod~1adh+*0vYh~ z$G%~#kcOit&~PFc;x3kjqMOga32xv1ibL6a-U^*oN0 zTT?_dxniwRuMla+M?ixQKIk%GygDDa^lmxcdXk^zL#D)I(10--W0^^YMJGzmUJm`R zl}=Z976UBLrjSWaeXp2`rc5n}00)**D4H)!iUxXqd4qCd3X^&+5|?7r)DWB0m&LFd?FeWxV?7xatQXG^nVMQud>+d zG{0H@u8>LWSQ_4+)~gsq$OH0hbn>zZfdja$cX$RgSe18?D``WQ|T{c9PDr);g=VHq#@NvAoAQ zv4}M_cEHAVNIW)CoW z4BtFT=VDwzA=NB$Ik33b&#W?kOi^#j0pRjqvhvK`$U?li#O~9|ED&0**Wm-^8e&-_ zeQXGs^Bl*Zayfa4UNvX%%<5GgHqK&!XSJH+MkVBVUYwn1*Ae}`aN0RHd7*!Q!L)mB z@&f<9ZOTP8+kA2nSGo`rK#5F&5Um=h1QDFuinec>$#&&>2+iz<dVIm}+ z`*$?Jx*&qjnn>rfG$C4Hao87esK2~hWGa;v*-&Eyuy_Qk!Uv&uYDAatVP6&ds>Ggz z3hT$Zj**I~0II=J%&-9m4k1B7bpd4Rf~DN5i=r=Xt1yNlN={F#Y}qhHZK zGM%WO9;wK%!%~VKkfG|Id{+e4XIeiB{3hZEgnCP^*fP0kAtTPU<-iuOsQSENJL1`? z&fw0U4xti<1$-ris_EVpO9nv1yrwGL7ZetlR!2q0TdN>$&v(--fn&KwwCpfbiW(tt z6td}S$ddk6#g8bIH(k|~2fJELwx8)lRtCs6d^-23WhJh^o52dGlC47t zla!$hPiHMgXaRjinwyXVU z>2mlfUU#uajW1`~(TdUP1 zcWjbVfjz>A0Z(&$Fp>Jj6wdQulZ7JHXxPM@?uMeN$rM)ncKZy!tyv&QTq!nj7%(X9 za@@JqBuejwxh*=t0k?wmRI7Qzns-a>mBY@I>F{DrH!Oq z?D^rW(@b9NX}n@_ zz$9WY-F$VCm0cDWEQ<%Rm}nYgx-rD?OCvqp3-%Nvl}4eTv-6w7d9`%^gh#BukE%DD zXMC@j`*7U@_GSELnNQ3q116k^l9IQ}ZG@H>aEMPw9!)(G9EC+y5(3ilF>j;FgecO0 z>RGez_w(A+Yp7qL!~dA!wCof$B?il^q@!f~UtAz5Bz$@Vsl3sWuH_5bQEJ4(PrY64 zfCav^j^QqT+%)x1_zEGUq*hf}@0%iHS)oe)Dd;o$wi8e+TMV<(*aR^aW0_)DnK}p@ zLsBB)Cxk6`l1R(_v+6pil#hwAu%B)Qp6z<A{qWKo|L7CkC1~Qw#E$*s0=2dv{rRXJrx@*o2~5-58%8i>h~ zt6WG7TL_xrE4~{O=*?CWNS;&ZYWPTtgY|UzO2|jUlWVzg9eG>Rivj{t5Q-@w^l3vd zyVkTh7R8F$Co8U(?E*zC7bO^j$`Ylv{Bsc4(b1sTZrFYk5-swAYv&=R0m$=#CBBXYbgb1USL;I-Tn#32{u(k&P~>YGxcbS5y<;s626 zEUokK#qQDRTiApwBWX^$0w5#vz@xMkJzX>m2Zja#fBVdamuCX)!R4SmJPR8B{HpDK zAgy(Doy24!BQZUj1(_y|n+QEjAHysWIqW|VNeoEj$1PW8+QLMqCKyz}gJsn4SZoP# z*z!1>NINoEQ8v(|Q!krDctMSm5zf@Br`+R~Npc5;n(RHvo%FAVNDB28M*^m8u!GD*Y=-)%;YN zX{%chTM$=6Y}u5<%7_@@G|)v5ED%pESePq`7W2uEFF@dQa-V!FWhC}xTPaOAg{_o0 ziIs3dypaT`sb)7NW`|@46YfeBVy;4Jf80rX|HA}vUmOwz@xUB^t@_KoL~`O@;#Z-) zkv&m+TQO*s$VXhc_HGC5-7Z~wcT9UDt)#t?t#BRMTZt>Cz56=qz(o6i5+tW-nb;^N zzv#`NN>JgRaKc?JeS-%JY5mHX%Goq^dn(sG0{L(@qw$kyONKf6-Karf3S3fIkBWSXXpWNtDwBZPa&c@Inm`r@`yVOw z5$(;lPzi~}(2}J5;(!0`&trb2;&Yd5Vr$=8R;Cl8Rs=y59zjQ!JBj+qhFn=Qp{Bwm zG`q4eqmc6`qGI>KVa=;eKJY9p&y__MmfI((OlYJ`d2n%wXduj5KArBpLa`987~1Wa zV)xzWx&*rg49P5578c^-`wOsJLK>WofGoQuOL>ZSvr+RRwmnK%k;W#WgW;)PTR3Oc zqK&<+Sl^POvQCNC@uFlPjty~ZR{tjMrc67NQ67*QksCjOm&uyXS($*{yEXO!v^C$& zk`@!s&C~?+%%&Uou>r)vQZyepBnYna75y9WAdKz$4^6P<(Pq)Z8t-Ug`hF5Ymk*j9 zm;=eAp@%!gh~sK$qap#dw5*NH+pq*B>r>FJ_Cr?BY%jba!+uNe^mLibaOfP{wXj%+>Ks3RA5R3?y(VzF@9j7xOZG zwdsrXh&B3>ijX1)mzsMUuvkLdU70&Ow#t?zaZ{z=s5)1G`XT#d=i>~rW~E$CY#Xj) zGJv^SVC!TataEyaJ<(+YTW1TIi@}5&X=uKf+dZ9=V?&6)nA@Yg8N-M@2PXhFuTZvQ zlcPw8x%PA~im4PLzNklL z3c^Gw=fA3P^K1?95njD#wgBlMvWMId1{@+~+HnAc!)tRaJy1!TlZ?NzvWP~Jq#qYQ za+TPm^ZbQKKb_m9XR4<~E*2@x`9>C)&jd~ogubAnCgu8QFNFA<8;+5*S{8#E&7b{I z?W*9L$cdN=hK#6;cX*31hNTUn+|QTS4q@tbi=V4nwMYWJy{0M*@pGExeu_vKaR9y9 z6%w7yCTMMi#1;VbLr;`~XfiAD6%v!tbxj5BR;!6nlZ<9`ifoshU=b(Nr$4T0Nfa>_ z!g#xfN3_$(08Gb^$w5P8%g~!jyqbiZ;yGZnmR$c?u(%XBgxG-yk?56X797Y(C5cFK zm%HP+XqDEd;#y-O`3;=*3k67MY2n&}B5g5HB?P4_h=o*Kq?f@r+pU6>w;7O}mozk< zVkRO_*`$c!>@EaErTBvI(ufZ;P!V%>CkRum1ZqDtEZR-?EJsl+xPPYLNH^_A=S26k zwq0R?2Z;}mqhtc`<^)0@f+x1EFAqdBp%fmI|LY6CToQa* z!r5kvNK9O^)A*uA-&{sK_N}$W*I`%;&S`MU{^!s~Y+ECFHL&Bg|12Lk@vq_oIeRr9 z{d1G6_+aICKQG=xPH($>6e;w1ks03~vL{CyPc#4)ovpIgtUaaKJ4L_v^D0wLa+X## zCeL#QU8iLak^YlFf;M8h2*viy+R!s^!=71xdRF(RX6_-OaS`|CjO3woqFLnIJ)9a0 z(c_c|>3juoG_@Me?Rrv59px;j=Zsir2IXUjmj**Cl07y;(hvS$VMbB<@M1BDv*lA- zj4H(ER*)*3Tj_`FNGBJPB{l18NK&8#f9N z;UdO|blT<3HjAg!2eL_&01fNW(WBe(n9c*19V2sG3^^mRWJzF?ymrusDWJ0{-kL!(Oct=`qvLU>i zY`3L?Q!VqV4Euw`wIIr@Gt`MrYB7%X2wAc~-WofEsx3bV7Jnc6G;aAJo{z31(oH7L zmp+Wn<$qfe6|qLfucje6#Cv&ZM=(%G=xjF zo#{*p?$8>Dtsb>V{_xc!!asDReL2V`XO3+BwW?@n;K|P2j*;QRevDfyfM?U;_HrYv>7Pc7PP!56Xx zmnF+vWFnR+PEjSxvpXg3jfSI4i^Uy@Z?S_+%JoWm8cp+={6hLgzv=|gSo>D5{VCffR+whULc0JP4p97ERa*VG^~3=8sjIN96#M4M=+cQ45QXjz((CZ zo`B4-IWi}M2u}j$Ghd7lnk~lY4P^lF0sV?C17Ik*iqg^;5YEcOZ~CZFCU41*!12YH zl10@YA9L^^5@V?}1d{`wEIs3kH>Wl6!e((?iYUWA2tjR}%kjAYkrj^d_>G=mSfppB z7M-Tx%rtv(`oh3kN%^{e5+9W>&({s(05|SiXHL> zJJ5S%X)UUUfyH5%*qi3%J@p7J0zW&#u=32?VO$brd3nFRG!82=d+Q0WMTHZu=GcZ= zBtMGIpdDM2(7rK>#6GQyx55*j5Dmx+5CxCyoFWl%GXAg^=*^0c(&0dSbf1cbZ%^y^ z7QF{q8F~l*>fO8!<7BOC8U!stfZ))l)o2k4fzW^^L~rW zQXf=h{6_{OG1fYSU9^V>X926I%}8JtE#l_mqekEeFk&w$NYn7`l3_FRCCbJhHz4o} z8i>k=kIo92JO~*L%i3$LH#(4TO9Yq*5Ut%f9T$mRwxkj#*r%K|(Ktw#qY`B~g0n^| zfpI==sq+&i8X;*-R;TH5YlF8`pSP<=mS2UQS5yM%#00#m;IN(`s9nLsp5VM9hT&_8 zw%Boh^}=l!<@j+i9&K<5tCB83v4R@_?7LGr1FxqMpZc2`z1WSQ5abd@@bD3dNRYuv zT6e03dnrX*cU^aQUbGznl42r*uc$J9*0Gc-5f;54NgwY)w8vmvpO$h&~*@)2w{2(Ww;}Cm;C?VW1XcZj5hx!mC$92n7|dbn=``d!Rln_7Fa$2@txwa=lFp30 zU*(d4-+~D}qi1Q_Iy*nA=cE=KS(c%bI=rQO$ii`L zWxJ)spT?DxifP3;#y%m1p}Wj@ql_aqJ@(wSj-zeVIAIKFZ_Qa0oZfE%V0F@MbOK3W zCaNJKHOo4otW}kXSSyv-=){61Bj0~J2{a%JoZ1u61c|IZg>kCl)I7ta&{WBU6zL58 zYD^KM%uN%cGS|NA7?m7)u(jJIzC~jfqpf?FANLqyf&Zrz=n+Y{DNHI` zfXtEw%QRxFe9R;x{1{~=wB^sV)mtW)pVAqc3yoz8@TbFbbiaCIxjGFh$%Hg&rm|7( z7)N;)UlCm=!_Une8a$JJXHdI^E_!DS@(q<_1%VSvMDkz+*nTYbS8`#lJLRHsWkFQY z1AA^8CaMSn{9>U6j60eOQav1Bs_MRb=wwRW-^YBQN$XEpjN8QLV=yAKNl$TQ2~L0r z*GXvv3it#oqDdc`1*>hKpZZ!&4)~@UUeA+kmzjCKKPHueE=S|9$N*5w^o!rEzO2{K zR8(t^1tEn13-(@lG-jC&pGcbrGdFEyAr;BUf1HQXK(X!rUx8u_Xo4xR`&kt8e03D- zET`%KlnTZ1xJIEEBrd}*nNDuxFUM~f+{#gBl~FwW<+L_j@l+ZXnnXevt%5VDeuFSc zl{=MZ>N$u4NHFmn`H2wZhY^cUriQ6Sk@(2$5c7N*8ISk}OWvX^w<;2l41Y#kSx-FZ zH!F;O6eK6|$q|E68`{mo{P&vkFC~W>6$M2EJhg1vhg*+RHloZZ6x^M!4HnP;L6XJZcNP1{(B-NG%FS(EUT|^Sbo*{`-_!abr%FN^-*VMw?7OJz+ zZJHe&Yl=U?fQV5EYfuKWqIf7LYh4&xlokhMCdgDc=x8)y!A8eh^D&LA)iM(V3E3vk z-_d->1!`ATW}L>3)t@YI8;vrPcn=!>Nj_%g|A_|H$y*d*J)2pVFI%MJMVHYrBFXu( zRh+M((9H8p$A?tef)R4v(ON_(p=OpZ;5s5mTek> z5T{Q11R-oI&L*eJ2-2lBM71}q$f9J*aT3Tv`WT~>18uIF<#m}CZ|SO@2G(?vhd;e~ zXA-MGk4sgZ^Z&e>x4hv#vdlBgUS@Qf?JAI%%8bhz;uUKlh*P=#a^jdS1HsQp%W!og zii&KwOTyU>c#!!R-HGxZGmIoWWPNR;xY&+4`pEbU}&fY#3^hO1MP50m%K7yA~q%TSnvyH5$2ZjPB6N1xyEpi| zI%jAH=7qm9K5U(87Gnsl$cO)FHF7oCXQV>-hXmSN#fnOcW(sMBCd4surf!?5@u`%cQ)%R1kN^_|wgA^3U{FGXC+oDz50Rz!Gc0Xsckd^vJv9nlUyY?3=cZN`2xt8+<&L((jf>+0v$EQY~d-#;~6BsE#!@ zC{!b7Ep!-yYHj~2psZzgwT@~A+e=h zNRD649l?$TW&K2b)xn@%YcSn%o#KX6InH>gLU#Jm*|5~ePW zw!K!BB=$(S^ztInEk~p-1ch|ySH*7QaER)09^xk+db=b^3GbCpzsp|xhReX?yjIS3 zAO_-f)bcYC0kk5EPb7gdu~YJ8b?szo`8aDLe&fqIIz5wvPh_gvQ z8?798x%f&M4w4Met1q?Sn(5*udw7a%`l0k^L_jR?UtZ+O&6GhRU<@7-ri zkd>Dy=~ipLBkrkF<$PJ?T$L%`a5)_HWWtN81$?^G3GN|YBy&0kPWbL*Nt?`g&o)5A zzAh13<2y{S`4%dq-BJH3reg3f2UVbg?PCgGZLh>NJHc#<6~IeRU8;-?Hs2ApV*lAL z9-BIZV&8Wy(k$HRg>+M~?#N(kK(oL%wfX%TZl#1{67O+h3QG$?erO^ej9x1GcU5Ki zhID2nAae<6f|03_0A#|UUkGCSI~up}Ml>nk<+L{eNMS+FE0w|;#o{}SO5dXwID}l2 z51y6Yf{Z7TNp;7!IvV*A#d(noUo7>TdfVXT>BDNs;6U<711Hk9ytDMnrd{o)` zOm!Q`Knaa*qJ=T*mHf)eLJOA=@AysXH|YQS8s9&m@59Er%qs4!#q1PJQ$ueP6GpEV z9AIrKIv^7hBN{_d&MWpV>tM3Z((&8=yv(!>5ThCXjQIE^l0dlv`R;5rF|51Gs|Jb4lA3AHI()w^J4 zSpLNB`Mj03EdDwyzmGzw9PCoAM(6l7U=Nsj(F=6Q6E@Cg$^c>Wv<4*9ULq{_bwwm? zE9q1N;)Ona3^>V=4dLRNdEWren2F0(BRh0Ub7X3`nAfQb1&jW&ZekClRmL9ZKLeKG zk%ht4)3FZY#Z(gBLbnP?^ko)DEJ|cbeeb6;WX(r{v zzv5h4K5k#CZN;r(xM#A#2^DyTFpfTaj>y>5#l6gBszg=JIio3t8YiGvR9_Lyp?E^B zi^v>CliT02yQDoYtuX^^Ay=h{yE)PeYH)^(8O zWCTK_spg~;MnO}p=ON4?R+w{5WyHK5%7$3cR3p`1FIM0c*Hr7RvT3UIOr@~_mC;l) zm0eTKuV97qu}?_VptdMOcF0egl__T60am6A$b6(ZTE_#JBbWrY&(H>iV5BO1c!nha z(bflo)Ge=no6Tv^5VPniqHc$KCV8ERFvqA_L89Ta=L+$G4C!JgavmIsryzrx1E( zx{*Sfco>nnnkKq)%mz{_0(IfFy$bQOR0f==(tGYe?-FrGSV6ue4RnY<1;i6Fz1gFvrgU=vwi|1g*0lP)0ZjjS6w8OoD8Ja+5IrIn0~LvU%vgkoB?b^DiK$hM*~!PW=V+f-Gg6?gk-|iDlelp! zF(kUN#$v6OS+xzdISKp5Ncu(Q3BA#PD&OR+9M9q#JFS3WX(swvljUua#y&XqJd4vA zV^-=_CPyUCRxn{%bLjmug~x*y9j`gGj%2uyv2Vy`e%vr8lbTN9 zmwD=}115+$RdP7W)<{;+S^+46loI)Wd~g(@6tgo+jP-{(t|dp^gg0o^h#)f{43Ks6 z`5;XqmB^ebMiPhr<*=*;ChjA++;`wd*`^d#LmJwd?#* ztaHQKbsmWDyl!P3AJwN+BV|;-6l=sS);_8;82Lv{4nhTPN%=L9-qx0j@auxP zE=cj&r^!H|Y;92;CZ=GL12r9*As8u!l;&{JG_yZu1iwzl5E*^Sa)SUy#X4=hhpT1I zh+L;5L5b>5C#a*MhtP3if|sM}2M)>FhU$;PM$VTUwA z%}FB?s^IvD@@vTSR1XP!Dyn~t;uGcH-uw|6_9qeKu)`NAft*?+c}QLvoeh2HNqFTK z-(j!NR&~VUAk=1~kzV5531?F#glG&f=jMyf?QnB_f&($PVYHrF_~_& zv_=+zVO_H&XMeV*?|-&E(Z;jriFqgbq@MbsOjcl_M;;OFCg2MtLU~=Iyxe>&?6>k{ zN!wh~mUD(I9?!yn9E0*?q@@vfq%MYP1HxC?wfv6;7UtQ;s9e+&vJg9~JS|!Z?B*?< zXb2I>tU~;OrdAh={JpQVuap zf-r_FY~aX(zJf#6&j1@m^;9|0&IgMN~UuD@Z>_ZaNOiBg1*It4!5Z zfb4A!S+}0ZRDEjGcca#?crC3|+H}u};{+Cg@do|}3a}E8sapTFz^avWTUU*jTje#$ zajbJ*Ld<*xPyPRbdn?L}B(YKiNwv4+FdCa9A)U1m`7#-u>7@j<^9MOVmMAM0GEqN6 z1wySz1v{rq!8lEhL~k@jD?SKnhLVVAY0+@-Ubzw|+)aQY$^|({4z-30grG!+Ie#4z z#7zYW#-DaJxA>$uJSX%@xX{l%kTFO}+swgAUbSoS^7u`oEd207GXAu*grv!MA^C9$1X4_>$lYODsm+*s<)7e8X!LP< zqNaIIEtaxMnECS2#M|ZHGrgo>Sd(XkX!82fR%gRVzys4{<=--?__Dd%J#QR z%@EaKSnRI~E7yGc?%%_UK~G?q_z2yw+WM^S;f2wf?;ucVp>qX`?zBKy*BOY1`jt8l zfiX6E7pWcdU*KH7WPb8*WfR303h)w!L0w}OJQVj!t4l78fQAo-ln&3laR&3zggl(Vt z03tc5{bHlq*%TY0y3Rt@$p(S<=`j%aUA~U_l*pU@a!}#uFZ$a56lxuvt;NzpC^$S* z0BfNEQVn|>2b5ry+Sv(ACWyknMJ8w-Tnr39)~Wa1%`Qa7`HY`MI=>_7hX2yM+s)#S z=4VSk+7g0n%Xsns$KJaDTXvoGooAnY&bjB_b8p|%4?SCteU6&Y4sI-JG7_q}Q|NmQS?|mM()iMlFR4m^<`?2&Uqm6C?JI<3OFyqFAg%=JU-6QZh_XI*w-Dr&p~!JRxVzpx8;?W*Dl%>#iAm_u zcKb*?K#!*Fqixy)P0%;*`i8oH_neTRVf`l#+!t-)kWvi4%M27c!{MJ#H;?#ouANjx z(+`Ng-ck>d#~KWuvIkh<=j?yxyTiPvxgnc71^>Q8LNWbL%asIyD+2=BTp70e8VFpK z2GW7R@l^;YKz<1V*Q`Q7Zgicb_+k*C%rXRy$q2a|2pnr6aQ!j_fDs%*Qt~3K*ei5_p`8MP=YoBc__Z8{rRW+af>@h4k3dpJ8&>%c z^bt4ZN2?{!BidcFvN-}hqKx$-F7Qyo^PO z4f!uegx5$85Ce6tqHL^Vj$F#lOhrt|nYmCZyqFuU7n2y98l4ZIC|2EHTl6DPwGGR{ zzh+yOt}k*(hO!4UzL;T&0`5EtrywENoi|7aRYzb$Dl6%cK9TCgdx<{MobrRc1E>O; zL`FE=&o91YZV|I(jFcmQ!e2}d2>8F&+X+IGSJXwPb5@@aq{=KqR+zonE+VPFKVxqS z>M;_LHz(#tSUWI+NeazRee0=G40i1i&zQWhhpzMLQ4W*n_#4)sD|2P$+bYf zQyq&xWXsXx^DAhKKSb}9)fJHyImz5Bt6|98W0V7)JF{Ua3;X`;8iF-mY z{l`4lC?sI&~yo0Mr{x90kA}7w5Fww5}O57lZpf>VOxokhCBpUBh3*ekq)q6 z2_Vp~z0l6v4ycXM1)YE*D)vqTL?9o<#ZysMxtFy{7t&zvTUe$4;Go!ERjy6=U?FCz zka2sSl4dKzJmc}h@qB~`6`~2rkdIa+PxZ*~wukIuTIA=3*`(}`?2@^ifo{e!IQYD! zn7&Zp(ZlvxpxB^*tJhXZqp+2iZE!(%d_&F~)m%-qjzOLkS)D>!zh`1lb+!dui_A@m z?@T`^J}OU$5>&C)WUt7!4pC(u=|VDG=?H)#2ecT3jwDe3Dl$ldf>3cBlEYJ8#}tS| zz>9{OHu?|AyAxXRh%v$f^C))=P>+&CNoqsMq;b@@y(7VZddEZxWU`s)5ML}of)q_e zSy3+m2ZqE3?8u;E(Lh7l<^#H<(czF^KRPGcTIw^?lMv)xfgm|MSpYS$MmpYzqsgyt zl~;BT7Jmnmm;@d@QdlNC(j-mO7G48EW}!}EhP@Bh>p4!gv#~y8#>)u$Vk_O+Mx( zeW|VjUe#4fhuiZ6&9A)^Xk58BKVDs_r^nNJ;hTZuAN&L>mVT7x8|6q(jF_6(t?Jr0 zkws8;$8L4SUWHLDlM1fAQ<>#RLn7Zn#o;Z0Pi5Q<1HG(&`T5@MM)8~OoO8HNwPg(V z+U`}AM8b(T)z80Bp5^LqC@*n&_D-4ChlTHlD<|ZeR#ylwuRzf|T3t&Ws4uh>-F0is z5v;?R0s8g*jx4rookbs@uc~@f#h^J7)Z$emPAu;e5&oVGa=1DYF1>o*F$eW#S^^V1 zBCHMJk#?YZ39kL(+mbIXec`2Z-io4gB~9(wZn`4f_Mz`m@Xu>byhz){w*5ejuCI4@x~wh>ggTq?Y3DyWotDVTm3V>))y^cCaS*(QT(bb9di zs{hE_q*3~G1h5K)jNQSf5%1|57`E=p-MmilOyEsgNq=Xb1e#KL#^}1zd>{{WP&Dm< zZUI)CwXuI2lf(%PHYOMrWR1VcX)py}aM=a46t;H35v=dFkox|%O)y- zlk0E<{#nUlY&

6E4GUhANGy5~BG0dQ!vK$X@y#tj_3HaqUFbwJ@->kv!hN^2eV zv~|`xINx+>p<}Ft4v-%&DWYOCEp(9QorMl*3_whWP{Csq1){2$c6zvR`rfZ$>IhIe zU7QE^;GsUVt@*;9HPUG{AGrkcluFRYxN_Z^Hq!Zl3$4EP?s70-CKhu(ByMsr_=UOH zzJ?#Q0Xk0ue1Tq?Ts?|8wn~b=02MqL7_4dHgp}&H7sfSfd>50ac1!+Nzd=PZYVynL zR98%3te9WM1S+p76KJjy69_jb7zN~}{(={a6X>i;Ua3-^BovN8Gl83Vr7FJH*UTB& zk}}+xQYU!U1kOF3dX?u>kc#7ikT}T(XmA^2n&%@GLRE8oBuiyk7i7R)%Q? znJbb|z*9EmCS zNkf23dTU#o-cTcTEp$M2c_+Z8wKov)AxHs(8!Awgg8{L?KLAYko(fX;b6dgJI{i(8 zEYOzH9I1%sDclr3G8l|iTqf&eUW-Lr6Hi-eXysn*VMEv`w*}^WNz^4+%8SvyG#r2r z+mRtnHh;@5Cjh}ItDHj+SLH&|9O7TBU@x8{R=6eIaLF#q5$+K-vop{WA9AZD0z ziC8i+OGEMr5HNUU8N}BYi_CBrWzrSS^lx*`me{}&&TO;Ro)Ibf_kNS?N>?WfIFHFo zgr*Gyt-jcxel!K>-M$Hmf@4kT3N=Y?4EG1Iu`h2Ik7yB8S^=$rvkh=?S_o9opFjo1 z3RF4+iDwB^&n$pSFG29UT>jaGm**BXniVHPH$oMhLKU8Fwh`(gt=Edh(zNoxWRlC` z9NXx_q3wMsZ%N%tQbP-PF7ES=vAhN4cLxKVP}PxXtfi#310}ovS}~m`A#B68413mC zg*a}+8}J0;`h)bq#Sn2N6DmX8hGUQWTVAGY7BJ^Oq>#bWF&KfJ5Gkm6(cv z`htLygHi$x4RD=+lNBXs%X2g`I~lP6lqR)_;Tc7o3Ynp`0_4_OZfYtuGviqj73QHn zM#^~q2%H$EH*!0OQJS;sV_bg*m8PHro2hMad!||I1VRRWHf05sLIP+M6R_I&vOXwT zv89gZ7}pUJK;^h(8KNyF4VGj@G8>@JXm`$TsB9xNkqMjK2qK>mphT(aYl1-&37JY- zdN>hwRBS$|PUn?|YBYIvyDwyGbLt(4XaRb5Qq!oQ!pRx>0de@vFa=eNaBL)(Mea20 zF!5`Y3H-x<^nYJpu}Up(H~`Z$_UvBjM~qu~0yQD(HdiJ#$7=SQNuOhieeX|P#1x5i z@9ebnnS_Yocg0T2xNW~QO3;pH6dc@UP$N%luS-+Q*YGKH{6ok3qn+W-U?=^rD0;nq zsm*>dm=qV1*-Qk$*KpGmIdz4K8GZy~aoGY;%hW-qPa$(zNNd0;1Osi}Z9@xgJY}aj z_;U4pgSGGx@mdEo9ufMT#_=W#zBYwEMkAy_XoG(qjz|&Ipp0VUwA)3Kv^1_9w%Ls9 zsB}UmG{w8HcMf3iIr9fhbhFLw~PX`XN#HK2GXDs0gH zD>G-Sm>)xM;qprJL4^qtG@F$P?xBP%_opHOzh(&@^oO4c1>RjR)_Lo3xde8C}kQt>sG zPNU6OGMF5wCHW+4T0f{nG7(|2`OaF^p#Ha*z`d0USHP)86RC%tp-{l_{fUuq@{ihDW4WWOV593#mU}grp;+k9G3sDdPpXZS_>OABf^eud z>A8I%_@Fzs`{ttUzS*_i3D%Kn<1=VBZMzG}!qXC`oK~n8i$RJ>wXyAv4>*~A<7y() zucO+a-ZD8Gjg)J{lQ)7yd1pB$zm8C7Y(p_rn`H89^!6)YEh>|WPT0J6FR3;go?|Qn zU}-_P*{C-7PTjWMTA|t?+@;!VHL4AvK-;*R$5L%Tp{&}#UyHNB!co;REgJoX5x4qH zG(O*2L;71;_)rsL1a~MU{U+TCQj^dXl((qoQVgq;&ieQVKD| zS5s6q<77d0P^B`k@$83>B5jv>~Y#2KjG_ zHeOQuty!X#89^}hv@uI^`>0tP$bPwOELIvqTkMn^YiX)-sA!`aG`K{R0aN9@be9dO zyz|biq}$WR(8xWFlGFbqVCA9Sp=v0@RMZ!1p)|eR0h_vtcrJ&?k#)ZUr-eI^QnrZ*j z{Pw(%r>ndX@~d&j;GImm1{#*ts7DYptR8L|Dc#+kRfiILAtBltahL1>8#D)!d*G0% zEyJOU6)WJE9guM%I9>-;vwiWYpijKDnFB}BwB^VXD<6wg zk`*&P(E6v8aoTc65hz3+Mz|O6d-Xg&_sSCu*!Usv<5&T^r^>54g z&bLX`Y}=5k3D8;lQQ)szURoJf2ngMu%xY+jE+lg*~QxSM=ea>CtlJ%V?9DkwFze!qH8zX zDmjp-e_I;mcLa42RFt(1$!9MMxeFNOz+EwbtRH80ZZ1OX(S`@egy@(d;}2bydXQI> zzB8*cjZ0RnhWhX%r!O?z)Sd6jrI)$`(7l+ZCQ_FY4lMKwG^T2GRyt_k?8IlgI&tLx ze{-QQkTeCL@d2RM2*isugsOaq9h7)4+7(__(cZhb@vUe%0JZ`;@3FE5H#Rg!B^H0pKEn8tSD$c5pe->Vw5T49mV;?6Gw z?lj6ddu3Eb_Spx(h7;r&U)mvT{ZoN(Jn#Y}Ow=q?pb`sZ9O62;C!)rNa+={ch#f7+ z`t|65*7ATQx$O`A90qJ!4rnA|SsAdmjLV38Z(;@#_5mlLohNq1qKc>!VME`T#L5a` zfy@`<&6C}j8_j5C`NU+mQ_xrzO{sthj&-~c;bEnJv3ekyvB2T`4&F7pwv&GoF#_)r zFk6RgfAago|12~WqyE=LXl4?#=tDvk4V@h%p^Q@?&?O`kYRUl;ss!N!K?gEbK%@4$M*yGXI}@ z)hcU-zbFa7$Q$iY+k{#PlHyZy>7TK;P#hnt!m@@QHmeNg6iZ59%7K@i?1@d?7a8#+ zThcbHlY3bZFztwflR5B+>zBtNrd<6kSe7}sn1tMqslJ94H4X=jX@F5hH z4KinYxzqxsPFmq?O?BdIs_t?UEIIa?@JOv4b=E~KC)aiULm{Myg6ryA15_e&+jXCO zBtBvBZSfPcM0Wk2K+LewtAatYDoZkU?WrU2I>E@=RPUDxCF5>8?i8Tw(6%Vk<0Vs4 zM2^q^6q6E$)~Vj-Nph>s&&x185q?PKr~;Sxxh~Bt4+!VcgZa?O7)>->T6e^oT5A$`PN{ z3OynUMgq9|Xua}rQiyqqGiX7TSs#@_{UF+{s6S4ekXl>>mJCdnXY>Nq>ocfc*MRD^ z0jjTPK=s-H)mI2q@~?TM(%BQJG&J@^=rdjXH@Eb^f`Jps=ncAWR4`+LN+`Ngw-Sjo zD_Kbn@05&3bfDE9VQMC51}Dp{0VimvVE|(w&vX3g;iFgO`UkgFMI7)LFu(Z2J#^*=No^I?#m z6hpp~Mk4)4H<{b|%#&n=E9{wf8rteSc zWnB>F!-g6WYV<*PQ}-snS334|F^a!fC$a*3(Nl+xt3UL1K0MXyaa@EwXO;S^lWEYz zO;{jo1e(S&LfUoV$PGKK(yj}YH8|FkXZk?=2;5HwdAKK>FW_=^UL*&FlL3Sm!YYZ@ zINaCjpukkPnjE@hKWV%WP2hgJMv?;eV|pVv2kgmP|5s>#K!$xC1IlB6v2Ob8`OEd+-3o`og6u`km zCj6wS3!^kJve_>ZgpJApI~78{C}Df80YgM=H%0z|K1@MyTRQ=qg_ZdR01?lP?CVV) z$esS2$tODdQmBUsEC6cT(>25+ziBb~m$`S$Kaj}IjK2tw<^J5#9Km8b1C zO+;<5M!IdI3`SQ0DnO=h{Sw*$p?yLYW%9V!exKef+ZA9Wbu+n1| z;15vC?GsyYlG2eBS869vVD{9sj_MX}AbUr$ekM=Q^j4fQoz|!VT`y&pZG0NPxul=a zI9Mx%Jkgr+Tgm&zM76d6hva}kj3GxgG+Z^I4#5oIJq5Dwq;YUGxRqo&IS(Y-5z$O& zyAaS24Gp)v$b$Ul%s&T{XM$!fu~kDIH|84QbIA9q!2C#ufp-LEOE%K=E=P2lXRj%n z#U}PtrkFs`*xPv-2s#SC{^EwkL~auC)jLt5op*po3#I7!fv%qaH0F7L^(f0msdtj{$ui)l{=VV>HbrY!I< zy=Yf#C}UNFc9~Up+mrZIqOAt)QUP%=c9{>AMueev@J;m#XD!bE&kiPIbG-{4hPnbm3|=!eX`ZGYAEyq zBmj+Ftn|4LMu{0vny|UlLTbO^>3L6zRISiM;l*7kNW^A$n zZwu{;xZuAVt6QRyc-*Xi#Rln!9FBCXO4T&8!fUISKGC*5Bq`7BI}?c=UlAjVz>FPl zoCBp$CO=m^Q3NQGv5h@M5u)fQJBcp=nIr*u9rQnB20Bhwj*`D9r%a^l?Sp9n6~3|w zIfk94$!R2ADoxO^@KUUnWmJbjl3iRW3AmA2K8{sY_^zgE9CM$0lu@oBid3r*A_{|G zR!v*92N-%7xH~@8i{p`G>BjC~?;_gp;>o77SjR4+&DcehsBFHO_W^OD$GQ6X4Gy66 ziEEpAA5h#jqZEJ}+#2T{di8r2JsVi_%v?^8ySVTC$&D5r7uBSUjsoK%7*xJiNwrdBAaz2;tUO(@CZC6pZdwNO$% z94ZAXH%ua;4se2Q2rD6n+u0WZR{DyKLA2LmC95KS?tmmMkkPbPo#I6M>Q)^U2+Eae zKvX2h6+z25u3VFL4J)OP&SspxL-r^8!4z6S+gNfw*VO8h(FiZ{ib!u(6id)Z%i9^B z(@HH*mhm}#l9y#&^@g!OE!1wb0Te<`J>@J!#jWN6Eeu3spw)#j=s;G*c*v&|`9qtj zj{)lCsQ!EfU|97TrLYnFG*zvzkv{+C&=YiY?LCOF5lZ|`WrRD``vML`1&~@qe`W7) zrh3GR?Sck@O8Bt0bja2?AqSHpM=H(PsEzPI&<2D6eRB?4^r`-s69Ur0J0dgSKU7={ zGqaJSULbzRQ=Q3u!u^G>3vMbd${ud*+m6~~ys58&wRE%Tg9A%OVlOK|#8ZGG(98%U z0~a$ktT2@Z8)Dupwea3|^;NaeC}|^kI-p}#x)YWxQt}H|mRkgHaLlu2p9G2c=*y5U z%!&Mt&Bo#14puvwIuA;o?MwYC{|Omk08?rIqbi&>SyS#{m!!gkKxmL_aH#AJoHK>J z6a6=8%Qpy*fhKU2nq+4hDB;8C$5i|}ZQ@ma6(&ROM)(BY&l!?O7k?}A=#>g!fr|+t zP_=r~eFvUcLDiTux%2T@j?<8jd&PI zT*M}o=uw5?nkhF!WPDjk;zDn7`mCJHWmw;~S9^Q95|`Ix6c{KdiUu~#KD2JCn*anq zY?RjgzyTXTaLuAie*zH!kQ#*{BVNdtl)6Mfp{l+zEcN21v4nroSvx`FGE&3Au&YAH zH2vxW5ztkWEJ5C69)0p(|Mq`m!~Li}k3<;&)qc&|QJ+i6{<_3xd_ie<)RI<_Ne8q@$7{OxU81Z&HVtNyl$L_osIqHj43yXpzK?a6{V;siL__5=RA7!=k5dO#s zrKP|~OJk&^iRrK2NDVyCZ8MQR`jVhvt&VMJ3m7y&RwU3|6#mI~E1=Y52Y(XbX=MuV zb8;OB0YyVLLIr)MecTA?|=~Kon<_A(OQcW-s(FHj=_+0!!S`Yo=FHz`y zk#j1sDARUJzVBLiY0eV;fEncq{-M{5X(w?mFJOt+bh-d~Y`~L@-HW{Evx{d@wP!<+ zKmaYs;)St?Y+(q}t8muc{(Yu1uSJ@h#p1Z3apR2}q&BqGkqz``F356u2No%ZV$7;Kx zQ559s_`#v4o}eeICwNbEyb*oPeLx3yAM|~v2Vm3s9@rL>Aq&d_M`AXivL@w7=pTce zb7W9|ASN@ZdoTF|lN*e;2lSxB+hL~sNG*V03lf?Kiw*BSRU#Tawb5e_k`8+ASXT?E zrOK%{cB5*OZT*EaEyN}7$QO!0pnByzCbexDrN`+s=&VT`0vzzOU3F0W9lIq?f!-Ah z;}mGx7hPGu@~OCd8Ej3*<&K+^pm)vJR2sxxC>?xlx5L-QiLWuk;%gQu2{YXZHsiYP zPrmR%?=0}yi*%K?=4{E0>;G=A-c6jme)Zm=&oAPCy#xQ3-YcT^+o+H%C6G18(up`2 zl1ynW?iGL!mLLuy2aYZyBG!-n5D=3nXNE;F^U{kqHE#)Hd&1GH`2lfB_pdZN$`z^< z8vJ<6Gtx9x6P$RoY}Y$cz@c&}kBP~AU_lSMzzOJW`jJNU);H5frK}nkpaTWT(iqCI z$+;(ogtX!29%Wrb)Z7yxP^R!iHnYHB(JZvm!P9L0PyQ=1{7@<8h7;;7o{rH!;B*Xi ztvMQ_oP0L&C^o~83DG}cb3%RZ-)3Kcy&wt+kZGfTj-`Z+Hm~}0Zs0&^47p>NQ7Bdd zb>Bwm#V0?uach73rhi})Vc$dDchnL3> zVHvtRk>_Au)(`ySk5EgTHA{rw8!5r$-a(7it^L<=2dus#e!he%`}LPl_@u9H=BnZe zxjf7IxiBE*ABs~zynM)8+C%A7@~YRaX;yX8O;Yqz^lBMu~@=0BKI|&s%_+#7bY`R!BjHdUFv{dl}hWh*S*`l4dAGiYA7SAQ|}2!1E~pHV+=>Ay$cWPsFf z3Bc@gPKHj{fM`5-yzdUaBH!t2sr{DzyY#hipF=6&mxu!px>rA2AVT}MshRs#0#6N0 zqCUD;KS%1?UOgclGK%%xbN-JY5}o@?sySPgcX1qpUXuVRg9=R{K~a84*ynhzMFpm6 zRNqq#zxgc5Y}JrW3>_e$v}yE@?UW@*BuxX|oErH@9o4OJ`chNsx>Cd7Q8?Lur#rlX z4$DwNC(uPzp2PN|2C#?m-*xsI>78%WZ1S|z#eupwZo621GwJ_2okYPa2Xt1~R>o`G;@dEoT#aq==mCKd7FkJ@r@}6e#aLH{U!PaH=*L zxPgS45lRbvjO5K=j24slQJzPzX`3IdA;^pp_!u+&bpu?|DMJaEsoi%NVoHKhZGEGB z){nlAj>u;{9}B*3IV zLnVjx-w;sm{)YKrUygrnigWw*mtjUwwIP-HCo{MJP5Kk;%Y)FRP?p1D@uuIs&%Zam z`uI8PmYW&O8KijCwB9-bo~T6C$Th_^)yQ-LXd3ef!vtv7*WZo&mARp5oV@xt?>Svc z@G5Acn#{;@E&Gq|?JQGdaI9s67WW z6dc}EY{cqfIOP?_)# zzGgndr*P23|HT_Jv(Kzb>RPHVYP57_LNv-}C0k*({*p2tDMTVq#wQ(7 z0IPqxhqDN<(b;l;J~}JM8dL^V5Wf4o`p}H`3Ed^TY*SHqs#=dsp^Z$nI`6i^x0v*2=(B1vO}i7AU%p6lPr|f ziE_%RH`aOJAoz{Ic5A*M`#u$+12Gf(XK_Y5Sn&0HHmd*h1@n{ibvw51$nbU3lh@-` zp@Q3YSo|8L)}dp}PPtg%t@{;lYih*Vm%FGj@TCT#wdHZRVC0W{vbQHXqq|TRQ$fx9 z&8#E5JRN7jBzH67m&Y`xS&Q0}L!YHQdvElTk4F3P_F4?PiiK^pfHxRFwXhmwbLfJj z;sGFjA)cz;G&xAP&;@ZpCII2Tjw(eP=}KHosam7|Ebu89g*)I4{~Oj{yccNDz>;1{ z+cCy41hC^|sCU50BIkBNW4f;SyWjCcC#cvL6wHL(Ai3EtTR=(vUpiZ z@fV!8>oM98jPNaR3$+IK04+`?*2XNO0*E2IQ3*C?9(6I0Y^iw$m753r(L9Tlsrf>< z?z%l^^rJh2^b^EyFhf|QDG_cU-He(UD|F(-;8agtccen%I7yRA=!BaDp05g!2@DX2 zI$u!*Bm>u3gfGM@_@d-A@TEVS(Q!cwgR>{_?A5i3;qXHQ>I9Serh|adnF~B70SpPw znv`lE7sknFxv4w%pY=e%v55e=C0=v49-V=*F_yw7kT!x+jfaM@;$e`)Vrq5%2wqz% zl#pjx2XjDk$J2eC6(AHqZ;|3JNOS#y3=~17(V+cCs1ODVD8Os!&%zjbN9jg?mLiHM zHhgKE>ZLKGxubQ~+b|l`Y6_tGNlejNQvJrLe!N_x`k@jbG3-s1Z*|J(8qH5yv;I@( zLe*xWry86?+IiAxRUHIX>7WZ}4snI3kANBd5Gq1HWJN^!Aut2aw8&p=&bhRThz>0) z?)tl>`%1-=F0h$Y!1>6CDL|u(1w7RN2Q)F*Z9XYy00CU1MQQ}=0w}P%fQ<)7Ul6QU z$0r&vXM|FXX9qKxD>z%CMP^odiS834m4d>oOF?OvLYDMYJpp>DYI6vfqM7O$Y z#0dQ7=C(+D!COLLbc8diwC!*C`X_GJOo`IJw3|5L%|@iSra+IU9|?BCu5S{gJTNXc z@UEjfgm9FqpL$>Lu&~5rW_ircoBd$hU`l3T;S8dAv#C%i!lXhAVFKcswTu7`xWbJ1 zb9b=$Jat#~hRqwFC;K;l4sP`^KfuIP5m?O8_2t>L6A%KI;w?vX->gK(+C%z6HcPho zhFerKhAVuH&+l$sZNjNoEFsD+Q4{sS-(4TINF<9D%nKKwI9~J!k8}~<9rI={hKb#+ zqfS)b8^A z8SQ0Zc$GUwRbt&5si}pLZY+=vJ|aj*#KD;0--4=0lJ53J$ReHGZ(hWDlBk3p2*A?LQ*Vl1G zl=*YN1@^4y-`2pESz!G5h{UK_?FdGV;oUH5cDITdauRCvNj(%|FcdTyT11oKXe?hSsW^i5Cz zRA}}EZD=%j1(`xn(Po1(E5LEVlm2b-9|*!r^8k?-pO}E5mcR_dge^r1$OL39@uD1b zh*zPDqE-9{LfBN51e0+9;uREDj9q9xWIcrIMtTX(l(tdT13kd z$tXxQXjwLB$upxROEsS(T7pUPv4#!V3|K=?a@qdJF1|%v%%2awl?UNl9@q-LwNO~W zw=6-LzAvB%2qMxlmBo(g7Z)zzEpX@v7nsw*!Ue>VaN#GVdJrR}Nj53GG}%&!wn!WCu|UsnSe!Gk}$)NelYngTCi3Lvp^b@!NLH*szd>tKB}=AifLqdqGf&L30y4X z3AJWk=kOA5n6rBKjo&VGq2tE|9^ z1C=cyHM)o8J(GX9s5v^314sQ}GTHBIgS%j$H4*Vbi_1rSlW*@G6||vJ?7XhXsYA&uS%?4iwK@PHD>ic8X{4LBLa*%MSYtp zZ@uo?)6bf3p*7z(pXHY&UwWe2wS22p6ckV_H}_j>z?Kvj3CTt)0L+8C($&7k{;XU` zfS%)+Ll;1(;;BXdqcaqje~%xDPS#Qwp|~#OH(TZATQ@50v{Ye!wWFQ8ju+ zJ4nAcmR|s(t?&Y+x!!E&nx(DoTnqo!BNHq4i8NS}5~ZNMW%}UV0(~U9kGzJ~#-M5p z;9!JM@^P5sTh1CK)yXr*r=Jjc&5Eoc!x&|JO#U}zld2dgnL7+&aD>3MP>ai?7V`{l zp)$s=C@0r7?53j#bG>b?IxE8HjS2huQh-|QTTz607a9kj2-W=Eg5xqP!n{d}aIeug zc$O4l)^QgU;m}HwnnJyyk?7vR585SUL_-l4xEXj>gr&V?MYy3v3sQOq!e&Jnub*VA zBR7&FOl6HC?4cZ_2!|hc8DS4pgnL5R_{Iq9z+)-GdHiBiNfD+P2-^b7FQf?jMG&p$ z(Zg;uU*@UHc%><VZ2<%{y=Ki< z_^4@HKsvwyuU^meR?u#7^3Z(wFykRRabU-)Xb}&S=F6LehjxnCAmdrmeC-(N7-W}= zhv>ADnxXlMDuY2a2#3W6N9-b)`NW?Sg7ptVuspC81Z$zNh+x&4zAvB%=%S&uns4%b zG25+M#hPWqH_%t$q}F_8v{L~rsnL8(r@j_tk0mi+bkclbC!$XJtvfdvnlDvTSN5tD zcvXmW#H&(}S-M(5{Qtv|NwNw7w+!7i!!#X2uLCTK{P!F`J zkmuATbr4iW^rHgPAWoGsoGQQ)jw{uyM73&^VDHo_LkU&~9hlW9!AwOc!C;VDUuaKb zSF<7=p>zU|`w4i&1XD0}hSFqmo=E0k6!dW_5!(-SGm?y7NApFELhDI6>z_WcgrM)e zd)xvWK#ZeE>#jF@pi)Msw;!jTe-qM3sxN*+zxL$N6Jd8bd890cZk^64ZjsL<5?wVN zu@9}TwAr;PwOA}*@LVgAR7%Ue{Yt*nC4HFoRNsP5JTLaNmDrkegv8QW)~6eZNTXFK z$Kkpwr9o?kus6}fXjog7!N=bIS-F}@U5X3gj=uf4ob71E<-Q#~INPPdd8rlXi@{Ko zC0H+KN{t1fq%VdBp&~4a6K&Ee19ESx^`;QDP{m>)o`l9A5UWah74`%pI}0eKaw#YT zunYM*?ZJJe?H1DHBg}~gmJ|}EK2;AqalK8bX!2`?`lou+pV1W>kDh*1*K+rz0*oaU{OP73QwV$V5a?E3f|wjOz@|Uw zu=y8WD9`3654BGWi}&chH!1o1@7a$aczjmy$Xb@E>DSbeIJ2~gmCBjeroXP2jI=7e z2wOh^jXIi2C78DU^xvyQsBwR%r)l2leK~zSmput|PZR8&iF#d6@4k)ZJSAPaxL5W0 zyXnuXO0>d)a}TCZ>Bb*^>Ga>}T5Q9X1cs$YLN|B>a?4&7v87p$uo;tx63M|5w0A}9 zOx5vCIsFY)s3{Zb7JOcRsdw$`qnTD7^o5uMvo0nn1r^~q88D*BHvcedzo-I2Hv^J- zDwF{tY0rzV#@agWr6BoS!jmk3QCdcSsZ4|GzfnCL)hEv^S66Gd+@P*ByrF)Oj`i28 zRjr_lZ*xCZl`hUA23DOMH7p$J$GZ=4OV}+!5imt^E;f87jEPF*&37$qfP59;K);Pf z`N8ephu>*FsUyv&y#j(uf=!irK@)R89v~Cea7arn+mjVi8I6=PK)VmKUC z@Ke+~u3~5JWKUJ>Qbpp6X-e6LNqD&q0#RLQfU31u+!FnLS#Nl2&n>;8xAUsrPL$hy zWp9_Jm|yjlANej6t>tZ<8t{|>Gaz>?4}By0&8kE6oBfOIp;Et*Qn;R689y9R?tbs4 ze(wl_wD4ws8*@?>0sxZ*4(KcGJfRCl&Abh%V9d9;2q>>2{G=i=#Fwq~T^B^C6c z1mPYDhbnjyv&$2?@;cAN$09e&0y{z7Geen6Qd2xw7L%(DNszL7-m;V^tv=?`8t7u_ zmaRl-I7(9*CbLx9tVNr~;2Qy1h7O~VX`^9zaQfckQ{cW}qhMJD8HkSuWK}l$1ZNPW z;D}N7o|jPe!b>QNI)>ktxk)_`h0D`QPc#AoYx{)xvy+i;!H&AZHprmFiB0Uenxy~r(-GAMO9#+Z09N<9IE7>RAmWVxgRw5R^i0H z`oVY=K1f3#29hAHP10W@6W-=%mLHn5)=LzaTFpRrXPG!hFFVXRU?2)u9;^gz&DRjJ zm~T^sXoasb6!{YE1ME*w6@U{ru?7reKyPi?Nw6LY*05T`nw&|J#sUl$6Um7H7kHJx zk?>1Uq0?C$Q`w-t4nQxI^;eiqbXVUih$pVL!@}d)R9-s2Jr*0Fd3Lo-8b72?)c)FTv*bO402y1n?$_s4 ziUZo%hwkR3U||amtPC)Ucb1cHFFQVqkk97#luvrDCnvf7g7t8vM(JY3b&JSaA72G6mI9^;KG^R-%uX0qKCHAf*}wu&NhA zY_ba&G0>itfp#sL))#tS@DXIIc3yPtb~B(@qF{})KlxfrW=0E&JRsBGPJp+C69B{2 zS8T-40}N4GQhxB;kE5s655DIk7khiJD0=m`KAMvmmhCCz`?&%Z0E7y&fV6z8*1#4)5jJT< z8w5uDT8k3u*{~E9uRa7pRv&5#rCvz|m1q|)`uoTtCOxETnp@4aeS&MLaN^=2!{|gi zgQ4#*#Qn*)7cpxPMR+CBV8Th3$Vc-Yz!FwdtMkqUQISOocBKLK>l6_N8LPu?Sb(A7 zUR0rm6DWmuhN-LB*RJ?p+Fk#=oG8p{WCj2PLX==p_B4pAsQ&2#uyvS1XG8r5-z$Wu zhiOCoSMh0^CZafj6u2l-vn!Muq+ArI2eMv^)c8BUPmN3ekT3>~-Ws{>ex_)TiL5%Q z8WQVdd~+F11rZT&Z_5`>OYM1m9Zp@{G{ZV35LYT@|X8`T~V8GGt#}*n*YS zM5+V2QA;9d4PyG+`kL>Ub+%gAVT%V%w+tcIty>mMDvV+?2vx7|n*#IHc?&-#!8eO@X}9s2;Nk18&>Xa`VIk?>AqG53WaIC0xPEf zyJm?ZeOVZ}JST%R<;8BvBp1b0$UvcUjay%Oy!-&7t^AnDi;WO^!?F%2Mv2Mq6s`Y} zc`9ShMXpp#cOV!WaiF0-*N?gt(};in+?+yH!K^X=!U11t{-SiB(q02c!SqIw&ZKGF z>K;02Oqy6{o-{*EQ^rGP3xeWj+q-ld%zwbh*G!`em~X~3QnhfbnMT1L4E-KKt~Yt8 zT)@zUk$d!TI|RB$3@(7Lgjv3Jr)cM)F6^{PQ!!_KQ|XfcM_O1mpla`~hJ%)ZC)4d3 zonwlWn5vk(T6zJgVkh{K65i<%Utu-+5iw_eB)hR5_z`i;egu*Y>Y*QTVuK$6@IgKD zBT@tU5xw(%YC~FZ=ubZ=N;R16qZ4$MqcaiqQvut21PwHrUOc)4bj@HV-4e5`bW5Jd z-xGmUwBel3!b)+Jw=g?W8tm}j<|iSp?HSZsp=Ed4KGI*9sD4IKTTTcn89;ORs-_Aa z;kjeEKssQHhhiQgN060v#60-yAm$<2-QZzn9e_-D=pWLgD6}{;!KW8NVs^sYP{0d~ zNKyN6H(`-^C2d1EgAk$aG4z4r408~f(b*y65rT;(66+Swe9Lwqa|tn(n))**0+wov zA2YIki~2uT68xK3JNZ!>7^-PEFK8rB0IZ01O9X0wlS^eq2f6?>GKyi6D##tn=d3oc z#*31Wc(E}uK**%$_s!||8~t1E@juw?2HoOg_8LkakC-_7In5GSQm~;-4NCm)2?V=|7O&tc73zV!v znUdM*0i^q4l(KP%b%O&WYig~`rF=Xmj{FCH$RhQZz_faoK)L!^BL^4H2bSdIIJB55 zdw3Cj_%gYgwfI9djmMOWQDi*%wjx~q@LQ0_B;iqmQ9wir7{fP4Ay^hh zE*&_JoXujAF1cg(f4_u#!(WYziMbUZ8DbJsNQ**3IqrIs+gs&BjGkQl`;}HZ^&Xb< zJHZfmAzj9b2~L+HvrN=t6_Ywq_a^_b--@P1oJG!DEMx-rHAiGq>@(#0qFnEB<)A{| zvW36A3+#c~>mzrQZS1aB_O^XDy1V{zr2^)`AwSq|AMC(ky;Ii}^m7H2_|)18c3{$$ ztu9~W@-*?7%fr?cK};WVlj*}QvSrJ;05c+NJ%}QZ;x__(W!A(CPZAa;}=6v+X+iopS@~ybcfZSTQmKAp; ze8EmDV|`X6n;tzHJ^H|i=&S@jn12lYF4zFiv`8$507Bs$G+OX}dp@U^Xl+h8{pDuq>EJUOHBaq zHOTdKcWU@rA8Xo6dXFM0jfS7m8LG_PTHmVs6$LNR_T=>o)?Gu$Vxh{68T2gc&c5WN ztcS-~DFCHYi-#uzPn^D0D2Abwp%a-Ap!|ev&{}0;3hy*iz?>LLZXsmgb^j!2`dyR$ z=-$%7;+i^7DW-(6)9&Z5+)3J}tTbZk3aIF1B*y?ys6a?U#_(X_Qz@Au#W1nZkHU_= zg+_6fsVwVHd{BZJtnZ(*I?})Ukr{ge>5g&`oo4HK)x#r(VmGRvR}>WXc7Dp-vjp*9 z0)g>8)#my6rp`C%3uTFH&W{OSZ{Ca#e6zj!W=pkg@i|=(H-@O2)dbEc4*2mfMn23V zAGRa6gRY;4$fCu$J$eP|N?*$0=nEXB!NIWmi^GRy-5GE*-ofmEsY9wE6IRWHU=TuU+HdN~Z zAXb|X3GIbQ()hU&o(bCZ$>mObCVEG8f96gw^5_IIr|CrS0LyVBJG$(_eV`W*kc43( zrw-NdNK_+MZ>|L#@f7&t#4FVRMNVd_Zl8tPc{uAz_a zJJZ{yC|ywM%02?~KX`oVj834-x{`ksS4dMQp>#Oa5lviBE+(6YQ!gm^W}a zlnH=gYtM8gqpr_xSnyG%`Wq#Qqnl0@ z%t#q+$p}3%Nhn&RVGU_3hD6wIMFK--(h$cgs0CLWweZFnbZB^yMrO(7{fc{<#VVK5HJ#2*YR0>7M2C`ekQgfzSaIN_?>qc*?pi z^A(cKp9-i@L5?a;y%N4MM20f80K24h==s*kAL25 z^?Lf0bc;Vqy2U|tdII`jB3b!-Y`md^?=3-`&}bBQZtvL>j4{hVSJZd8vpnXiPym>q z0H_Bj^5Mz?uz)%Mt0fT?<|CEtDTxCBmbP*40VDcX|3z8cJGke%tcpLlMINHSs6d*_ z|FPnK76v}nJnKRXtC6|x za`%?jn_KyL2lcaR8ajDA$?2#HR0!`uubS+m*<z+z(h zh?Ydf@b*FdyyLSnm(ny4PV~T*N<34}cdG4*Kh}2+)hBP?89}#)tVJH$<}|%SxL$k? z02dgp$d4(1hn36mQ2k|RXGioT+7NmO+LkhhOZbb0-u$Sg$lm-|HKnq>`4u7pi}q?&1rToK{z!;pz0uT{N`CR7&3Hr>Krphqan~n2yn* z_T+|t`H0!Tb@b<{@RcPt&@hT$h!SEHPp>cWTwBMp2bA~`w{nYGdAALjQHsq3xP7ynFVx>LYzpGjk8=k z#U;j5mFfgt(j7?eyJN3G&p1XEQh%^K!~sEu<1?kN<<%zcuuuXg&ZJtQoPlB6O4YF4 zF=(X5&5z0E-Qqif1nkM1v1OkaPSmqw*`Q$`U_1?cL>)Q3MGEipbMvu`h50e$-Mqn= z0YBHhLD^V-178c~g}l~w6Oi+mAaN`L2kV0@Itm{+%>vPKuicJ%O#|YUG`A&z%yA!x zo6J#x;dYu@E~G9Et+`sMBT2a#fEf14{uBNAQ9B-h@)i6Q)lo&@9(_?*i#M-_cl&0! z_kTrTe)P`~=3rlf`qu&Vqp0sNc^U}10!G}l6L3_7B`F|38X|8;8r;r{!&+Q5a2sR2 zi`(Y6e)E?HYf znAhB}Qo>Kt7!JD#oH+&;W_(v$sPFwInCFWs3@-LL>kM9Op3z~DXGM@+6F_qdmzJZD z23(J4Rkb_gaL4Pb!}>$e9Wi&Uj;xs%92{9hUgo?Qg@CmdMGnu7Ko|h`NCx?l zF37nN$d3r*yPAd$$U)}6NRaQgYT6}1&SAKM$7O&VZD3FxvC&bHyJc2Qs_W1O`2*rJ zLA{HPasu-xb7%Yk5!RIE@BqeelKjPZ!T;v)zFDOJ^;JfWJ(rAH-TLWiA`? zSXzm_RFz~MkiSv+r?*(Tx^a(ZH*>r(EX=yx9M2nn%t@g+*{E*RCpW$T@ep2$<6{0@^J^`DyAaYS$RGORb>EH&=Y@o_VBt~YT7XC z+i7d)tC_lW7MADYNVWM|r!=*>#fDNAh%sex?N|ygv~Wlc89KB zYHf9dPJ)$~OsG*~S>do;wx5z^@RDpUeUrutdh&V7`ZSXu;*d*P` zK$bsLv_WxHEa9FMM=sG@8p9SR1Z1>@Q0E6TTJL4;9y75d+xs;b*s69F@TfYVxW=3tTruAS@A3GSMI0+KYu4L|$9T!%<1% zn*aU_%7W$fYxDBWW261~@TDx@#G;KCYI?C~@JQ_5xx_B%J0XR$A|HG z9ke*I`M72uD5k{`M}=iUEWi)z_o@Ds6%hEaRzOsqw_C9Yl2$XC@2btkMGn?GKh~eA z(g$$*MAfa+XQ(uXkFr=dLknd=%clgpD52~)S$GbbQpcmCq%W)A!YAtln`s;lJKJM< zB*mZYx|?cnGu(0xI^6LcB*o}_8r0d@=4lqsX~AyhT{&#uUhSd|y^STfi|_p1r^}0T z7PDwg6BtkKxu8PQnU)K6idf-c1O?zA(ZHr?D3(NG!NvoyAKp#6w$vca$&>!gggw-o zV0m6O$uVYj7t07|2N0*-c}2Mc9l^(J*?vw#X}8*ZB*l`lL6!fpm2W$Pio$7bb^}yS zQ7cWdff43{r({oaB3Gt12qcKHl$Rk!;YG0;Tgg}s8Z7qZt0)Ftw zI$;>O5yOZk3?E~J{Ipy=T%fGt0P;ER+F(0ir`kwY3~xV*p|Aig)>b;sa@%>vnWwJi`KqaO<;7{GeHF6pC1{oVi8t8d3CxwO=O(5Fnt z`Z}3A*|`Z(wGO5wH6OvF1G0jH$<&g3V)4gNhxP<@t*Ei0B8*ZMG$Cy<*pZCJWa)t$ zRv3p;7~x3ZhW@e<0wPfMfVDJpHCuYjYgFyK-PaH{Bs*KDQg)5>O?d@3Wpebmm>N~Z z=!pz@xKJSMbXlF+tyxKf-O&xNq!~*^i#iJrmX_jXMX8{#Uj+KLwq3I_H3w<)W3Q*B zH`sOuyaA-kZ_F08kl)&NyYi93dg+lud!$pK8Xl~W9E1jf4FFs2e=y=$SxXIX0wyz8 z!81o1Fv(L*a*B6GM`=`8mbbAW;Tjc5Iv)0>${mZ4t;c11K0e3pzLM`*rQLrVTL%={ z=NQuCM4%xoXFIaJl~)xge;mzctu*@#@fmuXZCjQwLIw&mK3lH)3ZeZj!kP89vxL!p zwO(@a6?htbkTsl|5IlET(?;5g*!SACi zVle3Itu9_ayFt)e{~tidpM@?a7+){d@SNS+MHFW?p~WCQ?VbuA=w(vzR_0qC;;H^1 zm>X5sK+50>&0*YUQWL%f!+tSxV+fVds&)d%f`uB~Zf9qeCY9&h$ia1Ec5ty|MUfz- zfSRKtlQiJeE_!Sy_^wvsiI{NUlttp9>W~BiE}ReuE_R5qYl~b*CLF4ch&vsEI~`h* z2{SF95mt#zuy42$-!hNWvf2XYTU-MRs6_*KW#f-BD>2_vpySm}kJ4bD6pzU+FpDlu;O(cQ1pC`ksB-16I z{UN%+)XdY=bbae=GdKr(-kQ*-0e)ZkV)XlfSMN-jAyVn{RV{&}tB+G>U+D9^nq zVYHSKj$Y>Ubb>e*K|h<_h~6&zXBdX7sUm~^MW_NE_ZJEJWvaLY=oc4FE(LnxrxID< z-Ht^QIq&%c^k!(|;AG}vK^bx@%FQS;mmYW7OsI?X5MY3QnnAD7s|M@25ks1aA+5oB z?6WTDIoooXA+hwj57UWtb6}mf!A-x2ww>S#mq*cO8fgiq+M6uQw z_E3cXCa5+}_AoF&iqC3K{nm#iZJwgYse1Kyw`Ex);xjpDAqMfETde^u<$A)uMN}s2iX3iZ(twpw32-Klsywx^o$y9yG*1 z!>6FfOV%4d2d$B?fo+Lq7$$3H2kW;7D!!o*wg2M!lIBGBC$Ch+RXtv^0S&iq$=Ps$> zcPEN^Ly=^hG}7w#;X@Qt!L5WJ3?`vJc)1r_0mT}Hvf<#=mYKTMtyQH`hj0?XD>p*& zC>39cZZ*WZ#1JXu&-9k}y;D8psoo^TNKdiL4xzvlRbPf2GedNVhN0QzY1lHhUiEeO zU0L6ARra=0exI_{b}Z%Np}Col@7>E9R?4iafXpw7Ft^49i}ef2);IgHeyZe;RmZbS zHrZ^|mDb}J3(=+CsxIT1I4A77196&;te=}6dXAiG8x;?7 zWsmjli1*|q)cfhu`->NgRDhg@DllFtFiizWrKkdfl>*TQulniL8Z`je$@(49J@3Qb~wk^D2XS06rUM%Uy>yP!` zRKM>b%+Zfd|3^sj=X+nhvvt#tYA%7s;2b0*&~KcUlXCa1b7eu?IsN5to$tJz?Ge>| z^F#N{clA4^m;4aze9!#Id9<-%{$zL$pY!VIdFs~v&UQvwq_Q@6T$b94Nv~=(J*_C`du4sR(T6gZ5U)9z*&W(P`#S(8ry7Fs)S$mi1NoVL|^D#g=?Z_BCxkl3Ka`p7{+l%g;oO-lzfQYUebuqo>vR zYSQUS^kAoHeAYI8{&aDEepR)heG&CLKHAfcqOJO|w|(gug??~(@gu+d3Le(udQ*3D zd!GT@W^=!Z2OuM7m>-(dqk2Py9{G(yDnmuSjS@Rj(zfbPtCgCa&RjpUkxG8L$8|1N z;~?VY=I!&jYTnKZ?+dQa`+sn)Q?ldwd|-Wvj_dQ`14^{6&j%h_+e*jvdH?zn&E9~b zesp~+zxCtxft~`rpITqykso%6>nZW@;{F15%8&y9#8et=NQ$G<^N#*UqvU6sty7m< zQZ$$J#OD{daZM&GrsKiy9Hq$uQFQ0&B65U)ddLng&^`}AG`ooh*H+h^ua2Lu zt~q~UevL3~M`g616ue&i50OV8%bobZ@vO-|rv=CP38c%-d-KopS|P}@Lm|B6Z`z-4 zJyJo2(C+#9JOG{%GiY$A{>P3w(gROh!FdojdqvB01E+!c} z;SK)E9TiZb*DK#TAHGqZrx7DLb^+djl7v5ocNePNI|$n6j4!e5E34rfcFOGy!knwg z1;)7PzHQurCtqJe_JshXElI2rOx}o2u%jhEtjh{g?U3Vq=X`a;`Puk%A72-M>#&LQ z)wSp86&t=lY2CR;ruR7f7Je`5(2`rSjwz{&Kh(R2xuD@{4`Rc|CRdu1- zxiH%)fj*@sD!;2`Xqb;a+c~e;34K13J9ATmI#GR|6d28c+h>liqO>D}`C1<^n)AS! z^e22Lu7828g@>z+uOo4heB}m3)G7ydqttAj@tVihoj}T)gcJHb{evdD7ZM6<;^+cp z@sur(nDH`WE07c%d48dq+;bi;t7et2hd|{pP#FRo{Nt=u0S7`KQGTl{0}dPK8QxHE z003L+u9juwN)`YZi?De24wl6E4M zG^bnXWeVoHdGCbOp5ElE+6*ORHZ0;PC?PH-%vh7n^3zT7$aBUTO&cqqnjhC zaG}b@Av`TpS4QMDG{Th(#_C7-4Ms@75gR4o@!)@lk2RtiKLyh7DV-`@MR`}5Iy6{)<0iX<*J zJbmxCo&NIsl8&@_&s@1SLPJ8_!W7U`v#OHxBevjY<$)TObfb>yFdx=JoluPC6RSq! z`yPT!8`TBnsT#i>r3B8m`BrUL{jWiuvfjFVXCu*iN&r*JQo~(_uZrD_I~&5$?W~b( zhek5=v#v(6oi&otaqK6(Ng4_FBbb*p5(-%(ahXOVaS4;cc1I)GwnpNTp^>Cw)=0GG zK0lC`!yI@zg>I9$ZQ$Z--2Fce6}ZhfS?P3bN8< z7(R~VVGXNz9q^y9zR!vwyFAiT7K<;jlyz8aR+~Z##OHQ3x)XM8d0cXb+FV)WU zTSVd5a7k3yormf@+d{OHpdUm)Bf0PIGMM0oD%x7u;5R}XE5uUXf{O<*Xi)yG@M=7? zbaXDW*F1_b5;033Helhyrt#JV_iS`K^Kf@NeX{KyBQ;jK-bjGwm%cXto;+GMXL__; zi-FN?ab|ul=!&iW`j30~vUxUFr;E4ql7A&(p~3MRi2fyH0awE92q1#aDMSTx)gcos zUI<1whb7pmVg{Bl%V^Ne#cqE4)BjkzUNQ^fSB*TM|Nf(sb{+pb{ldXuJ(X|L#4mR0ojc`cBFI;MWNXzxg4V4r+z>6#;CFVp^9F zCs{LJ55@9B#?gw-Dvc&vikx=H-Bz7+P;0^rLS5ox2@{I*%`JU*0VGj2vfSXOQ-gF^ zNJuCGeP)JS6(6W7Do)+YrLR+Ln7X3mdE^JVrGJv50OADM9(iT3%fCYk3!oogBX}B) zIjkRzXaq{i$!Hx~JBc_(+tPQ{w4`61TJ}N}J)b>eqNN%>4w6zEUjGaaK{L zfAnoItKQ^8!(yxBODa!DV-SJ?%a`-R2Pc_x((#|D%G1@YeJ!2~3wS{?M*VoZMaC-< z*(s^2^I*pz0!n&|Cy|Wp%Gtwjas$ijsPq-Q@6CEvI(D5o-%P2u3x^G zojH7tw1(=aj@X1|_N)updG9?LM3$>{x zQVLC?CVo;)=E~G`HRIUQL~B{_nEI<(oL>^~AXxw&ld7(oOpKmr@;(}1Cks=-PyZJ8Y?U%V9q9hy_H&=ce)4}u%BAN_FcT=%4 zQK`F7PhBLY@g4u#?hyF~sPiI5As_Egzdf4vAyMkjrJKHWUCX<-cUpdF4FlEa9tkYn z-IFlILH*s2roIBWYKh(~7S=#i(4>+KO=p|;vrCU?JusJtbeV8;4(7{f^s>Ns*=;Hy zocYWgbMl-0Vw_niEVzsp^%iL2Y~s)boYuQ6zA$2&Js};{1Al} z{hZiwv2#PDR=`>i3EhQ+Gnhw{UmK;|RtgKISMY443Y1PZ?o*MK_X|i4|3uFZ$x~I3 z*XFqRJn7YvnV}r9gyTZ({Rmp11!hLNLL{)2ZXt;DnIo0U_jDz~7WE?MGN<2Yh#oO% zY|W_jg!wI~aSKlU@?Nk0@V%t5)w)yXrjy2YyY8g1EwEdZpk}@$ZC}06IWKb%;TJDncKn3zX9z3MK?Iv?-$19HdD%m+UTeB+<^7 zN;E$bx?G|%rjg3XvCd+lo0}p_Q8Oi$dSuaMmXK6DDPGy*P-OLLJ9L1)uTPlEfJt7!FnHe`2EcQ-&?VfelBTg2^q^7CCYnvPpG9ZQP?Q1~ zK36LRaM7j!*6f>j!0Nkad_s^cWb$<6juWdN%)?G-A$5A!HzMEuc@NXmerd)Oa4y@QX21HKtjmR#Lu@wdHZXH&_5 z$MyHHS42tVz_E?`M$`j38#>T#C^H7EAt74H~kr) zXP~~pAYmM@9Nye^3-_4|%lU}MJg{$O>=jfn!j zr5_o}Wx~mKS@XfPM9sZBgp%e#_k+990pk%VJ^g6hK01^hk>bVLFS>*Ei7=`w?mzKkTC2IP^$evui=8Lz1yz_`Yz;K|Tnfb+}x zoFmL{{r~bESvb|)@D&Av>?x;OufB+5fRd+sw-(aSpMD0zP$|sTy!y0Xv5K<#)zf|j zJ*>X^fL~$oufF<}yTQDmFe#ZVEODhjA9We%jxrY!&X&E!^gA_g@G(!@l`(BP1b~Bg zE|TYOb=t04ownnv({}CZv|Y10ZJ0k;Jug0Olv$oOcDP;Mv>j`w?Rvn{nKrLX*yjSY zkd{3$iB-ToA;3v>YYr!Rw7=FDfZ*xPdO=oPiouU{+5r&HR=ld$X&6u*SLqN8uF@eG zJj};VkP(-=?m-y6dg&kx4i#BE2tx;&`m~YV<}i$fN^}^8Z1#n3c6`@85W{ex zBF^JLR*DTUBAf!f>3`B%oQ+2f_B!Y!44bZ)l~LJm^~*x1vo{>7V^mf>sA&co&U)o- z>O;psWTogXFhDlVARCDCbIgRdc9+3^WgrgXEN)>`!r+d1NR440_Oj-ysc9{Y-sJJ@ zeN7*~{}&`DaWeF3k^GOoZ@|tDEX{h%A)E#S>k~|MJt37V|IGUYjv+P3U&9X^Tk99; zeSXzH_!ZvggT6Z8m7>#91AN+lwMgs?1f@RDZr{l(_c0EjLg_h9fL?tCscP##K$!@1 zt!E0L<;_5E2GabQ2yX~fdV76=1E+VE$pm$gRSMM=YBS@UKF|Fhz(M(kjK|q_R|U)@ zF!s4t38asH+^UC9>7|zydjRZxMCY0JrHmsDg^>srt5x$n6_HoIakkS|dh^7>o9_~B z(#Kw15g{oR)Hg2>IAj&ocR_FI(q|X+>Q8BW^{0Mz>ot7KW>0SZ>2q7JIm_K+|I7ch zSO3pvbosI0U_t6GU%ul#T%Psi#dmP|Yj29{i(LQHbH0AxuYA*9{rBVXpT1_Ve&0{t z;hX2)`o(87yfi;d)^k58u+%SSj-LD}Uw*9M`dv@@`nSsIPm514eDbG1<98=1_R*(& z`F)aM&wbR_@9oDYlkd+st(j)X{q~qMJE-y5Kz4cI80~wHlcJbaCHxfv-X?nhq8)#0r8VbdcW z1j4~p8E_lDQj|xqpayC zP)*SB=N0rMpD-}&7U8j7@(@luw$}EC!;+yQX(yfg^e0UfKKq*n1DS zrjqV&JPExi_O6$RU8;0N2_OnK6i_S(0Rn`QU=o@QRP0@`H|zy_Z`iP4#ooJOFSz#p z|DJo35G?!bZ=c=Y`+nZf-(9_#JMGMwGiOelxrji5PlF^_WBfzkozo-r2Coq9XN-Sz zUsb19Y7Yo0jK)m_weh(i^>ENP3d79`CyMBq`V(MoWY?iDhm$R`8q`YqL^*vG$VK49 zK0!eO%lT@BLFaQp8k}hJpsAwoA2FdFImXi%O&W^6X^@GuTiJPmb&c36eN`St7W&LQ z;<$P7*2I-~49~29Un)hG`s3K0093;h^4O1`LX87o0}4ThYKFzxf6*vUM3!EC{7Xh% z@|LMhzU9Cch}cNJ!N$SLuNLI0fPqX;V>3`UgUvuC`i29YSQqFPN(3p#^dE6>s)gG^ z!Hw0XR)A3|3hS9I;+HBCI@AxeV{;%ED>esmv0@{E-<38FI`fT3sfYEtdh#%9^!+w# zI8(GVhjcTH*$jJRzzu_`X7HrB)5KG0KkAlG6VEfN z0L(#B7xAI=AEQ_78!Sxr%?S2QO^x8Wfpd5?gRY=<#io~z7@_rg*4%uu?ocT4+^!{@*d3Pc(}(9+Kk2t;34e=$LUm^Gl8zQaXUacyYYbRC*4 zqxk?TD=<)2)&d9RG#?(h#(t&w5Fvt~k>7z_AEfz!P)T(DrP_n$IJHMhg+!XVYR^+W zfzFo$OTdPW)bj!h4-p~^JTw$U^V7V*#)HYAHNveET0E?gkv2f}oXurdHbo-~xX%%3 zGUk`bz}nJensB!OcqU?8#0VUZkV_TJTH?KRkIF|W>`*3Ye~&%*;iyyDCNg! zn9XER9@qlJYK-hI1(iPBMq~I>hy%+&4EXD>r*+LPXX=;0{X65R%`O1-V)$XNGNVO8 z8!4&rpxbPAHJ{MuThJ}=9Mxg*5Y-XM8qmX-b*s~dS}BB^4I>hG0WwqC>-a2%z}F95 z6z}+SpAO4i+4lk*@xZ+@+-H{=6AIPFNhj6>jEOhnBwhs8nk5L!amolaf_;Hltq2iH zh)4zfL(-&gY2w^ETo+JB%B$58N?4WGsv{NvS;!NO$ysrlr%Yf-1}23BUl3AX7i z^%4urFoK!O;ekV&=z&vDcve3^ghN}p5Ycd0DHEUpM0R+3fQW|2l;eg$@5^y^7;|)h z(a_y4P=Qew3jv|Octc_rL~#s}q^?pNP-PPVUpqp00*VODj|w-UGszjjZDccRx7qSECbOHZFIp;vKi~z z{IPr%SDvlUlm(l(8Ylpw3}@aztly8)ub!IivUq`LL0%w&+gJmsz7P|rm44Ne2uTt; zU2QNNwe)Kw8peWwZ;grsBB-#nsK5{4SYV67%(1xDkygo5f=;oWsE0=GL_{2O9b{|J z@vHV|iYZis6;?r`YR`@a+)lOs?d7T+>ayE4hSHU^l4BkeIos%^hsuR#=wII{T((5ijxOqWdzW} zw3)M$Lk?7$C*m&x&@ZG-AQ8v_W#c_ZY1ncp){!c})r=?js1WuGb~4o>h84wzJFwH;By^w0MN_s!D9eM)&vO1WW z3IU5g4NFG{13792s!N9?o734<%`nvDVxXo+C`&(+3rd5#sr#VnI`hL4n}KMg1_3|U z20Npw809}pY=E4I4H6E9RH_$&^!|s$ra=W8bL9jQ(yBVYAU4)*_^ZVTP62+!=|K9V z1C=GgPT+7r1ISN3OImKk(IUH(i$-bCh^77m4JRhF%?F=wV6o~k2sSQ`u>An~2$Cka-3h$e{s zLla;Qu&1$mG8s5AGv{L~;s^@mI|gT#zBb zS^+Gg`iS<_;Uf5Y8r^OJV#Zq?71_XSgRv3mCa{dMf3=>Y5@YSbY=)n&4wvB1^5wCA zN-`s{)9YzMj5H^8vOaw0(SZ|EI`Ic7oIHVs!iJY{Ctl#@FdBx#d0dGs<80{F{1M)C z`y>98ABLn84iJ2YZbrwiz4^mPpoLySP2q=eAjudA^CWbbh)$+aN5l2#{v4q5ECUXWE*YT99sOqO^U$$WMMFbeu~a!$&)p1%LxY4S*)zJ%_T`&M_+j zFOdq1)|>+GdF>$@CE~}vujC-&O5xwrkX+b9w1yO(Pz9(1^UzCxqjoTOa8?%LW`u^8 zS;U|i!~N>3G9mR&f~1Cu``GH*Mz9zxzmlsIB+liMWW+**A8NS=B6t(jch%cxOa!HG z%P%y>Z9#@~Hix_-BvkLiIPgsX3PvPfCq^XFw;aksK_WMyhxiof9J$m3Qg ztUYBHC*!IYNT@_Jf%H!>qi@F#Wmh7~>MTTXf66DH7xpwQ*J1zy`$brG5!wSvaINNe zfVeTXA9$8_Q0%s-Ub&^kGz(W#i~z%;>4OK>Oeh{`6%f*QAp;p&Fc_H5f+@BC8JgAL zF&cv{C-Xx1%BH1d_Sg_1*DUV%4EED_xP}q<00W^O%<2qeDXb_Fxen1j;&w?S0aIlq zQWW!}@3wPE3>~^}g3wqr5K<1_v8cfVVhNfi8;5|LNNf-&ryf_P0R zgx7?GD2ljdo3RqGEovLH;-du!C2-i_Aq0OW83#62E1m!n5s82V{6JjEsHub5g8)U= z4yeb?d3+Wq_9eN6xt9X4%Bo6V6aFM zpl@R};?P-%Q9m`oLy+Rr07$N;3nN8FsX)A8szNjb#wz&bSwqRMGxUE~gZIk}K|KBd zFLZ=P2#F1198iOiBw#oY>&UVr5Fr%r`;ae2{qU20#*2nz=_iUTQwfF8i-16u^h94E zrBZkavlTqDdg-K&uU${0tcz z^}#1XV}nSvA?1iRq&N^5o$!})>0;_x%O(2;sMiBMz-P+W(j4^nQUXK>jc!7R8p-uX z2fu`D6bocOjd{|T4a}w+-W)aWoJ!l^j^>b}bL?qM@I7Ei*8eu1c^nCL~ zIu1bY7L1iUx~B3PNqd z2;i*%{i#Dk$@|8kO-I=isFgi3l%XPpJ!zFafrwT1&?g}XO9=c9Di^G>REmz3n8Md+ zuYk=G2xH5b&}194(m7N;(_}8UOx_^21vD-Dbv~|>L=OP*H~9mIiPA|Iu5FfVSnz&{ z4U!Yt16$CHDHMm!^}%|J2VsOTQj2SU(vfDuaNP(QSIJq$dQHjK!!8flbSx*S1w|tp zo&`2AJj{iBg%!8t*f@R=0cQ_}S`2=vv9fZ6hCWyb1f}-ipGOP}yw(<{Ew8l)|EfH8 ztx|*n@BPfi3d#)M>@N);ljFgoi&og-V|vL3WA@YVS$`5vF{zPZ%9wG;z~i^bF#X>| zhS?9ua3?PKCp5%aXF)bZJ$h|Dcx3t^8?xDJJ-&g)udCx%2W1;#-O*Iy9soW_lV(MT zunTjci4IF3MV`uOh=A&8{dk;dT?Fo}TZ5<^+?0sC)R@lMIJGsk#`7{YiTnH%;6ZW9 ztQ!%Wkqqgun)C3F?kiZhd8Jl!1bA=}14cCY8t+c21=E1xv6X)v-0_=u4ZfQCA=Hz_ zoL_3hMEVDdITue(=5H<9G;4<)AR!%WNNd#oc|D*7bq&sB1!+lZ!v485#fRudgczFn z(b5@0J0J-)TzBh#Zv&?_t>HlAl)?0|9EkIelC_cRRCfn9YYEDr0rD_THFiX6_pzIp z0T)t0@&*TmXcL#Ai8UxO;+NA9C0Lstx3+;CeYA=FwKk3{2U^Fi#MbxoBM6Uj-qNc1QLDS?27@C=cO?wl=a&7*j(mJlus4ZTi8~ zV=Su2UL^u)iTzHCu_zonI4X2ij%v69-Iec;(dLKJ*TXHc5Ns z5rvFdAeoIG_yh!-hn<03ISlD1oIKc(b)?dV^r#?xD*^?}BMOn$I!Put?u`aZ3o}@G zsEuy$VE_R#`0#T{yAXq6T~f2v*RUe`+041$oynMjC^VVvA@%770w5=F~Sp z8Dr2S>hd+8+QbV>dLdw6h|mylMS;+@;3LNnShx`b$U;+En+OdfEv?N`o^EY8lCa%C z)WPtqSSNgf5Ff!N#1THgD4Fu=6_LHF0P>#YR+=3i>%k$Mu@%WKhmsU1K;%t{vXg;{ z#=Ia#m?p#oDcwooq*ZQpuqHn6c6Msmiw5X68nzmxAoyw|c+Sa90BVB6a>@Y6&K;x( z=yC{PE-S#$JYl)&P7+z(btEKxvr1rw7(eX|`j&^dL6<}S^i~~!bdX{Gq zuuKg4btC%02*GnLg?t^N00^XT5TD|Sh6r?s9`0-+dLky+0f?A%>#4UTbEC@Os!+nCfT2WBX>>;0Ts9|loflYv$;;`}HK`X|ivJeNMF){-L zaAJD#G*)2uqaaVdH}URV^4YN72ArWlun}m1&T-RSBYtVJHR^_rW0O96AXw z09H#b6w;#gD161Z14pcsU^P>a725=B0!XBrj=0Dby6}Lu3ZPLbG)iEM)DbPPS(8zj z-WpQi{g2Ts7#YM1Kx)j!ieNg>GYxDEv2oT!kq}G7?LKu z4=MV|pg}zm1J69-0!i4_M*96d2)_IuhhW?q;*KQ0{r5Qd8yD&=VR;{Q57P>`iYD;w zZ#1>~H%)CNZU=f}>y)EonPL4zARzA03hgs=#DZ;%78BalHfe?5Xq46Jp|}f($l)6Q!Y@_JK+ytg zkY*N-g&V>k76frxuysTjdGMfyav{2!O=Yth8`T*B7osaDrEP{sv}}nDXo-g0QQe3o zcI=DzP2txJyA`n80NzxO=d81=!ihAN6+~WDy){3UWMc{@9c!Coi7?C~YdGIK{ZwPze6q|`%9|vspVAT`B z^a9$zX7a25h)H2iPzc5xPFUuXunb9=Z$)g2xG~MW8DwTdxE$|f+VtcH= zog8guloFbeOp3x3>5bB+30(i2cmy#L43yf0dj#~ucEOmlw^oS2>$y4*;QZ*CWZZs- zmnOC7f_KmtZXO~F4w=zuSOg|HOf_KAron*;rpBYn26vb45+W#(1OWb z(xwHI(@a zK_+bCCcjJMZ=pp9j~<)?j70~WMPOYB=4?T_{YONfEd%Uk-t_4`Rty0{AndSj^t`;W zQ4eAOT9#G$kU05uGX#FZ-n7#R?vThAJ8HGn*MgEh4sk-VrD_7s^~ikw4m5)WDr@*5t1oa zg57%5h0KZ4%rs5`b9$?$G+0Cbhm;2V6Q!}={!lvvaAhV4={Mx1;}4*F!Wb-%-*ZRu z_BBQkQx~v(mN_yUJEddTxSb4lzi{#_G-;BN5M=DC2mYx(stB&5@i@L=nYE?nXzgz^ z5W%6A*3NS^G`A^&fvGd@a~V@PU5A!_*$hn$a65HIb{?w|YC6XXP-odpul|`s<}*xn!+z17JtbFnlYj1!aLM=n<>H z28JK-fEQpIpy4w7)`VL0TFHOCO2*~Sd{eIzB}0p`tSRrvx4OJ=y~D;*99hS!DM!veFJe|yvY&D}2l*si-%P->zq^}euJ2DY2MW3R(a|s3z-F)hW*1kIsKkhc1V&x5K0~{rAnVc_%hczTF@wLq5t1s! zi?EnWZJ|1LY@XQ@ft~>I*V=DlFu+f#5Y-q|@E<27w%^X>f$LcM~+|=AG#ps(&``rp6 zDT&l!Jzy4lkd8TAeMVSUY}F$!r3Z5Qr;Z4(75qk;X2GImL~P-w>wp0PadY-mxD`e4 z{Mi7?uz>%51hn4%*U&{KGhIi4FB!oHvKRsHBwuqgJpjWY2@C^V9=nj{2#w`3+V038 zO0Psb%jN9$_gij?NGmHn435Xr!e3Tl=wA7MMu(Zh*W*rQs1MJVQLwOw{{p(@IvQ4) znMRmnycJfdclqvMCVJlbqd>WIGKO|nHQ&(j++ehv=jOM!c+LLrfYV(^|2S+7v57L| zuoDuqua_beD6#M2C&C=-rD~Q6_FBPURv03k$Ggo)q26#tZxDWFhG>POZGu0U1N6X7 zgYL>i1PMZ%&=+0Q4X#5gla;eHE3+&){fiUEEzRF|_s>qjk86|UOcCRce}=%yXyvak zlkp9KZqOcg#zzPxLi5v*J{h7%-_OIQH5fKc%0miY$)PU{juKS zpkV7^MrGrhIrz%ent_lA_&7Jh2nG)v2pf!75wxNPamL1uZ^1xZq+QYwpOVx*G9 zXeJ^;DoYh7N~4)Xi7ZwX$24ao>B*8Pl_Z*pPDxIbMu}AtP1zJ#f=r$!V^YNmsaU2$ zWu4Oat%{QFn$pV}~Z9CE@W(xy;7F*51~^ z*`BQzEwNQ#SSpD^CQf7|3WZ$Z!AK~LfuzV35^+?VI5JVfM9HK7RX_kAAQ>c#p%JSv zav2cNdq8uKu-^Z-!Caa`!S>q;* zRLMk3k`)pnlIWI9ic-S(N|nip;*2P9Vj?gf(M7l;$&lQ>*#3fzyc?c5kmrWDP?GnNsE)n7%ZZwltf?#>^joLNzJ1FHArHm zGKn2n51{ETiK2-hn4-ZlWxzoy;7FAuX3%ntl_<2!eM?v*Run0Tkz;2n%}tPG{P)BaB}d~?#155qkt&4*2xK{l zLeeiqqEy++SyriJlE8rh0wZPug1U5O)>(Ng; z@Mx*5C4=oofo;k&MHOS?hUQa}uxHZD%j7EJ&X5Z*bvAAcRbmegedgzTo!xJlDy&24P$ z2!y}Z>%Uw|oXm-Jpjo?ASu{vgB1=z7#Og>AtCTkKm>BR&4K3KF$raJb3VD=-l^T;0 zZ8bT6VMcZ4O+B%?l~gGT8P=tS*>m&D_;&FL^#GB8K%*o?jmpwGjdWkDThtIMWD2oD zAy@c&f-{mOx|2wiiIqTX0~09)0)t4!RF)Bc3HZiXd9>n6OM=4#es*=H$YkiNO%q7W z(WPsZpr=_;FI{#pYA(U9e_#M>RHGM2qXDKA3WkCh2B1%gQZd~)j#xIuq)DN3I5HCG z1T@!bexac;i7YxVHuk`a!HtQAq8SP-|G}j`HZQ z@*fcae(3412=IS*)_xWuS+TLRTqX&ULpJ><6xuX#f)o;=vsxger3HFmIYcD3%`j7kmx zOT{EfRB`g?vhO%*DEm&Ff^q;qqwMQsu_`W{I72u_sQ4ihyh;YyDO@E@k^mQ4o+M5r zG-WU!H<%lC*_Uie_Z66~RK~K# z&T^HXJVh4$>)a5Tb_Rc4z&|-qA&-+rg2aB)gnx2~Oo53YD$r>In-xtHm~%Ht3=9Lh zwM+AYu|*J|zsvqYHt$tnK8~lL?=GVEM*oCLo zx_(^*`tN_r50=Y2%4M;?uHPPbmned`x&1vP>SDizG#FbTR>Xg7M^o-s4RPzyA1X9S z1L_&!RtkqzuE2kWxJ*#VOn|qGX~RNg8>l!5&Xx29Diqy?Icbo2BYTD|Iy6( z|F{)ay-v8b&>13vRPDK8brJ@Pq#VS9j2#-=mnz|Gyl? zw8mkeq=ynu4c!7qtN~JtEd>S+&fLhU37V8vLD0NNmP7th7gbxVSS?dyO4L@+ydYho z%e8tP=CSQeWCAzz)umL4lnQbMVOq5!LgJkf?U%ru)Qhu^(PaLMlS4I&v4N>IDvq8I@Sy5N+d$)ox)@^vgP}y5%YulPDYCNVK&~on z)kLW*0lqGFY&3o9?v&i*Co9CUa7ifS=@~XO7er>Hy_CK|Ic|26Qz9{T8~85vDUG;m)E04ebgJ^<(&eZqcx19ecc<-DYp7OA5@T$o%5ajA!dWr|&ulDf@|R0W(kLFI$$t-J z={o$oZE3McE}LJtZ~m&Q#Y5}v>_S>Q2|s^3!bKCErOZ&;DKlhIb`Xptb~1Um3cIg3 znxeHd_LhHSfs17sagbHns5|=>T=WVB(V(A5aZ~~}Q;aA|oD5H##vS3on40>C$@+_h z>|ttZiUCI@FxuiC*k8(|O@o-yKNJwaGCFc_#=u&L-8V)PGQc`W2%TzAYMfXJPY6VJ zhPGV9{%N8Zn=`Snlkj-@*hlCu?Lo%)`+t7v|JTF_3C9ll4M zA5oyl$3M8|ztO)8{-0lVEkRt3ZJb0J8>eDCJ>h)=(^V&J7>A!hMWBE!xGI7-Q92qC zN^Iiia=&Vq1>#Q||25117Z`bIR56w^{*<)gp4ML6vnTiTn#esz6>!h^59~85+g8NG zpVJki*k|^o8SGPX@+3W(@LYj6o{v)7yV7$}PR%4dy^81BFT!(D-GjR?;_1}zZGyQE zFYC5zMuEtOmwS1552sWgUSa3hr2Tn5JkQAy_e1aac#YeVUT0ku-@uo5FW#@&!FS4q zPKHG#S-$TA?i>-=Z1LSZ?@ESG`V-&Dg2v68j%C_9>p5epg1f9a6EL z-NQ!v+FD(D@aeY0o3>BJ<+}H5-Nes&z454*!&b9dvWgVgXwRVwa+N5{_f(&>+L%ZD(ZRoWd;BFeSAu`CHVOtZV~)! zso_BXKDnDWHOk)LuPj`c>rh(G_7*G zojU_s%WfnlZY~Kpb+q!Rk$0>+h`!W_e_W$ihn1dzcO3#Jb*R+oey`Ti2RrnLnD?sF zppPArw(H9lUbpM$`})BB`;VhKR$2eLPT%`8JJy<;yfmdwQOC*Rn2}P2UZ=Mo+dS6m z;?_y=VdA}mk+M$hKD(FO^>tCF8vP5;G|9izX~9enKhJhs zX`Rj8r;U?-THSfM&yDv(YTxZVIp=)JqQzCaY}w&oX>7-iT`E*A_w3@jAziA@s<8Y- zt*u>pf4^{g@1mz&X6+q*cUxPlz)ZVF*BZHa{Ysal^9b`VJ$Mb47 z%AhWN);tRPuskSg)8)vNcQ=CSCLaki*;z5TK}Yv3W8>Nd+b$TnXs!34;6VjB4c7Q? z4DR#hqpbS%2f@mI+sD+MT07*C-=?asuXPPsR6XMQ%Wfk=j@3;+m-ld2NSjK{qK_xP z3MqHl+4I|p2Hh)m9(Kaht9SR~mS-0YFJ><=MBi$hn z-PI(^?e4k7p-r7~4___39O^7;pI+f}xt{wQ+dO^J$EW8j#fPO0oYH%)nV4GMPPDe? zi5jb<`H$}QY?E90;Il>5dUYwR@pk#xPQ4uK*ne!FHni7Z>w&Jds%+~u-=?=ge1T<;kV4h99x-QU}j+4`uD-n-tNR@@UhWjE_% z?|*7quA{imz-yvi?K7wK>D{g3lbW}V^~q3nIGcQ&7uF;2reUXVPGL#+r?tQB86S3V zZJ5pKnB1_Gnp@m@WStMID86f$lxxyAZ(t{DUwyB>7q3Owgczv$o~XDZeU;(LzL`B9 zRt;%?tM9t$fws=$D~0#oeLrJpa{F+_)3EA`#|;i|w8`UTakWk1ufk0dZryko{(Rf< zwmmM?iFng(!PxFgyG3khG}3l;=aE<)jXin@^CJW^dS<6O{}EB}Mc&~2frjEYpO4#) zR`wC64{DR|TsT>LvCqWjJ|2g~=1!a5pDX+<9?3i1KRe7JawRW&R`F&@Ktd`@zwR1Bq6T7@3+YL^%lnUx{&{Qc(Z1lD_gdX>p5LCB5jI8#gxiw$!|Pq4!#8<@kvS{m<3N z_K#N@_H54-XT}>ZakX)JxhdXs{BSq^(?{_gOO}n;-=JQCefP$1W~K!t>`HKS$P5{k zu*xv=>&^H*2~DHreUA%XCpdeWxeP97lsMFULP6N(u*5S*+-C2bG$rxy$HQKaosJ~B zZvQZ;zTj(OedQdF?pBUTPrG;@&086h^x)oebDKUnt{naqvrZPWwMilR~1xg z*kniY;~b|sa^=h93O9KB8?30`uX|;YgWZ(SehED%f8DutLce>L`rmYNEa-QAe2uCH zzP;}k^lHHz#Wx$p`FB1GjrK+=M!(4!eN;9>k>~K~>41Qf3bXKm%JH2A%9E+RPut&h zQ4R@K=;zN)RGwBH5pKP`P^sT7Bkx}5MdgTPJ*L-wX{M@N`0hr(6p^ZWe^tn-vni_i zGtWF3(k@RG_5Fb32J<_rR(qA1H@Z|wF-^$?l-Q&xW|C!DDf^7mI)5wLobu{e z<-1??o}^s-)^W{XZzgqI>)g<~LBXkZoeN(S$Bs_jCGH=8YyaNVDuc!?YIfyyYOlF= zV^fP7rzH>jY!j>(p4QMYe{SW-scGv6KP#B!QJB_e{zE4(|8Hp@4_I0iK6gyt{yMmc z$I96BrS_{fjhZ?yJ+^N^vh%>R>HK$nPI%Wc${5;0m09U-s|<(S6?Pph6d9g{Q(7*V zv@D}j|1{GhPS-P%SC5JLl3StwxE?lHElvFT%h$L?j2Sziza+8#Ko{2y{WIG&ucbe{ zxPRZC@2%QCs5#);3=ik0MS%m(dX5%6&>KF$Z+x?1w|sXF=;-!&gIPk!fN;b9^G^-8 z9{6r#bwBUrJqLaYE=m|}JZYd?(}Kf!rUwTed86Fk-QwfG53eT0tPZpr)N)46eF;;d z2AO(Vtv5`YIjG~fCVdKXP7PZBewO>!+IoZMrtn6!y6-wzZz^w9hZ{+Q@Amcz=(1|j z;H!$$weJOA8a!#D{{31_Ei!jr87k}Q;houJQvGAag{he>RI6Ln8?ZVvxA5uk*C*~| z{v+xMYz)6T{RJyDtB1Dj;)ml1&=lbhrx-elpiRW#vR}MMxGful|BEcO-{)63tjAQV zT1I$8l>TmxqfH7XBJAf^gGyhqk+Ir3KeQ%{kg7dfIAkSG*7|p4DM^t~@z{SgraR6v zpe~*wlSV;5V9&NOY``q}FW_D(b+0jv`=r?8j}1K>{F*Q^WEcDiS)9iUc6V)LvRI7` z4QMRPI_fo*g+-A)+MoteDr5Skz<#a7DJsMp>$Vny=mZ2SHYSz4vl! zGES+buzmti1OmTcAc&H{>lV!bL^LB|&}w2zl8j+h)W*%(mmW9|$-VYqnrKkK85neq zKC4wIJa?MOB2 z_?J80&b!b+?tAw1z5XBTtnp1~tTgD5b|`*W(Bg02ihz@ zIrY70u5irx?$0v>i(Z$nus=Pen@_?;-|kN1L~UoTT$P?Mx{~QI^NR_hmy^5i3A)hz zaKg+J^(P)bTp_{b+4B`+o^2bkXK!=&HnpD$7H!H|dGWPl$3l%Q;bocV=_N8{_%hrR&C>kWhJaKN^KBndUzIhXBuPJ(A zz?1kmUiAu?=hA&+)a9Y^MqaJY@0k?WS$H?4OY4!77wJD*=9|__aCcR&pnDc8U5*

t3K^L9JMJQ%20P(OZwz=Yvo8 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

-=50l0k^$&U!_w8^G1-=(1nwt9z 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 same token + "remove_rubrum": false // drop the rubrum block + } + } + de: | + Anonymisierungs-Anfrage: + { + "mode": "text" | "docx", + "options": { // alle optional + "importance_levels": ["High"], // High|Mid|Low + "confidence_threshold": 0.8, // 0.0..1.0 + "manual_phrases": [], // zusätzlich zu schwärzende Phrasen + "maintain_consistency": true, // gleiche Oberfläche -> gleiches Token + "remove_rubrum": false // Rubrum-Block entfernen + } + } + document: + type: bytes + description: + en: | + The document to anonymize. UTF-8 plain text for mode=text, + a DOCX file for mode=docx. + de: | + Das zu anonymisierende Dokument. UTF-8-Klartext bei mode=text, + eine DOCX-Datei bei mode=docx. + endpoint: + type: text + description: + en: | + Optional base URL of the judge-ner host service. + Default: "http://127.0.0.1:8756". + de: | + Optionale Basis-URL des judge-ner-Host-Services. + Default: "http://127.0.0.1:8756". + +outputs: + result: + type: json + description: + en: | + { + "replacements": [ { "text", "label", "label_description", + "start", "end", "score", "line_number", + "anonymized", ...run-id fields for docx }, ... ], + "text": "..." // anonymized text, only for mode=text + } + `replacements` lists all detected entities; entries with + "anonymized": null were detected but not replaced. A + "statistics" object (and "rubrum" when remove_rubrum matched) + is passed through from the service. + de: | + { + "replacements": [ { "text", "label", "label_description", + "start", "end", "score", "line_number", + "anonymized", ...Run-ID-Felder bei docx }, ... ], + "text": "..." // anonymisierter Text, nur bei mode=text + } + `replacements` enthält alle erkannten Entitäten; Einträge mit + "anonymized": null wurden erkannt, aber nicht ersetzt. Ein + "statistics"-Objekt (und "rubrum" bei erkanntem Rubrum) wird + vom Service durchgereicht. + document: + type: bytes + description: + en: | + The anonymized document: the anonymized UTF-8 text for + mode=text, the rewritten DOCX for mode=docx. + de: | + Das anonymisierte Dokument: bei mode=text die anonymisierte + UTF-8-Textfassung, bei mode=docx das umgeschriebene DOCX. + +# MIME allow-list for the bytes input (Studio file-picker filter). +accepts_mime: + - text/plain + - application/vnd.openxmlformats-officedocument.wordprocessingml.document + +# Outbound HTTP to the local judge-ner host service only. +permissions: + - "net: localhost" + - "net: 127.0.0.1" + +# The hub refuses to dispatch a step to this module unless the +# operator declared a `judge-ner` entry in the service registry +# (~/.chain/config.yaml `services:`). See +# fai_chain/docs/architecture/host-services.md. +requires_services: + - judge-ner diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..de3e08d --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,5 @@ +[toolchain] +channel = "1.86" +targets = ["wasm32-wasip2"] +profile = "minimal" +components = ["rustfmt", "clippy"] diff --git a/src/anonymize.rs b/src/anonymize.rs new file mode 100644 index 0000000..b7d05bd --- /dev/null +++ b/src/anonymize.rs @@ -0,0 +1,439 @@ +//! Request/response mapping between the frozen +//! `text.anonymize.legal-de` contract and the judge-ner host +//! service HTTP API. +//! +//! All HTTP I/O lives behind the `HttpClient` trait so unit tests +//! exercise request building, response parsing and error mapping on +//! the host without a network. + +use base64::Engine as _; +use base64::engine::general_purpose::STANDARD as B64; +use serde::Deserialize; +use serde_json::json; + +/// Base URL used when the optional `endpoint` input is absent/empty. +pub const DEFAULT_ENDPOINT: &str = "http://127.0.0.1:8756"; + +pub const DOCX_MIME: &str = + "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; +pub const TEXT_MIME: &str = "text/plain; charset=utf-8"; + +#[derive(Debug, thiserror::Error)] +pub enum AnonError { + /// Caller-side problem (bad request JSON, non-UTF-8 text + /// document, service rejected the input as invalid). + #[error("invalid input: {0}")] + InvalidInput(String), + /// Transport failure or unexpected service behaviour. + #[error("{0}")] + Service(String), +} + +/// Minimal HTTP response the mapping layer needs. +pub struct HttpResponse { + pub status: u16, + pub body: String, +} + +pub trait HttpClient { + fn post_json(&self, url: &str, body: &str) -> Result; +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum Mode { + Text, + Docx, +} + +#[derive(Debug, Deserialize)] +pub struct Request { + pub mode: Mode, + #[serde(default)] + pub options: serde_json::Value, +} + +/// Parse the `request` input JSON. +pub fn parse_request(raw: &str) -> Result { + let mut req: Request = serde_json::from_str(raw).map_err(|e| { + AnonError::InvalidInput(format!( + "request must be {{\"mode\":\"text\"|\"docx\",\"options\":{{..}}}}: {e}" + )) + })?; + if req.options.is_null() { + req.options = json!({}); + } else if !req.options.is_object() { + return Err(AnonError::InvalidInput( + "request.options must be a JSON object".to_string(), + )); + } + Ok(req) +} + +/// Normalize the endpoint override: empty -> default, strip a +/// trailing slash so path joining stays predictable. +pub fn resolve_endpoint(endpoint_input: &str) -> String { + let trimmed = endpoint_input.trim(); + let base = if trimmed.is_empty() { + DEFAULT_ENDPOINT + } else { + trimmed + }; + base.trim_end_matches('/').to_string() +} + +/// Outcome of one anonymization call, ready to be lifted into +/// module `Outputs` by the caller. +#[derive(Debug)] +pub struct AnonOutcome { + /// JSON string for the `result` output. + pub result_json: String, + /// Bytes for the `document` output. + pub document: Vec, + /// MIME type of `document`. + pub document_mime: &'static str, +} + +pub fn run( + client: &C, + request: &Request, + document: &[u8], + endpoint_input: &str, +) -> Result { + let base = resolve_endpoint(endpoint_input); + match request.mode { + Mode::Text => run_text(client, &base, &request.options, document), + Mode::Docx => run_docx(client, &base, &request.options, document), + } +} + +fn run_text( + client: &C, + base: &str, + options: &serde_json::Value, + document: &[u8], +) -> Result { + let text = std::str::from_utf8(document).map_err(|_| { + AnonError::InvalidInput( + "document is not valid UTF-8 text (mode=text expects a UTF-8 text payload)" + .to_string(), + ) + })?; + let url = format!("{base}/anonymize/text"); + let body = serde_json::to_string(&json!({ "text": text, "options": options })) + .map_err(|e| AnonError::Service(format!("serialize request: {e}")))?; + let response = post_expect_json(client, &url, &body)?; + + let anonymized = response + .get("text") + .and_then(|t| t.as_str()) + .ok_or_else(|| AnonError::Service( + "judge-ner response is missing the 'text' field".to_string(), + ))? + .to_string(); + let result_json = build_result(&response, Some(&anonymized))?; + + Ok(AnonOutcome { + result_json, + document: anonymized.into_bytes(), + document_mime: TEXT_MIME, + }) +} + +fn run_docx( + client: &C, + base: &str, + options: &serde_json::Value, + document: &[u8], +) -> Result { + let url = format!("{base}/anonymize/docx"); + let body = serde_json::to_string(&json!({ + "docx_base64": B64.encode(document), + "options": options, + })) + .map_err(|e| AnonError::Service(format!("serialize request: {e}")))?; + let response = post_expect_json(client, &url, &body)?; + + let docx_b64 = response + .get("docx_base64") + .and_then(|d| d.as_str()) + .ok_or_else(|| AnonError::Service( + "judge-ner response is missing the 'docx_base64' field".to_string(), + ))?; + let docx_bytes = B64.decode(docx_b64).map_err(|e| { + AnonError::Service(format!("judge-ner returned invalid base64 DOCX: {e}")) + })?; + let result_json = build_result(&response, None)?; + + Ok(AnonOutcome { + result_json, + document: docx_bytes, + document_mime: DOCX_MIME, + }) +} + +/// Build the `result` output JSON from the service response. +/// +/// Frozen contract: `{"replacements": [...]}` plus `"text"` only in +/// text mode. `statistics` / `rubrum` are passed through as optional +/// extras when the service supplied them. +fn build_result( + response: &serde_json::Value, + text: Option<&str>, +) -> Result { + let replacements = response + .get("replacements") + .cloned() + .ok_or_else(|| AnonError::Service( + "judge-ner response is missing the 'replacements' field".to_string(), + ))?; + if !replacements.is_array() { + return Err(AnonError::Service( + "judge-ner 'replacements' field is not an array".to_string(), + )); + } + + let mut result = serde_json::Map::new(); + result.insert("replacements".to_string(), replacements); + if let Some(t) = text { + result.insert("text".to_string(), json!(t)); + } + for passthrough in ["statistics", "rubrum"] { + if let Some(v) = response.get(passthrough) { + result.insert(passthrough.to_string(), v.clone()); + } + } + serde_json::to_string(&serde_json::Value::Object(result)) + .map_err(|e| AnonError::Service(format!("serialize result: {e}"))) +} + +/// POST and decode, translating HTTP-level failures into contract +/// errors. FastAPI signals caller errors as 4xx with a JSON body +/// `{"detail": "..."}` — surface those as InvalidInput so the flow +/// engine reports them as the caller's problem, not the module's. +fn post_expect_json( + client: &C, + url: &str, + body: &str, +) -> Result { + let response = client.post_json(url, body)?; + if !(200..300).contains(&response.status) { + let detail = serde_json::from_str::(&response.body) + .ok() + .and_then(|v| v.get("detail").and_then(|d| d.as_str().map(String::from))) + .unwrap_or_else(|| truncate(&response.body, 300)); + let message = format!( + "judge-ner at {url} answered HTTP {status}: {detail}", + status = response.status, + ); + return if (400..500).contains(&response.status) && response.status != 404 { + Err(AnonError::InvalidInput(message)) + } else { + Err(AnonError::Service(message)) + }; + } + serde_json::from_str(&response.body).map_err(|e| { + AnonError::Service(format!("judge-ner returned non-JSON body from {url}: {e}")) + }) +} + +fn truncate(s: &str, max: usize) -> String { + if s.len() <= max { + s.to_string() + } else { + let mut cut = max; + while !s.is_char_boundary(cut) { + cut -= 1; + } + format!("{}…", &s[..cut]) + } +} + +#[cfg(test)] +mod tests { + #![allow(clippy::unwrap_used, clippy::expect_used, clippy::panic)] + use super::*; + use std::cell::RefCell; + + struct MockClient { + responses: RefCell>>, + seen: RefCell>, + } + + impl MockClient { + fn new(responses: Vec>) -> Self { + Self { + responses: RefCell::new(responses), + seen: RefCell::new(Vec::new()), + } + } + } + + impl HttpClient for MockClient { + fn post_json(&self, url: &str, body: &str) -> Result { + self.seen + .borrow_mut() + .push((url.to_string(), body.to_string())); + self.responses + .borrow_mut() + .pop() + .unwrap_or(Err(AnonError::Service("no more mock responses".into()))) + } + } + + fn ok(body: &str) -> Result { + Ok(HttpResponse { + status: 200, + body: body.to_string(), + }) + } + + #[test] + fn parse_request_accepts_text_mode_without_options() { + let req = parse_request(r#"{"mode":"text"}"#).unwrap(); + assert_eq!(req.mode, Mode::Text); + assert!(req.options.as_object().unwrap().is_empty()); + } + + #[test] + fn parse_request_accepts_docx_mode_with_options() { + let req = + parse_request(r#"{"mode":"docx","options":{"remove_rubrum":true}}"#).unwrap(); + assert_eq!(req.mode, Mode::Docx); + assert_eq!(req.options["remove_rubrum"], true); + } + + #[test] + fn parse_request_rejects_unknown_mode() { + assert!(matches!( + parse_request(r#"{"mode":"pdf"}"#), + Err(AnonError::InvalidInput(_)) + )); + } + + #[test] + fn parse_request_rejects_non_object_options() { + assert!(matches!( + parse_request(r#"{"mode":"text","options":[1,2]}"#), + Err(AnonError::InvalidInput(_)) + )); + } + + #[test] + fn resolve_endpoint_defaults_and_strips_slash() { + assert_eq!(resolve_endpoint(""), DEFAULT_ENDPOINT); + assert_eq!(resolve_endpoint(" "), DEFAULT_ENDPOINT); + assert_eq!( + resolve_endpoint("http://10.0.0.5:9000/"), + "http://10.0.0.5:9000" + ); + } + + #[test] + fn text_mode_maps_response_onto_contract() { + let service_response = r#"{ + "text": "Herr ⟦PER1⟧.", + "replacements": [{"text":"Müller","label":"PER","start":5,"end":11, + "anonymized":"⟦PER1⟧"}], + "statistics": {"total_entities": 1}, + "processing_time": 0.4 + }"#; + let client = MockClient::new(vec![ok(service_response)]); + let req = parse_request(r#"{"mode":"text"}"#).unwrap(); + let outcome = run(&client, &req, "Herr Müller.".as_bytes(), "").unwrap(); + + // URL + body + let (url, body) = client.seen.borrow()[0].clone(); + assert_eq!(url, "http://127.0.0.1:8756/anonymize/text"); + let sent: serde_json::Value = serde_json::from_str(&body).unwrap(); + assert_eq!(sent["text"], "Herr Müller."); + assert!(sent["options"].is_object()); + + // result output + let result: serde_json::Value = serde_json::from_str(&outcome.result_json).unwrap(); + assert_eq!(result["text"], "Herr ⟦PER1⟧."); + assert_eq!(result["replacements"][0]["anonymized"], "⟦PER1⟧"); + assert_eq!(result["statistics"]["total_entities"], 1); + assert!(result.get("rubrum").is_none()); + + // document output = anonymized UTF-8 text + assert_eq!(outcome.document, "Herr ⟦PER1⟧.".as_bytes()); + assert_eq!(outcome.document_mime, TEXT_MIME); + } + + #[test] + fn text_mode_rejects_non_utf8_document() { + let client = MockClient::new(vec![]); + let req = parse_request(r#"{"mode":"text"}"#).unwrap(); + let err = run(&client, &req, &[0xff, 0xfe, 0x00], "").unwrap_err(); + assert!(matches!(err, AnonError::InvalidInput(_))); + } + + #[test] + fn docx_mode_encodes_and_decodes_base64() { + let input_docx = b"PK\x03\x04fake-docx".to_vec(); + let output_docx = b"PK\x03\x04anonymized".to_vec(); + let service_response = serde_json::to_string(&serde_json::json!({ + "docx_base64": B64.encode(&output_docx), + "replacements": [], + "statistics": {"total_entities": 0} + })) + .unwrap(); + let client = MockClient::new(vec![ok(&service_response)]); + let req = parse_request(r#"{"mode":"docx","options":{"remove_rubrum":true}}"#) + .unwrap(); + let outcome = run(&client, &req, &input_docx, "http://127.0.0.1:9999/").unwrap(); + + let (url, body) = client.seen.borrow()[0].clone(); + assert_eq!(url, "http://127.0.0.1:9999/anonymize/docx"); + let sent: serde_json::Value = serde_json::from_str(&body).unwrap(); + assert_eq!(sent["docx_base64"], B64.encode(&input_docx)); + assert_eq!(sent["options"]["remove_rubrum"], true); + + let result: serde_json::Value = serde_json::from_str(&outcome.result_json).unwrap(); + assert!(result.get("text").is_none(), "no 'text' key in docx mode"); + assert_eq!(result["replacements"].as_array().unwrap().len(), 0); + + assert_eq!(outcome.document, output_docx); + assert_eq!(outcome.document_mime, DOCX_MIME); + } + + #[test] + fn service_4xx_maps_to_invalid_input_with_detail() { + let client = MockClient::new(vec![Ok(HttpResponse { + status: 422, + body: r#"{"detail":"text must not be empty"}"#.to_string(), + })]); + let req = parse_request(r#"{"mode":"text"}"#).unwrap(); + let err = run(&client, &req, b"", "").unwrap_err(); + match err { + AnonError::InvalidInput(msg) => { + assert!(msg.contains("text must not be empty"), "msg = {msg}"); + assert!(msg.contains("422"), "msg = {msg}"); + } + other => panic!("expected InvalidInput, got {other:?}"), + } + } + + #[test] + fn service_5xx_maps_to_service_error() { + let client = MockClient::new(vec![Ok(HttpResponse { + status: 503, + body: r#"{"detail":"NER model not available: ..."}"#.to_string(), + })]); + let req = parse_request(r#"{"mode":"text"}"#).unwrap(); + let err = run(&client, &req, b"hello", "").unwrap_err(); + assert!(matches!(err, AnonError::Service(_))); + } + + #[test] + fn missing_replacements_is_a_service_error() { + let client = MockClient::new(vec![ok(r#"{"text":"x"}"#)]); + let req = parse_request(r#"{"mode":"text"}"#).unwrap(); + let err = run(&client, &req, b"x", "").unwrap_err(); + match err { + AnonError::Service(msg) => assert!(msg.contains("replacements")), + other => panic!("expected Service, got {other:?}"), + } + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..2253a72 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,124 @@ +//! `text.anonymize.legal-de` — NER anonymization of German legal +//! texts, bridged to the `judge-ner` host service. +//! +//! The heavy lifting (JuraNER transformers model, DOCX rewriting) +//! happens in the judge-ner container — see +//! `fai_judge/host_services/judge-ner/`. This module forwards the +//! document over loopback HTTP and maps the response onto the frozen +//! capability contract: +//! +//! inputs: `request` (json) {"mode":"text"|"docx","options":{...}} +//! `document` (bytes) UTF-8 text or DOCX +//! `endpoint` (text, optional) service base URL override +//! outputs: `result` (json) {"replacements":[...], "text" only for +//! mode=text} +//! `document` (bytes) anonymized text/DOCX + +mod anonymize; + +pub use anonymize::DEFAULT_ENDPOINT; + +use chain_module_sdk::prelude::*; + +use crate::anonymize::{AnonError, HttpClient, HttpResponse}; + +#[fai_module] +pub fn invoke(_ctx: Context, inputs: Inputs) -> Result { + let request_raw = read_json_or_text(&inputs, "request")?; + let request = anonymize::parse_request(&request_raw).map_err(to_module_error)?; + let document = inputs.require_bytes("document")?; + let endpoint = inputs + .get("endpoint") + .and_then(payload_text) + .unwrap_or_default(); + + let client = make_client(); + let outcome = anonymize::run(&client, &request, &document.data, &endpoint) + .map_err(to_module_error)?; + + Ok(Outputs::new() + .with_json_str("result", outcome.result_json) + .with_bytes("document", outcome.document_mime, outcome.document)) +} + +fn to_module_error(err: AnonError) -> ModuleError { + match err { + AnonError::InvalidInput(msg) => ModuleError::invalid_input(msg), + AnonError::Service(msg) => ModuleError::internal(msg), + } +} + +fn payload_text(p: &Payload) -> Option { + match p { + Payload::Text(s) => Some(s.clone()), + _ => None, + } +} + +/// Accept the request payload either as `json` (the documented form) +/// or `text` (the form gRPC clients without first-class JSON-payload +/// support fall through to). Both carry the same JSON string. +fn read_json_or_text(inputs: &Inputs, name: &str) -> Result { + if let Ok(s) = inputs.require_json_str(name) { + return Ok(s.to_string()); + } + if let Ok(s) = inputs.require_text(name) { + return Ok(s.to_string()); + } + Err(ModuleError::invalid_input(format!( + "input '{name}' must be json or text (carrying a JSON string)" + ))) +} + +#[cfg(target_arch = "wasm32")] +fn make_client() -> WakiClient { + WakiClient +} + +#[cfg(not(target_arch = "wasm32"))] +fn make_client() -> HostStubClient { + HostStubClient +} + +/// Host builds (unit tests, `cargo test`) have no outbound HTTP — +/// only the wasm32 build talks to the service. +#[cfg(not(target_arch = "wasm32"))] +struct HostStubClient; + +#[cfg(not(target_arch = "wasm32"))] +#[allow(dead_code)] +impl HttpClient for HostStubClient { + fn post_json(&self, _url: &str, _body: &str) -> Result { + Err(AnonError::Service( + "HTTP path is unavailable on the host build; only wasm32 supports outbound HTTP" + .to_string(), + )) + } +} + +#[cfg(target_arch = "wasm32")] +struct WakiClient; + +#[cfg(target_arch = "wasm32")] +impl HttpClient for WakiClient { + fn post_json(&self, url: &str, body: &str) -> Result { + let response = waki::Client::new() + .post(url) + .header("Content-Type", "application/json") + .body(body.to_string()) + .send() + .map_err(|e| { + AnonError::Service(format!( + "judge-ner service unreachable at {url}: {e} \ + (is the judge-ner container running?)" + )) + })?; + let status = response.status_code(); + let bytes = response + .body() + .map_err(|e| AnonError::Service(format!("read response body: {e}")))?; + let body = String::from_utf8(bytes) + .map_err(|e| AnonError::Service(format!("response body is not UTF-8: {e}")))?; + Ok(HttpResponse { status, body }) + } +}