From adb62ee3a5081975875afb40302054d394ccd79c Mon Sep 17 00:00:00 2001 From: ettoc00 <41289053+ettoc00@users.noreply.github.com> Date: Thu, 17 Sep 2026 16:09:30 +0200 Subject: [PATCH 01/14] fix: make offline read replicas durable across restart and compaction --- .gitattributes | 1 + .github/workflows/ci.yml | 19 + .gitignore | 3 + .prettierignore | 2 + CHANGELOG.md | 19 + README.md | 6 +- bun.lock | 4 + docs/offline-replicas.md | 130 +++ eslint.config.js | 3 +- .../assets/wa-sqlite/ACKNOWLEDGMENTS.md | 45 + packages/replicate/assets/wa-sqlite/LICENSE | 21 + .../assets/wa-sqlite/dist/wa-sqlite-async.mjs | 16 + .../wa-sqlite/dist/wa-sqlite-async.wasm | Bin 0 -> 1223567 bytes .../replicate/assets/wa-sqlite/manifest.json | 17 + .../assets/wa-sqlite/src/FacadeVFS.js | 508 ++++++++++ .../replicate/assets/wa-sqlite/src/VFS.js | 222 +++++ .../assets/wa-sqlite/src/WebLocksMixin.js | 412 +++++++++ .../src/examples/IDBBatchAtomicVFS.js | 820 +++++++++++++++++ .../assets/wa-sqlite/src/sqlite-api.js | 870 ++++++++++++++++++ .../assets/wa-sqlite/src/sqlite-constants.js | 275 ++++++ packages/replicate/package.json | 17 +- .../replicate/scripts/copy-sqlite-assets.mjs | 20 + .../replicate/scripts/test-native-bundle.cjs | 55 ++ .../scripts/test-offline-browser.mjs | 161 ++++ .../scripts/verify-sqlite-provenance.mjs | 19 + .../replicate/src/client/bindings/counter.ts | 15 +- packages/replicate/src/client/bindings/set.ts | 3 +- packages/replicate/src/client/collection.ts | 666 ++++++++------ packages/replicate/src/client/documents.ts | 37 + .../src/client/persistence/custom.ts | 32 +- .../src/client/persistence/encrypted/web.ts | 63 +- .../src/client/persistence/memory.ts | 4 + .../src/client/persistence/sqlite/preload.ts | 25 +- .../src/client/persistence/sqlite/schema.ts | 67 +- .../src/client/persistence/sqlite/web.ts | 27 +- .../src/client/persistence/sqlite/worker.ts | 24 +- .../replicate/src/client/persistence/types.ts | 6 + .../src/client/persistence/writes.ts | 28 + packages/replicate/src/client/prose.ts | 2 +- .../src/client/services/connection.ts | 108 +++ .../replicate/src/client/services/presence.ts | 51 +- .../src/component/_generated/component.ts | 7 +- packages/replicate/src/component/mutations.ts | 191 ++-- packages/replicate/src/component/schema.ts | 6 +- packages/replicate/src/server/index.ts | 62 +- packages/replicate/src/shared/index.ts | 1 + packages/replicate/src/test/assets.test.ts | 34 + packages/replicate/src/test/component.test.ts | 11 +- packages/replicate/src/test/discovery.test.ts | 312 +++++++ packages/replicate/src/test/offline.test.ts | 786 ++++++++++++++++ .../src/test/persistence-writes.test.ts | 22 + packages/replicate/src/test/recovery.test.ts | 89 ++ .../replicate/src/test/server-functions.ts | 6 + packages/replicate/test/browser/index.html | 2 + packages/replicate/test/browser/main.ts | 83 ++ packages/replicate/test/native/index.js | 2 + packages/replicate/test/native/package.json | 5 + 57 files changed, 5905 insertions(+), 537 deletions(-) create mode 100644 .gitattributes create mode 100644 docs/offline-replicas.md create mode 100644 packages/replicate/assets/wa-sqlite/ACKNOWLEDGMENTS.md create mode 100644 packages/replicate/assets/wa-sqlite/LICENSE create mode 100644 packages/replicate/assets/wa-sqlite/dist/wa-sqlite-async.mjs create mode 100644 packages/replicate/assets/wa-sqlite/dist/wa-sqlite-async.wasm create mode 100644 packages/replicate/assets/wa-sqlite/manifest.json create mode 100644 packages/replicate/assets/wa-sqlite/src/FacadeVFS.js create mode 100644 packages/replicate/assets/wa-sqlite/src/VFS.js create mode 100644 packages/replicate/assets/wa-sqlite/src/WebLocksMixin.js create mode 100644 packages/replicate/assets/wa-sqlite/src/examples/IDBBatchAtomicVFS.js create mode 100644 packages/replicate/assets/wa-sqlite/src/sqlite-api.js create mode 100644 packages/replicate/assets/wa-sqlite/src/sqlite-constants.js create mode 100755 packages/replicate/scripts/copy-sqlite-assets.mjs create mode 100644 packages/replicate/scripts/test-native-bundle.cjs create mode 100644 packages/replicate/scripts/test-offline-browser.mjs create mode 100644 packages/replicate/scripts/verify-sqlite-provenance.mjs create mode 100644 packages/replicate/src/client/persistence/writes.ts create mode 100644 packages/replicate/src/client/services/connection.ts create mode 100644 packages/replicate/src/test/assets.test.ts create mode 100644 packages/replicate/src/test/discovery.test.ts create mode 100644 packages/replicate/src/test/offline.test.ts create mode 100644 packages/replicate/src/test/persistence-writes.test.ts create mode 100644 packages/replicate/src/test/recovery.test.ts create mode 100644 packages/replicate/src/test/server-functions.ts create mode 100644 packages/replicate/test/browser/index.html create mode 100644 packages/replicate/test/browser/main.ts create mode 100644 packages/replicate/test/native/index.js create mode 100644 packages/replicate/test/native/package.json diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..0147f99 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +packages/replicate/assets/wa-sqlite/** -text -whitespace linguist-vendored diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4752219..837fc66 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,6 +14,10 @@ jobs: - name: Checkout uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 24 + - name: Setup Bun uses: oven-sh/setup-bun@v2 @@ -23,8 +27,23 @@ jobs: - name: Build packages run: bun run build:packages + - name: Test replication contracts + run: bun run test + + - name: Verify SQLite assets + run: bun run --filter @trestleinc/replicate test:assets + + - name: Install Chromium + working-directory: packages/replicate + run: bunx playwright install --with-deps chromium + + - name: Test offline browser restarts + run: bun run --filter @trestleinc/replicate test:browser + - name: Lint run: bun run lint - name: Type check + env: + PUBLIC_CONVEX_URL: https://example.convex.cloud run: bun run check diff --git a/.gitignore b/.gitignore index 449e9c0..835f9f5 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,9 @@ # Dist node_modules dist/ +# Versioned upstream runtime distribution (not this repository's build output). +!packages/replicate/assets/wa-sqlite/dist/ +!packages/replicate/assets/wa-sqlite/dist/* packages/*/dist apps/*/dist apps/*/.env diff --git a/.prettierignore b/.prettierignore index 0cd4ddb..9a6db35 100644 --- a/.prettierignore +++ b/.prettierignore @@ -5,3 +5,5 @@ bun.lock **/dist/ **/build/ **/_generated/ + +packages/replicate/assets/ diff --git a/CHANGELOG.md b/CHANGELOG.md index e2dc816..a35ab91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,25 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + +### Added + +- Manual connection gating, read-only collections, captured application request arguments, and awaitable connect/disconnect/reset lifecycle. +- Versioned, checksummed self-hostable SQLite runtime assets and offline browser process-restart tests. +- Bounded, resumable `migrateSnapshots` component migration for legacy shared snapshot sequence positions. + +### Fixed + +- Persisted rows become ready without waiting for network recovery. +- Deletion and recovery absence drain/delete durable document state; failed writes cannot advance cursors or acknowledge undurable vectors. +- Raw updates with missing Yjs dependencies survive restart; stale network generations cannot repopulate reset replicas. +- Snapshot/delta discovery works after compaction, including scheduled compaction and writes between small pages. + +### Upgrade notes + +Existing v2 component collections must complete snapshot migration before streaming. See [Durable offline replicas](docs/offline-replicas.md) for mixed-client support, pending writable creations, third-party persistence capabilities, runtime provenance, and native verification limits. + ## [1.2.0-preview.0] - 2025-12-31 ### Added diff --git a/README.md b/README.md index 64f6119..9ec53f2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # Replicate -A local-first sync engine for [Convex](https://convex.dev). Replicate keeps a full copy of your data in client-side SQLite (via OPFS on web, op-sqlite on React Native) and syncs changes through Convex using CRDTs (Yjs). Users get instant reads, offline writes, and real-time collaboration without writing conflict resolution logic. +A local-first sync engine for [Convex](https://convex.dev). Replicate keeps a full copy of your data in client-side SQLite (via IndexedDB-backed SQLite on web, op-sqlite on React Native) and syncs changes through Convex using CRDTs (Yjs). Users get instant reads, offline writes, and real-time collaboration without writing conflict resolution logic. + +For gated synchronization, read-only replicas, durable reset, browser precaching, and existing-component upgrades, see [Durable offline replicas](docs/offline-replicas.md). Existing v2 snapshots require the documented migration before streaming. ## Architecture @@ -79,7 +81,7 @@ Install the Replicate component in your Convex project: ```typescript // convex/convex.config.ts import { defineApp } from 'convex/server'; -import replicate from '@trestleinc/replicate/component'; +import replicate from '@trestleinc/replicate/convex.config'; const app = defineApp(); app.use(replicate); diff --git a/bun.lock b/bun.lock index b062e3f..a625cac 100644 --- a/bun.lock +++ b/bun.lock @@ -213,6 +213,9 @@ "packages/replicate": { "name": "@trestleinc/replicate", "version": "2.0.0-preview.0", + "bin": { + "replicate-sqlite-assets": "./scripts/copy-sqlite-assets.mjs", + }, "dependencies": { "@logtape/logtape": "catalog:", "@logtape/pretty": "catalog:", @@ -243,6 +246,7 @@ "tsdown": "0.20.0-beta.3", "typescript": "catalog:", "typescript-eslint": "catalog:", + "vite": "catalog:", "vitest": "catalog:", }, "peerDependencies": { diff --git a/docs/offline-replicas.md b/docs/offline-replicas.md new file mode 100644 index 0000000..bcf34da --- /dev/null +++ b/docs/offline-replicas.md @@ -0,0 +1,130 @@ +# Durable offline replicas + +Initialize persistence and await `collection.preload()` to read local records. Local readiness does not wait for recovery, subscriptions, or credentials. Synchronization errors do not prevent offline reads. + +```ts +const records = collection.create({ + schema: recordSchema, + persistence: sqlite, + networkMode: 'manual', + readOnly: true, + requestArgs: () => ({ guestToken: currentGuestToken }), + config: () => ({ convexClient, api: api.records, getKey: (record) => record.id }), +}); +await records.init(); +const local = records.get(); +await local.preload(); // locally persisted rows are available, even offline +// Once the application has credentials: +await local.connect(); +``` + +`networkMode` defaults to `'auto'`. `connect()` starts background recovery and streaming; it does not wait for server synchronization. Manual mode makes no queries, subscriptions, document mutations, or presence calls before connecting. Explicit document edits in disconnected manual mode remain local and their transaction rejects; pending creations are retained for retry after connection. Existing automatic writable behavior remains the default. + +`readOnly` rejects insert/update/delete transactions and mutable prose/counter/register/set bindings. It still receives server changes and sends durable progress/presence messages. It is a client behavior option, not an authorization boundary: applications must enforce their own server write permissions. + +`requestArgs` is evaluated and cloned at each connection. Its values accompany all collection transport queries, subscriptions, mutations, recovery, and presence operations. Protocol arguments (including document, vector, seq, pagination, presence, and write fields) are reserved and rejected. The application endpoints must declare and validate these additional arguments, for example through the application's existing custom-function wrapper. Stock endpoint validators do not automatically accept extra credentials. Replicate does not interpret credentials or define an authorization policy. + +## Disconnect, account changes, and shutdown + +```ts +await local.disconnect(); // invalidates callbacks, stops subscriptions/bindings, drains local writes +await local.reset(); // disconnects, deletes this collection's durable documents and cursor +currentGuestToken = nextCredential; +await local.connect(); +// Final shutdown; a shared SQLite instance closes after all its collections: +await local.disconnect(); +await local.cleanup(); +await database.close(); +``` + +Disconnect does not await unresolved backend requests. Their eventual results cannot affect a later connection. It retains documents; account switching should reset or use a separate database. Reset waits for earlier local persistence work, remains disconnected, and a concurrent connect waits for reset. Recreate document handles and editing bindings after reconnect. Do not retain/mutate raw Yjs fragments across reset. The database must have a single collection owner for each collection name; concurrent independent instances sharing the same persisted collection are not supported. + +Incoming raw Yjs updates are stored before application, including updates whose base has not arrived. The stream serializes pages, flushes changed documents, persists the cursor, and only then advances its subscription and reports a captured durable vector. Rows become readable once their data is durable; a canceled or failed checkpoint leaves that local data readable and eligible for replay. Failed writes keep the cursor and retry the subscription. Deletion drains writes and removes snapshots and deltas before progress advances. Recovery uses the server's existing material/view existence rules; explicit absence removes local state durably. + +Insert retries preserve a single logical document ID without repeating `onInsert`. If the row already exists, the retry uses the normal update path (including `onUpdate`) so newer offline edits in its payload are synchronized. + +Writable pending creations are marked durably before local insertion, retained across restart, and retried after connection. Legacy writable documents without a pending marker are preserved when the server has no history of that ID (`known: false`); this avoids discarding unsent pre-upgrade creations. Read-only replicas treat that absence as authoritative. A server tombstone/history with absent material remains authoritative for writable clients too. This is not a general persistent transaction outbox or a change to the existing writable retry/conflict model. + +## Existing component upgrade + +This change targets the current v2 preview component schema (`deltas`, `snapshots`, `sequences`). Migration from the different npm 1.1.2 component is outside this patch; the archived migration documents describe earlier schemas and are not a verified stable-to-preview upgrade procedure. + +Existing snapshots can share numeric sequence positions, so simply indexing them would lose records at page boundaries. New compaction assigns a unique collection sequence to every snapshot publication, in the same Convex transaction as replacement and delta removal. Stream pages merge bounded snapshot/delta ranges and advance only through emitted entries. Presence retention still uses Yjs state vectors. + +After updating the component, run its `migrateSnapshots` mutation for **each existing collection**, in batches until `done` is true. Invoke it through an application **internal** administrative mutation, rather than exposing a public migration endpoint: + +```ts +const result = await ctx.runMutation(components.replicate.mutations.migrateSnapshots, { + collection: 'records', + limit: 50, +}); +// Repeat this internal operation until result.done === true. +``` + +Each batch atomically republishes at most 100 legacy snapshots above the highest existing snapshot, delta, or counter position. Completed rows have a marker; an interrupted operation resumes with the remaining rows and can safely be repeated. Writes and scheduled compaction may continue during migration. Streaming reports `Snapshot migration required` while any legacy snapshots remain; plan a synchronization maintenance window. Local reads and per-document recovery remain available. + +Old v2 clients already understand snapshot entries and numeric cursors, so they can consume the upgraded component after migration. They retain their original local durability defects until upgraded. Mixed old/new **clients** are supported; rolling back the component schema/code while retaining publication metadata is not a supported migration path. Do not run legacy compaction code against the upgraded component. + +Previously corrupt cursors above all retained server sequence evidence cannot be reconstructed. Use `reset()` for affected read-only caches after migration. Preserve/export unsent writable changes before resetting. A cursor must never be restored independently of the matching local data. + +## Custom persistence + +`persistence.custom.create(adapter)` implements the durable contract automatically. Direct third-party `PersistenceProvider` implementations must add: + +- `flush()`: await all captured writes and propagate failures; failed writes must remain retryable. +- `storeUpdate(bytes)`: durably store a raw **Yjs V2** update, even if its dependencies are missing. The collection applies it with origin `'replicate-persisted'` afterward; do not write it twice from that event. +- `clear()`: detach observers, drain initialization/writes, and delete all durable state for the document before resolving. + +The methods are optional in the TypeScript interface for source compatibility, but durable synchronization fails explicitly if a required capability is missing. The built-in SQLite, memory, custom, and encrypted providers implement them. Encrypted persistence now maintains an ID index; pre-existing encrypted documents must already be discoverable through the underlying adapter's `listDocuments()` to be recovered/indexed. + +## Browser assets and offline startup + +The browser worker uses **IDBBatchAtomicVFS (IndexedDB)**, not OPFS. Copy the versioned runtime included with the package into your application's public assets during its build: + +```sh +replicate-sqlite-assets public/replicate-sqlite +``` + +Repeated builds refresh the runtime files in that directory and preserve unrelated files. + +```ts +const sqlite = persistence.web.sqlite.once({ + name: 'records', + assetBase: '/replicate-sqlite', + worker: async () => { + const { default: Worker } = await import('@trestleinc/replicate/worker?worker'); + return new Worker(); + }, +}); +``` + +Precache the app shell, bundled worker, and **all runtime files** listed by `assets/wa-sqlite/manifest.json` under that base. Preserve the relative `src/` and `dist/` paths and license/acknowledgment files. Serve `.wasm` as `application/wasm` and JS/MJS as JavaScript. Install/activate the service worker online before the first offline restart. `preloadLinks(assetBase)` and `injectPreloadLinks(assetBase)` accept the same base. Failed WASM compilation is evicted from the cache so retry can succeed. Without `assetBase`, the existing CDN remains the default. + +The worker uses `synchronous=FULL` and awaits SQLite/VFS close before terminating. Durability is subject to browser storage eviction, device/storage guarantees, and application cache lifecycle; offline assets are application-owned. + +### Runtime provenance + +The vendored graph is byte-identical to official wa-sqlite GitHub commit `55bf0b6646ac1bb81b00b9c25636b59a87e4a918` (tag `v1.0.0`), including its prebuilt async JS/WASM. Those compiler artifacts originate at commit `44cc640c65f29de9bfbc2004974c9f6c2c690c2b`; its Makefile specifies SQLite 3.46.0. Per-file SHA-256 values are recorded in `manifest.json`. + +This is reproducible distribution of pinned official artifacts, not a claim to reproduce the original compiler environment. `node scripts/verify-sqlite-provenance.mjs` compares every file with that immutable upstream revision; `node scripts/copy-sqlite-assets.mjs --verify` checks the installed copy without network access. Keep upstream `LICENSE` and `ACKNOWLEDGMENTS.md`, including the sqlite-wasm notice. + +**Do not substitute npm `wa-sqlite@1.0.0`.** It has different source/build contents and an incompatible VFS constructor API. The pinned GitHub graph and the historical CDN use `IDBBatchAtomicVFS.create(name, module)`. + +## Verification + +Use Node 24 for disk tests (`node:sqlite`) and the repository's pinned Bun version to install dependencies: + +```sh +bun install --frozen-lockfile +bun run build:packages +cd packages/replicate +bun run test +bun run test:assets +bunx playwright install chromium +bun run test:browser +node scripts/test-native-bundle.cjs +``` + +Client tests use real SQLite files and actual collections/adapters with controlled transport. Component/server tests use convex-test, including seeded histories checked against independent source documents; they are not cloud deployment tests. The browser harness bundles package exports, precaches the actual SQLite/WASM graph, explicitly polls durable checkpoints, shuts down Chromium both with and without application cleanup, reopens the same profile offline, and verifies rows, removals, pending updates, and reset with no HTTP requests during offline phases. + +The native harness bundles the **full built client entry** through Expo Metro for Android, not only the SQLite adapter. With the locked lib0 0.2.117, the stock React Native conditional export requires unavailable `isomorphic-webcrypto`. Use a targeted Metro resolver mapping `lib0/webcrypto` to lib0's `webcrypto.js`, as in the repository Expo example; retain the application's native secure `crypto.getRandomValues`/`crypto.randomUUID` setup before importing Replicate. The mapping supplies no randomness and no WebCrypto implementation. Encrypted APIs additionally require a compatible secure WebCrypto implementation. No insecure fallback or obsolete isomorphic-webcrypto dependency is added. This verifies bundling, **not native-device execution**. diff --git a/eslint.config.js b/eslint.config.js index 0b34019..2fa04b5 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -8,6 +8,7 @@ export default [ { ignores: [ '**/node_modules/**', + 'packages/replicate/assets/**', '**/.svelte-kit/**', '**/dist/**', '**/build/**', @@ -42,7 +43,7 @@ export default [ }, { // Allow CommonJS require() in config files - files: ['**/*.config.js', '**/*.config.cjs'], + files: ['**/*.config.js', '**/*.config.cjs', '**/scripts/*.cjs'], rules: { '@typescript-eslint/no-require-imports': 'off', }, diff --git a/packages/replicate/assets/wa-sqlite/ACKNOWLEDGMENTS.md b/packages/replicate/assets/wa-sqlite/ACKNOWLEDGMENTS.md new file mode 100644 index 0000000..c22f983 --- /dev/null +++ b/packages/replicate/assets/wa-sqlite/ACKNOWLEDGMENTS.md @@ -0,0 +1,45 @@ +# Acknowledgments +This project does not use code from [SQL.js](https://sql.js.org/#/), but is inspired and influenced by it. + +This project uses or derives material from the following sources. + +## [sqlite-wasm](https://github.com/mandel59/sqlite-wasm) +Copyright 2017 Ryusei Yamaguchi + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +## [monaco-editor](https://github.com/microsoft/monaco-editor) +Copyright (c) 2016 - present Microsoft Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +## [github-corners](https://github.com/tholman/github-corners) +Copyright (c) 2016 Tim Holman + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +## Pull Request submitters +[//]: # "Use this format (replace 'name' and 'username'): * [name](your URL choice) - [PRs](https://github.com/rhashimoto/wa-sqlite/pulls?q=is%3Apr+author%3Ausername)" diff --git a/packages/replicate/assets/wa-sqlite/LICENSE b/packages/replicate/assets/wa-sqlite/LICENSE new file mode 100644 index 0000000..5715004 --- /dev/null +++ b/packages/replicate/assets/wa-sqlite/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Roy T. Hashimoto + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/replicate/assets/wa-sqlite/dist/wa-sqlite-async.mjs b/packages/replicate/assets/wa-sqlite/dist/wa-sqlite-async.mjs new file mode 100644 index 0000000..4f1de65 --- /dev/null +++ b/packages/replicate/assets/wa-sqlite/dist/wa-sqlite-async.mjs @@ -0,0 +1,16 @@ + +var Module = (() => { + var _scriptDir = import.meta.url; + + return ( +function(moduleArg = {}) { + +var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";var isDataURI=filename=>filename.startsWith(dataURIPrefix);var wasmBinaryFile;if(Module["locateFile"]){wasmBinaryFile="wa-sqlite-async.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}}else{wasmBinaryFile=new URL("wa-sqlite-async.wasm",import.meta.url).href}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}function getBinaryPromise(binaryFile){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{if(!response["ok"]){throw"failed to load wasm binary file at '"+binaryFile+"'"}return response["arrayBuffer"]()}).catch(()=>getBinarySync(binaryFile))}}return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(instance=>instance).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}return instantiateArrayBuffer(binaryFile,imports,callback)}function createWasm(){var info={"a":wasmImports};function receiveInstance(instance,module){wasmExports=instance.exports;wasmExports=Asyncify.instrumentWasmExports(wasmExports);wasmMemory=wasmExports["ja"];updateMemoryViews();wasmTable=wasmExports["bf"];addOnInit(wasmExports["ka"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}var tempDouble;var tempI64;function ExitStatus(status){this.name="ExitStatus";this.message=`Program terminated with exit(${status})`;this.status=status}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":abort("to do getValue(i64) use WASM_BIGINT");case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];case"*":return HEAPU32[ptr>>2];default:abort(`invalid type for getValue: ${type}`)}}var noExitRuntime=Module["noExitRuntime"]||true;function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":abort("to do setValue(i64) use WASM_BIGINT");case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;case"*":HEAPU32[ptr>>2]=value;break;default:abort(`invalid type for setValue: ${type}`)}}var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;var UTF8ArrayToString=(heapOrArray,idx,maxBytesToRead)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var ___assert_fail=(condition,filename,line,func)=>{abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])};var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments);return PATH.normalize(paths.join("/"))},join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else abort("initRandomDevice")};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var zeroMemory=(address,size)=>{HEAPU8.fill(0,address,address+size);return address};var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var mmapAlloc=size=>{size=alignMemory(size,65536);var ptr=_emscripten_builtin_memalign(65536,size);if(!ptr)return 0;return zeroMemory(ptr,size)};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw FS.genericErrors[44]},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{var dep=!noRunDep?getUniqueRunDependency(`al ${url}`):"";readAsync(url,arrayBuffer=>{assert(arrayBuffer,`Loading data file "${url}" failed (no arrayBuffer).`);onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},event=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}});if(dep)addRunDependency(dep)};var FS_createDataFile=(parent,name,fileData,canRead,canWrite,canOwn)=>FS.createDataFile(parent,name,fileData,canRead,canWrite,canOwn);var preloadPlugins=Module["preloadPlugins"]||[];var FS_handledByPreloadPlugin=(byteArray,fullname,finish,onerror)=>{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}};var FS_modeStringToFlags=str=>{var flagModes={"r":0,"r+":2,"w":512|64|1,"w+":512|64|2,"a":1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath(path,opts={}){path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?`${mount}/${path}`:mount+path}path=path?`${node.name}/${path}`:node.name;node=node.parent}},hashName(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get(){return this.node},set(val){this.node=val}},isRead:{get(){return(this.flags&2097155)!==1}},isWrite:{get(){return(this.flags&2097155)!==0}},isAppend:{get(){return this.flags&1024}},flags:{get(){return this.shared.flags},set(val){this.shared.flags=val}},position:{get(){return this.shared.position},set(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var i=0;i0,ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error(`Invalid encoding type "${opts.encoding}"`)}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile(path,data,opts={}){opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams(){if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError(){if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.name="ErrnoError";this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""})},staticInit(){FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS}},init(input,output,error){FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit(){FS.init.initialized=false;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAP32[buf+12>>2]=stat.uid;HEAP32[buf+16>>2]=stat.gid;HEAP32[buf+20>>2]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+24>>2]=tempI64[0],HEAP32[buf+28>>2]=tempI64[1];HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();tempI64=[Math.floor(atime/1e3)>>>0,(tempDouble=Math.floor(atime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAPU32[buf+48>>2]=atime%1e3*1e3;tempI64=[Math.floor(mtime/1e3)>>>0,(tempDouble=Math.floor(mtime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1];HEAPU32[buf+64>>2]=mtime%1e3*1e3;tempI64=[Math.floor(ctime/1e3)>>>0,(tempDouble=Math.floor(ctime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1];HEAPU32[buf+80>>2]=ctime%1e3*1e3;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1];return 0},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get(){var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret},getp(){return SYSCALLS.get()},getStr(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream}};function ___syscall_chmod(path,mode){try{path=SYSCALLS.getStr(path);FS.chmod(path,mode);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_faccessat(dirfd,path,amode,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(amode&~7){return-28}var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fchmod(fd,mode){try{FS.fchmod(fd,mode);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fchown32(fd,owner,group){try{FS.fchown(fd,owner,group);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var setErrNo=value=>{HEAP32[___errno_location()>>2]=value;return value};function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.createStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 5:{var arg=SYSCALLS.getp();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fstat64(fd,buf){try{var stream=SYSCALLS.getStreamFromFD(fd);return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;function ___syscall_ftruncate64(fd,length_low,length_high){var length=convertI32PairToI53Checked(length_low,length_high);try{if(isNaN(length))return 61;FS.ftruncate(fd,length);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);function ___syscall_getcwd(buf,size){try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd)+1;if(sizeHEAPU32[ptr>>2]+HEAP32[ptr+4>>2]*4294967296;function ___syscall_utimensat(dirfd,path,times,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path,true);if(!times){var atime=Date.now();var mtime=atime}else{var seconds=readI53FromI64(times);var nanoseconds=HEAP32[times+8>>2];atime=seconds*1e3+nanoseconds/(1e3*1e3);times+=16;seconds=readI53FromI64(times);nanoseconds=HEAP32[times+8>>2];mtime=seconds*1e3+nanoseconds/(1e3*1e3)}FS.utime(path,atime,mtime);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var isLeapYear=year=>year%4===0&&(year%100!==0||year%400===0);var MONTH_DAYS_LEAP_CUMULATIVE=[0,31,60,91,121,152,182,213,244,274,305,335];var MONTH_DAYS_REGULAR_CUMULATIVE=[0,31,59,90,120,151,181,212,243,273,304,334];var ydayFromDate=date=>{var leap=isLeapYear(date.getFullYear());var monthDaysCumulative=leap?MONTH_DAYS_LEAP_CUMULATIVE:MONTH_DAYS_REGULAR_CUMULATIVE;var yday=monthDaysCumulative[date.getMonth()]+date.getDate()-1;return yday};function __localtime_js(time_low,time_high,tmPtr){var time=convertI32PairToI53Checked(time_low,time_high);var date=new Date(time*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst}function __mmap_js(len,prot,flags,fd,offset_low,offset_high,allocated,addr){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);var res=FS.mmap(stream,len,offset,prot,flags);var ptr=res.ptr;HEAP32[allocated>>2]=res.allocated;HEAPU32[addr>>2]=ptr;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function __munmap_js(addr,len,prot,flags,fd,offset_low,offset_high){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);if(prot&2){SYSCALLS.doMsync(addr,stream,len,flags,offset)}FS.munmap(stream)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var stringToNewUTF8=str=>{var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8(str,ret,size);return ret};var __tzset_js=(timezone,daylight,tzname)=>{var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=stringToNewUTF8(winterName);var summerNamePtr=stringToNewUTF8(summerName);if(summerOffset>2]=winterNamePtr;HEAPU32[tzname+4>>2]=summerNamePtr}else{HEAPU32[tzname>>2]=summerNamePtr;HEAPU32[tzname+4>>2]=winterNamePtr}};var _emscripten_date_now=()=>Date.now();var _emscripten_get_now;_emscripten_get_now=()=>performance.now();var getHeapMax=()=>2147483648;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var stringToAscii=(str,buffer)=>{for(var i=0;i>0]=str.charCodeAt(i)}HEAP8[buffer>>0]=0};var _environ_get=(__environ,environ_buf)=>{var bufSize=0;getEnvStrings().forEach((string,i)=>{var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;stringToAscii(string,ptr);bufSize+=string.length+1});return 0};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(string=>bufSize+=string.length+1);HEAPU32[penviron_buf_size>>2]=bufSize;return 0};function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_fdstat_get(fd,pbuf){try{var rightsBase=0;var rightsInheriting=0;var flags=0;{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4}HEAP8[pbuf>>0]=type;HEAP16[pbuf+2>>1]=flags;tempI64=[rightsBase>>>0,(tempDouble=rightsBase,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[pbuf+8>>2]=tempI64[0],HEAP32[pbuf+12>>2]=tempI64[1];tempI64=[rightsInheriting>>>0,(tempDouble=rightsInheriting,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[pbuf+16>>2]=tempI64[0],HEAP32[pbuf+20>>2]=tempI64[1];return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var _fd_sync=function(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);return Asyncify.handleSleep(wakeUp=>{var mount=stream.node.mount;if(!mount.type.syncfs){wakeUp(0);return}mount.type.syncfs(mount,false,err=>{if(err){wakeUp(29);return}wakeUp(0)})})}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}};_fd_sync.isAsync=true;var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(typeof offset!=="undefined"){offset+=curr}}return ret};function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var adapters_support=function(){const handleAsync=typeof Asyncify==="object"?Asyncify.handleAsync.bind(Asyncify):null;Module["handleAsync"]=handleAsync;const targets=new Map;Module["setCallback"]=(key,target)=>targets.set(key,target);Module["getCallback"]=key=>targets.get(key);Module["deleteCallback"]=key=>targets.delete(key);adapters_support=function(isAsync,key,...args){const receiver=targets.get(key);let methodName=null;const f=typeof receiver==="function"?receiver:receiver[methodName=UTF8ToString(args.shift())];if(isAsync){if(handleAsync){return handleAsync(()=>f.apply(receiver,args))}throw new Error("Synchronous WebAssembly cannot call async function")}const result=f.apply(receiver,args);if(typeof result?.then=="function"){console.error("unexpected Promise",f);throw new Error(`${methodName} unexpectedly returned a Promise`)}return result}};function _ipp(...args){return adapters_support(false,...args)}function _ipp_async(...args){return adapters_support(true,...args)}_ipp_async.isAsync=true;function _ippipppp(...args){return adapters_support(false,...args)}function _ippipppp_async(...args){return adapters_support(true,...args)}_ippipppp_async.isAsync=true;function _ippp(...args){return adapters_support(false,...args)}function _ippp_async(...args){return adapters_support(true,...args)}_ippp_async.isAsync=true;function _ipppi(...args){return adapters_support(false,...args)}function _ipppi_async(...args){return adapters_support(true,...args)}_ipppi_async.isAsync=true;function _ipppiii(...args){return adapters_support(false,...args)}function _ipppiii_async(...args){return adapters_support(true,...args)}_ipppiii_async.isAsync=true;function _ipppiiip(...args){return adapters_support(false,...args)}function _ipppiiip_async(...args){return adapters_support(true,...args)}_ipppiiip_async.isAsync=true;function _ipppip(...args){return adapters_support(false,...args)}function _ipppip_async(...args){return adapters_support(true,...args)}_ipppip_async.isAsync=true;function _ipppj(...args){return adapters_support(false,...args)}function _ipppj_async(...args){return adapters_support(true,...args)}_ipppj_async.isAsync=true;function _ipppp(...args){return adapters_support(false,...args)}function _ipppp_async(...args){return adapters_support(true,...args)}_ipppp_async.isAsync=true;function _ippppi(...args){return adapters_support(false,...args)}function _ippppi_async(...args){return adapters_support(true,...args)}_ippppi_async.isAsync=true;function _ippppij(...args){return adapters_support(false,...args)}function _ippppij_async(...args){return adapters_support(true,...args)}_ippppij_async.isAsync=true;function _ippppip(...args){return adapters_support(false,...args)}function _ippppip_async(...args){return adapters_support(true,...args)}_ippppip_async.isAsync=true;function _ipppppip(...args){return adapters_support(false,...args)}function _ipppppip_async(...args){return adapters_support(true,...args)}_ipppppip_async.isAsync=true;function _vppp(...args){return adapters_support(false,...args)}function _vppp_async(...args){return adapters_support(true,...args)}_vppp_async.isAsync=true;function _vpppip(...args){return adapters_support(false,...args)}function _vpppip_async(...args){return adapters_support(true,...args)}_vpppip_async.isAsync=true;var runtimeKeepaliveCounter=0;var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var runAndAbortIfError=func=>{try{return func()}catch(e){abort(e)}};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var sigToWasmTypes=sig=>{var typeNames={"i":"i32","j":"i64","f":"f32","d":"f64","e":"externref","p":"i32"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i{runtimeKeepaliveCounter+=1};var runtimeKeepalivePop=()=>{runtimeKeepaliveCounter-=1};var Asyncify={instrumentWasmImports(imports){var importPattern=/^(ipp|ipp_async|ippp|ippp_async|vppp|vppp_async|ipppj|ipppj_async|ipppi|ipppi_async|ipppp|ipppp_async|ipppip|ipppip_async|vpppip|vpppip_async|ippppi|ippppi_async|ippppij|ippppij_async|ipppiii|ipppiii_async|ippppip|ippppip_async|ippipppp|ippipppp_async|ipppppip|ipppppip_async|ipppiiip|ipppiiip_async|invoke_.*|__asyncjs__.*)$/;for(var x in imports){(function(x){var original=imports[x];var sig=original.sig;if(typeof original=="function"){var isAsyncifyImport=original.isAsync||importPattern.test(x)}})(x)}},instrumentWasmExports(exports){var ret={};for(var x in exports){(function(x){var original=exports[x];if(typeof original=="function"){ret[x]=function(){Asyncify.exportCallStack.push(x);try{return original.apply(null,arguments)}finally{if(!ABORT){var y=Asyncify.exportCallStack.pop();assert(y===x);Asyncify.maybeStopUnwind()}}}}else{ret[x]=original}})(x)}return ret},State:{Normal:0,Unwinding:1,Rewinding:2,Disabled:3},state:0,StackSize:16384,currData:null,handleSleepReturnValue:0,exportCallStack:[],callStackNameToId:{},callStackIdToName:{},callStackId:0,asyncPromiseHandlers:null,sleepCallbacks:[],getCallStackId(funcName){var id=Asyncify.callStackNameToId[funcName];if(id===undefined){id=Asyncify.callStackId++;Asyncify.callStackNameToId[funcName]=id;Asyncify.callStackIdToName[id]=funcName}return id},maybeStopUnwind(){if(Asyncify.currData&&Asyncify.state===Asyncify.State.Unwinding&&Asyncify.exportCallStack.length===0){Asyncify.state=Asyncify.State.Normal;runAndAbortIfError(_asyncify_stop_unwind);if(typeof Fibers!="undefined"){Fibers.trampoline()}}},whenDone(){return new Promise((resolve,reject)=>{Asyncify.asyncPromiseHandlers={resolve:resolve,reject:reject}})},allocateData(){var ptr=_malloc(12+Asyncify.StackSize);Asyncify.setDataHeader(ptr,ptr+12,Asyncify.StackSize);Asyncify.setDataRewindFunc(ptr);return ptr},setDataHeader(ptr,stack,stackSize){HEAPU32[ptr>>2]=stack;HEAPU32[ptr+4>>2]=stack+stackSize},setDataRewindFunc(ptr){var bottomOfCallStack=Asyncify.exportCallStack[0];var rewindId=Asyncify.getCallStackId(bottomOfCallStack);HEAP32[ptr+8>>2]=rewindId},getDataRewindFunc(ptr){var id=HEAP32[ptr+8>>2];var name=Asyncify.callStackIdToName[id];var func=wasmExports[name];return func},doRewind(ptr){var start=Asyncify.getDataRewindFunc(ptr);return start()},handleSleep(startAsync){if(ABORT)return;if(Asyncify.state===Asyncify.State.Normal){var reachedCallback=false;var reachedAfterCallback=false;startAsync((handleSleepReturnValue=0)=>{if(ABORT)return;Asyncify.handleSleepReturnValue=handleSleepReturnValue;reachedCallback=true;if(!reachedAfterCallback){return}Asyncify.state=Asyncify.State.Rewinding;runAndAbortIfError(()=>_asyncify_start_rewind(Asyncify.currData));if(typeof Browser!="undefined"&&Browser.mainLoop.func){Browser.mainLoop.resume()}var asyncWasmReturnValue,isError=false;try{asyncWasmReturnValue=Asyncify.doRewind(Asyncify.currData)}catch(err){asyncWasmReturnValue=err;isError=true}var handled=false;if(!Asyncify.currData){var asyncPromiseHandlers=Asyncify.asyncPromiseHandlers;if(asyncPromiseHandlers){Asyncify.asyncPromiseHandlers=null;(isError?asyncPromiseHandlers.reject:asyncPromiseHandlers.resolve)(asyncWasmReturnValue);handled=true}}if(isError&&!handled){throw asyncWasmReturnValue}});reachedAfterCallback=true;if(!reachedCallback){Asyncify.state=Asyncify.State.Unwinding;Asyncify.currData=Asyncify.allocateData();if(typeof Browser!="undefined"&&Browser.mainLoop.func){Browser.mainLoop.pause()}runAndAbortIfError(()=>_asyncify_start_unwind(Asyncify.currData))}}else if(Asyncify.state===Asyncify.State.Rewinding){Asyncify.state=Asyncify.State.Normal;runAndAbortIfError(_asyncify_stop_rewind);_free(Asyncify.currData);Asyncify.currData=null;Asyncify.sleepCallbacks.forEach(func=>callUserCallback(func))}else{abort(`invalid state: ${Asyncify.state}`)}return Asyncify.handleSleepReturnValue},handleAsync(startAsync){return Asyncify.handleSleep(wakeUp=>{startAsync().then(wakeUp)})}};var uleb128Encode=(n,target)=>{if(n<128){target.push(n)}else{target.push(n%128|128,n>>7)}};var generateFuncType=(sig,target)=>{var sigRet=sig.slice(0,1);var sigParam=sig.slice(1);var typeCodes={"i":127,"p":127,"j":126,"f":125,"d":124,"e":111};target.push(96);uleb128Encode(sigParam.length,target);for(var i=0;i{if(typeof WebAssembly.Function=="function"){return new WebAssembly.Function(sigToWasmTypes(sig),func)}var typeSectionBody=[1];generateFuncType(sig,typeSectionBody);var bytes=[0,97,115,109,1,0,0,0,1];uleb128Encode(typeSectionBody.length,bytes);bytes.push.apply(bytes,typeSectionBody);bytes.push(2,7,1,1,101,1,102,0,0,7,5,1,1,102,0,0);var module=new WebAssembly.Module(new Uint8Array(bytes));var instance=new WebAssembly.Instance(module,{"e":{"f":func}});var wrappedFunc=instance.exports["f"];return wrappedFunc};var wasmTable;var getWasmTableEntry=funcPtr=>wasmTable.get(funcPtr);var updateTableMap=(offset,count)=>{if(functionsInTableMap){for(var i=offset;i{if(!functionsInTableMap){functionsInTableMap=new WeakMap;updateTableMap(0,wasmTable.length)}return functionsInTableMap.get(func)||0};var freeTableIndexes=[];var getEmptyTableSlot=()=>{if(freeTableIndexes.length){return freeTableIndexes.pop()}try{wasmTable.grow(1)}catch(err){if(!(err instanceof RangeError)){throw err}throw"Unable to grow wasm table. Set ALLOW_TABLE_GROWTH."}return wasmTable.length-1};var setWasmTableEntry=(idx,func)=>wasmTable.set(idx,func);var addFunction=(func,sig)=>{var rtn=getFunctionAddress(func);if(rtn){return rtn}var ret=getEmptyTableSlot();try{setWasmTableEntry(ret,func)}catch(err){if(!(err instanceof TypeError)){throw err}var wrapped=convertJsFunctionToWasm(func,sig);setWasmTableEntry(ret,wrapped)}functionsInTableMap.set(func,ret);return ret};var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={"string":str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},"array":arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return function(){return ccall(ident,returnType,argTypes,arguments,opts)}};var stringToUTF16=(str,outPtr,maxBytesToWrite)=>{if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr};var stringToUTF32=(str,outPtr,maxBytesToWrite)=>{if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr};var AsciiToString=ptr=>{var str="";while(1){var ch=HEAPU8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}};var UTF16Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf-16le"):undefined;var UTF16ToString=(ptr,maxBytesToRead)=>{var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder)return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr));var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str};var UTF32ToString=(ptr,maxBytesToRead)=>{var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str};function intArrayToString(array){var ret=[];for(var i=0;i255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();adapters_support();var wasmImports={a:___assert_fail,Y:___syscall_chmod,$:___syscall_faccessat,Z:___syscall_fchmod,X:___syscall_fchown32,b:___syscall_fcntl64,W:___syscall_fstat64,y:___syscall_ftruncate64,Q:___syscall_getcwd,U:___syscall_lstat64,N:___syscall_mkdirat,T:___syscall_newfstatat,M:___syscall_openat,K:___syscall_readlinkat,J:___syscall_rmdir,V:___syscall_stat64,G:___syscall_unlinkat,F:___syscall_utimensat,w:__localtime_js,u:__mmap_js,v:__munmap_js,H:__tzset_js,n:_emscripten_date_now,m:_emscripten_get_now,D:_emscripten_resize_heap,O:_environ_get,P:_environ_sizes_get,o:_fd_close,E:_fd_fdstat_get,L:_fd_read,x:_fd_seek,S:_fd_sync,I:_fd_write,s:_ipp,t:_ipp_async,fa:_ippipppp,ia:_ippipppp_async,i:_ippp,j:_ippp_async,c:_ipppi,d:_ipppi_async,ca:_ipppiii,da:_ipppiii_async,ea:_ipppiiip,ga:_ipppiiip_async,g:_ipppip,h:_ipppip_async,z:_ipppj,A:_ipppj_async,e:_ipppp,f:_ipppp_async,aa:_ippppi,ba:_ippppi_async,B:_ippppij,C:_ippppij_async,p:_ippppip,q:_ippppip_async,ha:_ipppppip,r:_ipppppip_async,k:_vppp,l:_vppp_async,R:_vpppip,_:_vpppip_async};var wasmExports=createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["ka"])();var _sqlite3_status64=Module["_sqlite3_status64"]=(a0,a1,a2,a3)=>(_sqlite3_status64=Module["_sqlite3_status64"]=wasmExports["la"])(a0,a1,a2,a3);var _sqlite3_status=Module["_sqlite3_status"]=(a0,a1,a2,a3)=>(_sqlite3_status=Module["_sqlite3_status"]=wasmExports["ma"])(a0,a1,a2,a3);var _sqlite3_db_status=Module["_sqlite3_db_status"]=(a0,a1,a2,a3,a4)=>(_sqlite3_db_status=Module["_sqlite3_db_status"]=wasmExports["na"])(a0,a1,a2,a3,a4);var _sqlite3_msize=Module["_sqlite3_msize"]=a0=>(_sqlite3_msize=Module["_sqlite3_msize"]=wasmExports["oa"])(a0);var _sqlite3_vfs_find=Module["_sqlite3_vfs_find"]=a0=>(_sqlite3_vfs_find=Module["_sqlite3_vfs_find"]=wasmExports["pa"])(a0);var _sqlite3_vfs_register=Module["_sqlite3_vfs_register"]=(a0,a1)=>(_sqlite3_vfs_register=Module["_sqlite3_vfs_register"]=wasmExports["qa"])(a0,a1);var _sqlite3_vfs_unregister=Module["_sqlite3_vfs_unregister"]=a0=>(_sqlite3_vfs_unregister=Module["_sqlite3_vfs_unregister"]=wasmExports["ra"])(a0);var _sqlite3_release_memory=Module["_sqlite3_release_memory"]=a0=>(_sqlite3_release_memory=Module["_sqlite3_release_memory"]=wasmExports["sa"])(a0);var _sqlite3_soft_heap_limit64=Module["_sqlite3_soft_heap_limit64"]=(a0,a1)=>(_sqlite3_soft_heap_limit64=Module["_sqlite3_soft_heap_limit64"]=wasmExports["ta"])(a0,a1);var _sqlite3_memory_used=Module["_sqlite3_memory_used"]=()=>(_sqlite3_memory_used=Module["_sqlite3_memory_used"]=wasmExports["ua"])();var _sqlite3_hard_heap_limit64=Module["_sqlite3_hard_heap_limit64"]=(a0,a1)=>(_sqlite3_hard_heap_limit64=Module["_sqlite3_hard_heap_limit64"]=wasmExports["va"])(a0,a1);var _sqlite3_memory_highwater=Module["_sqlite3_memory_highwater"]=a0=>(_sqlite3_memory_highwater=Module["_sqlite3_memory_highwater"]=wasmExports["wa"])(a0);var _sqlite3_malloc=Module["_sqlite3_malloc"]=a0=>(_sqlite3_malloc=Module["_sqlite3_malloc"]=wasmExports["xa"])(a0);var _sqlite3_malloc64=Module["_sqlite3_malloc64"]=(a0,a1)=>(_sqlite3_malloc64=Module["_sqlite3_malloc64"]=wasmExports["ya"])(a0,a1);var _sqlite3_free=Module["_sqlite3_free"]=a0=>(_sqlite3_free=Module["_sqlite3_free"]=wasmExports["za"])(a0);var _sqlite3_realloc=Module["_sqlite3_realloc"]=(a0,a1)=>(_sqlite3_realloc=Module["_sqlite3_realloc"]=wasmExports["Aa"])(a0,a1);var _sqlite3_realloc64=Module["_sqlite3_realloc64"]=(a0,a1,a2)=>(_sqlite3_realloc64=Module["_sqlite3_realloc64"]=wasmExports["Ba"])(a0,a1,a2);var _sqlite3_str_vappendf=Module["_sqlite3_str_vappendf"]=(a0,a1,a2)=>(_sqlite3_str_vappendf=Module["_sqlite3_str_vappendf"]=wasmExports["Ca"])(a0,a1,a2);var _sqlite3_str_append=Module["_sqlite3_str_append"]=(a0,a1,a2)=>(_sqlite3_str_append=Module["_sqlite3_str_append"]=wasmExports["Da"])(a0,a1,a2);var _sqlite3_str_appendchar=Module["_sqlite3_str_appendchar"]=(a0,a1,a2)=>(_sqlite3_str_appendchar=Module["_sqlite3_str_appendchar"]=wasmExports["Ea"])(a0,a1,a2);var _sqlite3_str_appendall=Module["_sqlite3_str_appendall"]=(a0,a1)=>(_sqlite3_str_appendall=Module["_sqlite3_str_appendall"]=wasmExports["Fa"])(a0,a1);var _sqlite3_str_appendf=Module["_sqlite3_str_appendf"]=(a0,a1,a2)=>(_sqlite3_str_appendf=Module["_sqlite3_str_appendf"]=wasmExports["Ga"])(a0,a1,a2);var _sqlite3_str_finish=Module["_sqlite3_str_finish"]=a0=>(_sqlite3_str_finish=Module["_sqlite3_str_finish"]=wasmExports["Ha"])(a0);var _sqlite3_str_errcode=Module["_sqlite3_str_errcode"]=a0=>(_sqlite3_str_errcode=Module["_sqlite3_str_errcode"]=wasmExports["Ia"])(a0);var _sqlite3_str_length=Module["_sqlite3_str_length"]=a0=>(_sqlite3_str_length=Module["_sqlite3_str_length"]=wasmExports["Ja"])(a0);var _sqlite3_str_value=Module["_sqlite3_str_value"]=a0=>(_sqlite3_str_value=Module["_sqlite3_str_value"]=wasmExports["Ka"])(a0);var _sqlite3_str_reset=Module["_sqlite3_str_reset"]=a0=>(_sqlite3_str_reset=Module["_sqlite3_str_reset"]=wasmExports["La"])(a0);var _sqlite3_str_new=Module["_sqlite3_str_new"]=a0=>(_sqlite3_str_new=Module["_sqlite3_str_new"]=wasmExports["Ma"])(a0);var _sqlite3_vmprintf=Module["_sqlite3_vmprintf"]=(a0,a1)=>(_sqlite3_vmprintf=Module["_sqlite3_vmprintf"]=wasmExports["Na"])(a0,a1);var _sqlite3_mprintf=Module["_sqlite3_mprintf"]=(a0,a1)=>(_sqlite3_mprintf=Module["_sqlite3_mprintf"]=wasmExports["Oa"])(a0,a1);var _sqlite3_vsnprintf=Module["_sqlite3_vsnprintf"]=(a0,a1,a2,a3)=>(_sqlite3_vsnprintf=Module["_sqlite3_vsnprintf"]=wasmExports["Pa"])(a0,a1,a2,a3);var _sqlite3_snprintf=Module["_sqlite3_snprintf"]=(a0,a1,a2,a3)=>(_sqlite3_snprintf=Module["_sqlite3_snprintf"]=wasmExports["Qa"])(a0,a1,a2,a3);var _sqlite3_log=Module["_sqlite3_log"]=(a0,a1,a2)=>(_sqlite3_log=Module["_sqlite3_log"]=wasmExports["Ra"])(a0,a1,a2);var _sqlite3_randomness=Module["_sqlite3_randomness"]=(a0,a1)=>(_sqlite3_randomness=Module["_sqlite3_randomness"]=wasmExports["Sa"])(a0,a1);var _sqlite3_stricmp=Module["_sqlite3_stricmp"]=(a0,a1)=>(_sqlite3_stricmp=Module["_sqlite3_stricmp"]=wasmExports["Ta"])(a0,a1);var _sqlite3_strnicmp=Module["_sqlite3_strnicmp"]=(a0,a1,a2)=>(_sqlite3_strnicmp=Module["_sqlite3_strnicmp"]=wasmExports["Ua"])(a0,a1,a2);var _sqlite3_os_init=Module["_sqlite3_os_init"]=()=>(_sqlite3_os_init=Module["_sqlite3_os_init"]=wasmExports["Va"])();var _sqlite3_os_end=Module["_sqlite3_os_end"]=()=>(_sqlite3_os_end=Module["_sqlite3_os_end"]=wasmExports["Wa"])();var _sqlite3_serialize=Module["_sqlite3_serialize"]=(a0,a1,a2,a3)=>(_sqlite3_serialize=Module["_sqlite3_serialize"]=wasmExports["Xa"])(a0,a1,a2,a3);var _sqlite3_prepare_v2=Module["_sqlite3_prepare_v2"]=(a0,a1,a2,a3,a4)=>(_sqlite3_prepare_v2=Module["_sqlite3_prepare_v2"]=wasmExports["Ya"])(a0,a1,a2,a3,a4);var _sqlite3_step=Module["_sqlite3_step"]=a0=>(_sqlite3_step=Module["_sqlite3_step"]=wasmExports["Za"])(a0);var _sqlite3_column_int64=Module["_sqlite3_column_int64"]=(a0,a1)=>(_sqlite3_column_int64=Module["_sqlite3_column_int64"]=wasmExports["_a"])(a0,a1);var _sqlite3_reset=Module["_sqlite3_reset"]=a0=>(_sqlite3_reset=Module["_sqlite3_reset"]=wasmExports["$a"])(a0);var _sqlite3_exec=Module["_sqlite3_exec"]=(a0,a1,a2,a3,a4)=>(_sqlite3_exec=Module["_sqlite3_exec"]=wasmExports["ab"])(a0,a1,a2,a3,a4);var _sqlite3_column_int=Module["_sqlite3_column_int"]=(a0,a1)=>(_sqlite3_column_int=Module["_sqlite3_column_int"]=wasmExports["bb"])(a0,a1);var _sqlite3_finalize=Module["_sqlite3_finalize"]=a0=>(_sqlite3_finalize=Module["_sqlite3_finalize"]=wasmExports["cb"])(a0);var _sqlite3_deserialize=Module["_sqlite3_deserialize"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_sqlite3_deserialize=Module["_sqlite3_deserialize"]=wasmExports["db"])(a0,a1,a2,a3,a4,a5,a6,a7);var _sqlite3_database_file_object=Module["_sqlite3_database_file_object"]=a0=>(_sqlite3_database_file_object=Module["_sqlite3_database_file_object"]=wasmExports["eb"])(a0);var _sqlite3_backup_init=Module["_sqlite3_backup_init"]=(a0,a1,a2,a3)=>(_sqlite3_backup_init=Module["_sqlite3_backup_init"]=wasmExports["fb"])(a0,a1,a2,a3);var _sqlite3_backup_step=Module["_sqlite3_backup_step"]=(a0,a1)=>(_sqlite3_backup_step=Module["_sqlite3_backup_step"]=wasmExports["gb"])(a0,a1);var _sqlite3_backup_finish=Module["_sqlite3_backup_finish"]=a0=>(_sqlite3_backup_finish=Module["_sqlite3_backup_finish"]=wasmExports["hb"])(a0);var _sqlite3_backup_remaining=Module["_sqlite3_backup_remaining"]=a0=>(_sqlite3_backup_remaining=Module["_sqlite3_backup_remaining"]=wasmExports["ib"])(a0);var _sqlite3_backup_pagecount=Module["_sqlite3_backup_pagecount"]=a0=>(_sqlite3_backup_pagecount=Module["_sqlite3_backup_pagecount"]=wasmExports["jb"])(a0);var _sqlite3_clear_bindings=Module["_sqlite3_clear_bindings"]=a0=>(_sqlite3_clear_bindings=Module["_sqlite3_clear_bindings"]=wasmExports["kb"])(a0);var _sqlite3_value_blob=Module["_sqlite3_value_blob"]=a0=>(_sqlite3_value_blob=Module["_sqlite3_value_blob"]=wasmExports["lb"])(a0);var _sqlite3_value_text=Module["_sqlite3_value_text"]=a0=>(_sqlite3_value_text=Module["_sqlite3_value_text"]=wasmExports["mb"])(a0);var _sqlite3_value_bytes=Module["_sqlite3_value_bytes"]=a0=>(_sqlite3_value_bytes=Module["_sqlite3_value_bytes"]=wasmExports["nb"])(a0);var _sqlite3_value_bytes16=Module["_sqlite3_value_bytes16"]=a0=>(_sqlite3_value_bytes16=Module["_sqlite3_value_bytes16"]=wasmExports["ob"])(a0);var _sqlite3_value_double=Module["_sqlite3_value_double"]=a0=>(_sqlite3_value_double=Module["_sqlite3_value_double"]=wasmExports["pb"])(a0);var _sqlite3_value_int=Module["_sqlite3_value_int"]=a0=>(_sqlite3_value_int=Module["_sqlite3_value_int"]=wasmExports["qb"])(a0);var _sqlite3_value_int64=Module["_sqlite3_value_int64"]=a0=>(_sqlite3_value_int64=Module["_sqlite3_value_int64"]=wasmExports["rb"])(a0);var _sqlite3_value_subtype=Module["_sqlite3_value_subtype"]=a0=>(_sqlite3_value_subtype=Module["_sqlite3_value_subtype"]=wasmExports["sb"])(a0);var _sqlite3_value_pointer=Module["_sqlite3_value_pointer"]=(a0,a1)=>(_sqlite3_value_pointer=Module["_sqlite3_value_pointer"]=wasmExports["tb"])(a0,a1);var _sqlite3_value_text16=Module["_sqlite3_value_text16"]=a0=>(_sqlite3_value_text16=Module["_sqlite3_value_text16"]=wasmExports["ub"])(a0);var _sqlite3_value_text16be=Module["_sqlite3_value_text16be"]=a0=>(_sqlite3_value_text16be=Module["_sqlite3_value_text16be"]=wasmExports["vb"])(a0);var _sqlite3_value_text16le=Module["_sqlite3_value_text16le"]=a0=>(_sqlite3_value_text16le=Module["_sqlite3_value_text16le"]=wasmExports["wb"])(a0);var _sqlite3_value_type=Module["_sqlite3_value_type"]=a0=>(_sqlite3_value_type=Module["_sqlite3_value_type"]=wasmExports["xb"])(a0);var _sqlite3_value_encoding=Module["_sqlite3_value_encoding"]=a0=>(_sqlite3_value_encoding=Module["_sqlite3_value_encoding"]=wasmExports["yb"])(a0);var _sqlite3_value_nochange=Module["_sqlite3_value_nochange"]=a0=>(_sqlite3_value_nochange=Module["_sqlite3_value_nochange"]=wasmExports["zb"])(a0);var _sqlite3_value_frombind=Module["_sqlite3_value_frombind"]=a0=>(_sqlite3_value_frombind=Module["_sqlite3_value_frombind"]=wasmExports["Ab"])(a0);var _sqlite3_value_dup=Module["_sqlite3_value_dup"]=a0=>(_sqlite3_value_dup=Module["_sqlite3_value_dup"]=wasmExports["Bb"])(a0);var _sqlite3_value_free=Module["_sqlite3_value_free"]=a0=>(_sqlite3_value_free=Module["_sqlite3_value_free"]=wasmExports["Cb"])(a0);var _sqlite3_result_blob=Module["_sqlite3_result_blob"]=(a0,a1,a2,a3)=>(_sqlite3_result_blob=Module["_sqlite3_result_blob"]=wasmExports["Db"])(a0,a1,a2,a3);var _sqlite3_result_blob64=Module["_sqlite3_result_blob64"]=(a0,a1,a2,a3,a4)=>(_sqlite3_result_blob64=Module["_sqlite3_result_blob64"]=wasmExports["Eb"])(a0,a1,a2,a3,a4);var _sqlite3_result_double=Module["_sqlite3_result_double"]=(a0,a1)=>(_sqlite3_result_double=Module["_sqlite3_result_double"]=wasmExports["Fb"])(a0,a1);var _sqlite3_result_error=Module["_sqlite3_result_error"]=(a0,a1,a2)=>(_sqlite3_result_error=Module["_sqlite3_result_error"]=wasmExports["Gb"])(a0,a1,a2);var _sqlite3_result_error16=Module["_sqlite3_result_error16"]=(a0,a1,a2)=>(_sqlite3_result_error16=Module["_sqlite3_result_error16"]=wasmExports["Hb"])(a0,a1,a2);var _sqlite3_result_int=Module["_sqlite3_result_int"]=(a0,a1)=>(_sqlite3_result_int=Module["_sqlite3_result_int"]=wasmExports["Ib"])(a0,a1);var _sqlite3_result_int64=Module["_sqlite3_result_int64"]=(a0,a1,a2)=>(_sqlite3_result_int64=Module["_sqlite3_result_int64"]=wasmExports["Jb"])(a0,a1,a2);var _sqlite3_result_null=Module["_sqlite3_result_null"]=a0=>(_sqlite3_result_null=Module["_sqlite3_result_null"]=wasmExports["Kb"])(a0);var _sqlite3_result_pointer=Module["_sqlite3_result_pointer"]=(a0,a1,a2,a3)=>(_sqlite3_result_pointer=Module["_sqlite3_result_pointer"]=wasmExports["Lb"])(a0,a1,a2,a3);var _sqlite3_result_subtype=Module["_sqlite3_result_subtype"]=(a0,a1)=>(_sqlite3_result_subtype=Module["_sqlite3_result_subtype"]=wasmExports["Mb"])(a0,a1);var _sqlite3_result_text=Module["_sqlite3_result_text"]=(a0,a1,a2,a3)=>(_sqlite3_result_text=Module["_sqlite3_result_text"]=wasmExports["Nb"])(a0,a1,a2,a3);var _sqlite3_result_text64=Module["_sqlite3_result_text64"]=(a0,a1,a2,a3,a4,a5)=>(_sqlite3_result_text64=Module["_sqlite3_result_text64"]=wasmExports["Ob"])(a0,a1,a2,a3,a4,a5);var _sqlite3_result_text16=Module["_sqlite3_result_text16"]=(a0,a1,a2,a3)=>(_sqlite3_result_text16=Module["_sqlite3_result_text16"]=wasmExports["Pb"])(a0,a1,a2,a3);var _sqlite3_result_text16be=Module["_sqlite3_result_text16be"]=(a0,a1,a2,a3)=>(_sqlite3_result_text16be=Module["_sqlite3_result_text16be"]=wasmExports["Qb"])(a0,a1,a2,a3);var _sqlite3_result_text16le=Module["_sqlite3_result_text16le"]=(a0,a1,a2,a3)=>(_sqlite3_result_text16le=Module["_sqlite3_result_text16le"]=wasmExports["Rb"])(a0,a1,a2,a3);var _sqlite3_result_value=Module["_sqlite3_result_value"]=(a0,a1)=>(_sqlite3_result_value=Module["_sqlite3_result_value"]=wasmExports["Sb"])(a0,a1);var _sqlite3_result_error_toobig=Module["_sqlite3_result_error_toobig"]=a0=>(_sqlite3_result_error_toobig=Module["_sqlite3_result_error_toobig"]=wasmExports["Tb"])(a0);var _sqlite3_result_zeroblob=Module["_sqlite3_result_zeroblob"]=(a0,a1)=>(_sqlite3_result_zeroblob=Module["_sqlite3_result_zeroblob"]=wasmExports["Ub"])(a0,a1);var _sqlite3_result_zeroblob64=Module["_sqlite3_result_zeroblob64"]=(a0,a1,a2)=>(_sqlite3_result_zeroblob64=Module["_sqlite3_result_zeroblob64"]=wasmExports["Vb"])(a0,a1,a2);var _sqlite3_result_error_code=Module["_sqlite3_result_error_code"]=(a0,a1)=>(_sqlite3_result_error_code=Module["_sqlite3_result_error_code"]=wasmExports["Wb"])(a0,a1);var _sqlite3_result_error_nomem=Module["_sqlite3_result_error_nomem"]=a0=>(_sqlite3_result_error_nomem=Module["_sqlite3_result_error_nomem"]=wasmExports["Xb"])(a0);var _sqlite3_user_data=Module["_sqlite3_user_data"]=a0=>(_sqlite3_user_data=Module["_sqlite3_user_data"]=wasmExports["Yb"])(a0);var _sqlite3_context_db_handle=Module["_sqlite3_context_db_handle"]=a0=>(_sqlite3_context_db_handle=Module["_sqlite3_context_db_handle"]=wasmExports["Zb"])(a0);var _sqlite3_vtab_nochange=Module["_sqlite3_vtab_nochange"]=a0=>(_sqlite3_vtab_nochange=Module["_sqlite3_vtab_nochange"]=wasmExports["_b"])(a0);var _sqlite3_vtab_in_first=Module["_sqlite3_vtab_in_first"]=(a0,a1)=>(_sqlite3_vtab_in_first=Module["_sqlite3_vtab_in_first"]=wasmExports["$b"])(a0,a1);var _sqlite3_vtab_in_next=Module["_sqlite3_vtab_in_next"]=(a0,a1)=>(_sqlite3_vtab_in_next=Module["_sqlite3_vtab_in_next"]=wasmExports["ac"])(a0,a1);var _sqlite3_aggregate_context=Module["_sqlite3_aggregate_context"]=(a0,a1)=>(_sqlite3_aggregate_context=Module["_sqlite3_aggregate_context"]=wasmExports["bc"])(a0,a1);var _sqlite3_get_auxdata=Module["_sqlite3_get_auxdata"]=(a0,a1)=>(_sqlite3_get_auxdata=Module["_sqlite3_get_auxdata"]=wasmExports["cc"])(a0,a1);var _sqlite3_set_auxdata=Module["_sqlite3_set_auxdata"]=(a0,a1,a2,a3)=>(_sqlite3_set_auxdata=Module["_sqlite3_set_auxdata"]=wasmExports["dc"])(a0,a1,a2,a3);var _sqlite3_column_count=Module["_sqlite3_column_count"]=a0=>(_sqlite3_column_count=Module["_sqlite3_column_count"]=wasmExports["ec"])(a0);var _sqlite3_data_count=Module["_sqlite3_data_count"]=a0=>(_sqlite3_data_count=Module["_sqlite3_data_count"]=wasmExports["fc"])(a0);var _sqlite3_column_blob=Module["_sqlite3_column_blob"]=(a0,a1)=>(_sqlite3_column_blob=Module["_sqlite3_column_blob"]=wasmExports["gc"])(a0,a1);var _sqlite3_column_bytes=Module["_sqlite3_column_bytes"]=(a0,a1)=>(_sqlite3_column_bytes=Module["_sqlite3_column_bytes"]=wasmExports["hc"])(a0,a1);var _sqlite3_column_bytes16=Module["_sqlite3_column_bytes16"]=(a0,a1)=>(_sqlite3_column_bytes16=Module["_sqlite3_column_bytes16"]=wasmExports["ic"])(a0,a1);var _sqlite3_column_double=Module["_sqlite3_column_double"]=(a0,a1)=>(_sqlite3_column_double=Module["_sqlite3_column_double"]=wasmExports["jc"])(a0,a1);var _sqlite3_column_text=Module["_sqlite3_column_text"]=(a0,a1)=>(_sqlite3_column_text=Module["_sqlite3_column_text"]=wasmExports["kc"])(a0,a1);var _sqlite3_column_value=Module["_sqlite3_column_value"]=(a0,a1)=>(_sqlite3_column_value=Module["_sqlite3_column_value"]=wasmExports["lc"])(a0,a1);var _sqlite3_column_text16=Module["_sqlite3_column_text16"]=(a0,a1)=>(_sqlite3_column_text16=Module["_sqlite3_column_text16"]=wasmExports["mc"])(a0,a1);var _sqlite3_column_type=Module["_sqlite3_column_type"]=(a0,a1)=>(_sqlite3_column_type=Module["_sqlite3_column_type"]=wasmExports["nc"])(a0,a1);var _sqlite3_column_name=Module["_sqlite3_column_name"]=(a0,a1)=>(_sqlite3_column_name=Module["_sqlite3_column_name"]=wasmExports["oc"])(a0,a1);var _sqlite3_column_name16=Module["_sqlite3_column_name16"]=(a0,a1)=>(_sqlite3_column_name16=Module["_sqlite3_column_name16"]=wasmExports["pc"])(a0,a1);var _sqlite3_bind_blob=Module["_sqlite3_bind_blob"]=(a0,a1,a2,a3,a4)=>(_sqlite3_bind_blob=Module["_sqlite3_bind_blob"]=wasmExports["qc"])(a0,a1,a2,a3,a4);var _sqlite3_bind_blob64=Module["_sqlite3_bind_blob64"]=(a0,a1,a2,a3,a4,a5)=>(_sqlite3_bind_blob64=Module["_sqlite3_bind_blob64"]=wasmExports["rc"])(a0,a1,a2,a3,a4,a5);var _sqlite3_bind_double=Module["_sqlite3_bind_double"]=(a0,a1,a2)=>(_sqlite3_bind_double=Module["_sqlite3_bind_double"]=wasmExports["sc"])(a0,a1,a2);var _sqlite3_bind_int=Module["_sqlite3_bind_int"]=(a0,a1,a2)=>(_sqlite3_bind_int=Module["_sqlite3_bind_int"]=wasmExports["tc"])(a0,a1,a2);var _sqlite3_bind_int64=Module["_sqlite3_bind_int64"]=(a0,a1,a2,a3)=>(_sqlite3_bind_int64=Module["_sqlite3_bind_int64"]=wasmExports["uc"])(a0,a1,a2,a3);var _sqlite3_bind_null=Module["_sqlite3_bind_null"]=(a0,a1)=>(_sqlite3_bind_null=Module["_sqlite3_bind_null"]=wasmExports["vc"])(a0,a1);var _sqlite3_bind_pointer=Module["_sqlite3_bind_pointer"]=(a0,a1,a2,a3,a4)=>(_sqlite3_bind_pointer=Module["_sqlite3_bind_pointer"]=wasmExports["wc"])(a0,a1,a2,a3,a4);var _sqlite3_bind_text=Module["_sqlite3_bind_text"]=(a0,a1,a2,a3,a4)=>(_sqlite3_bind_text=Module["_sqlite3_bind_text"]=wasmExports["xc"])(a0,a1,a2,a3,a4);var _sqlite3_bind_text64=Module["_sqlite3_bind_text64"]=(a0,a1,a2,a3,a4,a5,a6)=>(_sqlite3_bind_text64=Module["_sqlite3_bind_text64"]=wasmExports["yc"])(a0,a1,a2,a3,a4,a5,a6);var _sqlite3_bind_text16=Module["_sqlite3_bind_text16"]=(a0,a1,a2,a3,a4)=>(_sqlite3_bind_text16=Module["_sqlite3_bind_text16"]=wasmExports["zc"])(a0,a1,a2,a3,a4);var _sqlite3_bind_value=Module["_sqlite3_bind_value"]=(a0,a1,a2)=>(_sqlite3_bind_value=Module["_sqlite3_bind_value"]=wasmExports["Ac"])(a0,a1,a2);var _sqlite3_bind_zeroblob=Module["_sqlite3_bind_zeroblob"]=(a0,a1,a2)=>(_sqlite3_bind_zeroblob=Module["_sqlite3_bind_zeroblob"]=wasmExports["Bc"])(a0,a1,a2);var _sqlite3_bind_zeroblob64=Module["_sqlite3_bind_zeroblob64"]=(a0,a1,a2,a3)=>(_sqlite3_bind_zeroblob64=Module["_sqlite3_bind_zeroblob64"]=wasmExports["Cc"])(a0,a1,a2,a3);var _sqlite3_bind_parameter_count=Module["_sqlite3_bind_parameter_count"]=a0=>(_sqlite3_bind_parameter_count=Module["_sqlite3_bind_parameter_count"]=wasmExports["Dc"])(a0);var _sqlite3_bind_parameter_name=Module["_sqlite3_bind_parameter_name"]=(a0,a1)=>(_sqlite3_bind_parameter_name=Module["_sqlite3_bind_parameter_name"]=wasmExports["Ec"])(a0,a1);var _sqlite3_bind_parameter_index=Module["_sqlite3_bind_parameter_index"]=(a0,a1)=>(_sqlite3_bind_parameter_index=Module["_sqlite3_bind_parameter_index"]=wasmExports["Fc"])(a0,a1);var _sqlite3_db_handle=Module["_sqlite3_db_handle"]=a0=>(_sqlite3_db_handle=Module["_sqlite3_db_handle"]=wasmExports["Gc"])(a0);var _sqlite3_stmt_readonly=Module["_sqlite3_stmt_readonly"]=a0=>(_sqlite3_stmt_readonly=Module["_sqlite3_stmt_readonly"]=wasmExports["Hc"])(a0);var _sqlite3_stmt_isexplain=Module["_sqlite3_stmt_isexplain"]=a0=>(_sqlite3_stmt_isexplain=Module["_sqlite3_stmt_isexplain"]=wasmExports["Ic"])(a0);var _sqlite3_stmt_explain=Module["_sqlite3_stmt_explain"]=(a0,a1)=>(_sqlite3_stmt_explain=Module["_sqlite3_stmt_explain"]=wasmExports["Jc"])(a0,a1);var _sqlite3_stmt_busy=Module["_sqlite3_stmt_busy"]=a0=>(_sqlite3_stmt_busy=Module["_sqlite3_stmt_busy"]=wasmExports["Kc"])(a0);var _sqlite3_next_stmt=Module["_sqlite3_next_stmt"]=(a0,a1)=>(_sqlite3_next_stmt=Module["_sqlite3_next_stmt"]=wasmExports["Lc"])(a0,a1);var _sqlite3_stmt_status=Module["_sqlite3_stmt_status"]=(a0,a1,a2)=>(_sqlite3_stmt_status=Module["_sqlite3_stmt_status"]=wasmExports["Mc"])(a0,a1,a2);var _sqlite3_sql=Module["_sqlite3_sql"]=a0=>(_sqlite3_sql=Module["_sqlite3_sql"]=wasmExports["Nc"])(a0);var _sqlite3_expanded_sql=Module["_sqlite3_expanded_sql"]=a0=>(_sqlite3_expanded_sql=Module["_sqlite3_expanded_sql"]=wasmExports["Oc"])(a0);var _sqlite3_value_numeric_type=Module["_sqlite3_value_numeric_type"]=a0=>(_sqlite3_value_numeric_type=Module["_sqlite3_value_numeric_type"]=wasmExports["Pc"])(a0);var _sqlite3_blob_open=Module["_sqlite3_blob_open"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_sqlite3_blob_open=Module["_sqlite3_blob_open"]=wasmExports["Qc"])(a0,a1,a2,a3,a4,a5,a6,a7);var _sqlite3_blob_close=Module["_sqlite3_blob_close"]=a0=>(_sqlite3_blob_close=Module["_sqlite3_blob_close"]=wasmExports["Rc"])(a0);var _sqlite3_blob_read=Module["_sqlite3_blob_read"]=(a0,a1,a2,a3)=>(_sqlite3_blob_read=Module["_sqlite3_blob_read"]=wasmExports["Sc"])(a0,a1,a2,a3);var _sqlite3_blob_write=Module["_sqlite3_blob_write"]=(a0,a1,a2,a3)=>(_sqlite3_blob_write=Module["_sqlite3_blob_write"]=wasmExports["Tc"])(a0,a1,a2,a3);var _sqlite3_blob_bytes=Module["_sqlite3_blob_bytes"]=a0=>(_sqlite3_blob_bytes=Module["_sqlite3_blob_bytes"]=wasmExports["Uc"])(a0);var _sqlite3_blob_reopen=Module["_sqlite3_blob_reopen"]=(a0,a1,a2)=>(_sqlite3_blob_reopen=Module["_sqlite3_blob_reopen"]=wasmExports["Vc"])(a0,a1,a2);var _sqlite3_set_authorizer=Module["_sqlite3_set_authorizer"]=(a0,a1,a2)=>(_sqlite3_set_authorizer=Module["_sqlite3_set_authorizer"]=wasmExports["Wc"])(a0,a1,a2);var _sqlite3_strglob=Module["_sqlite3_strglob"]=(a0,a1)=>(_sqlite3_strglob=Module["_sqlite3_strglob"]=wasmExports["Xc"])(a0,a1);var _sqlite3_strlike=Module["_sqlite3_strlike"]=(a0,a1,a2)=>(_sqlite3_strlike=Module["_sqlite3_strlike"]=wasmExports["Yc"])(a0,a1,a2);var _sqlite3_errmsg=Module["_sqlite3_errmsg"]=a0=>(_sqlite3_errmsg=Module["_sqlite3_errmsg"]=wasmExports["Zc"])(a0);var _sqlite3_auto_extension=Module["_sqlite3_auto_extension"]=a0=>(_sqlite3_auto_extension=Module["_sqlite3_auto_extension"]=wasmExports["_c"])(a0);var _sqlite3_cancel_auto_extension=Module["_sqlite3_cancel_auto_extension"]=a0=>(_sqlite3_cancel_auto_extension=Module["_sqlite3_cancel_auto_extension"]=wasmExports["$c"])(a0);var _sqlite3_reset_auto_extension=Module["_sqlite3_reset_auto_extension"]=()=>(_sqlite3_reset_auto_extension=Module["_sqlite3_reset_auto_extension"]=wasmExports["ad"])();var _sqlite3_prepare=Module["_sqlite3_prepare"]=(a0,a1,a2,a3,a4)=>(_sqlite3_prepare=Module["_sqlite3_prepare"]=wasmExports["bd"])(a0,a1,a2,a3,a4);var _sqlite3_prepare_v3=Module["_sqlite3_prepare_v3"]=(a0,a1,a2,a3,a4,a5)=>(_sqlite3_prepare_v3=Module["_sqlite3_prepare_v3"]=wasmExports["cd"])(a0,a1,a2,a3,a4,a5);var _sqlite3_prepare16=Module["_sqlite3_prepare16"]=(a0,a1,a2,a3,a4)=>(_sqlite3_prepare16=Module["_sqlite3_prepare16"]=wasmExports["dd"])(a0,a1,a2,a3,a4);var _sqlite3_prepare16_v2=Module["_sqlite3_prepare16_v2"]=(a0,a1,a2,a3,a4)=>(_sqlite3_prepare16_v2=Module["_sqlite3_prepare16_v2"]=wasmExports["ed"])(a0,a1,a2,a3,a4);var _sqlite3_prepare16_v3=Module["_sqlite3_prepare16_v3"]=(a0,a1,a2,a3,a4,a5)=>(_sqlite3_prepare16_v3=Module["_sqlite3_prepare16_v3"]=wasmExports["fd"])(a0,a1,a2,a3,a4,a5);var _sqlite3_get_table=Module["_sqlite3_get_table"]=(a0,a1,a2,a3,a4,a5)=>(_sqlite3_get_table=Module["_sqlite3_get_table"]=wasmExports["gd"])(a0,a1,a2,a3,a4,a5);var _sqlite3_free_table=Module["_sqlite3_free_table"]=a0=>(_sqlite3_free_table=Module["_sqlite3_free_table"]=wasmExports["hd"])(a0);var _sqlite3_create_module=Module["_sqlite3_create_module"]=(a0,a1,a2,a3)=>(_sqlite3_create_module=Module["_sqlite3_create_module"]=wasmExports["id"])(a0,a1,a2,a3);var _sqlite3_create_module_v2=Module["_sqlite3_create_module_v2"]=(a0,a1,a2,a3,a4)=>(_sqlite3_create_module_v2=Module["_sqlite3_create_module_v2"]=wasmExports["jd"])(a0,a1,a2,a3,a4);var _sqlite3_drop_modules=Module["_sqlite3_drop_modules"]=(a0,a1)=>(_sqlite3_drop_modules=Module["_sqlite3_drop_modules"]=wasmExports["kd"])(a0,a1);var _sqlite3_declare_vtab=Module["_sqlite3_declare_vtab"]=(a0,a1)=>(_sqlite3_declare_vtab=Module["_sqlite3_declare_vtab"]=wasmExports["ld"])(a0,a1);var _sqlite3_vtab_on_conflict=Module["_sqlite3_vtab_on_conflict"]=a0=>(_sqlite3_vtab_on_conflict=Module["_sqlite3_vtab_on_conflict"]=wasmExports["md"])(a0);var _sqlite3_vtab_config=Module["_sqlite3_vtab_config"]=(a0,a1,a2)=>(_sqlite3_vtab_config=Module["_sqlite3_vtab_config"]=wasmExports["nd"])(a0,a1,a2);var _sqlite3_vtab_collation=Module["_sqlite3_vtab_collation"]=(a0,a1)=>(_sqlite3_vtab_collation=Module["_sqlite3_vtab_collation"]=wasmExports["od"])(a0,a1);var _sqlite3_vtab_in=Module["_sqlite3_vtab_in"]=(a0,a1,a2)=>(_sqlite3_vtab_in=Module["_sqlite3_vtab_in"]=wasmExports["pd"])(a0,a1,a2);var _sqlite3_vtab_rhs_value=Module["_sqlite3_vtab_rhs_value"]=(a0,a1,a2)=>(_sqlite3_vtab_rhs_value=Module["_sqlite3_vtab_rhs_value"]=wasmExports["qd"])(a0,a1,a2);var _sqlite3_vtab_distinct=Module["_sqlite3_vtab_distinct"]=a0=>(_sqlite3_vtab_distinct=Module["_sqlite3_vtab_distinct"]=wasmExports["rd"])(a0);var _sqlite3_keyword_name=Module["_sqlite3_keyword_name"]=(a0,a1,a2)=>(_sqlite3_keyword_name=Module["_sqlite3_keyword_name"]=wasmExports["sd"])(a0,a1,a2);var _sqlite3_keyword_count=Module["_sqlite3_keyword_count"]=()=>(_sqlite3_keyword_count=Module["_sqlite3_keyword_count"]=wasmExports["td"])();var _sqlite3_keyword_check=Module["_sqlite3_keyword_check"]=(a0,a1)=>(_sqlite3_keyword_check=Module["_sqlite3_keyword_check"]=wasmExports["ud"])(a0,a1);var _sqlite3_complete=Module["_sqlite3_complete"]=a0=>(_sqlite3_complete=Module["_sqlite3_complete"]=wasmExports["vd"])(a0);var _sqlite3_complete16=Module["_sqlite3_complete16"]=a0=>(_sqlite3_complete16=Module["_sqlite3_complete16"]=wasmExports["wd"])(a0);var _sqlite3_libversion=Module["_sqlite3_libversion"]=()=>(_sqlite3_libversion=Module["_sqlite3_libversion"]=wasmExports["xd"])();var _sqlite3_libversion_number=Module["_sqlite3_libversion_number"]=()=>(_sqlite3_libversion_number=Module["_sqlite3_libversion_number"]=wasmExports["yd"])();var _sqlite3_threadsafe=Module["_sqlite3_threadsafe"]=()=>(_sqlite3_threadsafe=Module["_sqlite3_threadsafe"]=wasmExports["zd"])();var _sqlite3_initialize=Module["_sqlite3_initialize"]=()=>(_sqlite3_initialize=Module["_sqlite3_initialize"]=wasmExports["Ad"])();var _sqlite3_shutdown=Module["_sqlite3_shutdown"]=()=>(_sqlite3_shutdown=Module["_sqlite3_shutdown"]=wasmExports["Bd"])();var _sqlite3_config=Module["_sqlite3_config"]=(a0,a1)=>(_sqlite3_config=Module["_sqlite3_config"]=wasmExports["Cd"])(a0,a1);var _sqlite3_db_mutex=Module["_sqlite3_db_mutex"]=a0=>(_sqlite3_db_mutex=Module["_sqlite3_db_mutex"]=wasmExports["Dd"])(a0);var _sqlite3_db_release_memory=Module["_sqlite3_db_release_memory"]=a0=>(_sqlite3_db_release_memory=Module["_sqlite3_db_release_memory"]=wasmExports["Ed"])(a0);var _sqlite3_db_cacheflush=Module["_sqlite3_db_cacheflush"]=a0=>(_sqlite3_db_cacheflush=Module["_sqlite3_db_cacheflush"]=wasmExports["Fd"])(a0);var _sqlite3_db_config=Module["_sqlite3_db_config"]=(a0,a1,a2)=>(_sqlite3_db_config=Module["_sqlite3_db_config"]=wasmExports["Gd"])(a0,a1,a2);var _sqlite3_last_insert_rowid=Module["_sqlite3_last_insert_rowid"]=a0=>(_sqlite3_last_insert_rowid=Module["_sqlite3_last_insert_rowid"]=wasmExports["Hd"])(a0);var _sqlite3_set_last_insert_rowid=Module["_sqlite3_set_last_insert_rowid"]=(a0,a1,a2)=>(_sqlite3_set_last_insert_rowid=Module["_sqlite3_set_last_insert_rowid"]=wasmExports["Id"])(a0,a1,a2);var _sqlite3_changes64=Module["_sqlite3_changes64"]=a0=>(_sqlite3_changes64=Module["_sqlite3_changes64"]=wasmExports["Jd"])(a0);var _sqlite3_changes=Module["_sqlite3_changes"]=a0=>(_sqlite3_changes=Module["_sqlite3_changes"]=wasmExports["Kd"])(a0);var _sqlite3_total_changes64=Module["_sqlite3_total_changes64"]=a0=>(_sqlite3_total_changes64=Module["_sqlite3_total_changes64"]=wasmExports["Ld"])(a0);var _sqlite3_total_changes=Module["_sqlite3_total_changes"]=a0=>(_sqlite3_total_changes=Module["_sqlite3_total_changes"]=wasmExports["Md"])(a0);var _sqlite3_txn_state=Module["_sqlite3_txn_state"]=(a0,a1)=>(_sqlite3_txn_state=Module["_sqlite3_txn_state"]=wasmExports["Nd"])(a0,a1);var _sqlite3_close=Module["_sqlite3_close"]=a0=>(_sqlite3_close=Module["_sqlite3_close"]=wasmExports["Od"])(a0);var _sqlite3_close_v2=Module["_sqlite3_close_v2"]=a0=>(_sqlite3_close_v2=Module["_sqlite3_close_v2"]=wasmExports["Pd"])(a0);var _sqlite3_busy_handler=Module["_sqlite3_busy_handler"]=(a0,a1,a2)=>(_sqlite3_busy_handler=Module["_sqlite3_busy_handler"]=wasmExports["Qd"])(a0,a1,a2);var _sqlite3_progress_handler=Module["_sqlite3_progress_handler"]=(a0,a1,a2,a3)=>(_sqlite3_progress_handler=Module["_sqlite3_progress_handler"]=wasmExports["Rd"])(a0,a1,a2,a3);var _sqlite3_busy_timeout=Module["_sqlite3_busy_timeout"]=(a0,a1)=>(_sqlite3_busy_timeout=Module["_sqlite3_busy_timeout"]=wasmExports["Sd"])(a0,a1);var _sqlite3_interrupt=Module["_sqlite3_interrupt"]=a0=>(_sqlite3_interrupt=Module["_sqlite3_interrupt"]=wasmExports["Td"])(a0);var _sqlite3_is_interrupted=Module["_sqlite3_is_interrupted"]=a0=>(_sqlite3_is_interrupted=Module["_sqlite3_is_interrupted"]=wasmExports["Ud"])(a0);var _sqlite3_create_function=Module["_sqlite3_create_function"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_sqlite3_create_function=Module["_sqlite3_create_function"]=wasmExports["Vd"])(a0,a1,a2,a3,a4,a5,a6,a7);var _sqlite3_create_function_v2=Module["_sqlite3_create_function_v2"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8)=>(_sqlite3_create_function_v2=Module["_sqlite3_create_function_v2"]=wasmExports["Wd"])(a0,a1,a2,a3,a4,a5,a6,a7,a8);var _sqlite3_create_window_function=Module["_sqlite3_create_window_function"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)=>(_sqlite3_create_window_function=Module["_sqlite3_create_window_function"]=wasmExports["Xd"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);var _sqlite3_create_function16=Module["_sqlite3_create_function16"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_sqlite3_create_function16=Module["_sqlite3_create_function16"]=wasmExports["Yd"])(a0,a1,a2,a3,a4,a5,a6,a7);var _sqlite3_overload_function=Module["_sqlite3_overload_function"]=(a0,a1,a2)=>(_sqlite3_overload_function=Module["_sqlite3_overload_function"]=wasmExports["Zd"])(a0,a1,a2);var _sqlite3_trace_v2=Module["_sqlite3_trace_v2"]=(a0,a1,a2,a3)=>(_sqlite3_trace_v2=Module["_sqlite3_trace_v2"]=wasmExports["_d"])(a0,a1,a2,a3);var _sqlite3_commit_hook=Module["_sqlite3_commit_hook"]=(a0,a1,a2)=>(_sqlite3_commit_hook=Module["_sqlite3_commit_hook"]=wasmExports["$d"])(a0,a1,a2);var _sqlite3_update_hook=Module["_sqlite3_update_hook"]=(a0,a1,a2)=>(_sqlite3_update_hook=Module["_sqlite3_update_hook"]=wasmExports["ae"])(a0,a1,a2);var _sqlite3_rollback_hook=Module["_sqlite3_rollback_hook"]=(a0,a1,a2)=>(_sqlite3_rollback_hook=Module["_sqlite3_rollback_hook"]=wasmExports["be"])(a0,a1,a2);var _sqlite3_autovacuum_pages=Module["_sqlite3_autovacuum_pages"]=(a0,a1,a2,a3)=>(_sqlite3_autovacuum_pages=Module["_sqlite3_autovacuum_pages"]=wasmExports["ce"])(a0,a1,a2,a3);var _sqlite3_wal_autocheckpoint=Module["_sqlite3_wal_autocheckpoint"]=(a0,a1)=>(_sqlite3_wal_autocheckpoint=Module["_sqlite3_wal_autocheckpoint"]=wasmExports["de"])(a0,a1);var _sqlite3_wal_hook=Module["_sqlite3_wal_hook"]=(a0,a1,a2)=>(_sqlite3_wal_hook=Module["_sqlite3_wal_hook"]=wasmExports["ee"])(a0,a1,a2);var _sqlite3_wal_checkpoint_v2=Module["_sqlite3_wal_checkpoint_v2"]=(a0,a1,a2,a3,a4)=>(_sqlite3_wal_checkpoint_v2=Module["_sqlite3_wal_checkpoint_v2"]=wasmExports["fe"])(a0,a1,a2,a3,a4);var _sqlite3_wal_checkpoint=Module["_sqlite3_wal_checkpoint"]=(a0,a1)=>(_sqlite3_wal_checkpoint=Module["_sqlite3_wal_checkpoint"]=wasmExports["ge"])(a0,a1);var _sqlite3_error_offset=Module["_sqlite3_error_offset"]=a0=>(_sqlite3_error_offset=Module["_sqlite3_error_offset"]=wasmExports["he"])(a0);var _sqlite3_errmsg16=Module["_sqlite3_errmsg16"]=a0=>(_sqlite3_errmsg16=Module["_sqlite3_errmsg16"]=wasmExports["ie"])(a0);var _sqlite3_errcode=Module["_sqlite3_errcode"]=a0=>(_sqlite3_errcode=Module["_sqlite3_errcode"]=wasmExports["je"])(a0);var _sqlite3_extended_errcode=Module["_sqlite3_extended_errcode"]=a0=>(_sqlite3_extended_errcode=Module["_sqlite3_extended_errcode"]=wasmExports["ke"])(a0);var _sqlite3_system_errno=Module["_sqlite3_system_errno"]=a0=>(_sqlite3_system_errno=Module["_sqlite3_system_errno"]=wasmExports["le"])(a0);var _sqlite3_errstr=Module["_sqlite3_errstr"]=a0=>(_sqlite3_errstr=Module["_sqlite3_errstr"]=wasmExports["me"])(a0);var _sqlite3_limit=Module["_sqlite3_limit"]=(a0,a1,a2)=>(_sqlite3_limit=Module["_sqlite3_limit"]=wasmExports["ne"])(a0,a1,a2);var _sqlite3_open=Module["_sqlite3_open"]=(a0,a1)=>(_sqlite3_open=Module["_sqlite3_open"]=wasmExports["oe"])(a0,a1);var _sqlite3_open_v2=Module["_sqlite3_open_v2"]=(a0,a1,a2,a3)=>(_sqlite3_open_v2=Module["_sqlite3_open_v2"]=wasmExports["pe"])(a0,a1,a2,a3);var _sqlite3_open16=Module["_sqlite3_open16"]=(a0,a1)=>(_sqlite3_open16=Module["_sqlite3_open16"]=wasmExports["qe"])(a0,a1);var _sqlite3_create_collation=Module["_sqlite3_create_collation"]=(a0,a1,a2,a3,a4)=>(_sqlite3_create_collation=Module["_sqlite3_create_collation"]=wasmExports["re"])(a0,a1,a2,a3,a4);var _sqlite3_create_collation_v2=Module["_sqlite3_create_collation_v2"]=(a0,a1,a2,a3,a4,a5)=>(_sqlite3_create_collation_v2=Module["_sqlite3_create_collation_v2"]=wasmExports["se"])(a0,a1,a2,a3,a4,a5);var _sqlite3_create_collation16=Module["_sqlite3_create_collation16"]=(a0,a1,a2,a3,a4)=>(_sqlite3_create_collation16=Module["_sqlite3_create_collation16"]=wasmExports["te"])(a0,a1,a2,a3,a4);var _sqlite3_collation_needed=Module["_sqlite3_collation_needed"]=(a0,a1,a2)=>(_sqlite3_collation_needed=Module["_sqlite3_collation_needed"]=wasmExports["ue"])(a0,a1,a2);var _sqlite3_collation_needed16=Module["_sqlite3_collation_needed16"]=(a0,a1,a2)=>(_sqlite3_collation_needed16=Module["_sqlite3_collation_needed16"]=wasmExports["ve"])(a0,a1,a2);var _sqlite3_get_clientdata=Module["_sqlite3_get_clientdata"]=(a0,a1)=>(_sqlite3_get_clientdata=Module["_sqlite3_get_clientdata"]=wasmExports["we"])(a0,a1);var _sqlite3_set_clientdata=Module["_sqlite3_set_clientdata"]=(a0,a1,a2,a3)=>(_sqlite3_set_clientdata=Module["_sqlite3_set_clientdata"]=wasmExports["xe"])(a0,a1,a2,a3);var _sqlite3_get_autocommit=Module["_sqlite3_get_autocommit"]=a0=>(_sqlite3_get_autocommit=Module["_sqlite3_get_autocommit"]=wasmExports["ye"])(a0);var _sqlite3_table_column_metadata=Module["_sqlite3_table_column_metadata"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8)=>(_sqlite3_table_column_metadata=Module["_sqlite3_table_column_metadata"]=wasmExports["ze"])(a0,a1,a2,a3,a4,a5,a6,a7,a8);var _sqlite3_sleep=Module["_sqlite3_sleep"]=a0=>(_sqlite3_sleep=Module["_sqlite3_sleep"]=wasmExports["Ae"])(a0);var _sqlite3_extended_result_codes=Module["_sqlite3_extended_result_codes"]=(a0,a1)=>(_sqlite3_extended_result_codes=Module["_sqlite3_extended_result_codes"]=wasmExports["Be"])(a0,a1);var _sqlite3_file_control=Module["_sqlite3_file_control"]=(a0,a1,a2,a3)=>(_sqlite3_file_control=Module["_sqlite3_file_control"]=wasmExports["Ce"])(a0,a1,a2,a3);var _sqlite3_test_control=Module["_sqlite3_test_control"]=(a0,a1)=>(_sqlite3_test_control=Module["_sqlite3_test_control"]=wasmExports["De"])(a0,a1);var _sqlite3_create_filename=Module["_sqlite3_create_filename"]=(a0,a1,a2,a3,a4)=>(_sqlite3_create_filename=Module["_sqlite3_create_filename"]=wasmExports["Ee"])(a0,a1,a2,a3,a4);var _sqlite3_free_filename=Module["_sqlite3_free_filename"]=a0=>(_sqlite3_free_filename=Module["_sqlite3_free_filename"]=wasmExports["Fe"])(a0);var _sqlite3_uri_parameter=Module["_sqlite3_uri_parameter"]=(a0,a1)=>(_sqlite3_uri_parameter=Module["_sqlite3_uri_parameter"]=wasmExports["Ge"])(a0,a1);var _sqlite3_uri_key=Module["_sqlite3_uri_key"]=(a0,a1)=>(_sqlite3_uri_key=Module["_sqlite3_uri_key"]=wasmExports["He"])(a0,a1);var _sqlite3_uri_boolean=Module["_sqlite3_uri_boolean"]=(a0,a1,a2)=>(_sqlite3_uri_boolean=Module["_sqlite3_uri_boolean"]=wasmExports["Ie"])(a0,a1,a2);var _sqlite3_uri_int64=Module["_sqlite3_uri_int64"]=(a0,a1,a2,a3)=>(_sqlite3_uri_int64=Module["_sqlite3_uri_int64"]=wasmExports["Je"])(a0,a1,a2,a3);var _sqlite3_filename_database=Module["_sqlite3_filename_database"]=a0=>(_sqlite3_filename_database=Module["_sqlite3_filename_database"]=wasmExports["Ke"])(a0);var _sqlite3_filename_journal=Module["_sqlite3_filename_journal"]=a0=>(_sqlite3_filename_journal=Module["_sqlite3_filename_journal"]=wasmExports["Le"])(a0);var _sqlite3_filename_wal=Module["_sqlite3_filename_wal"]=a0=>(_sqlite3_filename_wal=Module["_sqlite3_filename_wal"]=wasmExports["Me"])(a0);var _sqlite3_db_name=Module["_sqlite3_db_name"]=(a0,a1)=>(_sqlite3_db_name=Module["_sqlite3_db_name"]=wasmExports["Ne"])(a0,a1);var _sqlite3_db_filename=Module["_sqlite3_db_filename"]=(a0,a1)=>(_sqlite3_db_filename=Module["_sqlite3_db_filename"]=wasmExports["Oe"])(a0,a1);var _sqlite3_db_readonly=Module["_sqlite3_db_readonly"]=(a0,a1)=>(_sqlite3_db_readonly=Module["_sqlite3_db_readonly"]=wasmExports["Pe"])(a0,a1);var _sqlite3_compileoption_used=Module["_sqlite3_compileoption_used"]=a0=>(_sqlite3_compileoption_used=Module["_sqlite3_compileoption_used"]=wasmExports["Qe"])(a0);var _sqlite3_compileoption_get=Module["_sqlite3_compileoption_get"]=a0=>(_sqlite3_compileoption_get=Module["_sqlite3_compileoption_get"]=wasmExports["Re"])(a0);var _sqlite3_sourceid=Module["_sqlite3_sourceid"]=()=>(_sqlite3_sourceid=Module["_sqlite3_sourceid"]=wasmExports["Se"])();var ___errno_location=()=>(___errno_location=wasmExports["Te"])();var _malloc=Module["_malloc"]=a0=>(_malloc=Module["_malloc"]=wasmExports["Ue"])(a0);var _free=Module["_free"]=a0=>(_free=Module["_free"]=wasmExports["Ve"])(a0);var _RegisterExtensionFunctions=Module["_RegisterExtensionFunctions"]=a0=>(_RegisterExtensionFunctions=Module["_RegisterExtensionFunctions"]=wasmExports["We"])(a0);var _getSqliteFree=Module["_getSqliteFree"]=()=>(_getSqliteFree=Module["_getSqliteFree"]=wasmExports["Xe"])();var _main=Module["_main"]=(a0,a1)=>(_main=Module["_main"]=wasmExports["Ye"])(a0,a1);var _libauthorizer_set_authorizer=Module["_libauthorizer_set_authorizer"]=(a0,a1,a2)=>(_libauthorizer_set_authorizer=Module["_libauthorizer_set_authorizer"]=wasmExports["Ze"])(a0,a1,a2);var _libfunction_create_function=Module["_libfunction_create_function"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_libfunction_create_function=Module["_libfunction_create_function"]=wasmExports["_e"])(a0,a1,a2,a3,a4,a5,a6,a7);var _libprogress_progress_handler=Module["_libprogress_progress_handler"]=(a0,a1,a2,a3)=>(_libprogress_progress_handler=Module["_libprogress_progress_handler"]=wasmExports["$e"])(a0,a1,a2,a3);var _libvfs_vfs_register=Module["_libvfs_vfs_register"]=(a0,a1,a2,a3,a4,a5)=>(_libvfs_vfs_register=Module["_libvfs_vfs_register"]=wasmExports["af"])(a0,a1,a2,a3,a4,a5);var _emscripten_builtin_memalign=(a0,a1)=>(_emscripten_builtin_memalign=wasmExports["cf"])(a0,a1);var getTempRet0=()=>(getTempRet0=wasmExports["df"])();var stackSave=()=>(stackSave=wasmExports["ef"])();var stackRestore=a0=>(stackRestore=wasmExports["ff"])(a0);var stackAlloc=a0=>(stackAlloc=wasmExports["gf"])(a0);var _asyncify_start_unwind=a0=>(_asyncify_start_unwind=wasmExports["hf"])(a0);var _asyncify_stop_unwind=()=>(_asyncify_stop_unwind=wasmExports["jf"])();var _asyncify_start_rewind=a0=>(_asyncify_start_rewind=wasmExports["kf"])(a0);var _asyncify_stop_rewind=()=>(_asyncify_stop_rewind=wasmExports["lf"])();var _sqlite3_version=Module["_sqlite3_version"]=3232;Module["getTempRet0"]=getTempRet0;Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["addFunction"]=addFunction;Module["setValue"]=setValue;Module["getValue"]=getValue;Module["UTF8ToString"]=UTF8ToString;Module["stringToUTF8"]=stringToUTF8;Module["lengthBytesUTF8"]=lengthBytesUTF8;Module["intArrayFromString"]=intArrayFromString;Module["intArrayToString"]=intArrayToString;Module["AsciiToString"]=AsciiToString;Module["UTF16ToString"]=UTF16ToString;Module["stringToUTF16"]=stringToUTF16;Module["UTF32ToString"]=UTF32ToString;Module["stringToUTF32"]=stringToUTF32;Module["writeArrayToMemory"]=writeArrayToMemory;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(){var entryFunction=_main;var argc=0;var argv=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"])shouldRunNow=false;run();(function(){const AsyncFunction=Object.getPrototypeOf(async function(){}).constructor;let pAsyncFlags=0;Module["set_authorizer"]=function(db,xAuthorizer,pApp){if(pAsyncFlags){Module["deleteCallback"](pAsyncFlags);Module["_sqlite3_free"](pAsyncFlags);pAsyncFlags=0}pAsyncFlags=Module["_sqlite3_malloc"](4);setValue(pAsyncFlags,xAuthorizer instanceof AsyncFunction?1:0,"i32");const result=ccall("libauthorizer_set_authorizer","number",["number","number","number"],[db,xAuthorizer?1:0,pAsyncFlags]);if(!result&&xAuthorizer){Module["setCallback"](pAsyncFlags,(_,iAction,p3,p4,p5,p6)=>xAuthorizer(pApp,iAction,p3,p4,p5,p6))}return result}})();(function(){const AsyncFunction=Object.getPrototypeOf(async function(){}).constructor;const FUNC_METHODS=["xFunc","xStep","xFinal"];const mapFunctionNameToKey=new Map;Module["create_function"]=function(db,zFunctionName,nArg,eTextRep,pApp,xFunc,xStep,xFinal){const pAsyncFlags=Module["_sqlite3_malloc"](4);const target={xFunc:xFunc,xStep:xStep,xFinal:xFinal};setValue(pAsyncFlags,FUNC_METHODS.reduce((mask,method,i)=>{if(target[method]instanceof AsyncFunction){return mask|1<xProgress(pApp))}}})();(function(){const VFS_METHODS=["xOpen","xDelete","xAccess","xFullPathname","xRandomness","xSleep","xCurrentTime","xGetLastError","xCurrentTimeInt64","xClose","xRead","xWrite","xTruncate","xSync","xFileSize","xLock","xUnlock","xCheckReservedLock","xFileControl","xSectorSize","xDeviceCharacteristics","xShmMap","xShmLock","xShmBarrier","xShmUnmap"];const mapVFSNameToKey=new Map;Module["vfs_register"]=function(vfs,makeDefault){let methodMask=0;let asyncMask=0;VFS_METHODS.forEach((method,i)=>{if(vfs[method]){methodMask|=1<H7EIwAYxlx8vgisGV?+$#Ge-opO)qaRJ;O;~xL+9?x`-XYq*7?|imXZ`e4AlUfWA zwOS`?*K4tj^V(iZYEi@n?Pp_?nAn)yBuk?tso7f6h$CZ7y;(Q4#ZeqtW8yfeniEWyCvRK~L8it+O13HOo?KXHcje5Je3`p4WY!3iw z);l$jQmJ!;mhjk}4h)j(SljM=X3LNW$Cbg~sJ29!&;dW#`V zqsh>+U2WM(K24x0wkA)K9N73j=rM~R%hd^k(gJWHkp&0W!P6qBYM%!$jIsvbFrloV z4jOpZh}-erY-b0OfnFlJxXn%p6VwmbD~oG;7%;mxkTmn|gTNpV)xd9D%WOAGObRCJ zhX2)RYXP2Zhs*)F(S&+Hn!p{K?jfezjG7DU;J*fy3*poNn*EKEIt(MLWkHZkWNp?2 zYt5LJHij@|vuZYKK#y^41r!Qn0(xv&ZZ7-6K6T6z+8OXI#LkPRY!qz576ZgT3X4Ux zSZJtavxfsQj2qV=pa}ZnTL`8Lepxu5)gkFU_XRcpTAauyNsZQE41N)&;jf5;Lm4hR zto8u=fK_JEL-Xa)KSl8(vxvQAqkvHMpavqWS!xoSu;uKZUWo)$QHDrR(RR8%p**^ucgE;g*a@rfLeqc2(1eN@PBJstvZAOF@sUFz{GnlhvF7QX_A6ma1g}{ z>z#T#M#^N-LI#jlf>r)O;^qM|QLdC|qE;*CHUB}mjXLl#F?1I!NgLX|}F3A+yDF=P|Rb-Qpi z8{A}X_?(stAYyh1x)BKqHW^(uoGIi54}I%k;4SdVS400bcpX|x&wKeV^hD}f=pV{n zz%mxZ0-Xr8db{0d05wd^e+o9A%Tw0aXs|A0*1KiP$1r6R>8=f;Xg{8GO4{uMakDeE&mT8mOzrXG=IY4)_qh2&YF{vJ9%;*Q^SQcRKW;vs+DG!* z+QY}Oy*4nDwHwFHWs%)9Zk}K_kDCv5?4!obdph=rar4%Wee}3_ZO0xtZh-VLgN z+oz73*QNGpj2_#k)6?328#m{tc5K{SmDuqKbH23`6XsVUFkx;7 zcdW?TC$aX9ee#6)WNM!>Va~GlsT1be_Gv7jW1r5%9s6%g(XnF_=2IOzK571^V<#rf zzuL)3b4y~UCe0NsJ3VPW3GOD%C&1mL`FO`ZbJBdQW1lr?J__z8&3WK%(!2`Nn>1f) z+h6o&`XDwtYHlg#ISY>p|h9 zc^xR6GMBXM#FTkW!%j|_(>ivF*Bv`OWnK*qr_8Is;goqLIGi#!C-zxW=Hix}nKCZ} zhg0TM=x@s0QMb>YGA{*(Q|2oz`=3+hB^~>mDf41*IAu@5}%w3t?G-dvj+09et!>N7LlsPxGM@*RyL4#A~kC{Dk%6u@jkC`%m$m~&5=FZGM zcFMe|WsjaRzsv07rp#|M`*`5b>=UNU?U{Yzl=)3&pEPBDo!KW(nRnOiQ>M(j;NdBA zTV|g&Wp2&v)0w?x|82_rGP7e-=9bKkPn(-FJ27p3k=e;<^YhG3O`DrCJ3VcFn%QHf z&Dm}H@6+Z3ZTrk=^OMXzYuenH*_ml`ZDO}fn;&QP*lF{l%szYC{4lfsF>T(^u>U!2 zZpiF&rp-4pyLH-Jmf3C7=F-eQciOxLI-E9N&+LCqo3CZ|dDG^rnSK7Wxg@j4Pn(M~ z``^>%E17-4wE1#o%V~3AX4g-fFM-2p^LlVNZ7u+Z(`IL8H%^;BCw3FFCwB9+`C?`t zHEn($+arJ$98Q}rfWv9?>Xv=XwD~+ZoHpl!!)f!`%pN^$J_8PU-Lj9LHlGHE)89?s?brgr8Sb5?4%9An;}+GCF~?@L?X z#a=6;^qlySx3+)Per5Cg$Ne&;)#Z+G6@c~j>Voe$-& z$zPqnB7b@QlKfZM53=uPAI(0Jotu3iyDR-;`iJz+^mpm)>2K0sr?;iIroT#mnckA# zoc<#Hd3sa&v-GFwPtqIHAE!S`f0*8o{viE+dR_Xx^t`Yf06$@zbXG&{?q&?`HlIH^B?6u%x}oA&wr4AKff;jUjE(u+WeaQ zJNdWsZ{=6#SLIjc-^{PbzmZ>_UzT5*e?9+N{?+`F{Nns8`IqyH@(c4X<)`JZ%wLwD zn!hxEZ~mVA-T4{$yYhGDr?=jbzrA&O>vaCUJ%3yN*8DB`oAWp2Z_MA2zdpY@d0qb6 z{Db)i@-tiSZN0m7c79g={``IUnfV3z7xORVpU=rQ`ET<(@-MV*&#%kA zmwh+8HoGQ!UF+M~)!9|qmDxA5E3)ro@6XdF5B1t!FOV$;phzh!urn|0}l!iXh#ynb9Bt4Td zhO}6anzWbbq(!3BJ6MvL3YMfWye^U=T5A&?cCBslh}YUIOy8B(7^a`ViJrZx6%}ax znp+hQSq=}DBadz`k;jr=T^>t&4SBF|UFrymM%LMDvWjGT(Wn(>r9HM^m&bFC;zRnd zewJ7?9U{6HH+r>z0lTcI_3CLE6~J6Hiu!(bdB5R$@p3tcZ#V>pLBQJ(K8pl=*2>7? zGnUazIzVW6Rn*G}yc{b~J(D*}j-BZ<;ab~eW59LB10*(ifKsqrnnNQioAz*HbK9d$jT{jCtD{S`~+kDkn-E9~&rgMQsL#_Mhz>{b|NwRy^h9CVkUM79E$ z#&pBRGF$ED(5Lb;VHyS05tuLoL(8l%mR;tD)=hq;3=PM~(84%j$XeN*88hjEwCA{9 zwh5-6!*#LS)Yxrm>^3!abOY0{siD&n*~auAkSB!|mhQ#zx`KYI4HN{4u_)Lqk_U(_ zqb+@#L$8HNKTgzOHoG`0D@(*Z=NT4fs@&W(&Kvn~G1N)VCg*kQT0oyK2Xj*NPVBb2H zg7)UaKAXoE2v6C%fasVendfzaQj2{(XW>Bwmoc~?96>=9Sfk#g#ux?M~9t^minT!%jpbl zM6(Qq-J~@vf;~-PFf>XGjly*QtGt{4;;rdNNrdb&3C?Lbx<=53u!J_3_hP#aDg~u+ z9toyb+Ur2{V{(94X|I--d>6@^D}?b2D0M9_1-6y;8oqxtP4)Xr2H#)ezdtqEz($B* zu|Z~aU)l`V3etap3VM;Vs(hmEBZJ`i8#&=z+3Y!}xWD=K#-Z*1n;7>~^XQghz_<-3 zWO#^C!9z?z9%2geSb}ZAV<{FPj}^V9Je(FPFqmYooBNGQuu-CD=|;7}Mu{1$W?Lid z7iMt7QFqbudnJ|_hEn%?@EU`wtsGRknqdtmYB3n*5w-n>(-{q?u^UcfH=G&PaAp{W zt(ak$oS0!enrrQfASntjDOL)xA{tD&^f-8O$6w;DW%Iagylg&C-|=ec^R{hEUmwrq zp&?_t?l8;)ycIkI(L4mvJOt4^1kpS|^nDrI4N!rxUB4G&yK&Fx#^!DWg)Yp75PXU{ zAYvOw&Nf!7hSmKU16U-UVxkZ#zJE6{>|U^?-$c$}wqP5wr7>Pj z59{CU1`pW{9%4)L*abVw+tP}|UQMaona#EJYr4;z<>uAWqNZ%(92roF6I8D09^S7Z ziQ_|~eIR(}ZYW@GxXNt8G%w=rb&bFdLBHDe$kH3d2t6l}WzRjo z)yvqsQ!x$WS**s`e~U|sO+LpsMi0F)u??znX331Pfj}A zH?{jCkXrI?7q&}WRH5^z-2Pnpf`zP)WpzlwpTqjKnbK^A^~41ovXBeIY*AlP7L{%3 zbx1$Kbt>&~=Q1_#u~&4noPSG*plEg9hkFvl8~j!o&`!+(!v={S1Pv*CCEn;^Vs|9v z`?nv_OR8^^T(#g~<&Eaq(9DhIKaTRcuNkPL`?4g^MKZL>>!60P<+2lpp-&sYjqfXh z=Gb9#y`mzJvCg%UwH=Fm-A&yigetDIb<)5(*?_zgaf^Ntachg#!2@wSrpEl0qEu%Q z#jco_Y}O!dGpc!HUy5j(H+sZes9YSZ0@Hm{t@pocYTihie)gJnBeZlcOH16wIzK+f zk5{+U`R>U;_IE#5kzvLDapm^jKf$K-)_Y$i!qf{|(SE!W?Z*SIzAr_mjK%J1v?5`Z z8uD_h9NNmc5sKh5B)V1~TibotK`a&G20^og*xHxoS@1lhx_>2=?!#LfxIo=cM+3ou zU1Xh{76IXeL=m0UJ$xBPvWn(i^_&kLc+SBK`hR1?zIT}X{uWpNbrjxgx3iVTkUB>d z2$i7B{bSQN>&;Vglmb2=@s@`X zqa&nR#OL(Q3!g@hQ~w-GL<^hr&)U3kbb)zZm>2fV6Sn11mZaK5A}48ir;Eg3Zv^nX z;vjhC0Q5HYFo1~4+>XYF5~mkoipX{IhJ|+XF~N}t(Tr-C@}i-o@>+~?pc;-G`Gz<7 zhL6qTlGoZWi@gpD%NRzpw_YkldjrOYti0|U7_afJG0nlaqv#E%#3Z)PyZH>6uTmU? zArqZYm;u0vbXW!;(FhG_w^S}=Fxihn!m&y zit4LJPNDYWw;pcvzZ)Jo$;k0}3(}$CaFwHS(bf&lrEcYu6A->wBMz;YB{JA*v$$`|hB)9Lf+)ws&0>9p=^$u19kb$3 z(Ol#D9v$HO;6Kk23M~{WxQG3m%na5tz_Enm`;l8MFdhwh-P;ngc`xVdi&EH5bmNl7 zK#Yq0g=tNAZa@&2wYw@iXGa~eVE+khIW$G;I0P4|SM}%Dbbj zVtB0--2G}EcYGf0;haST89Q~~63m&lvfq7sK-4YGQAnCX_+b$31txPO!cki3m?Pg8 zPH5TgwqUqcwxku~l<e|dk}TcYTwTR#^+i&`VfSn2tSo~DyJ&Z_?aNKl679V z85m}lB-a-)h@yuMNiGD}_0*ltbtZ>mFZXPH;^yy^^K-XWvnqBcPyh~ojU8kUbCe;qq&muuT|c_9-o(WvAo!ilrPg>1AT4i;$xLekN3eRx-D z6>7(o&24>iZcpOEOzO3>v~6_HlZm~3?AMqU+2GJ)S$R)m-#-Ma7Pdk3qt0T|Q8 z2_?&3#R=Vaj)+Bw2`w7TU<@JE_z~P#7;JknAC{<1Dy*r|_^{}q<%?M%ksw+m!pE#p z`{4>5EXJ#g;v;r2-u^04C$2m~LQHucjf3ryU@C-=@uzo}0q(;%kTk4f1{C<*rVUhZ z{}TTH7UX5CWJ5G7`@aPF4|cWWB@_Qh1V0Qr2(3WK_Z0rqki4M(A4CR6Pt>5Qm*JM0 z75PfU@`k>?lsD&#jP8?gJYRFbBIx-RhgzbwQ1FiE$<6_}!uGYoLyTCc^a`87u?%o2 zpGyyz!GCqB#T%EeE*b4|N%;Jt(a$e(pG%LO0h*nz45p|lIYr&441@{3t}`cuqhZe> zj;1ck1^2s?K?1(2^)#$68{T1fJ4b7)0{v^IB+2 z2jTvKNS62@@0xChGs6A6TOyJ2*+JA%%U7c2P8RnPzrTfs%|%|4=@!rIT%VzFT8PZV zNT?0TXdw?Lz$LjX1L8-nXLA4PE(Q+nN#@j3h@r^XXGd`^A$z!c8T!_6KJShVz(lI;A$h-DPD{o}Kv?PvAtTei|nOGj7q<45BsA&R!Z zzx*XKN%m)^h#%dLm#31hgCToqNoI|ImVZeaucIkliq=uvM1u8aMJ{ZS&frT3wl)om zaTVe$>o6SeuO-M`E8{90XCg~B_8a&ce1BcUp0>+u#xZ#jQfC5T!fF}|>jvz4JEH$c%5z313 z8bg4kStcsE0k3;T%rs(RVma0Yu)s-et!L2X#v52D>m8o6rX%Q_wb0v%ve7w%eA8VK ztta(}>;hK`{wdljwAyx=pCm9* z*<>snS+{LcvEnT82-?PF@?$vNcdv4?57Rm;6{ROyLbIK)f~Y|BhFF(us#?4*+X>z% zF5$!WT3hhQ*4i;1=~}xoD9cq|9sFP(iTk&BU>YwFp*P}bj_3uqe_DIHL>Nrvm2+PN zM{2(g42a#6&$B(W^sH#Ehq>G8ZVutBw3|K21;q!!c!fftg!shwx~21!W`2ZYpmQC` z;e3-*C76F=wUB)htA%%6Xz4!8mB7Gc3c5IaJep6Z*N890k4`u^rkovkisUT9LX^U~z>#ZpPYrg{l}ZlAqEUNq)X+<>iY%#+*}8Wq&WhGF zJ#?>NN|i2nyDv-y8Ehn=LiNBoE_%&4Dj)`l?zp6?qkC>d1jTXoZqupQXRIwSq^5e) zv+vjNkp{=PN?@Jr(*0Tu2{tN8iVNU<&i|Jsk)NMOaP2l@D}uhKq#a zz!-4Wkm-Jz$|AQdq=8bIL97RjNU_3(`jq#>*%``*(_D+hP>->+h`YqH{UMt?c(8fw(K6~+ApQHl#a1< zl%6$;%bC3CdtqEKDm1`DTm@;W_3C6YRvT>J;Zf^;)Ec#`Ix0q{8?}}8Yv&g6xkYsD z2`AtU)X#k?I~4bt3MW|QBau)mx19TAG4x2$F)%NhfFlc$3@sag50JiqEU?2gQNCDn z(GtW*<%s(duXCt#UqzYY4$ydo}7deJG(EnCYSJdc;rq#==V zaTsjq4oV8MCH(VYowx-xTZ%oi@ESP=&jg1yij1h$=Dd zZNR@eXdJNTjDmg5J*2}5*4N#fzO)myX6urn7zC=p^i-GJgA(yo;Hpa`20;gjLGTzO z_`qW&p$Hzkuo*rEG4Si5Qpq9?>lmTk!fqm;(BtAGFgo(B(7Pc0^k`FG)KObv@|mDr z1mmzrtyTxl6qeWp_>bL-V{s9KN+{|TMXP(<+MvV9_VwWz_0JQE2B^J4B1Z>AE0EC9 zmg5l4`yR2pk3!kjNA_O_>!Sd@cV4;i63+W$o%y^250}*;D`Z)s(FAdTgQr<}@U8A^ zD*t^nm9hSm9j6H>5ad5Z-BZ^`C!Zx!FN`7_&nS`+Ag9=n1iQ$glhQ6Y0VM>-LRy%X)eV)GgjZmy0=B9#b( zh$E8pYuoy*az|J4@E{1ODlbb_XrNu%G?^kTt=o9nXHJ4%Y&I2EUV^-h{gjAR1MCkF zC>BJi0Ckd4;aY09dUnvbTN?&CN9r% zFR|h%p~-Fe0Z2_2w6usfNiZn{8~CW%Z_H+uq&yo5E+Wt?40(Y-t8qD6goR8_TG0mW z$GQ~?#w z4!_%Nw~T7H5h2NP^5bp=f{d<129~-fnRLz|eBpQwTvXXvp$iG%D&CiPP17v1s(0M| zhy{_^J#>~uM=V+ijg01R%|=8z=LX6T5?d(}iZzRfuvcOEBUEV0k3@135pGnHw3}d2 zKK(nCp4cOhVjq%0WD8Lmx?pW%qN%X)>-DiOXFAl~NhwTa6ZF{NP^wgwiY14QEWs=y zwPHHdHL}PyjZq7MWW7TOKf;S5Z5e-8bx zt`!pjFM&t4Q1%KAXRpF`Yj!(*XE(}cnS(O%IbEF~e@~klo-RzAXKfjo9$7l#g2CH>ZF(`8gaJrm20 z^|2lf5i>b0+CqDr-a#P^3l(;mZVSur!X*+^lbT17Im1#XE3btQ=Smx#>tli24>?;F z>9F6Pw)Q46=@V%*AV&w^v=%meQ+V@Cg)xuVeaw zAv3fUZN7XO3}CxYlhfzwIEn(WLgtm}QP_?(#4rRl;YuDWoj7AIZwz$LX$*`2!APYv zX+1_K+3Y~su+xwsC=feU+$_IM3Juy3e0g15Ep%i=6sf0^pno+Th!uTRz2qBFz@xUf zKz&evLyIKWu!h+i50w8}4egY(0!6Y?f%57Z1Ho_nplV6Ay9X-wYF&U59|oZEpx6Te z1J6?G3nh4sIV#SIR%I$(b3w5msiPw`%NIp#5*n!NgmHjC8zHBpk5oq;2~+XfpS~>@ zZ7Hdprj}3k5_J-95Hou;BU-`>MOI#FHj+3bsO83FM;7>rA1q{{YhU1I)(w%F0XY`q z$kANax5qOr{qM;Vl{HjKF zYly^*(GM_-B`Qar5fy}mOIv3H_fED*6Ftu}*{1Wyw2|ax zZ@O{!kG5^2grg!ay4?>o$|bYflkmq9I1>e3$hK9UW4+uXtOuAn5@Fb*>gqRsPuBum zKCax;eJSAwx7Y>$J7G{wFXD|$da>p#vYJ|CyvyZCLapemwQG2E*V==4EI@Gv>)4RPi0V#O#z$y4|MvBmyV`NYesq4?24 z1BC=lT2()ZaYxYvd~3HZNO3{bXIK%sBUhYo5gFk@?!t~tERJHZ1@NRFNRbYjWVV9A+d9N6m|D=CCd&2zsBn1 zej(~&%)w+=K&7x>xrBy7NQFrssreVI>71_O@M;CQJZc(5ki-e1RUR-uBq;nU2?i|8 z+7`UmB2M38IbC7b`To5~V2}?+|A+qP5F6GCv8fLCV-w2))TsO@Z~4IkB3n^8MmUkj z%ZZ_B25AY_G0VybAVTekNnH%DsF8)|%8QHuC$V0`$pfN(fjOkXNhxj5jwRWK z!IU+12+p8&FNk^TM$FJVOrb+a#kkA`M={qDc`2CFVA;+txg$3}L?x0YtW=`7%)Hxm*OzGh6{fnJ zZw#puq_Nht`aCczW3OF&1WsCOk5uj8+)lzxXoul@`?T~w*qwT65uxp_eJK|a(P!O) ztT8BsfR18OFtLdD4>yZ28BBQzNl=T$Nl`5OLpeJy4`<=T908-W+Xy*07%FWWb-y+^ z9#~yj;-VA2snfCm%spjZ$5stVGwOVD9LfQ+1z>_PRRc{vZt}NCzHl5s;wG^smV-2L zag*!kscaZJt~nqAcG%IvF4QZlEO%*{m`D{|BYVK7L)9B!ZuP)&kS~RG;s=V2U1=K$ zRs!X_pBW6x3+E$`LcGHbjv2cDBImn=6jt=D-0XkzJJxWY4B7P-qmY8D8 z``!`brCbWzah3%(y>gN>3SAy872`t*m%v;1@xbN93XW;q3ne#HIY``_49=){ZEYwT zsL%3a(WY%7*dpk@BIKZ5Zls*F!kC`3On(SuDr<2)dkLxRR?AlxpgjgsKGb`ADuQ`xAHk9cl>I z3XT9%_(THEU|#M&C7zv&b&#_Zlpk_leEe{7#$^!h2kEL&X#(StK~N#Pf(JWL@X&Ht ze0nknyjyTE{%S04>p?tlTjw~c_wQYvRJE61x#MrY%k!jUzLSSzg8;j*0F=u^c%Fv@ z*m+30gNLL$c<9*!xz);XibR=a3)2xJ8q!pPaze3zE+P5A9@}+l6!M75w`1BM#>HT$ z!R2gn152oTy7=1iF+noOfzpC<%?zbMzNjon(B?c>ndy{_?S{h?kbBHbxW|k|$~~-N zlu||RSW##X9VaYJZk;kS`3oABL$+$D@ddL(C(ickb9*(J8UY&9V7*=zkdWpAN-pZs zYhGn|)DH!67)(EkW>)beXUm7(&r8bMY03NN4l{UpD6zu3=Ir~c0PUt|zMA17-6yMo z1O~;zl3luw{S6L?o_ZJFrE>V^#=u0FJEnG>Av) z>VfSvf1wMSOXYm`l4P*rzoz(e1te3R^o+++i*@#$amhR3+HyO>Fiqdd4|j2^ffN*q z4Z1Qn>KAd6V71v_e6%YT^iZUt{=CD%4IJfZmzyo+OJBA9QD{GCl*8)s$f!e?eyhmb zN8*xTbvx!MIbX9%4z|l#@|A_LC&IUx9PX!fZgW3cUVii2i;k5)GcxwGi+D!uG8~t4 z-(im}@A~9xuQW3ym&4KL0zN%0e)a{tEKlG5Y~r>T%zWx_BmZ6b=ACEgtLMD+4dr|K zwb2V^YUie*NGWbgVWHQD&1hEG=)iIzCojEh%?=|9jD~Gv@%Td1zd?8P>gK z-Fw_CbHgLfxX&4iIyH!H7BM;91vH$RH~R}}oY|R_KjZq8<~C3SF(4)tgmYd9Y-#%G zJZjFCkShmLm!zYx91oGYJa#*+xeM0R$ffEnWH8u~gk{SWOX&l7&LJJS1Yb;!+2JL! z{Ze}qJr}bsDIdCpnwz;Uc#yh{j{L$_tJP@M>-;{N{6w1g;z{`-{QE|y##b#+!v~8c zVW*lT3kiZy91i)!-JeymB3-5hOB?cLNNq*kQ)+!8;hSdF|48sZL{rH?G0Ll8STQCy z=EI{PB$IMgs1R~SnXW+CITUk*L+5HNxuLwZ#!yx3ZUDYAt&k0_wYRN?CwAR*6C_hC zCXe3nnDvNulwIzAR6DI+nN<=DX$UU7W!0W{>JW9UruKnX*BYew+#y2vaUp5QcOsfL z&?lX$B=AdO2 z@(g?Iqn@n*jY}XSyACQJ#wM-axV+accOb)pEh;Xlb}e0c zu*uXAf#%A5cF=cmd+m$%>ZQv8qP~cheAz&+xAK_-lN`KjOsr${7N(HF({9Z2qFPxc z@CJQm(>V1chj^-X2|d?6mhL{E=hCW>htJ#r&*RD}XXl5m65H%S(r=e1NfjiOgYuYD zFu_J!~K3ZVQy9~m{BVU zpqTW>(cCN4h5}0iV{sQWkgq6DYND*?o}KX);^5q06=E}GBG+_5E@;!CgET{*3UYQe z$}}gk{jGT{#d}O0+=nSFq1|Db=npz|-%)9?!Lr1ma*QrwLF~i`zu?h9QPFUBmW3r8 z_RggkJ{04h*mY=KNji!#)Wqb&A?H(a4JR(d{D#Bvg%A(%nqP zi+4C*F?JXHLQh+M=O=ta99>%Xuz@5z?nQ|$K>uaFgdXQc3A9< zF;iZ2p^hr~l_81+CG4<7U=q0)>MjJG+--9Q&+5O2-9)>u~!-{WX2AOI$enKGYG|d zK}pTA_0jgfN>XaziM$AITwo>lYdOzzDJ*z+vvcUh9rV6EjxGenVmC?{LAZm2(1B5# z!$M_EECc)?p)4UVNiK;chu81f!xWDP`-cS)#-c} zZ||lvFL4N#91+PXSK=IU-^zSyCR-jtnGPsHy?l8iXKrc#v=CrFr^L_xfCF&JJnJ45481TovqPh=HV=|A87g$$+YsEcTb)PdKaaZjPKYQc-)u9Qch6X2HUxwo?yWQsx zG@t6Iky;o&BtJZ>lK$p%tlfWmJo_^8^Yjb^;0kY zr1(7_@{_tH{dLD=M7RqB?Z;?C>?=6!hy$8$ljHtI#o@YkA{pERf z)O(0L&xv{umFF(_IT}vDiW39-Hf*ib1=~z-F;<{6X8bSTbf3|$_H^?@sklFdyzseZ!j|YfMU%cmm&#=Bqev#zfc`#yG^fs)UO#aR2Sbh7Zc;WEyys#Ib7e}Mk{a9n3U?r;+het9rXnbBTMOUP2 z?aqjl@J?7X;L?kz^7hNHUAR`j$Je|ZQ1OHWiimk}{rUgdI#?K=DsEdFXT!&mgE))2 zALWf(@IX|sxWnDCyje>=NDrJ6XeIl}RI>A-Y;myrUhFCH3=042y^hBxqpyPNc&voM zc#Oe(JPJ5cti4_a3fR6Y+_u4se0jLfs5QJ)%+~KT-6yg8K7vQ|sNM^S;WlRgS$>9P zaBWQ-vs7FJ?l08mnQ}&BrCct{bAPU4=P3rzTjc#)Y`ETvv;IoPSi_V(5)pJ*(uo2A z16a~W@N(>KE)D1+bdrbYBs3O!7OBg50Y7$)^2h23A%Q$c!cYaKuZ+$$odIpKhN6&L z=}GcphL^v;`-|I!o_89`h6v<|pbX>tSRs}b&Pw+ia=gw*3r7|}AEc^>DMSYGFhU=` z5w6ufxiEh|m-%H~Bt`o%C(dAmBd2_qk{z@*7T2kvEmHIdst)d^Da@h*ev9?W~mbCe!Mz;5CXr_bFiQ8$bcc5I@H4l9jhJ`&Rr3KDlm?=pXJq3mq!8G z=q~y=r0$||yXYg4%|I#}oYaNf^;FqljIgUNRLO$bRX>K0SbC%f^bC`Ni%E`j@&^w_ z$Onp0KIM7{ice;*2={%J6BVxPX0s@5DFZ3Q&Tw+vV_wWy#E@`CIENsZOu&6jaPOm- zRaU`c5SK(5QQ z6C=uX&-HTIJngHc3BrYP(1}7h%PX{Wi$%pA#X`z*#QgY>47A)0q~sgsTH!i)E9Gm_ zY{gKsfJ(#~RW@n>%(hW97_)+{uN`Ps%MH@aL(OV%i)<*m@0P1=-OBwkGKva$nYH*(+Fcpuu z?^Fg#1k$Z+Uu{l-UH66MzOFIinXSSCWUJV`0!=iikIL};E9GAJ9XWvgSL3djyB|yk z`@-+6cLSCjhd4cl3D#XD5Wf|`DzA>Hb1BEm)kf0ql!^B{tW2iwcbK@v%UgA#j984k`^M0;+llA}NanII%9C~IHgZ4v6> z`^hG%76)nvN(C~pQi#hCUzUm~C`7C%D0N`2^gTJA`#PFoeD}i+2*KsSpao$EKum&U z3{?ug1q7@mU~twU_*00WzYV|bCU-Vlu{frdoiWzChx(;V#jO~?{ zd)F2@vgZymVOyQ+Fc8$wB?}`96&wgo$VN%{*3pl_A8S$h}+90x7JTPhOvG~}C< zhjkB*PxUXG2gf`7OVeL}t57pt zNUh@A2kM|%`8zeARDnLwjlCq`AG?J#V_HJPcSdE0FtkUgt`fJ>c@%+A#L;pX*+7v& zM35rt)nFBmP*_F8mi%Z)yI4HK*Iconk^Hn+jNliS^3Lz`+ZgYKSlCVK1qosq%4AZG zY=pE(qkNDj8&iJ!0)x^h^DICxr$brHeWAGYO# z-57g>f{>hInp&~=&`7~P#6cQpuoP048(c`C^kSBXe3R>3;QJc#jTNE^4|2IaCAQi7 zf*G*VFXJcwj65sLmDL(pL3K(E5|rv9u!*s=uh zjF2?HX)5wc%54c^@8tNg3m!Jghj`pXoOeAxE*}y`8Em?Qq1Y1reNnN)m3^AB(cgk;#m|@z8d>Pak~KaLh`Li8A0J* z*_Z0&K0`=Ve#Pg4v;mDn6Rr+XKNaz{p$&ZXX)x1pbp~%WT7VRX}3*yavrz zx#oKXmJ)%Eut0FmxB_+NS?%Y66FGzrQP#@iyN{vs>Ulb=;6G0 z%TX2NCDtKS3hw(gJ;W|7+-rd=H_Cy7QDW#(%;^J1Mxhy?tBpydLpGILr^h z$|-HE5w>Si&x;gvNHtD#PW*|LuW`sKfAeB`!USvFluMNft23f8_d2K+74d-#;j$2A z!2Tjsi6>5ctATIucYfHY{N4Ly;1`sC7uJGyMIsPB5h}#nl70Sr*Bk`3x^EWi`tL() z_IPlL0KI!ifimB(OtAl*2Q@Kx#%K_@;K|_s1$BxiXAPxkU z`ziHC`7l4g50p5H1xkbubAv1us?vrPRBL_nmqCkF02Q~zZ>*zP&Fb4u+{zYdwS~#p~ zJ`XMYQw6c7g?|dI1FG30jDW!e|Lh@IL|s(9{O6(OA;|Rz-=YJoj|krf!WG-ZIRk4d znZDC#4;Yr%(N26v32s%IDJmAaA9%(BT$9zqKrzzGX&lcI%Haz+PC0l#){keK_NXjV zuG*yLnwsa_VWn@XV52&|<#)*RB709C+yk$HL+`G+C?#kYDJv;aRat$G1QBZzamPtd zQ{sAH7>j(DTCp-BkSxE};+zW?)C@lF1r7z6_T7&($_qRW76o zD&e_rStF;{$n(Ip_G*#%z;=ba=Xs;NXDv4k&3y&(IL!T}!Q4}9>6iTEY8C~D1^~_j zfP&{+w0tXczHrcaV|iiKHEaUy&$NQy$`e?8V03hO65)A?ws`^;Lu$2A*GTsQ6!BXN zf=7QZkKhdJM&&T!68B!0z$k`z4`AAs%`)I-SUl zhzT9Z?ybPp)Yo`H2l-dh0%KlUw0csxk;p_Zjimeu{dQ2lEq9smYK&K$RuDs3U$|w3 z4-aAlqn5VVc^X@EKM2s^#IP~}pLX9A@y>CTo@sSZ)+_i>+`F5`y=*q-1288rk6OiprY&ipU-J!#WVX6jTi!ctFA3Og;`Y0kjvxB#Vd!5N zI@NUOuUEamy4sxs{p=`MVNX5|jV z%5dzC<#Ii=`rUayD-W5GUsGPS-f$3bgq3hdy9hodR$hmK^oCriqsK~0jsuJ90cOQ~ zzSOTn?WZbggE6|I-xZ%z69z!@-;ZCZ%t@k!7pB+JOyk=oz zIyz-}S=a=*oq>gQKP(31Wuw420U^_pMv{&of%$g;fecyX65u-(?^EAMc&9C9^ol;A zCb(3bFJMW^7U4Q^ScFwu?n7l?f+D1d`1o+r&@C*t&IU=3$Q6-Awtsv`Z?%{#*yYFs z{n2V{J5~hxG5R~=trwl;y-cPmvW*&IkXla3vkweVif*6iedcDV(eLQHI_s_q&X4SJ>NCWZ!wn0bbo{uA39-u?Omh z7ZP+4AuG-`Yi?1gvS}6-p)Ib6DgwFO5lCF@5z1_6PxTWYh%4$=tbSnz8 zs>OZf(0r~TbcI4E)9!*+ZXGTi6*LitmkCy~WqSw%Y=JoBhY?Y$3&mj493^~5G{A4- zRbdmG{7mCje#X6mz^3Uy&RrdvCR8I`J-g{14jPRL$X)N6EKzin1_6LTmVXpGBa=aF zQ^IUkp&SMfF~K4QLdQQNZ0u=e;7>eAqYr`+arOl}J`y3cb{IGt5%g%NZ@DFiEAb!+ zPJF9Eu_r`?09~7KJH&Bg#K9XaGFPVD&~r473y8#5nGQrOG11B-w=Bi)H~=nv*n0{?aeYtV}<=sT{VqZ@UO z5>Kt)8E#(Lo5BD)Y#Fm7EaF&M-;qi#vYLKVS2n|aa)e)+)s1rG1w0pm(1)8ph}2uc zsWj1#!~Yw>wiG%dZ8fOKAq;*?pigmu6MfOvZR87hb2zrW4&(SnMGYz(ROtU998ad# zc!X&1@*2N1DMzYI7A(v)t|kJsa9O9|FA*k|gtqwA*ADjz2$5bQKxeA1+yd&l-ahF1 z-FxYZ#jlc%S-&?=*YDj+*LcwNx_P=@cMn~K;b);*bc%ABcv-73B?v*GZ4QUnh?S|! z6~a;9mzjvjx|FA6t|T7yeLq(pl!{z)hzEsAt@=~-P|hl{P&}UKH{}Nb=!;E>?ollN zU|yhCn#z!#1twL)ZC$jddzU>$4@y{5IVZzx@p9DBh2 z^$r?#ZNM|vduSdgloI0Ho&g0(q7?KZ0e%k7p{^^aTeKEAV2W-T(_$5`$+L8k2?8DD z$$dZN&(ZVpkywS2iPtX=0~n8+8v<^G0!umjRWENCh9-dhL*Edi=lJgHqwD&PNmAR${=eux)a+5Ac}&f1uf zX>Ocnnj8HzW3tJWISbk_iX}1N@u(Fsl22oUu}GfE3Q?AhHymC6Ygn|lfqz!I&kyr^ z`jarZ(!0a_PyFO6i-x4izgD8_r$fD%QZe(>d+3D(6SRuzg6a_|KMS2fD}<_@e>U3L zFVE=@`5^?$Ai9KOp-1J{ccI z+^qQ)!nP9Tw?0)QQ5hVR16?^38nYk{{s)wwn_Pmoj&*BLSH8-u2KQLtl6B+-L3ObN zua=Y~qpTqgfLO}Oo^ggamycGJ*O+6mUCQ$a>Eo|r#nzU~?ISDnQZ7kvbJ&GQE~t^; zn(%R%D;xwUZ=$&XUIjIO?y$hU(%ox?ft_>Os|vcgOi~6>!at<{fHL0FCwX*;`#?ot zAtF%K7PDr(z5FKq!lPG}(=Uec8N$Bw!P66d*;9nbQrr6I!CL3^ihl}@$2S~@hD`gNYtm!YIqEdP+L2mU|thJZ8H_-T){!TAB&4paN zOJTGeyi(cfw}>rGIyDo=vE2SkJGn@ii(-+;8a&Vne(ohJqlz+b_LPZ-d9HYvH~V$( zCv-GO7s+oPd7=Wwr!u6KP=375Igw7FVum0EHeymC6}aTSDdK7)d)^d*wUI&-xmrj4 zOwZE-h`_lB8gWsnA)whqQHKgN_o9fk<9F(oSwP?7ffltl09t(fDpL%xN;yeb1QORN z3Q)XI#0ONk3Y_!!gvH{K8+tIRdYNc0flx6nzYWC^oWc|fWpA*L5uaYYxn-~|gGS)F zYSa~O!9L;VC3>(;ufspCSCcKel%+3&xAuZ@_F~0a8P+K@$9&|Bv=X;;A6o1qOtOfN zU`}LOXQsc8OtGK*Y&D;BihcYiy|wnD>Ju)b=i{~fL^XhSie;h<*%E;1q%4FdC!679 z{$bZIl-wLQCKU_i#BE<{nN+*zXG=9x!e=7Xe(83hRg#T>ABtsag8XuLFMA&QRD`!cdfV`5fh_sa60td3#WH6D{JLu7 zSw|F=z$(9g6*~PUjNeft?y1B7rs@enhnBa8mhEDpW@&C8ZndYM1GT#ap)|6FJEZ4! zf*Dr~ui=iN?%r5rg-h5fG3ltElTGG#D|Aie-O@Et&GlQ~QFTp#?suW#j);aNTXiA7 zo6{5o0oxO+RsBBn6DnVMW zV&{1rRD}rm1r}La)0xn2X@Bs;4oeah0rV6zm0Az=h$w%OEQVaE3H74Wq;wb+h1h5# zdF9B(XwlR%Q5}ieZycZD0FBykT3aV`W0X{e*bqg`Wgu*{q4>O(S;*0e0ERPJ2?2ug|)CB3`+NF!=uHVA(X-G)H; z^JvGw7|zO*!c4bc!}8gSW|1LcYMcYgXW6{qduc^be{r+I{6*G%e)$(aAqIjDT?&;2 zEraLciRG0MP0pf_(46=)8b#I{T8WLLNJWd1QRU|+yTxfqYV3B56pG7rP;2 z`PG3JSB?E}6mB>X19iFaUQ#s~5`QlZ&7>$|Zxuu@ozsq;AOd|XMuP;RhhjZGFv6$L zoJlDNgs7@qsKchecK;#R)v+K{&?g#@q~h|vl)ns7fJXjpwXb3h`NfFoCLG8Ae32EE2Com;1_57?ly!v>ERDs-do( zVn5&YRlCyl)gxVdzU!-ZrR!^?t5=2COTO!ChPn>oCJ^pvVWt7mo#xvPFdK-DJmDzO z?JLnZB}GSc7>wL!Jo3{5jq->Pq=(>3TE%HKsF2`B(-dkX6XK(tz!9n~|^&$)wgvIN_T>n@s zf!w*?QGV~{^?thjROo`oH-u*L;}s61H&kt4@?g2WF|>0zN&)?i!|j50dy{L|DrH}q zDh%E4XrSkPNTyTO9qI^0fi zTt#mb(*!@+yTQ&`tQ15IAB%*UWw5vc2z(#5rQ)`?xk=gB3b?oVN!1qcb`XQg@8=AJ z(%VD70kCf$?iaZE^w4gA{nO{PlT`j(yuBmfV*uJad{-~@=Iiy&&}%T^JAJPaY`-hC z8!X^m!|ejL=V693!kPxmaE9+X66_gbhJnJKhZ!98mw0jMY`b8TPrPJ)cbI>KLEc^A zM(?husL*rpdqSrHUfwgj-oP&J4ebVadGBz$U>u^a#20qT_)OPnn0L;c(+LuPpKqtU z^S-Ku@(z|R_!K{Z{T|YdbbEgo{!k%O>S@JadVkejH9A}{;5@(Pv%*>iYd*{O(v1od z=j_mKu;#Oe+l{PQf3yl|6(lnU0DSUCECFP5tmz*N0+r1kLmvn$-y5m%0Y7*VWSRVc zAJQ}Leu47jkuSY#fPFY8xDR5u-_6-MY7Q?{q4lBpAa^7dKn?)!DaxcRpAIP#0T@`c zlIas+gU<;QjTK8(&7V_23HHMYfJ!E*;fOg&Bxz8YvJ1jV`wfKCxo%eCG?j2V*U#%i zx(?Ra!s)}I-(WvKJlwD1?YTmSUrZE?#zRwn#CN?Hp~Ln6uGfIj&hx!S)T3^Lt7y>U zK9UN>*{gW9?bzv~Zn*Z4w*9Cd&eN@md2db567wS7B}V74KkG{efTziig=qv$kt+3% z4WlWr$HzlES)FV5@!@tF8y;0mm;jDLjuoL+6(`}uS8L@%vEx7C1}At_0r81BgVXMl zp`ERO_~dXq1y!T&$LtL~}7&lH~u?FRVx)Nngz-P7>XuAvimE^hy6 z-|$|xyWb9cCkzMQxjeB%5k1V63G|r&$pGV@8J-{r>(9;w%=l+Yn(x9ya*^Fmyh zeiONJ`VM3j`FP1(lMPWZKx8!+@zvMk%1!)@wv%S$N&!>oHHZf}BCbMEw%G0E=jMX_ zIS-D~Z9w$-q1}K#&mV3V2=DWAm-qSMcB9K1TAUZivJ_S%=*B~HO9%_#q5#e+`G%bl zLDKM_PelZQPC1bvm|W%NgDDOmR~;R?eJOj zi`)=~N)8-dl)Wu##d4|jzG!4T@bu*{TaDSiJp0?P1ejT8q3irg)dXD@K)yH(vYbIK zu38AlxgM!TRuB8{l4Zl2;+|6CAt2plGD;(t*MYP{Bg)<6B0s)WmsRqQFqgI`6FX?H z2MX`8M?}tzvfrZ^HKKA@vThiT9Q@KV^(3k!jUwZ*%j654%`T=T;Xy*7z@rx>2?jT5 zMGag*A&{O>Lv*${zKD$EJS0&hiTzc1Qt*0-Lx~73e{I1f9xo$iZ@i(`9S8~}7(fb) zf%BYA3$Dmg5hD)=uD|L=U%Y;mUTE=EKlHwmfSJodUvsTZxd!&p!+l??_J|Il!j*Yj zt^{;BOJRNCYR~Qdli}Oj`lmcPF zJO8wlM~?T0gs+r231}fIJQfPh=~pP#N<UgS7sf>;j?Zz?R2Xv(X4#f62>E$EUko7m*q83Bep<1z8 z7^D<3wN!D7)?{H2x70zyBlCJ%SGe)uu_xXsW)TAoQoH<2#UClTibKyL5gB{uO$MCKDnw}I#pZ$&9F#BKvxRF zzd5|dK#*64R?O@QH?JIS7U<|I*9>_=phRw7xN5kSFBK?v2>AK(-lD-NRknU?E;Ud* z>~~rZ-}(jX)=TjR>sX;xAOSJ*p%Rh*c4;3JJXD)FVpvVNt(-}a@A+g*ssQA*BQi*d zlXw(L`mdAnlpUNj1%DKp0EkRTwxT-$8L6!DwJzvN%08s9D3rEb9q^EMKNWGz-tDyW z>b&CyWL!+3r=pwP?Yee>ol2qAQk+|(Qo{XeO{~TOr-Sv}xYbbF!IVDGpmspCrr#}^ z2Sh97Hz}|Q#&{&C0CLKFca)gDHO4M#@`G+QS0xPcA1slf<$XDND#FB<>Vc6})e^oX zOW=e7#QLs;o&1(xgvbQZ`SK6)EFL^4Wv$8kM)_^G_yr^`abd)6jJl6ygl|`9fO+^a zFq&6-l5XD#-MF)aoaXl;K5=*()LZz1BRwxku?_hXp&Qu^uFR1)OZ)MR=A6kq$S?jl zh^`4k|41Nm_R%%N(1eE9hK7Hnp_%~K&S?gAv6S^k-`S;x2pVyV*?&@kQq0fwr~E~< zuvcN12Q5V8%x+t7E#JZJ$M?9sf)h%bIwhF-ou@?{<*KhCjMk^mU4fruv&Ga`@Ms%=q=eQ{4FVd0Ka+Z5c>pf~9>f1%R@(94(Y*{vfO=?w;K!f8aq~ z1{FzFRCk-q;o}F_ho(~1g{GpaO9Z-BbzNU|1o651e{2t%-9$n2~} zc|+AvX4IQ*dhI|qLAv(2b4*k;7ARFL^2n+{{13yB{Gc#w_u*RkLqFtlDy^y@fk-Lj z#E+!4RNJeI?GV)OW(hY^Q zhnt1hq3OWQzZ@QOFUXZttEl{0O7~Z8h{Z&hpIrXR_i<-Aay>~7BnYj|Q0$1l=3_PK zSBOZbREaHAB9UWpVA*LBv1e8y^u(=g#t4(5=1w|6Cre-;PH`L%b);r*Gbgwtro;&@ zBE2Hm-TfSL2qc;jU)Fn5fw^vVaEk=Ol)iNUc%Ug)aVJBGnV`ZGYY+P5vIj8`RAlcZ zg00|XR_rCkrm(&go2r*g5tz{J^8VPy{yy_wU+A`mNYN|#ae!C7OHEHIFt#qQ$tN5! zehxt2hK^=aD)D)n-!s_nuCEGTyr8^o0KM{>6ZC>ZU=ehpFjQjVx`QW*1;Hhva#Md_ z*@j_U7R{sj`xb-_DA+6ZrRZ)LnH1#lgZ4c}tf2XIpdfMG5eVH=ZTagt;ApWrW`Tpw z*;$*#f}2$uGXSNZv9U#RRBzw3*muax174Oi)7w|?{;6!u-vltSVqfZ7e&Zn!6()Do zyCSi`f}T7E^*gcqtv1vBmug+Ny8#!JKNOY+3(AkTS1T(98V;ZbV&{&~?-j5Ty`%*H zj`@0tg(bi8!QkC9g9QGq>%Er<^WRpzhDFp$jw@mYsl$MUD)C(bJ9t^Y3)6G)2VB9} zB1V2!4F%ZB0B+kkLF@&=??b;nbm5Xczn{00>|}L-PWV~~JE&^WiK6QlklWH@p+JyYpfV{vWyIk?!<`ONYCiZW`Z^cnI169z zlbE%^V%V{qu81v^^SWU$ag~oo6^k0T>!@WMlOG?1o7c#tTH-p%Nu}PNSXpjG+-atV zvnq`J!DEbVq_F!B6&OLkx&FmIphO8IVET^%(=Wz85Rs)j^v6+T`yHnib_)TxrDZJq z*k|LtBp4u0B~52D4o*=Ozp@~TMO0W<)f;>QInD?s_)H9kKLtQ2h|K`Sk;2+ zrpdP|`w}Y`>oB-*B78aJBgU9EW5m1Mh+4J_6W-;A!g%oO8DczOtQAY22&sCvXyLJxv+)zx3P|U7#>_juH?f1x$ zqH1zgoXLX$-+F`0RiTvut^4}Z>GQm_G0x}JodxE0b!e(QNu+x9;B|Qae1GpM%=5$R zdWo)y0~svQHFX)5C=U1qv6nTbt-oNTObzzX?F(bWW`?-R_`+tbxE1%JSdeXnaq}s> zXtiQ5jsqyzR(Nq;BG8^8H;2NOYnl0y*z99iPd_~MlDZZXi>|0^W4XHfYga4wQZI(0 zBwOR9brG3#GC>5t|Rz{jneXHrzQ^N<*}l6YVZqTeh|+r^W)`1 z4S*5Xjg0!bx=3Tyem@jLk$yt;`*n%1M1K(bGsE}~R=$2k?8B6PNA*|Kg&O30eJltF zH`xkaKT-_zC>6`N)-rCoM^P!G2+ojSu2-{_8{(i!v!5|`Z>SrKR^cl{hwzFgRId!L zNy8J6fdjHXB@O%8w7F6#?@AFR^{yb_@D9BybQ-iyd52y#+N^CsjJ9cq&+UBJ_fk>_ znCWMi9&V7Og^s_Oa|Xsb3qPSgZKv4%FbM|C0w=cmZJjG8%>ZHyR?JP{P##ib1rO;~ zhi^+QAx4{XRNI-w_5nM;aWIJw--!5S5;ulP1dGKKF;>DHWju7FLuBW#9@PF;sQv0; zz^mdyc879^jevC_yNx8S0k2-;O%<^Hs3g9oZmNMduMOqc@{tGNwIgL3J-Sps6l-XM z@=#sAUibx45#a7zTTN(UetV};oCNZ8JL5Q(PGhkqglkKmBSX*t^JJ>)Mvh{`sv=nY<_q@@q% z+m(M!;~N$ihDKW@^TF4x)CYqW*sgJhLR<)NWkEGJ^%p|*;03x#bJ>qYJX8D+V0%+z z8cpx?0y>I>6p0qljG?&6<-p9y@hv^-^${kh+;WGlF(u*kp*c(awT5M{z&FcY$34dso^ zq5;8KpV_dHO1(G5dMDNGzbRBQB}e0DNenA$a=1BELU?RYHnp4U8jaFba^5P$0CtVf zN1Nx(YDeqv)kHp3o86lmLuS{oOJQKkHJ0)&`&ia%f150{;CK?%UP>v-(1czqE4jT66Q(h)DMr(6lLV&M=eW^s zb)()=nW1wU4G?@w07iu}jk-c4n>59@glTM)G98aRQGI8BmN5$cVKR2Et?g7PuYdE8 zjRfpZr#pFjENLYnXCb}5b*R^kCKLHTW~6?}Uvcz|4* zwSDsTk)oi3Fd69J?94bPY51D~NnHd+G6ycmA(?}+?>H>&#`JN1e$X@fXdw_%neB#~ ziz~!fz{BcXxbWAg5dbo?2^|idKfts{aVH$)TCEkKFYg!{I$H`>`yC@g$2sY%_Rd)0 z8qJjoTtuOLrgt_vbO?GlDswh=7=ik(SpO@aF6>L{`@2Hj%{BCEBZa!HdO_YD>-Ok$ z7Zu+fDsJ+M0cvpJR0m?2%u@rw`Y7VXk)7&2u_b_}TVH9Au_y`WdqR_je{s<7jm2%! zauQ71q~AMIn2xM_oy1fr+!SF{Sd8IvQn2uSp+VTd6Zj%lclK1w=2AVldT7nYp|$|| zKa6$6s9cWxVO=w#E&apA5t~rIY%Z(gEB8ln5-3y-zCQ}pO$_-!8Qc3~KPND@_t!nx zJj#TNA-FB_0Ka zTN+~oopzLn67j?6KeaZzY9g>SfiZ^zww&Ea|cFtN6*Mq=Q>S@cpMPQeb za)n%qTuxkSyQKv{>fa}(61Zl*E!m=M)yhc4;3jAV<9RoQ^J_D@r!3KS4}{fS)|2t%$!R{jIA zA(9vqA>6ed+Q*6^`h6~VMT-g za6NeG2z3mwcAY?jBcX!g89YPok-EGgfsvbrGY2{q0wbYU53xi6E4(9ei-6iv&&+?K zQ}`T^qAK|T!uW29vxhH{fXPL>DS@F@o=-gXMiS%c}(GAFX@ACL1g- zqF>AVvBC1@zPul+%d@-@+FITk3J(eBOa^EnGd>0-Hq|EN&{F<+m@}ieC#(LvZdNPp z3kZ{~U1wS{U}m~|NOL9h(7FwlFUkdr)8YaHz)v8?UA0&hpPnC&5{FJul$Bo!S%9uu zQyDL8-INZU?MlxVA|^Vc)l9fW&%BYOHs6*c{q>|a#n>V^ErmHn&oQp*csbbo8PlT@s{?UR+Knl8(D4{2)oWZkHKs5|A=_ zrU+8dVtw2pxGCKy9ChtFMq8 z1&e*6*<1|$KpT=Lz^^Q0Hj_{RYSKFG9%5%f?z4OW^6TRI817Frgn@7rpQn+8El)rK zLZEky?CdeqPlkcPrru|h{a^g#`hsVHrOc-WWnLG`d}>f8bf6U^SG?KkW)&Fnfe-EJ zJWH_DH6N$~BqJHTt)-3z`6r8Svfs{7)@668MQ_HZBkahI>Xh^8(ECubV5GF_<^=t* zXu8(O4k?kHSKZiW52Ny|bG{eEvg4nL%l;YfsaIh=o2L7j(21~qfQ;&b9U7ySq;%siTKR*S)Xmv3;1Gn z#}D_n79UCb@*~wOzK6$ft*00r0<+TkF_r(FueCe$&dcIf>Wi`?B zr8x8&XTDUIZ{m!ohI<8uQOC*p?EaK6-*ACrF#}982izI8F8O8esz8k;UuNA)U7A8&csk@D5plOgc^G0O1s2@xL;d#<;Rmer2e6i0LoAK(E>Y z7xrMOzpTqJ(HP1WJ@$sT_9K*ssJ^!H?X7VX z50ywT6uq@B!ziMH`1RPzIIVoWE)n|ptJn(BnGw_fsxCw`#*J!&y{4DU=|#*owDgVG zQiEo`5n5U+3qGPQ*fByg($iQ8v{fzLkji^+#B!VWnZVrxvD~&=k0KV^X^l(#&Bj>a zJ_fvRu2!?=@CmthVen%z8L@%-A~#5z|gJYdS!>TjBr;%57IV!_P_ zLwuvGt6W##X_lP{Q-bV>H3|qI) zUn|8=^J_D5$>^T9QeHF4>!Jl&9XtF$jIzezBuf-0(>VtIq<7H(fl~{E~=?9>)#p$i@>e^ZMa}q4Ej2wuJ-RjBEC1$7_lV-;3{Co+bkp506}}S%%?*SuKzXc=djpeEt@e<_ z?jc|m5k{FUK?wQFUiLxvm;GeL@L3VATf*27jAOk!Bb>VBMyS`Lk?*W)0?{(S>4XxG zc3cPL%?#aL{aQD?ep**r%{})Yp@LA>_5c5<%Qu$oKf`dyq=hf$KkFi44Cc(@o-;R< z;)ZI8H-@uK^333|!v`RbMq`e54dysk&+)FhZMrWaE}V>WWvj2Vc2~g3IODqqGyb>N z_>Awan~?oc^4qf3z+ihDQ<$ z@s;7zq6czc3R=>E=5aPTCm_o=C~fKiZJe=56PU)zBji^Ms{_Gh6``t8l?U@P zz~^|4iQ?TkpJU@;cs(e-hkJW12HLK9lrfFpX5_QG(kshT{(zwIT-od;O6P;IT#uBE zzJqzNSuScu&kf};6BIP@+-4cuXf*Je{e6P;#YwF9zTG8=qfKLH&g&~unXzj9%=YXj z=D9V%%9?KZINOO~0kvfix3sQ`!&97?JN&O2=^9u)FP7_-8^bi7*DMz;jH}}`GMmQL z!({?yJU=!z==Axape=61plf0|b?U0{<||B-p*6QARr!#<|VK(24?H zX9c-pNA3j!nw>G%ojbvq>1iF9_X|gd@WSSt;xfM|lnX<6QL{|#Wf;c|V^og=UIiNH z^y1jh0G(dkY@_xPy(AVCK6$eAmxO`_yQuYCJ3OFkN6G*J8_S40zYqs9=BgwSX7j}b zdFi0@jX@5*bfjUR_Od~_ILMbZ%f+4Zmk$Q{gzDvWiGU{8#a6zK4Q_V$=4!8P5nopq zh51D4(5@@Vn%yz(zcQ5HkBtzRo1xsSvfy4rROxw~<C++Kk{f_(9;$1hd>VN_Db)yuoJMRaKAEiJuR)qNCx0?ejHDqxy;#+ z!xYrt^K?uQPq5DIVw|96=2DqaLyfW3adU7hHrFZ2YgA8tq)enKX~C=!owOk`{7JZ( z^byxNnN8$T>!Z`@@H3XbpV6<9zgRqSODkyzLRgNd7^eLypJb0Mx(PqF`>HU> zdT)KY+AmGtyc+UkMmTb4lnc+|51_}5-j)fX8;4e@4*Gbt7eU9z@omP%t3$z=T2o}Y z>!d@Y`QVJTZ-lpu`>3^ZpeumGXcQkHecWVxSYI@@h3p`EN(8~_{*2H`*REz^D!cgjma zzk}<2Hh>-A*Lox&B7lg5X-2>p=e8xMD7=8LSU~GTgXpcr9%WW%7;=RZ`d|E#F#Z#6i|Tz>=Y7A0g<8G@X)a{ zxA$9qaafDZC0?1`LTQqp+Z|#ALkN^yvJHeaV9jK+C1+4|wOZy7E^}bNo;Lc^kl1)} zMT*mcxl+dFW0RyN?fUC-&Ds5p43jH0sfUtl$yEe0#|7MB=FpOw|6_Vk*Eoouh>y<4 zk?hD8ma?msT3iJdn9pk+KMTAezX8j9Z9vYhkTZHW!_{>`Xrb*x5%=Mo`eT>Z9SS{6HhUmbt5v5ZZiUj$<{+E#>*5G?In?Xw+JOkwcWuzz z)GT__Dn)1OqOWfjef>yLndP%(Po7()u;Sb1dRLXz#J(L)n(CxQB5!fRIo8oE%e8uJ z=aMztH|A{B-;WzrcxGJF7$E4mECS@XRZDj4Jo07$b=_Zf07fhh< zX|VvjPX(q8tr{ZWO%ZBSAjO+jE}td@7DkA)frusV+AP*$3p5(L&AbT?ft9Vk6~B;i zDJcL#+(tF}W*C9as`hK^5rT$6fpBpK zQy!*0QJ$bJYGZ45(YjyRkd{+tGevQ0-NOKbDN)U*tL$-NDEgJ@63FZdH1W;4;!u(- z1UJ9gC!#HfH7Mk7lh5eQ&8ak0kTviW*bU(yao~1E8XYkf{lx)@Gr<)R4pfyJ?aqe! zh?;YHbdP23#Ux#nu4H;RXY^JfD7e6m`qqt3aHs`b8pU1c3M<{d7Rv%FIz<_rH}y}6YYddplinKEwc1J(({=^w zTLa)s3yO-Xs9s@Xfu)LiM&cb927*7_34@zOe4)gDWt&Be)c66Q;aI&`1-9``9lJf* z9Trg}yv>KCyLOV|t?lY6K@dDE(-dv(O|qD$iKnj0CgaBqm?y}ia!IrOKM z5i20SM0ZocWpa`nOm>H9KM@q>TD%Qt(wkihEe0&_VRiCw&MrGU8$oYx;(5ym8kZ7g(F4 zTy_PTQkZS7+1A>-`^i~0`4UWvsmp?}@AP4 z10uSR2dAPg;sFUgg$Kg@w|JbWj6GxW3jTK<#C%=C1Cn|=54_En^5E8-XY+W_qq2QG zN-kYYdCos7JE$kOHeIdfmPchT)bk_@f*30w{HW|Yedk`w>-BsnIIX87x}G4^8}xh_ zvqA7>w$psq?7Dp$!^ANx3#rv+gj`T?YI|tcs~x(byx6I5(W)|is;W_t zbEqmNQklqzJ*zv@ozEO6LAKR!5*LDSGBccv^B5PLyD!eueB}&_dWLq*I&mhy{tsGNReyR;SF@E<7rojP_q6V4~MM`20CAimKLi>FqJ4iO2cE#nE!2Snwo!5?ErMZrn&1bkNF3Ff@(#nmVR);|{1 z<4u-NWf9 zrVrz9ax4TNtQLbk_{~nDa6R<+ZUGRhBk#JJtV;c|Sa7h%LQ(@*=S^xvoZffRiJkWX&AhS&BTX+~fjD#Z z&@5x)Jfv! zl0-EeSf1r=loi0}3V4Z8tVEvl0r)}>T3)nuLN4f}G0WAqnFW;01E<`9@*R<_Hrf`dLjkwKed1}#ksly=Q2gCn+! zKh3J3J4Nv%R6MKd?1Dps1vbqJ^?c6eYCpmdW+Um05wZdx;THED5#XU{QVJtS8AHDm zt;|O3m^1nI+APcWXDe}I^8h!*p}-9uCgDy7DbUtV1{*rZDd;32;L&Xs?BpC>_T;=k z3(OApJNur(tASKU_-PrWsT6OiktKqyW+p5TisQ}8Rt}poDLdBazEkt!e#2?Zm{Hj| zbpW8v2B7z+S$g>h+BbLslpz4MPDbcE6By#p!{Q_=;_2I=FeXAx$C)totave8!I6uc zlE;z}eNae}6NsIfwc^Se-FF`*=7MxIh!#(kGN>LmD~B~Tq)bynzO?S4v25%(k)Y>l z4sJfJ{;Y68rX0AS`5#jqlpnZEBtdj<)?n#f@}$L+2dogWJ;VxCGre%MX4Gto{}w4d zVoW7&RV)$)ZDqP2R{Q=9GG+`t)l{1o#)(NfRYOg`7 zH?!QL_jXP1Ew5JFN>q#LQLF6OQp|L#TW_&G$GYWM0|YdE>s@+LW(sZMvla*SW04tj z;HDPDULl{V8}G^=i6uqSg}d^T^Q0U*+#kQ}*YT4dxLe=*6H8c!av+UgR;JjA#D)5x zX`>!)q0>rw}!y3y@+fjl-i+cfRfm6tQgdN4N-q>I*fj~uenqo3%@*m zD%WS5V14Ez4l)9DtR7(I0~EB(1O=?M>6s1K!hKRSAs6_e2^3?C;*Ky$G?7xgIFgd_ z0F14Vt)hATe<47fN0{WDRUYPsk6RaKkn-J8bJ&dOCeZJ=vt6P1zhkgma_$9Q>2 z+VGe~9py2H(BZKep~FM@f_ZGgjm%?V-mX5`>br2;IiJUmIIi_L4)GMuRHDCrAt7XV zOJWEajv(}m@Ftf&E9) zae#YsFaw^O(rRr((P~Yc0*gB~dxnMbYo^6(R6d9(gyn<`;JOYQ7xJ1-Vhd|;YEsq~ z(RgBR+Bsn*Z7YgGm+*2wY7Z~@#*Vq&@c<<%7Q_(; zL2g2WQd9*)=_6$uXhH%<%xmn|UzNlE{1hix#OC}&Hce~n*Ra^pFsD{6_uXUcgAMwZ zu`r3aRs$Cs?dUAvysO*n{sirU@mB5Pm9_dK793=0Eelbsp+K$mY6t>32|-W@g&;Uw zgdivvLJ;f}krWEth~f2`iL5=Ub8j6mL)+O-%C;h5GwlR(m6{%y;d+P*@(>rKND0H? zn{pcPIF8jPiVqjODdJ5nv>f-9FZRY|kHX88X@?BVW0vb?E-xo`WY2Cd9k}ivZp*v# zV2A#c*;4ZBhzvH*OLUF1r_y|}dQOXB!XbZyO^eB!(Ph)UWyM1r-{?zcMlWcrG_PR@_E#0b%3L45S~aiDG60} zuBbnciofDAT2=e(p|VVk=on|n5c@zVx6C0OoUh}q1u*2+npQHvS3?@=yXBt%z7eAz zpjB&&ueYnUC<+ECjc&h%hN*Bvy_j4|mok(wPFF60)c|zUzJ9h;K6$>iR3fNbn{Ecl zJHD+$uMwGB#etj?9|KLE0G5Ew3NvEe#^v}gvzv=0@~i~+%q9*PB+ENG6oa0cFc{CJc@Dk(1823$JfGZR?pd#p3E60wr*8knaH1#l>JEKl<+g=j1L7dgVs4X5XcQ7)empK`@{S9X!O92 zQVg5vD#+mDJT*}mFVl998V~LofN4lSW$TV~y9yz6+tU3^NR;Bo5*DZi;!`ZF95~)J z8nVxfQtD9J{l_DlCHZ2uXz=MLA}dL)%oK6qgq(<`lB3Lvzka%PuZjk% zXe;dU$JUhYT?^-N95M!$4E~#p8FKcF1??h3k7mVd@aHa_HS&Q~ufXUseeA$R%nV!Z z$mh6D`dCV5OIM`7NhltypDD8^pPsJ*zmmQqE3@BJ*rVx>@?J;OGBDIEq;VxAebQ-NbK*~3_5{>ASM_&)6ktb`S#!K>{}1H&M_ zPi_*C6mAl65}27gk)`ZL6f`F?O6!MLF}E8&()47*rBrOfeS}~Iu=tr9C0W=g!6BGM z46%Kvs1>HHds?x|Hy39CKcCex4QK5?u{!XJIDxoF^4_s@Y^7z|(7GcrH29nmL*eW$ z_(6|@CW0H$XcL_!Tg;u=RZ@k_E(d3~A+h4tCSRIcn>VMs4PQNvXtt<7#S@Ha8Zp9I*fV@9h#$|mW<-li1!2B5W{5o*6SN?Y)f$GDzQ8?z^`mG%}eV;8~_0u z6u0^)I2;`v>rx+B1Kaiz@L}Ep7_8pojO85x z;YY!9f5=_()W}_1N057Tjz*%1RDUoV4UT9~y-frplCX%Fb}X%6Xa}){$OJ1+W!I>M zcPWVPu%B3cGJz3h)ia9kj}2Iarj2+G9J~4oW!MBflf3>Xv0A8oQL!Z`{=V(2!TpRE zu4EqFmrVS8tmAn1(ZnqR8VPH_kE`t#vsB(uln?@Vq#k7^@Pw8C-8gR2%@<4LLDR%w zQLZL1S*<9qWo)@k!zj#lia?)*glNY+=Bl|EOz!dNg4p<*R3V&uIcR)pve3U>*{Oe8m6h*;2o!tjFp8^xy`5X zpB)XpPVGpcCH%|H<@Ocz3Av4>37s8Htfs}y@@asK*Ncyv{-olURXQ>SNrz2%fHM(Z zwu*n^i@%Nj3pJx@doz=DGiO&y^k({h02~E-b-`|BET{jCs_x^v-*aS#v-L9+LbvTbTWEY4i%?7ln$R(QtDvRQsq@ zBhrXzDCfuM8_?J074$Am}^09;u>L=-cJj`Bf>>m#BBkt&$vbd(5L=8L&5Bb9G zuN^19V3eaVsO@|Au01#9C=$=s?KtJApjMxiaO4l-6W#857`S6&oESi&!c!`GxfILx zDf+%GA^#ZR_Otg7U*lXoDB=C9%=G?m%R$SI7|+J7#rkdv)HsMM9h&0Lv$ghjs|ZAY`Wk_sCVljxLg^8FdFPXFeTGG3+hounyZbG`lF!iP=TAwq6pRU zRs@YyN%!+v+Fof0l>@&I&JDO|a5C#59>POAbvzU*#zVnDJm%P&AgYwkSkQX#aY#ryM__y@Qrv%QYqUv-;bIjhd11HMgeY7^w&!Epw~z9Q1kQz zk;O0L&x|F%;3c*9uQ#VBwh3be5Ni}IDC(8w>PmNbC2T`rM)nv)0?NH0q*<|Yj6tuG zWeEySF4@NXee}Od%$WZb@1r?SB5Ii9u6tbyVmQY|fTAQ>kc^Ui%K$x+K3==4)scVk zjgmA6oq5HJJ=KA9mvKI3M>Q}KYSz0m@kny$iWu?|OI^xfb@$Oc{$)yR*gu`>@5;~K zq|fQOdR)Gzy5}grpeJ{`x2_WD(qMEL6hc=XI7{8UaEA_PHi)!X>FE{q+kln!JFC|2 z8PYZlM-7LZ2-HCLEC5r7C68}P#HLBo*ue6aHjP?SDfdj@a; z`j_0+=kdT!*&KqMvIfPuv>mV*2rgx4LWj7Lr+u*G~ zOEHsK!#gomq73KQ<2ycWEjVd>hqr?*E#&UNSUEBh?m0rA8*G>PIuKJWqOSuMj6r2( zM?8L<;(R9vL~xM?WuhQ4T%&n@U}I5-PQVR_$e`^G8BQ5iIaCj=(SXJHmMJn{FBQ%n6j&6s<;Rj|b!F0RtbN5wp0@B&b!J*HP&exnEjl zkDr20p+bu3D_jx$Kc5shx*>q@zN6-LZ0=|pY=VC{U(>BMQ>GebnE~Z~b~t3%i|*kG zn@X@OO%)GNsqXq&o%p7pb%F;uz%zDI>+i^Y{f1l(`+h809jF&d8(#Ec6k#kM4ZmO} zgzdEd~lsug!i-5D0>-E`*qpoVvVX}z`?l%#^!YspNI=?6d!u)C;8Nh%i zP8|dtM$O^Qh3v%95P=^j18r)8_4RuroMM%(q2O(q<=TXU%WYw+l$e!Q(;_A@aD0JH~iCg`5*S zev5qQlziI!W_`PO9-kE9Mx4Co@$`B0S_zM1N{x8VS@c9*EmxnEAWF7wnL*GBFQGB) zldUuc3bYVqey31#w@Hjj+@fW7e<#a*G{QG4?X31inz|9cUpp4CdBS|)7>T63S;>HK zHgb*+HMi6VY;#pwu&KZC-Y(*}Oiv%LJ_^>d82O5fW1n*z~T%n2hhS$!=Yqc4} z5iS9hNBS_gSFE025^O{<<{IQGi&@{rj?7&LFi1LSJJ}>n+m@Uxe>9GMzOeH0P@f9F z374r)KO%h~r!UMDhXpG(fRXBg=cL+lj@1IvTNxuU7>NT}Qo3!9p%pO;4E?|uIE92E z5Yu?Vgo78x&mB#AqYUD}+@XM94GtQpiX|cxvEd`qmbE%x<^{1~)d>|RK@BPoIUA3> z^m@8;uNbjs4sGcWP%X9xnOR|k-qDykiu*3qd*7g*``yMX)(h+FOzPCmH|o?*KPrJ5 z=$Bf+s7{kQ$5|xC2xt;`B+j@nB^xaOq4K-HD?RDCty#QdFaqbAq>>Yw(2xKW_$TgE zjlqSNaLu+Q?BF%uE@rABvy-*?&M{?oQZF}-3>EC)_d|nTo%i~{1LLi|h~5HiYP?WR z4P?3AxK*zDRU4>)6&!E^Fk>I=F?NJ1vNv|Lvc1?PXj`f8&hky zQHW-U4uB=oMTOWXcp?L$S!LaHLR6N~*g6}(8Uz2Uo}InQOAWHd4EKGGS0|FgNr0HI6s4m2u$(wC`|RPc3pK{sCqS`&W62i0LP(f zSkMd~Hoyn=pP6>Hm^s797E9SkNLTH$)BYdB*@#iWB(mSkGxf)|guHagDK#u7xfWM9*;C!wM%$=)JHMbeor_Cs<^5u; z#C8j}Sn(np5SYZKrpP&-VoJ)hX{i_x<7nQK`qt``cWPU*qkn>-@_LpQy0g4pOUeAE z0JDuYbGS_Px=(|x+@7*A!Yr)B3|P!x68fxT4oXJ^Dzv!wN3^p-6{}TUIO~xy&Rn91 z+fa~8HBrG;e+E&JlWCz(zE>;;`=681&{b6FPGqS2G53tF=7LIhqK|e&m@ok7DpuWO zvm7HSE!Bi`oRkm}n}mq+hbmCR6hq}@L)Y3os61trl^dSQL5&Px+Ei{nh=GEC0HUH01>!DDe($`6Db4i4J#uYiZegd zzICU4DR!N~!~;4z6T${UGn!7}98B zAE=~-jY!ilIczc9K%DH_TCSB@x~>#i^w)1oHk)x`a2nEX=(`N-|GboJp~^*^Rb^wg zAwH-gZC`NXF!K)A*zfPpJtF<({u!;(C(9Pm2jj;xrDX52^-<;|8kJymw48 z`V&lfx+SgVW5)sOMj(t3B;+L!cR!5$2#yJ;m^5*w9`(Hu(^O(~6ZHlda8juE04RN3 zUG1bswMa9t(M#q@pF{12zRlN*=~4Q&vgM3RG%Gy`56smtxGkX*+#`eu2&!8e9mFX- z*h;M}K9p7uj<2JPFszLQA7TZ;57I$A#7h$1=-}=sS8GJB-Hu$G!|4;{Ggz{X#x0Fk zLZISMtfS?jFZ)Dhh@mo2aVTI}yv%ME<142jbQ}#{tYiiYsP9Kw5EXS>MBYlNA-Ei3 zxAUxs>&4yV2u&;#CWL2Kvx)dm)cIgZgNN^&B7qw43OLC(DE>6#6|$>OBc-N_wC6i; zVu7IFQBV#eKwIP=IXF8ySA|ePE@46YnFiz)iX{3L=D4V!wVMS3<$^Y5zR0M6+1g1@ zBK_a8Yz|>nFGs}y8|b99i$i#Hvn^48`z##C=F7Dd;nTM`g@;(wdUMhWQX?Z8)<31j ziv84wx-s`3ktUp}$d$jVMXofR?aP=HZ*Mt|>Q=L5ypF&r)s$rm;n8c^H1?nXO1Arb7^!XSO1- zpZFvCv`&g;p4o~FqRMQQd1kB3Gh1clrc<-C_>lxx7w{m#)rCAraCH$65?non2MMlz zi^t|uv#0SO&(*~|$a8fG5As|+J?>TfIDtzh-4CtJC-%24Pxqnd9Kd;I;rU9lCVa!C zu1Aja1(QG;m@Z%JAWp?W9RgJG)?U769xPJvvULFlR?7AyJQ!SsPO2OCcSQzO`V2X7 z)fNcV;&_If@cfRo*)oFRC7*?lwDVXf46cxHBgGfKZQEkhV+?Qvl}EyXwK^(<4pp7P z7T098?d(m<^9(mz%oiCWj$?PbL*wKkt4`ltJyVBxaR4o|ufj+uU5*|8NIA7MdHKGj z?U(hZmac#A-+uN6{%*WThnc(uMokM=|6C+USM}NLu=+M|L_J#4!y!>nnU~@ddfgu# zz`0CoYUvfRmnTsrjE81-(`<7*B&9QYvu3moHjZ*{_1(mh9?g$Aw^NtE%)4asv`Tm* z1w?ebW^L*?}Z6-7~*qCvLkpDCUJ6X-^~Ypd7RQ; zdu?DnW&@2a1b_|J4K5SPS~*n^%mBrOt$k-D{@;Q4K`Y8yvJqB}Um|wcqTv=!86a1$ z&y)7#=^8!PJ78RC6U|I2iW$WN=_7@ zs&C(-{aAK3Eu~G0!r#s=*AN$%P$HKUaHk=w?cck(pI5)MTznZZfC{;E!2UauJh%GL z0W{v-hnKcrwNGrE91Y!5^QU1SO`V!wj5JatDyR7Ji+RiAX&4fknqgb3`c6VZ2%E!X z{J=ZB5lA*AI9y6XSJz&F9(M;M;sBtf1#hsNpB9X3023vDrc3wsto+85A@eO zI)6G)+Xvj%gysCvfBT*KbCUcI(eRpgQ)wybD$(Rq_)a3u%RV6J^8K<8yt4b~{Mld! zU?G2r0b_Nr;Fqs{lq`pSwk+28Q`{Z_6G0J*mA`!`TUt>}z^JEh?OpcK>mGdg-1l5` z){lSbG5^o4Ki=_0Z_nl)W^1Fmaeo}&GvkNkak}l>T6yIS`tMK9Jj*{k_0Phn0=J9B z{`7-i`}*zszVWMPZGF-0|Hnm>dq3dCCY{NJmDKRJw_p67haWxVl(Rl|_5+@M@x$JC za~xG&k~KI*;6EjQ_92wudI9#AYd#2T(>Xf+>s)!^CJ@On_Q0J-lPepapSTI0e2mGV z#~GHqGBB|l_AiNJ^7rmD14@d_z^|t`l3X}I$;I7P^`+ncmm}Z1?XN!cw*5=r_{qQh z;P#*X<3EL}nzyQ+<5d?UehFOLz2BdH?zV5gCdGGij%X!1mX>ZwK)M=CM*&Q~2%tG~;Ec=4 z`U~|gyGUre)Vhj{q-R`xkj=B{2;ZYKSHg3y2=E>MO$rwE*CWY3Q)cSM4jfp#3^&De zT!RDSPeek@@IJj#MMV@B)}@ays*8rcJ;82J8H^;3BCl8VuA|98YbbWXlG9_+fC5qo z4yWI?UoFP=(w`*fBACRi3~~mxqi4n@k0b~CGf3Vmev<4q4oIPy>WVv&2D^*b;}RA} z1TL!;DT2KsFX9jlY3gH>>`iRr7AT} zA2_i8%7Y&^{;{bmmSh4&XXDn0x1hj|?JSY0yY?b`kt*`{?==b0vHPL*x>M!5_V90Z zj$T+|R?2eZPok2z2c7j2Cm-+LK9fz3hI(unY}{g`B=hJ)Qq56pWSCiwwF05dw^@(z zm_zmx@v(WHfHUd-$J{fG7cip}6x#U%&sZ`}mU`sNHcrvng+P^DiR{B|>Z4hkmn8=1 zFbo}q-P1<{F|S{JWKNriw7Zty<;gVraWb41=YTAn*|leU)f%bUd=<*Sp7)?yH1z9$S;6jo&! zL!-jJq1(mgANi?)$!?uiphxyR&E_(dl?8r0yg!ltM>W@>NYR}tNozW9$^&0Rgjb%^ zFw-YE#-jNIkbaE!;^c~U*b>EZ;d0Gm&=#MF;@Yc62<+O6UX{m)Im+r-B)=#IPA|rv ziMy$~P4RC;wyE9$_N3Bkt^Izheoy&5ttOwzK=)994`=RCuwKdbD7v_vvs9>AZlPw{ zbJhGzi=$@yF;-GqyZvNK-FiF+tV{(=`v62U8?VL*RAaxVx|4{uThm>rb_t8#&mL=Z zMJbb#o+T%-Syh4fLr%}X+dAGjlDhd(U&Wy67gc0>Y zDPzJa0)=JlG3m5Fmj-sb%-Up6mu*9du05OZ%UGc1&vCjQw~T_i8M3mqkP2v)2mY8j z9=%fsLET&A9$^%pYmc7!Yl!z_1a&Jeiy}&!$YZl7Z7Ff6@$ERIyxnLPP0|Szj=V}9 zXV$Z}7b-SnO#$S-y|T=A^~Zv+4yj$Zt%Q}9ub16071u^Jj!at)FN$*WE)&Yz>?9xq zQ+^dS&SJ2gJ}F@&|6yL?66}K+lXzUqJ*7%@29>c}>0~`AxO+ zYzsOb#Bowx^OcmW^Hmk(v3rm`(35&-5j$uV1f%`EeUgGqmX56opxzPMatuXkQ?ONB z$H82mYaQUQzODg+^gv;A;>Q#mv)Iow~`i4jK>2tBilj}|F^?|F~uxjj6aS-k!-*jOz6_RS>;j`*+mO&u;`)nG#+ICI%#-A4)*+_IGB ziwp^x0H0+WBnArmp-f1tM=6fax;mS7fAWjr9^r6}rF=Sm?hzDQhwC_S#k5EQc?kXX~y-(^l9qO^TPH5M4 zZc#MPb-Amo~VtZdCp3n&B+FT=t{V#rc1ipQ0?ET#}# z4#67-7%MJezJrKtVv8a)Ef}XXdrRk8zq&gbp$5LAn~pTwvc(JeQo;hEveG8{v?WM(_y zl+lh?fVCy@l9XjhQ$^+L6psZ5;4eWwIHRXq*A_{WSUjJd$*3s~oq(aTvP<|dgW%va ziM2DMtWjrq&B>=Xa*J($*2c~r$AC{uaRTt|(JSQ|EUFPRI><+&QM_r_g zMjVVOWUk3aajt=&`w*%XyvFGUa~M42?0|*OaV2iHeM9T8PpgT zYdL>cH-T7&)NWSd9Tk0MznK8)G=xPJQ!k?$|;QQjEj_L@j$~A$<#9MYO ztssVQrNwzpkoEj&fy+yVbej8~EhH|m%c(`g6bzEI<@>9=%JdP}udtbzsjB@y(N>=> zUoa_CfAn#2Exp+CKXq1k8D~Ma`_H;9WCTMRR}jepf@sM1HqNrhM*z1whGG;!Kwlgz z-3b^X^USo)Bo(0hI&Egp7JplE0{2vg*NpeDkU)L=zJ%wv07d23&ms^Z(M-dEHCN2q zog}Jebqku&6_rfdTE~BT0#>0|Z(e&QI>pQR;!LzY?k-%EVumsm*s$6(47?B0Sxy-+ zFs@k44f4`#ltDIhizZ1PmkNqdsuj@c&39^*iG#U;42#B*D#BGZ$r!)m&1Q^OcifQU z^O9FAtM2?JNNL$LO$Q~!O3XwWDN<@k6|Fw{WoWW^X;Ue8f#{0oF*S71(kyM(kRBpX zJk9-^@=^7&frFY7ILJfniN}4rlMUv}gjnOj5omV^DLtETMOeMJx)P^Aru_#VyDTm+ z%uh(UE%^#mbiU)KLQaK6QA(&_^r zNR>1mN{$E_%SlrTXWTuP4QJe|t)*DXg_N&-Qab6L4Gzq^1NFXh8M(4h9pWlQ)P3$` zI1H@P`@==`jV9!bdbXU*Ra*L46>7m6j$f zp;e4F40^LN*HSSCEe<5URm=x#I$E(*#VvJ@(dDR$M3~359j&)T^%m-S(GOXVG^mrK z6&F--Yh5w;6l{v>FsPKH^}shjK4I_-=ffMI8Dxgey>YPCK(pQUg5l_R$^9nJmb@Ti zTDcu+^o*eOk5_(>k>IH?`*4`i24j|i+Vr~*tTAru7TTZ$`JD#}7y50o3ahX55oz|A zG*gMix&zNQMhC_FI!rd4cpPqD<2uU+yQtdd(7vIW!eQA;#L+Dup$=^b-OMc5*_RW2 zB3v!O2~?;2N{Xk!Pa+;N-7 zbZR#6;PYtPmhY1r=dHX$X2UsO4T99~QFhugpJp6$yz=yGtUc-8_(|>^46{IhOf#7m zMVl+5HdsnxIRqx=v|}Fm0k7bc5~7@~)cO0(+~9GvD$Nj_jMoJ5&0Ok4No%t!w-DaQ z1{cC!(S<1&h%KT-5P!}hV$xNM%ZIO;&z2JR66f$7nG=Wmt*g+2h6~8FlXjoPf@zn1Q~!GX z_5~}Q-mDgy+#KXA-Lfxy({Nx?)g8$t{Z`Df5e>tM;to!FN6C)5>5L8kL5C*9_1RC{ zDLi%qk3C-km?d{4!6RW}|3%+;<5tZ9+QTAjE7Sx$Z9`p{*cxJw(?~&ug`Uykgs}R( zro2kqdNhEp+XtO{K0jnY9WBJKvkGO}eu;vr$1)IB=*f22SjAauecZwE#E+!ai!;u| z)~^PeSfSoF(KD8c$i1QD6&b4t8CQ1yEVE| zdtXxSu-2}F@DO_OxG!1LrMqtBHFNHVTZVkpDx0Vij*i0J4{bNpjKrJg;XG$WUC^meamZx8`L&F{@vdHMj z=5vtMuJ)4A@bjc>Go&$-MV@u``n9_+{vA2CC0^;iF}qjuV&J{5t$gT5R>pA{`?4#1 zfg=)#SC`p&Xa_6Km_n15FG-xw)ytTVS1?W+tSNEtB{{!S{ZKtRsP^QYtE>wzFJ_iH7_Tkqc_yvIhs`z0 zAg5OG!kP~2tr&!?@nrHpC|!pz`WLhuSG7j{1daWxfgBaqt|Cs4sV5AwiD60E?iH9T z%~FR-9BewoilAs!95Ul$t9p!(C&&THuBYtEC=g&Ih_tFR#D!YYm)%jS)P(H9BTn`W zysU~;!7Lo4tDyR0Qs}tqdn>=XvXwvx)=uqc9jph+v-2!;^uUlesxh1@EdkM;pFd>SMvZ5AqlLnqeS8c^&vc?w3m!vQ$<K z{tV_5`LU1B)ToO&llgxIpG;@KNX_H_4VaVTMTkm@yY{3sR!13rTp>BCp@y0SzYW+F zT{}cJeOB8&0lhFK2isfi>OY9q);5xeA_%|+ATEo+&dk`iY1-A@sv+N$9HRjm;hn+; zAol8a73Yq!$y&o&!5m{ezc^89+y0irtQMsnR`lUjoR_QEDblGRP)WLDdW)kIMZgt= zdkX(eE@*mExc=xMz%fEUw7sv#2PUYdAWh#l~p4zOcy_(zg1n zL;Gqv69dq7O-KJ#v17Wg2^-V#$oJKc)B6h%qd~}rTzh|G&d5Wnh`I&pa<;Lm$^^{+`Au|#0W6EUrjTD0Cnbf`)*FzC#T5eaB^bD z3!ir7hx@J9Jvv{IL@v`0Dkx6BwfU`-K~}bIdUQ@c5X60cN?zWie;3O3O@|)M86VE% zo}!nh^U8U`oy*p9Eyhp2e2xj>V$SOKoRKT9)_F`FgCcaB z;KNR~2!3Ss5B&-KzPozPfy;H2xZ~fhIB+@se=vf>*zo|CogeFlzWm%)^P8XB%EJ5d zpx<0G!NcSN zoNNq|aoEo^gQRY}@MdTlSCvYX*~;ctX)27ydRAw&8V3@-b|dh0479DQS{XjaX8AjH zAs+hQLsc8Q^zc62BRQkPW>ry+?Zzvk(}i)p_I=I=-98IB)J8(1Vs1O{6c)T-6s8@6l;Kcp`|=Z(ZIm04<-^@q<>0cj@K( z`ZG)ARh+j3CVc6ZYc4v>H2okUC8jR#p8%n(*vIm4U-B|n zZGxYi*p+7o%)eZjeyovJImaMvGq0SYV(UqV_fevE`9Aw`O?d*Z*OasT99{y&%i$Bu zi{dPzk2JH9Qil)pOdl6nLnJRK*FK3;e&u=^nl1}9q^W7_OfB>NNOe%oQedXsU_I&Q zenjab$(0w%eLf}&(GI$Im(ILe`YVCOba*CSQ+3Rj)V^>sUm?fB+>{Rog%V>TP+6_3 zAvvP(a!Qyh6m<&UO*jH%M@>aYR42xBOotrXc%GR)E(QO_(MXl(=)fa861?z_C+FLR zMyL5PM?RJMS{yvc!1w^0)EP)th-ZS^mxmG*N2-hDf992B0^kt&LFf~rEV~ynspP5r zW1P#lm$LwIuykKPz3{LuQ)SK!t5FET6%;dfKT}x6ucUmLu~zI!NTR#Lc~V(|+AvOq zr0-GQIE!!IKhq^d8Wn;JrrbM(K-|yae`JPs>k*QdVyowiLNP^PTS=NMo^9PqGav`V z*S@Qta2iyJOges5sP}wA9rSxYl|qj6k;uAMy@iMdgMMwHWhPATHB1z(ko;WLq5n*Z zzi37IdjDcY4|dbJl^dI@hRNK!g|+@Ty@`W}?ZxH(`YlMsDmkwLc$;>@n4;N3@|Wt` zyU`r*y@EXYEcj3$gx*!CoxzqN0p#zZhdz${e@m-PX&htyUmklapa8=s3}bRUPpWo8u3h8EaRc zr7^sA+-`XfJ+ld@GB(3X@pd>yL8x5(Ku1Xq9PziSs*+ zNGfIEf2uNAY)dM^+rCbmmf#;q$PtG5G3(7oWm;`gt~U@9__w4BLbu{f=W&KK2HDY; zCz;zW^i5YW^EgdelV#XgM&&t3gl}6svGNYjn%weK%Cp$Gyer`eJd{k1M0fs6ASaAW3)04H;enw+E@q{TQ4$&MAXk1G z9H0w405j>DwU2cMk2P{Ha30K4W{p|r1^GpQbf&|V2HduQp?jcIT~Cangc5-_ciG7T zhFZEKTDu;{xNzXY6{it7Q~lZH{?s$7;#vLfG7@aMoP9>sdsd$}%Lu;iGpg}t^*J-4 z<9gcOARQ6^t|1$w)#)tvCsiIWk)J{-DoJwnjH>gj{?sz-FhL!uqKMUU1`E;ZOptWU z>X1VOVRQoju3PSp+dB#s_HF|*j{2%?^%%v3l~_v^vWJ!%tO`FB5`Nv*xF$mNP$%zhl#yw3Zobd%4dqfPmCu%b>wJ2F01Ma-B8F+Zii=g22EG zH9xS+A{Wa!N@8=9s!UU$F>=dzW11%~5zp2PzppEq14EuxQW!EqSwkGXWlXaqoZM*j z#|@+mW@4GF-m|4x)`W*m0g+x!xV2MddS93!F(uI~l59yPPt1z0=VKa6#7Iq~b}@kyPhdOSdI> ztw?ni#<)NatP8bbtVmYe$ro>!YSCu_3xnrdDni;ws`qfxKe%)|+WWJtV%YTIOW3lf z-55(^Gp^%E>UKj7O>`Jg@q7wuz@9-INvP*;FIx8$+0qsE#MIcePu5kKp9|BX`_!VA zx|7I=;>NT}&+8r<%Q~Z;)UCDlp(`|!d8`VtcQ~LV0OHE_0`ypU$`d{6WY{|vg`@)n zeOz0KF%7-~L@{lv>mg^fx#IeCz71P$gKDr9{=(jipNx?WckKL4P&uvZE^fZ^XYw5O z@)QAK7#tLW3?~OhQ3v_Wq_-t=+5=Y7Vu?Oz+;HFvw_BdAGaKt#c z;tS9OtfGD1-jQ=<41c^jnLK!h=X-{wo_aqaCBttF-2Uui63`#;l;lk2WeA(g3JpT2 zR13DFT{7ELJLu#QK=w0O@-rmnnw4)fOh8MjTa}-`~*Kb)wj5qF}QY}=-Dt0bXWXNB)Y&3qQkM}{xd>GY2Gv+&O+ct;-o{+ zaX6J{SFjW~Gc7=euGxHdcH6P-^!v4qpgn0;lHCLXaiq8Dj(FP{Ma)PeXzTcM$piIb zA(G10W$9!|_ok_Ie5D@T2=D_1llerL_%rCku(ZA;ta*-60e;6vAA@ZvHrjO<8WUt3 zN|}(Fh}6;pT;AF5D5h_<{XF40Cq++DG(+=RWik7}?je=V^h}nuCMG)LV`E&g%zs!O zP*C+Y44}?*n^zM`Bh#wZ?IJFaE=7QjRPmNA>??@$MYUAuiq=>|lGui&OpAkUNSGuo zO8aQI7BCES4HzbSEie8K9_1Xo*@{uZRv~6zd^pM^lScsNv`RN&Nd2?XA$Y3d8IDKL zLquUFf#J$910K_XBN~;8IHicx5JDJE5GY=n=3FXx9>yRPnnSIdBs^E`Q=<`D=ratl zglX0j46lI>_JfN`z#^fP+2}*IO7;ZbTiZM%2zyVuT z4!9$ZlPGGlPbIjcl7=63O- zT~s((YjkyiKZIhsM}86j~alA!p=9l=BsF&#qg- z2?je-pl$CYF2BOs_yUaO7?NiqlbU5*+C3i@Ly>tbVV#-Rlpk}W)O*?SKCY{OBik@) z5PYw3AJ;KsE8wFFCxoZf;eQ-8985fZi)*=fJdKOEc>H%R)8cU)NL;H{pxpr!hi=ra zCQBIEqq0SRoZ&{rVmA7Rgd(f|$@yK9K+%lz`D$f+k;7K}IYXXEkQJS6j4^rM{KW2d z5dKGewpH)!B%X0U1U5khg~YQ_2URpYrc)`S0F!t0r-V@x7G-EvrlcrMl@q)A6N)0S zNOMnIVY(b_mf(Fv!|x%<19?15fgDkzXWTSRj6q7Lw^$A_(sZxkBe}V!?5;+eIesP&sIWRypb!ZrMPY$idpBFet&S0Pi`NqnHbv zNC?t1`U_H8epVH9!&9QRhDoZ!3!0II7;2#WJpZ)ap1&5f@ISo%Y5imf6LZ#K7HYa z`oC=Qgp7@mRsJi6f17{MNe>*We`>AG`y1DE*Uvs+e5RAZ+vuWGtyALQ~PnZi7^A$F{IN;wOG=`h?~$qrMA2W7OM@%IWZ<97*dYcX)8 z>SKUg7|YoEnc&pM|3fni0)M~Ebi8HR98cr{*?m zCwq@$o6P~TCK(rJXT()maIj3-$*45Rj>R3QNln~E8z4tyHgfs`mW2*1twDzv0(AYJ zF;7g^B{5mBLmnDfR)reZi!4F-Ov8KocI<(V7*tGUgK}ML>gz6~r~-lt(Po*TR<0~% z!Cgm*WU& z&IGuW8%1(s<&h!CrrM9hsZN+CkKO3MzEi3ih(lVl54az zV&gHp8rZm@G(JFVyy}M7!CgN=g~e}~is zTZ6TBl40xAd{{q_hFq)_o1L-)29B=r={(C5RsteWJf`zvzguh)ql6vc7F14$28?je z*eaY0U_Ki`jYYT##|u%aCxm%bFQ2YJcf|{|kFfMZ9r?v%&hhDkUcQjU%gOpagA?Km zBuoTrImWeiX3w)7dK$nmhei*LncoGPQkdPKJin$aFA3Y^+-xgeQq~s-o(>%##5nmj z;u`XM%GlE5lACZ#S%B?&na^Ezzoga%^V#qA;x-x7!G9d1r*O5G^<>}$b@cLsQma3k zfD=r6JGUIul&=4H3O_&c^yC5_Qo18@0Mgys>6F{2hwe+yopQ}NVlpf2Ob(%5O5{+_ z%JCw#VS>We1hSsFP|{4W(eyHP0s{e z@q4}!wmqfZg-gD?0%YYEc};RfkW|KSi`Pj4d#vwQU*QGCbrP<{Qq?iXAQN#+N+91W`#X6TnuIR=zoU_Pp^ zlf@sIgN>=q8}KyMCsgyzVpH+LUr-;#3R7GgFdG`2QWm)>R%Tlxo*#%BMz9rUD%Z^j3F)5~*>R~Li9o2k(xESt;{i6F~nHXAr zZ`P0>$UfMcuHOGV@u8}Eus8l7XAo;c7eE)K&GntO5_OK_L?fY3U)w{7T+|S5FTv#y zA?4RsO;)c?4NlUHAL1=PP?NP{3>^ZMN2D5CCyH}C+PE3h~@EYbS}XKAq~#{vx56|ab!-l|cLv-O7!mdJQ5 zF4Kp3?Gqi8Q4MwGVDh5Rrcq=Mr-Z)kHb7T1PVxF11+XX`#i7|qQ(TSryVdI9?S-|N zgLP}H6$)$%4SxcqlWA!sw#6cGC7Aoey%>A8PpBRq--jk15t{facngxKiATgD5i&Hf zJv5=azPHEsYGP`={$;rZHHG_d%Gg9NBkEZ481}+5a1_Kn@$u+E5sQAwS`@V$Y|-g2 z#YX8gZrNFAjbd?Bx3A>vk*y0U6;#P4bici8NM-fWperc02Ns~4p}O3FQ4{Mgd&kw6 zP6wz}^~=?SAMn)+Zg3Q= zw<|oZ!53sf?yy{(Q1ZRcJzW>U1jR(7tB6&~V>XYm>XG$OUag@#GWNilL>9&gp1~SE zDwfBXxluJ9wX()kLk&TRH8>Ca$r+Rzq1&j&l ze-q{lYiEo4<4Y|S8U1F~bY(uYpg;Bqbfr5UAMIwY*d-KOb#XvxJ4|D(HQJQWoE}TY z+O19|ZJV*qiwL9WCmQTD{mK@qu!PZ{79gSRhi6r%`LN5tQ2;W3s`LV4spq**0TziS zBD$X3B~7I1Dxj@LTU+hwSHS!UqsT{ldnR5Zw;&DwrJP1?4&wBoL7W~dMFKS*9@&~0 z^gsqb#=E4uCsdDV4u0wZp|&es(lw=YvC}QedK#4VYIN2M0u;^&0}wMZE8+}q>p=r# zj_n!rA}{#WmGyqr>zO<;%$wRA#zDO~*21bsKKW~^j^KsNKty>Pf6ePZK>fy2XZjrR z`B2cA<(VssO+^{t!&5f{DSsrXhlx>L9AG1em_2V|bF-&gyr4EI>aK1XDLA#UF{M64 znN&C1Z6f6gH7$$<DAdNdzDkn$@GkA|i@{y4aKqW3ERSLk!rh0}`bAy48%Xynrx8U#NWG$m1#FXI2>d$_hftoPDH~o~2hdAm#5ABPk7l%aP ze;!&tanSk((YZ+YkSncnKQ>H~k9!-eHQ4%`4z`xB0HQbyYaCSIFSh_s$;9DrTlCgL z^Pe($lh4Ik)Nj>;&X*n1i|nKaJLwE)%j0dvNy477gu@4p76qowbJ`qKJ_At-Zlv8Uu2`ljFFd0+YhU6i9ng)vV6r;tVR%0SS zR-Y*?x4RUbnxp#yz3jBL(z32h^42PJIv zgEc_ACI2ciSRUIzjzVT$7Lq{`ZSkWEZ6~Y0#MsdvNcnQ}f&4}2WCNr=gup2ZVm-Fc zg|W#42Aj|+I2c@BeJ<2qA35~2B9*3QL1=KfctaY@9>&9ho4HsYb_RpZWovGFSta9W zWZ=w}vV9((!8?NzXOwiNDGH^}M<~5FKCLzs#&hcu*H19PxGY`f_6= zQTBbgSulbH$WxBh?I=7E%3|1Va*vhrovXNk7oru zzZ%C=!}F`5fwdY>gy+{nZ-Qr7vagMln`(@{*Eddd17@4>E%04oT<{PEc-$KMXQnj# zhm+jW8z-P5QYliXh3{nLQ@N`4!algMMdE7JequM3%3bXgB(_F-9Y69!3<`BXnr@QY)qR}Hpi@) z7QEad#-t?xH_J&%p}VZKb0M=k!hCBV&mCbBGtSB_s9khM&>Fjb?6R0sjhcTQAw?>^ zN!IAEL&fR;m$`S3x9cqHeaB_q)|zW2W2H&E(xmN}qk*oFwVKdf)7VzY$R@X@7v!KD z&*6`AJbupZPO8U*?8?VaA%O-cf>IR`6{RBD!fpf=wJKtYpd1k`ips_cr63o%Sfpa1 zg`V&4dER%-G1pqqfc;~C+N?3>m}9(`=Y8()^FEJ2Y*rf&Js2OF_JL?=LQSYpG0rEb^-X{Kjr~SR0NI&FPjgNhv3xp)KO(s&r5FEOV_%~(X z0O-xlXPQO>!H8K!R>jvF(ZJ*o6D{2Yr-Hv*@WUFelKWB6eefg(}X#{nfpJ*CUC@-=hDPlZ{nZYO+?ofQu_e$C|sUNc*#JzGGbkW zY})%|Y;Rq;5#3|PPT3UYdPNg{vS~BWPGWk1g^|(bEqqv8?>sVEXZ{!P5H7S1T`j|J z!suqNuhuo*mruntyR!IynDM7V(?(w?t$MRON49pQji8qL{pt83LM@7tPlvaSi5R?^ zem)Z)zn@@rxc8j#gU__PBhLmu3BT1{qZp&FqJ80#n79i{0QG;4t&UCPe-2F=Hy^MU zz>_L+;V*nPzA(k0-KPHR@D8Z)qdf-u~C^ZkYAB+(* z*7&S>uC*J%-i`Fr$PVM z5fEPvZB1#xy{)Jh(H5o`3AtoZD1~|ULqXYV)c1e)7I6}?3hxy&{P)n_plOd4cqDfG zegi2)mDE3GTK*#|9&c+)W6kC(p#_71xdOft-X!`u4m>Ie8hA75uf{i>0ihFpHN3g( zzzBJtLqm-C(KzCkPv+6^UU%GMB*Dl0aiCya4t4FZ@US1mbq1&Pk?~^gVC^q4&;^8< zJjPC?^!zn%3TG$CE#2?llzXoG<&guB-88k$@6oLzI zzZ1Q-Q=Ydodkz=Q>^_$ZCmo;1WnNCmPPuVs_Jc8`_0x93woZmG{$C}lr4}=0iL_&n zz4~qt0ngoSGVB5_5P~kdNEQSF7glIlEO9!Ci{ThC{}acvILs&qAz@37Jq;?_&IOdX zkbN%Y{9Q@lsHGQkMq(Aq7>Iu7|J&1R@w-X`DY#rA%Jsmbn9Z6l-oi-$oG&yPe(mVj_@d|542eyj1k|&WSOo8lQ7_^^3`YLd zY-Qe~Rg>UL%SLYN2o@Ld_$P>6kE{s@lEpsXr#G}x(4z&MXvy8|@{_Llp2D0!VX-qU zcC@-h{75F$1>>e$GqMfnWVV)xg_(gFV{qT@J4STid9%K407f9i4D=t#S4)Q13jZe% zIvEjU?(pFPeDqD}g}EsFpWx~cur2lE31Anu)`W>P!G2qZEHzIz-3+g?goAN!m-a}sD_aK-olcqD>{S1HKyq!Yn5?IFDf}!a?Oq&1S4L zoCfiZ=QRAbp54wbqj(^LTGe6u~l!d<0faB@f;4v0_b$@inMiaPf1>YeuMRu zWxL~lA~Q&|KJ!}73=O!Btm))gnsls~v*pOazcdk4*Ph#Vw2QXw*%y78OrVKsA~|9o^4zlK`YM6;oL4evQ8U9`DVvo&Vm^SPDI`}onBF?Q^5&- z{13@~qE25J+?pBtLJ>#NO$aJ6bG^A2l?)3nxWwxdMS+;j8vk4j_(?TNp%N(g5ycDy ziD>pkbXSpJ!CnF{2HK)2j;oyMEn!VBVZo6(Y0#FSMn>0@r=tV4iCg29ldqT$M{2n5 zrs&llHXIoxM!OTm*KvwDiEt8?Nw^WN@d>~^T`mvS(J&Go?Pf@!o?Z^*$Jt~FCYqvW zwPQ0xYVR1I+cK217Ly8xhY~$25SFn6@sxP&3T?hlMtQEo43?{h!#MyuQv?rx<%31f zr|=8NOC}RF(DwqtFcyGQlenIjscoU(2$`G3sJ3Ql5PY{NS^ub3v4^?Mp^4(IslB7M zggMf{+Oj7lh>m%^JFH&>B&X}OoDtZs(#Fg^u810xzl4S1m;x>=x>mk}H3#Lg=|*fZ zU~pbYKh0=dG{!#H@JM~j!CAneCbY)YTyeab-pehvcGM=tHA<4ekYQ%}I_@$kJYtv; zhj9_iaz21R9DXQ%eJaGS0@UfyKIe8OLRndj*?Q&>;Na*dPN?G*E6qr~BRK`84F?hq^E~)c_z+1(DE!1_FQmYaGiPptA$a)&#xt3rOWB9|s)s@I12dDp_;pQpHDlj2SL%3_8TLXSaKZ`^Y`4%L@HVrao{IJipK^@>pPjo zbK*7=4jH8;g~52WFeAO~d?NtH1F%3VFdg-byQJLmTlVNPi62v+B&p*!9$he=695{I ztEa_Xy?Ee-o)P&DF@XTawHKI$j{V z+J;#4;srF+P#o;o37o(QRvlw7=>!+doH6~llsSpJe_&RR-xKC9(}v)wv(mU5dFr^hbeVWQe~1=V%H08~J{^k(v|SQT%Pr%AW~M;7a1tcOUb z!r7(?0tJPPe#Aj+m<{h3ALP%RlH}NCh#j}`c|KASnvL~SO5zD4n>NCMnkXp4c^ad| zWrEUPGkkt#^L9Kn(}RFS0g%x6pudz-8+r?_ei|kdhK5rxG3lI>M@(hJE_t9%qmFPG zrg27S!(Xk&br=MXlh-qO@=Tpz_FDoLb3By@2OLlGIN@rN#|g*NH}yD0i($9Y72z>@ zo|O#R1EU9JVF`o%ofp;isl)MT*6&&zY0zMnzepg3TK32c;0b=rERud-=S6!^4^F=f z{X-%*6BTy%@aNx#X`iFMWuo#hNj*?TNKT0yfk~llzTjxZwi1Dj=q1zzfa>eqLSyLH zp5XEN9af1D^O6o}JCX8GpRt=|CRZTG`O@p`n&0e4^f~LN28e)RwDsMO#`!VH@SZF2gx#QNfKaSr&r#)A4LrxH(dC@~iceETD?KsiRFu)WBNkO^$5d7V%; z`H3u>i8SvXfCYXGbaN#gzP|sfNF)ueR2DPv!8|M}p4PVk2mU!6a)$$bbJUAtQ=HHz zRp7o&WYks1q{x?AFAJMkWE-&{ELbUhEYHjvz&Kc-m9-!6EyN$n?hV`xvr@DZWAy)+ z5J9S}%Da69yILVWn=`JyhavJ$qeqAt2*wl7!m96|?Fm8#Jl(Pnz$4&^@5{xI$|=D_{1!PPh7r5eBuq^lQ{()p8_tEPQw}#v>F7Ik7tZ7!YdvM zctuF{w~1G);7>DY;-w~Vi2hdKkbwEE;ZS#V9P-Jm#3Al~BOHnd-wYV~@-^N+n=~|H zhOaXKD!3o5KllhI-En{hl7}c#NGHGfc$FC5!3kg_Ii$o&>yVSYAw+9}!x-f#o4U-v z1#EG^K5l|s7fCDO-0lr^ z$FP@@Bs_S*%_CZ7Knxl3CoesE3m60qu-_`aqbVves8WS!ykW+gzxt!SK^5SD(?n3o zL}WUZ5He#3D#R5)T>KM9!J^`HFICi;!EktIwlV=@%MS%ZNr1SxD`Vu+d1C)*<9pV- z6HaD!2R@LG7@;d0cuX^zbM*qvpU7#`Z-KW-aF|qa25}Zm;ECt+;-gB`Q_4J!UMq5y zMCa4{xa++HzumW-lVHv}2Vrne-HAglic3m%r3i+By&=GO4AEqpyZ zi17)QSBWBCa;gbtUC zUMfJM}sc*;OE*Ro4Kvmi1V^TW0_zWm(LE_`an;bzwGg2WG9C3FRtc&JdP49FuybB2UxP8so<2a)o` z-@h5dg`c$Pfi7!gVR$0x9pxRT6Q9Ga|Hu7y+s^a2n92b^j9CrwB3u=!cw3aRz2~l+6y^XA@^G?Fv#XGYI-2ifov|Q?n zG~k{zGhPI;v;i~cwt%lxnZo=FZWcS$R8!)(lCpHr)>6)mW6v#5Lp@AG)l@``$ zI^83h4=Z90Rej);S{nh{93G4Tb7zRpZ>_5kz*p2#YPJvncS6;|6#8-W2>2od!1xjZ z0E~tabi}z_c#o2dwnd(t8wD4;ZwfL%YA_HN^-;*Zd)@3z{fS2tWS-R~cX+Lgnne;rVrI(Te$mQ7i;vy@#%zWwjaf-0L07Q4YPS1aWWn;bS6gKxsJ6TFk+0ap1J_$Y@^FK!wfqj zim}^ZDBbzs$XW-36xC=rz=U1QvS&IOW+!_gz5*OwGA;My4VnY7<0c)*H zgll{jjVWPI#4=^vk4xawV|@jEJipT7_~^jbl$>o>i9pK;bih>iB!&{>a`i*>An~X+ z?Y60ACv@jNP}|W{-yR9*#mb`;OC^xZh4xG{FcF#759pSChRKR)mnhsrBbi>kAVu#5 z0HE%Jla@2o=tu0)_LIR^NY!mshI_bPKr5)<%P?MJXu~kf+Aj0!crrgE?>^I=A&;~^ zfssA-jXGu&=Jb?XPv|g4sVxf;Q1d*)p+#C^tfrB$@~ie~)=p<;S`f>K;}2jhvqNog zg2Nz4>Wkxq1FUEr+>l2gER4lP${VX;i+?w($x@3pQW2EB2D8FD*pL*=D8bLBmDITT zk5%_6gN^~Pax_MkgJB8>0NU~u)F`XrRT_Jv>7vaT1Ub7U!Bob3fQ74v29?|nlRg(-yVFx+R_v<`d${ z+%6p#PY{-bz)FlZy-hBOHbxVRWZ3l$Fq-A))R&YUTc>(END26I#)V#<))+-H#2$V$ zw=friJ%ujzd7!&|*U7YG6*`Ut%OjLLNQ`cA0>ZW>iNJs5W@J!h2b~GFg@cYcr>>B@ z>qryHU3^3M~xA_A~T}bvYCT|t^wG{G88`0 z-i+nM6+YkrNsc-I4=-C#pfh8$GL{8P6gWYxW5%*!775TLhG@13zCyBU#%XHOQc7qH zHtlx}1_VM2yY#4`xy=gd1JlG6AgSxnFNJq}{5F*jn!5|S-64cYU?+X!Xz1PMW)tyj z2InSRfnpUfR^vE$+y%}6QY=1fE5Qy|;J{pg_|++!B{z;gZ+3^}y_{F$(m!`Q8H31r z1|I_V*H=~!+~|9K^8@=>!cT26Ry?HmFF`eUHCJIaEXFtS=77XJu-u#Dh`G$01A~({ zhs%uosD5E>0%EcPXXnmgf5wuquIkQ-h^cWQPEFm?JrSf)3mQs5%x~<)$#US?AZF5d zagb#0#St;ei(?vjCdBj*D5+RXOegWeG&SiKV%l9Bg5?+RM_Ztf58CwO4BbSTHsZ9(+tVlF3X(Xx0ks@r?^%4|*WbVIlBe1ni+l zvv2vXA9TLa(2Bw2^;#)++F!%CXXyhMMye(zI)j9R7=cOnnNQLUfSx@qjX;YCp$6QN z_;OF-GNva{b-Wro09e)4m>#3EusI=>4LSG$8m31_f$8NiJ*}ILauz|TV zJpc@{x49jAc>$@k5L)N_8*;lYNY!nS3aLO};&$l1k=v1oT}p)(rR&^|X5n^5!gBWU zRTI-}TS#ShjqqE3K|?B=4$1-nvNF1ei6nr=kqU3Z3Z$|P3JZb)!JI3V#9j!g0!on` z8kFLkaoC$Mr4(D&R-02}3^Jk=T-;HLXX4%jmNhL$l(HYjC@ua+K1BrDGhQ zOpgmFg}4tWHR(|@%TvNe9_Z*#!VYRYN_<|9P^^fkSSpY~kwq8WZS%zyH&e#VxD^)5 zY!Q5^^@f76g)tA`pJqAvhwY#_N-6m&(AcG(rgeFYg9~z)XL5YNXON+$I4}dAtPmt< z46K>`oLhvaS{TTx6aP6=_iwJJj!LUud-QbK-P3v5Dfx961;&AGhlg!<7!9T2@Or@f zsFZk(5{&bhx*>149Q8~JW8tl7@p5zRkcG42j)w*D2z%be+lcu6WX`VP#Tjl_0>Qly zZ2hg&sh-TGOrUNPOm-HI<`|+OHJ*8j{b}2uWOxFHJp8zp%V~?}Vhf#3=DV|TL>E(5 zK)Z0u;&t;ZY;-F?nr8T~PstTNDcwSPSSyLNzdQpCz?TLOA_& z6VKHv-lVSOthUH_x{k+Qh*q;?=pvngjO~0W8B|ji*(-G!{X~;7S7Gp#KWTf_@cQ+T z9dbdZBN)eKE>LUPtfeWt$?&)PX>a*Dx2otMN|F&iTa+v`T`me5lzc&D4C z2M~qQJM}9#95us{j}YZX_(ynJ3p)WFThkDBHcgl^MZ7{N@v`$#8W_%AcH06Xgcviu z^!I6uFAIlDNP-a(FLN;Zg)yv{{Us=rg;9L1BfyMvdp`)#_q6tqS`w+MmDZk+KYoDU zAW)zcli*yC9?*lNiNXw771TA~;wKzYYeej!&d~Jz5EG$`tCaRRh-hOW(#ws9D8bz* z&9&$txlDiVSOAD92$KT|a(H_RHpnjJTZj%RvwMf{NomSZZ_MTgic0a^{33x7FA7Of zC3q5!Dw%MinQ`+lj}m(lf^7FJaOxzBv^KH7C(|W$g#iAi^4O)r^IO=+i@m$ao($iR z@KBUZ->evv=HQd*Li zVK4C~QRJXgX%Tkmo~o8Nua%ieue^9Lk5CG6c@fvJbhoG1bIz&iT$NrQDI$oB@sVJt z5C&ZTFqsLZb%{VEiY(N*xUZ2+79-E5MUL8_@$g`4EdCMFcol_)_ytV))^=Cv8$=UY zqmY^o6~XD1+diJ2=-;X0r}kxA$={xqDgFyN zH|m9(4ojnR9%&2j5$^TI;unl@#dS3BP)642?3+&0xK^B&v9mfE&VXdamoe9iH%<-z zBuCNB2(<%g##Ga)EHNW9Prnc~3xII0i^9~TH~x-n@VyPH^Y+x8V&}ZO7Xj(V0eZz(ayCQ* zZV)HgH4TnNd(aAD%i1uc$zh||3F7FZ+R#1>qXreEgllX^ik~-ydvK@x;=Cj`dTAuO zz*DgDNXPkJHVlu!9gIIvMICd7fMCPJC$CtXj%Af(FQiIbTvIQ+^OkJ2MQoKxmO=yP z=b}Z#Q98r2aUtckZl1+@DV%R&jkvu(+n7WylxUG1l-biaJTBJj72j=iLCD0DygMw9ZG(xhCuoT2s8e|+PCu^1n0q|LpPa8#r!-fsM zt$9MNbVi1Op_=Ex%dOSsCc^N_WD7U@-_1U}5p_5`k+FMtw+<2nmC_>rqhuwfe;s7$O)~CHPM&9t=DT%a1OogK%P@X#l{0IJs32wP}uD^7961{fl=h zh2@XbN(mZ-zk@TLGPpO3rwq^}{v)R)u|pxTaCCH8(cpC~FhjNAWI|>WQh8N& zD;ze-rQw1n$@NmJSa(_Qm||pugh!o{>fqX~ZSUp7mk(E#7i$Ts)#+BoEz-mV6_@5j zoE?Ream&q65b7*wIwaJ6)z)UJEv3VuwB}XiC(}KliReCv*dGU_~!$cA`YSQuL z8eAuDZp361Zmi4O(~5#&D_T-3FcLhB#z?Z=Q7P5Y83yp1yrxg}V+gN|nzi1_#As-P z@Ncw8M?jYqYUkndp!T?5ApE=0`Y~H_H`8)#auoFzt zLqa1lAu%19v8Pgru;)d6Tkn#W!)D5iLVjHy;=_RBMBP>@eoT++IUQVr8U{ZrnT?hC95lQcVR0`SVToNK9VmA5nG2J)Av!qJ zdUihgNk0mMUs3KwNTuX5#GHx>lqs7S5N}K||FYdVEC?6@M;$#mt>e>4lBXW&G-KNp z*fUE>=CDjjP_z%=lH`z6iN~;dQl%<}(o*n>=X&G@1xb+K6iI?BLV?^@0i}fW2>c?; zLZ%bXC^=3gxqR0agn0O zMT(yGYO!p%$Q#N<-cT-^VOv~e;Bb+^;397*7agJIq9fE?R6&r7DhP5>1wk&VAjm}( z1P7`hxJ}=lHCnIBb0{6i<+&6R#1~ffv#kOxlq?vrK5}V^zG^BQhle2d8sR@0!O;uk&Y@|-;|Cn*7dG*v_;pu z)6rA(-rLgAc3tmDM>}-?Ogeh1uJ2Aqm+1Q5bhM!BU!wcutPwz$ zfCzk8=YHNQugN9N2|+_pak40nVTWf*5tagybJIxd1OD zHPdqc6FX2g)bc`HsQaS&y^MVjV=TYpOu0@D8aB4XOlI5;BG=!Q$znO9P)Tk30!hmV z3CG&SGySX5r*Y|Bl`e4MX6cvBBDB|}5CD7o;%fHe7LIE!5%O1GOty9s8`h7oXSWex zPieL~OFXkjahUf#|BCG4oVr^xl4ko4z^j?(2dQgH{D8*bEbYsu-%#682USzUP0a_ejuk)0Jl4zFDSEmv3RsG z6yTn4DAleqsOGz!j}P7JuPE^yHszTG#?PX%|3+ddrlM-*>=WU1pj$;BEa6@!7{QDn zZ$ws3M$TO!;yG^W(BAxrVrv|+O?WbPcMgw~Q`c5hlrPu7w<->?9Drx!I)c7wR4_(s zGDqN)#Xe6)4Ogp31qmI&+`tMIA^>}HslJiPNh}q0%>7VH?aA9FKYcx`1vaR{9(IUF2)@V)f%5JsoRJC|TzNEXDwQ_((PZ~>5mm2kveRq(_+0g-|p)e(*QT5lclxxa$bi)RsaFi0O zEHOe6uJ9~u2|mq8z1&V(OGHvdE(=3AY3Lo|Z@ncTA5Mg`>Yw~2*1q_$sDQyV0&Tc< zm6jJ2AMZug3d&%GeM>cqrUb1@YrNX?X7FiY1ZB#38wf{3;C2VjJLSc5_*Pn8bY)A| zIeHlLyz5x@^#a5ygq2)_#N<*A!FN3)y5rp)qbabStmpfyp>1^WJQ!H-pkCWhc+XsC zfd!w}_y+`YnOl1Ia=0}wtHnLZv)Le&e@csKCuM=Bq9inQX`D$#K-V?&%cU$fjUY_A z9PWc4MZ#$MEeDDo3^-?t&#Uh&!A~H{uRE&*gdB)938fDnzplD;bZL1=ovVoJnkr zjKI+A0A#S-ja%?teH)q6&BHJGOUR;86?PLmGgU8<%t<0w<6N3$W*en0xVHj};CH z0%j!4v}qTTJS?}+klJuv#$W0C3%XHAuE^Kv9Iiymmm_#bu*q|1}6{c%d(ZoV33&oWTYEb|-KKYRc zqlh@XM8U%1z+OhxU}^yKSRg6i>>H*f1Da=Cb{VQUVmc^QfVlC6>Rgd)3jujursySq zM|m4fos=GFxOg(Pa;nYN1{l47C4`>qm?#kOANF5d!oaB(P>-E!NkG6(=PT-!U~KQR zyRgnBqTT(o@bnxJ%MPLPRq3TdWoaT^DUGO_M(QCjsP?j==pyAgxUOF!Dfd+hp4Fkc zXg~>}`Xryi@r!(TmZZaEgI;blFHYyQ5=xAc@>hrjSP-qkFI9UK>E=<56NZDk;|x{- z>`TcCWJl<@8+;1nuJSrR#2``)orPRVuE5ogu>vV5Np@^s)TQ13D!&1ALi@0S4jK_+ z-V2Qy49X#CwWk~eq24Gtvo-i}Td}@Ll#ohgBzfS*1$>IOZF1hammCcM31vp95YYmN z&vhvBGVH(nuU;h1d-b?j>hP*mfs|aNp(+NdzGR%8g?hEZ_wgX;V*xJ4`WqU@ z(ICN0dtN6&N}!$`sEcCX^&PLrn!1_+!rYWKE5}q|I}mNXYjSeEVXYGRk0@tq{AJki zK$2eH0D^Z>l!sR)1&SlxUR{5>&(71;+_cEch2o3p75RXe4}3@3F3CucfAkpj%yySc z<)x=E?$JqZ25ZRojP?rJXOdN$6fwHA2WGKpw50A)Gm`zo(V9KUXtA8Cm;<)7^eg`H(kGqdl-RoG7q}=u_x#(#DDe!}Jg$|17SuX~6BLgkBof<6~yFX7g zWukKJm18r;yRG=;X^7}t=WG*1WGF+^+W>3pU9SeqyTvc*O;u@zCz4rQ*k&AUu~ z=2F$#a}2{Col@`l&QlnWgMkcxTEKl|UJS9`_jz zS%F?$Irdj#cEI>@w=j{iQgNjDa#^h53nQ4Brp#cjN@FCL|9&pY2^Ps2c3t-fl|W72 zx{SM|Jbui)&1BZ#U1kcRU#W;N5PT~LrJKR5IBzNW{yIA-aX}}jtS80#A?XEqO92MX z5V)VF1po2kw50PdevvP}W~Q;qHKIKXf6VLAV!#)_FdfU$Hj1qr9sn161{D@!j{L|b z3PyL)MX4Er^(|_|FaQzI0u<+jS3-Ul#Pyk;6qlhZE~0L7QFE?Qn#!=A#Y$FKAGln= zlk!o9Q~=CqOj34IVHQ8Zi=@~{^?Efm!}S?|NuDsKdY5bn+i?O=1ZCy{x{F^Fypzz!=6Qs4x)T9ce3RHi2@M zbQhPWO+YH2_F(wm$dHM_qVs}TwygQKJttnuOyJlkZfGf%;&DIhrI340 zH;q#4i^YvYHx|eu5JOJLYqlrE`Wj_p3T0t!aijzymo`_}Qov0_D!Yn}Fg6(g7|NDKS}gFui%*{H9JRmu z^#~FE6?Mq;N`7y(rtDstKJ{9|UQPOsAAkIXN5!((Qo~;<)j-tBe7C3P5?LRVUa7Q~ zRUnX2&~`kWVlT#0U!wyB3HXdxk9-IWhKIl_Y=i~ja%pxV6JXluXb7cl!k0yr3gsqZvpaz56G&Q zr?2H*r`a7W!-eILnt36s@pSEF#@EXA2NE%jPW|60^e~7u$IWgx20HJ#!Ov6 zdfD@}WcKOSFD(8ctuOMCkT*6=d@V&9WEEX&z~4yv`07J@*Z%DxM}kq=tpWkC_4I5>~ao7?lXhlunA>b&T}4F z;1OKdLVr7gmCLmuYinMw=h{oGIN31`WqBn?JYCyU#8>f#bV!4~ilyv&(0Ep5JO_2@ zYe=Q1U@_5`rZl^R``~UAa`DkgI+@d+7MnFPdpDQ%Z9U)qmahZKHF2Swg^nUe1#D!l zgq$uPmMdZ8U79Pw9-+&*?J4!FS;l}#X5z&6D}R5_e8Gm^psrRM^4@B*lwXPc1KQ!X z20UD0y7uz)o6UDG7yrer7Gk*`h9{FyJanY}4fN3&E^uhY7$zEmR0(&T@Z{Z7PHVvsEYETh^`H8jk2z!KXWdE+WHi0FR3X^zM=RX zP5ddXCL2EqXmfaUPRnkb!`ENsTOy&sRU|iL)zA3`im{?X&glr?r+Qb=i1;)yN5#i_ zv826M^I>J2w`~-^B{~hTj3X0l<82-u#*#PB8RY19v0-MHST_{>QWxbqst^t8OMFg5 z;{^O;=CP1{R=k(k;`l&l*jRX`9do9|#OjxvG#ga>3|6>+mSen)&)dZtbbrj3gxbcJ z^k(EsHR>$jV*2UCV>U__jG<>-Q%xckq;& zN`rb^tE)(6t2N>UC#LJg(8&8F3Hk%cuuzWob}L z-r}^DJI>#zD856YZ*e>J#uA;S8`PJs@`iy5JyRUW?0u3ySfz^4@pkW+2VPM8Oj>V` zP3Y&bl-5x3?Gz^}`EeU8-7y}uLZLP49o~S6`baZRx5t>7ko4*Cfr$QvsT$IPL@L@I z&e;&-VkWJ|!7MkzN)8hxvBDin-8Uquc9(-amX+&IkDk5OdJx?lF%{&k&A?} zFYsjnR74^I2SMtx2jaO6Bzpp8x7&~%jgfyc7D_7(sC#RaxV_25`1iH z^2iAM)2PgR=u{dax)JxpI!%*qf@mngDRt=eS^a@`q=+P3V&CaQETUE`6RO-+UV3Y_ zT^h3SXoG{e)L6;6GJu0q3B}!V&R^M@Y6C}8(tW$)bRD00e5dpesv{Ed!J@7}DYT%)`K6_gM30$3DVCPPbus34Y%; z8fFb%%Q@_m!o}BG74TZLT@AtOA$Yy1+JPrUXeM&wC&?FnGo^u#n_kjvCE(8F;!BrUWfEoAmgu7M?{Z_T2%Bxg_~_#|Oe(#qySt zXUqRV7=SSxjMBEq@O2IBn_pZsJ|i@m;dXw-bo~r(7C*Z`K32pS@1hSohTol0y+j$= zsB^dfC1badpTVaccN>s}cnU&OkpMF!1or6?=AZ4&EoX{g6S1FRc=v{yj4D~of7Zjj zp$FRui6wh^Yb@{I72nbpx&|f<{$1_Y;`IL{K8d@Cvg`w*A$<7OxIGmWF-cO1Hukc@ z;NBfy-a;38`Q5F#^OW@tQNy+rJkfID7+5W65Ny~LntP8oCn-ece#J$+r)e+1kTNc4 zNazC`a;3gvvxA%z{|Di#HaM>cJzf84Y%Pbn@qGDz#ZPEg_fJE+6KssP7pW&*YHzYN z)IJt3Ms$cxH1=})`KaV5HivJ39{ydCj zymiN{(7crx;G^tDlTSch-{jk>PI$&>tYw`FbLhV>!tWA^L<8UZnrW6}zlhqZ^61{e zi3BhWiss%Ta?`-){e&r#U-N{@n%d4*;|*)3eLh8YZG_o!7@e!u$z24f&|j+9|h67<-BR=+GTE0KYN;{p`Y6*2InFvg*0v=fb1Xej`5wdJrZ>D4}`uAXRvaFvu$qgZvio%X!T1(D4)Y0Sml}`z;A(GzFqEBc^kH$==?Vri<7hh5V~ukrE6S^r&Y{Dd3A zXy$DEe;1lDrf&~3bG+94{H8R@+rJMlV`6+y{rBOGhDtX|?J>)DECfFkySqf_Z}|D4 z<~{J!=%1btTsJ{6T*P9lBJ!J!Vjz|j2L_^8=>gg?a3o|;8&C*2)HZ0(v>UvEnRctB zN3s2>O|?1OvIY6N94$RES_h=_a-I9rj1c8zuorUoGeDN+T)?rph~pc5i5BUFjVTn$ zjeJ>B*lTjD^u%Y|4I9p>lWe{sdQWEibrTid>~qZUa_&GiC!errmZ>&#+n~82Bb_&w#L4UQ6mh=UlFRMHMMOWMW-R-s5#P|InUJ6ifHV zCy8kYlyZOjxkxFqHCxB0Spo^uw<}IHfMdP1jly;XS1R^Nxqf@P$PAQQ0mh@f2a2U3tGJ%f*{?OoEi4vApwLu(bQJLzqMY6xt!{JG^2Ca^q4uf~2luKCyH!K&a4 zPf3GYcz*eVAQQNz-Duyc8e__wiBO4_2wN(m3AT_Y!FcyfQz5O*2_ch@M3BB!Cm#u+ zH0Xb%c`WiD-xlD7kB(c!v4&>cExsa+_@m(!6AN)6F49=mjNuP%G4yey`2(>rx<*Lc z+NmE1&CEpm39zk2|06mW3R$o1Lbej^3%m)h&rCDdkHx9T(g{@Yv8FkjNI(NIGglSI zcp=|{XFt&AtOpixgoV<|sCLT1pbm$i3XE zea%4w`#EJn#0J_qC*W2X$J%KBp3n3eu!g8S!y4qMjne4opTfdP zixb*3IQB_j>ZJY-Gs<<$=#$~u2?7#)bZ}#NJg@XejRd+;&5$Tpug&9{ zq!OlO@-jokqZS7GDero|ew%h)UYgSNr&_~w-H)c=u$-}55j(+#p3YwZ*xSjy5!(E8 zm<}(o(ICV7)1k?=(YY$#u0e!1J`+X(tz27wrkT2aZFV3tk*P%#={7?Obc?PPZbYGF z9GU|E^4eM(&(0=3+e{u76?aGgubK(t`CNSK z4DLH%3>-`${oIOI>EiQo@Ei~1*`?xjy60>^M1S(s7h;na!fV85OQVM6AN}aTNSh%3IL;BpWE@#WB5wR4oB^{}RE0ciBbEzl2%h_YY`= zkVniUpc}%4T(1&Xj3maN(}^sLhsG^U6~8FDc__4GJ1D|Q#73sT>KrzxIN;qHjauG$ zgkV|pAyf70`@Z4{RHMZCVpt3of?QB|U$hus42_TdXoh9ETT4u)thWFvdB<1=4e(!M zGr88(WYE8cMgmju39~-yNPIMA=cV+(KTJnCzZm%Fi-BYZNJeUp`uf|Y*#-HA z6YY}cn`FzGfdYiOkYc21SXHFyhXZin`as8}`om$wM$ZvpNC05!s0ftB=-6WXTl>jK z87@hsN9Xh^c_a6YWQ_$u)qlgG5fz=p2_%-(Il7W$Btp+ODVza&?KSpwi-1I2rGbRZ zSe+}^A$CMfu=hYWePZA_*8`lmUyjZNzM?O1jCSUT=R%24+Y7@YvOcfx$@wPozX8N43*q6gP1fpn2&X(NV!LV_e zSX}PlL_8o(gVfceh{Gy5QlO(%8#G1olPWrgAfJ79bDiA&=5Sy%OsNk!5FzdBcP3eF z0j=kSYBS73+Y)2kJ6Fp1cw850T-ZJHENozk)kt4AF z(wuxzSfxtT*gZYkCUOH_|L*Xb=eUDT^Z$DrRMAhfMq!)-;f00d;*+&4TWyvq4vytM zlaSvGzzO>oFof##S~M`WsMtb8=MhqvO_@tWAkeN0EY%!Q&T2rL?J^_r+;I!1F!q!+ z$$eA0+cu>1r?@u^3fWmB5ACtYJ8pp$lQO29ixGpX!p6Z5bZ~FrW{kxDNJJ$Id0A(y z@sR+ZaX?($r@#n05xL(&wJxkI5q9Iyk*~xCiFkpRT7zF{13ZfEulj?Sb=q_KYV%0s zY3%{Cld)*`S zfKsc!9vY7lkX;b&kc-=i=JEIri}R~eh<~hpJiHN2P|#4PsDi5-&=EQccRT0UpCL!>n{!5hb4KFnFeHw5Df3S>QeGUgv=Vgn@}I@vXSOd6y|^|6=Dj35 zV^j@m_0E)+PJUNaa-MXq`fF;&@&fAKb3+KPj4~ zMZa{#vkfC4l%1flQt|myaz$^%3@tAfNtqFP@uYZTPwVh#YgtNeg0L3jJGwY5@5@5x z*oWuS#Ma{8w0>FW`J6@*9izF-7Og*>ZLm{j9AGkpS6&Urn3u=-TwwDdyv*kF@}|`| zcNU4g#sgI;7puQ}TYUFp+7&_THZ|wAHYg;$C0AY%A7#@~vFWj&SFCtg{p_tafRm;g z(dV`F8R9TY#t>Aa4PpP$SKJ2B@}U2C>~9+H{zbN&KOVX=MiP(C>+l%;wD%jOg8_Qm zZ`2U9l_odIj?qT&aw;=>1UEHgXd&s070zrvNq!??n|4d{QD3@~ynG-+gL?eZZvxTv zLm#Xqvd_+|abSvGFdeQ;cAy%uC$JGyqT<|p%zg4opVj)}ooW5bW;y~f4JXCdkm}eh z0pzdphvB4H$FB-ck4k$m>;2i1yx{kcwUP#B%gsB{%urn>ov_gg_m%yL*iELa z=06eo86Oc82$A{AfV>6xRvpuKm=iLMknI*tP{^W0T?m zH_%KO+fY9k%(cizekzW9Y-jyc=-fj8q6j1J%azGn%?%A*D?Ie=zCB@dylxy-&FPzR z4nX(O4ReA!*1@vCuX6EOCaEH8>_bW*^V6i`f2KIv^Fk(I*i8l0vxHB ztR2;sjukDPpYa#vx7z@>UswE`4x#=`c-aEAH-+UOBhSbT+G>sbDx|Q|xps5FG0twe z#5;Q^4-mMu1;NOU|HP8=A89UuRu11$pGeNCcnawVaXTBWes& z)G{!5EMujV(VW2s)?u!39GKU9nE}O1TYP#E6@M-cr4`HlbIr8I{GT31rV@DXL1$uk z9kCzWhx@~jx~65>=nRgrqt~s{(d$|Z>q6G1!g+NQV-X5@IXW`BST=b`D1l7*d2eo5 zZbBBWDL&fcj-=hb*=BbR)Amv&ytvo|?r=Y7=fQQb*I|%_I`OvL#r6wvq-f44Mb*$S|XI!>yI(7`T{eywEkSn3??VnVGWF{(731+1XF{upJ0mp{wsl)a34>da7 zFU8T46>`eR|CgHXL4YVNIq`99ZzaN-;-DbBRLmVGcybN56rxjYb(W6rLMOEod%|{_ zFOECSymDi8F+-JrG5Or{mXp0cLjLRx|4t_<##p1G?4g6iI&i=<}&?C zR8|h1#=@Zn3_ECSJam6Ol1|j9-Wp&MX7H8(g=Pj$#BXUe zH312+Df~nyPh!U*#GWRjcvJPXNuK&Y;@G~H02hMf%-;APtu{fF=s;JC^4i%7iTxSA z1vN<2$}(CWpgZi)cj``SxhyL-9{oTmudk$QoC+KbkRYPUO-p5mKSv;P5>oEpKI(9Z zUy~q9IpgmR12y7|p+9j5@~PoxRm}`GN(rMOPpaLr5lvl|R(rCS?djaI=P?3u*4{eW zrf0`y@@ele$8Yz&bai^Qt}soM0)unu1Y65##~z=e^ySg4@;bc^kE=|@p@r~h2gYJN zl+VVt1>MifgMRRIP4Uwyx+ebS1I(4%;Dgd9WycBSx9>VYLH4+?)dtc1MudxkSC8pX z@NYB&6;pH8W}2;bF*Ym36Pa;YXg_r&^BFw@49SC~ud`ScyE2F1{mVCUOi`M`{(}XN zjp^c%v{7E)8WHLvLMVb4ZJpj4#x(ZmH}jLu6S(i&;=7v}=~IBJ$Kbv#yd2J~fqpfv zAUK^~qaE{8J2%l+`CeFIawrJ_B4_{2xSAaFDSmdk{>{*6b9UPHBaLSA8h<&jCLn4D zltv%9rzaN0uVsaUZKoRMt2CkTft>-l<1QmN2*8}mVbn@Kg7wJaY5z=X$>Dl73V^Lr zhb3~}ous%W5mzW741BhJYS_@@<0bYHH7eRd3LePoLc97^=gQc?Aq3Z{s12CrWO(s*ZTe@Eg{mZd2XD!~8grWb?Ou z1W35@DZUB++hGJv_#s>>qy^;IODioP;h|7mO^{dHt1!eAWr?qmkcuN>L4S~N5H3%+ zn9_t;O7UT*AIUoUCl@7-L>7bHB}fdhv6mI(xAV1r>pjw^lF_dPw3oy#;S|~~iG2F) zKHCd;i%o7ki+C6x)Ty?&Pf~H{S{~O__M>I%w9jg^BN-v1lJP)k9p$oQJo?B`*dXGe zI=#jcG@1d8*2|GCm4G=n7d_1I=H`uM{(GToxcK?#h;wp{{$A5{ zfSe1dD3F}06CV`P>7F?H3*b_TIE)z{_k>m^4xRsgeD-7ZAnK+h{O`9PjmIc#A3VBC z{vf_*hc8IR6FT{WZ}4V^l>_@29UIdg;YdJqr!~AkY`+<$jI=r^#OyL{Cd0<15o%A_ z-KJ4r9G^JQ?|9_g@fnT~usXy)vn<3ihUjE~7PeZ&&V>2P7@Arp+;(U78Y`E<$lno1 zZpO4@#XG{NCw*N)Rf+tuSIe+h!jXuw$UY$95YSBHe-s=4b7WaSxjzbxhcH&B-rNSJ z&5cAk_}QLhR#zr5vEoR~ zSfNbduI~&(ZQMss#9bAG9~3Hy4+%ALOa=U&5n0|&xUEucklWx0iR%}22Gdd?@lZK) ztWmOn1BAcjDslw{6#HWzo-(rk%yj+7VQ5yEfurcsVrD`|qz_D0nPJ8%GYq_Un`HgvS{-{I=&_eL&@S7bMFS-Jv+c2I8Gncc!g9`Tebr%F%hdf`sW z5O8H@{#CkOdIe<&xRyI9L%?-JaDuMr+jr=C@lMJRaNV+#G6YcO;$A$7~QJ+tDPYEXX{2`f$qKTa=Hx|_1RZEU<1U2d+&kI#BBy9Es$wiQd8*Ijp|A;8FIv~Gw z7rCk@k}zWF1;2Gt{NJ@EY$FT5gz~V=_)x9DgXT9GHcd4+wEgzCGL^AjuRmfB;HLJ9 zmsso;nFX!qPgWHa%Ic}evJn{sNvv-~pe+G^z9$rFl_HIP$Y^l9CZjapU8WVf%;8Zg z9-8?13m(|bFWg9VUq2^hYLU%W>!GF+N(5DXVFmT^Hda7gZ?XqS}jG zRMLuz>NRswNh>a@P{L(lL|PdgAR_IjQeq*uFkh&!!9^8HxSRz7N53M9!Vwxw6{P}U zAaK9NnRaG)Ue()#RgfK}A6WqO(`PT9en^v+Fe39%LpEmla4PHh1Vi12XI#7gs?<$m zX*s=GFvVI5=LO@#Oa+%gDs^T0E=8vXe3m6n8Sf)>mFkkp3rDn%(odnA9`yX>OvEc^It6N&l&^s+OS=8E*|NEgQVOz;IQxwxvg4 zRsM^{qw_ubb5kHB(|JKsfgfGmco;hRVHv+tcy*Hx;1V@3?aTI5P9ZQ3EkTyP4=&cu zq7Y61Whggcqib?sV(to8SQMzk`~;Mnd-6(RLakzBP^&y&(<;+Ikf$UgT8eQxmyB!^ zNiq^jD9MP|7ReaN`)ZN*@N?P9qQf&|Qk1_M`sISUZmyFj=KC?Q1UErJg`{=ZWpZ&u zn@vuRv{o8DTm)jQzUN1EHsJs__Qn#L#r^olpUp_vyrG)onOA?+Rlg$gbS*W zDMKW%a8dl8RZ2Y1kD(0$3feAS4IP)sW2?cr9$bC`(HpD{uR`DP6f+47MZPbK%W5Cd zgrRr4DuVZ$29vn&Nv=gZ=u^Mu-_atLR|!IToxsm9R>P&qB}OFu0CWhu_+8TCwZI;n z8$gtGz25wJFskv3jtWWr>N~X0R!4?`(rN2pT{f-^Moh6L0PQV=rQ)=JbkWS@<9~$W z&^{3qQc0Uqs`FtP9~h>y%jMVQ<7HeyG&ArfZc3lxqUy6;<`G<6Hltl}k^JH!`Nc)@ zi;LtJ7s)R!XCbj-O~Q03*{00(&>iD6*P_&oGF5WN zuh;fPI+0c55)JT|w)4Rhtb`R@$tR(TavgHf31aqDLE++8Am+Lvol28+MO6;&hC~;# zPh>1tuJ!wbNR~Ty(K+%L+lLRnHYFLxg03;8Am88D3WjP)CIF)N&n5I|2$#gp>?ST4 zf|O;OI3dYG<7-sFJYH7-f%@2jF{Dkkd(%4r!(MuhbtO3|&Qia!6Dv!`wMHP2)Ds%T z1u$gSTyvH;kE)7cX}sEG0s`9TU)_z>m%NEa&|s@=PphlaiYHYvPNp!6Npt$T*%ITM z(JOGFlxr51x{s*D!`8r-(6N_gqKseh_B7UH^6F{K%S$D(!CbtsRU|2}g}4w$DwK)4 zv@!$s<`ZnA?dfl1Kjk0@HdcB+?|0Rf0`t;gMB7`sS zC8C*HaAT%V{s34H6Ph$=GIt(GmPFavavm@gen7TDr*ex+#Bvb@asiXbVk1k2ynfP+ zR55{LYMZ%$EhU$sR3!W!LYB-`Bs&4VBX)Lq;P5|yR+R6~Osk;q(zW8AFd}#c2vAgb z#=zz5;PW{rXO+PyEY8FD;iWKQ>z(ch764+N0^i0C^);6|=vB-*!`H5&c@<+J0)Zr> zM9U+ioQs4Am$Q%p!626PO(V9w!l;vqOnx$<(5uu3RKsxk$Kjk#OZAlkG6I@{xAFxf;4}B?R5A0-$ z;SDdPzCfMdVDK_4$6?<+fpT-A*CtJ%Vo1M<*Yj$b%8Tlj@W;LZe^H_8x zVcZp871)B!%$8s7iVl5tIaKtuniAoQb+rp(wy_(BGPudtOY^j`Y?&>G#Ml9;BFQHuYcK+bQ-& zttKWttB07;jri-<599}h#NaSoe}N0^eoI9COl!fHsrqs-!SXFD{6^(T>}!R8u!*Q- zq%x5?tt2Tzd-cUfuHq27K6Q`RC-WnmYx?2(ydxrslG|KVD41gR{Mu{(dOk>Nm5jI~ zH-I!9t^gw4RG~C&m;v4;iF(Y;4eKzmYF)gzzIjxAbFQe(A`XR~Gu@>1OGy)v1iuxc z`lX#3--Gz7iKs9ZFRa%ozR-0CJ&!1|k7y0bVMj-QZ{XupQnNkuGEp^@! z1u_kWR>`F(^&hudxIq&glp!h5DC;cBM2{)&XnVvs0&wQ($v(YI96xxUp*-A^simUu zn|;9<9@!U2J=qrsO4%1?jh0-@z957`$ep`=K~RL`3meW>@p+{SwoZm`$kN`4GTrld z@>~D_T&_-_dFIQl=H8u^#0jZcm?n~?4?5{^5b7ciVw{*-X=X^;WQk3m1K?1ia&!hO zoYFgtJ#uGwv&?<_2HjtV2?WLnz7OwIx~G2|VD4*2rzg)K^*PmZuTHG3gk!pJXv8nh z@|qJDmVAJ*l(|_rYVQc%L7mJ+R5Bg*d-n`zv&IdZW0xpQ@I*a@siZc>Bk~u+0JODj zPNd<>vov3B6STb4SkA~O8PGbp$OT3BiCm#5v~|Wsb|07ZEHamQT)|vq9dVI$#6{K-7gCm~Hg~=40H*WvTK>x%MNa+I5GZld%yRbHj>*>R)W9+ErZeaf^ z+g(bjiR*%o2b-e)-Tx^iF|0x39tK;ac1YPM#j4$T2df7irFHf6i!GO0U6UmlW)P|3 z4zYKISD+>}kcX+D;RZKU4uU7ehdIGlr@rF-^GlrCVb!}x3r>>_E9vc{X;XTz_SBgr z9)+Bl*ny_mFd~ErQqkMPGuduWc}~dqhUefo+2aHi0>mhVV|5r7wXUW) zkRwZa^1tQ2Xx=%{bm%H`*Wej+W)3&Ed%}aRK$65k$u1dPE+jZZb|z(s1;$TWH3uD@ zOemnvZmzQ*}1T7qGvON#VJ+UPWKaP0qBc7EwH7uE&nl^$7{~7n-zDe&P)P!FFDPGtG zhP6P{f(;41`I$X%)@thD@}Yn_rb*YQ4LCuKZh(UrnF-!jCa{;Mg9^?04H1~3%Cr;2 ziis;Cu|g>rPsZJgJ{iC-MjYN+jxF|@>p+80hCC^Lyit$C0AnN*Pw$G;- z))3-qWVkb7-@#$zu$s~KGMwSKqC0IQk-fO~-P1^d=G|lx9k1v#ChM5)r;P6Ti&Z{J z`XvZFx!A6uJA8tAz5=SY*k{`XK^ul|f#k)u$L2UGKzg%XSZZ#18fCoUH|rEF!FlbG zlm=8;NWua`*pim+K$bt?0xp&Lbzm@o1T$#(iY~N}Hfavn(vLsRjt__Gd5YX)9Np(k z$jOs0*vI)fahL-nT|m9*<}{#YQCY?>jXR+3-x0wqyh?pry;`lm2Kh%xIVFbEiPN4w zh;!K(Om`tij;-Heyh?`n-5Yq6hwJpv(ctzUn8mWY{(>QXFj&a+5CA5b)FhplW^dbh zL-!C&0k0(Ctg0m`7%`J+g>YxmG!tRan9sQp;(RU`A=pH1{y;cFKv&gOoMPZ>1mK0F zvoqnyy5x^p4@Z-uabw`Y2wYxBBiRg;&r#7d+y22q5kqntVwU%V`OuhF)8H^`Qxf1}tJ)Yy zCfe}`;q(g{;-L1L(jDXEp`c$Rp;qzuEuf`J!w@{s3MGcw=QIvc$~hS(n6Ey;oGb`Df^RcSFT5!|Pz;!D zvtTQCjpsr2uIccLW2&}v41`V4!JxMK#59|Me_^^CeYz{)AMr0j%B%b)wq~Ko@8mmy zLM2oU=i-ZA_cs9w98wWvebWudIL_e$n{|xyN^gVOE9ee+Bb3i|0|JP8u}I

P3F z1i;L=x!kplmcDP1VTLAg>!h_sX1){*0N)}b&_MoW4mwEBCJ@c`x5Zz?_bk2^_9qh- zZ=3Bjy9vu#Huuk1d~M%NSfa*d!uCDBw(s$^eUGp0TYPOC&wG=wm-D)e*g<9^-XDK# z*=^dM8nI$#J@^Jx_C$6YOTgNjS1}77#SEu`HeD972eLA~4i_8l7cgug`=GvKqv`X9 z_HctEi}^(m}ian zp#$WT(>xFUw-L~3AcXHSQm_#17Pr71tVnsc35x$54W7niHX0$O_3Z89mHWOCuC{wP ze7u|Xm*d;!v32~7pxOlHScH@UOC2Sj2p1cJmN$~+oH>;b!~@^*z_11M`d2Q(9f=0S zmqCRGR~19`U;4vrE2lSAJ>C-Q$B9T9EvzeE!l~!(NV9&~QGP?t3WUY7&=!L>%gf4| zNgYHLngya~yl;@#`ORuKpbe(OFhZJ^7?DZk5sU1&qbY@ zE{C8;nD85NEUh0)uG7fH`pTS4p3SpzBQe_!&wMvEmZhzRua6}+Fi@B_z=AMvT+$d_ zn8l{&`Zc>wRl0>IfXTyovB!Xu=;JeO4?!S(EIG{ZfFI1RPVoJ>M2|LnuXs(i3}MHq zw^H7eLdpV!0Z)X9cuN6?!F+2eSnkLO#S|f6*$z^rC^t)u`vbpJ{;NP3inDU|eU=`e zm6#6OGY_O$k&19o5NJgI&4I1_^(t(oMF7t4IQ1xZjW)W;b*)RYd2TVs^FrI@WYlTM zNSq_Yc)Ba6$K-_C#&FOk8;3y0_kR)FU`3hFP4QyHTAZ^TXT4%dvSKsLgx*4;!+h8{ zSrq!mSaEQS8&NCZcRc9GKLuErBiTa`IxZQ(g4HCWQ3gs?nc|D%f@HM)K8Zv^A|w*Q zzExoQo2$UI6{z6~fp}iye54P7_AGpm%Qvh9!{v-b6v&E1CPMUiKv*#eafg8L?ww4F z*EXD?(MF_cTKJ0LqujF%Q*PM!x59^me^T@YB7&=vQ5?e$ui~#AGzg@WyNKPhWU`1b zF}kq`%XZffJT6QwlS4@QPlV6c@%fI&a{c2sm@jAm_xhau%x8VF_@Vlt$8-I&r(lKp z?O|@+9~!!b8)NOjnTfOm(6mgY9W?MoJIEaP@Yy%fH~%y)>)V)6{vU<3_&_A`frxzg z6ZuMCcncjh0AS1I+lU)thHO-sRg^@06JSi61VcjHJwH2M@91$TdItvHZl zV5@n)c&Bzs$092q6MuUbXm^?J*TGtYUQ{`NXlx*$E39|b28g$^n2pGHeM5=!xM}@S zdFE3hE}q0@I0z;XGfGK^Kg?H# z-?tXCO(;!-7B^L*;0ZXiK~MuQzGUD`<7(h=`|(~}i!>T;w$LUH0)N+xj87>1>*M&u zUE^zB0LOMI&X=(S1t$XyxO;hpN7R=Pp=wRA&okFaS}I@=jC$Io3B9@V86G_jpY_i8 z&0Wj6!W4o_x%tVRz&RRbZ~-^J#K?&M9KE&tg0{&SIU`fZDbiNUgkpjCK>|w}33`XP z90<6A%l+gkf}v&Ij0J;qc#{uLxN6PWiKXP{QUF^+$vQ*VBu3Y&;Y8YdY!lW>QoOpS z_>8zNWhz@m59Am~f;=T5WVoO^MUHM#=UXugn zvFKPwc%#F%z7!HB6*f6-vRQrQk@{vdT#eAS<9F|)p6M5rozr_BC$8!~9$f3suf6pao&0DG)-apV*ainxvCl z-Ps|!Gpqmn(?Gd+W5b8Y`wNuiTiwg9jIpD5HY2NF|F7ZUz=YUr}WjL-X-jT^M%28bEv zb-+_m&Mv99foXL{V**VCM!qJ`^2E3-w zF&*-0>?CR&Km$fQM2JzNM&Hj&bjvrRjAJ=!oKI6z1LprUGF@t+z1Qx4&q2W zPaLn`KE}8-?rLSNsMMW$ZF$HS(|h5PR*d9jJSuzZJkzm1{_#GO3QE{I6*BX#IgTQWpI z#1#*a7WmWudrE6;aLieEZCG*UF191r==@HQ$M!ceIXHtscq)gJw9u$r-u?nGJQpq>cmgLa31^UOo0>_f-f zJrwD;$5>>OcIx!h&%`R_OiVx|9N`-)%4o1xf)Bg`v^4SOHKi%Jd^XYAp9)WspqmQE zUv3cd9#_K%RZEi@LK6>TqB^4Kzy+E}CNl?9aLn?mXB%1Fgh7MY}`8^>GaTPC06fg_@c%RJx4=RWUku;yrIc^ z$gT)u)q@3L${4k?n7g=wqk5(sW{5?o?vs|l1K;~u_11|&h_wv(u1OCZaCYT4o|5p$ zV{g8PG3XXitx5QXrhvudekSaj7PpNJYtO*jTXLsl9FZ}&!zN_Em&I6VKYxJ(QQElt zq;&BI@Mcq)moSy=%7B9Z zqG=^@W{V!=uzJX@2;X`SQe9)k$ekpRxR{rfV=nA~=XhWaWb*xvvAMyKJ)w|d;khl` z?$NU%{QDhoo-uaTq%`<;G0$hEc}iWBUO~{Gw@ZDU+^O_U$4drJ)w0?Ew3!ycRKM>? zzRUkC1E;SAIz9qZY}G{;4`ym%8q{ap@EZ@=H4BVUy8%D+`{UCizFrn?6Cb#UKyxvP z0XRI~2RJfzHirCCVo(i_l8@LW0S6pL5tkSP1$DT2Z4bd2w+lN>yiUgDZ;L`=w2tK3 zF}DcW{Vm}F)~S>25}Wo|U14lG#_Ae&#ht3J0wR%^^eFx1*p8`7b&AaZlSDjhg6R#J zPc35$z%&tde*Jl6m59rOdPhMAd` zkFwUl#p8e=MuJNW2a;nS;R1GUi0o?%@7v%!-oxEeWFuzQEoA~Uv~v4tp1@DYJb*a!$?NLoUr({Q#~?}Mz$kzvsyA+@RAD(p6GW? z3_E#$c;QdW;Qc<~&zbWqJ)J1%HUgeRLC;CX?)lNv{+ElmIERdXIT(6~Cl76Mk@$QJ zm(5U0>L%QZwN&IJP}oWQGx8||lRCM2?=1vRN&hCOmMPDF6MPvb2C466&Lxy!1ZBo9 zGH?b5;MXdRAKeAWe_Sz9RUdwZTq2g$iYoKC!gmRr<~x}Bt0mZ7#SOOJL8N$Apf*>H zauXsrN4=W!0~fLC4^8y6qV~$Z&17!y_?Dg(|HlZ{c-wM~~dByd&zf<}SX8o96PH`b#b+X+|s{5I`fh zMQ9#-wB*&ZdS%*E%b8DmM`vHZY3&j}5RXn;vLW*m*CNM|!i9}X! zTuBjbO?$pKS^ALq;Hj<@1?XD5S%+UrI-pI~-OD5l^apmnn#NAz7DbBKvnY!wbfhAp zhIRSs@QXM|?_hNcQ6sH|zft%?Yrh2wqqV<=Hz+Be{)Q-aV*KM#8P}pUc(PMp0rlfCEm(qjFNn z>D?bQ>p)0|b}SooEOcdEX&0&XcfUuenTw5#X8Cis7gtGH)75XA#+N|B2D9!85*?AC`3V71NZRV~ROe7mn=Q0o- zOlF{skThKyF>5!WRMYQO>(%di|9ikfu~I%w5~M?o2_=&;t3Ia@qt!TCfHyss6t{_3 ziC<{v*%$3tqq{&``3~)TTl;Q%4!{LKx(je7rdsy^OK%vf6lQ*)P9UrmMQfwZp`c(% z+-G+N=_!#&%#gsH{)%3;kzBHPLvI+nmYuoO>qWp$bul%?Hov+@@kEM8d$UW25sEGb(hwXsQU($dQ#^< zh%X5Go)V?UC^xqpk?KYs1U9|taR)KwVldYqD zi56S)lN(W4_1}^S#V^KHv{%s&2nm=!w)2BUv!I+<)?@+jrmTs5QCSmeP|ao1>zSt1 zd&R1ote)vSlEEN6x-2GPJ}XCQ$fh1D7N&g-Wg*agE$iWQb=|0a8cIo_PZdfC7y29N zvPP2h(X$W|EYNZ1Zn#NOXeS+@t@>&Fr+9px(Qn}|xiqrsZzqzFO9&G}9Bt6`YM+CUY$f`f5AhEd*RjK2#CzT{5unonY zs6FHd9Q&64fq(rx6fNBRN>ZSXMJgT1xAT(}rtU2kh7nf`yw(ts0L}$XM;A4E5OpD8 zxm1eaJvyY5+HWzf0w*jH%s~zfyOkJJ3Y6=ZDfAlgn*?Fs@cAL)l3P5s-s0?qMwv+z zPV;2x0SvT9bM}yc;=@Mt$l~~L&ch>cKDiV#2BV1Z80n1E;Ib zQ_Sgsi+u?;szpS8jl}4Xv6@%!iI^OXRj4Bz4g`tBIpbpC3@2$ljv)2aZ;avN}}aU8I4?8kInXyfB{iKYM75w49OZ(&clM%w!#9lqQwi@4+0qo>?UNv zM5ST~b)4n$ImXc7ILa$(B52rhFa-yA;T&K}JVQ^k9k)_s-^C7^p#7M{6j>bAFB7>2 zHVp%AWRkq;mn3Exx8UT1{|G{Z1@dqKx7=wRV_9gw3|Y;;dy>7$#NeRT#}7XQtSXdd zUSh@U-hqC}d=*oNy|di+mkTqUhPGGMPY>0l@z$0}mmj2EBFHc*GZ8rtEW&@jkB`jqj!wWwrnMm#X;>+E zsOK183^N|SJ_vX>U%fA?Vkrr=n1lU57sqHiGRl8W9{Cd+a_`kQ3#OFM_g)PtyaRF3 z$O+i>X`m>MD${gzNvgx6FyX|HP~wyu-o6_12*as377wvWO|r*0uN$&+^0zh!Vje7? zE)Sq1WO89{nVT2p=$QH}hYdqX&jhN^>2a%+2@JIwlgKnLQ!Pla3#jh6UX*`L=8$o* zq{GqwI`W)GDSo^K6R2UvUnpNck4c$swjka4h#?pat4KH5lohkZY&lCZv9jxR?#4L1 zs3A5`0uPJ~OWmQLvT!WlPyKfesq$;rv+>|Qwq$+7-=tO?D?~8xWz&|WP)`MXA227k zzRIbWowBf7**!xA`SkP4dbn(yJ8=;*$rU7*=rEj?!tl#6 zqBIDtPyrin6)>5f&g?0Hi%`4YT}!7Y!l27xegH?Vt6^2Z7Hx>)dJj)iA$TW`JAz6E zImbdOtD|CXl8u7Md9dFV!cvY%S8D#??K-_c?jHWc5wta{aSoz?a5}sFssm&ZB7I!< zUHI-6>v5;Y2m?*h8T&FeR9`bq;tbkR1T_XOtpjOE+v6}FmSA`yli$q?O4C^?|L(D~ zh-S)JpDqUS&i+!IHyFhnM&e71v@j7kMhdRR;UhW>B$5R_!*RdS;D@lYTqa*Ws5JwA zE(sI+L!sE<5}blmEOBHT?RrRW&TtlT!*XD8fbY6H`42I26_5%dXaS}DVLnXuMh7vL zWUIj~&dOKVA$)=`E2Z}zzW^rloVDn9MVD12!`X}qObwz0+}hWfr#LdRJ)kWYWt!lz z?eV9*3|uCr&-biUFIs9ZS}DQkV*zuDfOpZM+=Ti}=pN|JXa|+TO7-o`1zDF1yTwTj zA=}$us`rlXpn8>@KbGdFL)9y=I1!e-HZ>h4k)SdD@Da~c-@;Gp2<4s>j6|k|D~j1@ zx0jo*t4wlT)sv<>%-BjH8bf$jq^6=fmIZU@Ne7U3t8Y%QkI^klUfj5QZUM2W9_}Z= zZ5<6#J=d!K2u|4`xg(7_p|QkdB2C4%tPN4LoBK8CB_ZFh6)^3^|FJO^R00pO%xYY9W#hQQ?2iXALb9}S9_;*jn(oe1mMOgcSc zhCG|OMenK2%|+RiIZX9(mXG75Sw7=Pm)5O%y+v^9k(3V_8OFVzuH_}-eh%*XH*)m+ z(U^8-Dx6?9v^Va$oKU+sKyD``#Z(-dT7rw`!%)dC_(G2c-{_ef+{oAhg50Tltdf{d zSM^oc9uG@LFxqLXwtI>73e#Jh>!U7p2~q821*t5WtGo55qUUoWJQ>i8*;EHjx}?DQ z!xEqyuhpii7jsF5LEH$rMC0DdZ=cy31|{tP*TieKTYEb!Nx%#Dna1^l#`bLVp4!<# zL-@t*?njM?EUYhV(+3si%vk_~AasSS-~#$yn(x6O}_2`}(T92fBk}wy|SGtzvYRtutly&UEZIErFue%Z5W7ZOO1IYw$uc0 zBPsaC-u@&b7)fz^A}LzKiKHC)B^xcOiRM-?d;Z;{xMM-)hd6ItD($l`<}rqHw}KT?Aq6y$f(uIbbJL;E0v_9{BcJ8T zq&r2%D}R#zYCJz$4Bk0SXgr~qbb@}SSXi2}=cr7Cr}LPzp^eUFah@aub!&MlcvcG9 zB7B)G0ffevYky#%ey%XBUM{I0@gY{|o0}B*mQDWXhgflXl@77uEUQ^A@enIcuiBkV z(0i=be(HNg-k$FY8#-BH5epPX>t+ZS9jU|R1Z;&dsmmFaOr}f`ICOSTBp>Y+C&dmz ziU%MN)6Uto%(7)ce810nD`uBTWu$8z>C*>shh&8Qa3ZofEp!3?l1i!ecet~V;Nmai z*hxcbmK{w2WhoR>RKM7RE}P9C1eg_BR-_<`B=>QgTwK6ht4&-$J`R|_LS+g3=}3ro zwTg~vUr0+uO#t;_fk73(0qcO2N|?Y6oLpJXvX6+Dy=eDLUx~x~MZ5{+#}s6K+k=LU zL+3@}rW%bR3e58@grF6+NYk=Q4VcKVYEwvQ#vWBV{AFy(=Eft<{P&?xWY6XhODI>b?=)2_m+%!F z4liCkse+V_6{H-R+jf040o2nl{x5496&^WUkFD*KIx+`?yPm)G*N?9y)XSXYH^pTr zr(2sQKT3WlA4NqUgmDcP_LF5{51=5+9UM2D+E-`TQ&X(K5?f@PEWf(1{7V3-`L<|6 z#IFKNRtgHOuoPDwkhCGL-bX4i-@WHOx&GQuAqtPhtQR>evv_M*X19j(_nRzMZ4vX$ z>nSDc7vKW<0c+KDTAjS6PUl?(Z`1mCvGxN#*`_=64i*Oqb?r;Ooq9=5ILPkRF9LaP zJI-t{TUp0vGhUOEfk@0!v{=~CdClqsn0`x0X(S3NqI27~6kBS3?DD>vlXp#@DM7f#9*e{ti|Jf@r>qK2s%>4v zzoISnahbM&zZe>Z2l%gHL*SK4USY%7)aw6^^@_ybtl~JO5ywN|P9i2K%0%Ffz#wE( z_mvBU#|b&wjVYgiqdjf2q=KnIE)Dp2G+!(sQ3f)uxTCrLfHmnNpS%F$I02ueqO=Y2 zC&uqTM(;}j+=ipcJP2H)AmFvL^WO@}yEnm~jE;nXYQQtw7kMTX80FRPLES!;!9#df zb<9a0%q6ry12a2fgEzp(FoHO^_m2v!G(Tknq}g1&kBGpLLK?`)W42heoL;cJ`M&t6 zPj((PQZ~SIS$lj^W&oG!g!Ka38zJnLOo?xJ(&&CL>;Kepehq25tn*+G4xv8b(uo}z z*y7zhq%C&b&($3-Zf}!n4ykO-wg)0{xTUwl@Tis0I0RLWD=SbuWUat%!s9rsN#df#D0tByqt^y9iR67zD^98G6 z#`;C~yl{t{h0Yw9yBAZx{p0FY88I{Ug9sp4nzo+2PJyU{%~v{ZW~W|%Vg6*jp7F!K zSoORT!`28$CJ{`B;wB5XJ;VwGc~SaaLX!Kb)5CSW504(*UYWX!7Y9{x zpXJr3D1J!Jv&G8&S)$jvz0Z~y-Dd9kL!N4hX^jTcP(A)ssYq8SehXq;Kb=J+rxQhH zF@=H(r|+tR#NX+^G}1fr7A^89b!Rlv`!h`HSm6`aT@sESIXYQq*TVPFXLNu-aWLHX zDpDB<8K@J z_M-Uh`SvZ^zZNqKlO8N)bP*1ih3iI_W@(<+qI&JA-(5sQ`{B?)BeJ$;XMnyzbcy9N zlC=TeQCiz1U8L+JFrQ6jOB8~0%$LlfdR5pGa11T&3}HW7TMNlBDDv|jBtJA1{`fP? zQxCUpC=Nkv!!-XYYeeG}6l&keO1MbGD~li0=Au9(7X>1@sP`Ec9je<=1qJSMm8@^j zm)i*Y@#&o2Mt!=I4)Bu)DtQQa8JX~sLg8AcXe?b0M+|vPDO7jm)QR%^Un0tlJ-RUpK-DWY0N+% zRjV(;gS4>1y93r}M#LP#8NKD*NnCYYCKO~}Ne(=hO26g3)l{T}ExjcqY*Q4;Q_`~V zFyJ_u5=@U17VNM?zQ7z<(Q7K? zPS90HiA`vxxH(`~+^y2tdKrT(tv=N1Z@7(@Vm;%R!l*$VkzYk@q}Z?jc)#IYYq7Zs z`~dxYEy3lSSSNo_StB^)yogz%59u`rcxTQ+d=2#E@2$YaU$CQo_gFYx_0zV6D8{`> zmOG~VIZQ9M47r3MCVhbd07xaopaqAvJ-7Ot6IcP~|FMR&0-7!R3KaPjzJwnZHHL9@7%!vYM*bgq!$Y8gbTJwFuH1AqsA+b=Az$ywz&8$HzNk6BCo&Y$7jK z3!|(K$<(uN|MoX&94!?L3Mp=|4Q{b5+GH&ejFaz#BRBSi>#kwb$bDwZC`qv0*S6F0 z{TyUfe|^1v?&6pCH@vjJvEFcfZ$sEhsRQCmU!jjM#XU+dr zGWNfp!?4CEr`ALQ{I^|in43J(UqAN^sBXy(^@c;Y!4UF;s!sz}lP{Uee{8KVkP2|J z`NJ(Qv34b96)_&)zoGd?xNsC)029K^_iAx`aU)-xon`8S)2r(Zz4f3L{#3nreO>F{ zBmIpxTz?z$<2jAXS3iZ2+K9O0Fmd_o+Aw1t1E{)wIVS+WY#I-i@7zXw;Y_h;Ra@Hp|A5d#+xhACz=T z&yZ5v$_rRwJXJ+o)lAHscT6Wd^1!_$ObM6!WA#d8Prc!C4jY2f0L)7xq~2kW((;%C z4ZQke%qv1@$P4H%GFXgv*Cb;KB;KCI|Mhw``5{!X>B4!=#q_e8{0*il1&;5=rHf+H z$eiit)$@D3?lKtWJW4vF%fCCq$6y9g|Qzx+c-JED`;WQ5oEBkx^W@Zd970!WDxQl+ESCLlZU$ceB*^% zO%Dk0NB7aShS_UZhMsC14MY#GNPdP@)`S9}j~(l6oXg>ZWi*DtA5D_eM0okJ{)T$} zPap@gr;@fL&bdK{{B5`acFI@Pq34cF*{A8nlQ5g=&K77F{S}6GuoA}r^wJgf7Beuc zl%j&E_VfM77~R8iV^2G24NN>H@UU7RVZ&VhGT2yAZ_raFqmh^-qR1iLZ=mQm8^R%o z*aSm4N)aV1zWG^rHfLJHw#!{iXEG8U4VJ7#wo6?loDnDA0e+p3HqESoTARaRx(X+l z0Vn$iIQXnRsR(9L{VMLU)U0Qfh_3OVc?~O1S1*oQh2m|QY3rfIyL5=6S4IK{Pd17~ z9FvSz4v&{>A=0*Rv1)~|5js~bqoB8QH|F2Grg0EY8$Ca{pb;i{O?V?}sM= zsgB|cpPiK5dAKLJK z4weuHTCZ})^-v+qMt}Fy&5`F|J=ngsb{<25qEUdZ*Y`F`D%om5$wPDHq5g)sKhJ&= zogoq(U>IeE=@^y`F5zQBl)*6}sOx}jc=fYxo!I5*4{hfsO6utUBu zODRBoxXoM~&GWnxWam&0R6=tlg1T{gWamk*Gn%pugq0|%CJ6&(MhkA-(9)EZFzkPu zksLACyDeoHV}I3@(5^`2CLEWHtL`fXeB4F^^CTKkjwX<<{7vJ#IATf@n=k_}W``{w z8FE6CvNV(J;f7u5?<0lAleETUeGoe;ez4*DbO^Gasu!c#)bzpEC%6Q4ym=q#4C(;P7wn^`~R{TI`n;T?WB( z)UxoZk2@q|YMQq<@?(F2wZcdC$PavUOR3W%fz0sL4 z{H;M})WT&KqWwVQ_8KPOgLiZEW!g$~@s_6aE6ERD6pi{Z(IsTSX03G!#K?o!iYH_> zp;c)KwggSk|3t-bJ)E)vvn^cD+qsX_Wxa>T#_crU(P0Be>U`i6XJLqq+aH%s3b-HQ+MCV;4?oLl_9Fbak7mb~sY z%J&Pvkm#zH4@y=ZcWu2Oqr-6T4Jg!%Qie19bMw@HVbNuH?|Weg8r9BWuFfmo#K!Od z!}R_XnL$?!{qLKPWH(```3HUak9voiDZEKDLbHd15BipkB<+JKD*!UdhP%H z>hUjq=I{UPZHMPR{cm4?@ZN9z^H(nR(I?~JyM6H4k-@XMkKOkBZ@>Q?Fa7N}=x*3& z8St6w)o*y$7w@@6{~n&R%e%h#-8iW1J5BX`A9Ndo3g6s?VGibW=OK(Y*hR8=6jF7@@9Uu(P$%QgRSwws`-Qc`ZqrCi7$Qf zjd3uQT$F*}f)?+uI&$RZ8`EG?Q#G^AK3E+WEgb`wEd?q0rVJe6(H{qS*UxQx#cdEb z7H*r1@_OhiyaD_5{YUcsVV2KzZf_C;c;u0bZ;D%eJUbd5IwEtn`n}TJH&Rx-t*z0D z&L@67GpTz|D{n4@poW<~%)QUN(lE2P{m=)0{fWn(^}EmGGpo9}*tdOK`_=cK`N$b( zY`=Tw`s=Pb{oS`!_YUFT84PCBC}8)tGu+1K-}==ZgU9du(@%Wr-b0^$`t~iqa_`SQ zXY#;%{c%UIg-wtwyH3xDa8Upwco)8uVe=Dq%PSN`JX4}bS{VeojCW%cuKE#?{q6DPme z(>Bpt-tx>BC^gF`&*S`W)4-(=CqMkSaoq9@_NL!&UIX_lZfLmS!_Ry{^LLj0yc{FF zcd)5*nKVdo#{L`niFI-_4w?---u`|M;kpwyyrE7n)C(+Ojx`YLLNiHK{A=}fR0=@AyQ->-mK|}Y8E!kW0@YLO=qZRT|VS-?9^D7}tads5%I3!=(sxLIC zxqR%+s5IGL44pc!$1fubkJ7Zuu92YNubh8cRIU05>X1tp?6)vvp-eblE7OI=x(5r* z)BLg~z4WBC^w#lkfo8{0?m-)u#J2>K-=}5%*}CV%=W1(`JB*otMX#5yg&rz6Tuh{i zpnG{aTexmw++f^DELxz{q0{J&W{;L3l-h! zw%cJFKs02j$E*-;voxMDp@Kn|N3jc_F};ulD*1jLxksUVp#bwNFRLrU7M-|VDDJ_8 zTG|^$1;mu5to8M8-j>&^F?#41pG>$i+*)wHd9s+PfYbV9Cl}$&=5j%f z(rt;|U_NGd`}(w`Loz$-o#s!loRQVplPq+1qf2qqhw6yN?*#YQcR?l>YaZTom;&!HZYU}El(z*4hsj?6mBdyd z3+^hywdxnoX9m{>LbHW=21hD zalxDx4(TP>DHtmT6ym14{E2jPYt3dZT(+byWU)5trW6Ab^feK-|rR z;*7mqX3i}x=fcs4&*6g0;CWmq$M_j86lYw)g{q7zxlomH6_=Ig7FTmwb#C!OE~`nb zR34NxSE1@8SfK8AWcu1mC{V6A*rHBN&f(FK? zPzYeX@wl3Ld>ZE-Y>_%XV-0DI<1BC@JU}46OO*~Bja<~NSx*r`d^b`!R71raY;JXj z+dF6FH|ISZ_rw_w%F#~rqw-CR#mQM+sVikWMJ?##sEu^;rQzW?C6tIJMWF3SgTDOn zzD0beyxcL1z3?@d5knXqoMB(4uqVYZs9Ivh6 z#UVTxp%r~eD~jO=TTyD>Ij(>JyB44Ds6$4_jFGbeK#%){A7iY#X#%+b3e&b|^LGnM zaVnC+k|#a>BQU#fUnR`b5?e}1Yp0TDN=n-f01$wNqJxR0v(?`yEM&4GT)W$5&fQKT zL^9o!Xjc)0AOkRl ze21!?`dx)We8th9Oh|8M@+HUK(+HP(7#jeO9{~_&5S_{7sp8q>UUUpWGSPl?3){f4 zSXtZ#mDAW*(c^i6Ji2;0c;j^dQh1*4s0%Bd>x*Y4hcpkSo{wJ=)T4`+ zN=8k_M>YpoZI1O zTWrlG$wJShoS<4FX!t$JsG*L9ZSOgUCZm`?%9HCrL<>ynYnMc4^kW)YWMwkvT^ z`H#zV*-KU`cy(e;^c~F@bx=#Nk^^rBg8Q5OCga{5n*t9XI`(WUaPl8p>J03eV$o>^pfQd2uFUS_TW`<3Uo|A=I?JM(;bT2y$=9o z0kilw8A>aur8V#t%#WDFQ2ieQa7kmJYF(Q@v`fQ1X5wt%)ATt53jWUsYh(t%;d$g^ zZKkP>VL%T{8?};p-CfM^aJ^(}_5`uxYoPEHom0SDJF_&5SKla-rqGu5hzB_-r zS%fDvEI|^+WQKGE4(}|RET4c>a&CU3UA*K?@xcZ){Q-*~G+Kyl<2r`Ev}SV_(PBx37m1|&?^6_lX$ z3lBD-|`PqE|v*f&gY}XHS0`&leWaep@|NvMdX)M$E)gXmq+R_w<(;>t}Fz z3#Yl+<68tWGkDn4d`eltlquWqFC(oqe22s*Cv6VH_ zWtW8M%0zT472D-z{F}U}UWU=KtG^PDb_+2=uukK$Au_2GXkEb~-wze*#uD&G6$>qm zBH)DWk~f=#A%;4*ceK@H9Zc}DefAzTa71B}LDuEM>33B)et&sQsAz|W_ttI_cz{V& zPm?p!kaSC%U^UhLI>3D@K#nlkicQf9@8jf_T#(1#!KN%nUD1xRC8mo<^+!7>tFf+^ z;QTA*(}Zm>(s7gC1A#uI)U5fZ}5R7*jDWKGT|Pk4=nsv$8ui( ztbU;CPn?yjOp4dzhgBi_9Y8JZqHCmi_{3{)QxXYp(oN)9LwM2tBcZ&;sauyU0vm#^ z+D^sztwk;<)K;nwT^rDWXfENom8=xU*&T0_L-hF9^6D*le;R{ZQ~D_B29_IyFfh+H zic9!-^Cid42uVh#?rL!!{`f9_Ve0ISG~*`mDq@Fr7=*WH8&#a%^)5idUw#DQ$Mq7m ziG@~OmHF3lu-MUXdfXf+z$nS!oTtUynw_oD3j7oaUl8C2wFd401 zUYm9xAiZD|SKssSj@S7pQGbtF6v>kFQOH_-8m{8DC2P!InXB`8c*{e+8BwE;hesvL z**8N~;q0&^6TD)dO!SGcX)(nJoQPl`Z>4Q{EAwCMc_0Hg#5|DZ#o*=yX-=T#{A54| zw!7sh8!y{R60iM6gtHoh1_4v%?LJ9HURSF7gtOCFJ3+ zKka~v!Gzd5E1HuqJS$oPZcqd)!o(Y5=Gj_T<9l!w2;5E#16+T%R`=;FY~ee)#h+We zJrb)e_wCHch!L*qzSQyX=Ns#3=so&U{d_pvD(*GGy%@c_qcsn|^+u=n!C_p2RgzcQ ze~ErJMF-h4dEz%dYe`_GW}ByD5r*RDaj|4&LPaMn@*qKaYj#gg7VdoR$+FymD{U+K zZuQh6FNhx7>Z3WrHo9zaMoHMFx`L#6k%~G0MdCE)VAiaSBFy_2Ev?s9ug=pMT8(PR zo#WVDT_fxyD!g-1?oY&?MZ-^Y?TK$f#OVn?I4eF8n-}qf^kOVrto5~ZdAoSBf;B+G zdl|(!jU1w-*(1-zb?dBLcw&4*%b=D!)Sl==7;@Q-fIpLq{W|nq zyr{A^p4;zux8%Ch1QF#ZqZ1n!nj`5X52qa0tkS1d#xTi7osXfc;y>7ICNZ9G?u7r~ zv%p=H#*zMX9SZLQnVY!t%~Z_BpKwdV^zg>i5IgdzFgvuA-PY`d;gh?E_3^#z3fg>$ zg|+Yun;X|3lWP~&Ao;(!_);#nar{b-3{*?$t}R8>mul&8I$4UQ_%(m10t$5ZnX=W;8e`x3E zbNBiIT+i?+b81%+&KO#5@*DG>L(TfO*v+&X#XGqr-5kL_BODjA_bF|Sw|4OM5l2lo z4?!Z6!|hPK{mgiK>5w~f=>C)!n+filV%9Inf0jLx;W{`qoaOhY_7Fm`WM_Vlr2E%l zlbs^t=M>+sNy)4@Z{G(uNDtw6Y&HNjEhh&4xO>#dw<pQPn)QI@cHFjn+KpAuWiO5`E++u{CdwJ! zt`a?Abl~*cYCF4^tKGHi7x3H?c3JXFGpiGY&3Lx+p-?pMpi#we@)C$3R- zvnm70i^_m&^D}&dZ~)`>)lO7Z?-Rq(n+fHDk!V)krck8rLxv&TF33)oQ{YH(VZK?P z)yw?NxKTL_jNA2YR05gv)<^xIiA3G=LUD^$^@lhQaPHGST5hH4Rf-`pXT3(>DP!by z8#r@fA&&=CG16Pv21aKuZq+t78-z=|+-WcA*e=zM$PmqTvF+cFHn_){Rx`0P%ImZR z2%NES=j%D+!hRSFAAE`ZjUf;>CpmKMjjAhv1}z$v*f%FPC>sywz!pVl%L}qC>Dg3R z77?iJPut!O&DYRPScEzUneXk>$$JTaCBTi#(+s|)Avb4e^85hjiF%1#cO#8>*(Nz8 zlgDs0^a5D}ITCv#VCnQ80Ln2l$O=4(F6pweqhysWW5jUs94&$mXA(jf0K;;ZP# z=+p;pTVKcK(anQLHw_-GkrL2RIBt*E!;j;B5E%jODKMHd`}m}0(i{9!tNL!FPsq|@ zv$~8EDdWC_guz-=BhalM0@Vs2Tym=r;a6h}ETfber*yfWb?c+j7NKQp*`Il{dU#p) z7X+3p@S8sDpQ6{Ky7ign8V+7vmwZ40HX4VrgE&?TuV;1|6wRQb6mX$mUmJxehVBa)?$9b>vc7V-)L59>AFg|r zj;bUO0dPxE7coxFMm+1y9Q(kma0rPFpTUlC1ai2S1iSyE?vkDDnf>p+_oqKDu9wF@ zv+Msa{M%j{Kk2fE|sf6YhjfAzEW@soT!9k0ilSKV1J zf5DD=4VNp`Ot#@iI(9^-c0i^=LqoLXx1?EER{HX{3VG!5zK#ty47GzLgp~N+8?~&nJ+LwvHa~!z}@#+(P4&>IlIa?UaFiS{s41G8PO_{xE{wD z`aA0DJ`YKe;u`Q?XJ@ zmBKU<%Jg)>%0Hst9F0j=XVIKN8Vq5 z`|zc6KSz?6q=L>amKMP!k2-__YIF~_XR}xS@3C+FwTON!ymMUxEqt5+X9v~TBQWFR@D$eoN|XOm4D-F)0ezAtj83fu>BGimGb( zN4QJndQG%ZTf&;L@cDmcw!Zhns306cL%?NS`^Jf&2AgTfk=g$oIqo}aEWh&Gb1#U< z!IO(3hXaez`I@j+~`cSO0b`Zy)7hXbFCT<3zQNnP^5)mYjP_CU&| zZE*5Zbfjw;^G7VzpxA0ESM2DBGL+a0Kt;M$-A?&i%$VK{HU)TWAcfxi>Ed{;S^~G( zLx6G9Cux}jkC(imprs_qSt`7%M~EO(nfLOuiJk>JXPdZg_610S&SP=m_teY(3#1RG z4r?iqrWPSH*e*KG2KV%a2@Z1)KFu$u?;wYgd4EFyWl!N-DoCsCLiSWk z_zHL%1|c2}?-A$;5lcsT?}LyEoRYUQ1a^=Nk21Xc?+0Jc-H03^xvJ|w-2nsPLE`Kd zq(QINdGtvKhsJ0-fe3=dqdtheN6ydY5h}qJ#z~O<=rY7sDrehblbgA$I?qzWaPlZ% zx%xcZI+h`ZV3&7Cp+>wrySd=q**owsm@1b|9q;Ge`3cS2$iv7UZ+|?w5b1&E>C{{{ z_fT#oyfBZEKpmr!q;wTZpq>Vv_-MLN?m%)%l`>&kqcKs(B~8t10S5Oh{A)=3 z*2T<)r>=_sYqys#Z>JA~YkO6p4>|vik4;Q2Pkq}aCOXLJB77b-u?#bp(&wh^(oH23 zf<93Po@+APfF;J_(Hr*lCwodi#P|ovsh)_2+wqs1<|kH11W9U@$}_mVHSY#o*l6qg zhIP5vs&d^%9a%Hiy z$XhEpO56sR)c38{%9SW4_QhE!ngumr_TdXWhR$M-nc~vN(Z*|^v=gJ;-fq=xW%vRq zG37KS+SaVVq;5W#mVh~k)(!+$SkIe%)$QhrSWc2TI7=}rB5(}-S_iv8V8y=bZFa-b z1n_`BjcyEq$JKTut?!2F1zY6&(r?6W6#CWW@vw0(ped<49@1Sq7!g1QB^#8X zzf*-MwY736MEPFrWAnlvH^ymc#u70^)1HW}3Jb8atVp1U-mW#N5=zi#pw*4W zSd(G?auVHSc1?Ag3Mo}Mg}1-FtX|$$I}I9#@rrJh*i9y9_qy;)47Fn3cZc|HdGp-} zV!D=E7stc4Jpw#yFchU`QdT&tG0Y9yb{a`JnE@u-^ZEd89XYdXFO$8?_ZEER;ot{$7_WLAId^m{j7b8vk^sN8`^S4T0cssc87n!E(`zbk8|x-^fh|d zqnMdK;qzd9I3dFS<2S|v3({30OzF}K+KkgIB>e3uph5CDv< z;AgW1IS_Zire6o9IH1*+qrfHquEdY{n7|#1{^4s_*C19X*(xTHYYH#ElovD^D-N<| zK|Qvw*X3O#7acHLn)r`#qK1D=+8~#J6O-DXDX|>PC~o7-RgoAAlyL-Sf>lp#$z(%M zn&JE*V^HmI7RLwiSUa4lreX5HD3!O)pT(&{6zW9OF{gq39`_Zf98foiu1+*D6N{OV zrHE-8IUAm_Nm6U`48};NV`-CuH`{7jXzzGaG<`9duhS_;Q$^-8le0LRh>eL;lDQym zuPLdknU*4?@+nC(9i39d2N4sMllx2(w4ebrQayGC9^!0&FNgEMn?3L_5&f&uulPZT z7=5gsT+!qzWlAPrM_159$l(LVK^dPE4w4m3PDWYB0eEFG>GJB|qzpl< zpg$X zX#&Vvh8rYZ8F^g~h=A&Cd$U(HJ31(7NeW7JAMyid5y4qbhvO?yR8k&XfDI%det=A9 zBcB4vEk?Tx*EUtX&AK0E1YRH1)?qVgpbux3&&ylokjIPTiU1)% zAB>^+UIYp3IW=@^)@`;RChLN$QoBJy%vo(<(*w>|7Lkvl;zBv=Pe9Vsz*GRpj4+m5 zBX`;_iM1?E)Iw_X1zMIsN_X32DHv-j!(nUF4@F3(H9r=!Y}(DQbTvsiq_85b+$5HL z3lQS(%)#_BdkN!!4f4bIPDgVdd2Bl!4SL&YVV@b`(vZNZ_P&{Ro@LnzM#~f*Ue}ef z!A9F_>E#Jw3VUJ(Y8o>d^~*-Ptz{@01|~FwopgeXBQE3UNpQy0S9wZV#+IGNa*FU> zXmApqGFX|k6l04?9dKm;Bx)X2M8_XRj;2*d3!B)wtvcG+Hp3YCuoa7*VUsi}_I0Ai zICHUyL&S1Om1R|+diW0!?}t8t{{upH>l!VA@abDSP!>-Ki)I9y_+}vC#LO|PHM?ah z(LfG~L%>$a6dC3au}N5vdTkt{>jQfxT!gd`a=NQ$Is3JF&0;)*K445ooI*s&6lBdI z|FyfRMOTDfOdMS@yaMLH?nbnM4%?D7OCdQS3zWgjnFA>njew963u+3dtaB3*v8^r4 z)9&XSS)|=BfJnk?GBntIc`c(d2>;+i)ZgtX_*&Wgk(WPGjlINnkM%iln&a`A%0g=MIFhjEd_&`i9zV{Rg(USx&DOH63(dd6_djg2C*sT6dGhZ}e= zy$=1o@w@B!uDNdZ~9FWYlAQmj%cKMWlqS7Zyxu~3qkxZ}#9#(YI<;%F(PNIT7Zk#AvEbs?O_LRhSHMra_)%5H zPb!DT%HB6|u{ykt)!`)<%C_i1`RAOFi-B{Hz%f4Xpjgoe$R=ha<8$7fqs8NCg>bMn zsxlebCsC4*BHAm=$jqyIVM2@vb5(Xq#BCXTYwAp{GFpYs-Om+m3nlebCf!mF%SjxM zl@_c(PB!&E90cfDtfNY%xlJf?Y1-5Q)$TKl<(Cjllo8WfH#l$wPG zE6riSxi~NBPxpVpv3^GT(eTxz^- zT-3yX%jTGn43Q78aum)fRRbZsh9N+?NrnJ~=l2lC?ZEy6uC^0^?w7);SOe z7E0;HJmd42xg;!M@f^Jr7Zs+h{)2P-ApLMtDv;x)nYtXM2!q8RfLcL%C!$y0f$=@k zv1RczY>6W?VX8G z$>HypIbqpI>?Zyr_%BGVAV5J+I73`)KO65mHeR#?N5+eU&Txfq2(`o^_SRtyW`l*# z+T+m#BiGv=(i*ZUv>cJDRFNzZ_)z_F?)A%nOu>KVEzHIo7G~oPS2hu%M)k{>w8}js z!xp86i}B6e>z9#4oaLH^-x3+-HW(38+(yNmjjy5L=Jo~1$SK^$tF~rzw5GGo%+%NO zyqr%o-{*uyP)S6CPB;I7QRGjx23fBRRbWj}T%dtzKU<4xEh;RSVmH7&*V;!n()|cF z;cHg??*h9o;wAZox!dt#(kBC704w;aK0Lw6&R`^r{g1ngQ#ilINMb<5ulRvZuMwZ% zyc+QdbJ7oc=hf_lo-kh0%|#{MTxQ9H;((j&^daQ3w`Zr`Jcmp{etRC7EnI%akFB|a z;z&MS>BrVwMcN^st|nT?<%N_$ayh7DYfj@38#^uMNZvzF9GqTr0unNky|+MIiWVUG zY8h8{)^@)lV_3Woa+3z7_G-ecK5CK9<6c6rK)Wly55eb$<*0rb_CZ4}xNLP}!7435 zsuj-ODOq*HXcFU;N!=L^S%2RoW=-6FvdZKzNK6hFyqI)JX9LITHp4I~#eWgr$UXASozxS>Frp(hN}Z(CPyINDz~m%lzgEzP*(BNPF7>kUKK&oK|!yBp3LqR6zK0O|-_9lm(7ZDLj_UXHi zOU~W0`dc#Jl8?(qZ^)R)v-1pfcPy&A<+j>(we&Fu8?k!KtOPSOvU<#6#`kDu#%|=p zk(@Is8$ZBu@f>qkO}zvNe0flF12rT!C%{;E>Mk%)j?ArekdNQv<&J+Fhst4PYMqUV(Um;jU}ZOa z07rtoo)4l4sh*y-L0rt~x1OwiUt>nE7kL{U4mENByW5FW7{6tZ+R^b*gq;9DQ|3aj zeM~77j=BPv8L(&NU65ZeGsx-#G!gG&MqTrthIiyU8B|=+pO4e7`bv}4uX3uzdAVDP zBZ8P2;=6H6+2oT-prPll+1*Yoh*jHz(d}dprc`l8-HEN=tc2*LYZWh2d40od`1-V> zJ6HcQ`3Ao4t#IzMO)e<6@Z9~Ocu_bP#RvBzN8AG-(XdXG!IBzx?lcZ3*$AVR)W8T3 zX^+#+NLVELp4dlUMe!{T$Z1@ujQwPJ^l<}=!DE+m6Q3rkqlNv^l_y4eUN^iI`w`g! z#*-Lvq(GIHnldSSax>^Ao*1omw$kL~gih8HB`^HP_64C;&a?5o}nlM?+&+H zI2Z+t15?8m&CdkT3er-U6o-|tepCnPs$c>$$DWM4=?=Oz+RXrGslF&uj&3@0G^QP; zVAN92wCqzu%cHCsOEMZ`XO);966Y4^`fFgo!k<<8HtR3f ze^%>@B@vU{@3ds@&1LlyEF*fJ=u;M18p|kU*dRc6%u_B=ASD7w(u3gO-Si+J1?)&k z8XAu%JBjo5R7#cUlPK9P;D>A~2J}qE9A*$F;|1lD^b0+s`uA4qPUQ}6pp)9lPFDZW z2_tpj%+hK?Wo0jyR*O0gn*}du1-{RqlafaH*$tfFayujkWIY)OBr}EXrO2vFmk5d+Vg5(R@PF$BP=% zmoXD=;t-rh&IkdSh-FmhBt>vt17OP$5XDi$O6k+3AEf# z7v&AI8F)vMwy3;1Hxm6vuH1nye3Jg5<*n=|D_6+aRGnsbO#-dIe4gHpf5m75=!HW3 zUP|G#&C0w%F2#{%)gu#qLY@*6(^|b68MYhLRs9KS4fhy#N0bN(FajsUj0Ws3V4tdwr9&}48;x$Hk=m`HfQ`|LW5likqjbbPVg<8UnE$^S!`ld; z97JZVvu1Ewjm|>i6sKIMS>Bp!DEjA`@2|^i*7lZ#ry9V{}hfL>ZyoDGfOK$_eKE97*zWC5RYVjBIdfJ2lB9n zs_zH$>dPR2sI=bt6noDuDa7`6G~Rk`4N7o=5bJN)FGGM2N{aMN@vaT4SzbcL*t%hb z*s<;+!aV^~Qc?lv!*RZGCm6yXQR_YB~YYEO9^P8=Zz<1oQ+pM2N~Bx4+x`y-8i_!BZdvMREn!fSY}K*Egc%^ znT@ohp~#*OXi?Eb`F*=*bvRq1%+#m;$X)ZrF=^K*QeX~x!wS8h_oUtwt)x#q!G|z? zD$(L5dr?D+o6;?D4W>^qs_9c&gAeUZDV9JW|0z5%O)QZw{$7y-D#rLAqKa+`i`|N( zyA9p8MG{eYX1)$99~DFHB2=Vl0~{0gCKD>v^DT;fCg@uhl?U$e?hIA<7V?(cULp1V zNj?+1FNt{Xt}qkM1vYI1WNfi8GFob*&cjrlbr33OFP8!2es>eJ5jF?Q|wJ7;}-@tcl5~3X0+8So|0Fun9Jd9 zmm6pEef8c9E2u~9gfoVqnaYOMlf4HV$PH19sI;2ItQMk`cTW zbpu6t6`B!jp-@>|%)C>_4LCHM7^^qr%CXVQ_*2H2v}>9F>aEL5>C&)YX!(fc$raqG z0-#lxpb$1wpniG>Moi?1V4k<6Si`Dt6ueY;x5Xi4_CA^{yKaDQCBRFz%082kM-M>` z13~i#YkOlX7qryz43rC!f5oS11?({pn>f9UZ74(?@dt*C-H-mQfe>7)wE_qWpYLiI zG%gzZlNcPHT5LdiGRQ>bP(me-;0ZWGuu#GP4^QK&;{~w{8x2;UhztThW~GrSog{le z(vLhx8Nk%GG9fhbdQ#IHjG#%@ZJ#p2HaR>1o44mc!LRP;cn^n|=MV6sH{)1Qy@unx zhkr`Vkb%`Sh$OREy(}k?8k}mb`58jOd_RN3t3gRoiKYl%wjD1e>@g5NgQg_EBWH=Q z7i_LRaGXK)(~V8+O+IEQLu^-H*6zkmAGW(mE{fZ$`^W^fn!kReW$gbd1U=tht!|HD z1tqxbjv``mu>GWpd!(p{AhF2dZ2AjiK@91yB&xR=NgE)xIUrJWvBq973tus8VzQA3 zoNW&bc;(sYsk#woZ1Jfw04CX4c}$o%e$mD>FFV(l5mz(9iM5=u@J@D4w~~#r$KOVPm{eX~AS0%pgx~7-*k@O6rRRyrOAwQhVE*7z{9?ar`jW8hBp;1K%P4P5zzeHd2>E@=$<67 z&YM5O^M-Cp>cRPOhUbIU?p-;5{#^hYkI=xo^0YWZL|mNV)8;?I45|9(!A2dpAl(wN z?ZW2gmNfSZhkxcdlluhNWlK)T^8$Z2muplYqGG_rBny+iAQ$1lc{`zeXw0p%IW%U0 z$B_MrDRtDAlpIo@gIy&KapVicWJ*S>dJ{Z56uV<|!Ym5Vmml%_@*^s@*qJ?sP0hyv}X)Gl3p|7PrKM2$ zfHTr2)np5@(yAxD$!Rc|6Uww_#txC4pi7-;$0%drR%`aGg+{xBtKSVg72_Df15#&O6pVeCU*zW0mb0y< zlIn}_A^nheArm(FtBLEF6UV()FVkw6Do4)QjOD#hD~uZn`|}4m4*YqOyc8LFngjlB z2fR+mb_scRgt#RnB!>-EHbVTFaAshI##lbI;684E8Nmmx*#T@#|K?^QCe+v{_G3s` zlM|VQ^M`%ZoaIJe{)dMLP3+3xjI$0)DpTyLW+dTyV@Zwi1sdiO#!0(CXg*q0(aArw zS;?M~!_gwC=q8OlB|nnGbECv zMiJ9n5!UTf!cG=e?4x};qEx9GfCRoWHFdE*-<9oVEW+}c{uBwp0rmg8cn9{{C8UZ8TN9OCbj;g+97h8x;8Z6y$0lE6?#<37~kc3LA@`|r#Ld%}q< z z&sI74y-k~%a_9ai&+|vm0L&gMMbM@#AO%Qog>V2W&@^dqXA246`3i^ZTIl&$e(C_P zg`JO@U1_+PW^759Q?D)-lHgDhIZ2JY`~=TLalc;~C;2z4&O*_xDS|i zfgyLMJs7?*mGzZP-dI6WR7@BfzOiaXOsQQ(^$9rK@Fba6>ZzA=USYfW?eTHrwBtsx zQ=e_+6Z7eH(Y$zxAT-r38_Y##7je<4eq3~_9~YhK$EB8+&l6p_DAAS63COI-iaf(~ zauZaSlHjCr%BpP6SE$Do3MglN3vvIliI<_i8LyC=gS-lqa8uu7@|jU3E#FOHYb7** zWwvNG;^W{gdF~Dcew11@h{qS8zO1N>)?jbV@u^RuidV-dSDN6vHg0nHWWX$mx|n

iO9%8QLy%D{xYJZ8dm+z1z9C;7G%{# zbQsV%0ZRh48lIl`IhheE)p35%a*>S?UQA@8V@hOu&|UrmtpnLD2b+2JP;q*|@A>qaGu> z+)YY9e_sXblY?^Eer0i@ogk0K9Q0_`i-8^;T%af6LfR5|EYK4U z6X+o+W&0DClN6-CDav`G-F3?7pXxHbaQ;44`ucq8?>j|%;W=dW0M_46n-nSYn@G7l z4Irbgoe;SuR|-O51J(;#z0%tE%5ebV9 zeTM+)!0jvZvmNera&ugjD7Rzu(3N*jnbX_QBAmw4=^BeJd+Ie{$ZR%MW=dlj%C+ zAFrOvn;O2)o0?Rf)@(UjGsiye8U0-qbW+)mD=6K z?~5>$iQ831tirjq9sQ+Ilq7611xBD;M*!y9M&mYbg)vlDzS4nOIwNu*gKS;Ra$D7l z$(>f25-hD2%pIJ9-~bI$^?$feFa{A=PhMTh`ePpeQ)EYW2{^?9c}_dk-Jfm>4gjO4&Jw)%FN2M(UT-IY5j+9&$5tB|^CngG&wcr?IDvj*| zzF)nCx}&GUEiF`qA>f$ap#zJ>GEmRquoaZq5FN zLaJxE)|92O5+R8PR{w;e9cd^6{D&u076Sb5@`YB!_tDA;v(49EMk|hzmokT=uo5v- zh!BDZM{Xs<)_g2zE2^WW^w3oZ$M}KXczpsSiuPj}8Prx8Q@3{kBohD>nTcbckMaxo zW;>=cXd1ZFen8uhiRd7P6p=yrQ~PWbXvd;YeYyPqhr7En){!PbD>1@uoIx_a?-=MO zob1DQkHBR@xo__X|99NAG=2;Qt(lEq#T84koU(9Gu@FlxKMMKMgGUUt5x+DFqf8{B|~{e!eQ z$qz2u()4sF&ZZyC2XX?;=F?@~nUB$H24WnLi`BTq(?u#17jYaes#N8I%Jf)t;k8(Cs@R-T^)G*qK+m*;W4;fv}K^%ht(wx!Ua;-$yy8QU2i>|<>mG1 z@$H8VY-R&U>u-?Gc*?h>Q!MAJ!P;LajZt-BlqOw)wgI+Pf2lrPB-+y^tcaWNwpQMrPhpEz($C)nG~^Rf zjgzF!wq)D;MOc2>eCFtRINov_^=|XvB~9&62{hdsz=HNTbS4^ zw+z^<>*fdh1r_WTZDCf-P;b~l4?<{iGa+JEN$^`5g5=dJ(J^2wgg>1jqiTAw^;--K zQHAC=I0vYr^EzED*!s6i!{yjnmQ~Y2&(;iP<7-by^MfOc2zNfRytY-eZparsfRfXL zyLnNz+MThn@$oFja{ze=?}~6EDfS!_V`2oYf@Skr>czG!b5>-(*CpL)-O-l!0HB(* zX#+`d(;+i_qq6zio15?-8ZzK;S$Hq0=wL>u4jyQp*gQI37S`yFBi|$4nsGJywf2d> z)?7PyOpd%b8(wsF2H)1DB`i8SQx+K)AyYF`C~dBKS>2gi^RlD#h#h~~(WA^>Gdgf= zu726kxPr4YA5ZscK)ank^7uujFZ%u#dxwpr0gmcpM<2maMeTSsS=D4#*X5jS4*oZG z6Jffwy#C0M85)QVrD1<<3Lq(x=dR^`$rol)MUd@FU=_GdC zA3B%aRCRlc%27GK)foz{NTZ4Vnmco}cHXu?e(2;-*VKLxIc{bld{HJtfVF;Z=8ZWxnIb2lEfj5~K;XT!SDP`t` zn;K%%I2czpIM6Zur|mvO&@oGxH`Fl%Uaa{Tp`g{d57CII%O~av^*9b2fr+wMm*~vg zx45%8tt^eZC8|j8_~FMzqq%@L3N>LVr^Sv2Mx(J^{XQ7s%)_y(MyX7`HWbj$7HRJj z@-@yUD2xW`+7zQTns39r^xe2Xikot2^m`#Yq&-#Pk>4(^(K*|X(}9$L=8=@I<_jZ< zqn?PzjC?jxdCSww!arxy-o8P?2Mj}jwf6!FY~O%v4lJz(Qq94+{JB3d_YfcuU;w+XsH=9u5ZNW*->cs<0Dkl6ST&ExdAov9s4X%m8&sWtWP zVxgfml-~k?GhwXcTcL|umO0cP%gjxF2FUoyJFsR(T1gq|n8{Qekj2EZu~pPw2R^)+ z9hd2()=zx}v{6xI9@iK%9DyNh$PZkja5lGIE`=A1*a-#3Eyaqd)-e91GUywMIti$O zO3I8e(Ssg+SWGUWNua!syT@HQawI6$_^13@mF#AYO)6M8^`qqFn7 z7s1^{30;v(C|tN}4jYT6oj|+26m@1VX5~n=R(p7}XOq{YkYjjjHoaq*`oTZ!3zR40 zh;q#w7Se)_SbEJy!whh{lmmYp<1AC#OJOd-&Si~Oqc?Of$T%3v@ZlsfN1y{k;X*zZ zOkSz&3#{jNpCB&7-EiP8hRDNS0EGh0S7!=m^-|MX@6RK3rtF}s`a~n^9-oA`qn(e< zcMuI3cxGpCV~7RVU@!=|vd+=<0HEp?kJMu5$Jcy&IITw1BS=Zl{wA80u1A1jjs8*N zPPq4x=ig*Gvv%S&z#Q#t*0F~o?>YD0U1KV#O4w(o5-OxBDX>h6q=dWfOASdXgNh73J|DF^@4dXL=*KG3 zd3?I_l7a+?HcA9U#h_785EEMj1Vy_m0W{1J!{7wbCp;RpjW#OXMDo7B|9`E0&K;86 z3gPqMlUnzjv-cYR^Rx)_mM+@fIt<1w(?$QaSZQBgHJ(xREn#qLusbAWDFc?mJI??g zlP0HpVqoou-0B}g8_Vho#h4J`c%%eZf_%7MIkqAKb_Pk|?LRfBUIQg>;Yj5*kj+wv z7Gu0<7TTtrUeNdYqrLSy#W&`5>vd~kWLycB0Avn*bO*%()z}zChnH9H(*qF>+;n(q z=fmbNWf?HX`&TjVPY670xCjSL+c>dVD%VrtwiZA!Klitqh_s0Z1(@-z=MmBiY)XG4=J!7{bricsxkVOJnoaS*t zu*@bS8x@b#ZgNrOTRu%zw3HurPG7EpzQnxG07KwJiqJo>m47=2wvu$(IT~)h${5)M zfhWxrF+BXI*BjM{qHVGUgiUS_AWI~f4RrlPR=pZ?b%IUW`t%-AhV)4lxZqJQ$d9rBwocGO2;M z5(>!>)rlTM4Re8YI`Ky~=FN!izH^Dv%j}kY`_e*YJS}9fT3W~)e*PqX?ukaQf9jy^ zm&@zGPJ}NedVU^AgBEh0dEfbx?5Z`Ab;Jq;O_L_DQxWi)-`h;xyf|~S4Eu}us{v7r zcQ51?E|c$!`HC_v0fvw_xqd#KAeR^tCB<+tvmBpA=izC`gnx!(eT@0yV=#DlH8jBFIEm^>;A?MSyJ6xHEB{$1lIWWWfU3I7c>* z>FJ-UT7+aGK3X>xm8pkZh``2*ArTHS79yU4&eXja^nk)%46>Ncv^1!b?%!RkG$gJn zM2JKKbZelotqjK@qXX>0O`LzPUPfe1KR^|2Oge0SZ4GXW4U;@BcNm9{x? zY_oi=b4u{>!wEbfkQ3?o4)&*}c3#Xe*`}@F+Rw}LTZ&s3Z%;KiGHP%%xvFqnEAGAc z{M+6RansROpGMx7_4oP52H}yvwD^+2I|nN@z6nHsQkR~^zsI`pYdDXn6S*(1CmBX| zkHm!v_o)N$oQ^~TKVZSdgZqR@kItm2@e!+x{W$ro@&(;WNIzf3S(RdJyyRN(37{=2!?sr|v^1arN;K)PnK3c!^+G zB`FIr))#)lZ~g>xVCs`VnMWvZIP=yO#~f0E4PI+k@9FaIHFmr;%d#qxJB95wVMHR6 zGZ8BCE`2Q)=w105n4sJ{?wB@AQRECDJP9)#QM!)`idem~y<|GBES+Pz5~`>kDMGBw zJC?>6rKcQV)CiWhL+0uoe!lddZgnbsjcgdgEv$Y51dJ-~5YVDp#@&v0Hesb<#8^1D z<&``+-o$j}lFcnva*cFfRU2eoABW>`CPIzJ{=+c=tH$EosM$0Q*m@eA?q=wq00+mO z#4<~IfIt5H6I*6km^2yR2{lp4Rtz1V)!iJw3&3cux{N4ND4K@A zj4$MsA|g1Gs7L;`3|`mXM%auPN;tu~piSJzu$4bb6fr9f%6k=Eq22QkTL_WnDW#SJ z3wB+Eg=Wq1B^oIYxe999#GPePtaO=8@K#NV^P-VaghuB@qw^vHLS|Gxt?Aet6pMR! z#YmvBp^5lK46>wj+$)JQ9uK;VWMX5O;u1*?(q>T)x501}ktu4EV?j7!QY%KXwOd-M zJ>~}|iJV`iAwrA4NZFs3dBkKA30;xAM<>QpHfluJpy^#)v{9&@HuQ>BeESpfrSWWz z(DvM|+YlEWOKZn_JX3uXGZAaJKUzjAX%kf%<@ks$;)PlDXFX{5_)LiJ zigZPWAz8aj(tgTxCE95zUelHo;Zq%X~~f%^%SN`{ZT z`kE+Flzx_~fBWeLL8S#=`a@oZD#U%~a|a{ViTW7Y8y~3Hjg=>12*}|q!3T_zKBSN9 zj}x%lGSV@U@lbdT5Ks)I7BE-H{<3~jQdL>qL_ZM~tRJy7*TQsLswRgL7N^QAPe8G3 zMfzz6pcEBdHY3?FpnBDNdvqHGAS2A09($LuccO=azzIJ06tuggBfC}@mk#|Sr$E`TQvNLS1d z2V^*%tnrVB#qq9K$Kn}~50IB}PmtfptY#5}0_?;lr*x7RgVG6^Vc4ITRm#G=O_VC47qYM<~pt^ONuMPBeF~&I}QTl31 zU?6u0>bQS79Wwe;%7IQ2I@5t~rx^kks%kqq={}RDVh#ZW2PspB+3g~vP+9-B(=dO? z(rBt&z?C(SaEw_>6X$m#0u?-PL5{~(JW-!n#+-huZK2{;M&hknJsNd7kZtL#V7!k`##C;u975j@10RU8~k4l*Uk4q8^`N zKR*XS5F95o^^FlV)AG$22RKQVR-r~T4;SI7o#)bU_`6T@(D-hcnbufn9i*ody7$H@ zHu1K?BSm|cvr6pDkuLJwGIS2{p$Wg%ebjf9@qn%Od~C@of5PdZXIep=z7@p${n z;b`55>;{Q?hq?sIrE4aFJgDV(hqqt79)~UKccFi&WCZf=*D!jE7Xz6ml3iMDl1%7BDM!+ zT`yve7-J^1IzCw_o&zltC$724uB1z6N;K_EMfg?;`Vj?m>7w+dfm#!JU`T8cn3nba z)Z#@XOd`~z)Ait;_vI^tcP26yp$yq5n-pkqKrq+Gjp8X{6i@g#Z&mNjN024oMiX7f z{Pk3sRho7x{P8{L4dKE2B>l;n9Jpcd<-~y>8D#>6kkyQT)mG^e&sU1Ul{&xbOz};< zpN(0Z6;_96JA~7S#nFhx(J1YohO~b*+u(FG zHJpw{ERIGjj%Md*R?Tjh6wMx7Pc(bEqK9T57pBoHcp3T2xG;@RhejLK9Ol9_nrpeB zg60L>6+*KHv95A3Iy=Kf^)P8Evtp8nW(P;70i(<5FB($6fqintkO^x-&l&z3hQ}!0 zJFHKW4mGo%TT3V)3-#s($hvco54ov9NL62+QgK;6>N$F;Wj-+66>3(kB#o;8+S;#v zrM1VoMZP7XAnD7kCz!?0pxmlczPlsmZiN1kn(Arsn~a^|hdw(qtMnljN^pNxU3Lba z!OI~ZAFz+>wPSNeu&apen<#mP!;PBC3FVRDru`w-jdSaw;?7(pTSY2oMJnIOM`^R@ z$ik2zKXO;ai~YyFvG>Gxm`nAiCV`5aBt1;?-M)Xsy)QC#jCUs*&?t6Ry{ngm%CX^P zb_a8b7bsOxTHM65FHC~sWd9kUWeesGt-fEYZhC-ph*NvsSLzVUoE zB_z`u>=+<%adswA&8|ua%p7h8h)y%eWX-$@gm#Pl4ArGFq$w0FmVSz;Te6YYABzu%z#;?3xI+m>X>2_`ZdE_py$mr)C_!+57BOz z8yaU2@Ks1XnHmw<|&;U4r!}ja(k@n`>jI9h$u`e<UX0)+-MBBVCU zrUSSo6F&C`)f>i3OqacH1hL*zhIl7b>t5KXvg8z-1Z`^lmX=so@y_3o?y9zO+3Y zzfx*5oQ`$RQB7q!T`RTZgaFdg&lAimDGc2R}ZG`LUTUB`gYTRhI?orWqWBTJh_jC>UYvm zfuzf5C_H(HhQgDFX(&8-Ee(YyUy$ZXvX}Is3y?oUKFWC)j{WAmIwZ#-Il%91|NNi! zr)i3VAM31ESmKFoVKLNUtwyk<6tef&bd@;Bp&*&#pxl}Y1o5YmS2`{YV;OSV#w)tC zGXIWzk4olv-CNH`?@=(PNV0GYGmI};B(keYW*0MeY6j}%7m|dPA-YoIj;?X}OOe+t z=jDCU<*x>cjSH1BS>X49afA;^Grje|Y{pf?(#(x#!OB6p!O5l!_hpAMINg^?9pIWA z>P}u04cI7Je6sK5sbnyuY4IYL>-g158EIemRv?{Rmr9C{+LH32*)KLIdfb?!TSK3c zaTo}d;{dC0>o`azsaNFYI;b;^ATY0KpwZ}1a!VF`yDQ5A7YEu!T;?c7wFJD_S{4sc z=NfGemM}J}&{^kbUyouu*24X9H24fvT-_=<$bRN;N)H>44$Qy@eK>D$H|hcav{s(* zYRE8xkWYizpf z!zvX8_LL0e_mh!1fyo`afB`NBft!XP#M&;xO%qCGzj9L)#-3=n`hYBEVFG8EUaR$B zp0jI69_A7w(pp<9wlGd%>M}%AefF<8KKfYVt7-dC0y1l}kOWMT;k~%;O%0?6H(Se# zUsk`TwX{y0dLrIH7^SRBd9vx?#7RKLuM=u(fC>LCU?JM5t!$G?`dYkHVR!AOQe1de zFu_4bB~N+;B-3#xJAxYQlh}-IlGWu?O1ULqvPwQ(!xv+5p{=n6q`$A5#CLy9JLNue zg8T5^M_If@gRaHm3iO|{lSV8-Y_!d|hHLs&tSPe|A@ota7htCr_R>-~mQ4wL$^n#Dl%rw-Xp2#6ifMf+hB&q2JNQcx zN4vNSt%^a8r$D`zPzVU!qfb`q?+K}dT&j^gSk%%Q2!hvLlokQTXk%b=s>K60mqmSf zvItMq1QyW{(I^XWevea+jmR84K53th-dPOevRhDKBJHU~kF)_UV(GQSwn;8&ui#Bf zXm9a7OJAu8C9;VyvcKx+o)bM75q)fqlx&#F&2wb(<%C?f%kU;^*P01UiU!W{gJ!9U zy*nwu&rgneqymb1^A5(_;AlJ*%?((xm80Iq<`~-R5g?H?E}Kcs)}wW>m!3k=EZxKu zR$CokN)DK|@g{;I#iIHXQI8yt&ck=bX$E~)uU8aJjLpHsDCqFn1NPt}$5%+6)Y)P{ zihq+d%f$F{SS?Ck0oVZ%IS=)=NI6dYNlMP6+aqId=iuf8gaU;tN85oBwTO^(I+4)E zaVUKogkpo}PIwkk>uI1sl%$I_AC@NAfPL>&xrZl;3VuTDTh61`fPF1HW=p;FhaFn1 zrWxw$L^(zqJ2H3F8_YTYkntDfA4wN6gOPJCAbbFtjiB*lXhno zv+s@HLKf7)k+6%$Va2Jtu(>Xe0y|+7tzC7hNnD!aP{Ar7zA5k>S2743H(V42uOyx^ z&ir>6tUDR|@!gqdj82Dtf{l5703=3l|ll--ReycWy)_;li5aAVsI*r=hZh zU*158sDE!oeI<~5t8TxvsUBdph<;&A4-x8Y;sQ;(-ch`^bgKBF9OWoyH<`)T3pj@J zpF810s)i1L=7YZ|pD@^1{@M{s*Kq)0Qh`yyOnFu#8J|X;e;TJB9KT%NKpEnf=G5mnLN*~J@NUPLcMh#P{nb$^)jPb!cj@^91q z1wHhP(4ia2;F*y`+GZT*s$Ev7&b|fBS-w6*d=pWL-}gjJOgt-)?vCkVW@Tu{M6T5s z?Uv))QYFsBvsIM1^YD9douNCtXx6|(NOr=EB4uhsICi8%1OPpd>6|I#8Kx-g31JhV zJ-oH)-V?KkVl8cMg}#2wWK2Mr(H66%GbmcH3hzd?c=!kAg4Qu&)($hR%wV5HDPgE) zO2y4d|3Ie#%q1ez;{J;#9o0I-k^hrXTVjnglEga;r5x%lrP?!-dJG@_R;$M?f2-14 zif8h-#z99Ks}6p86bJ;+5$z$d*t&M;(+jmJor z3Me`cXI&e&{e;74zFfwrjvBDLjlQu(U#7C1m#Jty)IeOhXAc@qgQ51!7Cplquj$u_ z@yG%)SfuqQ9aeMuwB{BiQlhrTTVOD-O)u_YMzm2;`%Q>&ydvUoJkjB6@FbkI9#M38-M&52)wwfjk z;h()2qoh^eZv#zI0^5I^F6LHJqK{9w;K!thU~rKXut|-4?=)Za4FU}>fVIovTJUK{+S?3Ql$5;xsyY+bP@NNbZ$Rdl5#Tly(Zs+}aSMQygt zD6M{5s@IsSSsezGkj+~(X|`e!42c|69G!4M!{e{I3gd7U-I8Rb*}N1P0|Sb> zOZ`eWqZhupguQ9VeV0p9bUq&QQp0;6Qt{JBZ;3SXO+s87Uu>rb%7$Zf}eq!w0sntVPh91(YWF;H{Zq8#1q@b8r%wjfW z&V%X8oVT9hb2J$DcG6(n+f9R4OvUnMm4*6il2g%xKbxBw)4z(Bva4kmCH~ zei_e9`K>-Rk>?u)VuwfsUdJqR-r%i41sRi3%@LXB8q-TAStjV^X7TEsC8BmDWfqDp ziw+hU>iFdZl4#M`d?WUL2@R)MkXA^rF3-lw04#m1!EkGj%ztQ{3_gZ*0veEA z68Vh@cHyzlO^~BDm7gf{B`*qM@FL29Z^wtg!g?p94JIaEm?Z777gG^k$j5ty;oxpE zx+SE|g|x*4(iZ**w1ErRzj}+H#G6SZRY==CX zxj+Hs+rl*m-^S@eOC%eMA%W(J)P}!d1#-@Lu;3S!uruH@MXGH zd12lUvsYqf;3IMM*rK=)6<-CEOAy_cjFFG}q+p4Qpbil{%?G~8VNftfD(#<6!*wrP zV5}Wc4p^lME>=ox-!Pihi!KXj=hp3jpz1h~a;HMl>o)h{Vr^FRXd(&N^Qn_k%mLk6Zot$94ajFxl+Pe z{k2h*B~mil$jIIx(F?sJsF0q(&Z2#)fZk-M4f`@Cr;d5+`L%7X5?0Df+}r#711;l=G`zjQs#ZFFOo}wWa z!s|>*im{O6b+lAcM4YgvdPX->h?MJt2%6taA*w!kGldKdc*muTCL-#wj+!&!$-0rE zlj0qhxOYXeNQKJ82XRNU9a>&vo$VJ@YtKm7cqqzT#6KFi+hr6n6w)Omz+|1R@XfZu zHog&95KL`#bY>WX*vmxmkiRbDV}8&HQwV*H~gsERyC7xob8uX-vtfP)lpg&_o5>5h1 z;=KEjXpgImWmdfhM(N0kg9tZG?%|g>nUTfpZ=#s(1IKK^mrK4Ld}3WWiyyYQ*?Py) z7hl>pj+Wx&vr%Re3<@)!r0LNp!GuOeE*g1KXxgG?R+n7~CVZ&`6B^}E((Fd4qfvqh zjS@^~)*#J|^F=x;-=~5v=DO)id}A|UFWi1a1R{J%R@I99Rjg{zC4Q6~Tla99Rv*-# zdWIh{BFOM9a+5KuzAk}4&|_vLfwR{%9XZVj#o`_dnZoY=hS#~NXU)W51EK`kfB?om z-V~(!fQ+_JqxmrVB<;-(F#2X((I*+e{9jHw{bZTtJdk~wIiTi~3_xmS#hSLe;akrq z>z&q|W07I*%wgsl2n*sn`r;Pv zGX2XNAmz;5RF)UIlZ6fBt`(VuI-(31D`lM0Z7P<43eC}X{KR(+)(ZV#LlxbR0M8C;RX}6B{!Pfu0P^sD9a{cm!e4H@0`a- z>lXLEn#`nii#zUEJn_x)HvZas$L;*v=ktjZU!T`ETlDv%z1wcr5B8Ua(w}-jH=_`s z%}3r}-0|w$Z@=9*S>S$?L9_1r*uZtNgLY=SLo$e1h0Fg>cnZGx+zi5jaRx&>g9gKn z1LU6)NP1pb)qQ;K)h9|!cOB$8a7;&Kk2EvYC#D#>cYawl)TrUXX4Ai&9Y~%aF=o?s z`)xwpoP*_aHOGY{FHCo(L^*VB@WcFY0Euuz^WZMt4@#soKdJf|UM_e7YLEwqL!S^9 z3CzUZ*%@$+CxjLaHm7Zb7|y_;u8LwkK#1x<$CR=VbHP&6zq}bnY0DC=!tecF7g;Nk zuK84>bUqAZWSCAAe@;w68q3Dz8Ayj!8%ygNSts zV$a-E^rv=gQFoeKc5MA5&*gHDGR+=$r_FV+Sa*SF!Ri>IyFj#{R+i$pVeOCnMA(Co zCFhWt-vFB%O^hm9ex7iAUza!nQNp z%m%w^L7%3Sg}?cL`iz$6BpUJxcyU_VUb$T8p4G@~uIV9S>o3k2=#bTnpdnwiqabX~ z*hIE}Hs@qAxqC26Of$VqIBk{yK@nkK`usBfLH6Siy6k(}^B!JHn68_$r(Dp$9KDL5 zp(_{oK?Vcmc@S!0&S@bgB7o<4V2qbV8`p|()UJua3+dOXOnIIMehEokQxd**(!gVP z(^#Izl;wG};)-M(q^`FVYpmRiydmO5=)jX%tCPV2gWqnMUl7BU4~xd4zjug|O3v<} zya$Xj3f#x^wUv1yB^~10EEqG-vJnJ6ggZ~@3bSMpN%sNq2GgnjetN{qNCOt{QKRRpIH>bun1nKr>w z%PDb4a)eEzmis6V^D0ciHygE7+8a!`)3T9H`CT^(+s zW3Zz9*imL!hMkJtPXgqW?SGg2bXy9{2H=qy1^rLW^!J&vKK;G6I7vGGh{TVXS|NhX z;5r^58s*>eh=f#njP7CeQ0FevkkGEayF7p;{_(~T=b;m7(4dvtvl@_h=|`PuKv;n< z1Ohg>5^SUXwg{V~U5#dc17}h2XfICZq%v{+P69deM^E5dVn~8~!*UP+P=NvaWy2+mMj^m72V^;2m-A$zeg_GXTONI%$% zA~V=9t}szU*j*eYItyBmh_aXde9AiT66AnFoXI`|zc2O+ptRy}@~^2uLf9E0nh&j_ z)IJSK0=i6NqZX~a;IWbmg>WVJ&XzcM6eLKw{(vDL8y41Af6|redkO?1t=hANeklj3 zZQ!x~yPB#FV`XxW8^M{biU~#ao??U*xh3TJGD3ceN;=2#-c|V81o;r)K)7ini3)I_ zwKUwk^yGxQ)YYK_cy})Z1!Cwp!HvB) zVCxe?i9VXysI1X5{peI>%{(Nd-?40lifYGY^>O} z$)b5uI*?!7vO%K|LYf*~mPUDCH1bo?$WKMH25BPRKdIe`{BW-Lr|Q*^4_Nbo7U zb~3X%?Cp_kHWh9T|3NG4b8#cyFK&BaKDN|>9435$&r6p%;;xtt*{I|{Bton+2^aK8 zU0em*lK7^G5=J+Ra5wz?`!NWL17QC+-gK@+n(19}yqOlECk#VTK8$r3z~N0IdkhWw zG1Cn}x}Mg3LwQmmaJ!>9#REf1M)SQ|>WD?i-2Hx(f*2#isk;kjLRSz9wnkR*O!j3z zVWqw?#O~@dTjTuV2`NwmXObuh?hC(=OeNytqLv7YZm)P0{FpinE=QI0j_M{e01>Q; zM?vM40*;GF(mUD|(tE9eGa8l<@ z5rf$7U3@IRt?tldw=MQweLD}?9UxZcR05W+s>f`b$(=ZN!OuWSGda;MD^`II17PWn`5#Cq3mQLGAU!5RV z4e^p&!celF$RQX?kN9DZQj~>7@fCWnLU@=zoDG8-Zo~}2WzWHkF3C7^`*2C7KnT4a z`T;tIqQNECkn^MFe}|eGdG@*ptRCLGO7cxj0NQ%>vVD}(oo3*i5gdk*@&WD{nXH_H zN*T2IX+QO>SSrejn6D7@)O7l2Yk&e{H56HH%MW;3&4c+$Np?a^Gy=$08QoN)%n2IT z?~@#8LY}dW#}#!uBrBN+Sm%pmSE9q*OMPC+k!HEj!k!+DWbnw-tZ|418nFc@M3X0k z1_U^<6S2)UMVYX;c3nv_(fP_0;7>-OHp4F-X}lloQ`SZvSj9%O>g8i=H(^Qsj+P1e zreSnf^Np{)TmUeOIzM@6Le4kYlAYoi`JQpgj=jHL!_a)c@xWUlp5s^iGKg^5XtF#E z8;;HFP~6-yZkcrv_iSQs9|K)3ds;4^eB-xgCk=#lW#>cJpho}$Q~@`uGVdRMZMo^V{-sE3>kmABk#rIU)@YDaydY6nPB)Yi z*9n+*)=f|BkW41+?kFFYp-yd+6lQH?RMgbOS`1Jyf+gY(+BfA;R&cN!?DnP(x%x&I$0R%i;6DW_3K28*XkzSAI{>}CW2)$5gEgu*w(@Kr+X52Y zJ5w~c2N+!6Fu2F%DOnx8%xwWQvIWqHYpj5er3R#^_B&2Y1E}ng=_0$bc{B_ZPX6zB zF1J2=vCV?3eOIJcWZ#3{O|f%Dt$|TI@eX3*^q>xhMkXF8f3!lNfqrRSZtHJ0f$R6Q@Q3nwJ|0Vb#K_Jw&LNogWjL+5&uV>o*6tC?$gZ_~Ns_K^gp&KxLzsJM|0UOTli zFMZW(k6Yo}d~C97fT_#xJI0^8CIS<24g&K?cC-=K%_-<#AIIvIhm*SQfPX1n$a3BW z%Ohsoh)(ImBHTWCQE5_v6z*sjm6qvHK)76!nvb;!1FFdKEWd z_|OA-7#IP8(1T?lkpN`rC&-146%ZdpABtS1gqS;hcIhoQi%1;E!LKppU~Y+_U@wvB z3OXrC-3N20{kHI#*F!+7pK8r+i6|`Fgy@j}@K-og3CQAJD9J75S+WsVPu%)|_h};C zMee6?(iZ>$2df>bS-sN(ksKqw<(Mi=2sRmXyUP_bx?DzZM~c>y zRd)|!5BiF-C4*n@u8ad%RS|BH(6Da}oIFC<*}9IF`&qy=1Fw#kkFNfXY7+@tOhA=2 zd8x@BW@#q-zxrf%;=<-OS!xrs$61C10acg|Anr1|zkU)Txw=Z!m-YB%?=iAcS%eE+ z0=*S63Uq^Q8UxD1Cfynud1x9}xUz$Ku}zCHBn4Qno5J6{IbuwNet(A!4T8g0eb~s; z{73h>YMK{NTPVM3P1nt;8-SW>d$%^WUlqR zl)n>Gj#>s6z95@ECH#@;CgF(rsNfi%>Z}CT3CWb`SaDn$0qfLx#%lS5DyA=GKBiH2 zIgKtap>aS~3|z>M3IaR>WGwlvBA#-MuOc#_M%CL(q_)gS9Z)%wd$;)9@xTM25>fUaM_$<42yiD1G6IfW z*$d)HV>ITZZ)HsdrGe%6;vs5lVN;5ig7&6(sRU3-g!{u) z47L;0&vXw{L6+VX)?ufgM2}JR0G*%6xF1={5wm-k7I%;VgEZ$yj0q$6!xJt_0VybK zw8L(rr2G}zP85wCO{k5?;ZkDkFVq>n6Sj)EVC()O^~kZM!YjghVk$*ZbuJU2VvkYC z4D7}er)TYih<-8ZP*y)yFt4$al8+B_f0Lo!=md!viBG={8OGPp3I`K8Y(&#&F*fGM zN)=B_nJlN~U1ROCYM9pr&|HNwe6u|Dy22Qv+AEaTz|W$;(KXW!!a+wHKNRQ5U;q*G zMNMUr;LPX~{#0jX)()O(jLJ23l0kED$8H_5+w7@mN_aEbah_ouK?CfUXU#xK`eibE z00(=eV#@+##)K-exO9?$t^6mboqwa4v3R0D8t1D+)I2#G!B+dGpXx-h!U=05Ypn!M zC@_sJ&;&1*A8>&A|J+j+Awxjm)Ni~pYcKS6RO0?zE z9>48lF9`yC+UK`@Eck67m-%fUhq%*%-wvnSKAto{FxEE*&K8a|mEcU%oNmIphmH!IG5la{TF4!lBL z4p^bi+_gyNMl-7tCpmCb+@|{)scVnS z+BIjqTd~}w3^~(@2E)AxDvg+7{jw8ua+Iwnid`L*VZ(uD9m?+UWfveQd4#W)-jhOf zwGqkwlH%H6UW>zoO_GAQ;)WIWwgPS62i2-;Y~6m;?!h z|5jX)+P>)m?fA_o(~dPB?j_knZ2W#xcbz;aB~cpzdNhQ5T){@r)H7Qx0HjZm0IXsC zdiJ0slF7IdE+KG>(mb<#U!FvR#32MF%uKTTc)MS0DUeVP^&7{pXAf|HgR`8us07Y4 zgMRhfc~SvesXTUy1R6Wl?zZc9jjxaIDT>Q&TmT8XIP-1b)*#3U=&X^AN}H$ZK<{DT zjd*#QzOK0#$dp)nL*9gNN>MRG1ypKdlrXW`HbzOV6a4oykfH>f*BR=D?C>&B>en0D zXcHblGVpOmm?uC1gAO(8`2@ytcf(=(TNBfM9&M2N=$4xeGQB`Cd6^}>>v;G+pcU|P@S7?GMx4)+T={; z#k?@Qkv$)V`tq%^I`J&dWbdcpvV!g6J@f^UA=gG5(}{#b=dqV$a6PqG#uJ$~IFhnn zM|6*mp9t4C^UIZctMivSka4q0XTc9pz{iw0E|CC(SpfbtoP035EBF!CrlGd6skPYk z#4+>r7QP0M+3Q&43*d_x&uN#9#+B_w(>K{?WiWq%v48`H7Z+hbqhujKWdcUV3hi9Hx5mMv0z6`xb;7nF@Mv{! z+XXI+*rGGic`9~-P_J#Aj84`MW*fh1TcB#T+x%T~tTaMXWppcGfOEPeJ5!IIU+$=0 zNn$UzkSJhicXdBH>SjJL{T<=4A7BU_GeAP&U&?dth`XJx(-~B+q_n#vEC{gz&8D3i z2$Xzol1=HXZVxJ6e9b}8m%kN>$#`Lc)c9rPX&!x3a@TmB2cit}hdW^G0uO`>nb>um zhZ%{c-AH5?cqm_t2(g-m2(j%nM2PL6A&+(^4aJFcod?BpVD*1sX2! zxQvDiJanB07kC^_qSJ$^jL|QwDmy>1CDx2U%4;pXzBk6oZHQ89Gr^`nGx>Fh!rxsN zSDUWlWM64T1m_&F``|=yyM!j$*`~PkKE)w{_H;xL>16-x(IZp{F+qN#J=Qy2RErvk zFB-ll+4LY0@yqM-JF|v}P)fViywgcDqf415#vQgA=xr&Zr}#W&0|)qtHUqaOg2;3@ zAYp}N@b_n)FgBMEn{1RR(q;|yTa|UplQMqLDC?L;S;sVr&81m`DwJ-eG9?Flqy$t_ z!ggh+a}tStTY9lL6Dp!&BjjF_WSx7?ev@B7p_SQi%fZpO-Vh?!79`GTcuZ3g=G=A$ zR>1WX7y(r4cqVAAxfVAb#IRftWGWKle-HNa`0|IDYjnWaUv3s0noKA~b*B0kl=}o* z6ooJ7Lx4twUpe<2M77dTC|!xs_<*5O*CdPZ)*Yl|Qb$k3QoXyfGuVKcD{(*qTRhEP zRqxDkGuk&4W6Q$ZxnfN}^Pv-JQnF2(Doa*cmj@eVpJ2TA_>yhrlvMCy>HA2z8Wr2y zrpka)E{y}g8qK|+ckBfVI*l7ojwjEnVnU|Fph5ycxXfBvac0}xXqOuosQD*Il68yL zguY1eI%$p^2#d+koKQIxgvdtdLUQ&%(&hMo&}671Ub-ejk}D_B6xElcM6w}9Ho|wt z$TU$$g$#CXl+D<$zlKpE&`PYwq=PWZJN^}T<8#hWR$rLnw82bI+KJ}{iP$gJX<{?; ztUg?DxDmT4sp5yr(sWlYs*?xZ8!g zDoe+U1`_VTYR6-wIHt;AWdzH3&BPbErcivb@bpK} zf0Y30U+F%HX$Y7S0i}WTsgd=VMs$KkCIT9&H$0imFY+~q_o?mNDj=*dAmJtB{U|THR_CP7Jz=%uMMC2N# zb;Acxh^MT_sMyA^j6|=s+KJcPUGpYeO6#YzJYim#ti8fJ!z2St86EhRA~q3AOw_Yj zgQdY!gWsCY2XX*H_RP4b)1ls*{IbND@5)N?YPLeWnkA+UWB}_^eET3T_Ya^>WCxG!x2oxUKFApn zJgou9k|y6A!#6|@lFSEQD8;mxdO@Sf%Cy28LboonQ0BjaZ*ZHyh0wgK|5Osp&Fx>h zAOf1x1xI`M<}aVkcpS1s&$X&FKyEmFe!-}Xq@NA^&ab%G2H;U8DSo@$Z$c;6i+!^- zb772j3~QP1m^#z8TP(Zpm@R0~kd$ae;Y3q?))RBIL9JYs7FqZ*#WCACSlZad4_=!v7efqlWoAW+C zYaw3T+{umhR``Uo8IoD`W)g{AdQBxr>Wb*cDFmjKB+>Vh!nrauj}b+$SJR@oPL5#zVVH@>0 z?x6?mOVpmZ@|#n_Fp2gI>2U2Ct9Q?SXR|S_^u>OY$J$?ZR!fODW3>X@*Fz=!?c^Rx z0wld78J;1=AeW>yL%u|gqrQs1gl@SJpNeJ; zP&6B5rRn_*4ut(LqcBWQk!RV#19buO#Lsif3JS1f1NE%`+p|VXhjZOd zr<3KS=#T})j)SI`Al_4eS!Uq1C^;9Kk#sY7vA7^ltsuL)hs&2I#gI z2SSlVf#52=jAhm(y@b*QX;#2ER%`~IuD_@Psp+|_8at-0!k2TV)cRqV(wuCub0z@e zY1P6B;+X5!736G=Gekqc9H0-d_`1+v!1?<{P!9PbV>B0 z#>S2*ea473@(CCVqc$6bTR-7JLNx>}p&>^h^MEDIZl}?~c1^v&L1j9Jt}Q2`;Y9v2 zus1DkXm;6wqdjKS)zBVNA+%?Fp*^Ct#>0vtu^C1uw8to-xxlF1!p+QN$_D#u8fLwn zW=2{V@zB!JxOrN3SuV$xU6w<|3z0~|KCL!ngLkizTQU)NVzHl@%&8&@G|Kj%Spy!Y zv}hRfX$mYA9D$ylCE+Jx`PEy{xyCqIyA`$W00MxmaC`!xs=M@XOZIs<#`riW@$dxR zRCmCG98jK0?w*~28Ag`|fDP{H=QGQl{5ww}F~P)Dm0v_+6VIg)&!v$eltw(4W(~U> zVa#Q{zGNsJl~W?WpNyav_W099+Tp~$3eyg@DU_Oxwi}00V|ZJJF%IoT(i`~mdi`^Q zakh;|&8)?n6dldN7qg>tMNX}IIjpG47*K@xPf8R93yO2`(0=O25;n?OAmQATdtpA) z^pMlcy(Klu0=cJY6``TCCI?@#DD9N%Py8+ISH0H-*X=gbuv~Z(4VezEv(;0Q-p9i< z)W+684`;{ZM`J!cSjX|EcWI7$JoYZzWM9sGM1$}V@DCAJh-ViX*Et7jCib{2bEguI zai2)(ObImG262idXGi_3Lu~ul;;67JJuopRs_MYe>8Vj^UIW?KU!X1@ z&lI>Qkx@J$wWw8)ulmIt=pf!LmFIww7^ji7_&V$>5i6$JiqJYhy*d*f`&UIhF?*E^ z+oCDR5rswTzKYmt_BujLi#-g9=KDs_$??ZLg|Gp_yi=Fov@WGwv2JL#_Jvp$Z2`tk z*oQhhrphGBaO+zu$;+; zAAcyf5QLV2C8`T`6WQyVYVoaFOUwXhMiZrEm;n$$QlNsJQ3Tko^3aVQs-TdF>`r4T zU(QM26CV|Jfmox6a?*s(pUs4a+5%IictCt)U-d@?@&JFqIi`RakT0fE)a2(v(mu<0D}{~l~i%>m@3MtJ<4LJs~T|>8i|=kKiFOuGiek6 zMWYHXG|JkdkwQWv;z%Pe5sk!5nmwXS%W3k`klAPz)$Z(7tV_gDI~makEf_k+sND69 zOoLRgTT+Nr%b&x#t(9uKK%9=L5UL3W^3S-jYyk0%4M?c&_~@p(8w5@k220jrf}Y86B-}^9~YD8Z^bYUwS)o!dxP+?U(3U% ze+}sb#Kt0_01%~(JcezCYJ%YvM5AL8g;OS~#fl*Fh;FD{tzcWzrv|DZCts%2qduB5 zjazz-gR#*0Zg^9EfOqO;!6cakBYgV-@f)DVSl0AK4EpsPqWQ|_DXg0?Io9$BKlWYq z0RKK5AF4LnClcPYJHfAS8XDgvnf7AZClkL0P|4ya%g$^|*}>xtyDJgp<@U$K0$Rdg zd&zOC2c54e1Q>hy428=uqyP0$v*$%w z#;TlTx}NzIXiTOv-EU8#Gkc>jcjqdJOcRO1Y)UqQXPRI!ApPyk(4}1F~M3w4fASQWsdp#?fH_ z+RuQ^W1CL_q%o!IMl>W%v?IFa6IUDU`je|Yp*1X70l@BRj^=S}BBm@tIiq|$_lu`Z z+u?cFYy9~bOSWXAuGg%P+}c@rq!ll)x9o%XE0~tVK|TAxYV-1-As;7(4YlJG;K`2S z4x(=Lxhj&Ntr3}ig?ql6P)_~yg;%GAhJ z)f+@@;Xte9K&~ag8ALx}Q4P_8@F|gPvEhZb_Jl9$X{xF5hM6_8)+gqvmTz(@Jaw&w z-ea<~fB@EG81Jbm)7AG&CrF@HPkE+^HVv>4^Pj7ytN#`Lu76bw7em@kg#RW+7V%NB zuMJ|=UhlWn2JyL8Ct9i3;TUnx(H%|=KjG)G{%3?cTpad>=R)!?I)G6=JXinLb3`#W zU;{NF?WQr6`g^;k4{c=RfKOLP^BhLNvccusn3oQ4&j zaJ={NhUzF{eoK+C?%sefMFWLuy;kdy-2EK+;MQV}%LR7E04 z^RYP;)$`e#mQd7W`V@oqNyq+P_$P@m^Ee#7{ukU~SY5>{Eitg|^u>7yU5^9fS+;$F z=VBb4B{{L}xt*dkslvlm$--BG7Tupbq6@w1 z7pK5RAT3yjgw^o|m6lrCo|z^6@%9YUjYo@ddzGKjlBvWyQEVB}gdyV^o||}VcJYV= zut4GWWpx#8W0Ww}sFi86V|YDd?6!Zx;@Mk*AI zVkl@#-m%)zOXZ!xM^>TjYb?9Nxgzvk!IAsz9ERwROXkZ|J1JZWNB}`A$o#3t-6b|< zb)E;mI+gdAD=!oIgk!<2d~J==oNF;N(qaULZm<&= zDMW;?_BE)6IWP?6-q}EREvsQCI|9phNVn7>0QUPwWup0@TG`Tk^fasR#^a zME6*p7KYM=a%m`#?0&uQhoa_v2uqnnLQLmaU4+hs5*#P)9Yn-%4xp^V|ARLo15k>( zlc6?xuA@M9B_0w1SfDY{&%FfqHpO9mr$|dR5-Bn1Vm!h$)ES4UXff?flTBUI{J#=s zXhlqy2YZ3+mg-d+7V zK@KdEPE-L8n=IQVz-^&1ssQOlxlMRtiIRgq$uXq}b-CK1TmX791)bDclqawxnDPfF zSJi3&wXTWVP)PdC$MCIic+%MUFi=?#gFnc(ZaldsmjSV(5Xic)oMI44FSFOY@z`UJ z-EvIFZ{`l`dLx&Lnwy)oz&WqxNsv-LXV9kxe5&8qz_P7rCglFQ$%Ma$>1Y0~h(pMT zPkTq6v64KT=qmywyDYQ+J$&mgk3h)q*gThesO=G}B29eB1L0p!qsN@)>aF3M^LoV8 z+E={%3Q6X%uOBSEulN7xmDblsdN}U&;F1TzBlt1t>yhgZZw;@XSI`tYpplQDdf^}y39b_8_ zi6?t$W!g^l74_39zVy@Lf2sxHx$JAK2P>Mzc}f_eF{EQ?kS-xsx=QrB02B-@-17?SeJOi4`!pXT&PR_ zz-3S@=>Lwd!nU3OT!?}1HifvbSES`2g#XnS-t`7I=7)d0|CfG#O3_F6(_M|FLGfGm z1Yh&V*B<%lw?fHgb+t9PGc{Lcg}f2s7DDT=gTw5E`*_>CrA`A;Bf48QWDIUl1refu zl|Sjo3flo4&C=h|Orf^Q8NTFbxXFU7d4<5WyI^Vp=+OCLo<>v_Gc^0E5Si!y_WqxK zLk~I<{_+d&diT^p6(jwtum1j9^_RBfpwf}ThnW^ZK>P-A=^YDS`}1GHshSPKhqPMR z8#PI$OBM@D%4ooDMM<-USk|CCNwIzHj**aW6l<*dDU8G~A&jJn^?BDIDWoz{1|Fpn z{c#fP$|#BE9NV!0Y!|3iuU3rn7$cNDEJOf;v}IsGx!)PM+xX>`F}7p}1Jn6s1;9s4 zuPG^dhd{j)t!3veOa$mx{@zbFOiL7oSTXecKI$fG?Id*1Nz39R{nixB? zkK}4TEs*0)a~WyZG>6Esra4TGH_f%=Rnxp+LBb*)4X(ax|%gW)4XE{bo^mV zE_0{?!gPk66aRe&h7z@JgB-~j;}JK~5Wqo2O&x58qU^h}hu~lb2)%LERnI$kR)3*D zlL(!lq(`j;i`a2bKT$Lhhdb3hT*W#D&1DZeM}g)G1|439Ozs`|5%F7#b0L-{_Jt^h zZu{e0EttTWbef5%5u`~1NJ$%oj!i}pr8$jZ{#6RziC|9_#YEW6{$_)Ddf{M-u!a8N z(Aig$Txj<%SB(lo=oPOBLFQYWnns{`C~Ui^c#pRJ%!`Pz zp*`!Og1B`%ij&q}ntzB^p6idR<@MiGJBLt9e-~la<&z)DCE0^~2){#LpSNdJl&~Q; z@6X+yG;ayhULg1nx~w+ZrnF-+wp8O`U&lD#BJMQGY-U(Yx^NI>h_=V51yEuxXN`s?_nWU@V;Fz3)k}C0V z?-v9zuUkhO##$R&{|Fl1{#lqm&#u#O`>KC4J{!#joYE{v3VRR5XL{8S!K#|-__FC6 z#KcLr?yUK!TV>(HuVM*IG%8n~YU^e@?a8hTH`!6^a%?Ib&J{)GjEc>T>AK;^Uxg?@ zPf-Q)JH~v;Je6)EertRx+R@^89NCZy2Mx9iHym|picC3z_&K_vZC$;o`Y|DCw6SrU z@L;q)vd#7EnQcqFLU}%3LQLv4@KjgTZwO;~7$nv`!~=hhwN@N|qzYFy717m>YgKYR zT3{KMG+Kd#>Q0iMEYeJQq$dOhCnmtaO>P9yv%15jhFg)_I+W#Ro7SpU&XH`zaX?zTD2fT{w~GUxYN^P^kkvg+5{8+`pI zqSo1Lojo`-S|9S!bh%I~QNCHvx6=|LNuCWG`O$p!n8q(Eu49@&*AFtyhnc1u*XN_r zZe95MpCn+7gcID9zVk+x#%IRW7A6co#IAD71)IEnSJq>wW}4#bEkSaceWf0W--UO5 zCJP_>3~LlEpWaIRCL}EbU>#!Y)?lR4^`!G>(ASqSg?M`~0VtD)Z?a}KBC!amz+;&BPme59@sq)`OXM^oH^sq4m+s(+I$gw#VIswOL${!i%_P5oMkb8q(EfLjQO( zR2a>iY3RE5?JiN6PIbja#oZFGr`grJB)i8&ZLle=!_L!})? z5US187wg3}pQKq9VWDE&{S~q+h!2og0pGh~0Q%(u_M2H5Ht;%VWaN{kLa_<|kR50? z^F7?DUtPg9L(QuHBEEl`uf_1oK$vOcG{G*Bu!xcw>U~#s zSfPCYmlM6>nnp`xK+F;XIwdYZ0gzxrdFAMIz8dEjQ`_b_b>~WDm56anz&YurS@nTl zt(Hm)*ft{2ZfR#*bAEBQTYR=ghbO#q+o1;5(YuPqQe?1qL8rkkk&lVdj8E3ZieL|R z=X4)0eCk353*mGhY3PhNsfbhx*&$j-t)h0-e8-h5x{)V*^D%B5%J|ie>|ZDs7ASq% z^f|6@%cyGkH52P!kZ)_CF}nAb@V}a00Y&&T*`Ywl@P8w zhQH0sX>qPYJ0ukys`=CAVbeWQy`~VV857(uvZ|zC!q)ZW01@Pyiuu;gs}W+^F3PQcpFvf1+7izd|^&44Vy^K zc+`c_Z#BR1Cwn_FN&P?)1IMI5&^S48K$Gmb;Z%^r-fJLk1CIbicdXC));7{3Q>lIj zpO^$agTU$}$TVBs-(wYCA6P-8#M3Z;*+(57nqH^{5W+?eGiArFfVgVoI2;jEc8h=s zx)B`K9kT6sxpQCjb$H3u_MsQP=x`@$7R^Ft6pHwC5L9;w%!#4bn1C3JDS(kBvhuks zSNZYJ(UNKW&Gs!#(`V#%YqrMIbhPIPwj2CFhWaQAxIu?KQETV*YYo}w&+3r~kAsNLo$sw%rNtq|R=WVxtwiGgW;vtlmy zFvdB2cfM0YNuN~$y zM<*Di*%G#lxA!a?LQaU;>h~pyoaOxtL@hWfS<(`LXT)dN;Cb)3XGrGP<(K(Ju&7bU)O5sD0tM1P7t^fsA~$REs!6r#P{k0aF|K zJ3(MVfvr(`E$(GwKX<|h^6G!5*CzeUG83o6(KepK+41=|(4R<;ytikkmoP}wr>O+X z)ILFZM)UhwK!Npulk5QM|WizUe!6(pUNbX90J0Bjo3?q7%UG&DuoUYY(g=0^mS6xBYEwa`C60>D_<;z3RQ)@XWNBgjO<%*(S1|^8NT*JM1mx z&*as+i?CzaTc|uNO0K~jLTkjX zwiR7nT9W=s5^5nybEa5;SIn4gNnv>)g2*2wa3Hv$E3booXR%6B&qX`=8ditp%$PJ^ z;lY%T7Jbkfyn2s-4_S=Q=x3b~}h6|Vd zxI6y19yr`R`5W7fQk);5pf_IV|3C7pI5*{2+4bh0U&SY?VC|#9wy;36K@?!1Dp-eT zu(Tbfp$gWuG?XBF0S(2lUQBcPMa4^#;Tct5qRgGYPGG{yOHh7Rxha|DlUcIP2vQZMBQEUi};^}D=Pv1R{c=~hoX%CTLG z5k6H#4xg#!<)gFI+&p@QniKh`R(pFsYSf~MkJP?4ADylC&U}P7ct`QZd~}Z5HQ2V> z>lT{n@JLCS!ergHtmQg7a^X`DjRa(M7X~ga4=aiu6f7a=5F%p9UDXpE;r|3~Sj4(y z8aW7C6wCrz>Q3ayzb%vfX6&pIicQNn-DcX@yJqzSzM)WuKtoWo;#?TzfYirH3kdUw z2I}e;yYv#x(>Tn02AVokP937a{H;gMXa(-FQSc>ZKOEA&aGSx_NC~&fZbS?b@)*A+ z0fMO!bA+K;$by4-@2Zb+C3|MeH4o{(tbn!QsZcDimn^0_d&n{)|N^3kJ3*Jj=p zJCXVZzjPH|e2?RaA|gF_97`59)LT)`IvAmdZJAiaw4I)KCu?A)5VJpL#!`d#;>Q0B@L5UFTnQu|eu1iR4gAxHE zZFq`*%&XUTQp96Qhm~^qV2R7uA5F2383N#~)vp)HDEl~%d&xlL-s-0i(tQse=h0|G zrMh6Wp0<31k#({*k7XjGoj9~VO)uF=Qwi8;C|x$BfgS61gQ*HSM{6n1MF1nO!b6x~ zG22o1kXOcn=GN+Gda6#sc2Y@{8XV-#VVi3A*|#cLTyZdUQxv4Zo5lco$Xy=D2uv5s zZuV7D8P@|5VI=_9yP(GEI=D4pA^QWy{6W<1T*G_1 z{p+li+cjLy~4I50Qw_Ud!1cjw8jdx4vH&W{^7 zgO%?sg#ys7vrbybO@>{GS6TH=(Y9#U-6bMm5TwCF?;wdz)*U0d?R5r)B$`}z`EbvQ z!%eP+-5AQ0GYt1{uMPpTp%|?*OA7;jr5vpjy%Om_4Py>4Mh;4K%rfL0;>HnX?EaUU zd!}xrDw*gj#0Aep^$Qp)q4%wHli7Doc5k~iZt#s;6V1IleXi%lxhku)e85Gwsn(=x z-hyb)J>Oo?E@vQXK{jcxe+MN4#CJ@2F zEuy{fZW|RMv%t8~BD&KLH9qOq$X<9T(>B`tqAl|L_V8zS_&$Z#|6>+@{HqqkCu~WF z%GZ@{<{Iip>=OWz?9V{4ohc!koOi)d>LBalFbhyP7e`4NW;{wx6K=sw-?H>TLE5$( z80)U=B{J2_sDjQ*CQ-)U#}J|(@I(_zlt`Z&KqIM*=Few206fzd)-Hw<;2Lr)=^3*v z;dr_o99BhG>W$$MubajQKV-R_rNB;CCCklfWfhp-*`XpokoD>ZRdu#K0QT8kV!Ids zLalvZdW?ay2eXwp&oXw6rgM}CF7}9+?zl&8WJ08u4av5)gT5i7Tb=1Sg2wM6?$!Jz z@p#=L*$WycSHcT$5Y3Wyz9t6%fAMj*`3M?X5hh*2Bp4|OP4vP&T77@hUeIf7z8?~>YQWBh%I>n z!+638A~ndHymQN9u}F8jvh_{2bqRrVi%z5h(VVlxf#4hmf_kR7HHb$2>i+?_zY@ZEjs^G= z*W?u2Oh}wvH~i)|it2Nsy3vyK%yz4_Iw^3Ro?Is{^-nLLDT!&6GGjk06Vc9|3FoTz zbXPv!K$DgpC|eM359Kbr>YNy6laeWBSAdm3EM(=e-Y7UL(z_84<)(8ZArcGS;6P6 zHeR$REqTmMNWE|=8m(SS65img??#RwAb$yE}5@ds|R@9tgfzMAszHAbwT z?+%+pmfUF7Tg)WgM3dFozI3E{uylp&&J1RroxQL<5jSAPB}Ma9+k-8sfYykaQ*zd^ zy12?DmXCZx7>~%3V?cp+55woq;0v4^V2O}DQxUZn;(G&uB8#%A||tzk-4QTGO}nTYkV7?k-&;2NOF`GtaFmB8}`8* zWk!&$gh;`}eVT4r6P05wb*bx-yWxC?SDUWEp1Oga(>Sr9mTfv1w{m6SpYV#}Ta0$D zWpe@siCVl$jBklidn($W;xrdMS1vqe?%p+Xt^p*rU{5zfrF7dN`z}?Jr0#)2G5Dq%#^C<`0#bwcir!5D14hP z(47#wzhjaHe#hinvuDO7>s=&Tay4!nJrjB0nYIaAF>J98BM&VcXPl)7Mf1$X6Z|i? z(Q>5U{I<8VDC9}BtooU^OQ5J-Le%3taO^}xTj0bL$U~qAIr0%->z$!|KSlbZkZpG$@Zk8MGzQo~K%;wBSg&iT7>w-vTCh|M z@j~jqD-<<9%19gnK+UKvNAhX9QU*tIarA;btMdb>8wK%gdQ@YeY#@be(pGn;2(SCw zEd1)+v|3+A z;Jq~9KILgVzp*cqFg8NjiFeRoHQr8xUlB`h4Y|Q_lgQ0;BdFv=O=Z<*Nn-W`0fizS zsPHJ}UvLulpcWIq&(1?Q9-WKV(Z3Lj(q(EHkdXvy`#6@Z?IWo0b{FK>;fso|a3nK( zXj*b~iBHMplS_O$+nkY{eu_f{kSGmSy|JfbV63+>ZFK}VUphI~r9ReHA8X56$9j>L z6;AwX$!#)Ffb4sO>o4I(Nn7r@)gKeF7k_TY-8VVzJ|FiCANRDij9Yz9oqqjMjoEhk zU6Y-Dmv?%)ce;5=rvMOa7t^iF3@+>?gC*P;Fo#C#QiH6{xR>!Fo|P=*ACawoPxj5T z{Uc}ie$KGCr=7?1Cg<@ypT`!T$EG+BCE5)ow-CECo&~Z^K~&9YbX=gRVyR=1OauiC zEIk@NHBXsjN@s!``DjCU5JwGAD=}wBvkCYVxaSa@LU~rlz!)&_Si_|T$MH3AFJuW` z(%HsFy>)9|pNG1@E~&V8SQ2#0FhxvR}rQ`sds7Ky$@wKHrz;XUD!;aM&3d z#e&0F5xjkxQJjWRfq*bEzoC-9`wf8z=PS(He3U6dSikelh55Oo5;A}jUXHgyQ`P&T zXC=4e6uSsiAU3%f=mH?J>v;wO0-k#C1u<;qRhKzZuiQsq3BovEQcpp-syK~!y4iwB zXcgXmk_yGVmT>~+IzO5DTERt~BG_|Ze4^eY;zHzW^|72U{V~vpLq>4ZuuC@Aw_=^C zI7ddU)7xED;kZZ!TWuzUKlZ&sA*AM1OK=`j&`P)n@Nt&A(?m@ zAjy*-Og(I;2RC+ouw9b9?ZAoIW6oj{=j!$#W%aXYq0Fv;M^u%{d$&Z^yC+1}5BU%? z;mc<1P`QsqO|cqeEYN|;s!cwy9sL&s+~G2mZkH`H@K0=4<;?8;GLH3PGx z?+RX}>xyFQ0bN-RHR2Sc7lXf0C?&`ur2r|V!P$XXA^gT0>Wr%#c4br{gb~Y#B}Ewm zCB$$qbDa4{eC9LN8>9$*B+h$tJMY;IzUJbVNUau)7TsQi?Xoo&1|4^xTT0k4^L3$l ziE{D>l=GtE4n)7O-9E^+eLG4t=24SQihITe@{h(nbe{LoIFn6IGgJI^9w?a){wr9> zY(Zv;owNhV_6m7KSbXz2Xo3DQ3&@<|C%=ZGh;YLM0iXf%s`DvrCM-7Ln1VzzcM3P9@97K4xx3)8LCoBhjL zGdws;Sd80d_w#2)ED{-M!*vP4Fy5QNCY0g9H0pzK)b)=yY8^*SXlrQ0(1$@I=74om ze~dB<=HR15Syl8f00B`96R&57iX%d$UuBk(VSR1`iqNiZ7T|FH$fuhrL#xXtCt2$> z(N8Im@fdSl)pKf~)Xw4>%8#}f|QajK?QpclUVLH5$ za~EV`7LX~Q{CMpDf(7wV39!bUWzquVk+0DszzWP~mt`h35k>c& z0T!)8TH>*eyg3Y&z*J&_j4&>6HznD`thBY79!4xsZ{osR8&bU#Y@sH}7n-Pz;Tk_d>o+`Zo&>89Y zZ0u})5-w%}kT5z&{rXC8?IqcKw%}YEOLqxS^cBz=fOr&;6QY#PQ2GM>Cj;vzJHeH_3vwI=Im>js1 z64#*nD%`fTpinLN|6}jX<1MYKJMZ(HbM934+^SPW0R>g)xrZu&woqb9AYfV^B7d#&er z&bHXb=GIExEEIPZdM)z-j(oX ze?%<%f&8ulamZcqa8%D{GJH+hd(if5+!~#CMmz)YQ7UC|l?@hYfK|5v4!Cs7q&vHd z-;k}fbWT0toy{N}bx$t5&O8>9} zpCj=Z!l5ovQ;&J+8aj<4qgOY^W7a(q;O3KqI-Nf~G6hwdeKg8(oQ1w*%|2Q!IG%`z z)vXvK6R!-aEOnZx$Vm|o9lgnEbJk!L?lgDlj(}9%F5BqNSQ8DyuG1)Vv}vKSPBZ$t z8e|DpDu~O%1Hhm4osAKEKnx>?|QVHX4PYkv=4n6d2UO!Pr@;lf$hl3Cwgbq z#YKEo@YLf0cni_Ym`a<^$E%P-5R0?}FP@~x(^HBtA|^%HTIdgxBizi%Po1#+ zlZABGAV}=u7-6COSbGuf?1WheAS8d<>!SDr9;u}^HbD}=1?P)?^b+V-upGpNWa%Pp^Y ziSZcny*r!I8f#;-JCeV9_wGjOrGAoSw}z`}wh+x|Rc*J??k1fPOtBbXn?Rw2c$T?W zx-w!-!C`XlI4&xhx4&|dV_Bt}@Y|}4cSuB(?M*@(8NimccbR-K!$eFdC|#X}FW?U> zZPyOdt*}YeXa1 zq{(vXK%PrLn(ZSp7N&%0vb;i~k^IAZjFb2Z~Fl44b~M+bjrN}6+a_j4B7J#OTgsf(J7di$`9JFThv?@n5Kv0~5&8%Xcc^HEKj zdAt31mOt;+()hvzFQg&_V<&2rEE&F-^M`?a;77`hezgM$vF$jNJueSa~-DW1q3U<`xr7bL+L# zJ`z#_nf?;zjcIb2nEo|K=Us{E`LvNQs9yOu-ZvaI&^pt~_M2)Yv&1nxb2=O87Cn=4 zQDL2XJt`v(w3?w8XeoHTT0e&6jVRm5PrKWdtT(C!!{qm76hs|lW%7mV&3;ASilXcV zLveenUqJ%47b<46fcf^6qV&^dPT(?;!luY8tC94=2`MK!!4*MgJMZrk#Xz|PzfZMj zK-|}hCU)DmS|n^+zT{LDS6JA>#cElS(UnOOsvvydBOYLg{Q{lCG2B2uDM|ZzOLp*S zV?tk9&KOS97-N{0M%@oWCe1S$!In;`Oe_0GNetFO{Qav1qss?G!JYv2uZ`1n=o*VRMEXFd zzB>}KGew4SHJA{AxNOL3ql>aic0IWmyI>tuCSk3)%@A%I;^Uy`Gm4s$3nWGDAn%55 zcHm^q7_&Q7ubt%%j#`T_S2hSEt8qGbQl%u*X&IK40wFcH6eUS|9OC55N9=t3kSh6t zDGn`3{Ac;0MF~gcuz*mR*@qQ{m?pspheyF4MmW4*(IZqeF~aI#gd-{i`!T|iC6;1@ zBP+%K&lo{k#nzMO*OYPmy;;T1#$lD_Vh+Z;^Q5+yYlQe?o}K(iCEGCe0y^-@C{_kO4foMeb2C<983K;3k|_rKm|jvIQ!Nv^j;0Ma zjeKgs;MI+`v<{P4#8~3AUHgZC%}GR(#aqDcI07JJv}hb#Z6nGa7iAmyp}_{n^(#pB z3bqC+PpxDu8p z4CE&|V7x@=A3w?~gBxiUqD9MAWZuX=fli8EZiaF^ZsPhRhcZ{oOze}4;#1rp$AzI; z@4v7(pS@%>b|N!$n1BnK+XcE=n!TcKm?GF*i zBQ}WND9RWpjkX9Z)qIwGQ22vuQaViKO5+;oyKB&QO$`9xX$j!8eA!h*f--&gv?{5h z+&81)V)Hx8H^1MUQk>>D*{Qopu@6}u{hDvnW_h(j_!=@uly0FA zIfD@!wr|H^+9&-LO`!i@89dwr+`d7{h}F= zqSs;Q&F5J^txH*Nm*~nR-jx;V%8E)?&WNs@3SXtJoH3={qAM9;Rdv57B=VX4F+bBG z*sQ6_E5qC-qecu?D6pSv*f+Hd%F58o7H4@gReQl%1(q=_&kkhP%FN6rE5GPFDeJ)i z@up*fGWlW{&xs1NI8H(}b`f;Wl(PTlbYJasUn#n;tkC`3)b_Oe#e#*-?QPeWgYyE( zVnT;C>pU-SqB09Ae8X^NY_Fs$38Nv@gG)C=m;z>kzaz zTByW|BG4Vv3NzrAYYi+~L`wddA2s&l?my{M_MN!imxHua40E>i_tBZ>g6>@*qOQjL{Zna4C zl({0SV<;ge>}=xbERnxcY~rE2n`8lfV_Kv{=tDa|;BQt!2LWUJ&hrKxHMiLHS;lDn-Zzs8TG+mqazCqggH!+9lOG!C2pq zVzxDp-PQN|75zcaxcp#Bkt7qQjLS$`hUT8?B(D$5Aei%p%reLzGS?n zzb2!~$)n=k6hVPE5Mmot%*tH-Y~@7XcCT)3W{qb#-URuIH|zOL4`p};jF-9YupR0q zg&pEEj+drRP0P=D3so4DYWV`0qtZX+XC9zT63TYc9oxbmO{$2|@iC3(kERrc8fhV%;QJDxoA6Qlg>IT&N!OIF%-vweVIY~$!+nn$#CSVSuCQLrz%6N&2GoL zyeLoSef7^XWJR4{K~BSa(n=3Hc-BH1$arMdogNzp;jUwPGy7jBlcz4j1kP7Pr*VKs z$E>wq(rNG&j)YAhD{4SyxC_Yof<0Le`)NQTML6zwsrNs1K*>v@(1eIhw6H*7rPF{a zvc5om*Y5Fz7CJjqDY_!`=Mtd6-`Q%CzTD2+2*_1bsieQpO?$BIO!&- zd1W9lpZ;s9xzYho7Xz+WP+i=_AoS>01=V4G(VaLWM(EWdG$Mlg)jeTsDW497V<18q zyh=#O`(Hk<_(r6GxT@%)OjmVxqydP{%5B*xc8Tk;|1m7@?3s*YENu%JRhIpR z9ba@ByRu*H((z*BAdGa7s|`7h8;do+b&iqGUyOH;x-5gq7-HASwc5!Ai`UF#vMS40 zJDzEr8L6v-rXOHTr`s0p>Y@x(HDENI#EoIkl3I=!C|xJB0IO=@Je@}CngkhN$oA{v z)oZF?W6>8i3I@A2a9OJhLJhDc{JHsqT>Fl7V_2?>x|@irsh%t>*G;Kd^0ui-zIv2L zF4qU3cL4}`8k1k|U~Ha6lQ(!t$R^v{4ZUSF2y7Z}tmOwHl)WXD)kyE0-!i$Z&2`R#HP>e(bF2<+GPCSb zSo+YKKx;Fokq%_mI2@bX)!h|xW70am9@S9M+1Yr_{+Ibpg5-Q?iFq{5$Qysk{F@*C!BLw7 zMSBur`A}h_-&O%sz-gGP5yScM=dl(ZDlS6o;h$`wcW_L`5eok&J<%TCU>)j^HStwF zkzDKaq#m(FaaUj@ONjSJxF4!nT+8TUV`vGXwJ3CryG)71Ab{;3Xmi#-$3bca^vv=~LjY5?7a)Y5lCQ zBKr>Fi-c4nj-GzevV@S>gBXk9qPp3Mj zT_sbX37#6BSc+Xvzuks&YbcICHTAds751LURNG&U z=)w^AwzLgxflC8kg*0swjqiUSJG-f7aDqDUp)` zO0~ec1@&URd@%K4T7D!q#A;?#f6zNZF!%w=O;#Fu_k&^8eaPX!td_&DeZ&wt=tB;Q zNbTjENGf_%d^lCi+Rw_~@bHuh(D{)9Hd)LcDN4lVO&(f(@PyCgJ7-7libY;l)Pg0GQCMaEu@=?t%e)o8$ zbC)`!grWz~>GfJY8_jQhk`)Q=$}fIbe)^k?@s_nsxMzyRN9UH-DDcO}R8b8z;zFkE zg!$0o?)3b|J3QdVGbd%qwm3b%RPVR~e79a92{1pP-Pj^J4|_~oYrleXN}}3z0a-FX z$xjrkkBL(h&eP`pM|hxpY41st-x#vT5-oAU%`Zf{W}5hqIXyjpOR)mGn(d1sgZa2u zPFKqw_iCgI^-1+a4E9_G`w9Q-skR35C*x}i)&9xytIu*IL&GDc4p;;sQqn0 zfFiJ{g{$b`H>rD3?2vU>HXw1=;=$@eNKnhT&I9$EK%de^l_znUuB_t?qC4yZDVy&A zQJ4_S#4MIO;DE@uEe}N2hj_F_Ka5Wbl{%nPxm|g11^#0^xGeuk9^8xn6c296lgm*N zQ$NRp_^F@gLEzNC=dtnDoV5)orsEfRaH9Vu9wa*2iw75JzQW_(Ti3tJqhq3apwl(c zJN_+{Lcy!3D

P3F z1i;L=x!kplmcDP1VTLAg>!h_sX1){*0N)}b&_MoW4mwEBCJ@c`x5Zz?_bk2^_9qh- zZ=3Bjy9vu#Huuk1d~M%NSfa*d!uCDBw(s$^eUGp0TYPOC&wG=wm-D)e*g<9^-XDK# z*=^dM8nI$#J@^Jx_C$6YOTgNjS1}77#SEu`HeD972eLA~4i_8l7cgug`=GvKqv`X9 z_HctEi}^(m}ian zp#$WT(>xFUw-L~3AcXHSQm_#17Pr71tVnsc35x$54W7niHX0$O_3Z89mHWOCuC{wP ze7u|Xm*d;!v32~7pxOlHScH@UOC2Sj2p1cJmN$~+oH>;b!~@^*z_11M`d2Q(9f=0S zmqCRGR~19`U;4vrE2lSAJ>C-Q$B9T9EvzeE!l~!(NV9&~QGP?t3WUY7&=!L>%gf4| zNgYHLngya~yl;@#`ORuKpbe(OFhZJ^7?DZk5sU1&qbY@ zE{C8;nD85NEUh0)uG7fH`pTS4p3SpzBQe_!&wMvEmZhzRua6}+Fi@B_z=AMvT+$d_ zn8l{&`Zc>wRl0>IfXTyovB!Xu=;JeO4?!S(EIG{ZfFI1RPVoJ>M2|LnuXs(i3}MHq zw^H7eLdpV!0Z)X9cuN6?!F+2eSnkLO#S|f6*$z^rC^t)u`vbpJ{;NP3inDU|eU=`e zm6#6OGY_O$k&19o5NJgI&4I1_^(t(oMF7t4IQ1xZjW)W;b*)RYd2TVs^FrI@WYlTM zNSq_Yc)Ba6$K-_C#&FOk8;3y0_kR)FU`3hFP4QyHTAZ^TXT4%dvSKsLgx*4;!+h8{ zSrq!mSaEQS8&NCZcRc9GKLuErBiTa`IxZQ(g4HCWQ3gs?nc|D%f@HM)K8Zv^A|w*Q zzExoQo2$UI6{z6~fp}iye54P7_AGpm%Qvh9!{v-b6v&E1CPMUiKv*#eafg8L?ww4F z*EXD?(MF_cTKJ0LqujF%Q*PM!x59^me^T@YB7&=vQ5?e$ui~#AGzg@WyNKPhWU`1b zF}kq`%XZffJT6QwlS4@QPlV6c@%fI&a{c2sm@jAm_xhau%x8VF_@Vlt$8-I&r(lKp z?O|@+9~!!b8)NOjnTfOm(6mgY9W?MoJIEaP@Yy%fH~%y)>)V)6{vU<3_&_A`frxzg z6ZuMCcncjh0AS1I+lU)thHO-sRg^@06JSi61VcjHJwH2M@91$TdItvHZl zV5@n)c&Bzs$092q6MuUbXm^?J*TGtYUQ{`NXlx*$E39|b28g$^n2pGHeM5=!xM}@S zdFE3hE}q0@I0z;XGfGK^Kg?H# z-?tXCO(;!-7B^L*;0ZXiK~MuQzGUD`<7(h=`|(~}i!>T;w$LUH0)N+xj87>1>*M&u zUE^zB0LOMI&X=(S1t$XyxO;hpN7R=Pp=wRA&okFaS}I@=jC$Io3B9@V86G_jpY_i8 z&0Wj6!W4o_x%tVRz&RRbZ~-^J#K?&M9KE&tg0{&SIU`fZDbiNUgkpjCK>|w}33`XP z90<6A%l+gkf}v&Ij0J;qc#{uLxN6PWiKXP{QUF^+$vQ*VBu3Y&;Y8YdY!lW>QoOpS z_>8zNWhz@m59Am~f;=T5WVoO^MUHM#=UXugn zvFKPwc%#F%z7!HB6*f6-vRQrQk@{vdT#eAS<9F|)p6M5rozr_BC$8!~9$f3suf6pao&0DG)-apV*ainxvCl z-Ps|!Gpqmn(?Gd+W5b8Y`wNuiTiwg9jIpD5HY2NF|F7ZUz=YUr}WjL-X-jT^M%28bEv zb-+_m&Mv99foXL{V**VCM!qJ`^2E3-w zF&*-0>?CR&Km$fQM2JzNM&Hj&bjvrRjAJ=!oKI6z1LprUGF@t+z1Qx4&q2W zPaLn`KE}8-?rLSNsMMW$ZF$HS(|h5PR*d9jJSuzZJkzm1{_#GO3QE{I6*BX#IgTQWpI z#1#*a7WmWudrE6;aLieEZCG*UF191r==@HQ$M!ceIXHtscq)gJw9u$r-u?nGJQpq>cmgLa31^UOo0>_f-f zJrwD;$5>>OcIx!h&%`R_OiVx|9N`-)%4o1xf)Bg`v^4SOHKi%Jd^XYAp9)WspqmQE zUv3cd9#_K%RZEi@LK6>TqB^4Kzy+E}CNl?9aLn?mXB%1Fgh7MY}`8^>GaTPC06fg_@c%RJx4=RWUku;yrIc^ z$gT)u)q@3L${4k?n7g=wqk5(sW{5?o?vs|l1K;~u_11|&h_wv(u1OCZaCYT4o|5p$ zV{g8PG3XXitx5QXrhvudekSaj7PpNJYtO*jTXLsl9FZ}&!zN_Em&I6VKYxJ(QQElt zq;&BI@Mcq)moSy=%7B9Z zqG=^@W{V!=uzJX@2;X`SQe9)k$ekpRxR{rfV=nA~=XhWaWb*xvvAMyKJ)w|d;khl` z?$NU%{QDhoo-uaTq%`<;G0$hEc}iWBUO~{Gw@ZDU+^O_U$4drJ)w0?Ew3!ycRKM>? zzRUkC1E;SAIz9qZY}G{;4`ym%8q{ap@EZ@=H4BVUy8%D+`{UCizFrn?6Cb#UKyxvP z0XRI~2RJfzHirCCVo(i_l8@LW0S6pL5tkSP1$DT2Z4bd2w+lN>yiUgDZ;L`=w2tK3 zF}DcW{Vm}F)~S>25}Wo|U14lG#_Ae&#ht3J0wR%^^eFx1*p8`7b&AaZlSDjhg6R#J zPc35$z%&tde*Jl6m59rOdPhMAd` zkFwUl#p8e=MuJNW2a;nS;R1GUi0o?%@7v%!-oxEeWFuzQEoA~Uv~v4tp1@DYJb*a!$?NLoUr({Q#~?}Mz$kzvsyA+@RAD(p6GW? z3_E#$c;QdW;Qc<~&zbWqJ)J1%HUgeRLC;CX?)lNv{+ElmIERdXIT(6~Cl76Mk@$QJ zm(5U0>L%QZwN&IJP}oWQGx8||lRCM2?=1vRN&hCOmMPDF6MPvb2C466&Lxy!1ZBo9 zGH?b5;MXdRAKeAWe_Sz9RUdwZTq2g$iYoKC!gmRr<~x}Bt0mZ7#SOOJL8N$Apf*>H zauXsrN4=W!0~fLC4^8y6qV~$Z&17!y_?Dg(|HlZ{c-wM~~dByd&zf<}SX8o96PH`b#b+X+|s{5I`fh zMQ9#-wB*&ZdS%*E%b8DmM`vHZY3&j}5RXn;vLW*m*CNM|!i9}X! zTuBjbO?$pKS^ALq;Hj<@1?XD5S%+UrI-pI~-OD5l^apmnn#NAz7DbBKvnY!wbfhAp zhIRSs@QXM|?_hNcQ6sH|zft%?Yrh2wqqV<=Hz+Be{)Q-aV*KM#8P}pUc(PMp0rlfCEm(qjFNn z>D?bQ>p)0|b}SooEOcdEX&0&XcfUuenTw5#X8Cis7gtGH)75XA#+N|B2D9!85*?AC`3V71NZRV~ROe7mn=Q0o- zOlF{skThKyF>5!WRMYQO>(%di|9ikfu~I%w5~M?o2_=&;t3Ia@qt!TCfHyss6t{_3 ziC<{v*%$3tqq{&``3~)TTl;Q%4!{LKx(je7rdsy^OK%vf6lQ*)P9UrmMQfwZp`c(% z+-G+N=_!#&%#gsH{)%3;kzBHPLvI+nmYuoO>qWp$bul%?Hov+@@kEM8d$UW25sEGb(hwXsQU($dQ#^< zh%X5Go)V?UC^xqpk?KYs1U9|taR)KwVldYqD zi56S)lN(W4_1}^S#V^KHv{%s&2nm=!w)2BUv!I+<)?@+jrmTs5QCSmeP|ao1>zSt1 zd&R1ote)vSlEEN6x-2GPJ}XCQ$fh1D7N&g-Wg*agE$iWQb=|0a8cIo_PZdfC7y29N zvPP2h(X$W|EYNZ1Zn#NOXeS+@t@>&Fr+9px(Qn}|xiqrsZzqzFO9&G}9Bt6`YM+CUY$f`f5AhEd*RjK2#CzT{5unonY zs6FHd9Q&64fq(rx6fNBRN>ZSXMJgT1xAT(}rtU2kh7nf`yw(ts0L}$XM;A4E5OpD8 zxm1eaJvyY5+HWzf0w*jH%s~zfyOkJJ3Y6=ZDfAlgn*?Fs@cAL)l3P5s-s0?qMwv+z zPV;2x0SvT9bM}yc;=@Mt$l~~L&ch>cKDiV#2BV1Z80n1E;Ib zQ_Sgsi+u?;szpS8jl}4Xv6@%!iI^OXRj4Bz4g`tBIpbpC3@2$ljv)2aZ;avN}}aU8I4?8kInXyfB{iKYM75w49OZ(&clM%w!#9lqQwi@4+0qo>?UNv zM5ST~b)4n$ImXc7ILa$(B52rhFa-yA;T&K}JVQ^k9k)_s-^C7^p#7M{6j>bAFB7>2 zHVp%AWRkq;mn3Exx8UT1{|G{Z1@dqKx7=wRV_9gw3|Y;;dy>7$#NeRT#}7XQtSXdd zUSh@U-hqC}d=*oNy|di+mkTqUhPGGMPY>0l@z$0}mmj2EBFHc*GZ8rtEW&@jkB`jqj!wWwrnMm#X;>+E zsOK183^N|SJ_vX>U%fA?Vkrr=n1lU57sqHiGRl8W9{Cd+a_`kQ3#OFM_g)PtyaRF3 z$O+i>X`m>MD${gzNvgx6FyX|HP~wyu-o6_12*as377wvWO|r*0uN$&+^0zh!Vje7? zE)Sq1WO89{nVT2p=$QH}hYdqX&jhN^>2a%+2@JIwlgKnLQ!Pla3#jh6UX*`L=8$o* zq{GqwI`W)GDSo^K6R2UvUnpNck4c$swjka4h#?pat4KH5lohkZY&lCZv9jxR?#4L1 zs3A5`0uPJ~OWmQLvT!WlPyKfesq$;rv+>|Qwq$+7-=tO?D?~8xWz&|WP)`MXA227k zzRIbWowBf7**!xA`SkP4dbn(yJ8=;*$rU7*=rEj?!tl#6 zqBIDtPyrin6)>5f&g?0Hi%`4YT}!7Y!l27xegH?Vt6^2Z7Hx>)dJj)iA$TW`JAz6E zImbdOtD|CXl8u7Md9dFV!cvY%S8D#??K-_c?jHWc5wta{aSoz?a5}sFssm&ZB7I!< zUHI-6>v5;Y2m?*h8T&FeR9`bq;tbkR1T_XOtpjOE+v6}FmSA`yli$q?O4C^?|L(D~ zh-S)JpDqUS&i+!IHyFhnM&e71v@j7kMhdRR;UhW>B$5R_!*RdS;D@lYTqa*Ws5JwA zE(sI+L!sE<5}blmEOBHT?RrRW&TtlT!*XD8fbY6H`42I26_5%dXaS}DVLnXuMh7vL zWUIj~&dOKVA$)=`E2Z}zzW^rloVDn9MVD12!`X}qObwz0+}hWfr#LdRJ)kWYWt!lz z?eV9*3|uCr&-biUFIs9ZS}DQkV*zuDfOpZM+=Ti}=pN|JXa|+TO7-o`1zDF1yTwTj zA=}$us`rlXpn8>@KbGdFL)9y=I1!e-HZ>h4k)SdD@Da~c-@;Gp2<4s>j6|k|D~j1@ zx0jo*t4wlT)sv<>%-BjH8bf$jq^6=fmIZU@Ne7U3t8Y%QkI^klUfj5QZUM2W9_}Z= zZ5<6#J=d!K2u|4`xg(7_p|QkdB2C4%tPN4LoBK8CB_ZFh6)^3^|FJO^R00pO%xYY9W#hQQ?2iXALb9}S9_;*jn(oe1mMOgcSc zhCG|OMenK2%|+RiIZX9(mXG75Sw7=Pm)5O%y+v^9k(3V_8OFVzuH_}-eh%*XH*)m+ z(U^8-Dx6?9v^Va$oKU+sKyD``#Z(-dT7rw`!%)dC_(G2c-{_ef+{oAhg50Tltdf{d zSM^oc9uG@LFxqLXwtI>73e#Jh>!U7p2~q821*t5WtGo55qUUoWJQ>i8*;EHjx}?DQ z!xEqyuhpii7jsF5LEH$rMC0DdZ=cy31|{tP*TieKTYEb!Nx%#Dna1^l#`bLVp4!<# zL-@t*?njM?EUYhV(+3si%vk_~AasSS-~#$yn(x6O}_2`}(T92fBk}wy|SGtzvYRtutly&UEZIErFue%Z5W7ZOO1IYw$uc0 zBPsaC-u@&b7)fz^A}LzKiKHC)B^xcOiRM-?d;Z;{xMM-)hd6ItD($l`<}rqHw}KT?Aq6y$f(uIbbJL;E0v_9{BcJ8T zq&r2%D}R#zYCJz$4Bk0SXgr~qbb@}SSXi2}=cr7Cr}LPzp^eUFah@aub!&MlcvcG9 zB7B)G0ffevYky#%ey%XBUM{I0@gY{|o0}B*mQDWXhgflXl@77uEUQ^A@enIcuiBkV z(0i=be(HNg-k$FY8#-BH5epPX>t+ZS9jU|R1Z;&dsmmFaOr}f`ICOSTBp>Y+C&dmz ziU%MN)6Uto%(7)ce810nD`uBTWu$8z>C*>shh&8Qa3ZofEp!3?l1i!ecet~V;Nmai z*hxcbmK{w2WhoR>RKM7RE}P9C1eg_BR-_<`B=>QgTwK6ht4&-$J`R|_LS+g3=}3ro zwTg~vUr0+uO#t;_fk73(0qcO2N|?Y6oLpJXvX6+Dy=eDLUx~x~MZ5{+#}s6K+k=LU zL+3@}rW%bR3e58@grF6+NYk=Q4VcKVYEwvQ#vWBV{AFy(=Eft<{P&?xWY6XhODI>b?=)2_m+%!F z4liCkse+V_6{H-R+jf040o2nl{x5496&^WUkFD*KIx+`?yPm)G*N?9y)XSXYH^pTr zr(2sQKT3WlA4NqUgmDcP_LF5{51=5+9UM2D+E-`TQ&X(K5?f@PEWf(1{7V3-`L<|6 z#IFKNRtgHOuoPDwkhCGL-bX4i-@WHOx&GQuAqtPhtQR>evv_M*X19j(_nRzMZ4vX$ z>nSDc7vKW<0c+KDTAjS6PUl?(Z`1mCvGxN#*`_=64i*Oqb?r;Ooq9=5ILPkRF9LaP zJI-t{TUp0vGhUOEfk@0!v{=~CdClqsn0`x0X(S3NqI27~6kBS3?DD>vlXp#@DM7f#9*e{ti|Jf@r>qK2s%>4v zzoISnahbM&zZe>Z2l%gHL*SK4USY%7)aw6^^@_ybtl~JO5ywN|P9i2K%0%Ffz#wE( z_mvBU#|b&wjVYgiqdjf2q=KnIE)Dp2G+!(sQ3f)uxTCrLfHmnNpS%F$I02ueqO=Y2 zC&uqTM(;}j+=ipcJP2H)AmFvL^WO@}yEnm~jE;nXYQQtw7kMTX80FRPLES!;!9#df zb<9a0%q6ry12a2fgEzp(FoHO^_m2v!G(Tknq}g1&kBGpLLK?`)W42heoL;cJ`M&t6 zPj((PQZ~SIS$lj^W&oG!g!Ka38zJnLOo?xJ(&&CL>;Kepehq25tn*+G4xv8b(uo}z z*y7zhq%C&b&($3-Zf}!n4ykO-wg)0{xTUwl@Tis0I0RLWD=SbuWUat%!s9rsN#df#D0tByqt^y9iR67zD^98G6 z#`;C~yl{t{h0Yw9yBAZx{p0FY88I{Ug9sp4nzo+2PJyU{%~v{ZW~W|%Vg6*jp7F!K zSoORT!`28$CJ{`B;wB5XJ;VwGc~SaaLX!Kb)5CSW504(*UYWX!7Y9{x zpXJr3D1J!Jv&G8&S)$jvz0Z~y-Dd9kL!N4hX^jTcP(A)ssYq8SehXq;Kb=J+rxQhH zF@=H(r|+tR#NX+^G}1fr7A^89b!Rlv`!h`HSm6`aT@sESIXYQq*TVPFXLNu-aWLHX zDpDB<8K@J z_M-Uh`SvZ^zZNqKlO8N)bP*1ih3iI_W@(<+qI&JA-(5sQ`{B?)BeJ$;XMnyzbcy9N zlC=TeQCiz1U8L+JFrQ6jOB8~0%$LlfdR5pGa11T&3}HW7TMNlBDDv|jBtJA1{`fP? zQxCUpC=Nkv!!-XYYeeG}6l&keO1MbGD~li0=Au9(7X>1@sP`Ec9je<=1qJSMm8@^j zm)i*Y@#&o2Mt!=I4)Bu)DtQQa8JX~sLg8AcXe?b0M+|vPDO7jm)QR%^Un0tlJ-RUpK-DWY0N+% zRjV(;gS4>1y93r}M#LP#8NKD*NnCYYCKO~}Ne(=hO26g3)l{T}ExjcqY*Q4;Q_`~V zFyJ_u5=@U17VNM?zQ7z<(Q7K? zPS90HiA`vxxH(`~+^y2tdKrT(tv=N1Z@7(@Vm;%R!l*$VkzYk@q}Z?jc)#IYYq7Zs z`~dxYEy3lSSSNo_StB^)yogz%59u`rcxTQ+d=2#E@2$YaU$CQo_gFYx_0zV6D8{`> zmOG~VIZQ9M47r3MCVhbd07xaopaqAvJ-7Ot6IcP~|FMR&0-7!R3KaPjzJwnZHHL9@7%!vYM*bgq!$Y8gbTJwFuH1AqsA+b=Az$ywz&8$HzNk6BCo&Y$7jK z3!|(K$<(uN|MoX&94!?L3Mp=|4Q{b5+GH&ejFaz#BRBSi>#kwb$bDwZC`qv0*S6F0 z{TyUfe|^1v?&6pCH@vjJvEFcfZ$sEhsRQCmU!jjM#XU+dr zGWNfp!?4CEr`ALQ{I^|in43J(UqAN^sBXy(^@c;Y!4UF;s!sz}lP{Uee{8KVkP2|J z`NJ(Qv34b96)_&)zoGd?xNsC)029K^_iAx`aU)-xon`8S)2r(Zz4f3L{#3nreO>F{ zBmIpxTz?z$<2jAXS3iZ2+K9O0Fmd_o+Aw1t1E{)wIVS+WY#I-i@7zXw;Y_h;Ra@Hp|A5d#+xhACz=T z&yZ5v$_rRwJXJ+o)lAHscT6Wd^1!_$ObM6!WA#d8Prc!C4jY2f0L)7xq~2kW((;%C z4ZQke%qv1@$P4H%GFXgv*Cb;KB;KCI|Mhw``5{!X>B4!=#q_e8{0*il1&;5=rHf+H z$eiit)$@D3?lKtWJW4vF%fCCq$6y9g|Qzx+c-JED`;WQ5oEBkx^W@Zd970!WDxQl+ESCLlZU$ceB*^% zO%Dk0NB7aShS_UZhMsC14MY#GNPdP@)`S9}j~(l6oXg>ZWi*DtA5D_eM0okJ{)T$} zPap@gr;@fL&bdK{{B5`acFI@Pq34cF*{A8nlQ5g=&K77F{S}6GuoA}r^wJgf7Beuc zl%j&E_VfM77~R8iV^2G24NN>H@UU7RVZ&VhGT2yAZ_raFqmh^-qR1iLZ=mQm8^R%o z*aSm4N)aV1zWG^rHfLJHw#!{iXEG8U4VJ7#wo6?loDnDA0e+p3HqESoTARaRx(X+l z0Vn$iIQXnRsR(9L{VMLU)U0Qfh_3OVc?~O1S1*oQh2m|QY3rfIyL5=6S4IK{Pd17~ z9FvSz4v&{>A=0*Rv1)~|5js~bqoB8QH|F2Grg0EY8$Ca{pb;i{O?V?}sM= zsgB|cpPiK5dAKLJK z4weuHTCZ})^-v+qMt}Fy&5`F|J=ngsb{<25qEUdZ*Y`F`D%om5$wPDHq5g)sKhJ&= zogoq(U>IeE=@^y`F5zQBl)*6}sOx}jc=fYxo!I5*4{hfsO6utUBu zODRBoxXoM~&GWnxWam&0R6=tlg1T{gWamk*Gn%pugq0|%CJ6&(MhkA-(9)EZFzkPu zksLACyDeoHV}I3@(5^`2CLEWHtL`fXeB4F^^CTKkjwX<<{7vJ#IATf@n=k_}W``{w z8FE6CvNV(J;f7u5?<0lAleETUeGoe;ez4*DbO^Gasu!c#)bzpEC%6Q4ym=q#4C(;P7wn^`~R{TI`n;T?WB( z)UxoZk2@q|YMQq<@?(F2wZcdC$PavUOR3W%fz0sL4 z{H;M})WT&KqWwVQ_8KPOgLiZEW!g$~@s_6aE6ERD6pi{Z(IsTSX03G!#K?o!iYH_> zp;c)KwggSk|3t-bJ)E)vvn^cD+qsX_Wxa>T#_crU(P0Be>U`i6XJLqq+aH%s3b-HQ+MCV;4?oLl_9Fbak7mb~sY z%J&Pvkm#zH4@y=ZcWu2Oqr-6T4Jg!%Qie19bMw@HVbNuH?|Weg8r9BWuFfmo#K!Od z!}R_XnL$?!{qLKPWH(```3HUak9voiDZEKDLbHd15BipkB<+JKD*!UdhP%H z>hUjq=I{UPZHMPR{cm4?@ZN9z^H(nR(I?~JyM6H4k-@XMkKOkBZ@>Q?Fa7N}=x*3& z8St6w)o*y$7w@@6{~n&R%e%h#-8iW1J5BX`A9Ndo3g6s?VGibW=OK(Y*hR8=6jF7@@9Uu(P$%QgRSwws`-Qc`ZqrCi7$Qf zjd3uQT$F*}f)?+uI&$RZ8`EG?Q#G^AK3E+WEgb`wEd?q0rVJe6(H{qS*UxQx#cdEb z7H*r1@_OhiyaD_5{YUcsVV2KzZf_C;c;u0bZ;D%eJUbd5IwEtn`n}TJH&Rx-t*z0D z&L@67GpTz|D{n4@poW<~%)QUN(lE2P{m=)0{fWn(^}EmGGpo9}*tdOK`_=cK`N$b( zY`=Tw`s=Pb{oS`!_YUFT84PCBC}8)tGu+1K-}==ZgU9du(@%Wr-b0^$`t~iqa_`SQ zXY#;%{c%UIg-wtwyH3xDa8Upwco)8uVe=Dq%PSN`JX4}bS{VeojCW%cuKE#?{q6DPme z(>Bpt-tx>BC^gF`&*S`W)4-(=CqMkSaoq9@_NL!&UIX_lZfLmS!_Ry{^LLj0yc{FF zcd)5*nKVdo#{L`niFI-_4w?---u`|M;kpwyyrE7n)C(+Ojx`YLLNiHK{A=}fR0=@AyQ->-mK|}Y8E!kW0@YLO=qZRT|VS-?9^D7}tads5%I3!=(sxLIC zxqR%+s5IGL44pc!$1fubkJ7Zuu92YNubh8cRIU05>X1tp?6)vvp-eblE7OI=x(5r* z)BLg~z4WBC^w#lkfo8{0?m-)u#J2>K-=}5%*}CV%=W1(`JB*otMX#5yg&rz6Tuh{i zpnG{aTexmw++f^DELxz{q0{J&W{;L3l-h! zw%cJFKs02j$E*-;voxMDp@Kn|N3jc_F};ulD*1jLxksUVp#bwNFRLrU7M-|VDDJ_8 zTG|^$1;mu5to8M8-j>&^F?#41pG>$i+*)wHd9s+PfYbV9Cl}$&=5j%f z(rt;|U_NGd`}(w`Loz$-o#s!loRQVplPq+1qf2qqhw6yN?*#YQcR?l>YaZTom;&!HZYU}El(z*4hsj?6mBdyd z3+^hywdxnoX9m{>LbHW=21hD zalxDx4(TP>DHtmT6ym14{E2jPYt3dZT(+byWU)5trW6Ab^feK-|rR z;*7mqX3i}x=fcs4&*6g0;CWmq$M_j86lYw)g{q7zxlomH6_=Ig7FTmwb#C!OE~`nb zR34NxSE1@8SfK8AWcu1mC{V6A*rHBN&f(FK? zPzYeX@wl3Ld>ZE-Y>_%XV-0DI<1BC@JU}46OO*~Bja<~NSx*r`d^b`!R71raY;JXj z+dF6FH|ISZ_rw_w%F#~rqw-CR#mQM+sVikWMJ?##sEu^;rQzW?C6tIJMWF3SgTDOn zzD0beyxcL1z3?@d5knXqoMB(4uqVYZs9Ivh6 z#UVTxp%r~eD~jO=TTyD>Ij(>JyB44Ds6$4_jFGbeK#%){A7iY#X#%+b3e&b|^LGnM zaVnC+k|#a>BQU#fUnR`b5?e}1Yp0TDN=n-f01$wNqJxR0v(?`yEM&4GT)W$5&fQKT zL^9o!Xjc)0AOkRl ze21!?`dx)We8th9Oh|8M@+HUK(+HP(7#jeO9{~_&5S_{7sp8q>UUUpWGSPl?3){f4 zSXtZ#mDAW*(c^i6Ji2;0c;j^dQh1*4s0%Bd>x*Y4hcpkSo{wJ=)T4`+ zN=8k_M>YpoZI1O zTWrlG$wJShoS<4FX!t$JsG*L9ZSOgUCZm`?%9HCrL<>ynYnMc4^kW)YWMwkvT^ z`H#zV*-KU`cy(e;^c~F@bx=#Nk^^rBg8Q5OCga{5n*t9XI`(WUaPl8p>J03eV$o>^pfQd2uFUS_TW`<3Uo|A=I?JM(;bT2y$=9o z0kilw8A>aur8V#t%#WDFQ2ieQa7kmJYF(Q@v`fQ1X5wt%)ATt53jWUsYh(t%;d$g^ zZKkP>VL%T{8?};p-CfM^aJ^(}_5`uxYoPEHom0SDJF_&5SKla-rqGu5hzB_-r zS%fDvEI|^+WQKGE4(}|RET4c>a&CU3UA*K?@xcZ){Q-*~G+Kyl<2r`Ev}SV_(PBx37m1|&?^6_lX$ z3lBD-|`PqE|v*f&gY}XHS0`&leWaep@|NvMdX)M$E)gXmq+R_w<(;>t}Fz z3#Yl+<68tWGkDn4d`eltlquWqFC(oqe22s*Cv6VH_ zWtW8M%0zT472D-z{F}U}UWU=KtG^PDb_+2=uukK$Au_2GXkEb~-wze*#uD&G6$>qm zBH)DWk~f=#A%;4*ceK@H9Zc}DefAzTa71B}LDuEM>33B)et&sQsAz|W_ttI_cz{V& zPm?p!kaSC%U^UhLI>3D@K#nlkicQf9@8jf_T#(1#!KN%nUD1xRC8mo<^+!7>tFf+^ z;QTA*(}Zm>(s7gC1A#uI)U5fZ}5R7*jDWKGT|Pk4=nsv$8ui( ztbU;CPn?yjOp4dzhgBi_9Y8JZqHCmi_{3{)QxXYp(oN)9LwM2tBcZ&;sauyU0vm#^ z+D^sztwk;<)K;nwT^rDWXfENom8=xU*&T0_L-hF9^6D*le;R{ZQ~D_B29_IyFfh+H zic9!-^Cid42uVh#?rL!!{`f9_Ve0ISG~*`mDq@Fr7=*WH8&#a%^)5idUw#DQ$Mq7m ziG@~OmHF3lu-MUXdfXf+z$nS!oTtUynw_oD3j7oaUl8C2wFd401 zUYm9xAiZD|SKssSj@S7pQGbtF6v>kFQOH_-8m{8DC2P!InXB`8c*{e+8BwE;hesvL z**8N~;q0&^6TD)dO!SGcX)(nJoQPl`Z>4Q{EAwCMc_0Hg#5|DZ#o*=yX-=T#{A54| zw!7sh8!y{R60iM6gtHoh1_4v%?LJ9HURSF7gtOCFJ3+ zKka~v!Gzd5E1HuqJS$oPZcqd)!o(Y5=Gj_T<9l!w2;5E#16+T%R`=;FY~ee)#h+We zJrb)e_wCHch!L*qzSQyX=Ns#3=so&U{d_pvD(*GGy%@c_qcsn|^+u=n!C_p2RgzcQ ze~ErJMF-h4dEz%dYe`_GW}ByD5r*RDaj|4&LPaMn@*qKaYj#gg7VdoR$+FymD{U+K zZuQh6FNhx7>Z3WrHo9zaMoHMFx`L#6k%~G0MdCE)VAiaSBFy_2Ev?s9ug=pMT8(PR zo#WVDT_fxyD!g-1?oY&?MZ-^Y?TK$f#OVn?I4eF8n-}qf^kOVrto5~ZdAoSBf;B+G zdl|(!jU1w-*(1-zb?dBLcw&4*%b=D!)Sl==7;@Q-fIpLq{W|nq zyr{A^p4;zux8%Ch1QF#ZqZ1n!nj`5X52qa0tkS1d#xTi7osXfc;y>7ICNZ9G?u7r~ zv%p=H#*zMX9SZLQnVY!t%~Z_BpKwdV^zg>i5IgdzFgvuA-PY`d;gh?E_3^#z3fg>$ zg|+Yun;X|3lWP~&Ao;(!_);#nar{b-3{*?$t}R8>mul&8I$4UQ_%(m10t$5ZnX=W;8e`x3E zbNBiIT+i?+b81%+&KO#5@*DG>L(TfO*v+&X#XGqr-5kL_BODjA_bF|Sw|4OM5l2lo z4?!Z6!|hPK{mgiK>5w~f=>C)!n+filV%9Inf0jLx;W{`qoaOhY_7Fm`WM_Vlr2E%l zlbs^t=M>+sNy)4@Z{G(uNDtw6Y&HNjEhh&4xO>#dw<pQPn)QI@cHFjn+KpAuWiO5`E++u{CdwJ! zt`a?Abl~*cYCF4^tKGHi7x3H?c3JXFGpiGY&3Lx+p-?pMpi#we@)C$3R- zvnm70i^_m&^D}&dZ~)`>)lO7Z?-Rq(n+fHDk!V)krck8rLxv&TF33)oQ{YH(VZK?P z)yw?NxKTL_jNA2YR05gv)<^xIiA3G=LUD^$^@lhQaPHGST5hH4Rf-`pXT3(>DP!by z8#r@fA&&=CG16Pv21aKuZq+t78-z=|+-WcA*e=zM$PmqTvF+cFHn_){Rx`0P%ImZR z2%NES=j%D+!hRSFAAE`ZjUf;>CpmKMjjAhv1}z$v*f%FPC>sywz!pVl%L}qC>Dg3R z77?iJPut!O&DYRPScEzUneXk>$$JTaCBTi#(+s|)Avb4e^85hjiF%1#cO#8>*(Nz8 zlgDs0^a5D}ITCv#VCnQ80Ln2l$O=4(F6pweqhysWW5jUs94&$mXA(jf0K;;ZP# z=+p;pTVKcK(anQLHw_-GkrL2RIBt*E!;j;B5E%jODKMHd`}m}0(i{9!tNL!FPsq|@ zv$~8EDdWC_guz-=BhalM0@Vs2Tym=r;a6h}ETfber*yfWb?c+j7NKQp*`Il{dU#p) z7X+3p@S8sDpQ6{Ky7ign8V+7vmwZ40HX4VrgE&?TuV;1|6wRQb6mX$mUmJxehVBa)?$9b>vc7V-)L59>AFg|r zj;bUO0dPxE7coxFMm+1y9Q(kma0rPFpTUlC1ai2S1iSyE?vkDDnf>p+_oqKDu9wF@ zv+Msa{M%j{Kk2fE|sf6YhjfAzEW@soT!9k0ilSKV1J zf5DD=4VNp`Ot#@iI(9^-c0i^=LqoLXx1?EER{HX{3VG!5zK#ty47GzLgp~N+8?~&nJ+LwvHa~!z}@#+(P4&>IlIa?UaFiS{s41G8PO_{xE{wD z`aA0DJ`YKe;u`Q?XJ@ zmBKU<%Jg)>%0Hst9F0j=XVIKN8Vq5 z`|zc6KSz?6q=L>amKMP!k2-__YIF~_XR}xS@3C+FwTON!ymMUxEqt5+X9v~TBQWFR@D$eoN|XOm4D-F)0ezAtj83fu>BGimGb( zN4QJndQG%ZTf&;L@cDmcw!Zhns306cL%?NS`^Jf&2AgTfk=g$oIqo}aEWh&Gb1#U< z!IO(3hXaez`I@j+~`cSO0b`Zy)7hXbFCT<3zQNnP^5)mYjP_CU&| zZE*5Zbfjw;^G7VzpxA0ESM2DBGL+a0Kt;M$-A?&i%$VK{HU)TWAcfxi>Ed{;S^~G( zLx6G9Cux}jkC(imprs_qSt`7%M~EO(nfLOuiJk>JXPdZg_610S&SP=m_teY(3#1RG z4r?iqrWPSH*e*KG2KV%a2@Z1)KFu$u?;wYgd4EFyWl!N-DoCsCLiSWk z_zHL%1|c2}?-A$;5lcsT?}LyEoRYUQ1a^=Nk21Xc?+0Jc-H03^xvJ|w-2nsPLE`Kd zq(QINdGtvKhsJ0-fe3=dqdtheN6ydY5h}qJ#z~O<=rY7sDrehblbgA$I?qzWaPlZ% zx%xcZI+h`ZV3&7Cp+>wrySd=q**owsm@1b|9q;Ge`3cS2$iv7UZ+|?w5b1&E>C{{{ z_fT#oyfBZEKpmr!q;wTZpq>Vv_-MLN?m%)%l`>&kqcKs(B~8t10S5Oh{A)=3 z*2T<)r>=_sYqys#Z>JA~YkO6p4>|vik4;Q2Pkq}aCOXLJB77b-u?#bp(&wh^(oH23 zf<93Po@+APfF;J_(Hr*lCwodi#P|ovsh)_2+wqs1<|kH11W9U@$}_mVHSY#o*l6qg zhIP5vs&d^%9a%Hiy z$XhEpO56sR)c38{%9SW4_QhE!ngumr_TdXWhR$M-nc~vN(Z*|^v=gJ;-fq=xW%vRq zG37KS+SaVVq;5W#mVh~k)(!+$SkIe%)$QhrSWc2TI7=}rB5(}-S_iv8V8y=bZFa-b z1n_`BjcyEq$JKTut?!2F1zY6&(r?6W6#CWW@vw0(ped<49@1Sq7!g1QB^#8X zzf*-MwY736MEPFrWAnlvH^ymc#u70^)1HW}3Jb8atVp1U-mW#N5=zi#pw*4W zSd(G?auVHSc1?Ag3Mo}Mg}1-FtX|$$I}I9#@rrJh*i9y9_qy;)47Fn3cZc|HdGp-} zV!D=E7stc4Jpw#yFchU`QdT&tG0Y9yb{a`JnE@u-^ZEd89XYdXFO$8?_ZEER;ot{$7_WLAId^m{j7b8vk^sN8`^S4T0cssc87n!E(`zbk8|x-^fh|d zqnMdK;qzd9I3dFS<2S|v3({30OzF}K+KkgIB>e3uph5CDv< z;AgW1IS_Zire6o9IH1*+qrfHquEdY{n7|#1{^4s_*C19X*(xTHYYH#ElovD^D-N<| zK|Qvw*X3O#7acHLn)r`#qK1D=+8~#J6O-DXDX|>PC~o7-RgoAAlyL-Sf>lp#$z(%M zn&JE*V^HmI7RLwiSUa4lreX5HD3!O)pT(&{6zW9OF{gq39`_Zf98foiu1+*D6N{OV zrHE-8IUAm_Nm6U`48};NV`-CuH`{7jXzzGaG<`9duhS_;Q$^-8le0LRh>eL;lDQym zuPLdknU*4?@+nC(9i39d2N4sMllx2(w4ebrQayGC9^!0&FNgEMn?3L_5&f&uulPZT z7=5gsT+!qzWlAPrM_159$l(LVK^dPE4w4m3PDWYB0eEFG>GJB|qzpl< zpg$X zX#&Vvh8rYZ8F^g~h=A&Cd$U(HJ31(7NeW7JAMyid5y4qbhvO?yR8k&XfDI%det=A9 zBcB4vEk?Tx*EUtX&AK0E1YRH1)?qVgpbux3&&ylokjIPTiU1)% zAB>^+UIYp3IW=@^)@`;RChLN$QoBJy%vo(<(*w>|7Lkvl;zBv=Pe9Vsz*GRpj4+m5 zBX`;_iM1?E)Iw_X1zMIsN_X32DHv-j!(nUF4@F3(H9r=!Y}(DQbTvsiq_85b+$5HL z3lQS(%)#_BdkN!!4f4bIPDgVdd2Bl!4SL&YVV@b`(vZNZ_P&{Ro@LnzM#~f*Ue}ef z!A9F_>E#Jw3VUJ(Y8o>d^~*-Ptz{@01|~FwopgeXBQE3UNpQy0S9wZV#+IGNa*FU> zXmApqGFX|k6l04?9dKm;Bx)X2M8_XRj;2*d3!B)wtvcG+Hp3YCuoa7*VUsi}_I0Ai zICHUyL&S1Om1R|+diW0!?}t8t{{upH>l!VA@abDSP!>-Ki)I9y_+}vC#LO|PHM?ah z(LfG~L%>$a6dC3au}N5vdTkt{>jQfxT!gd`a=NQ$Is3JF&0;)*K445ooI*s&6lBdI z|FyfRMOTDfOdMS@yaMLH?nbnM4%?D7OCdQS3zWgjnFA>njew963u+3dtaB3*v8^r4 z)9&XSS)|=BfJnk?GBntIc`c(d2>;+i)ZgtX_*&Wgk(WPGjlINnkM%iln&a`A%0g=MIFhjEd_&`i9zV{Rg(USx&DOH63(dd6_djg2C*sT6dGhZ}e= zy$=1o@w@B!uDNdZ~9FWYlAQmj%cKMWlqS7Zyxu~3qkxZ}#9#(YI<;%F(PNIT7Zk#AvEbs?O_LRhSHMra_)%5H zPb!DT%HB6|u{ykt)!`)<%C_i1`RAOFi-B{Hz%f4Xpjgoe$R=ha<8$7fqs8NCg>bMn zsxlebCsC4*BHAm=$jqyIVM2@vb5(Xq#BCXTYwAp{GFpYs-Om+m3nlebCf!mF%SjxM zl@_c(PB!&E90cfDtfNY%xlJf?Y1-5Q)$TKl<(Cjllo8WfH#l$wPG zE6riSxi~NBPxpVpv3^GT(eTxz^- zT-3yX%jTGn43Q78aum)fRRbZsh9N+?NrnJ~=l2lC?ZEy6uC^0^?w7);SOe z7E0;HJmd42xg;!M@f^Jr7Zs+h{)2P-ApLMtDv;x)nYtXM2!q8RfLcL%C!$y0f$=@k zv1RczY>6W?VX8G z$>HypIbqpI>?Zyr_%BGVAV5J+I73`)KO65mHeR#?N5+eU&Txfq2(`o^_SRtyW`l*# z+T+m#BiGv=(i*ZUv>cJDRFNzZ_)z_F?)A%nOu>KVEzHIo7G~oPS2hu%M)k{>w8}js z!xp86i}B6e>z9#4oaLH^-x3+-HW(38+(yNmjjy5L=Jo~1$SK^$tF~rzw5GGo%+%NO zyqr%o-{*uyP)S6CPB;I7QRGjx23fBRRbWj}T%dtzKU<4xEh;RSVmH7&*V;!n()|cF z;cHg??*h9o;wAZox!dt#(kBC704w;aK0Lw6&R`^r{g1ngQ#ilINMb<5ulRvZuMwZ% zyc+QdbJ7oc=hf_lo-kh0%|#{MTxQ9H;((j&^daQ3w`Zr`Jcmp{etRC7EnI%akFB|a z;z&MS>BrVwMcN^st|nT?<%N_$ayh7DYfj@38#^uMNZvzF9GqTr0unNky|+MIiWVUG zY8h8{)^@)lV_3Woa+3z7_G-ecK5CK9<6c6rK)Wly55eb$<*0rb_CZ4}xNLP}!7435 zsuj-ODOq*HXcFU;N!=L^S%2RoW=-6FvdZKzNK6hFyqI)JX9LITHp4I~#eWgr$UXASozxS>Frp(hN}Z(CPyINDz~m%lzgEzP*(BNPF7>kUKK&oK|!yBp3LqR6zK0O|-_9lm(7ZDLj_UXHi zOU~W0`dc#Jl8?(qZ^)R)v-1pfcPy&A<+j>(we&Fu8?k!KtOPSOvU<#6#`kDu#%|=p zk(@Is8$ZBu@f>qkO}zvNe0flF12rT!C%{;E>Mk%)j?ArekdNQv<&J+Fhst4PYMqUV(Um;jU}ZOa z07rtoo)4l4sh*y-L0rt~x1OwiUt>nE7kL{U4mENByW5FW7{6tZ+R^b*gq;9DQ|3aj zeM~77j=BPv8L(&NU65ZeGsx-#G!gG&MqTrthIiyU8B|=+pO4e7`bv}4uX3uzdAVDP zBZ8P2;=6H6+2oT-prPll+1*Yoh*jHz(d}dprc`l8-HEN=tc2*LYZWh2d40od`1-V> zJ6HcQ`3Ao4t#IzMO)e<6@Z9~Ocu_bP#RvBzN8AG-(XdXG!IBzx?lcZ3*$AVR)W8T3 zX^+#+NLVELp4dlUMe!{T$Z1@ujQwPJ^l<}=!DE+m6Q3rkqlNv^l_y4eUN^iI`w`g! z#*-Lvq(GIHnldSSax>^Ao*1omw$kL~gih8HB`^HP_64C;&a?5o}nlM?+&+H zI2Z+t15?8m&CdkT3er-U6o-|tepCnPs$c>$$DWM4=?=Oz+RXrGslF&uj&3@0G^QP; zVAN92wCqzu%cHCsOEMZ`XO);966Y4^`fFgo!k<<8HtR3f ze^%>@B@vU{@3ds@&1LlyEF*fJ=u;M18p|kU*dRc6%u_B=ASD7w(u3gO-Si+J1?)&k z8XAu%JBjo5R7#cUlPK9P;D>A~2J}qE9A*$F;|1lD^b0+s`uA4qPUQ}6pp)9lPFDZW z2_tpj%+hK?Wo0jyR*O0gn*}du1-{RqlafaH*$tfFayujkWIY)OBr}EXrO2vFmk5d+Vg5(R@PF$BP=% zmoXD=;t-rh&IkdSh-FmhBt>vt17OP$5XDi$O6k+3AEf# z7v&AI8F)vMwy3;1Hxm6vuH1nye3Jg5<*n=|D_6+aRGnsbO#-dIe4gHpf5m75=!HW3 zUP|G#&C0w%F2#{%)gu#qLY@*6(^|b68MYhLRs9KS4fhy#N0bN(FajsUj0Ws3V4tdwr9&}48;x$Hk=m`HfQ`|LW5likqjbbPVg<8UnE$^S!`ld; z97JZVvu1Ewjm|>i6sKIMS>Bp!DEjA`@2|^i*7lZ#ry9V{}hfL>ZyoDGfOK$_eKE97*zWC5RYVjBIdfJ2lB9n zs_zH$>dPR2sI=bt6noDuDa7`6G~Rk`4N7o=5bJN)FGGM2N{aMN@vaT4SzbcL*t%hb z*s<;+!aV^~Qc?lv!*RZGCm6yXQR_YB~YYEO9^P8=Zz<1oQ+pM2N~Bx4+x`y-8i_!BZdvMREn!fSY}K*Egc%^ znT@ohp~#*OXi?Eb`F*=*bvRq1%+#m;$X)ZrF=^K*QeX~x!wS8h_oUtwt)x#q!G|z? zD$(L5dr?D+o6;?D4W>^qs_9c&gAeUZDV9JW|0z5%O)QZw{$7y-D#rLAqKa+`i`|N( zyA9p8MG{eYX1)$99~DFHB2=Vl0~{0gCKD>v^DT;fCg@uhl?U$e?hIA<7V?(cULp1V zNj?+1FNt{Xt}qkM1vYI1WNfi8GFob*&cjrlbr33OFP8!2es>eJ5jF?Q|wJ7;}-@tcl5~3X0+8So|0Fun9Jd9 zmm6pEef8c9E2u~9gfoVqnaYOMlf4HV$PH19sI;2ItQMk`cTW zbpu6t6`B!jp-@>|%)C>_4LCHM7^^qr%CXVQ_*2H2v}>9F>aEL5>C&)YX!(fc$raqG z0-#lxpb$1wpniG>Moi?1V4k<6Si`Dt6ueY;x5Xi4_CA^{yKaDQCBRFz%082kM-M>` z13~i#YkOlX7qryz43rC!f5oS11?({pn>f9UZ74(?@dt*C-H-mQfe>7)wE_qWpYLiI zG%gzZlNcPHT5LdiGRQ>bP(me-;0ZWGuu#GP4^QK&;{~w{8x2;UhztThW~GrSog{le z(vLhx8Nk%GG9fhbdQ#IHjG#%@ZJ#p2HaR>1o44mc!LRP;cn^n|=MV6sH{)1Qy@unx zhkr`Vkb%`Sh$OREy(}k?8k}mb`58jOd_RN3t3gRoiKYl%wjD1e>@g5NgQg_EBWH=Q z7i_LRaGXK)(~V8+O+IEQLu^-H*6zkmAGW(mE{fZ$`^W^fn!kReW$gbd1U=tht!|HD z1tqxbjv``mu>GWpd!(p{AhF2dZ2AjiK@91yB&xR=NgE)xIUrJWvBq973tus8VzQA3 zoNW&bc;(sYsk#woZ1Jfw04CX4c}$o%e$mD>FFV(l5mz(9iM5=u@J@D4w~~#r$KOVPm{eX~AS0%pgx~7-*k@O6rRRyrOAwQhVE*7z{9?ar`jW8hBp;1K%P4P5zzeHd2>E@=$<67 z&YM5O^M-Cp>cRPOhUbIU?p-;5{#^hYkI=xo^0YWZL|mNV)8;?I45|9(!A2dpAl(wN z?ZW2gmNfSZhkxcdlluhNWlK)T^8$Z2muplYqGG_rBny+iAQ$1lc{`zeXw0p%IW%U0 z$B_MrDRtDAlpIo@gIy&KapVicWJ*S>dJ{Z56uV<|!Ym5Vmml%_@*^s@*qJ?sP0hyv}X)Gl3p|7PrKM2$ zfHTr2)np5@(yAxD$!Rc|6Uww_#txC4pi7-;$0%drR%`aGg+{xBtKSVg72_Df15#&O6pVeCU*zW0mb0y< zlIn}_A^nheArm(FtBLEF6UV()FVkw6Do4)QjOD#hD~uZn`|}4m4*YqOyc8LFngjlB z2fR+mb_scRgt#RnB!>-EHbVTFaAshI##lbI;684E8Nmmx*#T@#|K?^QCe+v{_G3s` zlM|VQ^M`%ZoaIJe{)dMLP3+3xjI$0)DpTyLW+dTyV@Zwi1sdiO#!0(CXg*q0(aArw zS;?M~!_gwC=q8OlB|nnGbECv zMiJ9n5!UTf!cG=e?4x};qEx9GfCRoWHFdE*-<9oVEW+}c{uBwp0rmg8cn9{{C8UZ8TN9OCbj;g+97h8x;8Z6y$0lE6?#<37~kc3LA@`|r#Ld%}q< z z&sI74y-k~%a_9ai&+|vm0L&gMMbM@#AO%Qog>V2W&@^dqXA246`3i^ZTIl&$e(C_P zg`JO@U1_+PW^759Q?D)-lHgDhIZ2JY`~=TLalc;~C;2z4&O*_xDS|i zfgyLMJs7?*mGzZP-dI6WR7@BfzOiaXOsQQ(^$9rK@Fba6>ZzA=USYfW?eTHrwBtsx zQ=e_+6Z7eH(Y$zxAT-r38_Y##7je<4eq3~_9~YhK$EB8+&l6p_DAAS63COI-iaf(~ zauZaSlHjCr%BpP6SE$Do3MglN3vvIliI<_i8LyC=gS-lqa8uu7@|jU3E#FOHYb7** zWwvNG;^W{gdF~Dcew11@h{qS8zO1N>)?jbV@u^RuidV-dSDN6vHg0nHWWX$mx|n

iO9%8QLy%D{xYJZ8dm+z1z9C;7G%{# zbQsV%0ZRh48lIl`IhheE)p35%a*>S?UQA@8V@hOu&|UrmtpnLD2b+2JP;q*|@A>qaGu> z+)YY9e_sXblY?^Eer0i@ogk0K9Q0_`i-8^;T%af6LfR5|EYK4U z6X+o+W&0DClN6-CDav`G-F3?7pXxHbaQ;44`ucq8?>j|%;W=dW0M_46n-nSYn@G7l z4Irbgoe;SuR|-O51J(;#z0%tE%5ebV9 zeTM+)!0jvZvmNera&ugjD7Rzu(3N*jnbX_QBAmw4=^BeJd+Ie{$ZR%MW=dlj%C+ zAFrOvn;O2)o0?Rf)@(UjGsiye8U0-qbW+)mD=6K z?~5>$iQ831tirjq9sQ+Ilq7611xBD;M*!y9M&mYbg)vlDzS4nOIwNu*gKS;Ra$D7l z$(>f25-hD2%pIJ9-~bI$^?$feFa{A=PhMTh`ePpeQ)EYW2{^?9c}_dk-Jfm>4gjO4&Jw)%FN2M(UT-IY5j+9&$5tB|^CngG&wcr?IDvj*| zzF)nCx}&GUEiF`qA>f$ap#zJ>GEmRquoaZq5FN zLaJxE)|92O5+R8PR{w;e9cd^6{D&u076Sb5@`YB!_tDA;v(49EMk|hzmokT=uo5v- zh!BDZM{Xs<)_g2zE2^WW^w3oZ$M}KXczpsSiuPj}8Prx8Q@3{kBohD>nTcbckMaxo zW;>=cXd1ZFen8uhiRd7P6p=yrQ~PWbXvd;YeYyPqhr7En){!PbD>1@uoIx_a?-=MO zob1DQkHBR@xo__X|99NAG=2;Qt(lEq#T84koU(9Gu@FlxKMMKMgGUUt5x+DFqf8{B|~{e!eQ z$qz2u()4sF&ZZyC2XX?;=F?@~nUB$H24WnLi`BTq(?u#17jYaes#N8I%Jf)t;k8(Cs@R-T^)G*qK+m*;W4;fv}K^%ht(wx!Ua;-$yy8QU2i>|<>mG1 z@$H8VY-R&U>u-?Gc*?h>Q!MAJ!P;LajZt-BlqOw)wgI+Pf2lrPB-+y^tcaWNwpQMrPhpEz($C)nG~^Rf zjgzF!wq)D;MOc2>eCFtRINov_^=|XvB~9&62{hdsz=HNTbS4^ zw+z^<>*fdh1r_WTZDCf-P;b~l4?<{iGa+JEN$^`5g5=dJ(J^2wgg>1jqiTAw^;--K zQHAC=I0vYr^EzED*!s6i!{yjnmQ~Y2&(;iP<7-by^MfOc2zNfRytY-eZparsfRfXL zyLnNz+MThn@$oFja{ze=?}~6EDfS!_V`2oYf@Skr>czG!b5>-(*CpL)-O-l!0HB(* zX#+`d(;+i_qq6zio15?-8ZzK;S$Hq0=wL>u4jyQp*gQI37S`yFBi|$4nsGJywf2d> z)?7PyOpd%b8(wsF2H)1DB`i8SQx+K)AyYF`C~dBKS>2gi^RlD#h#h~~(WA^>Gdgf= zu726kxPr4YA5ZscK)ank^7uujFZ%u#dxwpr0gmcpM<2maMeTSsS=D4#*X5jS4*oZG z6Jffwy#C0M85)QVrD1<<3Lq(x=dR^`$rol)MUd@FU=_GdC zA3B%aRCRlc%27GK)foz{NTZ4Vnmco}cHXu?e(2;-*VKLxIc{bld{HJtfVF;Z=8ZWxnIb2lEfj5~K;XT!SDP`t` zn;K%%I2czpIM6Zur|mvO&@oGxH`Fl%Uaa{Tp`g{d57CII%O~av^*9b2fr+wMm*~vg zx45%8tt^eZC8|j8_~FMzqq%@L3N>LVr^Sv2Mx(J^{XQ7s%)_y(MyX7`HWbj$7HRJj z@-@yUD2xW`+7zQTns39r^xe2Xikot2^m`#Yq&-#Pk>4(^(K*|X(}9$L=8=@I<_jZ< zqn?PzjC?jxdCSww!arxy-o8P?2Mj}jwf6!FY~O%v4lJz(Qq94+{JB3d_YfcuU;w+XsH=9u5ZNW*->cs<0Dkl6ST&ExdAov9s4X%m8&sWtWP zVxgfml-~k?GhwXcTcL|umO0cP%gjxF2FUoyJFsR(T1gq|n8{Qekj2EZu~pPw2R^)+ z9hd2()=zx}v{6xI9@iK%9DyNh$PZkja5lGIE`=A1*a-#3Eyaqd)-e91GUywMIti$O zO3I8e(Ssg+SWGUWNua!syT@HQawI6$_^13@mF#AYO)6M8^`qqFn7 z7s1^{30;v(C|tN}4jYT6oj|+26m@1VX5~n=R(p7}XOq{YkYjjjHoaq*`oTZ!3zR40 zh;q#w7Se)_SbEJy!whh{lmmYp<1AC#OJOd-&Si~Oqc?Of$T%3v@ZlsfN1y{k;X*zZ zOkSz&3#{jNpCB&7-EiP8hRDNS0EGh0S7!=m^-|MX@6RK3rtF}s`a~n^9-oA`qn(e< zcMuI3cxGpCV~7RVU@!=|vd+=<0HEp?kJMu5$Jcy&IITw1BS=Zl{wA80u1A1jjs8*N zPPq4x=ig*Gvv%S&z#Q#t*0F~o?>YD0U1KV#O4w(o5-OxBDX>h6q=dWfOASdXgNh73J|DF^@4dXL=*KG3 zd3?I_l7a+?HcA9U#h_785EEMj1Vy_m0W{1J!{7wbCp;RpjW#OXMDo7B|9`E0&K;86 z3gPqMlUnzjv-cYR^Rx)_mM+@fIt<1w(?$QaSZQBgHJ(xREn#qLusbAWDFc?mJI??g zlP0HpVqoou-0B}g8_Vho#h4J`c%%eZf_%7MIkqAKb_Pk|?LRfBUIQg>;Yj5*kj+wv z7Gu0<7TTtrUeNdYqrLSy#W&`5>vd~kWLycB0Avn*bO*%()z}zChnH9H(*qF>+;n(q z=fmbNWf?HX`&TjVPY670xCjSL+c>dVD%VrtwiZA!Klitqh_s0Z1(@-z=MmBiY)XG4=J!7{bricsxkVOJnoaS*t zu*@bS8x@b#ZgNrOTRu%zw3HurPG7EpzQnxG07KwJiqJo>m47=2wvu$(IT~)h${5)M zfhWxrF+BXI*BjM{qHVGUgiUS_AWI~f4RrlPR=pZ?b%IUW`t%-AhV)4lxZqJQ$d9rBwocGO2;M z5(>!>)rlTM4Re8YI`Ky~=FN!izH^Dv%j}kY`_e*YJS}9fT3W~)e*PqX?ukaQf9jy^ zm&@zGPJ}NedVU^AgBEh0dEfbx?5Z`Ab;Jq;O_L_DQxWi)-`h;xyf|~S4Eu}us{v7r zcQ51?E|c$!`HC_v0fvw_xqd#KAeR^tCB<+tvmBpA=izC`gnx!(eT@0yV=#DlH8jBFIEm^>;A?MSyJ6xHEB{$1lIWWWfU3I7c>* z>FJ-UT7+aGK3X>xm8pkZh``2*ArTHS79yU4&eXja^nk)%46>Ncv^1!b?%!RkG$gJn zM2JKKbZelotqjK@qXX>0O`LzPUPfe1KR^|2Oge0SZ4GXW4U;@BcNm9{x? zY_oi=b4u{>!wEbfkQ3?o4)&*}c3#Xe*`}@F+Rw}LTZ&s3Z%;KiGHP%%xvFqnEAGAc z{M+6RansROpGMx7_4oP52H}yvwD^+2I|nN@z6nHsQkR~^zsI`pYdDXn6S*(1CmBX| zkHm!v_o)N$oQ^~TKVZSdgZqR@kItm2@e!+x{W$ro@&(;WNIzf3S(RdJyyRN(37{=2!?sr|v^1arN;K)PnK3c!^+G zB`FIr))#)lZ~g>xVCs`VnMWvZIP=yO#~f0E4PI+k@9FaIHFmr;%d#qxJB95wVMHR6 zGZ8BCE`2Q)=w105n4sJ{?wB@AQRECDJP9)#QM!)`idem~y<|GBES+Pz5~`>kDMGBw zJC?>6rKcQV)CiWhL+0uoe!lddZgnbsjcgdgEv$Y51dJ-~5YVDp#@&v0Hesb<#8^1D z<&``+-o$j}lFcnva*cFfRU2eoABW>`CPIzJ{=+c=tH$EosM$0Q*m@eA?q=wq00+mO z#4<~IfIt5H6I*6km^2yR2{lp4Rtz1V)!iJw3&3cux{N4ND4K@A zj4$MsA|g1Gs7L;`3|`mXM%auPN;tu~piSJzu$4bb6fr9f%6k=Eq22QkTL_WnDW#SJ z3wB+Eg=Wq1B^oIYxe999#GPePtaO=8@K#NV^P-VaghuB@qw^vHLS|Gxt?Aet6pMR! z#YmvBp^5lK46>wj+$)JQ9uK;VWMX5O;u1*?(q>T)x501}ktu4EV?j7!QY%KXwOd-M zJ>~}|iJV`iAwrA4NZFs3dBkKA30;xAM<>QpHfluJpy^#)v{9&@HuQ>BeESpfrSWWz z(DvM|+YlEWOKZn_JX3uXGZAaJKUzjAX%kf%<@ks$;)PlDXFX{5_)LiJ zigZPWAz8aj(tgTxCE95zUelHo;Zq%X~~f%^%SN`{ZT z`kE+Flzx_~fBWeLL8S#=`a@oZD#U%~a|a{ViTW7Y8y~3Hjg=>12*}|q!3T_zKBSN9 zj}x%lGSV@U@lbdT5Ks)I7BE-H{<3~jQdL>qL_ZM~tRJy7*TQsLswRgL7N^QAPe8G3 zMfzz6pcEBdHY3?FpnBDNdvqHGAS2A09($LuccO=azzIJ06tuggBfC}@mk#|Sr$E`TQvNLS1d z2V^*%tnrVB#qq9K$Kn}~50IB}PmtfptY#5}0_?;lr*x7RgVG6^Vc4ITRm#G=O_VC47qYM<~pt^ONuMPBeF~&I}QTl31 zU?6u0>bQS79Wwe;%7IQ2I@5t~rx^kks%kqq={}RDVh#ZW2PspB+3g~vP+9-B(=dO? z(rBt&z?C(SaEw_>6X$m#0u?-PL5{~(JW-!n#+-huZK2{;M&hknJsNd7kZtL#V7!k`##C;u975j@10RU8~k4l*Uk4q8^`N zKR*XS5F95o^^FlV)AG$22RKQVR-r~T4;SI7o#)bU_`6T@(D-hcnbufn9i*ody7$H@ zHu1K?BSm|cvr6pDkuLJwGIS2{p$Wg%ebjf9@qn%Od~C@of5PdZXIep=z7@p${n z;b`55>;{Q?hq?sIrE4aFJgDV(hqqt79)~UKccFi&WCZf=*D!jE7Xz6ml3iMDl1%7BDM!+ zT`yve7-J^1IzCw_o&zltC$724uB1z6N;K_EMfg?;`Vj?m>7w+dfm#!JU`T8cn3nba z)Z#@XOd`~z)Ait;_vI^tcP26yp$yq5n-pkqKrq+Gjp8X{6i@g#Z&mNjN024oMiX7f z{Pk3sRho7x{P8{L4dKE2B>l;n9Jpcd<-~y>8D#>6kkyQT)mG^e&sU1Ul{&xbOz};< zpN(0Z6;_96JA~7S#nFhx(J1YohO~b*+u(FG zHJpw{ERIGjj%Md*R?Tjh6wMx7Pc(bEqK9T57pBoHcp3T2xG;@RhejLK9Ol9_nrpeB zg60L>6+*KHv95A3Iy=Kf^)P8Evtp8nW(P;70i(<5FB($6fqintkO^x-&l&z3hQ}!0 zJFHKW4mGo%TT3V)3-#s($hvco54ov9NL62+QgK;6>N$F;Wj-+66>3(kB#o;8+S;#v zrM1VoMZP7XAnD7kCz!?0pxmlczPlsmZiN1kn(Arsn~a^|hdw(qtMnljN^pNxU3Lba z!OI~ZAFz+>wPSNeu&apen<#mP!;PBC3FVRDru`w-jdSaw;?7(pTSY2oMJnIOM`^R@ z$ik2zKXO;ai~YyFvG>Gxm`nAiCV`5aBt1;?-M)Xsy)QC#jCUs*&?t6Ry{ngm%CX^P zb_a8b7bsOxTHM65FHC~sWd9kUWeesGt-fEYZhC-ph*NvsSLzVUoE zB_z`u>=+<%adswA&8|ua%p7h8h)y%eWX-$@gm#Pl4ArGFq$w0FmVSz;Te6YYABzu%z#;?3xI+m>X>2_`ZdE_py$mr)C_!+57BOz z8yaU2@Ks1XnHmw<|&;U4r!}ja(k@n`>jI9h$u`e<UX0)+-MBBVCU zrUSSo6F&C`)f>i3OqacH1hL*zhIl7b>t5KXvg8z-1Z`^lmX=so@y_3o?y9zO+3Y zzfx*5oQ`$RQB7q!T`RTZgaFdg&lAimDGc2R}ZG`LUTUB`gYTRhI?orWqWBTJh_jC>UYvm zfuzf5C_H(HhQgDFX(&8-Ee(YyUy$ZXvX}Is3y?oUKFWC)j{WAmIwZ#-Il%91|NNi! zr)i3VAM31ESmKFoVKLNUtwyk<6tef&bd@;Bp&*&#pxl}Y1o5YmS2`{YV;OSV#w)tC zGXIWzk4olv-CNH`?@=(PNV0GYGmI};B(keYW*0MeY6j}%7m|dPA-YoIj;?X}OOe+t z=jDCU<*x>cjSH1BS>X49afA;^Grje|Y{pf?(#(x#!OB6p!O5l!_hpAMINg^?9pIWA z>P}u04cI7Je6sK5sbnyuY4IYL>-g158EIemRv?{Rmr9C{+LH32*)KLIdfb?!TSK3c zaTo}d;{dC0>o`azsaNFYI;b;^ATY0KpwZ}1a!VF`yDQ5A7YEu!T;?c7wFJD_S{4sc z=NfGemM}J}&{^kbUyouu*24X9H24fvT-_=<$bRN;N)H>44$Qy@eK>D$H|hcav{s(* zYRE8xkWYizpf z!zvX8_LL0e_mh!1fyo`afB`NBft!XP#M&;xO%qCGzj9L)#-3=n`hYBEVFG8EUaR$B zp0jI69_A7w(pp<9wlGd%>M}%AefF<8KKfYVt7-dC0y1l}kOWMT;k~%;O%0?6H(Se# zUsk`TwX{y0dLrIH7^SRBd9vx?#7RKLuM=u(fC>LCU?JM5t!$G?`dYkHVR!AOQe1de zFu_4bB~N+;B-3#xJAxYQlh}-IlGWu?O1ULqvPwQ(!xv+5p{=n6q`$A5#CLy9JLNue zg8T5^M_If@gRaHm3iO|{lSV8-Y_!d|hHLs&tSPe|A@ota7htCr_R>-~mQ4wL$^n#Dl%rw-Xp2#6ifMf+hB&q2JNQcx zN4vNSt%^a8r$D`zPzVU!qfb`q?+K}dT&j^gSk%%Q2!hvLlokQTXk%b=s>K60mqmSf zvItMq1QyW{(I^XWevea+jmR84K53th-dPOevRhDKBJHU~kF)_UV(GQSwn;8&ui#Bf zXm9a7OJAu8C9;VyvcKx+o)bM75q)fqlx&#F&2wb(<%C?f%kU;^*P01UiU!W{gJ!9U zy*nwu&rgneqymb1^A5(_;AlJ*%?((xm80Iq<`~-R5g?H?E}Kcs)}wW>m!3k=EZxKu zR$CokN)DK|@g{;I#iIHXQI8yt&ck=bX$E~)uU8aJjLpHsDCqFn1NPt}$5%+6)Y)P{ zihq+d%f$F{SS?Ck0oVZ%IS=)=NI6dYNlMP6+aqId=iuf8gaU;tN85oBwTO^(I+4)E zaVUKogkpo}PIwkk>uI1sl%$I_AC@NAfPL>&xrZl;3VuTDTh61`fPF1HW=p;FhaFn1 zrWxw$L^(zqJ2H3F8_YTYkntDfA4wN6gOPJCAbbFtjiB*lXhno zv+s@HLKf7)k+6%$Va2Jtu(>Xe0y|+7tzC7hNnD!aP{Ar7zA5k>S2743H(V42uOyx^ z&ir>6tUDR|@!gqdj82Dtf{l5703=3l|ll--ReycWy)_;li5aAVsI*r=hZh zU*158sDE!oeI<~5t8TxvsUBdph<;&A4-x8Y;sQ;(-ch`^bgKBF9OWoyH<`)T3pj@J zpF810s)i1L=7YZ|pD@^1{@M{s*Kq)0Qh`yyOnFu#8J|X;e;TJB9KT%NKpEnf=G5mnLN*~J@NUPLcMh#P{nb$^)jPb!cj@^91q z1wHhP(4ia2;F*y`+GZT*s$Ev7&b|fBS-w6*d=pWL-}gjJOgt-)?vCkVW@Tu{M6T5s z?Uv))QYFsBvsIM1^YD9douNCtXx6|(NOr=EB4uhsICi8%1OPpd>6|I#8Kx-g31JhV zJ-oH)-V?KkVl8cMg}#2wWK2Mr(H66%GbmcH3hzd?c=!kAg4Qu&)($hR%wV5HDPgE) zO2y4d|3Ie#%q1ez;{J;#9o0I-k^hrXTVjnglEga;r5x%lrP?!-dJG@_R;$M?f2-14 zif8h-#z99Ks}6p86bJ;+5$z$d*t&M;(+jmJor z3Me`cXI&e&{e;74zFfwrjvBDLjlQu(U#7C1m#Jty)IeOhXAc@qgQ51!7Cplquj$u_ z@yG%)SfuqQ9aeMuwB{BiQlhrTTVOD-O)u_YMzm2;`%Q>&ydvUoJkjB6@FbkI9#M38-M&52)wwfjk z;h()2qoh^eZv#zI0^5I^F6LHJqK{9w;K!thU~rKXut|-4?=)Za4FU}>fVIovTJUK{+S?3Ql$5;xsyY+bP@NNbZ$Rdl5#Tly(Zs+}aSMQygt zD6M{5s@IsSSsezGkj+~(X|`e!42c|69G!4M!{e{I3gd7U-I8Rb*}N1P0|Sb> zOZ`eWqZhupguQ9VeV0p9bUq&QQp0;6Qt{JBZ;3SXO+s87Uu>rb%7$Zf}eq!w0sntVPh91(YWF;H{Zq8#1q@b8r%wjfW z&V%X8oVT9hb2J$DcG6(n+f9R4OvUnMm4*6il2g%xKbxBw)4z(Bva4kmCH~ zei_e9`K>-Rk>?u)VuwfsUdJqR-r%i41sRi3%@LXB8q-TAStjV^X7TEsC8BmDWfqDp ziw+hU>iFdZl4#M`d?WUL2@R)MkXA^rF3-lw04#m1!EkGj%ztQ{3_gZ*0veEA z68Vh@cHyzlO^~BDm7gf{B`*qM@FL29Z^wtg!g?p94JIaEm?Z777gG^k$j5ty;oxpE zx+SE|g|x*4(iZ**w1ErRzj}+H#G6SZRY==CX zxj+Hs+rl*m-^S@eOC%eMA%W(J)P}!d1#-@Lu;3S!uruH@MXGH zd12lUvsYqf;3IMM*rK=)6<-CEOAy_cjFFG}q+p4Qpbil{%?G~8VNftfD(#<6!*wrP zV5}Wc4p^lME>=ox-!Pihi!KXj=hp3jpz1h~a;HMl>o)h{Vr^FRXd(&N^Qn_k%mLk6Zot$94ajFxl+Pe z{k2h*B~mil$jIIx(F?sJsF0q(&Z2#)fZk-M4f`@Cr;d5+`L%7X5?0Df+}r#711;l=G`zjQs#ZFFOo}wWa z!s|>*im{O6b+lAcM4YgvdPX->h?MJt2%6taA*w!kGldKdc*muTCL-#wj+!&!$-0rE zlj0qhxOYXeNQKJ82XRNU9a>&vo$VJ@YtKm7cqqzT#6KFi+hr6n6w)Omz+|1R@XfZu zHog&95KL`#bY>WX*vmxmkiRbDV}8&HQwV*H~gsERyC7xob8uX-vtfP)lpg&_o5>5h1 z;=KEjXpgImWmdfhM(N0kg9tZG?%|g>nUTfpZ=#s(1IKK^mrK4Ld}3WWiyyYQ*?Py) z7hl>pj+Wx&vr%Re3<@)!r0LNp!GuOeE*g1KXxgG?R+n7~CVZ&`6B^}E((Fd4qfvqh zjS@^~)*#J|^F=x;-=~5v=DO)id}A|UFWi1a1R{J%R@I99Rjg{zC4Q6~Tla99Rv*-# zdWIh{BFOM9a+5KuzAk}4&|_vLfwR{%9XZVj#o`_dnZoY=hS#~NXU)W51EK`kfB?om z-V~(!fQ+_JqxmrVB<;-(F#2X((I*+e{9jHw{bZTtJdk~wIiTi~3_xmS#hSLe;akrq z>z&q|W07I*%wgsl2n*sn`r;Pv zGX2XNAmz;5RF)UIlZ6fBt`(VuI-(31D`lM0Z7P<43eC}X{KR(+)(ZV#LlxbR0M8C;RX}6B{!Pfu0P^sD9a{cm!e4H@0`a- z>lXLEn#`nii#zUEJn_x)HvZas$L;*v=ktjZU!T`ETlDv%z1wcr5B8Ua(w}-jH=_`s z%}3r}-0|w$Z@=9*S>S$?L9_1r*uZtNgLY=SLo$e1h0Fg>cnZGx+zi5jaRx&>g9gKn z1LU6)NP1pb)qQ;K)h9|!cOB$8a7;&Kk2EvYC#D#>cYawl)TrUXX4Ai&9Y~%aF=o?s z`)xwpoP*_aHOGY{FHCo(L^*VB@WcFY0Euuz^WZMt4@#soKdJf|UM_e7YLEwqL!S^9 z3CzUZ*%@$+CxjLaHm7Zb7|y_;u8LwkK#1x<$CR=VbHP&6zq}bnY0DC=!tecF7g;Nk zuK84>bUqAZWSCAAe@;w68q3Dz8Ayj!8%ygNSts zV$a-E^rv=gQFoeKc5MA5&*gHDGR+=$r_FV+Sa*SF!Ri>IyFj#{R+i$pVeOCnMA(Co zCFhWt-vFB%O^hm9ex7iAUza!nQNp z%m%w^L7%3Sg}?cL`iz$6BpUJxcyU_VUb$T8p4G@~uIV9S>o3k2=#bTnpdnwiqabX~ z*hIE}Hs@qAxqC26Of$VqIBk{yK@nkK`usBfLH6Siy6k(}^B!JHn68_$r(Dp$9KDL5 zp(_{oK?Vcmc@S!0&S@bgB7o<4V2qbV8`p|()UJua3+dOXOnIIMehEokQxd**(!gVP z(^#Izl;wG};)-M(q^`FVYpmRiydmO5=)jX%tCPV2gWqnMUl7BU4~xd4zjug|O3v<} zya$Xj3f#x^wUv1yB^~10EEqG-vJnJ6ggZ~@3bSMpN%sNq2GgnjetN{qNCOt{QKRRpIH>bun1nKr>w z%PDb4a)eEzmis6V^D0ciHygE7+8a!`)3T9H`CT^(+s zW3Zz9*imL!hMkJtPXgqW?SGg2bXy9{2H=qy1^rLW^!J&vKK;G6I7vGGh{TVXS|NhX z;5r^58s*>eh=f#njP7CeQ0FevkkGEayF7p;{_(~T=b;m7(4dvtvl@_h=|`PuKv;n< z1Ohg>5^SUXwg{V~U5#dc17}h2XfICZq%v{+P69deM^E5dVn~8~!*UP+P=NvaWy2+mMj^m72V^;2m-A$zeg_GXTONI%$% zA~V=9t}szU*j*eYItyBmh_aXde9AiT66AnFoXI`|zc2O+ptRy}@~^2uLf9E0nh&j_ z)IJSK0=i6NqZX~a;IWbmg>WVJ&XzcM6eLKw{(vDL8y41Af6|redkO?1t=hANeklj3 zZQ!x~yPB#FV`XxW8^M{biU~#ao??U*xh3TJGD3ceN;=2#-c|V81o;r)K)7ini3)I_ zwKUwk^yGxQ)YYK_cy})Z1!Cwp!HvB) zVCxe?i9VXysI1X5{peI>%{(Nd-?40lifYGY^>O} z$)b5uI*?!7vO%K|LYf*~mPUDCH1bo?$WKMH25BPRKdIe`{BW-Lr|Q*^4_Nbo7U zb~3X%?Cp_kHWh9T|3NG4b8#cyFK&BaKDN|>9435$&r6p%;;xtt*{I|{Bton+2^aK8 zU0em*lK7^G5=J+Ra5wz?`!NWL17QC+-gK@+n(19}yqOlECk#VTK8$r3z~N0IdkhWw zG1Cn}x}Mg3LwQmmaJ!>9#REf1M)SQ|>WD?i-2Hx(f*2#isk;kjLRSz9wnkR*O!j3z zVWqw?#O~@dTjTuV2`NwmXObuh?hC(=OeNytqLv7YZm)P0{FpinE=QI0j_M{e01>Q; zM?vM40*;GF(mUD|(tE9eGa8l<@ z5rf$7U3@IRt?tldw=MQweLD}?9UxZcR05W+s>f`b$(=ZN!OuWSGda;MD^`II17PWn`5#Cq3mQLGAU!5RV z4e^p&!celF$RQX?kN9DZQj~>7@fCWnLU@=zoDG8-Zo~}2WzWHkF3C7^`*2C7KnT4a z`T;tIqQNECkn^MFe}|eGdG@*ptRCLGO7cxj0NQ%>vVD}(oo3*i5gdk*@&WD{nXH_H zN*T2IX+QO>SSrejn6D7@)O7l2Yk&e{H56HH%MW;3&4c+$Np?a^Gy=$08QoN)%n2IT z?~@#8LY}dW#}#!uBrBN+Sm%pmSE9q*OMPC+k!HEj!k!+DWbnw-tZ|418nFc@M3X0k z1_U^<6S2)UMVYX;c3nv_(fP_0;7>-OHp4F-X}lloQ`SZvSj9%O>g8i=H(^Qsj+P1e zreSnf^Np{)TmUeOIzM@6Le4kYlAYoi`JQpgj=jHL!_a)c@xWUlp5s^iGKg^5XtF#E z8;;HFP~6-yZkcrv_iSQs9|K)3ds;4^eB-xgCk=#lW#>cJpho}$Q~@`uGVdRMZMo^V{-sE3>kmABk#rIU)@YDaydY6nPB)Yi z*9n+*)=f|BkW41+?kFFYp-yd+6lQH?RMgbOS`1Jyf+gY(+BfA;R&cN!?DnP(x%x&I$0R%i;6DW_3K28*XkzSAI{>}CW2)$5gEgu*w(@Kr+X52Y zJ5w~c2N+!6Fu2F%DOnx8%xwWQvIWqHYpj5er3R#^_B&2Y1E}ng=_0$bc{B_ZPX6zB zF1J2=vCV?3eOIJcWZ#3{O|f%Dt$|TI@eX3*^q>xhMkXF8f3!lNfqrRSZtHJ0f$R6Q@Q3nwJ|0Vb#K_Jw&LNogWjL+5&uV>o*6tC?$gZ_~Ns_K^gp&KxLzsJM|0UOTli zFMZW(k6Yo}d~C97fT_#xJI0^8CIS<24g&K?cC-=K%_-<#AIIvIhm*SQfPX1n$a3BW z%Ohsoh)(ImBHTWCQE5_v6z*sjm6qvHK)76!nvb;!1FFdKEWd z_|OA-7#IP8(1T?lkpN`rC&-146%ZdpABtS1gqS;hcIhoQi%1;E!LKppU~Y+_U@wvB z3OXrC-3N20{kHI#*F!+7pK8r+i6|`Fgy@j}@K-og3CQAJD9J75S+WsVPu%)|_h};C zMee6?(iZ>$2df>bS-sN(ksKqw<(Mi=2sRmXyUP_bx?DzZM~c>y zRd)|!5BiF-C4*n@u8ad%RS|BH(6Da}oIFC<*}9IF`&qy=1Fw#kkFNfXY7+@tOhA=2 zd8x@BW@#q-zxrf%;=<-OS!xrs$61C10acg|Anr1|zkU)Txw=Z!m-YB%?=iAcS%eE+ z0=*S63Uq^Q8UxD1Cfynud1x9}xUz$Ku}zCHBn4Qno5J6{IbuwNet(A!4T8g0eb~s; z{73h>YMK{NTPVM3P1nt;8-SW>d$%^WUlqR zl)n>Gj#>s6z95@ECH#@;CgF(rsNfi%>Z}CT3CWb`SaDn$0qfLx#%lS5DyA=GKBiH2 zIgKtap>aS~3|z>M3IaR>WGwlvBA#-MuOc#_M%CL(q_)gS9Z)%wd$;)9@xTM25>fUaM_$<42yiD1G6IfW z*$d)HV>ITZZ)HsdrGe%6;vs5lVN;5ig7&6(sRU3-g!{u) z47L;0&vXw{L6+VX)?ufgM2}JR0G*%6xF1={5wm-k7I%;VgEZ$yj0q$6!xJt_0VybK zw8L(rr2G}zP85wCO{k5?;ZkDkFVq>n6Sj)EVC()O^~kZM!YjghVk$*ZbuJU2VvkYC z4D7}er)TYih<-8ZP*y)yFt4$al8+B_f0Lo!=md!viBG={8OGPp3I`K8Y(&#&F*fGM zN)=B_nJlN~U1ROCYM9pr&|HNwe6u|Dy22Qv+AEaTz|W$;(KXW!!a+wHKNRQ5U;q*G zMNMUr;LPX~{#0jX)()O(jLJ23l0kED$8H_5+w7@mN_aEbah_ouK?CfUXU#xK`eibE z00(=eV#@+##)K-exO9?$t^6mboqwa4v3R0D8t1D+)I2#G!B+dGpXx-h!U=05Ypn!M zC@_sJ&;&1*A8>&A|J+j+Awxjm)Ni~pYcKS6RO0?zE z9>48lF9`yC+UK`@Eck67m-%fUhq%*%-wvnSKAto{FxEE*&K8a|mEcU%oNmIphmH!IG5la{TF4!lBL z4p^bi+_gyNMl-7tCpmCb+@|{)scVnS z+BIjqTd~}w3^~(@2E)AxDvg+7{jw8ua+Iwnid`L*VZ(uD9m?+UWfveQd4#W)-jhOf zwGqkwlH%H6UW>zoO_GAQ;)WIWwgPS62i2-;Y~6m;?!h z|5jX)+P>)m?fA_o(~dPB?j_knZ2W#xcbz;aB~cpzdNhQ5T){@r)H7Qx0HjZm0IXsC zdiJ0slF7IdE+KG>(mb<#U!FvR#32MF%uKTTc)MS0DUeVP^&7{pXAf|HgR`8us07Y4 zgMRhfc~SvesXTUy1R6Wl?zZc9jjxaIDT>Q&TmT8XIP-1b)*#3U=&X^AN}H$ZK<{DT zjd*#QzOK0#$dp)nL*9gNN>MRG1ypKdlrXW`HbzOV6a4oykfH>f*BR=D?C>&B>en0D zXcHblGVpOmm?uC1gAO(8`2@ytcf(=(TNBfM9&M2N=$4xeGQB`Cd6^}>>v;G+pcU|P@S7?GMx4)+T={; z#k?@Qkv$)V`tq%^I`J&dWbdcpvV!g6J@f^UA=gG5(}{#b=dqV$a6PqG#uJ$~IFhnn zM|6*mp9t4C^UIZctMivSka4q0XTc9pz{iw0E|CC(SpfbtoP035EBF!CrlGd6skPYk z#4+>r7QP0M+3Q&43*d_x&uN#9#+B_w(>K{?WiWq%v48`H7Z+hbqhujKWdcUV3hi9Hx5mMv0z6`xb;7nF@Mv{! z+XXI+*rGGic`9~-P_J#Aj84`MW*fh1TcB#T+x%T~tTaMXWppcGfOEPeJ5!IIU+$=0 zNn$UzkSJhicXdBH>SjJL{T<=4A7BU_GeAP&U&?dth`XJx(-~B+q_n#vEC{gz&8D3i z2$Xzol1=HXZVxJ6e9b}8m%kN>$#`Lc)c9rPX&!x3a@TmB2cit}hdW^G0uO`>nb>um zhZ%{c-AH5?cqm_t2(g-m2(j%nM2PL6A&+(^4aJFcod?BpVD*1sX2! zxQvDiJanB07kC^_qSJ$^jL|QwDmy>1CDx2U%4;pXzBk6oZHQ89Gr^`nGx>Fh!rxsN zSDUWlWM64T1m_&F``|=yyM!j$*`~PkKE)w{_H;xL>16-x(IZp{F+qN#J=Qy2RErvk zFB-ll+4LY0@yqM-JF|v}P)fViywgcDqf415#vQgA=xr&Zr}#W&0|)qtHUqaOg2;3@ zAYp}N@b_n)FgBMEn{1RR(q;|yTa|UplQMqLDC?L;S;sVr&81m`DwJ-eG9?Flqy$t_ z!ggh+a}tStTY9lL6Dp!&BjjF_WSx7?ev@B7p_SQi%fZpO-Vh?!79`GTcuZ3g=G=A$ zR>1WX7y(r4cqVAAxfVAb#IRftWGWKle-HNa`0|IDYjnWaUv3s0noKA~b*B0kl=}o* z6ooJ7Lx4twUpe<2M77dTC|!xs_<*5O*CdPZ)*Yl|Qb$k3QoXyfGuVKcD{(*qTRhEP zRqxDkGuk&4W6Q$ZxnfN}^Pv-JQnF2(Doa*cmj@eVpJ2TA_>yhrlvMCy>HA2z8Wr2y zrpka)E{y}g8qK|+ckBfVI*l7ojwjEnVnU|Fph5ycxXfBvac0}xXqOuosQD*Il68yL zguY1eI%$p^2#d+koKQIxgvdtdLUQ&%(&hMo&}671Ub-ejk}D_B6xElcM6w}9Ho|wt z$TU$$g$#CXl+D<$zlKpE&`PYwq=PWZJN^}T<8#hWR$rLnw82bI+KJ}{iP$gJX<{?; ztUg?DxDmT4sp5yr(sWlYs*?xZ8!g zDoe+U1`_VTYR6-wIHt;AWdzH3&BPbErcivb@bpK} zf0Y30U+F%HX$Y7S0i}WTsgd=VMs$KkCIT9&H$0imFY+~q_o?mNDj=*dAmJtB{U|THR_CP7Jz=%uMMC2N# zb;Acxh^MT_sMyA^j6|=s+KJcPUGpYeO6#YzJYim#ti8fJ!z2St86EhRA~q3AOw_Yj zgQdY!gWsCY2XX*H_RP4b)1ls*{IbND@5)N?YPLeWnkA+UWB}_^eET3T_Ya^>WCxG!x2oxUKFApn zJgou9k|y6A!#6|@lFSEQD8;mxdO@Sf%Cy28LboonQ0BjaZ*ZHyh0wgK|5Osp&Fx>h zAOf1x1xI`M<}aVkcpS1s&$X&FKyEmFe!-}Xq@NA^&ab%G2H;U8DSo@$Z$c;6i+!^- zb772j3~QP1m^#z8TP(Zpm@R0~kd$ae;Y3q?))RBIL9JYs7FqZ*#WCACSlZad4_=!v7efqlWoAW+C zYaw3T+{umhR``Uo8IoD`W)g{AdQBxr>Wb*cDFmjKB+>Vh!nrauj}b+$SJR@oPL5#zVVH@>0 z?x6?mOVpmZ@|#n_Fp2gI>2U2Ct9Q?SXR|S_^u>OY$J$?ZR!fODW3>X@*Fz=!?c^Rx z0wld78J;1=AeW>yL%u|gqrQs1gl@SJpNeJ; zP&6B5rRn_*4ut(LqcBWQk!RV#19buO#Lsif3JS1f1NE%`+p|VXhjZOd zr<3KS=#T})j)SI`Al_4eS!Uq1C^;9Kk#sY7vA7^ltsuL)hs&2I#gI z2SSlVf#52=jAhm(y@b*QX;#2ER%`~IuD_@Psp+|_8at-0!k2TV)cRqV(wuCub0z@e zY1P6B;+X5!736G=Gekqc9H0-d_`1+v!1?<{P!9PbV>B0 z#>S2*ea473@(CCVqc$6bTR-7JLNx>}p&>^h^MEDIZl}?~c1^v&L1j9Jt}Q2`;Y9v2 zus1DkXm;6wqdjKS)zBVNA+%?Fp*^Ct#>0vtu^C1uw8to-xxlF1!p+QN$_D#u8fLwn zW=2{V@zB!JxOrN3SuV$xU6w<|3z0~|KCL!ngLkizTQU)NVzHl@%&8&@G|Kj%Spy!Y zv}hRfX$mYA9D$ylCE+Jx`PEy{xyCqIyA`$W00MxmaC`!xs=M@XOZIs<#`riW@$dxR zRCmCG98jK0?w*~28Ag`|fDP{H=QGQl{5ww}F~P)Dm0v_+6VIg)&!v$eltw(4W(~U> zVa#Q{zGNsJl~W?WpNyav_W099+Tp~$3eyg@DU_Oxwi}00V|ZJJF%IoT(i`~mdi`^Q zakh;|&8)?n6dldN7qg>tMNX}IIjpG47*K@xPf8R93yO2`(0=O25;n?OAmQATdtpA) z^pMlcy(Klu0=cJY6``TCCI?@#DD9N%Py8+ISH0H-*X=gbuv~Z(4VezEv(;0Q-p9i< z)W+684`;{ZM`J!cSjX|EcWI7$JoYZzWM9sGM1$}V@DCAJh-ViX*Et7jCib{2bEguI zai2)(ObImG262idXGi_3Lu~ul;;67JJuopRs_MYe>8Vj^UIW?KU!X1@ z&lI>Qkx@J$wWw8)ulmIt=pf!LmFIww7^ji7_&V$>5i6$JiqJYhy*d*f`&UIhF?*E^ z+oCDR5rswTzKYmt_BujLi#-g9=KDs_$??ZLg|Gp_yi=Fov@WGwv2JL#_Jvp$Z2`tk z*oQhhrphGBaO+zu$;+; zAAcyf5QLV2C8`T`6WQyVYVoaFOUwXhMiZrEm;n$$QlNsJQ3Tko^3aVQs-TdF>`r4T zU(QM26CV|Jfmox6a?*s(pUs4a+5%IictCt)U-d@?@&JFqIi`RakT0fE)a2(v(mu<0D}{~l~i%>m@3MtJ<4LJs~T|>8i|=kKiFOuGiek6 zMWYHXG|JkdkwQWv;z%Pe5sk!5nmwXS%W3k`klAPz)$Z(7tV_gDI~makEf_k+sND69 zOoLRgTT+Nr%b&x#t(9uKK%9=L5UL3W^3S-jYyk0%4M?c&_~@p(8w5@k220jrf}Y86B-}^9~YD8Z^bYUwS)o!dxP+?U(3U% ze+}sb#Kt0_01%~(JcezCYJ%YvM5AL8g;OS~#fl*Fh;FD{tzcWzrv|DZCts%2qduB5 zjazz-gR#*0Zg^9EfOqO;!6cakBYgV-@f)DVSl0AK4EpsPqWQ|_DXg0?Io9$BKlWYq z0RKK5AF4LnClcPYJHfAS8XDgvnf7AZClkL0P|4ya%g$^|*}>xtyDJgp<@U$K0$Rdg zd&zOC2c54e1Q>hy428=uqyP0$v*$%w z#;TlTx}NzIXiTOv-EU8#Gkc>jcjqdJOcRO1Y)UqQXPRI!ApPyk(4}1F~M3w4fASQWsdp#?fH_ z+RuQ^W1CL_q%o!IMl>W%v?IFa6IUDU`je|Yp*1X70l@BRj^=S}BBm@tIiq|$_lu`Z z+u?cFYy9~bOSWXAuGg%P+}c@rq!ll)x9o%XE0~tVK|TAxYV-1-As;7(4YlJG;K`2S z4x(=Lxhj&Ntr3}ig?ql6P)_~yg;%GAhJ z)f+@@;Xte9K&~ag8ALx}Q4P_8@F|gPvEhZb_Jl9$X{xF5hM6_8)+gqvmTz(@Jaw&w z-ea<~fB@EG81Jbm)7AG&CrF@HPkE+^HVv>4^Pj7ytN#`Lu76bw7em@kg#RW+7V%NB zuMJ|=UhlWn2JyL8Ct9i3;TUnx(H%|=KjG)G{%3?cTpad>=R)!?I)G6=JXinLb3`#W zU;{NF?WQr6`g^;k4{c=RfKOLP^BhLNvccusn3oQ4&j zaJ={NhUzF{eoK+C?%sefMFWLuy;kdy-2EK+;MQV}%LR7E04 z^RYP;)$`e#mQd7W`V@oqNyq+P_$P@m^Ee#7{ukU~SY5>{Eitg|^u>7yU5^9fS+;$F z=VBb4B{{L}xt*dkslvlm$--BG7Tupbq6@w1 z7pK5RAT3yjgw^o|m6lrCo|z^6@%9YUjYo@ddzGKjlBvWyQEVB}gdyV^o||}VcJYV= zut4GWWpx#8W0Ww}sFi86V|YDd?6!Zx;@Mk*AI zVkl@#-m%)zOXZ!xM^>TjYb?9Nxgzvk!IAsz9ERwROXkZ|J1JZWNB}`A$o#3t-6b|< zb)E;mI+gdAD=!oIgk!<2d~J==oNF;N(qaULZm<&= zDMW;?_BE)6IWP?6-q}EREvsQCI|9phNVn7>0QUPwWup0@TG`Tk^fasR#^a zME6*p7KYM=a%m`#?0&uQhoa_v2uqnnLQLmaU4+hs5*#P)9Yn-%4xp^V|ARLo15k>( zlc6?xuA@M9B_0w1SfDY{&%FfqHpO9mr$|dR5-Bn1Vm!h$)ES4UXff?flTBUI{J#=s zXhlqy2YZ3+mg-d+7V zK@KdEPE-L8n=IQVz-^&1ssQOlxlMRtiIRgq$uXq}b-CK1TmX791)bDclqawxnDPfF zSJi3&wXTWVP)PdC$MCIic+%MUFi=?#gFnc(ZaldsmjSV(5Xic)oMI44FSFOY@z`UJ z-EvIFZ{`l`dLx&Lnwy)oz&WqxNsv-LXV9kxe5&8qz_P7rCglFQ$%Ma$>1Y0~h(pMT zPkTq6v64KT=qmywyDYQ+J$&mgk3h)q*gThesO=G}B29eB1L0p!qsN@)>aF3M^LoV8 z+E={%3Q6X%uOBSEulN7xmDblsdN}U&;F1TzBlt1t>yhgZZw;@XSI`tYpplQDdf^}y39b_8_ zi6?t$W!g^l74_39zVy@Lf2sxHx$JAK2P>Mzc}f_eF{EQ?kS-xsx=QrB02B-@-17?SeJOi4`!pXT&PR_ zz-3S@=>Lwd!nU3OT!?}1HifvbSES`2g#XnS-t`7I=7)d0|CfG#O3_F6(_M|FLGfGm z1Yh&V*B<%lw?fHgb+t9PGc{Lcg}f2s7DDT=gTw5E`*_>CrA`A;Bf48QWDIUl1refu zl|Sjo3flo4&C=h|Orf^Q8NTFbxXFU7d4<5WyI^Vp=+OCLo<>v_Gc^0E5Si!y_WqxK zLk~I<{_+d&diT^p6(jwtum1j9^_RBfpwf}ThnW^ZK>P-A=^YDS`}1GHshSPKhqPMR z8#PI$OBM@D%4ooDMM<-USk|CCNwIzHj**aW6l<*dDU8G~A&jJn^?BDIDWoz{1|Fpn z{c#fP$|#BE9NV!0Y!|3iuU3rn7$cNDEJOf;v}IsGx!)PM+xX>`F}7p}1Jn6s1;9s4 zuPG^dhd{j)t!3veOa$mx{@zbFOiL7oSTXecKI$fG?Id*1Nz39R{nixB? zkK}4TEs*0)a~WyZG>6Esra4TGH_f%=Rnxp+LBb*)4X(ax|%gW)4XE{bo^mV zE_0{?!gPk66aRe&h7z@JgB-~j;}JK~5Wqo2O&x58qU^h}hu~lb2)%LERnI$kR)3*D zlL(!lq(`j;i`a2bKT$Lhhdb3hT*W#D&1DZeM}g)G1|439Ozs`|5%F7#b0L-{_Jt^h zZu{e0EttTWbef5%5u`~1NJ$%oj!i}pr8$jZ{#6RziC|9_#YEW6{$_)Ddf{M-u!a8N z(Aig$Txj<%SB(lo=oPOBLFQYWnns{`C~Ui^c#pRJ%!`Pz zp*`!Og1B`%ij&q}ntzB^p6idR<@MiGJBLt9e-~la<&z)DCE0^~2){#LpSNdJl&~Q; z@6X+yG;ayhULg1nx~w+ZrnF-+wp8O`U&lD#BJMQGY-U(Yx^NI>h_=V51yEuxXN`s?_nWU@V;Fz3)k}C0V z?-v9zuUkhO##$R&{|Fl1{#lqm&#u#O`>KC4J{!#joYE{v3VRR5XL{8S!K#|-__FC6 z#KcLr?yUK!TV>(HuVM*IG%8n~YU^e@?a8hTH`!6^a%?Ib&J{)GjEc>T>AK;^Uxg?@ zPf-Q)JH~v;Je6)EertRx+R@^89NCZy2Mx9iHym|picC3z_&K_vZC$;o`Y|DCw6SrU z@L;q)vd#7EnQcqFLU}%3LQLv4@KjgTZwO;~7$nv`!~=hhwN@N|qzYFy717m>YgKYR zT3{KMG+Kd#>Q0iMEYeJQq$dOhCnmtaO>P9yv%15jhFg)_I+W#Ro7SpU&XH`zaX?zTD2fT{w~GUxYN^P^kkvg+5{8+`pI zqSo1Lojo`-S|9S!bh%I~QNCHvx6=|LNuCWG`O$p!n8q(Eu49@&*AFtyhnc1u*XN_r zZe95MpCn+7gcID9zVk+x#%IRW7A6co#IAD71)IEnSJq>wW}4#bEkSaceWf0W--UO5 zCJP_>3~LlEpWaIRCL}EbU>#!Y)?lR4^`!G>(ASqSg?M`~0VtD)Z?a}KBC!amz+;&BPme59@sq)`OXM^oH^sq4m+s(+I$gw#VIswOL${!i%_P5oMkb8q(EfLjQO( zR2a>iY3RE5?JiN6PIbja#oZFGr`grJB)i8&ZLle=!_L!})? z5US187wg3}pQKq9VWDE&{S~q+h!2og0pGh~0Q%(u_M2H5Ht;%VWaN{kLa_<|kR50? z^F7?DUtPg9L(QuHBEEl`uf_1oK$vOcG{G*Bu!xcw>U~#s zSfPCYmlM6>nnp`xK+F;XIwdYZ0gzxrdFAMIz8dEjQ`_b_b>~WDm56anz&YurS@nTl zt(Hm)*ft{2ZfR#*bAEBQTYR=ghbO#q+o1;5(YuPqQe?1qL8rkkk&lVdj8E3ZieL|R z=X4)0eCk353*mGhY3PhNsfbhx*&$j-t)h0-e8-h5x{)V*^D%B5%J|ie>|ZDs7ASq% z^f|6@%cyGkH52P!kZ)_CF}nAb@V}a00Y&&T*`Ywl@P8w zhQH0sX>qPYJ0ukys`=CAVbeWQy`~VV857(uvZ|zC!q)ZW01@Pyiuu;gs}W+^F3PQcpFvf1+7izd|^&44Vy^K zc+`c_Z#BR1Cwn_FN&P?)1IMI5&^S48K$Gmb;Z%^r-fJLk1CIbicdXC));7{3Q>lIj zpO^$agTU$}$TVBs-(wYCA6P-8#M3Z;*+(57nqH^{5W+?eGiArFfVgVoI2;jEc8h=s zx)B`K9kT6sxpQCjb$H3u_MsQP=x`@$7R^Ft6pHwC5L9;w%!#4bn1C3JDS(kBvhuks zSNZYJ(UNKW&Gs!#(`V#%YqrMIbhPIPwj2CFhWaQAxIu?KQETV*YYo}w&+3r~kAsNLo$sw%rNtq|R=WVxtwiGgW;vtlmy zFvdB2cfM0YNuN~$y zM<*Di*%G#lxA!a?LQaU;>h~pyoaOxtL@hWfS<(`LXT)dN;Cb)3XGrGP<(K(Ju&7bU)O5sD0tM1P7t^fsA~$REs!6r#P{k0aF|K zJ3(MVfvr(`E$(GwKX<|h^6G!5*CzeUG83o6(KepK+41=|(4R<;ytikkmoP}wr>O+X z)ILFZM)UhwK!Npulk5QM|WizUe!6(pUNbX90J0Bjo3?q7%UG&DuoUYY(g=0^mS6xBYEwa`C60>D_<;z3RQ)@XWNBgjO<%*(S1|^8NT*JM1mx z&*as+i?CzaTc|uNO0K~jLTkjX zwiR7nT9W=s5^5nybEa5;SIn4gNnv>)g2*2wa3Hv$E3booXR%6B&qX`=8ditp%$PJ^ z;lY%T7Jbkfyn2s-4_S=Q=x3b~}h6|Vd zxI6y19yr`R`5W7fQk);5pf_IV|3C7pI5*{2+4bh0U&SY?VC|#9wy;36K@?!1Dp-eT zu(Tbfp$gWuG?XBF0S(2lUQBcPMa4^#;Tct5qRgGYPGG{yOHh7Rxha|DlUcIP2vQZMBQEUi};^}D=Pv1R{c=~hoX%CTLG z5k6H#4xg#!<)gFI+&p@QniKh`R(pFsYSf~MkJP?4ADylC&U}P7ct`QZd~}Z5HQ2V> z>lT{n@JLCS!ergHtmQg7a^X`DjRa(M7X~ga4=aiu6f7a=5F%p9UDXpE;r|3~Sj4(y z8aW7C6wCrz>Q3ayzb%vfX6&pIicQNn-DcX@yJqzSzM)WuKtoWo;#?TzfYirH3kdUw z2I}e;yYv#x(>Tn02AVokP937a{H;gMXa(-FQSc>ZKOEA&aGSx_NC~&fZbS?b@)*A+ z0fMO!bA+K;$by4-@2Zb+C3|MeH4o{(tbn!QsZcDimn^0_d&n{)|N^3kJ3*Jj=p zJCXVZzjPH|e2?RaA|gF_97`59)LT)`IvAmdZJAiaw4I)KCu?A)5VJpL#!`d#;>Q0B@L5UFTnQu|eu1iR4gAxHE zZFq`*%&XUTQp96Qhm~^qV2R7uA5F2383N#~)vp)HDEl~%d&xlL-s-0i(tQse=h0|G zrMh6Wp0<31k#({*k7XjGoj9~VO)uF=Qwi8;C|x$BfgS61gQ*HSM{6n1MF1nO!b6x~ zG22o1kXOcn=GN+Gda6#sc2Y@{8XV-#VVi3A*|#cLTyZdUQxv4Zo5lco$Xy=D2uv5s zZuV7D8P@|5VI=_9yP(GEI=D4pA^QWy{6W<1T*G_1 z{p+li+cjLy~4I50Qw_Ud!1cjw8jdx4vH&W{^7 zgO%?sg#ys7vrbybO@>{GS6TH=(Y9#U-6bMm5TwCF?;wdz)*U0d?R5r)B$`}z`EbvQ z!%eP+-5AQ0GYt1{uMPpTp%|?*OA7;jr5vpjy%Om_4Py>4Mh;4K%rfL0;>HnX?EaUU zd!}xrDw*gj#0Aep^$Qp)q4%wHli7Doc5k~iZt#s;6V1IleXi%lxhku)e85Gwsn(=x z-hyb)J>Oo?E@vQXK{jcxe+MN4#CJ@2F zEuy{fZW|RMv%t8~BD&KLH9qOq$X<9T(>B`tqAl|L_V8zS_&$Z#|6>+@{HqqkCu~WF z%GZ@{<{Iip>=OWz?9V{4ohc!koOi)d>LBalFbhyP7e`4NW;{wx6K=sw-?H>TLE5$( z80)U=B{J2_sDjQ*CQ-)U#}J|(@I(_zlt`Z&KqIM*=Few206fzd)-Hw<;2Lr)=^3*v z;dr_o99BhG>W$$MubajQKV-R_rNB;CCCklfWfhp-*`XpokoD>ZRdu#K0QT8kV!Ids zLalvZdW?ay2eXwp&oXw6rgM}CF7}9+?zl&8WJ08u4av5)gT5i7Tb=1Sg2wM6?$!Jz z@p#=L*$WycSHcT$5Y3Wyz9t6%fAMj*`3M?X5hh*2Bp4|OP4vP&T77@hUeIf7z8?~>YQWBh%I>n z!+638A~ndHymQN9u}F8jvh_{2bqRrVi%z5h(VVlxf#4hmf_kR7HHb$2>i+?_zY@ZEjs^G= z*W?u2Oh}wvH~i)|it2Nsy3vyK%yz4_Iw^3Ro?Is{^-nLLDT!&6GGjk06Vc9|3FoTz zbXPv!K$DgpC|eM359Kbr>YNy6laeWBSAdm3EM(=e-Y7UL(z_84<)(8ZArcGS;6P6 zHeR$REqTmMNWE|=8m(SS65img??#RwAb$yE}5@ds|R@9tgfzMAszHAbwT z?+%+pmfUF7Tg)WgM3dFozI3E{uylp&&J1RroxQL<5jSAPB}Ma9+k-8sfYykaQ*zd^ zy12?DmXCZx7>~%3V?cp+55woq;0v4^V2O}DQxUZn;(G&uB8#%A||tzk-4QTGO}nTYkV7?k-&;2NOF`GtaFmB8}`8* zWk!&$gh;`}eVT4r6P05wb*bx-yWxC?SDUWEp1Oga(>Sr9mTfv1w{m6SpYV#}Ta0$D zWpe@siCVl$jBklidn($W;xrdMS1vqe?%p+Xt^p*rU{5zfrF7dN`z}?Jr0#)2G5Dq%#^C<`0#bwcir!5D14hP z(47#wzhjaHe#hinvuDO7>s=&Tay4!nJrjB0nYIaAF>J98BM&VcXPl)7Mf1$X6Z|i? z(Q>5U{I<8VDC9}BtooU^OQ5J-Le%3taO^}xTj0bL$U~qAIr0%->z$!|KSlbZkZpG$@Zk8MGzQo~K%;wBSg&iT7>w-vTCh|M z@j~jqD-<<9%19gnK+UKvNAhX9QU*tIarA;btMdb>8wK%gdQ@YeY#@be(pGn;2(SCw zEd1)+v|3+A z;Jq~9KILgVzp*cqFg8NjiFeRoHQr8xUlB`h4Y|Q_lgQ0;BdFv=O=Z<*Nn-W`0fizS zsPHJ}UvLulpcWIq&(1?Q9-WKV(Z3Lj(q(EHkdXvy`#6@Z?IWo0b{FK>;fso|a3nK( zXj*b~iBHMplS_O$+nkY{eu_f{kSGmSy|JfbV63+>ZFK}VUphI~r9ReHA8X56$9j>L z6;AwX$!#)Ffb4sO>o4I(Nn7r@)gKeF7k_TY-8VVzJ|FiCANRDij9Yz9oqqjMjoEhk zU6Y-Dmv?%)ce;5=rvMOa7t^iF3@+>?gC*P;Fo#C#QiH6{xR>!Fo|P=*ACawoPxj5T z{Uc}ie$KGCr=7?1Cg<@ypT`!T$EG+BCE5)ow-CECo&~Z^K~&9YbX=gRVyR=1OauiC zEIk@NHBXsjN@s!``DjCU5JwGAD=}wBvkCYVxaSa@LU~rlz!)&_Si_|T$MH3AFJuW` z(%HsFy>)9|pNG1@E~&V8SQ2#0FhxvR}rQ`sds7Ky$@wKHrz;XUD!;aM&3d z#e&0F5xjkxQJjWRfq*bEzoC-9`wf8z=PS(He3U6dSikelh55Oo5;A}jUXHgyQ`P&T zXC=4e6uSsiAU3%f=mH?J>v;wO0-k#C1u<;qRhKzZuiQsq3BovEQcpp-syK~!y4iwB zXcgXmk_yGVmT>~+IzO5DTERt~BG_|Ze4^eY;zHzW^|72U{V~vpLq>4ZuuC@Aw_=^C zI7ddU)7xED;kZZ!TWuzUKlZ&sA*AM1OK=`j&`P)n@Nt&A(?m@ zAjy*-Og(I;2RC+ouw9b9?ZAoIW6oj{=j!$#W%aXYq0Fv;M^u%{d$&Z^yC+1}5BU%? z;mc<1P`QsqO|cqeEYN|;s!cwy9sL&s+~G2mZkH`H@K0=4<;?8;GLH3PGx z?+RX}>xyFQ0bN-RHR2Sc7lXf0C?&`ur2r|V!P$XXA^gT0>Wr%#c4br{gb~Y#B}Ewm zCB$$qbDa4{eC9LN8>9$*B+h$tJMY;IzUJbVNUau)7TsQi?Xoo&1|4^xTT0k4^L3$l ziE{D>l=GtE4n)7O-9E^+eLG4t=24SQihITe@{h(nbe{LoIFn6IGgJI^9w?a){wr9> zY(Zv;owNhV_6m7KSbXz2Xo3DQ3&@<|C%=ZGh;YLM0iXf%s`DvrCM-7Ln1VzzcM3P9@97K4xx3)8LCoBhjL zGdws;Sd80d_w#2)ED{-M!*vP4Fy5QNCY0g9H0pzK)b)=yY8^*SXlrQ0(1$@I=74om ze~dB<=HR15Syl8f00B`96R&57iX%d$UuBk(VSR1`iqNiZ7T|FH$fuhrL#xXtCt2$> z(N8Im@fdSl)pKf~)Xw4>%8#}f|QajK?QpclUVLH5$ za~EV`7LX~Q{CMpDf(7wV39!bUWzquVk+0DszzWP~mt`h35k>c& z0T!)8TH>*eyg3Y&z*J&_j4&>6HznD`thBY79!4xsZ{osR8&bU#Y@sH}7n-Pz;Tk_d>o+`Zo&>89Y zZ0u})5-w%}kT5z&{rXC8?IqcKw%}YEOLqxS^cBz=fOr&;6QY#PQ2GM>Cj;vzJHeH_3vwI=Im>js1 z64#*nD%`fTpinLN|6}jX<1MYKJMZ(HbM934+^SPW0R>g)xrZu&woqb9AYfV^B7d#&er z&bHXb=GIExEEIPZdM)z-j(oX ze?%<%f&8ulamZcqa8%D{GJH+hd(if5+!~#CMmz)YQ7UC|l?@hYfK|5v4!Cs7q&vHd z-;k}fbWT0toy{N}bx$t5&O8>9} zpCj=Z!l5ovQ;&J+8aj<4qgOY^W7a(q;O3KqI-Nf~G6hwdeKg8(oQ1w*%|2Q!IG%`z z)vXvK6R!-aEOnZx$Vm|o9lgnEbJk!L?lgDlj(}9%F5BqNSQ8DyuG1)Vv}vKSPBZ$t z8e|DpDu~O%1Hhm4osAKEKnx>?|QVHX4PYkv=4n6d2UO!Pr@;lf$hl3Cwgbq z#YKEo@YLf0cni_Ym`a<^$E%P-5R0?}FP@~x(^HBtA|^%HTIdgxBizi%Po1#+ zlZABGAV}=u7-6COSbGuf?1WheAS8d<>!SDr9;u}^HbD}=1?P)?^b+V-upGpNWa%Pp^Y ziSZcny*r!I8f#;-JCeV9_wGjOrGAoSw}z`}wh+x|Rc*J??k1fPOtBbXn?Rw2c$T?W zx-w!-!C`XlI4&xhx4&|dV_Bt}@Y|}4cSuB(?M*@(8NimccbR-K!$eFdC|#X}FW?U> zZPyOdt*}YeXa1 zq{(vXK%PrLn(ZSp7N&%0vb;i~k^IAZjFb2Z~Fl44b~M+bjrN}6+a_j4B7J#OTgsf(J7di$`9JFThv?@n5Kv0~5&8%Xcc^HEKj zdAt31mOt;+()hvzFQg&_V<&2rEE&F-^M`?a;77`hezgM$vF$jNJueSa~-DW1q3U<`xr7bL+L# zJ`z#_nf?;zjcIb2nEo|K=Us{E`LvNQs9yOu-ZvaI&^pt~_M2)Yv&1nxb2=O87Cn=4 zQDL2XJt`v(w3?w8XeoHTT0e&6jVRm5PrKWdtT(C!!{qm76hs|lW%7mV&3;ASilXcV zLveenUqJ%47b<46fcf^6qV&^dPT(?;!luY8tC94=2`MK!!4*MgJMZrk#Xz|PzfZMj zK-|}hCU)DmS|n^+zT{LDS6JA>#cElS(UnOOsvvydBOYLg{Q{lCG2B2uDM|ZzOLp*S zV?tk9&KOS97-N{0M%@oWCe1S$!In;`Oe_0GNetFO{Qav1qss?G!JYv2uZ`1n=o*VRMEXFd zzB>}KGew4SHJA{AxNOL3ql>aic0IWmyI>tuCSk3)%@A%I;^Uy`Gm4s$3nWGDAn%55 zcHm^q7_&Q7ubt%%j#`T_S2hSEt8qGbQl%u*X&IK40wFcH6eUS|9OC55N9=t3kSh6t zDGn`3{Ac;0MF~gcuz*mR*@qQ{m?pspheyF4MmW4*(IZqeF~aI#gd-{i`!T|iC6;1@ zBP+%K&lo{k#nzMO*OYPmy;;T1#$lD_Vh+Z;^Q5+yYlQe?o}K(iCEGCe0y^-@C{_kO4foMeb2C<983K;3k|_rKm|jvIQ!Nv^j;0Ma zjeKgs;MI+`v<{P4#8~3AUHgZC%}GR(#aqDcI07JJv}hb#Z6nGa7iAmyp}_{n^(#pB z3bqC+PpxDu8p z4CE&|V7x@=A3w?~gBxiUqD9MAWZuX=fli8EZiaF^ZsPhRhcZ{oOze}4;#1rp$AzI; z@4v7(pS@%>b|N!$n1BnK+XcE=n!TcKm?GF*i zBQ}WND9RWpjkX9Z)qIwGQ22vuQaViKO5+;oyKB&QO$`9xX$j!8eA!h*f--&gv?{5h z+&81)V)Hx8H^1MUQk>>D*{Qopu@6}u{hDvnW_h(j_!=@uly0FA zIfD@!wr|H^+9&-LO`!i@89dwr+`d7{h}F= zqSs;Q&F5J^txH*Nm*~nR-jx;V%8E)?&WNs@3SXtJoH3={qAM9;Rdv57B=VX4F+bBG z*sQ6_E5qC-qecu?D6pSv*f+Hd%F58o7H4@gReQl%1(q=_&kkhP%FN6rE5GPFDeJ)i z@up*fGWlW{&xs1NI8H(}b`f;Wl(PTlbYJasUn#n;tkC`3)b_Oe#e#*-?QPeWgYyE( zVnT;C>pU-SqB09Ae8X^NY_Fs$38Nv@gG)C=m;z>kzaz zTByW|BG4Vv3NzrAYYi+~L`wddA2s&l?my{M_MN!imxHua40E>i_tBZ>g6>@*qOQjL{Zna4C zl({0SV<;ge>}=xbERnxcY~rE2n`8lfV_Kv{=tDa|;BQt!2LWUJ&hrKxHMiLHS;lDn-Zzs8TG+mqazCqggH!+9lOG!C2pq zVzxDp-PQN|75zcaxcp#Bkt7qQjLS$`hUT8?B(D$5Aei%p%reLzGS?n zzb2!~$)n=k6hVPE5Mmot%*tH-Y~@7XcCT)3W{qb#-URuIH|zOL4`p};jF-9YupR0q zg&pEEj+drRP0P=D3so4DYWV`0qtZX+XC9zT63TYc9oxbmO{$2|@iC3(kERrc8fhV%;QJDxoA6Qlg>IT&N!OIF%-vweVIY~$!+nn$#CSVSuCQLrz%6N&2GoL zyeLoSef7^XWJR4{K~BSa(n=3Hc-BH1$arMdogNzp;jUwPGy7jBlcz4j1kP7Pr*VKs z$E>wq(rNG&j)YAhD{4SyxC_Yof<0Le`)NQTML6zwsrNs1K*>v@(1eIhw6H*7rPF{a zvc5om*Y5Fz7CJjqDY_!`=Mtd6-`Q%CzTD2+2*_1bsieQpO?$BIO!&- zd1W9lpZ;s9xzYho7Xz+WP+i=_AoS>01=V4G(VaLWM(EWdG$Mlg)jeTsDW497V<18q zyh=#O`(Hk<_(r6GxT@%)OjmVxqydP{%5B*xc8Tk;|1m7@?3s*YENu%JRhIpR z9ba@ByRu*H((z*BAdGa7s|`7h8;do+b&iqGUyOH;x-5gq7-HASwc5!Ai`UF#vMS40 zJDzEr8L6v-rXOHTr`s0p>Y@x(HDENI#EoIkl3I=!C|xJB0IO=@Je@}CngkhN$oA{v z)oZF?W6>8i3I@A2a9OJhLJhDc{JHsqT>Fl7V_2?>x|@irsh%t>*G;Kd^0ui-zIv2L zF4qU3cL4}`8k1k|U~Ha6lQ(!t$R^v{4ZUSF2y7Z}tmOwHl)WXD)kyE0-!i$Z&2`R#HP>e(bF2<+GPCSb zSo+YKKx;Fokq%_mI2@bX)!h|xW70am9@S9M+1Yr_{+Ibpg5-Q?iFq{5$Qysk{F@*C!BLw7 zMSBur`A}h_-&O%sz-gGP5yScM=dl(ZDlS6o;h$`wcW_L`5eok&J<%TCU>)j^HStwF zkzDKaq#m(FaaUj@ONjSJxF4!nT+8TUV`vGXwJ3CryG)71Ab{;3Xmi#-$3bca^vv=~LjY5?7a)Y5lCQ zBKr>Fi-c4nj-GzevV@S>gBXk9qPp3Mj zT_sbX37#6BSc+Xvzuks&YbcICHTAds751LURNG&U z=)w^AwzLgxflC8kg*0swjqiUSJG-f7aDqDUp)` zO0~ec1@&URd@%K4T7D!q#A;?#f6zNZF!%w=O;#Fu_k&^8eaPX!td_&DeZ&wt=tB;Q zNbTjENGf_%d^lCi+Rw_~@bHuh(D{)9Hd)LcDN4lVO&(f(@PyCgJ7-7libY;l)Pg0GQCMaEu@=?t%e)o8$ zbC)`!grWz~>GfJY8_jQhk`)Q=$}fIbe)^k?@s_nsxMzyRN9UH-DDcO}R8b8z;zFkE zg!$0o?)3b|J3QdVGbd%qwm3b%RPVR~e79a92{1pP-Pj^J4|_~oYrleXN}}3z0a-FX z$xjrkkBL(h&eP`pM|hxpY41st-x#vT5-oAU%`Zf{W}5hqIXyjpOR)mGn(d1sgZa2u zPFKqw_iCgI^-1+a4E9_G`w9Q-skR35C*x}i)&9xytIu*IL&GDc4p;;sQqn0 zfFiJ{g{$b`H>rD3?2vU>HXw1=;=$@eNKnhT&I9$EK%de^l_znUuB_t?qC4yZDVy&A zQJ4_S#4MIO;DE@uEe}N2hj_F_Ka5Wbl{%nPxm|g11^#0^xGeuk9^8xn6c296lgm*N zQ$NRp_^F@gLEzNC=dtnDoV5)orsEfRaH9Vu9wa*2iw75JzQW_(Ti3tJqhq3apwl(c zJN_+{Lcy!3D

C z5NgTvX4Y)N7EJ%|E7dF}ETL#o7gVfHOmeuvasR_Vxf5yf4kPRfCv?*aYuWgi>0EsLh0wO>&{(fShXAgFrdpB*AaB0aF5PLo;P1==B68QN;9F(q0QPY15VL`-rX4+! z2!Glo-D%SYYJ-D=4GW{a6OMWjBKNh7{z=Dz&slK^=IUZ`z;cu&M8>DdHa5+85_g@n z_+^XW=drK5T8ZnQQ4N9CJ{)sNPv=>h*be8XWZEu{Pm5Wo-l%)9Q(I9O`HAXB#*Pwb zN~h*Paeon-PSLQZnA0>`i-a@>z=Pq%Blo8nvy@@nK5Oep z&AN}BB^jKCJeS!3$MlqiT|9(t(K)raQskmJ^(F<%WiynDE8;PSwPD&6Ltr7>eTk6NtVg>^^A9CAYsQ%V8dmFWr|EN(zks;J}gEQ$J z6?Mq|Z|^@#h2qV+tB589De2P6N7&5`?0no40dCicA>m6wC8R2?eXNl2_fV&25Mk32#FEloYQohCT zoMv^=;?SLUleQQPn_}xygb&wEV`!B82KpMHVE0;H|EDfdpwjUjInsUFWgRkH!MPV` zOv}7uJ}}8*3=^K0?Xt(1vy_LWO(gJuw8RGOAps|u5+m4K;N>QSXB^Z89CvoQK*Lg@ zdkR=v(A}ffmVu4o24<&jT>uLl=6Z$#Qjb_CYJ|G=@UgDEk?kvWPq#VNPt@QOheym# zd}^KdNAeCDT!%He_J1?~>DV?Xaf8z3Iy}(j=JP<8+nfiw+(I6Ro2_E~UZnLquZ?EZvZkNA-1b&oX|KrJWx=jgraIlB}GmWmtGHw zD6osgfhQZT{4mKHem6L^_sv50A$kpDukXw%S||91C(JboV+xIdXJ7>|_&BYfwfvQP zSgizWiq1X2foV!oFqBkoc2MYxQ&eu;Aov}r7Tqd!}PnxfI(tmH$s)`V?q;cK#CtG zdk*c?9*+;AbkQ|yT`U~I_9606`zGyanH`$>7EnDj4#a}ixUBF4FaU9)oQN*3+)r2N z4R8%>rKLhmQO07|QJ7LblK{>X`oFOc+NM-&Z8Vq|PrOyHZ@PD5vTl1uC3yqWK_l`z zX9dH}I+L_oC2!!Dk~i>B@&+CYlm5FEn^=A=!Z^f3d4ti7KQz8Tzm&Xzhmtq&Q1S*I zpTygM$EP@3<)P#aJe0hFhmtq&Q1S*IO5VUj$s2(ArSbRZ*H`eY=GRxpH`A}B8Mz#I zF3Sjs!1K^-{M~wTbc;l>Yz^ajo|uhy^*l8j-&D`#**K!+_fpM0!4InWk<*rR+nWB6 zu)A@}9KqvK%lU-?L*9`XW;B(aftB=v#D$!ot;TfJ(T0;aRN95=-4i3`LG>a2YxNt_cE4w=>u!&t8D1x-Kyq^3XawPAR>gXtSxvp4|tTRuCGi(8+S0{TG ze){7LQ;Ij5ULVZRhBFy9*mQ9Mgfr9lM&{^5zHAzTW-I>KD(uKarLrzRerLv1%wr;Z!c&vAd{@?@L8>kzDN+K{ z{%$khUXFK-jX|mUc8*ddYtc-^QB_4IwyGO(0;B6^8|PI)VStdX7 zgu2_YHyTHVs{$Rd_*$Gga`9;|`nMcMUjdZeYgDmc@RcKmIOoZ{r3V%)o>U3!{&)dS!YynvmtawL6+WIr0fi2t8+55N0$#@Ze;R?lmva z;SWK6^?P@a5qTFCOoD6|o7CHH4xz32@@U#;SUIrKG7W5TKwb3GZ;-4jEezF^$2L0c zEg*Jx!8Q$DQ*7`bTlDb_H?84!y?l`UAA&)supv}OmW;oP&qDbB{ri6u_+1pRX`Tvo z-ZlNMdM&Fr2e2j#4GoV>8*PnEpE1^+IcvSy>u+#O{pk8pxOE&+KfHbz2lR*353V1? z0sVpX1M2$|Ic&fBzV&@rINr|2-pbz0-pF3hev`eHy_&s}y_~(2y_mg_J)iwL8(Wt> zmmO1oHao2TtL&NV>FlX&?8)qj>`A^oo;{X5nyt&m9?2fg9?Blf)@Bc6_h-M%?&H6E zvwO0;v%9i8`S*+Lj%@7q?6&OI?C04Uz}=GlEW0_oCA%rRF}oqVKD#cvmiO0WS7)oU ztFkMzRoTkyr`Z+R<=JJ~PqH8L^+(yI+3nd6vma#N&o0Tnmwh+8I9tL0>fJ@zh5UCx zc7FDq>^%Q?r;nnH`ZGo*kAQnjMlIoE?-c%MQ#A$o9{cX8ZO0+c(=Mo5=S5`q#et zAOHK`|NSff_T_cizw+N+|FY*EU;5|&^-n_SBGCKdlH0Sz|MLs~$p8M2e}I~Q|KIkm#x0#cDkr^bNb2YltjXg_Y}6 zV%`l>J1t()HNX=M1A%BxVd*`HoiHUJ0PQZzx}#`g#jSd_26zsTbl1>= zi?P#B$)p-Nx1>0h#=&a`nsN)+X+{G}*iCJB6qi+-&Qmqn!Wx#c1k>qaB`5u)_Vwi@oA7FQ05~?eSK(_SnqGIogp*2CxRPB8|*$ z06WEc5@hZVRp3~+fhDTO$w7|!7Bxc5^f_+6^=8I0cV%*;*Y`A!0m^)~!#yRe%jU1- z=L$0Qad;sWgh#U&;ACNINM8_^4iCgUd%`UCG0jP zH>LPM#J%E#Od|$)IDwzNE8NaW8H324kr*|hT9I&g^ZH$A*31_v4Hb(eDSA0GPq!nN znOj7AbygssEPV|uMc9-02M+&=1LI)MIA~AWi+?Zgz)VBhFx+MSZDgOBeCPsBM63{M zXecof3TunPsqHb>AULogLN;bZ3qGs;8SJaAd9rv7=gGWBJ8)RbeSh7?2W~#EsbRZq zlA-5l_%Zd8)enjg$#A(WWp4RPow5l5|EJ_!qqx*hylf#7$=6lwd`ui-MNbEB+Rzr? z9=n3l4miq+-8Av+cuz=R^5a#DS3K}ju}@!3k1y%Lkm@Xt2yWYF|2e(Keanh*_6Ef^ zhe}3Zq}ApOxM*nCJG{#j`3P}&>1%AHq;^6l!o*b>Urb3|!p?y^>a?AZ!M_?9KZ;9Y zAQ?4>jDi0x(uh?^Y_lJQIkqOhMP`ER=kYW!*5>cexg$JT16&rqjF!$kk*IO2XUGem z{>jeS!211G0Hc6i41^KD9`J|r6_*KFG_4MozelVw8Gp1>wdP*3KvR_hqs zCuzrHJc?y2A6_C#2L~l1=TN>ue)rinL&&j5uCBx$Cl+f9(xt%_+M}3ylBk{{%hn+` zai+3yM}{i}jj^MZv}tH(TiU1x5-d*)-Du9t5qBTNK^nIy1WOBWl6#8C7l8COS;Q<71lz1vu!5Nl*eRm6N}RG?uSr9Xm!5shr9 zaqW-cr;jNS7llneZ&0O(L4p`gYjP4|er)kOUg&_JF2K#!k?}S^j7-8$oQ4fCpSFa} z7!w~4rvmxNz@=*;h$$NePr!9tfxgJbFdXi~;JLVL7(5AASyuFhMVn(s#8{`iR?uFf zY4p)8SY%+O60jvsFpk@Ci8mBkp`d^J<{}}~u}M6Q9oDZ(WQGD`Rq?D)$9R=P`&IFj zON^gY@uW*fdzC{`?o~p%%Yl3?=y6t%E8rX4|@jAZ#rw-`d2|s)sn!cpq4P5;A6hC3S)!S)i7(Bn<^> z?HdOooA;rP*8YJO_S&9)@Kb0`*z4#kS95<6O ze>m?}TA4;G-FIlEo=@264$THR)YC>jSoD;IDaARfqjTbGgci=+J#Aq=sC;j{ATFBJ zd+Y4{)b$S7km@1&9C@dr&zmM}meFU40R%eIEs0J$@o2X8Dexi1?-oQz!$$H1E;+{f zThwaGXR>xcOt~)Wt|vugqTX2#_ow8IU+cE8d1g~0^}#pOI_ojkGMrA6r&FNlsj2ek zR;OW^pHMu|hh-v$WxmcGFe6dlB&f2dH9i3~Ylf8Y zYteN&_=I&(o@!4FV4dgr49=4(kfYDgR#RC4Ws_V*Z!~@)0&kyq)$D8paprQ2G}wIN zhQ?xsfLZ!?v@?K|wi||T5AA`Fo{P<2x{apHhWxdH>Rr6$07^p*0p_hXFe$LDa}Dbd zR28p~EE8T?1Fz(32EuoA*we(DC~7|=6>>ou;QejUfv&8kIw`|&xkG{}HH(9%?*d_^&vvFabWf<>&A6=Hd!v-}5`!y8DC_mtAZrGyYi2F5QN5E@k=Tp2*q zd!Y)RP9fQ7N2w-<66rqtqV>dD7C&0E7?LL*lWJ}yn)yWAl$XMd+FbIQt+%5YWWquu zxQPadaTDEdRleH#WQt+T_LMlSzT+dc_Fuvao2CBkS12H+#HGyux3=F3>sPVD5?3Cc!h@3~1}k3U)YWO~U<+;%g7mDS29f^cD%}eH`gv zGHo{M91Q3%8Mt6Af^04x@-7(AFtw!IX-w4i$MXM_AnuFIi^V|bHe0V32pNdVR>e5l zmF=>fJSpFkR_ByejR`R+tqN};sdb#q6U01vHQsspJY2;lez>zj7z0kDTdT~-gt;Z_Ci3z7* zD)B<4#I}GE9QeT2^!W}NdjS)HZQOvNt=3xVRuegEUxLq4Ryj`4%{(E)(e(BW1Mu6z zM9o*Ts{T()(qW#jU?4@Oia~S^jZ)1a1cgX6w`I~HthqXI+1a{}ruMc>?Y+{ky9GU$lyool1N`i71KcSAr$lvzF;cviF!pS9FZ2Wa ztEqsK;*a#n)6CKqVB4~Z$VA69hBX{_&q()tzb2mf{hFwdC(_ng6VVG#U-#>NO*~yT zfp~T$wu`w;>N+$Yx8umJ)L$vl9!eJ%6Q30@V@1^3h8vzrx#wh^b5ZLV=n@LzTn&X(jAZjF|k&whG`5k-$^k3_M(G%c3+mE_W^umiNn{wot zkuAaS40*pY7*tx^K`Z^?7Amrq zhxs=3teGjx8V0lWL0XtS&)PFR4t{4JP*M45fHr6D)LS^z_)AsU~c- zR9qTy9>JU0ImmTj$*8vIOY1GbI1xQRTl=}8+_SSiT5v7tW4GaOuk}EQExgGx5ko9y zt;n;;v4(t=43_#XdxK|Nd!&SGdowc<-!By(lDs$RO#+Q=Bj}N`nt^y4qYozz08qz` zS+Iy_1k>8b6~8*ai&EZ2&j>~dq!T4p^_GBWW_pcAJ*k&k{htiNm1XHltC6=WTD__) zrB-bqY|@MVi`BW6@`_qbchmiDET`(bgr2SP$UY;1oYl~7HP_{E&}{!VnR8Vvq=D!2 z8p>0!--a2=R+sGumSewU_+f-zLslg6qIb^@70J6EPGd86Uw9~30xvWEtJpOT{UI-Q zZ*ZZ_DBKTOawJwqb?Yz2j>0L?j$b^+|Ok7A<+bDj6ccurj?7L7ylf;?NlUdD%1}0~2?5XAl4=j2dJrG}= zD{|uhvCjH3Sd8Q~Wh>xe*$PG*JFrn^GqHM7^K&Ds&k=4o@fLcY)Dh8^(qRd)VmhhZXLpEdw{|1q* zA&cBnDrZO2T!xNwI0%e)e!5_yGE3)XwJkhHLA!jOINT1lI=6=~y%hg$hntF&>`&7R0QlmNN72aq;yme*MN z4yzIEg$rjOJSv=_z zMr%7h*L6~c27hR2avnWQx4CV`aiXUgx7N94ZJKdocgLKOwx)&6vXIugqp7ty@eLLZrgWdBZU_QO+Z1k?8@ zhn_QNF0{9m^^u-xm2+4nNW%f4ef@{^=r?C|RyrKfQ$Qg7mvl=<{_&dNQbXU7GSKX3kBpysEsNQIoo`$Z- zDzq^RfOb+kIgiXjz5FZ*gQ71zB-QnlLfX{UOJ(6n$A`*ZE>a4qoRo#9dP_k2X@(RY z%XC(ksjt(MC3Ll($cvRC!b*q`Tb@WelwW%}MrEzdPxk_aD?J^M_6&6`oskNtM6Af9 zqYhmDurHmz>V*V)2x{|RF!o?3i&Z$j;S{V)L^DiMoMck7lkCWllSo*kqY$XgyPW)+ z=gHzCN!pIS$e8-U}r$pB?-OS48cjlOrS|qwjjm(InJd`e)LAt0J?xZj5 zOpnMVlUW)vd5)S{iYKNx;&M5NEH%A~F-j*9AEl3Vro*)8?P^Aj+UkesgeE?nz$hCk z6NWUih0xXO6h2;bk?$Yq)<4>VjFjTe2G#R=&w?{c-f|+0@@EVdnQ$sQNLuzoqa?90 z5;g4f5ZOAe+$@G#L)1VGQ}Wm8JE>_y$M7AGPI|R6`tD!4*z-pkYQ>LA}gciqf=_-sDe!+M+ z_q0E=5TzpMm@-F2-k;KBp#I@lGP+ocv(;v7#7iQG&HY}2caTGT>UQ1u7MGC|7dopi zbXK>FLVFWd-a4cJb%R`nE+leiP^P>*E1H4^o>gd8{$P!qoE!ujA4GPc#QV}2JMuKC z9NCM@3R&fOhh~x2gTAjPK;{4#DTpdMK_Vs%dorR~M9Z-{v#sICO2qnM`keFrEO!-5 zfkF9YNp3x;dT#k6rI(e45l=NVE8h&@$j^Sbjt4uRB98G4xn(x>woImg zK2MYr<69@UrzDzdYWi=S&JPrl*^>^@WYgPll#)M@5|TBjrhOHM z#NC+)B!cV7H?A1UBKy(Ch#To(TCyVj(f!3PGASIOgQpg*8vvI;++%Y3NXEIyl61u* z%rchLNRTvz5TG^O2SAZK>3#OG=yiLTnPgH1OHylg8q9F4*-YUYxu$lR zJCN5#A@6!y*2b}j;SMVSQA#6}=jo!;R!M*M0gvoVkY;B7W%RfZ%B`>>D0Lcz6Zu~B6* ztxBgcZGmKJYsjLbu%wE^`3ZTIFfgzxH_wt;C=T{B&ib+0z$UUsvwPR*FN8zP_;I9E zC0QTz#JauAe=pS&C18SQK2gyli&Rp#o{1JK73zRWUl|UlX*r~JU_Oo!#OJ`uXOV*M zkuSIB`$Iv7N)ri3e9zR>$hT+26rOf4KV)h}dg$qz8u=rjip!@G zn+)%N6TG-BC6lW7+_Z*!Dw)W|%Nw zd!DJ8K(-BFB$`T)t(1t8oRleL%Yg~P!lGmL+VtsA&gF~M+w(fjgnOIqr)5Y!%113N zuQ6(NtFKUDZQHR{#9dna%Obo+KiFm7aDIYJ^ca!Y|wn%2~$ znM(wL{m%+LWpnoDIsQCDPg+{eGha>%#*B!YBCpd+=etQbQaY6_%*@Y3A(dXF@vm+e zV3KfvJkeV^)>}GKEfMCoXsO89bRy#4jL(s+Njw2u9MPoJPk~Q&mO9W0J?ZWnT7!81 zs-FCQQBS%@5@LiDd>Gw}+)w$-S9_z8`zbX#>0qPWL1-`OlGT$#3BzW(FA}+-fWah- z!LpoB^1#2CrjkF2Uz$0sWd5|@D3~qsKZ!*owIl136Q2QEUaCbSxvcGWK(gE+s+=KK z)xp1&s?6j>2POMkUi6oVV*u&-kY<{W{_Wn+W4|bcHeyp}tL7}6mfuKy#2VIUKRHAy zq_iyEmtc?G5n{>n6k!DfUkaY#1@HBOxBs?QB2AIC^288#+EXj{c;(xol}I#Xtx)hR zFL<{XytQbhsyY>khc+VHg*KYth>UuCs7O0>m)HM!Q6C~Ow?z&?N=Mjw5%R9cO*ALJ zWryIRngt=l{p`t>zvRg2-;wNZV4A2EEHp{hgwT5 zTSaSJ7aE(kLNX;>nQySZNf(^Gt5!N0t3LWKSOs{~mbZGwLc67DYHa$C<1ghfcl0k);N8Co#o z%-}9>!mM>Ot-(rqXHz`Q!y*~dweT)8?2|x`R7khJBXsF$c~ekts`LRr6!R!Z9T8K< z)x5;)(IroyG_vDXc4`y(lYVZ^jcMRHO)?2yy_d>>cw!~Itnj(HxTJx|nv^H_a7@9J z2ql*vyrHf*rfzz&CGLVUn2$=MiiAtOoivY~`7ut|ndED8W6?+HhCXMR7xFvsiIqBt zcVzC<+uJR&8nNujIjq&bR(_F@*JzD(S&5Vw&x$JKF8sVAB>Bb#?xRqVv%= z^>TI1q?l+>x&Wrr9Ut>CKCK~Cpq$+B7d2@&i+2^*y~wo0E}zz>likpW6DgN&G2&nv z<_PZ{$RjCX_9^pMBw3Kpdvre&wQZz4^#aUleu_??A5JgTklc17^-nZZ zaLJe$!Ya38bXG=-O`HT*dTUU`2X9q;t~1G2P5JEkd;H||%HHpq@M& zUVn92-yH-BIf-*P`MQP)5^zj0lcE}LXBhXQ^S{+uPe1LE8p5A zl3{=;M~p9TD>xD(e71BLxw5@7c(xgUyxBnc-@i`5X9vbH27Kr!NgTMHE+XW}%RpiFE_S zTB$mkNq}#L~%N*2$JkaO@ZLBs%u1dQ$8Sdv2di5c*Nu>}7fal#6qu+>!NJ zEWcE5MX+vbyV{}r$Pc`e%E#*Uw9V^l2b9k4#6ihUA0^Mc#Iarb8fh3e^rHeq*8&;a z%p&2EQ|`u|I&-8g&XF26-gA^VXG?h|X(%VNU!+^g*M7)E#!U|I8t1-{7(h^r`N^jO zv)W6|pcN9VNX&F;0(Wyia4@LnWtxSh*9>uynkg}-5lHGxGW5^U6bnA{EKMxqqA%QL zCag%;lh=F2TQ@6~fVr=#@lPCo;X69b0oy^LLiJ?gOH1U3L z$;q^nWP8u-rNf?qX^13Ql?+Tl_H?Y1IZ{}e2MQzR-n=nbjKgf*&#{Y~e7 zca;3x8RY%};+F2T#+sU<`NdpIT73sh$@Ft5k#s0WFk)yJH7JpHh)w}TMcu*~c52TX zG;7ECw%dxFL5aH!L0ZL!N(|1%oMlhKm<_zQ>bZPoq3g;aJ@WYU&W`DlWq1SFBuH`* zVJIz6WJANly^4SJ#1Dyyx-GK#ZC4wi){O0Hq<&E2bNu=;TH_?;9y%Lh?TgsRn4(|m zik=Q=mZ@;s2SrApM3urs&P89{d$*Q2LQtB7S8<*6Z9{R96S2PnbV>UIO=f8o_%1(L z*0$phEtWF%NHB8HH$D9oBkgH_M6I3k$oI1<2|%WtXYHAVn8u(M`FhIlo=k@<=-Mnq zGM)0fC%mDfsFRWD#y>NREK{%c$rd!6dxjd^C)z)&^D7CKE5Xaz&X+^>I)LF2dkcie zf^ATNP|o38;2bY0|A6iPv;EgF0mBgsBUMYAt}TGTpWQ@@@W}ND((B zS)Na>B6M0y`8-WGx}eJ$s=FT zRW|htmqU1#nzOkBo)oyXNkLMrzo*t(AN;oTNV<=-cnY+Z)wPjQk3gDivM;#Js4?FB6kxDXf9a}nf)bbQQL54?uTP?WR ziRVdsqOC{Yxt0P0&|k4qsHUE!MxN-R{9`?pW9D%LG>Qt2r;|^`nb<{P=j0G3_FxXQ z#<_-3@PQ|=iLN~EaFGKn0VM%&)3#6$$kIwUGKmSz8xwq%rfGc(8m2H|>q`am!Ym^r zI_+zqJSR4_y&8A?iHE1yJuQj9s)-i)=BabmNBmtaHS`HbE#$DRPL&%H2y8lAO~_|6 zpQYSd(EKFCpLqw6-IHS=*7sPLo^-`O|K=T-BT*rq^v2+9kuv#sfYei7(2n|_@c`(O{r*@;h@i{Sj7`;owt^sbfYkm@BF&5D*X?d{yG)Z zTEg1d-mj7Wx-1u?V2r4dP&QPZyPLdrow@+^eBe3*#qn}k^`3W7X#z~;$`>3<5(2zX zY1O$JdupK|Xt}}kz=Jr+iV>lMU2f26xa_2Y@WW!t4l5ONXj?PK8v5|ri{1=qvBvwh}3{!;Jvu^)xTE2CX`7|>%eeK|p3!=m*NbJf+2{AGvpQ|J0iOE`X8 zQcepUgBqjpN*_3{IGigS&JRmC?}*QM#6=T(Puxx@KE3FjU0d94qe*Bs7e4(IzN zoT`P!%YWtZC+}gtJ>&-CU zj7+haVr1;NfbE8)Jo`$5v=`sV5wPFU@evGG-QWc8YEQk*`+;& z3zjh1=?lUBfiRcJw2JLtR&lDUkJjJRQFuaFD@MTW5Lml0B1Ur9S|RiS0rbS{eFZvT z3RvrUknOR5g~o8R`sL-~PIYS^Nb&ONJ((y~-n-t}Wzl$K4YNK<$bdWR2+rj(-m zp`rYse#J|R*}J1(`5VjiS}NUI97 z92T^o2}z06%wgWl5BfE;qS6d=tlhe(@&aCHwl1u^(BY9V;W$r{ROavK;^Ac%8&LEH ztVYdKU@vwCZW=s0SE+m3!tsDmp`rSwIn@nlGkRrZMJn)rgQ$({li*Ko|Q zwO2RtBg&?nY_0`=6vg5KySn%yE(h}XW0`ntF(2e%f!u!Y)SjUx_vGdE3PA4a6 zIMPuCA7il6DkDv+XyB;S00Y}TP2d&JQ)Ic=$YKOU#^FRJa(|~6RAQvwVLmz#7AO4! z0FQQnEBcM_c_qM5G2-yH2g_pu%Vxsz7zcV$50>t2keJ-3$gzPBV`KOn`&+8E&aL1R zh=`+lZ$ch78Rl^g^TOYW&heA05@g)y-LGovoC-Ryb!pEC#y-Kp<>dI4tdOt72@dfB zLnaKSgu%s*hEEI4S*4_E1}i7sBQZv2zLvPTUB&f_qDz&_sJfmSDLj6;NF2eNoI=|D1QduR& z&MYUVMOW()zTb$(P536s^bH5_9cw-0=V@h0WLWvH{T)r)(|YOz?QJGhH5PhLWr8PE z`v1+qU*r0~Q2xyd{spZkPl4ru%^wtex4Z|1kQ`}FI;p-DO=&Vhs&AE5ik8ehKw5)5 zDXWs|+tFm&uZh*aUDgj-h_FgcwxD|fbTay<2donP(;e1%zirIJ>~+SZj+{|eF4`AyPU_J6#&!xmYn;rx$}S%rKmTc)c(iX`{k>4!zY==J0ue zakG8BnmW&$3TB8si+l*Fp+4}R1f5xm{4YA=jJ75B4sZ>_jAn9K-d|SOeO*F)f5$tC z+3?f(cf3uey<>I0W0j*7G<}HAFH2R4AWWh&7euuWnkKJ_azX!EcD7O;wL7WI+F@5G z4z}=kup1OD{!WVnxG-Hf`sfx8**t`j=R^SkN8T?-%z z6Ve|x#)S3}Aw=$-*%o#tU71sfLMQxQF*fBg!)+%x(AJvoc?WxyFYHblF0|NDvZ7*> z9mOVV9(#*eA`WCXZHY0{*s}K|!i;a}R@mP8wwi9eQ#9L+)7eY(ZbfCAcS(%h!K4ugOILTWPS}vmBBjO&m_roN)fZ#m>=KC>bt@i2l{QDJXpa_HhAc!#1KBvjA zw5Y4K)P)|-`e78N!{X*2_7+c>X+fw5gG+lbxYVnlwy6dAA9MI5fggJltZVL$>?oMc z+oCjs_vLH@MmxJiTXl3}mzQjS{4^2Cc4X;Cc-JS36j42SBf;b>wP? z`|X}d<*RJZ+`6Vjs-FL0`|M_ZO<7m{A3LSg@;vBnKP;{dEVe9=xYhxE>vtk?T@{HB z2#M>;x`xEbB@znp{0^kJK9H!8;(CX){C8q;Llp}n#SLX$!{Ve83(dcGz~aWhq9nzQ z4(OY|6N#IuNEj(@D(e~&C-x$d*8em)ZjP4!uwdz%z4mF=a)?T2T0jXT(pwWe1d8&I z6ioZG5}#n&pE<~H^aFW91tj@TnRHrll(_P3V$w@zveh6NhJ?E$fDCd%g!z3-Y7hM& z39wtdu~V(F*tXhkDUQ3>1d6I8v%{Lcb&PAH&d(>;`T3+eEUjS$KpY9PTPsyU=-oQ0 zRw5?zTOCD0O^KcboZB1@D{4^mHV2a^T68iQWPF4y_UG{|DbkX4Ad%v@w~nt6oInx3 zh2WA)>XlBkoZ7c1TncL6?ueZ7&eXo6LI$Ju9h2%9<0@cN>J_>lWP4wl)G~( z$&vS+1xih^;B4}7OiX+QFDf=@tz#<{%Jnz#6?C-> zJq2m+icZ4~@TC-|yByh*`c0f;O5m}8L>n<$cUM5Rf38LMZijecKZr+{5c9BviKjK| zLMOQ=Kq3)rH1BbUCpZT{3eC^T3Vd&j!o{Uo;ohEFy;7#rK)%?Nm~BT(^4dGvR3k1T zH}hpnC+d6PYMKAX&q_HT9QSa*q-r4lu){s(ohkW9S2=G*`3bdcti}vyOSMU3LJWno#*KQQ6Xu%V_Vg-?t)J;eu0ZDhup<~KUr$g zoHA}#Y|o!;MeDNZ5M{NNe;A`p{p(zIuJeby>{zh2`WpApI91FRgC*{qe9e|XpA~TY zE|i$I1zDd)y9;)#eWuggQ--2bfq#DYJ)H%A(QWDi%wT81*{c-O;eE9Cu`%%MSkn^1 zkC0i=cf*fl$m=mK5Z^P@_0-^UuXB`3gp>5P(v9}rLy4#}^X5O%D?%g4kCuO&2vv@e z=(@J>xKUyLvcX#1o&NFeEZ~ox-x)c7$LxTw(uMi~t_77JjG%=P}CdRsG_N?3K8ttx|((ZuFfz467d$lyJV<^*7oht}WIy#LAP~~-$7rhfeY$Vz9qBnX-PooZc{{plUzv&nv`NuaV1bCuCotJ_- zL~BZbUvj_)8{pWW2+r&!4&^HVdDUz%abWX$389%t@p=!0P}tsxaz=_|3wooc zWRSx9uwS(gp6>0lG=5hF{Wk+>f&QBga#;`h&S(1;AjKWpR^_I#Bwv$#_^K(;tEImc zO-NW=B`55+yom$)H8D|X;vIB^w;iG>nFjG~hq%8%?A@cZ_71t%59hC!9}!vY*4K*P zOyolEnrNhWwDjOC_UF3hikHm3Zmj>0inKLlveey@KBt{|)gx)21diQ?_!OV>TKg(p z72U@H@6)dv{}Gs(kwrRdC3L~Q6^QBBCPCcSAx`vz_`jz>EVbaI;)A%zAdjxDm2~bY;TzOqq8+YSLO~Z~<&kAP&Wv7KK_U5E zB@~uA3SaMo!dC(X!PW|enYTL1`zM%qGi#LhcSv7LCo*65LAIr>-THC~E0Jo_p00Nn zaX`eC#x%YT-a{;eV$V{-tQ4 zz*+rIyPkry%N$ffwSAXV@MR9@-}{jDUkXwP*rWyYpae|Im>pUi!ERenO7_4TO*15yVn$j!i=3zxujnddZ7h~lvjTq?dkT_<* z;S~t&RRj6qUjJW%OeXGnd{2%js^m-Ox9=RvkC<8~$@AXK_GmWNv~3ck!sqpm)4QG{ zXol`c2QQ(Pgb@Eb(T3UW;JsX%%a@;M>DV<1_n1?>fo@xxO&-Ct?fC)CtF$wLJ z1H4VlnW#SYzhcy?a^={lX>#RQud!D-PCE85_K>=6M^68%V81G$<9Yxc=YamD1Z1Hi zB-mR2Q~*HM*$kh&(>^|c$*uwa9Pi-vEWoAdY)6s7bSFe5P3WHvL2@vEOBKL2n?or)NJ1| z)cU)!osf;iK=(9tsuPh3lf>hx-q!#4z1#YH*;Z0G3%dT-@{8!WqpbOD-4OmS<%d)y z>ArmV+v1C)PP_HF;&-kbqqb?a70LUogMq&(%jh6MWh}R;kh1X}{co{!PCjm#61nLNQbHO|K0u{Z;}c z#<3t8-|7p-`t*y(-2R1o`A ziJ0FLs~~npiI^m+A$EpC{Hs30@E84dSZ7v%1liAYAfK)F&UbNtUSi}N3t~a4vr1rS zUGEqzcNxyEpa^E82?cZwrif(X zpE--AGam|T6+WkeUi9@G2lVM`UkmhTPv}i`xkFU7i(UA+fgT>~3B7YGo$k>ze0%-L zf{IC)e8PX%b>i;I8tg4slBUk(^cO-SJ%+K!*8Ch=ykZAMpU|!cUBHZ_4TUsut1))e zQJEpzm$UnjAy}%4ZisPF8+0!RJzh8gA<}szkq}t^uT;d&^Pc@>m0q^`X+?z>a6SWG zaoqVG2d7D$v@v!Urj324A0!B_;R||nMofSiSZgF~JLd;j!%+%VfIZ*Aeo6>hapMZJ zrRox_dG}fGScw&GiK77Uux#(dUrYer zU)wUDSXtW>!#!@4+t;=vn#`8GYwlsqrBaQ22Xt^QD)P`e*QE`>rJW=d1myL%8+%Y4 z9&YGobI$}zW#)B8#VIW_enZ{fD>WICOL-3v;D!;;J(t_cb~BwBy; zE-nF2LhoX4;?Me`rv=z?`)&!MA(i>NMMcAHw*ohoexU>|lPPA_*`AU5UI6uddr7wM zIrvZZ8L8dMk#c24Yw1T#GDu7L7}v@81$Qz*K%`Jf<%#>zYGsV;rrK%JBAPEBXzf~l zhHcxeUCQ4{w=EQ^o$U*wc8Pa_fS;yMNL{|f(cis7R-1)s4mP<^tG}%E!enj+^B&{# zC)pdW!DJbO@cn3Nd#1`W+7o`i+E5hxK@`JWs)bA#{a{K#W_LLvvHSdCjEL3(?dpHn zuO2g1Vs57(PLKL>X#!CU&7t;X(yuS8cA-bkNygXTUz?e~fv~nXO51bU`%g+j8Q1Sv{$^@4TY350G~gY| z-w7ka3~gywS&XAtf+QO47&OA_=+u?h7T$#X4vzZeL9AB$c9|+Jcf@zC(jM|CBLoEL z2ykzX3Es{t6s;=)9KPrRcSV&BF_Z?b-bi+xPD9cHeu3u5Ek;b?(Gil|!yaz$LqtTh z7R%v?h-Su^Y9&`6PD1ORk3JBq@*~gKh|4Q1apP3d+ORS}aZw`vfv($^RyyciDicg2jnb9B{crdu(ltQS0oFC{y+|x< zU0(!%bU%UKr2eTdriAIjlLoND>S!t2MY;FeDo4m7xvVO>#+9NN3Kh4F~ID zM$%xET~m4zj~UWjI?`PD!L5QX>Ijyp-;o;tH{A6TU2GvqxX^^A=eBZ?9AfMGR#f22 zeCO=d3D>b4g_32hX$fCeSNk0Nh_}RiSZ|sXB!#BbQz0uQaTJO&C(^B~gw}p{1Q&x8 z%2K_W$Al1i)Z_RZt|dE-u=Al$_dg~X7_W9JQmENJL5s-MRkTc{fl+2Cy5)-lQXn^{ zw~9VrUYKgC_em31q$Ny(l8#L)Wm^|4+8$#;lSVz1Ja8UkGAl3vk;l-r?XHjdfiFkz z)gVUvngZAMtt20JJa;uSUEvH5kWQhAT^lu+Phz~HHx}71fnJzZt%(< zNnQJ6pN=8%waQd%DmO-51VHg`q8ZZQMhEsMz0$yt`Qri^&T^A|rQ(iPoV2(rSlX4T z%L)sSWWA1~{QQdG0P2zg18~MyrOZu%p)15GGC*fmn)^37f;$SqU^o*=%t#3-0Ghc| zX2e}vf1ES{!Jo8qxH$%((Y|9azqtS_@{Mg@5Yc-mDwfB5>6l7NYFb~*Mtb||J*)J! zdLH<*=%}q4={Qa?DpN;)<{0IDMq>MNB+M9kpjkt=E8bS39RE@AQVNl6P{9_`cm1%U zI<-(Dlx4W*gaVpcw3cTETs++pXg77q>y`pd9b(&gM8#gV#>*y7lh}aKY(KT8s2AhN zoc(!GJk7vh&_t1+SF3~wGzF-bVq!FpJAh0h4E!PPUTfV*sXAE>KJ7B&}_W5fIhcO*h82aZ=tE zq^ygSw>hXkP7`_S;6cq3@n4!lzG;i?Z#sWvOQs0P z-Fp!)JwVHSd+gcn39Ql7&=_a}&b(QJEHgK>FS4~-VBNGdO4ycBJ6Y`8%ne2B)VePvh-jVs`F|nI zwg>3M>DA+Q<`=)ajIe#*KqXjbkn6tGC+%((e)GP5-LcE=u1Zf#WV#CLQ5dt`ZTNJ2 zNh~Po^>w>^T*tteM)H>lzLW@0SMkeYETPy)%oen}GN;u2QAv59EKS1w{qP#i5oYg2 zkg>S66<B_Yc*FDSUxEEfO7{7XWB&jM*R5;w5^|T_S)!Lo%y)d zKW`iQlpCBCC%9+Xq2hxMo;Xmq4Dl-+88Z`|&<_RRF;u9BdH|38K`~L2)SNWY9}dtc zdTF9R?De-v6Md_qJ}lI1Z54yYj$OasU;eHbiKMZ;ul&OD({629{zeOv7%vZZ6KWD1 zu4RPud!#^5gM{P7&xZ0x9KjD1l(X4fPm6h@ee+O@Y}2qHEE#%ce}ZLM%O%ewUq98_yzI7VL%giDHkaH2oege_JJOZ;+1BeZ~Xu!+QDd^5q=8oOp{_9jB!E@Ltkjo2_?ED)lx! zi9)HwCS?iXu1#RAHLrZB7SqeQ#Y?s?`QHD6S>7}zE!w(qq~)}@Y*cF%yAk)^+Nh|W zGGEOpeA)L!x#xCf=8p;lSMT~pK4EfwRx%9`cBHUnps{S zVpLm*+-!HWHw#!T|9`W#H##lSs~6n$RDz8ZOb4V-IqbR8Dk943m~=F21}XG(U^CXf zvcY=sbhU<=LmE@FDq!99(>a*hGM|n%&{l1&w6MY! zlHq+BqDqk|v}rY{waSntZ2UZ#TC96_~eqsc2C%zqV4DR=I#3baMOG0U2xDKtfh zq{LEuieYilDSB2^#Alr>$WJsabWcRov);x=X`p5mJf9>-1yB-7G2qVyi4!D5(Q^)I zPJ%QuAXQbwbp-|?f?~VC5{dv?=P))*FxpiZC9kSmz1aM^fa^U&0R7rwZIEEa9hO8r z>_+u5?i|2pafUF%rV`1mnPDh8>_NEhi`BIC#l?0BUWV&+*&chsrR<5et4VXC99md= zPZ?$A$=Wnc$88C;tRn?au!U%jwXHp|83%{70C$Kt%tX6QK8zV^8y3`Fp5S}wP`xXQ z`E?ba=I5i^1P^i__vgLWvy;jVjwuMKUYiNqR~wp72PI$`y1@$p&iJGKc0GT=p{<{2 z7-2RQd^%aLYE0L%auQq{_f!Ugv z%C)Zsur!B2@l^*lGXa}c<$u+uyJAg7jz?wWUJFR#&4xPrnnP+QNO810R9p}KWUJ6> z2RiL7>T{HIpxqiSI?y2}&m7qU+pVGEC9T?+FHXpa_T2t}5olIEM1z%*AS@&)`JpsQ zJtc{{Ub13QQqD<}VHU>T0j-E_%L0MoQZ+d?E|506OSgW(SGfp=CG(Mi?#KmS-7))W zaS!S@i9`w(eyOaWzi|Q$RrjVgP0`IGcze}EiBe~(wA%FuBCiXkJUztb7PazqhdK<@ z9#;x>mdYN4Ubtg-rYyH+m!8@FZk_8cdj0(I1$jCP zsqfH`$Uwu~1x&iS4p5obGH4*Mx`?8o&e$&FvkEipEcP5TC3b4{XwtL5)@lU_8+~0@)zvb`udKolG<+uwF%pvuCu-AkVZsru_K!? zMY)eH*jrI!CM(}t1sSc`*h#OaEe$;nTB)bzX@K2Gy6yS`WoL>+YZ%GazeO0*cX<%5go^C?A8mldxC~Bu3hA$~5)155=IyEzD#BNfa(Ws>2V(R!HD$ zxL5%uns$q1r2WQ_oqg#J$zWn3lh3y5ZMKaT+0I7WXRLs9`P2sVVa*uLuW9by9hoc2 z*GhZdX#V(!mdof6l7a?xnX}#5Y@5c!wDepyt+UzL?2AQZLdLTmh#Pum2_W)i)1ZHc zKRV?CxKBd6p6kA!QX}o7OPwX|!K?d5x$kvZsPcSYFE&tU-;jhD^+2DPrV#KOnJQ5% zwEKB|I@@fo8OZnZ`pu$#)*;zS)*(|sN`hIWs4&WxkmDRw$0gR0bJ@b~xLwf}@a6aDIR zOy{R|9FC9I##lkL=~e$UD{DFXvQ|Dc%Bb;9CRa&_Qm`Qp8#}=xkCFjvtiCZr-Dv+% zYZD|U`$sJL2c)Jq&L6mq$ze$m4saA2A?NJ?w!>$M5+OjNVq0S^em}!ztw{rXj~uoK zCa{hCSn^%8+ec;jfn~>FeuA#g#V0KRsdWJGjE&v0`gpL+vIHW7D9gNVaY>U#vGI{T zs7UYJk%frU^V>7oihNQXh3)pF*j}4-!Pv2&{k=% zqm6%OP$X;efab$IP$gPCP^#NJu;$F>0f)@t!3r>s2mAI859~GbdElP5IS(>=EabuF zYAYVxRbRvdN4afzpxu0k2dl(Kc+BFUiN|_d*FVOCtn;7bu|Adw9vf_3|16IUx2}JV z$DFO}pXagB*7d*VvGLaRFYq98-xqnjXPf$$c#xauD?E^AU*$o@qNN#6G8l2$b+ChN z^H4oIm{9c`$JVK57dxk(P>p-{gPr-hfE+YBBNLJG+UT?Otii;|bwfTrwsDt%nj)aq z^Kp1tYJ&Mp;IE=z$`GRo*Hf=q)KjgHc_wvO$`OMr$TUW0eu3 zA?RSVf~unU=wb8fv-ZxuK8bQ`YX#}LgNfukI8E;GkV%{e9=3YS9v{$S&Nz&$bLSyF zI^)yyn9sQ?kIm8Ocq~NeAY9r@8LnI6pzzp^nZSSTmRh6c!nep}iKjz*A-ma>; z_g|0wI%l7gtP>7+AW_%erZv$7QX2^Zm9x^kcqnL9s{Q* zuDUH(P$*<49SY_gVi)XIP^N7V|K!);BWcx+0A~gj^xvHPbZvt zL`PFLoSGWCAjcF%Kc;rVEqdsCD|j>U`JEi;SnzwXQ%YZ#?4`c?_z)I%{lu`l`T9F< z{Qs``%-_EA+sUTzt_gb=N>%f|>iU0v#n(CvCqQeWF?ki=T%fmW@`@4Ai?yS(q&Wc7 zWHBIs=YTm=M&sg(PIAXigYY7=VVh6W>g9rxx?l55Z&~%wgI7Z-Q~a)S2`dE0IXFDm zaWq7lpR}cfT`~m@tS$R9UD3{@k5ldfUv*<60x;QV7eK__i>h>w&LS?#F4be8>OJ1~ z{1ER-!b7DHW27m|J-h+!jgf;8eS2-YOlDHOPG|#Ij8vuIp?I?wV2^Q3FC1IJ0^-Rx z6V;SG-Yb59>nT2}o&`%QywkR25U@>15B7_n`Ok2XpDLA8h6`HJ8Fcrg&GM1yF->!6k91a6Krlh* z^aq0PboK3Ir$`Yx7YL?(4h(O9akZiW(>@b3Xd}PU_?7=Bd{vbo+|s8MTZX(#x+L7B znk$b%>s!ZX!ntdC59dx^wDr_vP1)XjsdnV`H{~Ut@8M&yDW9t{hU_C)78apfe5S|y zRg&6pv#i&=>TxucAK@!MA z6%wY(WA=)t(f2YOGPD&6`km^nQ`r)(W3ld%lS^ScZp+r@8#d)AuZYC#7>_ho6?Bz)#BVoT-Wn)fR*_twQH&w4~KL z2R#;nS??;dJzM#3>4Da+>Y>Z_ovWCKR2o!ZH>q1!^z>FVy7uj#aE}!Qv+PfDQFNc-s8OTG=z`o)$TI-Y_ z;xkwn@tGmGxx!Y1#XL4FCRpk0;Mj;}&2`kc1-sRyjHWd>YRtXJ>8>pi=Eki{P$s|g zznRXC%g5QPlIoo=Ev{@;$HnytcmcG!wmdc)VMU6A6>#C0Ve(q-NED9?9X&x%@zs7@ zW7Nj%!8aolN3bM1Rwt^t@NiOmtyj(YW7tpuk&d^klhFC`ehF8NkNyO^GQ*Ve1CpPx({=yB>1vAK@@Q~Mw#9?Y}-a`*!=?!C6_fmKL;tGLc#pky=-&x zT=xD{U%f?{J(w*h?sQe)yaZ%8yUuG}vN>T-XqlAB<}+S3Y`>yxzl^StWWRRJuvPuU z&f>3Aaj#x@!_CPnst+Ha^60MXH*a|5KAw{BvH$j8b~${4dlO_49Ef4m3 z@i`3NwRth*+uD2%=|&?b3{7v?Exw))vI+?cPXX@5y{z+DJf7^JZn@|;-ICaUcYpL3 znbLk?Y5e7P0uS>qJr^m~#p#T$ zr5_IdXSx$Q!qFhFIu7nx~!01`bksnhySFPD4<&gE>S_V8Q z5G=m@@>4q(&CA|t^xiSzk$(x-9P6ZIUJ4CTM+019LIVW4{7ZQCoriqRC@+%x}F6`AsD{ttaO?Jfqoe8UUX>-^xENbilf$!ph4tD0j*;90@M#q z!EC-{BNQu@s=gys5~M1hki+~N#IC+yxOeZ#$!hNGZs!rmR>HPyJwn=ngmB?a(E!46 zpg~FhlBH0!5%+uz&=DnRg`gyw)_|oDL4hR#8$>U#9hQ=!5H%g>N-%t+j|oRmdfXwI z6mNr^9BD>=d`ay>xgZ5_Na3xUazTVoy-hhPvgq#T_YB*or3wJ9*rUDr(ZMT$9wdE2uvDJdRfK%-1X9fiK4Zn=iR}4GFP3e#Xzq8;Et*7R=N6l3R zlK?X^G{@|chA=3zEiNR#EOBx|6qye_#PH&kpMEh{%4}S!WQ(LqulV>R??g2R;9^H` zWstW+(O4M?$w_HJB$vRIzLeQBY*p;np2c_Z7-?^6QhWmKmz#kp_vO_OwZ)wkV5*X# z{m%Ap*-ScXJ?r{3&sho znx-cRX((9T^6pl#HDX}xjL)k+h^5G&^G^n}5g_m`)^BIk+Eq|TOT%orc%?ftYT=Gq zrRBPEc=e*wx!VsI?1FjyG0-H?Ep_e=8K9@Pqde zG@+vlvDgy8ep!MD?II{d|JKST76(~2j3{XYam82+)W*m~LVQzq>r*l+;3@ zLiL7|bb@h*hz`$)wJSEGJM>S*YRbvbF_nw{0g*VR{*>vmJjqi0X50x$a}yCyJHd$` zewOOh&?TRqXOd~5+k&@nG#T!2dWWB_&CB7GG1f~i!#kxl4LXnP>()$?jKn|gusm{{ z@N79{>^i;d^5K*o_veEo>J-=3a%hzIAZ={WV~i+bsC(vy3#in7)Ea@2u_*?#aCoSB zjt1R|ve5!kNi($x`w$}`Z#-r^zuHC^|)8fndXpP%ivf3jbqOVKl4q}s3|Fi-IgGJkqAp^$>2_$w6Oj9jn>Su@P5<}0 zi7Tw@1)w6<;cErQry~-mRA{oEPmvPufU`yZDCYDI4!PH%rXGxCU z&n#9$og{9fpBQ(rmCY*;rJ_g{@9D)@YV=ZTe(UNHdc3rS4=n^q{kAgqh-9fg&aMbl zXv%dL2DjCtQQ9~pS=w8tQK@0wyku6~qc=>p4TYxw0eLtCRARmu@TP0c4eeM=-lB`B zMso_tq>8k7LKy?`m}geJg^xZC*9*Ah;m20-&xE0xmv|o?P6b6S_oyS<^H0Z^W7I5k zTT$O;@j1IKMCa<;U|lHam_wt(3*|ZX33}*~;dltGUA#GqVKX2Wc&=edZyaQ-pQ%o; z$X(Jsr4(Am7mK;79+gMPAYMW!C&U1m`~c{jNALPU_WUUGwg28$+F8hb%8|~)Y$bp+ zX+}#^n+@g^nsw_zc_mz<2#T5`kV+xKHS!G^Dx)t$8lOq&4Tf-+xqom31*mk59Es7u zz(_<^n7h1SjDu)Y>5xxlvib$dJMD@oNM zaFOn*zE579+blfobe*ChhXe`G00=Nn{6zuL+#&R66=LXB0*nTM!GTiJV&-U++!i@| z8T6KKF3+YHE6cY%f{Y|fMUuA6@<>~zS?&J1H7Lz|t22@;6=@^+4g6>sNo&bSvK*u> zN=!N;#0#Y9h&SnOgA0co%Qr_n2P=EqvqGGGEPKH9)9N2SBSR&~%mw%WHq3_DYQM&w zufjqX@Tg^kQ1qe=L$*zr&c0@7`@B!tb>_mjIe9OJJJo;Kiv#l1FV09`K#onFDI0A; zyq(=*WlBU$4W{m}cP6)p;h>_bavby}k|6R(wwmF5KVq705h@gauDEbOI+V1I-&j)s zZ&rP^d_cMhm*iSSlTY`WdL1cIsR^1g^fgJ)-6r0KK+F?~0geL}&6Mmu_^g7R3-bm5 z>pDi+-UT7=DyLt9am7zl%1f0g(|ApF`A1A!_S}YkpdBRR|T-UtV=1^@ph%71$k#XK;l3xk*mw#aA3nCY%?N5Ok;q(m(%AG>INZ{F*M@U zLfn>?9+}0qkm=1h!FIMGxLOo((&|{FU1&KhZXA^`(Aj`~&xJdGXlP`!un$rkmbc@I) zmq71SE|^Fprur}<;{1i@=5bA`(+JM&hEmiQhcrUCicP78~vX< zo#Zx=p0Y@IMW(+m8D_h84Y-4@jfYMtokT=n4^;=B_$+Qt7;=6QK|!Q%)!n0PIZ{R0 zY=tf>0Fq0gzWMmWNhYzpS_Acvny*mXrM2e@82`XopzgDCK@`q^FDBsBe)p zVc)fgGWIV>CxJ#p2pE(L)%f3gOqs8Up(Kq=rfgd^B z53x(yuL5z6s=A+_?((iOq@l{PC>eDiscF${)iuq{038p|F(W?d9f8-)4c-6}#x zfFjfrURx;FVz?AC<{M_+Y$VvZK(BW$&$^3M^ED$}!9)|T(EJFSE`)-x>DFS?ks>CQ z{76kZB0(;jUB{k~jxA?l`YdC{mFYxM86?XyF!Tg|JaI6ZIR^@=?FjAxI8_wzt7r;cRlu>Qht_ zL2pEu*b|J2tThWL`b?NW1StGeV-m$Nu(f1EGSj_)((W0HzR?x&y3y=i)+C9mBDU8a~!GDdb$Q4MDHL24;F+2H8+6|j_2Sr$W{eWRy__z zNZH;mGKzo<>b3xhOMSHK4tG6{R8(m2tI_8iMiUwBad#$powhQK4ugh^{@z@1AM^w< z_j2<5g`Fz2>%+5Dd4@-r$nhuWtD(051M)pL<>zrEX7~;;d6z9~jft*GG9@v&R#YT0 zO}tPt;C}19g&i?E&yd$?qbo z6-0Hy&O z@U!>tS=(uKTm|$UGeY*ZG2Dm=c{R12p-Nv`h$FD8LBimjkEz__8@U35zsHZb6iP`p)yEgHXwG0DHXT1 zMDrrxAj|bx0TgQJ)Dbx@;lVzNY@i5&oV2o^Ebr90 zu}W*HlIqG9+btvoGd53Li|wM1r1Ko)WA(-szF+-73O~2&)0$2Bl{oX2$c~dwjo8;* z+zQUVQQ(mkZwD=FQ00+vY4D5X8Owu~W<-Vx6V!mLV2^aIx9XzIQlTkBwrwV6l%jrw z72u6Q6B*@&dAhxglC<3FT5N0uX&lE5D-JW7sFVHNT(j2tyivw-AEvNvaK}#g;kQ)&fJ609oOvK><4G2Pb3`DN}!+0}0gIP-@NP%%j zN2Ri3WlAhe66t^QF(su4Ysr~>iKRE9WT*E%t{ntI12AVt^cg|hSIzj=|7Dn$-U0>(gHdRR9~By+(UxPH)dSeSqz73s zYjGoxIpKSaX->f)5;|tAqL3E#41zi3@@KsTHhO!M6RF{&KsC6(u`4 z@g~I$O>P*TP!f&lT9K>9L^K$A@gGg%Z6M7ZYD8Lu zBn%;4vzo*yP7Hi^U{sen(bbYA8#`QU^fMnL`Gd???83u(lEwJr^H{?)5HY zGZsr0ld8dw=C_#J+51_R>K;5cu|HS%ylgKIlMm9)V#Whp;JWAO4#l2C&#GJ4mrGd(e-nB_vw}0-Y!2|ymL%VmFdPG?1a&r#Z#Tugv~tjig9Zce z92$_w&BTG0Fe5s~FKo}^R$0IW(rI}|d14lcirL4f0*rzlVE}ACZBgc#K!p0KUjnc= zor_c|P)nb=%aj*JG_BvMecr)CxKXJrZQCl$SACh%@5Ea8Sb(ldVFaKaD_}EkP*&b2 z#u}`%V;!7}K-V=_gNfU*Exe7imD6=wzOCN2xW$4^~>ANax5zypYEc4YfRp^;7_ z%zUvKNJT{h8JjDIdOQ4|kJf|58JB}uO`%|j!Fat8izdSJG zYSm(#UrVd7|J3V8vJe)U!?C7%BV>mp{9tCN+#PY`wzIU-7Wgmz0o@n3ra(SyFkMlP zU7cCIP{LGF2;*pdJE_kbzNScFUWE;%V^8BJH8y9+qA=(VM{=i{6sifXP^}~H`U~nG z#FzNCQ(nU8-*7+}`d%@cumN?PcTcxACupX;;2iS?MttL$N770%#R`GeyiuBhf>Qpcx1Qhp!r4_6tFCz|@>mwH@*D7TH;)f4;) zP3#Hr-T;Kr#3H6Xaq+~S7#|7@xGpORUrnnSQJIBIs1l)V4}6j3oUaK5OW}H@b=m@_ z(4)TEFQ{Bml zNE9Cpe8*ORp4WKKXr7;!+PublH=3+%nsLep0XS?A9y2a$)>=oIhPbvly_%|?VmBDv zpW-)6y9&f8o@&=x2Arq*#ZZt{-r6bw9~9%{`kE|2$v4F=o62&T3L7P~| zdt95a*{+M@7)PRG#upEM79bFmMFzay2aL*Je4tmY_kJcL9>MK7VFm?Q?E&pNlZuW) zZtA$clCE4`0>4tma&6+Ykug+nGEKN5RxncakxEWuy!yldtF-uRt2)u&Oah9-CXwHE zwZ3rYNnw!2MNV3Hr?H&K++j7G!j@MoYB{Au?bx5mlKaUfFjI2_tzoJ(DWuPaO5sh6 z&1}1}@3{eHeMK z_(mIK-QZK|OCM0NYp8NcNi<>lKN0Rnr}q1Q!tW;oO83iFQBGrq9MZ0Q2Ox?rri6JJ zT>6499XO2U0(_K^a6kT8folUAT|I2N0t(wS>}F_#VL#1=0jp;ieVQ4QPf|4F}}%qdu1hRfULCz!L5HVhkFS)1=Lq_dCb3Gd<};?fO{0(bWxvt0=t z5J_jH90y}80c20)tz50u+{aZ%rHwWTDRkSajXs`kjdKFVK6@F{eY)QnyZ}%4duuPi z$$nK*<>dNOn8TPGz?KJhNTcki+1LfyJEey(R;c zwJHs4KAX?6E0p<4*?2LfNgh!Qj80*`2wR~_@gT(oV>k=vU)McC+}6Vf06q3>Ya4V6 zOYEVG>k3t{x1&=S>n9VnI(`RdkY)U8cN+(s^g%$^`-@NKF#zVlbNWqz&V(Id2H&Dv z4bojvlfkQ2%Hb{qFNTQVNd5`YUa+aZv0ZOcohll5j=i-b*$xj zb$!1$Y=9t&ea7uzU!L zM*Ydv;bM~LcXe{pLtS>iP-o)iha`9}y%@|6U$yX*mJqK_ubEEkN5we8m-Bx5kOszx zc=pr3Y7C>ytFM0e$0#*l&0e(ghGBDp!c5Wn+}-~ET5xcK&oH-GeuLtFmz z;@^7w$M^ij83zw-X?_3q-t?w7eUXpc@Aqwa?lZr<;$J?(eSe>S`VBAMcB}4t;p>L4 zUw!81^zn7i*MIl&@gPriwp?`juRZ-c&-m6)9XeQcuReH?JwRpB|9G~za!VsHF1N$L z%vY#iGP4Jtpdn&+I9{NXON4Dp1)?_W8n%_r$KFtWb?R~r3}s8@Lr6Ee&I%54HiW7? z0S>%j!fB-KY3YjU&Rb=K1Pvu5`&AUv#>~%UOa-O_p=C@gyxB!{wSOCWMR4uV-v&av zp`goAJHjpv>*lmODarE@J>$^9tNZu1^VYtUC~;;yA%i=J zFLXqHP%@RqC@WKa|Mu6symc<5JI)w_8lgI6FCgu)vpM;h2CFcV{?0SL51qbp{>7+| zHT~Va{}313)kp8T^TGT~BtpA-*T+BdP<}Rij85Q46$wZyM@{)4Rci$Jt3_iM3duGX(U{QJ&0Sfg!E z%6ER~YEU^`otx*){PNaAXcBE<1p_fOz542i3%>Xn1NW6??CH)}5&}exeL*8}3O5-d zg>SdtWB_YS@L+r-xmnApJ_MqJqaoWOKh%X8Z+zuV=sNA{8HPlow`pFDXFv@4$qosy zy=^OFPZ~)4d`9&UjG7vCbO{9PwFmWYnb!lNS9&<+Su5$vnd@=9#1s)y@vp^0AR%4t z@4qJH_xNYa#CLx<{gt1}0KgT0mj24!-#JrDaoTTR@ZL2qf18%#`CG17_WWBusb63A zzyC2`@%cOKSEoE)nP~9#XUof9d*Zu3{{DB<)eF@`oU4DpJLTVDw(p08k+t*U-7?X$n+5AR9858lQVpJT(NF4ck~)=|lo+L*Es;zHBa%Xx z76-G){bN$lno)E@s;1v|3m@sVPBRm}O2uVaJbwG6Y%9{-)K9G|w(p|MC&8mMQxi4I zJhPPij46MD)lp{7K&MI>iqga??DfBqFV0nKKyQ?*rgC7OvUWIG9Fr)SDVevnl!(&O zp={;iwvr}mXA`8w?`MMsM3JYp;;Mr^f(Xt7T;(JniE9MeJoxQ+)&06TzJ#?j$pM;R zZQxgNX9L=`I|=CLmE^AY3N1=c(pez&n>~F@Zzh>7WR8pyz1&dIV&)-F#2pz6^lAa& z$}l(X^z0Db`K3BD#QWr;XMzy&$zmc1myRwSk(EYoSg_Lf<%^ZC#?~C|S%9o)WU|r7 zWTTPEMx!nCG$>|=TYfLV?%UvDbj2%M4T|w)$;GFrdCF}6{4SC{ieFfm-h;=>NU3_; z>$~h!3o9OTt{YXCm}zT&mA093T6~4W6Ug_VGICO(>8Y%UtP}W^c5U6^NFZOD8+Uo} zDa!UlG{8i}F&gY3j2j)*aQ;d$i-1hIi9n;^`$8th{h@t;R!=f)!9TZ?M})F`HmfdB;^A}F%UbU*UOJ93Tn%eZosB^CS`@Ip#HS@Dn+LSNZyrfFTMf6*{A-iau7LN zcvww?A&#t3F+?*%@dSw>no$~RiX16JL?Ri*sKRWj{Wbi<1g_invnbUdM!P{MRJ1oO zf_g9C&Pe|UNu^0x`oDtSRcagd1Fs^cVXhY>9TJ7{#ZAb8g)((<$Go_4;)HRs04)BH z>Kga1*;)L`b@<>?_CQbI?JlBwc~r;s=<<`zFN7Me#jSS{EaFrBzsy*OMW+TeN<%V6 zNhTUpH#N%OrO`sLg;Wc{wG&1Rn@?S2~mraf&qMI>jY*mg#l7o9_&jXLxGOP z(ELsrKjQGN2)ak`o#_Cq^3_3n;PeTcL;}tc@k!bm%Mw8DM9u{aNZJ_8(YXVpxv`3J z2hiA-49ZPz8ttpJYK(B5x8;i~Kfo#){ls}oLe zxE$;9=A=x1GA*vyoL+Wb5Srj=PS6YhZ7t)L$q%Iqw!@MI3R%e^J3w4=V_@V-@!v+f zUSag9d0HH<$vI`d7h{_sNuooC$-~2^2VGC?bbiTN$o>fslV`5Q6`IpAC)n}L&3I)b z^G+WoJGbkrG`Q^Sy{vLA4d!=2tiFFHb&n{km_#<;@QCubBpD-+)MD0pHN(?lL94K; z_>fgFW|gk%E?%Vu?`f*tM5MJY(6DfkV6>Dmysk%t^1%`1i`5qIQ9V~&i1&TPszKvj zwZ+Qj{SPZ(aw=cehCjAB9>S2`w}d3sr@oO?t>Tc$O|c{ozQs(Y5_&9to(i%4j4z~U zE2;kUJ3z8{0Ah1$2`6HBT1=GAX>lg>6y!4=_CQZaZ&$)oP@>ks?Yb*nt)O~CUJT$N z)CYe_*ns9iO%&~5o9QKDx6V>WF9|8w_L5HHdO&z3NzI_2EUX*J&&O1s;sD*K19Emz zR4|DeFr1KjybhS@krAK5&jzZ7<%)Y81!R7z;S=Qyt1E;i8#`vIaS*GI586tK zKa?pK5@PKwh6i;V8P(@_5tIc-q$dk5hHNBg=cz{-sbLj&HWWWA8|QW?3(i#wUy^t&E81qM z6{`g&P|J&3IsmaYn@fbf;Z!FYLfmq8T=>z#iia>JPb7G>+Fo4ZDD&ReS}gM(K@C4E z`*7qn{6cQJYu{Za2LlQfpfVW8I1h!!BK7r*`u^?%jaq7P^A4LH>>OX`Jz{98_;6RM z0JiYX)|gnWTcof}spzp3U~^4sbrBZkuU62I==YTHoSK#Elf-g${Y}c$g+IV*zteVY zh?lrw+b-Uav*0x)v*2~-(smf%j`|UordH`Mcqrn`MxzLfHIw#&#!7GDm#(9TJ1!nA zilBqZAfSQi{-`2;Z^_f{La#&vZ-7)XfN_fZLK~*Ts*y%ZBlCb}yx#Q@5b8wj_hErs zL)m|9hSKH?7h%q$?TAhm*6p%sjfI;D+O z2RH3>S4;0Nc`#aXqz{;!?Nomcw}NH#ig{ibPzhPvs6H)TraJzQNfAydCt4qpH?%&M z5;R_9vA+R_K7^E*`~gx`zGsL6!(0R>bnLz6$&sm1;?M5)U)M`}3zzdpuvoLVIgZ!O zZc6eWkrQ`LplmUYCMGu~Kp4jtKx_{0y^9 zk6%xxFUeRogjNSA1gOt!5E@M6^W4C`QNF0sH0|0@35p%;I$aUm-Esu3{77s`!EbIu>sXN+H zcho;EJr2c@?W|(PND5Rs1&TI+4!JQq~v+xFOS^Ugon56uM(%`v#{lQUH7_t`nmUd>11ooasO> zOoo*V25hBLhm6^rtvr|F2HZSkq8o*Q8zk7`@7h z4OS2$F|u0+MFr*?E}+BcUBMR@>iZr6bGH+gY*XT}sR0C(O#oR|{A$G5XpYnc zv8c*ng+0f#2SmR!X$Z%jt_8gd&e7BCHdN{FMQ%T#fP|Q<4-x6;uDHClK(-@1z%STE z2w&EL2eiQ3S#Kc>BBI7Ka~+PGV>y%L?^(k(ju+vOwzbqmS9YjyLoaN8q~tB>)RYj` z*xU!!tqpF8qF;^ncCAIAilPNYA#`-O@*};5U=C?y3r-*Tr+(UBC`{JDvlHL^FHL^{ zG&FQ`_b8~vH|Yj6!H*)m;hS_y8g2fkQ63_VHviKc0ZxrH`kQehPiSxKnMI_a$7VFdTD|r(UP!)&gJ@Cv=QJE|4w)-FaDp1r8V%y4tzz|1&uFS z2EA$$)X0l72CyfwDDx?2ewTQM)TD-HD-_esVNw(XziJOCviw+$GU-iJ> zrPUX7VktHCq8tEe-3wEt)!l%q4XA=&2!d9a3)b34c&<;9>ecK|?2D7r=PKchA2qQK zjG#`K&c(216>misGY}AqNAhs88%d4psJzVl#upE!$72Fhskt*NcR=;3PaBBXvOCY@ zf+s4tyR^And^$WKm(+gb?yV!BHat`4w|xPJgtNfQ`9&3hn8oSfI}4_nWbWQ2SwUf#gi#3E*)Adje9U&zE6M$OPM~Pf|wFar$R+E%2-J7LM*Q9tZ z-350R(mp!aC=+Y5(T-~ryMj{=qDM=2X)^jNP)%Xr>ZNS83KP?eOtTMw30v~%=DYGb z0X1Q>0Wo5l9vOQ0!9}T-z1l5;z~~?Kuz%b^#@w8VTE5O6?=u4Qwqs_~ls~4;x6ZFhZQO#TWYjx`ab&N!KG1 zN`k7Eb67nK1><;L6D%$ayA>o9(_AG(Hy(xKCyPiIIwww|#u9Fu!?MzR(LS&G#r7dU|N(=L_PVGy;`h@Qv4I16OpFO&0CHb z=panMw=qcrvx&f8sC617aeCU?&@qq<0@*R~=zwKv8EjirY)*l36~2Gh5-@Azk&R#` zJT=fEm>wQMYaE`WDW7-{)gmb4`%y>6w#T@xRAVsG=#_}8#R2_zJzlTK8J^)4wVc(sZUh8p$hh>XH za1RRaRHW5xvxz|rEb>7Fv8s)%7pc3&Kj0|GqX>Rfsa!osvXtXnlMiv2$ zECL#x_d&CPvIaCd?}J9?eYADn$Be!m0VfE1nD9O<+XDPKf`M4zI@4jS6j?qTbC4nY9+r8YyM=aw_Y^GS6JTm=_po8s~K z08na#su+5B!60meZi1R*f6p4WRx&&3c= zL20F+pwm*^PGz<7g5fdRR&0;q(W&I>&Vwl8MDlIs=HYA==7a5-1Y;&{mjaJQNwX7i z!)U|u^pR08MYij3xuTXuxg4Sxb{Xw*1#>y-m;qycP_;&S#h}API~W82_BAQ{c$g>t z+UhiI>1kEha26|&TA$$1*`rT#ypT+gp<#DUOjiv7+_UijwoXjT@VWYj%h;I}DkS0h zV4-lUFd@10bnG)#iKrcg(_bU$OtCEVN|>MP34eSIgFVzQr$p7p9SL2gMhSe&wJWY+-<^HNaLdwT_ZQ@>m>aHxZTDuigRkZpl6XnE7=_Jmty+crV66JTH6fi`LL-!cJcC8h~ zjVU7!<`fo4n7mfHEVehG<RxPx`*BB)LqrD`0?D@f@Ia#s#CYER0v^+ z9?kYYK?;jNM!?8Iw_oEc)9fSG29RRC1wc!C+`Ps!PePWBk(wrb`w7O-?=EMSMrSZKSk056kA!45}XN3%>j z=-b+dypaYM$|*E693By+1to<5T>p*j#r8u(X+fQa>jd|YE7wP)RU;z{-xM(7llo*F ziA7JB^}9)yWu0~}Z^={(4koS>+x6V!w0LdJuANto>Dhato*nsUP3oCSwzvzCgr-_C z-xHO;xVOH30KR<%Ig+8AP9AtoR=kUkPS%mt_#+JsJkuZp`-laq$NSxi2pBUnc-q|{ zxY8*|;V)S9EC88X_#|Y)&t;G)dCZeXvE4SJVrQ6noq>}Tdm`1w9kt^FWa80^aT>{V zHfv2C&dSCg32Zcv^n%&Lri5??4pz$1TOv}fBWk+BcSC1!>UP7gDdQi^q>(yJBV~q0 z?oApgGc?*}O`~nrG^=2sG;(j!NSUEoqnc3SjWEB#b&rqi(;!fodN~L61yZA5xrzleB8V#lmH7F)m zZQKb@@nu1OlmLnHhLmK83weyDxSse0sapD2J< zSsJipjt1VpipD%d?BSP(hzH zD*!6kj-61Be7`kEz6SKQO(hn10lT;#q-JwG#>y2SDjoV(ct3c@-?LWszmP7rGat1;j2OZjahl6k;&r@t zK)K_Om}4MtU=w{BN;cC@Mi6`~_~~CSffkRvy8O6Ab5}u9;TkK46R`tnnHzQR7PD-AtQ z+~V((xnVks)w$#x_#Dx`gamg+C{=`RHH|YnEe% z#++c8<#qF|yD$mA{}V|*pYbZ=5tfW&fRi+0=A6bMk-(?Iu0e$TkIZDn;yn;|HvAS? zg~=e1aVU;OBaUUJB4WiwJ&pVpH1#>9llrDZk!aQ+@oCoKzMzrcf~I*+se(p!KsHm`efiyKb@oLXwyY{A+euI zBh7#}aCjic0ZQhbUi^>Y3T*fxkv8;|guxK@cvH$~NQsaglE+?j6$4O4NCPLS*e1DR z4JJ_|dz&Sa6-wpI9@VI&r_zIc9ZnS&o9=+b!_QT`byC%=ReQ-^&B&!P5d>2TCgYqc zk14Jc;}zylo5uzIWj|kr@fz{J!|9|LF1TGLWDb;d0U8HGUoMIsBgLk4^9s8%DDa3r zl!#vO@9M60p_Ej(2?7}Zfkqg<&2pS)38>HKM+%sRLV43c2~fHkWaETlCwPWlP>ML} z5o{V-DW2UswHmz|!V~4xIh3!V6qEop#W|tqFej#~hsz5{^H|kMHUI>bp<6voLYh!8 z0bPHYoqQM-$|?2k@1rbQD1Zk%QDl0<<$^4W3HnM&=o6k9kZ;7bslkkmb3#RA@i8<| zKtnI5&Kgj-I@bCP$T3B(Ou2mLP>vquG?mi!ifX^qM`7DN*%A-+(o6Syc@3Y~evK5*sIxi8rmuE*@$_ zQg0=(t#rsSL{l&&Q5Zi1$5jH*Bq{qucDV$v=f`q5g(}Q(o{-6UJi=UxM|(1&uyMID zqFgkh5d|*`wr7}}*0@G;cd#tu)@{*P3mZ#}qI@7EX$0(YJFQz?mEwxnZ|F6OHj5&{ zJM4r{OQQ-uwAcX%!Wo&1wO|VT6*Wd{{Dy{@jXB6cJF&lM%@eJQ*|FA^U+OVYXYB2Ssv`X^0>_;v5)|F z+3>jYR@$LNyB@Kp#+jgFvLzxj*a+Z{>vi3+GF_3U}tZr&t@I@0d3TA zZGEGPZrv7x>mx&ptb{2X!VPX``P9-y{;Q5zHKWN+TU`wU!**IjgTrhcjd{vC?kVfI zrwksa`h6W$?3<@KZd0~}=9rVSb7&~0a30OECuh%#$|%Qoh>d%v=O3`JdoY-(6vrE(3lmUnFrv8dL5P_yas0ggq^lMRT;9E92`;r^f1k^%AkR zh7Ht=WLoqW)%tKYqj{fkiX>GTcKIm0!;vv+;LvIkqAzA4<&+&qERH z;mJWvIzK6$MJ3FUgVL_>jr@?{0!2q*a|VPX460#%E2t*rHp0T3P{86-t;OkejWU1Y zq>O+@_63bLKGDekL=$%AN-5==lu{b`pJ?QNqS3yT!`L2CT>vXCKw%G_pxK0er9feOtxQZ0e(&oM5ja(Bgv^SEUyYU?}j-67SjHo^0` zK(-cUwId+>m9manBCUgZLJL=lI9rdzeE zEB`YqzL4>rpq$xzVjNtFVe$`&HRBf9!DlpsE#7SOE9@x}VPhe9N)3(P+dD0NCK%Ey zUT6x2xXsZc2RNdLD-8w^M=JQ%0GPMrM(Tcf96<8RqvRgPbYg~TF!r|KnLb5a)F?47YnWd41Ln8}^ zW((E?%?^wSnsYEbXpY>p5zW!FTyC(;Q>sVV7G1mJtr_500td$FSE8XN6^)uzq4XL~B+Y&&C~8`zd7^x6y6S zpqJViNG~QXnc1w!h*JOMF?)y0sEJ4S`Mghv!#wD8#}fMXF*^X}SCs*&8I;Md9rFwlI_8vqbi8skZ=+MD%hdG+5ryuOZXjm=r#(s7+_A9e_;f zY6W`CO!2)sL(}{@X#dLzER}kA2hTc0y${!a7q00jUsHZ-6cS9wmF6%94eB@rue0?_ zir2G!*wH{<5OFcBqXS3IYx zm)jGzes$!6_45Rp@J7-KQDax|I#v{BomB6BcUoK=T*}j7dof_I{@>zt&FCM1VZeDi z!^V{zEoc!^$4zaYFJP#6sH+vbs+MBbjD2#ORJ9#@$CI0;L%yaBce2=iLewOQFlyl# zmUW%G2b|9rAP&82b9rN<#h^IAjtV3z?BFi`fc<)r=Efxpx5u>2fD>60C+ZAN8wWSL z(l-UhJSQrBo@Ui|S2+AIiTtqP3P)ez0^-G7;S50@CIDhC3+Jf9E-q0a4~L7h7%j?Swx z_cv?vQYs#{dk6~dl068Xot*8az8op1FlVlTA9V^UUoQX`ECp5b=zq7pc;nv2TFG;F zj@g`YX<>REQS=Irf*8I9vEqCR2dQ8P+3$fnx{LukG3jsup$W0M)#(NerB~k<#Y?NWt)apMN=3Bp#=;uK zswM)Z;%uUhP`W2lDr1rP2|T-MFu5(Ey1}|l-CJ{(*1<3zqA-OQ{S}lHX)Hx+xH|+- zv`{HUIC4d6Xy2kWOO_zb#c7Q#FK!|mtzn;w*31xIO#>;*EH+x>=o@G)lFmjMLRHd# z0+vwD;20p<9%)cUDg)b=Ntxo`T%!0#!)tHL3Tg=9#)DHNfVx&qBdwa|2(aDkQihU| zouuN;=sldBt;5FS^5;TQsb6Hh3B{WFGxFmcVvTIGQ&LNB4@p|3WLm?;Dxim5OTKGb zNT#9#zos;J#}nK37sCj+Pwc=iXW^{!F5aBmCYQ!4)9q9<@-B>(5Q`hD(RI*^p36G| zE@BpH+q3yr5pQxc40S0El_w*H5}+&oCr^&_Y&}WuF5G|?)1@ef&i!#!z86#<={>nU z8}uIATUBq5woFHv1Sk=RH;$p;SRPf|T6Gb8D{s28Dpvd=3x7NaJV@&YD`Eup*Bi~J{#3y-=w#5xrBq|pIb+pb{S z?g60W@rDH9>je^6|eREfkI3nsnyzsPR^c4o!<+XEK4UYl$XLsF00 zO>y(XZwxS+1c981h?Fp+XpVqi#Ow-0-$qji$F~o~a5r{kaTQb(rw1M6+^)H@Ww|CK z1dTZZIPIOqE;FSnP>v~XC^XcOj0)PqW z!qk`5BlYBAgQw1hElmk5l|9@j&U0ZXtnVyryz0S^rUp7JQILRpz~A~yJum% z73ho8o|Haq*xD7+XuNhD)&L%h>#`B{A*eIICFt+4U4ywi7wk&btpVzmlQ&o2rGA85gjH^IIxRcP0FUpMgkb|Vq4*3G0J!uO6Ma*yuBn8B3=(PI>i zr8h!FY+W66iq|f&!J?7aGQw7nPZ%ke6ip~agvaY}ezuW1U>h42=$hu&BfHrYl7!wQ ziDR;2R{Uw5@lvOZwk&1X)z`K;yzx369r3an=x6SAvW+?mHl6%3NpcxWXt7!;E}5CB zgLXcz$DVB=0D!Q@^Ri9Ik+F@ClL}``K?5x-i<_%bsLJAM<5x;cgHg@zlCMxoTt1bs z=KWXq7MHJRxJ2n8862td7OL3DCCYPhi5`_k=b`n95L$<2WLp`usXvm`BelmI=`acr zV)4pGWg(b?Jh0At$Q*5tLde3M=68brzX^|^`!Nq}t&OqwiEQ#(7h9rdJ;C@MH}@ZQ_`X$ z7ZOmltia>VWTd))cGTs4uDSrh;ynV^$c57qQZ!);17SbF^H@L|1}jL*xEp?u{9j|ZERSm@NmO-i=z$|I7`oC_8c@5aC4@WM6IM2zA`g7#zjGlqZ22f(RhTb z|C%L0*(k#qm1xjdQov&oG>SzWnJ(>#_+fh-K*$Pe#@4{XS_>*OkjA(d{RUl#ET38< zULr5<5vjr=Mf5iXZ%nApMjc}==oo*}UR zRNf!u6$+^=zt;Ct|I_EOXP4Mr2tMe{JTZmZlIU!{GG)sfti;)gg^Z=*K+5hJki}e! z$hc1y2Fo7ipm#b8syzaUG`K6|H#Y|o{!hF;;iX}}a`j}S;CoYEI|_;*K?1u%Qk<`S zMQ~K}MCH{t2v)`}EQnF90lRPf+k{-0Th&c4>!GSqH@T*}0ygo6woWs$6~$u(cFGQ6 zlp5a_njDo#=YVd|y*#6n`f@h!$YpG!FTK%b|23n5M4KO0r9Dzv6puCtA8k^moDk`& z6QpH_{ZTlb4A)Hl&YbdQcvvW;C3s*~dF?koZ&U;xM3oS0RhMz@I_z_Uwy{bd zrZcUgp3=If8zo4 zjuDH1f&=Zbh-_6-l`AbATb@$MxpQFaNSU(rY|2R+Dc5|r`r|+32D++U5wR;Tl6myv zhcHgyzYBIPpN1L%V`5Y-CVb#ZkcjN;VD-YHs$*L?w&Bap~W~r|=?}i_`sH|Gd zkSs{;P#LWnUB&+20^Tx(x1g*ZT?RxHl%9A0*V*D?Wev6?U=IxDl{_v`_dOInT z!S_b7LI@z=wo(@;cfXL3?*1f3?1+$H>4*-1iq|GklLp>0Fq;J31GZtFkOwZ0Yxxs2A7JRF>d=A(CPt6e%p+GAr-q zLJ#10k(6NM_`2xq2C$TBuVg1~zSMFGH>b}bSJO={7*!ANl&r1w$)BOrvq`-A$}L0^ zD5_^azDrD|#$1cl@%x(WJ*gEX9=3_DGh1Vy#l^%PfUmyv$Vca!dqV3fbt-$+(1+Yy z9;qvY?#GY_DoCsMygAi*JB&vuO_x(lF$>w@-9ScodWw&?2e#V$q@qgr;utrKL61Gj z=m|wBqD<|!tN!>i37ITaLw^$H8P?P~kYmjw(qG5CL8cU#?z2dZy)#|Bi>bk%n#gfj z1Q=6QMVRnMjRQ0mE<@iD48bp6z4vp-lj7wKo;5}=N5OeSEs;!|^L%y*r+>o<*qm7q z`r~MS*y)a(fD%8132T9=t#K@U;K~xdY4L6tkuzragX4uBb2qd2h4E$XgkN!TPmNOb z-SA@yBblfRdN9UsVCMBhK^vD=`G`zDNXYWm-1Lb6we55LKV8BAY_M`jPwYq9%)qD; zJMeHUBVf9-49>@J&fTsluc0)}m$}FtwSAaZ2avF$_$uL5e1(U@G{kR2rlMC^MMSoE zAj7TLBOJNZSO$P?1ZV0DB%e9K!AX-xZ7<`B_%(@sJIO}X>NUC`f^yQ^i+4jE^1>qY zrVuahXLS?VTxs?1$*w9plMio8^SlSX z-RUh`UaVNP@`U48;y){;r%9F7Amuu%ZvSdHP6NG5&YJg&JIXP|{qgwD2&_XSgKZHbKMsb(!7hg&yyd$yh-i>W|*Gtu(LDKkDbHC+eNY>C+SR>2dn> zczx0^rpSs;t8dwjEA{c)_7RD$kyTIGK2543eGZ9!A6w;vJey~V9CFObPEXm!6mtu# zWYtOAf?B~9;U+5~x485R|ESJ=<~n96t^V0wG^dYGXCM`m^LPG~MjzMCe>#1aGV)VZ zC95`R)OJ4CMtwS7zkOrWmume^9T%Pt9qwAj!_Y`tJwsRRo!_)a9;Y8q){n=A8UK`4 zBCS4Pz~M)>hBq(&Ao1(}V2=}rPpj{YJ|3@ISLnyD+mAE)_^vk2Y5O+1AWUf+XDY8k@wjKD8WC3{x6C z#7zk-WyALANrz9lw|W2z*1lymwrYnwr-+XuWAiFQYE@t6!D+g_L0!u)ZCa&*AtiD) zpRZ2C>+*MrD%{m`Z}a2`JpeTZTb$Ng)DLjNTr>pYAtxecb2^EkQ=Etl7@jjo`7ct6A}~Y(0in=%rrFu<*d-3&3lP{#m7P6Jq||vPhMGW0 z-yXWmBNM7PZWri|O>r8H!!d%}k-gv5`H6-MPuBR->dgXc-L(NWONTlA#_+ zwk@!3&$QhBhF=ZbO}Fynlbt1v))7gHRNlTbzWL9sAd+}Tb(4JzK5~xlH z>BBH~ykP3!>{1judY}nqX>~P*8V*`uLD*_0SJwYlYq5#nu&*qd1RHa`h(`W#8f9?O zC}p1pH~Ha|CD~V)O-fZ#U*cftv-mA&feceV@v)GBn?Kd(KE3409F{BPu?I%50c;(m zCz-PTQn3CZd?{O8g@hQ^Y*i&q zRifG9H=*pA`%R#3%S8|O~4^BPPaTsD`$@5?vjXNUcwv*}|IAtPYxSw9k^_ z?{h*+D0xzz32b)!26_RCcz(&-)z)*q`HRUFl*N)%31v+wXi8~$saI?|N?1bOw1wTZ zJXk5x6!dtQ6axz1Lb}6av_UOu;4$j(@+`|1Z+>t1GEtC|0m4pU7&wq2-Qf@`+NqpL z*V(-05)L8Q$FnTpRB+SQ1s;p{r-Lji(B_ehs&fhuQ+L&iUP@pj?*%a}z|U?osRoZE z4}>^Ogh9+jI?!G0Qffe8WQWv|7ra161c+#Ov;3!}Pb*qqAk95C&Jfm4!3i&43+#`ek_HKwMQ;kC&fFEkrA?%#3RT; zoH=wZnabN?x{h%$%0bEqAOQBrEz4kw;`oeF)X1oqErCgLk!q~G^P}e1WK_mJE)0Xy z@G8hR?vj8GWl~meA^I_sB19tXupfVP6dIloOTMzVjY8FO{@3q>(ru2_U3ZH41jE$* zF1!Fv;}3=@0=lvN3_>UEL;{CTN>3286F(8S6%tm0W>WRo<0gX@wUO`X-aR{uXEQI> zhnL5yxM}f4REVlhgue22uuCACbk}K2&(;xS(z(E37HA{1iqi@k$BXwN@?#9i za?nt#e1MQye9@@SM?!jHgqgVm7E<6+PThvY8##3)>SW(a>PysFC^(!lgqPrOj47r~ z2%m$a#8dVp`;y{~U}Pj2n32N6B#*Fsl%GNr)-(n#u~>Z$6yigfZe{_Bzv>v2$fFa& zQ!`6F;vTrYL!UujC_axA(oP=-?W6F-AK#i<@ca~m~B91st#&oxN zjr4^KIoq6^Z&4)No0}hs|0S;|(-*P9U5YjL;R{JcESuAP=558{df))TpqKrOR3v6y zW}H(Ce~{qK``?>Lmo4<>p0ad4CvFN?R%q(8AjmKBw0atCR;5v97L78qXjJ)?MwMS_ zwB3Y86;x=BVCCzLtl&QD$O^DJ)4sOaPbAjD_$9i997CMQGh4YUvRg%t5!MOsZ5Q7{ zaO2?BPx^7guv2`79huw1{jdUZaOtU2-S-LMu5MaA?7sxTHL7iCJ6x-OxV524jhIl;Qh{G$u3+@c{4R{xqmU^|o3RCS_K!<7uY5kg;1}P_X0% z{+`L%5IQ-iH7e5yQ3U@*paqqBgV>69qpqE4NY$XYSVOIP`E5%w{~BIN**VjSd4iQn z_Nv9=L}1{=ZJg4_SvY$L$P6IiXq&<;U7#f-@0?4(&y-*W+3d^tJCctfcZ)xREk!OL z@@0KdP*rwORurMh^8gxEdlE0M>=OP>w(l9=a|ghDy?3}^X4ak$kQcjoLz^+6b($Qh z13_LpFQQ3ua#DsqP9fZ#tj3yg3_?ouE~*YZ$R>5vuUdrwYO*%KX> z>YWlO_3;A;=Ol=WiI8uwthk~x5*A?ru{*;jUYQKQdJbnb9N_x~RXo#W=A@D%@Fiop z-&Br%$jVcW10&!h3XdyK2cFA*-XxIbBM>`M`Vl*X3Sc14FKvgmGJmxtfrdRxOCN#2 zwQ23@%e+=YX0;k3pFJfc?tD03tUfl5$otW80jN>58Ny+BBoqie!_-2%Bu@pIw0%gmB7JTRyVB|uH0!eEmk$XnqN`27y2bJ- zDVQ-%NvtT3_N++C)=+Mfbp+2@sHUm`orokLVHhYNtZIH1BVH?t*X0rLQGVzFY)(L5?f+#Q zMu9Aor)w=r1bVt}$dZ-4eSB?Qug^cTl8?RTOTes8jwM+`6bgo*3zI(tu8qChm3rzo zT*-p_qWimH9X3MdX9HWPrIWfJ2UB*R$soI?fGod^%oARxeGWp^@t3*g4YtE-ErT!U z-mqG19Q7C26G6Rvblt#mV}NH&YTfKo8_Qa48#R4 z!xHO41GoMeO7U9hih(1eFZ)0QG?vSwlyq#M#HDa-nO@VcJp};>bQhIxz!=iEe3KTJ zye<)2jrbllh?Ok|CgZpOpSd#wmx_0qVD;i?hSV85prCDO|SHKe7%@8tTv# zU(F(tM<7VCElnOgZ2p6}5F*RA&EK1o{w?Xl2C0pUBA>v8!`l>*ZwZUc65Lt__eSy4 zi^uG4DFdk`(H=!=UYtb8gZZzR!g{u3XWJJVp_1Ve7W~8ir;kk%C^a~L2opczN!_tT zM7Y6-qh9eNU7qNWZbi@>!P3bYm}~R3IXVYW8QK0JgAjr#KFCIixP;Jn+xOW@09Nho zWp}R$NqZT z9l%i(iFg!_=g|X( zBTtSJ$bh*aMHM&--#m=nQ%n!3u|7Gm$`FPpN^RwDZ+n=jzKbUGq98%*SuDh>oBR z5lJK`+*F`2j($xO?d331uN9;oP8JT6Cy`O`ks^ars#U8Ia(oQ6D@#he*=ahKCCC$_K6i_PiFP+#HOR^3e`l2>2a?VBUrsOM3zeOWR7J9IHq9Ut+NnBC~#E~z<4-i6ee|rF9(wzyHai`$C!*3Hv zgg{t}b;UU+Ox$PppG=#D2$>^mmHPOqQpw0!{U*H!MVav%LfJE*OJ*-sK-XU9*(ac$ zCffhWEM?uDOF6`MwD@W_2Thti%9;ng7eC9Xp8fte+u6ioWNDbsVs}iFrjEVl5>7?P*Xt7nP5OpqIE{547#Wxdlc;Lm9Olegc zb|ZgyeW`2#8xN%VcVv`tKX#qOQ%mQ`hkLb1t31xDYlD_y01lEi{<Fb~b{58dA zt;mqgUsK&N3g7ah5~|xz*HIE{^J~-1t$mk-N?P5Z{ZM}nAY6qh6y;tBBsiz0m`6Fu zV=R?TP9v2g*p#+w!NVYD+<=6ROLf?pnUHfa7?O2|4A%l#X0grHfh_2PzE1(fY=sE@ zx%mhSF1{~kQ*(1rGsXc6JVM%sf<^nV06CV-uF4iTmL@liYF#LF2|f4EsL5ka+aGqc z_HRD$`hUDD-<&LUQUKdIGQa-9mDjK^{r>mTr9!n!8C56)Y$0*;uo}Oi=A&{caMHYS zO}I;$i)%u~%C1gdHsotr=I1Ri1sq9`Ast!#RW61t zCVP|?8#bj|rYCXE7bRWnY!RSVeTQN$!;I3S;xXY@R`{3oOTrFfy>5l`FiVBu8Hlw1 zdY(>dKsXZT;G~A9vpr#$?#Dk;rkC_z*U!3(dDDhbR0HQ$GDzGVW)3x_ zV94VIrO;@nB8}CBm)>l(-&ez7_;C$dE6qBB8#G72w?>E6aaLeBtnTh~(62s5W`Q_Y znTV~@EvuUFF7`Has)*5m&Y`0k907oK@w<(h=%^DNY31`yplw13dRR0{JL^!ez7`aN^`iq_zi;1gN};2Bv6NIatT*f` zEXix$MhpWj2N7t>|EjV}LJl<6Ek30HjDpQ$qn+B^dYMg?0_Aah&OREG9kGt)*dSb9 zWJBP^8-0kwsj^?(ZfAM5h7*d_plOb)_@wOBJ|^~>*VWbGOx}H!TJ+mB8keasNaZ2* z@%};9?DKsCL4NsTksPP-#f*?|gk2}u{K6N8U@}lRsN|F2)KWov*Ued57?HVm>3@K8fs~;)@KKq@fge6pGN?2Cfvo3ErE8P9P033c2A|4J$;DQ}Zz?FpqeJL!s}G@*N5{!orx2p% zxxMumWg{tiCbv8#v9Y&ku)bE)u=`(ivdLRr7sc3yAVt5FKCJ7`wOV&j9CqVZuv*d9 z;i*cg&#OPVR4TpnZ3%e-gDsD`fqC?yDOZbJx$#uOaj z@0moSFhJ&%2!Y}LC^%Tu$X2^f+k2RRUK7!nF>i5(W&3OBpF&Pys?KP={}Upgt%E8o zxsV~;8#ZbaOTIUQi3V;|>!%`i*iIP7Ox4-$pQ|?8$Lq1kqdrrAlRAJbr~w&$Wk705 z$zP)@qIpWA7$-}Luh-FodaSG<5nLQxHt(ReF>^3zE6kf$7&oe*zPmt3&1{{xLUTAO zjDDW3otn&A#$x`nM`0k3E6Lge6e-#K1pOP9*iF^I^(Gy&AVPUd`9Z@vTx2w=xM}t3 zIm9d|@t>puPj2742!>+FbPGx(LWwQ#!3ri&LfR{b!Y=Sx#9`{~Nl#Z zj9Tlq|DU&a0k`A2>O8CJyzjY>l5{0qTe4MEzP7Jy$rgzs2|JBdn&=VRah#0dOPKUG zz=Xzg<@p8)V?wuM$=Gp15}E*^lK|bx3=fB3)8X;a^d!^RJOiX>GLry-;Stj5^w84- zf#DHC8qe>)*4}mMoO@$k%T8mIy62p#UHh?~|F!no9S3&KPa@Xljo)cT?{o7ma4TZi zdV1nM^XvjpE+ayM%NE2!oGNDEot;?<)9i>a-l>X|PB65(5|l-ZalF5oh-mN^OeTu- zxsExG(!(3yGu~L~sTBzj4#Ft8FiJNTKt5!7ZxT(%-MtjeH158{(%0Kz!>~pE*`W=^ zmsU136O#XjX2h;w(Hdb7bpG%7(}f*B#Yr;>w|vI&TZM>bOLzhdsv@7z2qdEXeM!JN zgbeKEE?E($KLAns8{)a01tAJ^NL|n&GWFRDsnKKF(Pj$dfCLv`u!bB|HzQ0s!KzL3 zPxGh0Ane~~c)-TjG?d-*AV04)E{6_0hPtYB{ z*80S|P;RUA&IcU?9K-(ijiJ^In>%AVF#%E+h2T@oDK^cGDb|`1B#nwL3kke;d+#I& z8K7HFc0~5XcEXxV>JR#TBn0{FkxfOdrVSYpd`(7#%xNWBVYJnq(-I<$Ecd73XcgGh zN*f`}{A_dKRcqn_r)>3=MHk9VP0sL{URH(>&ZDt|PeP?A*9Ogy-#;~Eul!^~X13$P zL96wneqR=cY-Y#C5R922aiyB--uc@>hq>83CQ9mUo(eXRi*$yJ!0L#mtB$EQiqYD}(fr3dqX;Z}`Ue{hvLPyoRA=Ctms(PD^&8`<8gm#g{&)%@EBqpMNI# zTJG%no!!ZuPd)QY@~GWvaE<=L@I8Sk{P;JqGk`yfw>C=?Vz zlI;G@Fue4sS#w155J2)lLg7LAx^A-|yDWB9J54G7K80;#=#2xuN0IPl7-4++% z94O+u`&8_ZT!G%@wL4{sw(|ezha^SYoW;n$KjrSAQ0(p|ar4rd6%$VeCrMzf0MSS? zv9d%bNyjfI6{PN!X?9%y!F>I*i@hwxjv*cnOvg6Yde13kB;KSye?2*Mo{BL1bsMOO zwzJi5z1o;X#~j7@TZ3=5iVHCDvI=bew;oZ-zf~&IML@J_KEb?Arnm?^$t=>X{6BhS zY&p3Z`L!!}WtanauVk&iM`E7p&L5Oph{K0mC7A^~>kMkd?^2>76t`xtCh)I@$ zqdBIzn!;3f#JP$?*NmBchWy@YN>>9;Of%g0r{>eSSvhrii5{{N3Fj!W;yLDfpdb!$ z4mNO#sG3H&P+1Nv9FJ1CjxL2?fPVBT2kep23V~a2h&*gGv;V!4e*^Y$)wQ7EJ5t3@ z31%wbHLTbs2YQ-KPkb!V0;jyKwV?yoyyK(^T~115%K!y{BiX@VKimI+34_gSM(7|2 z){NGEGAy|tz!++MxcjF)cbc$-t?qIeAtnRT-3Q3=f*85BPC8i%dL;935AjZAKg zSmtom>a1!u>F)&4Q2*P#58aO2m3sMK0B}T`-tu7LUWk!DHZbzjJghW>j*v3}Ou4-A zzx*dO1?{X#>2GIq_LwN25258V$tmJ;L{`}Gh$d6(6-p_8x1Vb~zamA$^u^Q-m`rd*q(N z^zx3qJ97v--ffU)UJo>xd#3xQ7L+tRl@-f0IQ7&h@Gu1t0`5AY21mxyb41HEBW#hq zKW?+ywBY9x(S;mX4-Z5SS;1K`PUtYbDVRTf#M>x<}^&&3luw1I}_q#*rWegu);WsDyjm+&s#V~YR{uEx2+DkEznJnl{mmDhD>WpHEg zdcuP}6@6?MN$+!@G9vSGOT}OoS|ECAM;Kp*bf!7&a3HG*hKaf`W;J~^VQI48O=zd; zLBXH-i7K^iU-?m_G8}hHvc^QbogZaVGbwIa>lkRBAyo3l6BmE~qstGTxcKw$*?-~j z@w+xD)7C1M)V9>jU>3Z`m(3Z5(7>!7n+;?~UPU10MfVP@gxM1P{G!T>To8dKIK$$) zna5l)re_%4HAd)-LdH~yi-S(yqMa8qf&y-5J{8jhJ;Vw3qDL5P6!Dq%BwD!V#9)IE z-EOmV7e$3GF(Yv=uR)pzlWR=hIGG~aUdFL3b+gFn4y50t%fJ=b}@88UdF0gVX=ZZ-1JcT^x7k=jVI#{d6!tQne(S z>C`t<&?dEyYJt0YorQ&kt~FRumRZF)h~AQ3MtzBSX&DwjnddL`*i_FJWSrpQtmlu9 z=-S24v*YUG2Ro;^asK6MgFg4I8T)fU2^yo*E552 z=Slmsl=d1VYG0L!Td$$w%bKvPC>=al?Hz>S^_Mpw zP2b^ciueS87^#*rJwybWKK&kF#(T2*qJ16SQ2#wag7=3TNhk2qN?o&OCUjPyBNR$) zO;5q;AF21Ap{w`00egj%1SxucVz%-hM;A)$#lZp0gbu9Fn4PlgJ@CDKad#{*)`H?_ zkEG{p+p0JCUMALwD)txH!{5Y=3z)LEs5TFDr5}EQCuAfm0asIOH$g?1rTU<;{A9Kf z)o6iBo2Y~>=>pakW6}cN=q?SKpXbRlo_hN!1OkqwqOyaC56P6EC97bZ7!1i z=1bODAoTPlmQ1U~x~-EM-q6KpU9ozhhme4s6`{jzZ5r zFpB-k&`er5v9|lySnij#t;*aevW2nS@eelalN`TisWU`6qz}%>hgP)yUIosLsLhg3d1OYG0>K}Yu=SF^WwD{c}LV1}0Fd1KwzrS9AStM9` zrH(M&{J$VFit*w?LIuxmuh$<8`okecDS~mCdIGj?O8K*}1squiR#>!Rwpi8v)^NLJ zzjC{i2#cNnaD$O8_!E&5!V?i@3fY>#GdvL@+myGY^@Wg9Td)z~XotPw>KP>t$iV~HyYr&eRC3-(1~*i9lh$*(6^vG73H6F&$6b56_Uyw;E66-CHwto=K& zqvMmXITJ$Bviz^o=2?%ZlV8gY`2dQIt-o|)h^jb&;@RI>spj8EE~L7*r<|7s#h<6E zIo%LKaFlDIYeORYjFfA7s+c>!0A*_c+V8*s`dIz#nP&Kd39}2A8m>!MYHk`}#IZKC z3hZ_v|A!H88~Ln8Eo0NEvt+B}$esP$JkQ%t2t~N@z*7J)K{ECtC8^G%?ha} z{7ca^>;`zb_B%noDcy3LSk9B|ZH}`m(z8C9f5aSf6CGH==XxfQN0t;LybC`sLiT}g zXyMnT_OJDAxMyAiPAlAhpngi95VJBdwXcG2pLxa{qS#{d3>o13I{!fZDSsxkFlmxl zR?`Tc>nYA*rRC7ErWsa-X0|_2e{R!enzyvuMf=GOD8{f6-iZ3Cc8k9EUBi`^z|~}< zztm72Pi`E8mWf1zSwbnaWK^8f}h;y`c zA^))~0*Osy6V?`KVa2ZlFdw2i9s)Nh`WTfzgv8R}Pw&>1@FLu)bB8ERB3@nN@)@oL zKlbVuaX+O?>UV2+TvY=w^u$3%28yBgUJh}oCHFAM2O_wL^Tji;ptJlU9&o%xZ7g_J zxtND~^7=-!CYIN*k*|r^BfQN)M#G_BGPY#XL!A?R>P!!2iz0V7FxmEV*W%w^## zCx<^|GO;*El0TJ|SyZS5 z*maOl43i{yQy55H))g#W8E7;3B{GiVgs1r2F{GT`5mqK9g}4>v$yj`?9Dyl~%@FSSUwB5FcJ-BhShJ&71=oG26Iz>rcn&AY{G_$b8}5^`8vn1es73&I6Z#rq09sY%NeZ_WMm4 zw{GA)P>4*ZVh(?6-9Z>uSC4OQNBOsIdI9g4+p~188evu?Nt$)Qe|n2^BhWnc12M-r z>8JoUR`&!4%3O#Y;3LdsEgY1>M5Mg}*vFkT{lgF)VzW(!Ye50&PymP<~u*aB+&(bA%mwSWcS#r^d4%>MAJs98ordx zrg?+=dO|equg2@dZe~O!osAuYr6%Rzt=KYokT%pwFNIe5M0hVX6>Q>^+O>A9Zy~4s6)@tNUuLS$gj5 zIha*=q#gwrS07)&>}~9$?d=b55JYeC1Zko^rma5mo8Hdbcspc^rOkdTk%iUq?gierQ>SDmnIFrFA^@03&`=Rd|g@Rj{>yA7HdPM)l? z#}O>-cqlR@SMH%#sfC*;<(TGwnF?P`__Ay9fR69I6-8sk)8P1+Ww>ERRW@ddU{gf} z<4O@x?af73+84|GPTZHn$JkbTfCqnLlZ3V}5g$cl2w`D9WqDF!xC zsle#&Ea5<=f*Jtu1x7ur2sm0~mdGs&B?2Zq37v&H1}(f#Yi5|VrD;y8Ke_Q^?}O9~ zBJ<@AMp&0ygZZ_U<<^X{#w?A6oZ)|M6=9(;KOzL?D7BTtPG9Xnn6oa*DPfVwhjDc%Z-{Q&~QbSNzYHWK}+IpB7rr%Pn38HB&90Taw6Fx#nr_VYxLv?OT5`XTzsU?kghVjth>CuR_G zZS^aYrN9*T;Ui6sSOxXSNsC{=dI$7ld}eys7Q{jk{0}l8{PX$f_Rf7xDb;#_|l z5!OFXpZKTlB9LtoCPQx)d!es6vXHXY-~J%2*Ga)!r9dVGBj({Iqb%NiS(L?MZbm_x zS{tX3G!1*al zSbyU49VAP3A@I69UT)|-aDPQf2VcDcSqC#g*7CF@mBu9kPXr^$7aT8RFW$|U5Z69T z5Z?35GXr-~uH)12fp4m^v#M_j&7}9At-lJB3qBBApp`rowc$cKbv!#BSWXs4(Ye1G zSf5}+bily-WOPd-;vMxbt*^k$NFO*`(=hdW_S{cbBv{J~QImWcr+zR(68?2`jm{vzt&AD zO(Z=wF=<-x2n(B($S|6tLtN(R5SQja5ySaZ&4MpgqnpbX;E|Du6HABeL){`-08VOH zfP0_@r?e^))~$6&s!dcuEeO`I7&z8@vKm5-gbdb89in04>r4ROte7^i*?p6OeWbd! z3ii=ZN39owvpR(Xd8~QG7`;=$xj_~TwE=JFmP1*{!k85?D~4y$5z_3Vps(>wBw2|+ z{V8U2RNc+{pcB>l3uqxy9?#vh2(Sze!9_y7P%eq>vF|n!hplp{qM z=<+;x9j>1!6S^FKe5+IlZHdHYiP6z!r$S+MMvRmNnWgM$V?8F|s*{^lRAN1jGYTCA zVL3>Y#pX(A8j{7)(0U!FYRet7d;hSSu-WS${i9YH_a=|9W9d}wjSVCEO;g8&F)EO7 z4iiA6g>doxJ5m7oFZ4m#8jBEujL35ad79ReJ%Jp!IbEq$XYAILGS=3f)DVSyQN_yH z955uRfTvJT7yu&hmIRX|e!e9MmXt=P1P?%ngUQ_b*;@N*mU&GdLd&o!ta)NA%#jE% zyhV3kaZ4gL<*$`n5}7`{Ynf+w-kg`q+LRVh;f4^Wmyhx3o9roAC@`e zfby`y?HeI>Z!gLOsNriOh}ynU{*DNz6E^OmeQ0rlqc*ROIsMHpUT!=UK~-;&M#45; z+_xs^*u0IMNZ69LlFxm63gjxRb=oiamp!4W(~78-USq0~0g3lrf&?=hNy?YY4$w;x z@o5VhC;;@t#wVqdOe#A8Xc`@`mq`Eb%Pg*-;q?~I6pY{tN1%%T^500gEv#RJ^^cpE zGh0=Y9;(Y`E=Y^ZPDck89jdTP*_f9Cjqx>3NtNn5fJ9HY;Jpr|DcQL2!pU{W`{SdIqJSIhN zhO&w%iKKE;_C7ilwukuhEHP3h{~I+BwuVd^a5cyyPGLGN;ZzK3H=!tm2XEHC2k&Iu z_l;wk|Mq}pLy;caUDj*{3k7LjuqXhUE}jVx$<;Q#qO;zW`B^GrW$e=ezvEz%s7!#t zV2PG*CI54h_nFp<7ayg3`a>rqW_8!k#Ns=C4~(nZsaeV7vJCnEhtc;a-)6@H6-<9` z7Nx(JV`=%VQ$J;gE+%%ssPq8ME$6=tbI?qEiZmUIs+|B=P6#2QqVKUi}O-%$QG)iTOzeev~hQu=@#uW67#QWjh+1?A|*_6WH z7wDB-V}_Fz7QnJ}gGZ4fWCj;m-&|Bnj*Hw=F0#G{`?I3FMxWM59pZ9;R39#fN-SGd zKczU^ek_eueL7Ae5to;7d<~Z~9Gk=C&XNqk{n_2+wfgj$a+^NAuDni{*O%Apa$mWo z-|jDW=<>iUkf+@iUtitn@sIH3xKM zukJy8zXeUOy+LF{A{>?qLh^2Ll<+Q&21}}y`Zmz+`jJlk9da5T$*JaY1uoU+a8s}5 z3+|<3#FTV`Z3gRKe+?BK0&ETg) z<&G0cd5wW%#WlrsuSP)6l#D)+7S}vhU0bX^Lbqf|#gPI3UGsP-YO;XdV3P9>q}8IT z)1}$*V$p>s*lRq1b4RgA@9l7;V)3R_=buOwY&Sr>D0ZMHZz!%n%Y3@8(|z2+T7aBN z+it~(a%;TEZ%*f{c^F!Qyg5Bk&Y>I?G1SpMZ0AD{Gd-}6!T#MMFUIf+C0(tTr*#Ah zuGM_~9jwjFkkl_7m%iqtbu?=>gvz zfws>faF%XPUj*NBIm|(5?#om(v6Fwh__rJCxc;&7+J@fei%LZgsp^K;QY{zrudp3@ z4cR~!I)7$fzu%;yx>xwpEV3Gzl?<-BTHGP=Z}q;I!zQ^%{m<^6at>rn&j&rWToczK zt5>tVP_Pq_^&b{FVHP?@;z+TmTXE|`!`yee8nN=41@WkHAN!4pCEj$QSb{z11N3{P#Cxx?Rgr>Ij=AGT09DIz}97PH`A^+&IyFJFUp1bLb;8vu(&kqw6#E$ z2F0TIRwwabuF=*qiPx!VJ8VQJ8N2WqyjG+qN->uFpg(~ERuV+BmWza_-KaaVx1-}5Y~kcl=~FO zTe91KF19xrmkZ8(!46%TYQYAnbt@L1+ZqaWEUi7s^pFNWl6-l^jm*S3A#@y)LB%eyE zie=%p0$_2C){32)MA&8zDt6W6?W5%?`+|yIKK}=rr9vVtQ)N zt9i>Hb^}~yl30oahNSnt67`|K;MUlnm~pPyX?w#EFOy|B;0mrfAoX-G5INJ)6=}c9 zG!ac*B`a`Gb(Ncf{0T`FS5b1pMXSw->!=$x)lpYBS_-&Z=wRa<{r}uboch`mY zQ8_z>Izv(}Nvi`VVMqi)ZDQG1VYRs7M8bj}eB^GHjungZ(h|{O!LFCkzP`0!!>25( zX<$~Nit%6{+TV6ea5NSTOap=e>&843@{BPN{#P<4n7lyKuy=dyM*yN}C`Bb=x)D3*_8Z{V{3C`B6v#SKTX8oBN~g4M`%*Ac8n zuDhu+rz>G%GCl{z6_x=yD6Zt-A${I+#7YAfHy*`mH~ z!D{4M9KmYjS{}h_+xOM81y9di#m_w zznIqLS%pBK9{+C2??zk``1}RfrX`3d$$u&<6TDq6?gX3v0?qLyfX%m;ooMucHgrnM zIMs7TE6*L3i9?U|Q2wa%W!Ql>@!y;)IIaOCT<%JMt~}epfU9895&jPMO43J!D|%;w z!Y1BXbK?XGbF4&ASc93hTin~U7>i@HFthfJn_*^mMr@;fBM}{S7%>-b?!=joqLj7 z@bH49b*yj4Dhwn_+9kS6Dw!_S27A$2%m#O`^uI<(`lA>vcG;|wqWJpSOaYuWmS4iQ zK3kx8DhpAu{7<9_0@YFyVn9wB?V!O#4rp#e3wPDOnZU!n{5Eb5lnXRAaQ^kApRQhv z>vpEXxR#HGv0x^O5(9)50u{=v)F;Z8*!F2d10gy^%0?YEK>ZMTJXqrg6kR*R!YH9} z#CaCzcs`W^Tq&hQhOCr<$hcA;20>mma&qM%XRZU4e>4KYzH# zoCTlACV0C|Fh-aH5+pR`=j8m5*XVEQt9SB%$u6|eAVzjr4CnTo#*_Tjv>H%OYt=I8 zF@$oljX2{vQnel3esP;c}u*{n~8#LSnRZBf^f5DqFama zLNn3G2^19kP?*6*US8}*EC-RtUZFyj3u8(Zce(J(i{<=>vnc)MqCU`kLfC?6<7?Rb zq@ev!(Y!b{S~3x+h%Ed)1TkZEG)y((t~jsrYB|{HgiXR`m&w~?G{p+4a2HE>s2ak7 ztTL_ff(oPdc7&O1+ih61##{gl+vq@F$j5M92#ZSJV37Bno#yMq`nz$^X>Hz!&iXnM zKMtQ1)Fdj4oZ*{k`o$IbSF?ys9Z(h#I_w)486Ws+#VVi+;v?uW@X=)3%b+wq60;OL zY*Lj|5Z2mv!sKixxwGagq!^`j^jj2F-nF6R2hZjlmeIeRF(5Ut>(zfwW4j_W=DT5r zq2rUSFq?PWcfJGxFzI-+35M}DWwX_9>gyLZn?VSjn)kP-(qY%()xIre7e9e|nDA}t z@6b*JSC+(S29V@(wwE8xE?bi>Ph3#PA@Z_Zg@iasS+E0i-OkzmqE9E%0E?fJIN zMpqScyq^fB$-?1TBgp&&mb#o&zL(9equ9pvb@lZ+23!Z=c7%zH=!`ZukC?Uebh%x! zYf3Ijg%qsnMvOhE44|Ku%Gl(-enH;c0@xkDF%gnGkKF0EX`Tp0Tt~4(I0vI1ok73inA_9KwcWyb(}M|kuAuVx zGd|0oH=lNpwS>v#M?`$NJXqDR!i8h9SGnM&%8|u&l_QI@Dn}M)RgNqZFGm(H^`%^J zNafGskjkIM1C>9!-ThhoQ2Dc09L?_Gf;TFE7H9P9qNDVgWZkn@zO%d0Q);Crn}LA& z0`r$>0<9HvV)E)zi3V}sEK25 z5rO!_fyR`p<$T(qrw@@d7eCV|ZF?)hXq=Md9u2wNC=lLI5EA(;7q|}d5i_WB~fT-R+@GXCj6!;kw#G#gC%C8 z^?oZY5g)F^nNAK%OU7|Zn+avTV-58t!=Vu1@OQ2JqcHj0OU-g2RhQ+DA}=A~nXu@! zte~k}plxL|NxmzH&e!!vKAo~PBLA12@sFn)ftTs*t}SfEC^Q!>J(N&1hTRK3CG^5} zUQBZKgWnBE#4?I@H-X^{go{*Rb-2d=&n7gnDMl1BTed(99*x)lra(v)eLGBUhkK`< zh?boAM1rN5wU$0WN~TXffy6k*QZS&yGDJl+EVaDVx_LA(PdLkjd+O9GrZR)NJD@E2 ze;3`e2z1mFPDN4Nsf8uw7DJejsWx{L+qflp1>)l}_ie_hj;Pgd_Fl+*R_c{*i8+VP zoXtVeunUU!+b4;qWT~`LH#G|xTw4FFNF3{Bq>Kx}5T8xXl1(V!Ve+5JIoN!#$mS{i zU#HW_`ojSPZg*kOQd@VhIG3fvVb}i8(26IqRtJlt(Wp1j|Bcu=Wso$m1LA`hl8}B5 zao<9tFd~|eS|c4nFEBE~91BmA zh%$LPxbXJ0`7}J;SE`cLnGo^GeTgrHUp*}>nQWZGj)6S+pf zBMdxK0gpZ_8Jl8x-Wk|LS=C47fS^gO?RUh0dH5E{!vIg3(Zm& z7=m9`RDtP6I40h25~!bz{Y~h-;rax%qAw>% z%IGs|POc$H+nl;H%)i0mB1OallWfob6?!}}tRSdG`ezK$9yuKvTE5I(YSouCu<$~? zl>Z}^HE^%N9nOmL4J$4c+gYN|ah@zYf&67n_8zF4`iOuHq|!=9{mmZ+#?1e51Us8& zfd1|)6Cr>JAaD0V{mzTso<81N*oi!toVX|G4EZJJZat6wqyD6=T{+;>@N`SE3v%=#qMo)3mFS1}GR*7lM ze?6<8PR`cZ%g^(b0~*pl{#IL>IgF`tM6iDG$!h0gmSq!+5!M(`PP4*B7y+WQM@*4i zL81<59ewz!JF4+{%Zrjn;nH>v%HsJ|q5~;|*`a8IJ@cY77BFCy@1ze&F(LyPU$ZSsb2Mjj#N^C{$qCARz6qFV=)a--r*>F9EP+ow-VI%%cZTy= z4o=bMBw*p})X++mG(pGYr$$I9KO@MpHH)MH44-_g+Fk5auA0rJpqn}TTF@{@mNBGu z7P}usxRIH&PMQrC!-N$0ZP%NsohL5X(}AEJ*^UGqux*PggeSq&wJb6MwrNYCn>O>Y zY&@p%6Hsg)iVg8Thi$~OO6ZKYJ6OE{Lx4K=i|qzw1=QMJ7jJa5nAylbLbX_DoOY9Y z;d%jnqLH|2l0GI*4=`+Do(F_&3Cj{^iz32k9b6`4M2G+N+@zLL9IG*z(Dn{s+$^tw zGu;OdiRISE{;u30Kqw5V}$oMa0W;Dnmd*=Ww%-!d%-D;u^J`WXs3 z0Zm!H2HytjV&G9&W|uh^T%r9m63Hx4o!!oEI}py(0V@IUb5PCqGJXU_zSgniYb+B0^;#y zZ)>-nz%*hU9J2(n$9BVnI-*~u+>~i#kE9eKdjNc264~2%)Q~*@K0$h5d4lx7`R?Qb z&L>E37m!{wqkcbvct5>6+rBXx{>hddh4q}2&t`6uWixAT7lgt2a<#;pP?p2IF0!Mz z$d2N2*s~IkL1KJTG@Q$E3@9!y!-(K=1_O%AorodIK`I)~r!Ck~CIPVSZIesRT9INX z61NL3p!j4?J3@8`OFR~jP4f@WVed|iEcQPlIk58he!~Fl%HoOov zH9ufEK3D*b?uI=HvB6P$%0)9H!Jnm*7HxZ~D6zoEvCLIfgU0iT8&|c13C#KwD-q=y zeiWR_=0IThM=?Vh1W=7qK_+Xprj4oEy^7Fur>Y;c>4=_R4YGcH`2LD zFL*WgF7c?=S=!guC5Smq_A#6~a0Nj1VpgHU|_X46C?1%D()=~Me-qE0I zt&(NTZ)7oLm*=l7wuSf|DaAg&ir*pI_>~#HOD5L1esTR0nj2Ej)5Bx^aHb=HCFWz1 z-{$Lw@>kID5Y8otC8yk5#9p|M^-Aufu}-o5pqJvslzCBo*qhbZcv2kb8qyoiS`E{d zR3%`IH_U>}0avt|&aCM=KTol2HO4sj`QB;?7n_qU>+KYuE#{u8=59?%r1u*F&B>hN zT{g*6^hSqb>BPnSRZ$y;0G4|O{h$d)gym9TgWH&eNo=?q5_I~tM}7&#=HJ8}A?jRxX1^>89mXI$xSUzLQ zJX$9aEddRfe@w{o0O82yhDeL;w=?~cwWJal9Xb)wr7P{N3B`s@d|&CWvj_KrN_f?saNUV{7b)lnShk@<7 zFf9#njNGMTNs~D57SOb>+2n#N0jMAnX5D?e0ZFCuFD!RP*)O);fJ`uLHy|xo!~u>q zd*Imk2U3D|OdniAwUGM8v)U+Cr*~i>)7?COv{$D3nWf`zg*Z8!s(zS+Pj2IXIkbmm zK%-Ju(Z0_7Ybu6GtuQZHec;p{g2?_<^D~-asud;L5(xF%VJ70^pUE~RcWfHHMN@hr z4!gFWopLNTs}3JbmRUnaCV!_<3UQlqmOsuqMMBUTI=%RlI|VV5LDYUUOafHST<9=y zkw>SYF21%p-VJd%U3i3y`<#rD`tyH)-+{mI4_g!znsQGn&EJtl2$r%lmlgYuBxQly z@t=JeXIbvIbIN39?~D`cXC?c@t;O3WGe&l5n637Wd2?f!G8pqzoUF->+APWb-%S^( zXqt%5shS9|wh|3|>7whIlKmgN&KG9FKbopIN}}*e$B#O&OJ3LoG*Dk+`x-|Yga!BT z$x}1Rv;+B8kk&d>-{Gc$gcJCsQzU1XWO9h*IuF!)saw?*T7gefWcQO(X>Fz=QGYn& zG4Xa4UbT=+JL0E*{gS|-A!MSUEZSH{+9Olh z<6kI21~6OZk;KFJM>k2(XytDaN=iyva5ch(Tsse6Zk^M`kl^?1ZdS&V z7&Tg+CuD@KnmIW6RcZQAkvv@{8N_}t*^5hKB{5hM(yu&jGZ(%*ae)|2`l7U|GHvcJ zvJq&M)ZZeMBM?s$!H1Tj`au*z;%ksNYjJBT=L?G9tOb3I(Z)Fow#L%CUd)o| zNP;w*fPt(7TLY%iKwC+PTAO(z&F5=?MlIs!X#P&-71>FL>8^%VlR@!TKWI+1StLbN zOQ6>|4*P@IcaS|Ni;TnN^;r|wt=MuzEU`||i4rHnAWDW3C2Xv;atIh9hs4z@GCf?d zSZI##_hL$NVaJ$#LzDAmqCa^9j3r6d=OG1eD@|U}Q${Zo7~^4vy<>zbLT`0kEH%tVu~*bDx$%k>hPsxoU(fOA2!<pMRThA_v!1l`*#!B&DtH)nI}Q{^7Jr2$Y^u31Z@< zge|Pnw~YCYWWO5eh|pLD2;eSR>DYB)e)E4y;^TQWedCQd$R zpnY{*w6BiKT4@0V?W^OH9SOBRMiO4?k%TQsi$ym8F$3V35#m=gRxJo+pF*LVqEQPe zvzpNbsO+#8q67?O4<+ufkoS63IelP=^tZAUmP|l8D5{j_WX}{6M-=?bW~PyD-K$vc z9H*?F!(gDk20qzR!JLN^-zy~xeuz2BB$_nn2XLGW5G>H?_G!FwcvyE zv|?W!tGL0xS2MQ!Fsz#B*tpfwFIwdVNKcUW5CK7{5WEA1udQq5I8HZ>(?|tBHC8`u zf<^GfxuSm{>EV<>tE&6}tJlAzmTLqFd;N)N;-4aVepRw({$Rokn$JRdoBBhEa|Qe7 z*C|~)FQ!y(AeNzR5FF4EJ5PY7lKg2axGo7rjlv$!)!+C2ln^=wQx@){AHS4PWRs(C zlO(lb*2uC`U|zD;KKS`edkTx*j6g#*aK7wsbePDb8tA-vq>fTh=HRPiy^mf7dy8YYJgWI^w0TW2zx*2{v%d z1m_6H`?}{<+0fB+#iE1bJnvXluzL&++GuvOmUP<8rA60wz)*A}|Me#E1X##<0yIcl z5urLv#&HNkON?N)-kPq(yGAAC!1f^I2)DV>e zd;)Vm#D(*?1C;X8s1J_|1sQ(_`Jx*IQOmTIcq~zK;!YEm(hhvW?l4OOc$10hUWm<3 zAs`qAVfX8ov@N2>PnbA~@&5f3K z<68C?5>J~KEN>>-U$Jqs!@9D=`eujqWrrQ@9JAJ92h#c&Ds+G6n3-oP=w#-Z>TvK% zi)UZl8OI|9BP*Q8@Q5_Oc_4!lI zUk{JM7%K~GchV+x|!&5AtPm0BJ*@AiuyKh`Q$~#Fz=}W8y=5Sfl z!fvdSaL&w;P14X9ekON3nHEzd|5*}G;#?6(4s{z@dWkejGC>)i(=9=y=@!7faZ8C> zJUuzH$qR>6zN2bBtVSA?PJ8UBUL%&fE`?vP==Dj7$gm>&Mpbr&Y^6OFAv}|gEVm3v z1IPg;PSQ7rI|TQ2^54UH@};&|nNtVsJU>Q{+F<8ge4M9Nnx2P3ByX@TbYiMcM-!SK zv=tp8Ga z9IgrZIvM}-xomEug>q;j=uLJ)m`?v(rXdm0KVK?%!^QSEs05}ZR;dIgUmkE*X$$f` zu*fyqh(lFi93nS@m>%k~3h;O;AxHKCu7?B}f+jnzbV2(j&7YWKBR|FB4$&F3B&Ru^ z!?b2%={trqe+}|)#kf(4Z{C2cf&{Qc>d)&yf^)EN(SM>epDb_{*_Qde6Z2W=P|^V? z0VijRtgxZ~#yyO8Xs0fOD38f(vDuTYZ}8(e2ieFcOGfvE*m=(Q}M$ z9}N-)hMKQeY6CnJdI9=5w+D8)c(Hqq5?=WUWwg~dD`10FDn}5zR7Ld}lH`+W0e;~Z zE}TQf%=1w1+<8jTdE5x+4cg=`mGtL3OdXps@FQ9M5`TiC2J8I8318=s1jHw9uURe? zA*+iQsjbVX2eqn-X#yBd|GUOovlsN}^ZAeCfAlCTWWmkm%c`E-Iwzo$e7~1rO zwk8{=gO;0|D;sAM147XZ>Yuip54nB*aK_y9@Y^g8)eicSM;RO;64ZkT#?@k8{+SZv zf?_pyZF*SbbD)M8K(1s7rJzl<6$^tPe`8xH6Pbg-C8I~p9IK~nrZ4)|6&8y07FH~V z?T1Ys88nu@sXMR&x7>i|iYjk79S(H(LrGAUb+T zHX4!UzkmIvRJ+a|I@Q*2HZX{gIX%o>ph!l+YeI$s$uxPdgb*-8f)1RdRw!-u@I(o! zmuCDA!Tca;#CVh~&^^+sn?DT;IOSh%ybf|S^AaN*^DPLFtScabmh9xyPobp|1L= zzr;MtAIm0&1~G`tSHYi=21qd9-jfMcxoqlt9d0*+XKKFMJZG88Hd%zlJ4}ivK!|Xx z=DH9NCbCGsBH{J>JH?4(k39N#{wL^UD2JIu1F}`a9qaK|aidZcN+?{fSh2F5HBTN) zw((PP8gB#Lr`xhqwm~V$SWJFzO5m#U$T2l5G{9N~S^os}?vFi|0DX0OqCQ~X!|#jVg+9eJ;n#R=FrFW1nCQynvDQ^DDs zakiGd-pK=8KX9}=6^TfNCO-g?Ms<$@O2chQJvfc+;eBvb-eD7byQ5u7G{1=*@+~9PVWTb!P;_Drv5$z9#j2~>n#5m?CZqiXO}eAhjjxd zn;6{5FajOD`dyF6kkR{ssRs#8-WP1Q`uni zAVX9JD+VO|TnAal7~31UTf8l~25)nbhUGHtL2Y4ywTc-M%OF6hTl5I)`%~$ZBWdJJ zq*Yd7i&r!Xi(JTC)J0K3E{YOz zQIwF2qJ&%y;~jI+ej_g0Z^T9WjksvP5f|+@;<5$Oh?VxKrgvJF)pksw?A&>dxuhkQ zZpf=u?}NZFKI5y|hIU zzWWrz_018vK~eLTCqGB}Zj*5dy^W^w@fXwJBR$GH|s) zohr(s$88dG1zJ9$E6Uzi?9}Q_PKBUCHx;A_liH!NFoT+2;@bz4?E!Pn8KA6tJa43w zS*Mf)YvdWEF0SxLPV&ibXYSbrYq&=i)PIRwQ^li|h|HF1#hgZ77;NOxGd6w5Ef{$s^2igB zDTJp)WNObV5t$A1BqB$d`%zCl{+UhU6UQdX72HC+%SF7)Wfryt#}V%udaDROpA?_q zqWAce#jnxom+k!+thm7a&=49@-z$awKu+Ad#NQfxUIe}nv89Jdu))Sd>K4}g%SP@9yI zPGZyr8F)c&%r!Y^eNUoBYbTL{T1nJk%=`fMW$A8)NI(kGfGoZgKWBqUcTh9b!@}gK zE37~*289&}Pm8cAv?;hCD5W-=uK3Y=JQ26!qN8K}=pyu6>YWoHJ2BoSLAbj4|GNc7Lc!5Y>mBlnKQi zOopc=0L?CuUXcjIFy^#EjwR6t`7ao6pQW-8AL|Q>h;fYJg1hyU2?&q}60x8EJ*O~6 z@|`v6p+3f!jAI`A(qD?F7bkidVjZP9UwEvi%}Jc(&m2hw02n~9Bb!5gYe`Dmu_KlmBaQ~gQuJTo~6^czp&@;>byn#F0ZB8=0Bcus5 zO7^@#tkAlsp8%=!aA7fc+Q!+E&m`AfuHgIz1c?C@P*j35ZAW; zc#{7k4$Sr0@Ms-_jPBPb5(Fdrr>=~$xVa;&BtL#{1D-cOMsLbo?))dR=tXnGWlc?- z6W?L*)=t*j7-?$xN#>C9Zb?7#q4rA~m_v#tyaZ#kvTol{;iVK^%$&9Clc_?hY)2NB zQS_*g73Ca!1gxh-E0b`!9-6Ap}5!D7L44I%9oC6e|ql9>1pI47i~cnhS` z6D;|#(ykvlk-myspftL2k|-UqqenYqdo1c#?~?X`y8BDCE1)Cq!d&W4Ffvb{h`2~C z=K-QrE!O}>&f%Vm5enSuW~3M<28bHLK%t@SKe(Eyt6Nf93Cd8JL35U({2iA)d@@jJZ<_X2}B_tub%6})Mv5)f5Wsd%DE59VBZTq~hX zHv7$;%u21DCIUyW;k-MTKmnDBbRc6XzCLg{HgijOK=vX|t+0g-kyw~QCP!B4ht7f0 zL|VI?<5n%yYce8c&_o_K8Nn*Pt@o@_Vq(b1THSzah0K60EoQVn329;}w%wq;Q^GcZ zk3ZLl+D3uHxNGsgW_In)Ft6=94>fm2v&QZWK1Tb_1I?X5GxGL7%Vr|P&0az=!U2h) z)#kBixs`6Uc#4lALDhNf0Eri^yd6w1^B#UlDc)11S&S=;WZ(tsE&VUmi67V>6QKco%+AfFqJ(c*N zYZJ=aISsMCFqybY(23;eAnO;qm=D=(nZ=g#bV+i=pWBZ(Ad6oaDwdkE1>*FCZ0}!`3Z%~$Q5}S;p7lGv-<83Xa*E2J z$et*APn<{}d$1av_(=NNvd918X!l4DJ3)Re$BoXl4F?pJ>j5Bvx%`8z6bnOqwI3D1 zmQDm4+Qw|023amfU!~{<<5OK17ik7gByKV(9ScHJL6K}->BPx8pY2NarKhZbTVQ;s z4LQAh=qTM5;zr;q16W%WkoRows4&jBBGd5c^#&N6%5wGqP=j*54vFZ{=$26%IwZ{} z6XFFyg=Ibd|u^1kQD3W&59eY$_zONX<**@4E?Q9^Z6qEk(G=^}~9MgBV%8BAOx z5xFQSmWy(wxQG(D2z272w3JKOx}hqs6QlNwWE<+ni8}klq@^vwY2*AU`?@l`>taet zN=%7Jw7$%?cRbiCK|%i8zXblCSWZzm)~Ofb^XD>&Ewgs^Qh5=An#k{Ba2Kn|{sJBG zGPOA$GO}|`>CqUIT48u$0x= z>J6A%Ympugh@()=%lMaK7wsuK#vzZuXX*IeosGalE8YlsZHY*?K!J_EX0q$_4uk=g z*6MjH;mBVxDW#szcb^-Q`k z73YP(1Ms^N?I6!21_Wi2@T`cLB6A01o>R*~#(G9URK?NkM=Wj?YjaMIU{RXCeg;o~ zm$K&(H;ohE&i^z0jp+}qTwWsz*%G%0KraIz(6>=)!VCo6vKuQsa#e&pRqLs(ZC)A z8&>x2w=2vwYs1M{>9$2GNAb!Or%>bTsF-`k>$c~m%)J0r;C3WPt92`F~PT$7=BS_XyX%USU{5IbBmr@?vUDX?0b?p@>go5OMFYkR4!2e3{1savy7F9 z7>YG&0@(JMPDGyiN=+tE%5k0xEM?EdGZFNhz(o~c&Wwk6nTNATE&n*lU$(41&iInp z$H*ZI=%KC+G%$!Ix3piuu)VmBAanD zqo7XfHoEwB|NCAHoDhTiC3V?Q$Tw8TG@Jy^^&$Dqj~pC?T;LuXWouNdbvm%y)C;ou zbARhSbjxiJkavJPRsq%y{N|uDz0gv>_VVy$_`a2(DJdZ8CpNT!`hRy5JgQ|GO{gEz zeikOUB;FaUM_0;hSgV0RsqyxKv`VxuEt*ZHH85@()6y7ht69EgE$ zWX$O6Y-Ty`8Bw*L?oGnA2(P}&MQ|dVK05!$Bgl7#ao*RN7NMWJ9y4H2G;=GnOwa5Nqpe5m*Ic zH-j3V&Ndpot!Nv;`lLiRN@_tMl5cQ{ru323KpAo+TC51R+hW09L1#X&(H65_L)q$v09>)m z784ekHqi_!0<=PJojLI7$xWuPWu0!q9hYPTgF40CGL+t-MBOHtL7LzsPOI-&&3~k; zFXW3&M1oAc$paX~}A2OdC5q!2%}JB@lp5jVcXM6GQldDisL8Edl|!2n67w%o8rEQq4tGs<~`I=?1mx z$iN~5i!F=ejfjQo*DA6`@E+F;m~m_zltAFboHm~7YxYCu-%zQ}g92bdC+hq%7P8iM zBZx2m7BphBVkmPZCu#x7Ga}JjYl~~{E*h41XCflFH>x%^QzOGrl$2taL+SJG0}!}2 z*LnldV^8z-odWDbf42m4Iflb;Wr_0-!V7qE3j3Oel)Y=4>@PjjgRt`B3 zKxd)FRgzeAEGk%;vx5z`*))oUGtx4?0R%@`TvE-Xx+$s0Q)YUT5I02?7$8;wG_SNC zqTj71+9*uK!IrG4Z`C-Z0HF;?ml1|IesnQpO5#_lze}s+nB?8rVSl|!KrzbN@j~To5LX7 zvGtuP*9&B%^*9zr|12#?ZXV;(Q(n)wTmLyWhn{N|FPwvGs)r5UNj@ z|NQJL;%JPmh3k@F?2R!vuWM|- z+u%Y~G@E=nBUc1W`40rZu6kK?4l&EK6kf{s+5O;A@V>4q1 zP;5|(8f|7i830MDl_KdKPi~`{ujDJ)gfdq;Rz5bq?6Ba-O*hF+CocIuURD@gzG zC|P;{iYTD)Ir$#!j1mY;%{P7&bxd0h^{@RP%R2$5Jxk?TO(L6*rUTaZpHN{fYktzT zO(WIv3}R}E)GF4obSF$a`}p+GgUWN4po3C|f=U2k7}b{G>YB`Kjd zGgfpVkLNj0Pp3ZS6Y-U;iGX(Hk=Q&;MJP6(hmP;c>bUzsat%1u^R)Vax<1s+2G1IS zoQ!|g@&f_#@J~k(NVD|{$5K|^0NjFg7Zm_<7sruQlxpt8hb}yF;;H0O%tp4a9))2g zfttOPa0fL)8e1($55f!FDe=9kU=y~RWD1!D9Smv68e2@~mj;a%Q<1v7hm%1%Q|4Sm z6-Wt%Z3%APnqJ4%qz()$XD6*IojXM3Hx3gL{J=g5@1@Io88arr-`3!sK@j$X(S{id zy=VD%W5v13@*C(hdjM6bs8Gs>ZNLnNO`@lRp$2{YEbnff^En7*6P}OsG`y{mo`ejc zP5}=Rn+Va>C}m;*@e7+E5SIafo5i#RVu^NR3Q(kyACx}`3#+5ZwCva(GDV}(Wj1Z& zK4IIfY`UbbXZ44M~-7^q>~)e#*onac%Vr1i0LNV&cmzpijx>* zJnK}KDfJr%#RP|u#iU3;C;u0%__blI#`>N{qt(|_&F=UN&6=*$T4<*6An*;paRRDi zhIMhboemfPw0iit3rf?Zmiiu&yJ}m`yBsQV{r)OoiTh{rkyTMp<=l zNml7A1t&GQOjF-yCN%F_rdty19c+Bs?}%SAtdfibh?Qh6K47V?#CL&KLT`*tJcKe>^~z|p8X z_W>6CF^DvisV!XGn^3UtQ~pi;L9V2sd_B#`b%M%No(0cNf2tPbxc;=?O2tq6g^h-6 zTvH8Z{y4|~9y?bTr?{5q>hje2^WX!sSqnBK711)ptyljpaR2Z90fe(hW&~6qGh*^} z#@7y-y9i6_-+V9Qo|us+7v2Z1NqMCpC3y| zqdM0PD_#>HIr>XRV*-R^fYR0>Bpq}{)5q9I$3<02xoG1d7i~P`qK$`KbkG?W9dyR! zo^rP?uPM=SYuW3{D|Gp~5>H#Zw%J{_KfAZwr^`2&=s*0za<48AmRIR=F)gpwb?a&i zf(3G2z*q(ok=J3DHP;j2R9B@IORbaY9bl)hpy;GGb;?e(d(7{)?THZR+({typur+Y zg`<8Ee#BV%S9+{Lw2Mxu!~4{8tIp@LecObz-U zR1OINQV3kgWXK%gR@B@Y`xD`0Wg>%N8*kUhiGpej)HKyBtz}=-;xk)%nn%9K`+CI{ z5mnQrGs*dGh|Kx!%#SYqyJg&OkFsUXG%}i6y3Oi_#q0gT`ulYvM z#~IffMf^~Ty@9`Nf38f(S@UsweWBRS(^_j~x*5SnniL+WBYObsB>0KwgqUo=1v%UZ z*v^jb;zw`F`qBxOqHS6pjEk$RLQ$n-hvEVF^PVTl1>D~5+*FdTz;WiyeWNAB}C~!6cal|Tw`$o z&+&qAwp;zz38zYVEPK(JhoEGqv|X^=<_M+Asc{7E8Bs>|Wd0_J)CRib4e|KLWo;5!-Vf>RE2sr}Q?;8@##jJGG=-Uu_3I(ejf*WAr9OG5GP?$$mQz=X0@uO-l#iGJ`vP9<(wAs!R=W@e2yXcod5 zak)q!3N>0CEHt5E_Qa!Zo-7@*7}gG&?kEcC?R6q#y5!Gm;L-$BS@4X_fz;*v-=uZG zP;(p8!a~D*si`OmSicOaCc?BXt3E0AJ#OVu4BFTC+s^tAW0op;ZPkNr`o&&-t@|uB zun^V8S?A^PkhvvgAqI$+*M~RTbR9FtL+5LucdRT&f$ctz!1a0dITb@`Mn$O;CGN-4 zVOQjTCyEaz(=BR3q6mtI)BQ0vH{wh5(Y2UXIHPXrWPVtt}r{Qm~o)uV70T9PCS^<&v7BS)gqyI+MP<#v4tGzrX|_OO-PW?gXSGe zrYivdr`yn3c$)RqVy8*0qV;s_V2Y(5IymbOch z+e(Cq(=Ef7y@AbQu3F11X8w4uUiBuM9eyVKd+4rSh*3!?z(B!u=ryiGeQoFG`0zaAI6i@o`~iMslW$&8m^STflu51>VR zYu;y!o>$dt&F#Ke`|USlx&7^*u!JV$N5e<}i}}*D*7$}n4c9l8zzy-~nF)Y@1QoOb zznTgRpAbxw*BkeynUH+q{E6KzlGR@#hIrO9M2qm>&9i9hI;9&bEgZ%p!c zk%Sdrw^92a4E@?(zwOOw{$suRVC!DWMVKuU$odLwtm2B|YI#7BY;LmWci^wGvHd20 z)(tVbaC7)koA_^TewzY6xa&~3t4|>Mkl!^46D~A)LN6T9P0&z4_ZGv1+-avwcH}o5 z;}eHXzLbjmyVw@+3`~*JH;*?5#K3xAIa|FvT`JQ4VNp9WUu3L<&o^`xM1hL zp3A%rTeypS+%oYj zvFBMd#;V0Ab%!<&BY(LZlj`t-Ph5n%a1rjpMYs!>J7IV(cLTq0xd*_7%WHsNxV#R) zh0E6gxNvzrC=8c-L0Y)nhm+0an*m(7+>Z&&!WFTjjkL+wW{me z)ACwf-;tKr>H5yJyk6ILrzNRwYuOK_^+(c@q_wq-vrP`_`b1jp*Okp? zHx>Q;+0Uls5q03Vg3!w z?;aTq?zWG3A^_*nkjiy=q}ZBbUVJCBulC z-AL9Yy%04r>3s_$x<(igxNGaJ(Y!WrL_=7s@I}_EQuqvAG3OTrk2_cH8W&|bEL42U zke$_XXXkjalg?F3+(KH6o-|~K%~>4zv+Go~jappA4SWw7aAxj0q&e_ob_$uvMDz|o zXIxb43_nP&VUa3z;81Y`|IKmE5J%GxKkC!;ljRZ35(bN-RM!lS5`ad8{$Gg4wMg~N$jxzXqBAtQZ~{}`%y&l>d%oi(FN4kOv39U z_X{Jhh|H(XsZig9GZwoDB@OZ~u&r5VMTNfo@8lrj(9Zo)OeWUIAbCYsGWbBb|(*!axuIe+8H73UpNKA;TcZSHsQ7ei|x(-876og z077i@zGFBd!;{wVj{3ddg&BaU>-d#*QQb8rrTxZvG;!iw6~>)%IuJt7oh3UJ=w=n6 ztG)sZ-4Yw;=)zYBRlk-+xxNq0-^7F05M0qlyF>86J8uUva#nowz|fAimtcQwO(-* z2NK{LOOQBa12am@L~2W<7C>yYTb+I$HW7cISX$t2>LqR?8Ij4Y27Aio`R1(aJ+jMI zi^;Q)`+?%dqCjYJ*jPo0E(y+MUP{wsy1h*GmgS}J4Y{)cn>S>>xTd(4>@8}|2QlgB zDXdmpA&fpCr%TbXcW1tUpsq4vspzP%Jor&xd7lvejA*wDES&%1T3+*F&NbM!hXLxh z9kj16jmG$4AHY8~B{dEJ8PtS?TY*ElyV$n}Yex@3TgCNtrmh-&1=>PV1rp!Kb+wj2 zTSPEnMab7@ehG98=$TOO3c2(}aq()gNUtHv2z!hIAj^Fisbhs2LVD|sv5)Q zF2#++SXXG%VOFyDT#g5b)hIKjdJK8hpxie<5-_uB^G4<@h?aXI`;eWGhn?%aAqJve zN)Fpd5+=@EY&$jZP+8g(6LhwDR~|WYYeoW<`PKn7y^9XDXF8Ezl@0+kW z_}E?ToaG?INgkIL*EBnVHwyUij)Etwg8@9AeHBA-7+1RK`z4-3vgAQbolI1a&p zvQV(GAE96^ib8xQd$oqW3FG>+4hbj4LAw5JbwGo6`*=OoeH7r}(0UizA{y(%N+MwExV68pcSa-V> zeo_Pljs!1+^c;R%_IP=0&Y@cpXz-d4iN0KgGpbRZ^@VkHgmzp%Bgx8c3f>#=*{Rzq zGvdZ%GjJOr6B}E=X6?q-QzmeoItarqMtrjBa@>j2vQI)JFMbkHH4 z_Eax%o`S68*T3XsWHITyV!JU3u7H@tq0?~<+`YhWK18*aSEys zY}0fcnbuZDu`Ob3qLLPR=n);21j0q|27;nObBlnYEefrmi1Yiu@B6K__CANC612tC z+Gp>zzV&_Y_ug-xPs5$1=mBzDKf_<|(JRJsk0*yM2|6Ih7IP>s)Xz-!0Sntqa2)ET zaX%nzI_q{RnZ8_7ndu0;%c~xQktCK|gG8~_^O#u!EaJ1lUzw|b<&Mxvtuh`}vn(Wk zsIAJZpP0gwAQU2_h>KdaaBwW=XzZfKa|&3`Lvu(nH$C0WE&Xj!F1e1A1N<6S*_sic$(41 z$!aw$Ci~LPgRPF|rD?GUTgCNXvjC1h^?Xz@^;2Yf33L zx3-r4g_;&|imsW@-3Xdv(~ANwUmv){aRPw%B4u5Cy~Cr)x)7DMz7eS98lE{#Ng|pP z0@hf~HU5m4BGQhKvZ4Cigq@y)HS8xKs3P&0$F)8WsRS33I^`VZS|8OUs*#(=c3JyQ z?N3rqu8TG7l(f4p%|ru}#W8ny1R&b(PbWv*H*}x=hMA|W0SpWNM!V%w=#&(Ph58%) zCPSFS1->cf|1t58s@ws3RfJY4sNdw~hqJi*m0Il%JwZTSh&yw$qk$1qhVAZuf?nX+ z1|LbAt09_$K1-<3#JHh{*nUM$nrlNBC6vkLg)mCP|3}Yv!Vjh`{ig8sn8*G|hB3 z_uwFmeSWk%<0gZEjbP!P3Z^|aMS&>A)fgf;e$JPB8z?jE+taXDf;!ub0N>u7z1`Q? z7TfFmdpK?7{3Cd8=XRGJF?70GoaeYwF|UqSyd%A0FBs~tct`gYhW9+KQ$1iN^QNN9 z6LkUZN?PuRY3&r#S}nPdL)b7axZt?F@J30 zm|3`Q0u`NYg*nKx?@G^VGqy7FP9wT^#lvJ4d8mON#sP%iNKe4&E)Guj8*#f~TiTF! zryKX!(9XTyz2Q!0Urgma>3(ukU;ws*?}^(D|I)y}nQrts??49?qxj7Y_cp}wTj_~* z<9;jdCPyY#*zP+rZf4(qJ3Zc6@^5#aPlDrj(v96E|4#Q#shl#6C9+igqLh~;zJS5+ z`T#Pb_hCf;Zalh@yavAE?@h0<4KKJ=cJO=S=73df*ZXv@1k(z)$s&7SXF8afl-d)E z3g>ImgdJI2-Gw@yHap4ROOsqGetN`+zt??nqg=c{-E~RX!#P7$G9jG@6#smGX9iBb zfF7JaSrzr^8>SYCXe4$Dp5TB)DQ^>45Ud&= zYBa9*+{Qb05|HBVq8zL7IGPe2;t_`W`UrnSa@%74fq*YViJ@O81>gfQY4>tBGWYy) zw``FlH-A5#R9mwP0Jv?x7| z2fKi#CaDGV2V*Fb(H5NF0|ap)XE4OV+8|Yg4tF1&&vfGv_MpUE=NI5PlLfa}|KZFM z+`aLK-4)vrR}J6QPO%*X8xiUl{83De+|&iXwb{y|_3)-K{y2eFkN>Os zkDGOgxLA`=soryoHlql^E(n2fyRi5St@OuEN4O(Z!OMa!KNQmo92*J8J~T7FS$+q@ z&|pCyP788_%#h{7@q{5ua~QA8V8R)JGr{b&kIE+i;%s~CHgF{RuW6;^8W#Vh571oj zldY)<^YE?%nXQP2-8=@M!JG7n%r@?5j0T?)G>2tv86D=Ucd<-!@5p#w4#BMy%7JCHIA^%u{eC+LG zF`D#MpKU-pcgqo7b634rN2hV_IL)7u-2Ia@&JuydNjWX|v4PA`E-odX7XM*X|4EFU zvV8d+QrK&XpkR}bW`0vYnYL(lQ$HEQwTeXpr%$CPx|{l`W@#qXH;ArJw@bhYYSHQ+ z9n_z0o=VjDr|o@O=rbvI`I%w;r*R*PE9IBy2<|^iv!VE4VsiG+nn8Uk4rv18x1k(c zOjEk&MoRol8tMBP37|@Zd}eN}d5Qez&2(ARzO<}AZ=MR|CQ(OL#0{;|{1?rGv7yhD zr<1qdKdk>^=5Yw`zqL2_*m;Hee`>_HUD8dAzTWt*zic0Oj= zfYtYaF<*?SQ>oYJ`=(KvvOikw4Kn0;^FGTfvov`4V44tn{dYe0rR3}1z#qN?k@mY- z|9$$^l7jz!{^u{HpLJx{m*#){hxBWoq~U*<`BmZ(?A29hU2rhe(Iz`n88hhvj!`8-o2Kdv?t z>wd3XUP^MM2#*$q>axJ;4ICL_>?51HKQgt0?-l<>ojn3Up{If0z!==G)H3{miB#oU zRu6@&K5z`sWS3_LPF|Zq$xpRmGMKBT9oGKJT6oO$YJcF)-rkLA;tzJx#3=-2Nva1` zpC2yE({nhc(avX7hesYzhes~z@W@4J;#`y_&P8eBT&}}!#bq7d#N~SB{&|`>7nSF8 zQF%TWmFII&c|I4F=X1FOFC7<^=W|h-I2U|My1bBVaV|;|=kj9MCKsiNb2*bwr{(A} zrHMa7f0G`5iLRuF@70y`@Jn?iJ^X39k{!FcNc4_$??E%}9mq&fLPhF4s;|}GNQKRO z*v+DQdTAsvS)%yGlxDvqVP`4<*DGX6DdZzre|`w|looDH2ap8L&xt{gi268fOq5%$ z;3&v)F%kz6&0i|rzer+eY!b+VnTQ8dL8vdDemeK-mB{2?8vu(eXK8#& zNFQ}loqdM0w|f$DMvea{Wgr`XQkmw803_W*R^kfhLVH=irw*Q9PAzpXC4i(_{T_M_ zse=k$6Q)zwjvjh8ahW4t#op_!C*~wrfkXH8Dt#hwvu+3_kBpqwY-~u1FvDr4QGo4+s6jfs7U-C(@UU z5JSq*&*$+0be%WFD~t%J2T@a-1O)Hh>HGUb+OJ4BrYed+MeOg6BldzFl;aEGwkvik z#G}rN@2=CrAtAou{rYBiweUSeicVPkYzM%x50lID3a82rE_TMSK9$wZlJ85t5Q=d+ z{NMx=)TLV3byBaz{lU?lCDX>3t)GUZ5vFJ z)V5NtRQzDCEcmBdC}?u2Z?t7wbP6Ch>yv=15;CPl)4)fQh*b!O(wx*m^u~6&6^Z3L zbv!fjN3k|2oZaTt+VtY*avKxqpv!I%gex-Q8}AD&h%eQVV<)0`hvP#(1h9~DqvH)a zWDCger4SRIxzIR8b$ew~NRCI(enzz`UNZt>OHNk?u@sdcY@;O8==RaftK|H>{n|Ay z_=g*vKs?s)ZEX0aoy_YGzKu>WbFa2O4E0aao_j4v39pUc+^}NrPDvijb)j25ZVgA; zDe#_x^f^N*P_`0U&TrC$11d$efpX)Q>%rG;N?H5t&A*O8+a`}OFvhO zoy{J#mNGyNA^_Utq$`ZrKVHA&7QSGA{YBnrVYS|i6(fhnsMBYGitM<{lVn%xMFND?C;z}K_!960HDD$f zlITTWumn67pHf&!X)k_alyX={ooJNS&i2pZhp%OfG;tDSBu{Q#RTAW`075h`Xo1k& z?7awPAhydPM%xqB&^Q^?KbKFbIB_nq3D`U#byaPMcj1y7rJPh71Sl`nuSVh9Qu* z8g*(p=_wy#YN-{UCZC$E^2F9vXqE-z+Ow@vEETFUlCYLxEZH+y5!C8jqd2DB5Nwn} zo&C*_p1HcJ_Tsx3Qt5c3l)gGMWUAg@(~wV}8`3sysV1LuXWF!#AX?;R)9t>qX`YbU zWi9*CXo;xtMV?MrB%o0KGiCJY7WA{Fa?1_X&Xr+3t{?t9eg~9WbPumeLhZRkskE+( z*x`#cay;=u2s68|rtl3#Ct5GjA!^qI)g%GV6Jl3ug7FtxdmMoyl41=Uwx#fRSUfY^ z?W?7!d1B9rzw8!&SxWo`T}k|<6dQX1|8C{q?WkZD>{^P19ri5}Y*oV_>9x*v_{r02 zSL=76KnF{Hro+uxNt%&%V&iOR)3k9mE~PwMb_VUEeLy>IlLg^9upQnK8L+`yd_>QE zO$^1zGIC(Q5)1N#)m8O*fwR~Xk+9klazNTyLkG(eYjDQk$?A#jJXh8EgAUsorG5h& zhHd3*+CUQ!_EK*WqlP(lF zr1+dh)29XInI5$tLyxpq>>9FL>Da0C*PS?4l9A}0@1TAwA6rs&zy%~9$zH>Wf(3? zm#?7`(X_@>6c4uy6#uDgIr?!hbsy9YPQZ&!Rvub)-RI;e>@11dE%p{otzoa_b~6RB z6qaO`*|D4hIVFmtz7%;pIupPnz9b)--^j>Kap@Yxl{!q?TpIGfF2i42t2GjH>jx>$ z?NKEgnYob=5mo(60zI?Kw^2q|*t1z8wZwu|xkLbpwh08!?Kdik6+aiNcX)51g4g%~ zH{ne)Ls;G-d7tm(qPE6z9WN6$Zl~u7z*+t0?~>c3P8q;WAQGcrMZAq?vh8T9*Or%& z`ywdGMkH4SpsVpK)#b}+NfcztOF<7BOTMD5uOSIp*t768FN36>n$^gjN_d1eq!9dp zS|`-&5AJkd7Vp4GW^Qdh>_eV%*=_%y;pWp6wB*}aGEo2qb@Gc$X4v3;_agv`@2d|n z6(pSJ3$c=I3gGHxJpwV>2bpn{&=T^Z_A;pBI6lXvJ zf%$kBQFt^B_)yQ1JtzgOAHokMvws`3>>ePBa`AclXL3XJ*BAkf8V@JgwleCkmt%&l zw#miO<3WsdO4ZPn%B35*A)71{wT9hbl4~+((rPP6r-y9Pgy?LyiHg{jXo+2kqS%$F z%CaH_Z;rN>5 zN4e*luzrNO{C7Tc55&ye0Ovk8z|A%$b06D!n{Ht@J&AfnB^tZSJtj9JmD*GSn;WnN z&(08EiHAIQdZh-@&FYBs>GlZ*_T=f6`eS&Wpv>*2Y(@&T-I&xcPoZ9s-L%_MPDd$u zdgiuBo?ekjA}rZv13nxvnweW4@i3$4;C}^>kIdhL>VL`5XddG#=m880Q(L4UXOZx1 zg69iSqAG{&rp#?CUQmMpgdB+6k)K@lPs+Yp=rBOGU<`7CY|s$=`@|8EJG;tRQYY~q zaGVwR$4=b}e?<QJGxBcP4k^fow@n;g&m&$PmIAyO?fc(1rTrjK?4nGyF$c8m!3% zl+dC50kkC2Q5MldGooHUgI}Y*=-gpHsxT2MCDO0=t-LE$Zmy)xa z@j+VGqsxm^71gXiPhNVHJaC*-{$bPhvxuTpLiK2%i`P)?H5y2%+JVwRPnSZ&jLCsB z*wp}%>uWj$9QoNWI?FS!PqRsEi}K7zByYRmYSm}RipDzkzyPbIho;X6+Iol2=Hl`h z^qm=D0(2e|$%uQljz4XFQzIbEGf@Rj++1yI*sFTzjLYq6P@q;iXeP!OteC*WpVAP^ zC8C#Vm;hp7gW+rff;!E6e`MJ?n>^3jpwB(OMAZRSnW)Bc7-otrd8x#?SBlqOD6TDoC$(p<(XWHTrhn*7f1alpvqLqDDoE>}mt4Np-~tEjNv zPh6G1c2rx#_HKRLY_dWK`?v{B(LasVf+wqAXMclfyVYt$5eMnNl85MeAI)gi!LnBm z^}fIkaPu|UM}J~oj_Hq7QRV|`6ThVT8N0*N<|bqq!&!s6|rlHifu-W zY>U-A%#})E0LaI&Eqok@dT-8wA>R%7j)pCl)5c+3e^~)f#)@a#qU-MX<Q6L2ie;(i(_K)W66z#BVK9%Z@Z{0 zWBsYrfSluz*O)Q8i_{_KB3z!qJy`*b2|E6+?J{?C*u$3MM+P$T6m~)jr|7rgY4~@f zoOPc}<}XEdA-cT!}%;){KeEStgTMjaNU^ zI*tBk{!o3H-YMKq^$+H|YfLvf$LLuZ;Hii$Y9g}wotM&`w60S*guA8D9!+Z56rg&| zk3KfCwfuY71EC?oNlGnAKN6tTLI;IGx+t4i!Arl}bgoo5Vg3cv<^Vam%iSb%HIt=N z6@CGj%@+O>=;su<_d2<^np~=|Fh&R=VZst>o|%unE7#0GWRB7yqX1)tN%EsA14m5_ zhNc((ROkh|gaUls%&6qQ^Kh(gZO~7K5jxj-H*Z3T=b0XLgGrJ3_(2qGtU#PNmE;Le zB^x2ZnW;P9C5}W-=b@BeG;?>fpG$6xzbXv1!fBpn2VKYUdQgs2?WN zd@h*56Uzs(7h7ihg6};bic*oz{5mBf9??7Eg^fJlhiy<=H5W9Fk_~})Yw@OjQ?B93 zkuDDPu-U?aTfmo=JdzPo3Ey(F)XGVpg$*dlkywq5XB$O z98%#&U^@7PTD$>$nbpRjqA;WxDiwvaL#d%&d0ZF+SN;lQ5tSh;WbVNL3*- zdq3~Qz(*iu4rdV9+-L?-?6IOA8UnO%ITd@%4Cl04IhT~NJoZlSYj-J3RAO^3OORK#0EsA#!CIQ+#qIx`wiRZd-5iiCXR_xCA&EG?6*vl)DBcHr0^dD?J=!Sy&w1FquKm)03Y z9mZD~J&-$9br_3I;c_%=uY1AQ(CxhkFrwN*=sZ!~ORBW6=F4j(HjQZ_b5A`M3xIML zRP2%}D)f}2KHgQBHKn>O@igTVQ_Jl_K8tXX=_-IpbrVhCJp-$42ze)p2atc)1txZDBLhd2vW3sno&k7+~~YC zm8t%z&r%zE0c4O$H?Wmshx}dcp`90)QOzL|xxf(g&$_EiXf->-&m^$ms%dAKDmU60 z!tZBECJ~G%1v-(31%feaF}2Z-XKE~%g#JOF!_1hGYl#|j0YzLr$i z(eflyf;#UC&@hJ`s!{36aA*)vz=IvXq9i2n%axl{5Ymp{=oYgOi-M53Jx!$`!DK}A zF6I1W*k`8Aj=)Wfc6=NR0rS+dS4Q}$D5NFfK*pKn^DKKo z2B@61X)B^S1kZ-L0j2T~x3DGM#R%BB#QmaNWThtG6e6b)wDkuXQAgtDa+$T!5TNH+X#)CYlbxTpaXvmLR15R7ZF+U@~*Au?6P$(2-7_+D{59) z79MGFSQV!iX`qkeX=;k!{CNqBbyT@99#1nC{s?NXQlU!=cjoy9 zlI2ARAI*n#HaXIy2u1yireqVsWhXvas9Y(P!!Q*ZH_X}xQS`E+5+Y=Y&WKL6FLwL1 zb31TG!DP>l*S*%c7qu{18O&Qcs5ZcucPfj~SdLv$g0jNz-_j{P(KBwqbYpVx=_o5% zA%TNNy2hqcafwN?6x24(LCF$IYbQ)0mVvozf|g0Of;Q?=R+P%&hEb|XX-92{6LUzJ zpT2-7Ras#&@)DB$7gmG=>=GI@g)5R@OXdFMX_Nh;`{>Ra|5wC)ZTJ7>`r%%b z`;4p&zV&NOMJ1h6!beteQI6yd;~XJBFp&cW6}aROB3bpcfKs{7NGh26s?cGEdII^f zDIM@r!bg5eI9;CP(j3_-;asfTXXNERlzFP$hu#{8&U{3zH>!SK$i>QiMsm))n7;@Dp5j9B&zYR- zGplf}vu9jd!42)7HN)`Kh2VwCm#_cA8Tc@v*1dg|K2vcB@FX z;S4mPla)*n5ndvi&k_G1CjpV+mBC~v#28i@)bErl^r<7Uqv40NnGlMOS-Oe^-p{*k zI(dX2JF8D;A2Rh`@tOR>RL9^Q@vbW zZ<*m>J^eOrafGbzY)Y~Lrm5K4{GGE0$*b6^)J~+$W;HBR{_tEL;sGZ?o;h>x_@v0V zCr}+lJ`adz^;8N|)c=uvahF`*4@9V6eU-WN15E%Ddp1~45OP#=FB~`!+D@0G8^KgWs|CMs%k`|<6jdk(K2$ydPi~?B zmB;7g&)|Rz4m~g7GK`ZZ7`ylkr3O-U9ZcfwZvw^b zEs|+(Kr$}#P>jmJCj@4Q>o{*?us4(b1$#glZjNM=xhV4DK!&Q1YWABJV*n1;L|o@z zIwJLekd9C77pG>y!+02y35<^BxN3Nbk88!NW&YGbXLWxD!6HF$dywg0_cvqa`&t-U zbc;0$1$(-Hg1Qu-2AAz5esI|VGv~4!);_$9YNRFo1<;=eSySc{tbL}=4fRH>q5c{S z_=gzHSbrD+hG;~b;qz#?4VEcp<`7#@QPl#`Uyb2BrZ`-UivLWYt0V@HaiJNq9ZZ2X z;pB}>!ae^dBgSkGrw;f*{^s)?ozX=8(ek=opDerd_HuJzx90-ghy2d4^wBxxednDg+$?+GL z`L1g+QrT^TSSF>g^~LJ`L)SWs7)VK|Kyrl;7j#k^Q)`f1mgf(ScxRxvz0(+v-YM)# zE$tHm_x=6`f6I|`GrOPQF?|VLX!4GzzpUT;F%$rzRZZn(avK>HJD*FZ;N;Bc)}*Vr z8NtwYV+w+$l1r8L4;@zN#@aQRe-wl9N`HmoXe)=-8CpD`GqfmKKI)avx0Ck9m(TMW>F0Zm^mlrV^c`L!eGX_IwW-Lw zhtU;OoQ&>36B<7|P>45#zp_Q2%`5QKK2m@u1wpsyfAeV?7Crawnk&Y>;aA1mRX!WY zZ~m^NxeN`tc!uJm5}j_hT&!<|87aQ616l{FyW{jN;^62Y3QHl9L@-Kw*xp8XXP=4| zWwb1DeXjn(ho$7yi5T1u<9edaz$`z+fzB_Lx5;LdpVU#|yJ30g5NMrfnd0Wd!~;6F z@}p*t@}*O3gGIm&%i*ma9zw#AJUCQZ70rhisjkFZwdJ-cgG07mZI>DVc(K@8ugsOl zH8=rpHL#NB(zSz_xpJ&nTk$X|6ILBrqGshSOJ2N+zw1|thZ|#1M;mkH)sOvt4$H0U zp!9Akj19>cSdccx8I5tKGe#o(pLi?$sU>{(;(6LXW6*hq3fm=$?)XDpK(EP!FD2_H zdyGum2~2ZLLR-m+EO_jxG(8ENG7cam>HMT}$72u9aPT?O4!mG@Xi_h!5c|P68@EFV zbCh~)h^XS*kK*t8i{D_VAV?z78dN~;b2@>IITJTGkO=&3s&@itu&eq9-{rsvmemXy zc)+-4hC&Zf(l}I{ihPp)jCFScDihlDp(KH%I%P9C7}x}$z?>5X!bOL) zgRBdp4)_dsy!hU{T4XJxqau5o)Ls6(iye|rtY+Vrd8P6U(YBtAlEs#FQwS0$z+Kiv z%FPMIzZp<;@_CJNlGir3eW zmG|gqkLIlUxPK$tVNJ4?(Ot?+3MuGA9#}Ogei6L_o$5gLJ|w03&@t_6K|I*WGr~2! z(wuCCFspeSsM;s~?G=yqQ{A~I5b6zZaWSXHcO1z2k1su89HV7RW6q;nY*Q)h&l+yV ze+#zbi)8lPq!XH161&NN!{TQ+UzZR3bPyBn+WeqYCe98m>D-4S;+|uGkzBh~K^`Si zKke2}e9xCKPU*dTIk5Z5_~HKi9-ZZ5xj(DaRxu9ygX_PgD!u+%(u}lc@&4>85TT?I z$yH^8tyap)EbD#xo_T4WS5^#qkR@=!puKuOWy*Y-LpJ&3K^@^7=(fl-^*lIETv-`{ zBx1GflT8G#6jo`qt_7zRqZ7|Y5c9y#-KMazd9W0ugaAMj*kSSLNb3pai*hBB5+9rXpZL4NJmgc36 z=C@KzmEVLrWUFyYX+(=_(vb($0c&i&27ohT-&@c06^Ml_p101LB%zG+f+_G-uc_Yx zNQS-|xp3!cn}b4Txt#DwI4?8>xVBHm(~R@coV490`6MM5^s-m>ITShPMX+%J(=Iyr}VzD2D@ zB(zzhY1JM6Wo!WjLPm4qeqM$zHR#(@1%7fuF(wq;G^B(lSxjz50b^Sv77%?sW!VwR zfh4**2FFh<+`Ne*u^?pwnIb?+ zEpD3F#6+?jbxhj`>|35si+W~W5Y-Vcb*4`vW&y1o0O+Pdew{)yDSl;`3i+FCZO~14 zD1@_Ye?|>_^b8d?OS#OkSzhL!)&KPqdTX6({2k!#zY;*1u95a)AL^;Io1I$WwkVpA z_JM5S7}`1z6yBq9AWvabGy|!(yyzIn_fWO7cq>J!`+{p}7~@wAJ}e%_L((8yX{s#P z0NkY@B)GHo=qzAWFiM>OHWqM7>x7FyHz7p5JHQe#Di(GlD7dxrL_$F+$)phRsyRi` zAs8`4%GZ_Y0@pLE)&Hmm8x7RoO{LlT>mby`6@5L1cec6vA#`)q-e0@$K z-jYC#(b>elHP&uA6Btjk8+kjN9{~Wo`E0^~n5l$8z4drqK-keqPLPL~)9~JZfW|c_ zD$KxA8lwNe%;*x!RXIvN$YCe7NK@*O2*zg~(FXGuROU7BJpDN3durS+xr zy?BFHY(>+8nR(7F&U+Xvm5Zv<+Tobcyk20&XynpW^=726qEur=vLDPFIC~odNB(vS}oT8&7cdvG$2j{T2fobor?Yi8U^HlnTV3D3~Z(L z4hArLP@4Rprh7q*=bZ_bRMj)2Ta7Zs;=C-IQ({)$kYEWrh1<4pW2Yg(%#GfV0C{b} z+UP{k-Vq4OvI25&g{bEdmYShr!DDOi=Pt^X+B+18E}?vZZBN<_94HN4$~7iNBOfYA zOeO3V=R%-#WKwRq(YTN^Hwi}AE^)JCIvEsoM!aazd6EBw*n~VWhwBBBP>1y;$Ex#R zALkXUM5}|H#dk2HvNI!cyMU!Er^c(j?o>Q=j$M3LJ@xy81&3q2eh+p0?|v5{iu%f< zRe#s?g8KcxlGnfgVZOmAjxDQfkn_oBd)tR(a=%l`d)0Y=>f=F{x@-lA0W1zvE6<$4ny>hJHXS%Go0eO1j+Je_sv*-W7-`sD6A*YHT#~*?lO=c8M5ccVq1f%Gq z!*;#90-3-fY@cCtSg`b?#H>UHH=}aQOwzWcGevgbymE1WCXKxQ&A-vfhvdnEVKx{0E^fdf;mKk|EGeFo0G9dO!> zjacL7Lzt-C4(M3DZljfVjwWi#av9k0F?4+k#;bpR$n)db;9&*#DvpU3OJ@KbsH z;LmepDn%%%k~U4p+e8%gZ$GTbJddq?n$N}TvbD4nTsCw{@kBO-akaDV4!#qqiuBpn zyTc2`EIO|8Fij%kC;S%I`GrK&`i*<)pZN!}TA7M!y|6N))+9%1V_Yr7YcIC=|dV#DEv2oz%)3eQWyTeXkhOBCZH<>+5gi^N1!!NnUba=c!er` z>-sCXEX?=kNFU1an$>F)z~rOmRAOzssHsp&EAR#qS^ZPL7AuJ65uHRIgI`m3kRJ5b z4@Ldick4mz#WT{{VLa(B?*f6wZn*yPe*MgJQ=nbaIeDU#7dO!f@M#y~`$z2uA7tSU ze2d&|yAlVe74_NoA=+#z(GkMXB27iTAS4}rlmNNe+5P(aIOb+lM^6adED7Or=l$*j zB#}MgmEn=0({-{H)4<+8LK`+Neog!)x<{CDKDR7T!kb4F@VV$2G3T#AzdD4&vn&LF z9d(Z92G=($uYdMTPWv*pn7^)5e#p@@vw^-u_tK@zp+GtC=;&>F6~5Ja1vauj-A&d? z{?DAX0y!ybWl52&CTnH#I9V%DqOw*{3zW4&@`|!ncIsSsOI}gB3dt+a<3jR^(pBJA zN>?Fy<&NY(e=K8_+2r$U`Di|5bH!8kotwA3gp-=@++665@7x-To`at|VlDW&%j4C` zUfUI9&4KKVWSDqIodtZ;~s*)9^YBx#y_%nV1CidU*D+hze82;?YcRo`dlTt@AF z=;S0bPz{}!;0=|KQPET4KrRG$g;6ky{(t+o62Og{cMi)*hT9#UVQM#QR>V2gv$pA@ zY4j7)-}zhJyQx}iUX;3Ng6*WC@Laf54RNUiwHB}6!qz0 zWA%#vq*}`Gq*?>b#fH!F>a-m-OwYGO8&dW4@6?JwRSj(^)LHX_Xw6wGg%ghljjkI9 zq|MdB!$5Z#XyS3g393$c9Zra&=bj1%eyn~B5q}^gZtthJ%zQ^!HMDImylD!H` z&yyP$q>|!b&;t$*y=8??P=&6|FBO@Hf7^Z6F%Eyh+l};@dxEn2XuKaqbV)Qzyqyb4 zpXugsjp?3|+&z($>JvN2$ z4*QIT$r8QJd>rnQoB|AZ3lEvCqe|7}J4k53y2~XYEt2RpM6wVFuSr|%PLf=;ie|CI zk>R%DcphIDP@)~=;oi${hqAPJtjIkUIh7oMoTB1l{lX2s5P|LU(7OEr_gcgQ^6v}HakFwM^8Wb|syCGu9&Q6GeKU0VT6Kq*_E1uDlLYYLO%*=fdx!2$K%~sszU@-&F z_O9Vv?or6=9|1-syu)VIv@}fWlh98J>Ag6Bd^O(X(9tBE2?n%;8SWJ5d*!}pdRRQ? z!sH!jG)Pc+pW`;jxG#=lW;-0;uq-^yxhs#JgaZ|J{cdQ`Xp zW^Q+zKF2m@RFYzBrD52&H;UTin&H(qtI3%Dx{FS=StQZ(17*M7wFFpum%<#A*YG+l z{C2oVz#E5s53Z=QXIS^{ienVF?z7?-2Fa@DCjr{Xo@kBNSdG(Z*dXgIsn1}W0gR>l z&!tMCJncrqL2HsK1p#$bDJ1|WwdV@cdj3m)W9#}&6V#NbBEx{FE*Jd7W{bgppCC0d zxnN|kkQOV9TrdrU#68LFeo{elWw7>O(On9`t>CH$-bOIqNdx(+T-V+PcOjv)d+HCm zIUBZpN`Xa(DoIO1wfG(eiWo9`-?#f9OoV*eMa|R^HzmJZu0MQ@{8ym2*+6_x|A!{M#F8|Rx=xfCQRlQc1jF( z!p6Z6uE`d;kgubTF68TwTHaHaj-HwY((Qrhvp)4E6}K*NPp(jtUT|LhWzJKhGF`(c zgh8eg9mnmK;>0e#W87WbFqynz(`3EQQ3y&ko^rcL+ALQKXa^bT6_|)P2CFSV! z>%i+4xy~ZhpM(CvWR%37esP_kCV?V-vw(ub%6gW6_muDlqt`q+QkTdcM2|{nv_sTi zXOo{8<@r3Mms_hx@L|8Ctg~NSU;|IQHRvs{`uw;oh`hJH+5gh++!kY z{N4ADgDe~J^`O`9^_Lg2e%4JojUy>N`tZoX-#6Y@*5X$&1gE3+xZ3{=tv?#$@V{F}aY8oRn7ZxDSR2!&E6h zh~$an?|<9}lYx>eqdhE>RCD*Z4~F5v8-JFB8ed~lVY&|rox6LV3<#fUm=Cj@9sv(j zH$3QpWcVf9A6COtX8DOamrXW*A>SyQJG3c<6WZi5hU0TNhe8GCWpUUG!tj?_PC|AB za1M3DC=ibrr+C|2RTahB1u+l(exHY0S*(YGyE&_R5;X^K3RKnc%(~%9f0l1dpPl9Z z*%NW0#FAlh^rbLT=kA6?kpCxTP5yjbyFW&Ui`p=94HQ4pXhS-mDE zB$(XEyYl)98j(iM`(5EuSTta$?!fz_{!m z=c5`QkrORz5_HzLB!0I^0|X?<%R@d6C8y)*iYY3ONTRLBZjf*aRcK!>>)&229nQWD zwXV#*4l7bgGZ;5l_4Pt-ycz>rXiIp*QF~DQGzw@!Y~(uG;epp6hO}xl7D-a-R8Xn* z_0Ttz^JIF=^-{O()2-6D?bGdE|ARvFLYcxWt}h!IguhD>F;N<(H(|wi%TuX65%pjp zF)ws7g&MGqJ<*;v44D%kAqe{eqA>-;c`_h%V)}o3>_GS=;YTXWk@jGm2>rcZ7wXu+y{11{yBHtI zcCuko#UCxs?PR0e!v(}G&0J%=F?uT_Ozo^-ZP4EuhiLO}Z0lhn%tZKuyhW!;Xz>&( zUSh+fnWf!G#X@h`q*&H z6zMf`whO!1u%`|&q4+$+Ue@moHuBDn{W^!imzkk)Zj3Q7xb98!{yLITHd21iG#44) zOi4)`mm>Me(m`}d#KyH_2rY+GzLulXC!97w34Ll9T*tfGudlmXm7e+Q!){HeJS^TQ zhT2M7rjxJ_#>||cqk#}p4n_UVD13!Kimkl*ZbX+jM9viBF|SDIc{z{VkO`=rxs5*3|i2j9ep@8m-Y zo3PdR=keM-AFjjYdHhC9SFvRhA;eIv)JYxO_=~D0rOfOThZ6UPNy>XWw0_Q!RTa)Q z<8uo7@pW+@MUx3L;C6#X65vX!-*TE9a+~rA8%%IX+)&)h!nXjD1pQp0gG#-eGMOaEH{hi+kugm}Fv!2J-L6LJSHT~6a!yoC zNm(Bh*O4->-`@=R+**xJB9mAElar9*EXx}iY-j`nK$4xdQ2Ye>5+YqC0|qr|4hGjm zT|6)2pVwK7Eq%=xZnHsF_0Rq-$s4_7w1taa=Yyr+Xh+g>pjL><1KFD^|`5d)gak;_7b+cPkJHi zY-8LYuyr@TCcBlT(uEwnBZ`xtuZ(?Q&98+00QT@Er5MDU+$Iz#e&K)?)a2CbcXmOL zXbcLRYe&o6tNo=Ll<)^que)h6?U(chuw z9}ZJ+F*1XTzsqYDENo6#Xy7APmqd&f8F~H^oP$SLE#PYgVv7ZACq)rrFZc~6N=dDP z@tY)bR-nM3T6WC=%}hLg)hpgRWHk}MLPF{WW(MN*;4_kP{rZ(VZqx*BJaI&GZp7?3 z<@}Nt5fQC$$1}VKvXF|!d-~~wuGR(5?wU{->Kp`wglpea!Gk{1r#F*}1DA`)TM1pX zFUdvlK=Kw;GvmOu?}3-O4&;E}&2LMR85{#4@jxDmECV{d%)8^^Z;$NkUA$4Hxvz7? zsc3iFid5+|CQ`S%54Dk{CRs}iK^{=~9+!PCQun(^y~0K6K{Cnt?P_xSxLl_~Ib5Uk zX5(@_313`}QpLyRR?7Fd+)lb0m*-Kw$L0By?+q^FY|~1A-AMu)m%FI<<8t?u-PEC` zyL7pSlTNw3n69c^PH}oDmoqtMAaH#}J_SJ5(|@Y#ISBeNT`$3dOU2mnYQ!!gcdqK+ zi*+g5eT4~ueY_7;E&a68{ZnJzrCY37@d;A%oC=zn&C|d|xSf2-&J|=1Q@N@#K7OS2 zu)ukqSVm((3e_IvMDHXr4VP0gr9CLbAyK*hfe-V6_)Pr@a_U?=Pc_-wN_Z2D<(KJg zki?A*)NOg?Q?jNncQDFFNxpObx)`D+tKay;%(r-L<05SM%z}uCD6&{EvU5kvZOK)6 z1*yUZGM!67&Z|mYe0?s2CdH2tcu6AY@g_y$jVV8AQsF_Y&k(z`Nh#)R!C$=~WW!?Z zvSCuZO-wZe!{faMJwr{}(_0dIfB%QI6D+;SX=vX9-(rD_&fp48WlZV)A@K)sSf~heNsW(5b4rs(-sOja6ti z<%lM0JqmUb%DM;oQ6anvTdMK#V@i(YI4Z}pnJ_#E7BQS~(HVGmQ10VE;4+LNhm#bk_)*0Gt`I$%)UG z=if&i$xS@dPP9B<1|g(j-D^rZ_+vpCuxHS7oOd zLq#%CrW8}TJby72S#XPcstab9>^EFcPLGvakC!{X8&CpNfO8C-0GlsxZ0g%eQ}#F(+vaQ#R&mM9#h`f@7 zm*sG}($d^=LM?btMO?BjL>&s9F&DqDYpzQ2MFWt9nkZ@F;OL{vuUaqNv1CA`d(`$0*V;TlUPKFTn>Y;e9%f1cITPdg{z-eg$|4hpnFw$3N~+!6Xow*N zNj*};JP*?**I!o!r2xb)ERDgJjo0%+Zk5VthfXPDT>DkQ`ZCz$f;c3z5Kyb$O}I*# zl`Q6pR9-kRe=-xi0s4+_>~H@F^^qj4Md0A2bGkjHmsQ&|PN9@o`EfW-fX6i2l7JcF z33!1}FRB)9;<#0ThOnr*+ERW{4yRk}PHXHH{pAYi05+KzY@D!KzhUYOHd2uqMArLo zl`msSGXo9aRg|Cc<$L$B>#7Y1HV}eoN=IX7vY9oy5GF(^|y= z!op!8lX8z#m&C42xlB5OCp+cEcc%m=ECNTZOik?emo)b`9ZhZPN|Fpg0Yb)p%LqMF zw!*TxF`t^PfDaATA8~~)os0xlDkA|Gy^I9VLPi3%f{X-gh5cNx6|UgIMjqrs@4l};`Zaq-9F%~ z9`yTOpa2+R07qM|wL?medpOR?&xbt(FA&=y(FJi#+ZD&t?a3RoX}KkBto?e=_7aD$0odhWjk()Xu>_hx6j#{$@H)o zUiTTqq?-5GMduZb7b#oKkH?nBTiNwKEjuD4dEAjVq*8h z6J+G$giTM9Z^caqXrvNSmMFC5%n04YH{rVGX{?g$ZbipUqjKZ zigvkz_82sm7k{GJH1=)T_a_W)HG8P2kI0k)$e_00?%28-+{YZO_t^8g#W42Dkwsg_ zKpp&ugnq}63zON~NVW~gF?{MNWk#F0Dm|qP|G|covM()fj0hcUQ_Ap%X46b=QIRMY zxv#i<<$ir05#km_gt+X(Kf^^{EG}w7#pN7my73p`nn0OGjzb9h8Pob1T&KU}663(l zzG@76Y=CWbf8EZp!pCi0ktk@83X1uIA5f8kOc@TMVu|RntgTQsJg8lN^4+`%Z!=yU zNCU42E{);TTq{td`xFU2EVNp`1|!-r3cqp6P=LfJ+JR1e7+CYrbKDtbSpkrEuM^qf z-HIJHAq%^E#H!FVMU=ZL8N^18LdV8&geNtU%G_g=uo2x4)`r<9g-m*x7>*bSr}`P_ z7}p?rUGXoYltuTU$Voc^K+;aQ{k}fHGl<{Hx8TuH9vkDvq4TfheGs-W{eW)9g0$+a zucJqX5PrDzsT5pWA~&StoQi&ntgOvnqv|~+*F5PCpuG6z*6-u$!(yt10oiUzPLmEQm|MQi zoC3y#E8sc0e5zCt}@uEPzm3h=t4WmG)aOD>kq^yRg~!XSL5s49+P6lzw()Tcc)g`^0( z?B7ZSeFnKQ_rCg(7=jOuMbk3My>Et3&_37{R*pwO@{3#4Kl{l{R@AYIO0D8wpdrvM zMhiZEAj|4fooE$)U7#Cqd6HUp{f)L3HfGI3BvQi^aUsKV$m%&pFQk>*7z1nI7?|Gl zNkSl!m@ESgRI{cAfG&jn-XiliVO z4CCW-`No9iP7+P4AP%PBZAVYUr-owb+RET`8g?e@5MyK#iAry3n0X2tz)1S_79x0> zX+}^}b`0s!?AfT+h0Y1aa%eiijN z^0=EI$voAb(QEtf<^+@{k(-jX$$M7+LB6r2cPC+1ENRLX*kX(&iB->A6Ei!Gbps`K zMF7NT&~VMX%^ANXEw>RYJ(9{W$+XQ+K6yVa%rk*s)x&g!(#?{_wjkuewAe)WuO@`k zm;b)I>fg;ThKS}KTE;%MIoRIUXZMJe2-f`yLf;wc``@#V4^z`65%>g&kpvEqR&{u)qP&zk{_A&~7oT?3oj;2FPs^ z85?3AhuxkBv9DUVtx|+#SlV}z$O%z(TsQz*{^f3`!)m?`ciBq!!g2M@?+V8canT=lFaw)Sdb1m}cqr)e{qy7uB|Rs3 zAGx^*p5j0tdLaSq*4&fen$Y-0PYYk7jBn?npfDG_k-NEAPX=7tS0UC26>O5S@IN7O zOHnY3f=M7+lu}WUeI|O|aSsH2=F9yP3heQ5{382{Pdi?8@?@1C%69mJeELrNRG<0K zr(Zrgl-)6zd@A2q2+$EvkY_dxj(!fT+@Zz<;b?!I-zdTkbP6v4X34Eu$ARo?l=6~1 zYQg1;caEoxRKuLg5g$^Nc;ZPHJ|vE1f(xJNk8jHt=Ot0cXcmiPq0+3;54p%_<|3n+ zi&8(hD7le~(kQtojgpIuW-hbcC!%xnIq6knS?(r;+>=`Yx1$!^pRRZ^|ce#lg z)0rvB;zy6}8>}L*uZhg}kzj=%k_9@E=<>K#N`Rw-6h1h(_S%AcExa>aGvRe%L9*WH z`~)f8g0Gb8b^hl^^Wx)Hg+iLZxN>+aS%j$y+C!~QKQ(W3i_|9Dq`4*5F)`0A`VyWs zd5r&_Lksd7Ow`S!gs^5e$MWLAF%u4Z43X5CusU1Jo*{H~@odzwYS=(EMcTnJnU%%c z^Au}uG*{+MJFwt>7GzM-J~lVa6?9xk+Mv`06YY~o0|`r`6qGjtXsAigiE9|ur(N*C z`_Sk+V(#(O3@2a<>@oM9q+SkIb``O9pEm203C($AHZ5^CAw3Jq z*FS8WD+2NP4f$i-HOrWd<=B;TO@okXzh&&aS zlU)wBD?ooj_gzhsI>RuY5FX8f>2@A5f-#3FQ;o(Gz;>}*Q36avdQ;VDIbnYA8#a0S zb7-}LnxHoh>F=kv9Yp%@tKNI;micBc3~&7@>iZ4$5z$SBum<~a1ACH4szuwvYK6B@ zEdazZTOj28xQg5LsmCX_#Q*5)4~4k-la`^u-*FQj^BHMw<>IE(vPg0L3pTB2m6;Z7 z(;79SX+}3_-RYZf>d5+Y{oqMpjZ_l0UwAxpJlOW=#-!5r7o&x0s>wC^z19$3p`V&C4x1LFm?vG0r~ zT6i>aK#T@tPH({Phl1h$q<``wGb|DJi4Vq0idpg}eSDLsamSz3)j)Bzm?5DHM&}b* zjZKJAVTTQ>=yFBS_v)#|evgK^<#E71EVGx?D_EvmS;7&8bU9h!bBdf_mEkY0KO3J> z+oWvmHM$^aTh5|Ob!baozpQsHUVVPVsIz-eF!TE1hqG(x_>kA-HQ5E+&lVo%uok}9 zLCK~cAq6AyOem<&)SyAVQvBZ-UP53yfy|LV)7y67f>c>E2Fc=PvkR%eYP%$S@#ia zAB)Izz(KM#%v>eos_x+sW??-w>;V1)LP9g1f{6R#bwRqmS}CzmmLQA%+LYqtR*F;i zCN7o10x8vV8zc8nulRt92Aa)@Ap&m@1mM)Om9udm+ksVW=^Ii_t}vjBui74G#ix`k z8k#id*R5LO)o4jq7awU@_E(uzKfhD|=KRgvKG!{NbP-Kch7x`T9qnkLLmlnNmr9Q3 z%e@{!+>f~A%PX);xE#c6;&L^v1TN=bD229j31?KPCyA2L0mpvv0XTYqITa0dRu_pR8dB9m_|wRQGSZyhi0D1Jaj zm?rjVh5gxe85$k&Z+Y|P3wjKBofVG`RFINy$Rn`O9IissuU#KR=sAWkM{tSCM-*#V zgX1h2k;4W>u}AS-3cH#v@{E)^`!#tehz;nz_(c@ygm4xiOX(;Y#>Yfhxh0kt@5qxC zmJ~SnqRsTNyt&yet-N^ILb9~{W|yZ9tab1qj`Ey`lKSa#6d6@bgj9qw?!v(hW)MIx z@!bnc&DL(WFtSd9)L}9>;Y4dA|3GZt#*|~?hAE9p5~~9)xLze8S)&_hoB}rlA_`W* z3>t_4b~Wrv?_un1T?~NN2*!G`eZnrncObjSnfOBL3aD||zJYIFH!?Yc%5o~eP-13o z?hO!4P1_Ayb=oS4CfoIadE>;*x0(D1**`Ow8-4?AWte@oJIw;&srjZnRS6tveb-mm zqnySR1cC74eS<#cL^(dTKf~Y3W+*5L6M)>>a2kMf*B%-Dq~e168EqckGpJT9vmYQn zkT)=MGn9szBmn=1K8p`ywAmFWeDi-^Z|#kxA`r7aJUHc9_H3)iIK`yL3^b9;ahMF! z4FioIQc#eGwVl^D6LAw$?Gnd6kuWqjJa2DaoqgC1OM2jAuG=cYxZLF7@hP~a-Yoru zD~_l@0XHl;i|=zd`79uB>xe||4MPD`l}un=9HVMt71%m98h1*g?`TGMTN8s7H*+TV zMEdu}an<>Of(P0!RjV&(vB9UC8YYwF>ne+OZf!*ah7sBf*r1!!UL1RXDE?34M`3(o zu?>BWU{jyNPXI~coFEqFm$+<~IS22UPHKTJ{W5_*nBl&Lpgc=_vEE~(*w+NZE~Vbj zUl|iLb$cP~$&Bs)gt$Yr5wx2-av->Xd)4>iRYyUYl>jW@qv&MGqyD;TiP(=RDC^CZ zvqxWtbJ(2fFD+LdeTmlwfXZ$v5(}`Lj6mfu7ne2{VuFJ;j)$W~NtIaVDH*i(9-D$Epri^J}i(yI!)|jYN6a6R9wCy>B z^ymhvMZAH3Nx`g_ZsgdxIS>K_Z;H6&Y&xv5X4h;k!Tv=?60@Ypk`HKcAZdZV?y#}S z%wSR2;8?;-JB$I3giQrLe+gq!Oh$8p*{DOYmli4K}sMAqe$? zXE*5HyvR>R7)Y!}-^65uiY{o=q6=8p*`3gh?3V|i0n%EJH{(UKMYz&G3a8s+6lMrO zG6-5|GV2zi_aZ7t@eg|LBA1jwtA4jcWpb}DsZU!3pdPA!Bd8-yyWM$Zy`#>#F8h=c z9V}}Olv36lSqwUr8jrmKEJM%wCYeD27CbCU_ohTlMvtXE9OOdo(A7y5zAh3S4nU%k z-dTTLPz8rTa=ydKBOju*Il@?*W(uQDe(s;Kw@CP+lDPuZNytP4bf}}cb}Ur71GqBw zu+$Ic{b-V<$%qWqmmQsZzIOdaMv`3M?e_c=TZ7LaoK^qXm-1=e1EA#p$|wTB^{e0A zzrjDhnIBP!Cm+cFMY+`mjPD%Yr!hC?O#Pb!hA9b!Kh!#H|9~y+O<#E zeyjCo0Kx4pb*K?nvKZE^Dgkhk91UJa_*aW4K4x?mzJsUIOY0`(!SDt%FRmz?f>8nx7L3*OA(wM2UQllyubT>?)%@W|j8%t#!pbus;$qC)yio}hh zNA9KVtT;=&q|@?+8Sw+aQ+8+iJw+#9u?aLfi8T^oQ=S#10jXPMPmoyC;k~6EXMfc9 z1G^yO)2ko-CFaRNf_y%xDDpl)nAIO5to+NO1$v6mhpag4wcM!{+gk=LbtD;;?jsB5 z93$i~X}K(U|7>5n$$uPdtUcJ>x*l3Lkz%y`HQOs!87F+XL*|A61%=E9d}nEFnWAPFN&z$$Z3aA+)a;@Y|UVNfJ8}wd@Yb{Dy^m%ly`^ z>o+4nGXkL&kl^w0#7b3^nZ%vSOyZ(84qVj6fr}F0xhQ9yi`qDFQ5y#?YU9A=9MH`A zRpY-5zg6_oy?&}xabq9g%}7k-@_e7T_krw6RBd^9SdpAbqrgY=8r{hsY$@ou%=T&9 zRRC_|uxpD-@qMu2^H)Xx;IF>eV;1EtJ;*Shq+w4F!rD{T zD^VWh=MpNH5{oZFN-SOl7qwQi*teR+L@`SGXBCtGS;97}uQ*=yQx%{%rFm=kP!5zy zg}Y4ZbEYD{Vy5zsfQEmW&sF{z4HT1K-$Z1y#$ zsGO?zLMhDX#Ezid%n7ed8u>RT>}hg~a)?QJ5$CRt%S1~8!}I(<*xRUxcTmbU1%56C z3!-vGoJ+T1@;RwSqeg*XX?K;wn>TS>@ynfvdpa3Qu_HkKocZh`(2ZY`Mig%S^N#X_d%)HwK`bbX zW<2G^Z-KCN8=;p55G(|Awxf`qbTP?S6fGZre4(!GpJri0=pv!c#ex>|n=#9f8=$HR zLSYw$kOkKS*&ZUDp-4C}&gp;~)TEoF8iJ5H<~uZL4-wHY$%A{OI5v!OiV!ANGj6l9T2b->S9gwsw*8zb7bF3Ipyaz5- zqz?Y%LBOUJWCjUy&BNG6sHEDGx?EJ_!^Lxzc~LY;2nz$P3!h@@$m9Xl$K%Q+K?seefR~nI{u2r z=*J`4d4-L1c&z6g86*wNhvJI&C{hL>ty%}A_Z4>?q~w8_%$8=tmt}*)fA|YO{;nT> z;L~sXj&BW!l;f8;B+_fr_^C*lm0|eye0+u5EIVp;wg3bjz|@~Ul9e8`pgblIUKfJZ z$H9)Q)kFawL-ux&igj%!Wu!3zhn_?CRi@pvdW4mPP{plQ@-(x&s#hkFu`j$G?;Z9= zrw8*m-bu+Z!SDp)SU7IAS1MZIfqf+CV2|y`(ZS{5)ZE4AfcR~-0x38`e70oW3e2j7 zd7}b`v4;D=0(oD`Z(%bnp2;hfUJiDdnBAAT=Qs!iAO<| z9W#)yhI}FgqZhx$g3*iR(zmf+;)YF#GK7guR*Y8+z|>m8<1QN%PaP;u-7qfPArV(; zBA*MN_E^LM2o3mqgK2Q@~^sg?ej`;3S3)ZsRqW#okV!?a6WBuc+ccM4+t- znm7-k0me9J zJ5#TAXXJi)PizROsAhv1;H%Ma8{o(YG)}L4&KFu|A%|1O`a_JQ7{r^(DaHg6F^U*Ib2O$ z<&1`a%AB&&kDk1k3lhNQz%QHeoO8hR;4$diN*C)V2RyvPlvn*IYi4e;^4CUYmTZXI zL34Tupi3wzu^-%!1Jrh~MdXxV0C7QKNlS^=KV@F7!M121ExkF|4f#8IwPUMn{a*bi znH0wXjpziI*W?IOX0W|ltWT4<%Xa8hW$&Sv_`Vz-pE~_I9X-080$BLobPZOGE+Vq+ zJv7~_fJyHmI$*Mk&p%bJeJgI_7-MadA=b*R-)hAcJ|+AJdOI3k>`T%ThDvhir+h@R zGdjyyA-E^I%?=#c*E^fv=KZ7eU2}w7oq^aK#;ekf1Vp6G4d%=kPA75|&$zuoifD~e ze3EJdXGE#vCfz7Jq=O8CRS|yvO@)^t>##dLpwopjCSCnX%fnj`#HkUsmXNxD4Ia6P z?V^Q$e%vTn?GTI)Ts3VaMUiWX(KAuX2!MAW|W587+@Zv(ODOGk$cil35-Dy z&EgV*u0m;bc4IS35s zyP1ZPJoRu*or3zc!QRd@?yHR|Y9GN1ToH*i$Q5fvehF-zbg1q-$_9l5Y6av3Lj zYdZCO#o~|2ZtuY$w}>K)Ep91Si=U(Du}3m=>@wc}pzVGDLkq4}y zNzZ9y*L^mT%}64i0_+Y!SY*e;3oO-NPwIXkj^{8!DB2$HD;GJ8EhFV-IH!qACIk+O z_L7kBwxvVbHAN|!*X07wvED;CPGFs@GUQhaxhHb>3np#I$3 zA;9AQ%ImgHEN+Q(#NtcCI#Lmvt}+Yw88P&pT&&AHl5(jj>|$}~5mCI^2h{Nz^${r)M=?R{zQ zRBxT&$_L3J-9kC}^_l(OtFGglYH&RMJhRT9@PM1Njn?c*oWy!c#2uggrn6g2q^1Gv zi6H^(_(B5U*Q(LsGyZ=s{uZJ*>Dkj7eP|tF(pMU;939SRwVDPfiZhE_Ch4yi+F$e& zdS;)I@2~IGhblj-o}{lOOXt=4`~EVg(T{z|&YrD6h5IYr&DU?Xuj@DHa`yfb1F(M3 zzd9RV^_cGKXdhR9R)DELJ3hv(Wq$VT*(vU)`U~S@GDJs*5B%#>a*DxFXiV!19KZZ_ zkwaSSz2EebxA5Ma*PKoBKYhP+x8|15e$%P9XzKSf$==zj-@xI!2B$nEIUw*eNF$Eb zC56AA*&oN9MRxz!H-7-^c7(HfHJrHr+OwT+%j~tRB)#S>x+zO@%l^eKy-M zW(kwY7yn7^Igwt9(wxCOxdgS#f_zP$8fPZ6rP;F~!P<3ww$hF@sQadqVFEHn*cB|d zc#J=MoTkDv(*xJ$w0ik!?7$1N{(5Qotumkr@sa(J*!u7K8xKj{w5u=PqnX$Mc7wEV zB=+Nbvy*oRo${HK?7{MT>k{%cLfa~H`Qb|E^+|k7sZq3OPB|1EdnOe(l*h!dUEq2o zy9ck0ZD@G1ZUjS#Ob<-LFu7Bgh;@)|u`|~crGo3SRkdWClGo=k4ip#VKygtH6qkeOSX^|h2bb%x9=WV@2mzPtIm2e@GICD$=&#$= zGhb)eoTtn4IjVx+zH?gYuRA%WfXiJRWy9rej)maz!s&&&<(}zOf1R4{*5w>Ll5uDP z>_kV@tRSgOb6Kv(%$&`8){!YzSxaME6^7q6MRPh*u7;;5$5Zqxy(u~RiMq&cQtLl% z0;yCxk|}fY02FQCH@}z#zZI1mdA-$S>1u-s$QBuP#lr(e4!T8&)yOd})?uaNYAHj!8m;RIWnJ;mm{f-h7Wy67HC{pGFs9*k5%AIOFjXpTJQxio@eHq&|ZVAFw z=k4p=p|&+OQ{z95Cjrz|9E-rm@Kf~G%kxoOoay-(=hctlpP-+gl9uV2VqF-lebqv_ zOisJTk!74bVnAwpxs9Jl8>_bH-3zx(i)P0P7QYM^4I^dM`VPb4peDMxr#*>C0owE2 zo)iqfFjYO9j!I+yQGV;wym6VPS4-6?oD0kjcPQ3G&3|2>5VRO;N=IF7??UUlIqLuIs%n5uN^7!nc2vv9rEusY)Xt^QKiiMjz3-iX?;IgTz9Q*`f__Dh{T<-U76DY>+;dD} z2#B6XIjBSb-Mnjhkxl&~MTa=OLU)zRBr4euY+w#O>J`&n_MGvW`*P)yTxc@MxXM?=2E`w%=BvW`mIXucV4S;gwt;a` zg4$qQHoY*I3%4bIjhJaa5pMWw45t%4iAfs~?Bvu7&Sp3xb+-2+&WWrxIcN+zqp=W6 z)K+>+rPU}C)nO|Zs9j3_8bicn7voozhj9ng7_$VDEBsyUDR&c@DlO><2*&XHn&G2K zQT_B90+Nlol-xKt5SCn#U@WGTp4|btiCCH;ypB{UQI*s}cS-olf=l4kfgkxtCXL%q1mfOVG zX2!$-EA4}*fT^3WCjr-8J30l3AAI%U*fH?x3==xE)3AGNoF)Rg-w^tm%`(jj6`mU2Cb3`IPi4X9O-M28)wQ}ce{ImTQIvov}9n#?VLuL8W z!&jf0vU4rsjuH00Q_<>)=->`E*NQ@yQn~Fc7iDwyh$_{?(FRMXmO6j0#-U48&)HxL z3aT%qYTVhu?6AH@pcxiej@uk60X`@VuV2hoUMwng>Zd^mL&t>hV+oCieg;6=Y@t)5 zV6aO!5*tguDfe`baQWy@QhSeYoo zg^n;Ow;rK`BiS587mT}^f^d_XkZJgmLnw~w52rYHhOO4#SZRR4_=!BZv%LKRQ*j@a zX+kwe4Z3z3HME3wI+_r#^>_4d0O&ITNwyU6Qu4JUpgXffVx$WJxYPY@d5vN#sPb6%eu#E3uBSo|Ye^!(e(C#u@T4=_&z{5FYo3uqv?# z378N_nj{_uWF_Db?8Z%i3{1eXoj1^(Nz;%(;s`n+A%TgTk1w5&V9)Qr*52pdTUEB? z2lGuH+PCgKXFt|n@4eRAt^_sL6dB42F|;ve?J*7cq(Fi_OvE>4m^2Ft5Q!aeJ9wsS zu7Ivdl#Rc8O6&&Y$l{FH9v(6&XaZ1RRt)SZuX;XYyW;2z;O??4KQEMm#|@SOJqJEa zytL`xN;S=4oGB3KS1Io(g$kj+jUa$DPU{js+bI@EmUVcT$?idFm?c{obClU$>d$iy zWEgU(ztco@CUR+S6_12}u`2Kl=f~=Ota->Vr^jwjn(}ls1aT6r$B}fjDNjeEhPm`N zVnXDqN_Q!}nubf1 zUPHqrN=In8MCr9OgR8kcX-bzUorsHDP~}(P)cfKx9*dD=x+UQ<7hq&YH#8f!s^X09 z1{ro`e!PApIl6K0GSmUePyj}(YK(3|GD1>wEtkp#LB+n&AwCsq5>=JD>QfhQTPSrJ5RC_)Mx+#jTPWMA@>^aUT6Fc38Z=LwCVwvdYO4d!jQAVD^}R1k~?O^mtbInnR{(5DQX9r zv12KtziL7UhKZL9Mco_22qL^}lI`MAs>wE!48O%&O+MR=26=P7LNzPSSDwC;FdVJ~ zC!siY#36SQeq|ZzSe6Y6hhU1}(D|??x@v*X8lH{`EzO~xy4j@kR$X{uD~~xuS;5UP zf!8&Z!Z(Tmd1gzGi*;7;)@4$MM=}-&JQBgsXt6XR7#a}_P2s7-7oH1KE44seEr*JX zWdo5iJG9t}a)we=_`-E%kAeeRdo4I|acCmH=y*|h>ar4Gm9r z?touWK>s9HT1n8(6`5TZgPnLqMr0|W2B;M(E35vQ6Y@dXIYVa@>`kIRty#jjehp73 zIK4^g59ZuizySuFI1T;Vrx}m^dmTuAe>M|7YOat^>Z;j}j7L>1OSU>S%!UZij4+~ByAi!dM!DGJ% zsat##V8@>WJf3!Nd|YlUBXD$o^&82gwevl zU&Sfb*SMo1-%$VkoA|*2VZtIU9u=hoEN)bm5kV0FmK48AFr5QL{1uGjEo>qFH3ECO zi35va^WJ|!tx&W}#?98`?QH6(Fw+{0pq09u6rY!t6@W2B3TF}}m;WxJJvh@lGHI7l zrHhK(3A0QL&W(at{DO3@27(bIT^=(8^W$ts8qDs<2KeFxy)V*GgRoTw)%6iY8g+er0H&UpgVHD#Ybsnew>7y1 z4dSKz`}HTFdy!0hN`%sIynI#9*tn#=xiWBnbSy659T__eoi$20d*&8HR(vBJpsu(m zKx9BMB1pEtY`}Lk=Z-c*mp0Lug|_gZoGk9nBj>VVdAa_U&lJCoNIB~M3>&OgO?7z8 z*^KCGr8M&`L!}E=!~BzI>)=ImTZbdnCiy6$hFwU09aBeH!FVzT`ILzU6$F5a2ezXe z;luOXQVuiZnc+xxv7Qfx{APP;`sPU8oT0VYn2DUGIJ=~=95@}Ik$q$O@%iv2>KiMY}aIG11}c ztiIe!?o*TjkLWaoeaxfYN0Wt3f^kxUC&C|JN~;9+jrK|)Sea}LKXc=WJ$ppY;*vH* zMXLtO%^!_5uZsQaDs)~Akg`b~U6EG9B*3F5((4)8xrnDHDfW|Ji}z-vu?2y^fqu(X z9)A>A=yf_?qY@e>N@9*tTD-Rj1n}^}811K{64ZYY-Ps(t)qULW7?I6ozp;4Lh$Ef) z)}WmZL?t`Skq#L&WYdDq@GFOiQ_g(#I3=rO%0o+R-VVlU(A1qcn!TauGt$S+c}NJI z>*HYR8U&iEnM7F=3;28`p6km6k*06K%Xv z)&uQ7lRWSi##UUc6+hpT^je@y@Aqf&H78pqShH1O>CPrj4GJIJu%~<@DP#n4J@Etq z8SVO?{`3zPS~{TBch?@Rzxl|l46k5|?|6#+PM7Or57Tvb{mERnEL$Pkxz4!1y3ea(0+qUU$#%TSDn-xT%O?S_$rGPmZFBqh+unNb&#(B~MRRMu)!gz?u-Kb6xA4rOxi#PF&7bg9wb`Z5YZmGF zEVMc6Mqj8;*rHj4HyuKVYKPE2J@WZCwXR1YV(*jd?)>P- zerVhO{P}Co1XX6|cgEnzosXQZF6LWDo-^!wd2z&)mz}9*?y1&aH?#FRX8*Sj{=fio zEiZ2Lp<4RT#qUKQ!q>B~a692`V&R6clt|)`Gz|9`SUJ)w@m`7j76%=yqmQx~=-OAS zC_Y3zU@o@k5ihde zw#^($5iGsuRmOQSk7yW5V`mzOpy9B`N%AUQ$+*vV(1N)=fR|i(dD?{f7rPXks`L4J z=7(Tw`jQBns;FOcq|7n5>UaN!gmOhkklQKr>Gy<)rOI=mOZ=_VYfo z&zXHSjY!W0q;t8zLr@$p8*m}a`L!=UQ>`1vi*@685g&X=bFZEPhoqVkqOGm6%~16C zy3>PZwGL{HO*GdZ=9RdRp;~hG+B3ftK9*-;I8QMMswgq&@4sh|1fB6DMe9I{oRyUw z0TmVeGax1uy7I?pRvu?MoJ;{r?U(Y%FZwZUpTY;iTY96u_{Vw`5nqQn5r%sa^4U!9 z+_gVwWrwEp1KZ92Tjf%?D#kGxOiNf#3|7lACXx{!>=Fh$tu8d~+LAw%MO&vmX)ulo z0XRgj@f*ZG zCd#o@$nHvFngBp-vj*@xcfJJ71gtW1^e>@?A<>Ebkg#CHU==0elwS^;b=C^W=DWk! zNfPLotZDL4DwPPBgh7ITut0_ptF0Fv$}LAjdOoRb&U_<_DSP|LyUc_aS-HZvT&F%w zlwfPG4uF(6c&1&pNZ~|la-(u>x|S7qz6Y~p!vj6^DY~#ZAx0619}ojjUbyKM`j~K zx`ZHWNVmgFOb7)y5-G?H97+c!4P}oqbMb$l^b(#02Na@kE{?I>v{P7>ZX*z8l z()5%b^WYOy5QP~=enyg3l`9F0S=E32htE?rV|0%vq&P549*5yM{TXNU;OTq3yM@;E z8_WD%%{cz;-7Rj&CJ4^-ua$S&mzZL|{LtM`KfV2(?|kQ{`N;GB+;y*b`R7*uw}*M|(fp5o@zwi2qUXN%t<~FR4}MY~-}>G9 z&lmW3nz!=nZrk;5zvHVf`SQ!ol4tJ- zh$=dUe@JlI@VbNO?CF+t`y`lA-#||Pn(PTZV*g3*j4J)tpGf|PjVmRlPeP(kJn_}X zbIgA-4%E-WKje^sLZZ>_!8ASaM^ESh`}lVM$QGR*BIFqANyymS%lr;eyo=whMzuQr zS+}Vp=6?Ob(@j@jZ>-4hl2oXs%Q8_vIl@#(dPb_*860fkzt>%LWNyoKzkTMxGuPey z&yT)h>!bHS2%i4X-N%3PA0Bw0J|10n`Qslx`T>3X;8)%O!hej9QjKE|WqRGJzo`D} zOYeUR)A-8tZL`<^_^)5f)8F;7Pn`b2>HnaQKU^OE(4Xvmzdk;3XYvcP2OrkQX(NXJ z!pDJ*Pa<$NOJqlS`piAhf}|yzcJ3W6YQrxA|2yrQd*D|0R3`U2FmnpOi+*0$%3BJ1n1qo|=d|m?OT-US!^RDlWbSEBmebN~n8MB&*yU396=C97{uR!U=&rU|_Xh=$L^L+8=Fk*$o`~%%wk#DOy zH;;JwA${{C>M}&ReJK(E6HdPi_hl(^8*#DQN8sHl?x-6Nr4wxQJC>c_D<^*MT`>eA zdgal+kihg7PY@6<%_}Kl)W#ioZ&>VOe$*NN^vGNyQ1Osi*?tLLcT^8uD1vEmb+#$8 zfLUV!zkU(Lxt4e`M-bq=&Uf>=TLC(8F0>oP)uPH@5LOJ&F)4?GQxT#0Q(@b`x??4b^Pdnmg_1AvgXYx1AOqw&Pk(qd`T2|lv9)J3a&C{GZh}edG zYp0Z|&}Q4LEc&imTQG6-c>Uqz=-z?q*k_!Nj*@)GQ_$-F^!8ryQ)vu&i&0GV+Q9?@ zDM;+Dl0_y#St^uF&`@+E!pp1C3tmMKo`)p3jFwVw|j zj6-c3V{}>Z12LzJV;4Ome2i~)RobDfK!&9L+g%?_1?1bbaNgk~NUs>_T*ormF zYqmo|X9UV<2=bF8x-Y9D`ZxCEc}D2I#od(j^!FFdO4AX8iLZEGkzRS6vK%q1$Z)_O z5f1Q*7nKz@D2Oc{`9?uN{L2kZkA7L5O`;vMhnPel1WyJ6seQbV2xQ|KWrgvor2ezN zU}G4#&R?2fdDega1#J``AaA*oq2*0b)YqJY2v3K*?`bg_1wb@cpob}V36`w>Md*bx z?~^P$6kiF;HqcJ&(;?g_)Y)?{!y>E-c`I6&HqFq=N!=4qvf|T%XQ;0dXe!@L*O(S{ zdcEgHj&?6pmc9CSZ#Hjc15eLE0iLRn(ux;^8wnV-*n9F0iLlHN_=jQ@sN6y1dSAS8bwLaj21e)AVsaIn@TGFW7G_uAmTgU?Lf^ecahMJ zxoT=F7I>SoV=SeO=f<2oXcbJZ2o2nOv9Wg(c%ywfaWn5iP2lbV50AUDI ze1o?*=a4)PU+|Zl$0ZM@Jjf^1t^-s!vIn~6-qm+<1Dnc4NU{37YCq55+m#iHoi0rP zzuMek6)_Yy1_kUly=uA|PoYcB)mMeO$nbE!!7+&x-y{Ez&nG_-AX9&(Yj6|tty%!@V@taUGLXhDA?z> z_`;CP6skY-xvcnWSfF z0kQa<+oo>4Ufb(H^CX4(i#}S=^;|DwDwd_ddLQ^Q2x1Sh;Epethnyp@+mvD&i9ttS z;n2?ZtDJCL!Fpiz1K>p|)ES@~EB1|FH7@R16nLCla_n;bpONQ;_GgvnECZH@OcCe9fLEjVDjL;Vp;4_B z8r52%QLPmkS^PBATCp%IL^N1NbdMK^A;$>NTH+pkLn@T`5`BrdnJ7#FdPmWy8MQdw z8B9j3hu2RIC6a~kOnUwwi=#vPi~<^a=giggDAJIHo1DPP-sK!ZV8RF$=~EV5yp@uv z0@I}D|DmWa!&@I)CSPfLvy`gmfT9tEXape|L5M~Wq7j5>1R)w#qoGkX8k)_R#5Af# zL$i%D51I>bn@pREQ>UEQPMJEif=FzrgOfb~yQfcy3{G1j4wj^~gQV;T&-e9wkdqW| z2qAty5SfGraFKZH&JASFDk6Orc{fmhCWB_cHgbK4plrnv?AV#za5ZDP@pp`EG}buh z;KloLCONeEdQEA?zQi$w{i4b{9auw{Ok?;N;Z27Gr9N6uAbcD?;ip)Nbh7w&DT4)? z2djFEu&U=+1vxK=RR{-uC~*J@t6+6nFNT7!ijxsx70xzc6-REuD%55v@c12+Rf?>V z_X3}RvPwyIRaR+FmEX2S6y7cru9Mz7mm$q^h;i^^ktU5ulSYU~BgCT-;?W54XoPq) zAl`-0WcNvF5<>%;MDcZe0(#v=&?7jEiD|LRK@a;z(8H%C=pj7?JqqXvdemYQ^eEpi z=y6si=yeTx5j150%{}Q-t~JJ2n3UZ2=ixnRSZA?ifM=swQaW5x@l`K_|CI5pwx&2m zV?gZQXY!@_jUy4OmivbY@@=Ehw$W(YXrznL$Z1A%0bF2MH5%26=oCZxQ2m)i9mG?! zymnA8CIZFh_Iq=DP*QSMZ$r)I*<-H|RG<;3IZQ=cgez1VhPtR-L_O1@egj zVhZhx9?<5&4!#!8HGD?5EE^^gUaw`cWMQIRuRI>$+57BNwt8t*@pB_p#o0EICynTm z=1De~AXw3*?Q@AFXsfFD#rkp!0)a+V#c5PkoJLi}d1M!XX8d)X!f41Ppb!wvVMWuZ zF4<}|ucX!#%`L>%(0m_N%4jYClY%-zpc9zX$Kje6hv+e*_UZKfif?0K%JN&oh3y%~ zIq}%mgo+Cj69hn#Dmk)ay*`T5+KT!kV2EQuKuK)j_F!c|Ia09e2~7M>)QV>Iq;J@h zo~mZ{$uP(ap zjuYGu)O6}-8aoXriniHwTElJe8q%)?6{7(bFjvV(>MT*5cMX5c+*@_#sO^9+Mihip zJr3mM+nX--*hQAnA)y%WYC`p7CeZ=&-TnfARh<%sqHMXG8}isNGd|LtZbyKPTlwAA z!D9pL z@z<%DM)HF4-D*0a>M_fw{tKKL+_s;qed>NCzo7ezgHI5w&hiS%viVc4Ja>xUG7)93 zw)849gpY`Q^c(guS-)VPRUq>NA@l;Q5_eYeyK5z=ZuAjU5`F`K5C^G& z*beH&?TMABHNlt&Y7JfYjo+0MrVu}OEYIu)<9w0}JjQi2l*c$gLwStDG?d4VCe%WkzAp+0!+4jGgNohY!iwys4R2tjL$!&V+J&F#C~Jdw>Waq@+*umI|gi#j!FZPcyPY_N^2n z;?$%);pjp_M%4El#eYL`a|XL$Ox!A$5NyT5_^V$LCHLMJagJH$IJcNZR$oRIu6$qo z+$E+2w~UbVE%}cS7FB;f`H^E17+Jk(-XEhoKJj>oXY)n9KWvc=NoAR&-i?0>DKCGk zEDzi*eA2ypvqU^g9sBC*u-M=-#V>=C2#^hwOXeV?UB6US3ib3Bo-XX!&Rl)x>-BhH zkEi=}%BIw%K_22LlEf=w;FxO)N&9z`geSaozP{}sKk&}v@SVr59dvU+-hP%`jn$K9 zcb^e+4}J4j**g3F7$tJx>}mNjaRZ`M=h{x&N6Eo=8RY7=#U`5@znLCP7Xaey*-Qhh zUMS+{0v?ox$J3*_P>1!Qk4ZJOPupatV1en|E$=@~SUGbgEZ7FrVux}xWe1@~4Y-MH zlXkY-|7%aN{1?ry$kPOqnYDfnNA_PN0x`H<{|$e2k1@K0Z;R_5Xlvx49Hv>llMTTA z#wWjjND;yRUE3D+41n5HcWREi>Rm?=cqEN&0?Zvifc7CUB?F1J?mFo5W?n)fb+((4;{hded^jWFXO>D~`+8 ziVcEG8B)>jP^fzYn_MYC@!rlLAK~kH!%nPAb{imWrpK6m{EP}3GmY^p{1n@mLrA&; z!?!uF&!$`p&SAQ8ANlu23K$934l7ijU;n|BE+(4}cvY)Z&JD|z#zdCES#V(?-4CNo ziKnfvJ<3a+3tianEpQMmja%%=}jBm20^|`wQGD{kQNf;(7;fJ zgiekpOch>yuLQO%pt;^M>bwu6Wb~UwS4p?{Mn1$ZyFo}cIh)kR_y&>_l-SjLVJ|c- z#bmn*0P9d~ZWb}Y4B#WkI=PgkjG|D7r}O~c(ayYD8RPbhJ)}o$9B{-aL%z34 z9VB31R`)EVjt{NlWdb*`K>kVK0CZoPfM^i@*);w@s)+x9#NwUqZSj#$G>_POI?C~% z<-djZ^Ps;n)4X!dUcn{Cvcro0Kf6>u%Gh|_;8vVR<9xZRU?4CvZP;F}YPE9e_twE4 zir?rUb(A;?fU-IM>^;z0nvuLL0~}XTFMv`4Ubtw^;kG&Q6NmUtE52uXlDo`{2Regn zgrj9cj#vBn;%vsuf&z;MFq|1;=0)Oi;x%X^Qa9}_Ck4KqF*1`b=;|#z5-(4q+y>kk zTSw4fSx3-b-MSjC!#Ud6J5i052x%9;mPNyCXjtX7MBTH}@gm|`o^0>_$#h~d7as8l zA|#UmOi++n#;92X-{3cS1ZkcY8X-p&ILG>lIZ%V&0jVOdKtW6>dURv|cOZH67tp89 zU<2!A28;6`R50!NBXKDNOR0OL!pj3>|F!*t$B_1(WT+?{0L6N%Zdm2@Una$mL~M0C znZba+^Suf-C>A@05@3OwPim!P zhLHc?4uN1k;ZU$ThO;49KpR0CMZfV?2~C=}W0V*$4q;+GKVa+^gehY!FMdUgfq4jG z2uT^&+9M`%P{qMVaSsjGx6h-!^7;=V#6!eaGl0i-q3QT0hKkYS-QU2K+1{PUZH;VT zsQet@8P2Panr7*WQo^)D43}B2hFamsxm|l0mV+)tVL1w zVX+>0mDm5QoeRNNL#Cv-AV~RXm(g-vaFOlFmlj&Wi7u=>GOJj@;K3E?rp4^)^CJ#! zbZzk~8flHvykRah(i&-`HPVEd8**^-m$XJ2X^k|S(Y$E3=zcRl@uboH8#KCqgGTpn z(CGdR8r{D^a{x~(&0!p?G&keLqj@FnU7B0)P}6)LH*V0}Iv~#Hg1BW+O5E$M?B0$U zY2M6uL*T9$U>;&nV1fPprZ74SEJbG{!c526L?6vnU2dkp+Bf$@?3X>{e4A8HzO68I zwKaLPTB1(LBdB^@wTVcLBqKBtR@IkNp?jzvimMM8+PUg7t{p6=ZsOYnAG)qA<*AGH6h3O`soKET7c-&uLB7i&8tNl! z+4$l&m6w*hKS6#!>~|mkFw^4KCZ)@%pz;WK*!WAvLtC{EoF8ngB>Y^3%gYUPwN}HK z)01E1hV~y5jHo;!Nzn0{n+)Q;{UqVj{5MIsR36@H-K2x4MR+8hw5Pz93!N~wX5 z>5QKRXi#nmZEjN;Dh3QnZeZ-$2Ap6(I<_IX;YbOeB1KGs5J0w>m5)KTak>s6+h`PH zkmWi(rb%y`16;$wg;V?HU)*FPZQ;yq13Qxh&#gAL^>kX^@7ac62ULF|d63~*!^ zi{2SMuXt{2@StEI$Trc~d4y0#iUrkzXK#K#U(N`ajvBPI4px3sB~jiQ7;t7u1Tp)>kuLlFnx}q4I|i9;O815V98|7@H6;O*>k5%xjIVc;Bhjm40VHqepf(z%|I%qJ~&KWFT1<9^$EDYw?90!W9_No@Mmu~$nR9;6L z*bCW&Pm_7{et(%Gf#;|ix9y;UB;r=HSL`qwc7q6;rB&Hg=?Xq)#g{oHaH23T8FWy* zuUT0`i9@>BHiALA41=+D!%~CuAaaJZ_|B*hJIx8#lqa|AIVtY_Pm@cDWW<}O%^jdT z8nbcdS#Z=-5n(ZLjboVZnl$%tEQ8NsU;Um()Z<>XhHG!w!;X zS5IEFda5_k?XR9*-C41+wYpff+D^ETFt9Jh*7fVJKjaEfm8eK}&aH?K^Tid}j6T27 zKNtGE;Gem3HR-SJ={+r)xs_T+w2Z`u#r%thIcsqIzo-cWH@aztHcrAk=!sOztD!3! z+&*IzXmIYJqCMbEtD5r+r;)Nk|8 zIBiAq3093D_749R;Y^vWaZ;xHPfYzLJgftrpy$T7KU477ShR@RvS1 zgi`%MKHI7%mw&r{bYu$}duGwxJ~#4AbCVzmxf1Q5Mfea_RFg|^`_X!({c95%M!PNQ z_uW2GsS6m)foCmx<{!h@dZvkY^Jjb{5Z0Id3H2tVgdU=rz6i>`zc!w9cetN)_n@=s zXh+^B4~c!ox_cCK<`qXzemGlNYGXv@#D62+=WZM|i``8Za1)3anQAOsXbDTkQB{0! zYCI|yg%Ibn4B-Kb=J}`-qIeTAjwjmDn6vb@X%irL3Gc*tIdVriuSFBOH4-g9^x%0` z*s~4PiZC=43mBftIRRXfq(5@HAOc+^LF^R9u7}`a1I%_FnPIEXBTvTi@mpYn>WZuM zUA>uNBdD(+59zA+1yeiRr~;s{1A*lIDVIh@KnkH7I0N9~EWb8j4(N`FLoTiaiiwOe zfi-{y3d%vZv#RDX!!YHdO>U*<|I;Wsn?E#HYm_|A*jbgrO6sk`nk135jrZgp9CYlR4?+HPWms{M#6dQwY zLo;rvaXoV{7k(k>FcIF|(HVS%QAtR@A{=F2bT^6ws!?Ai8BQi4>reh=SGn$ChtQ>z z&WffKT_$YsjTKjnNlz1`4p&_wmUO6R~x; zodTlau1s|!Gr?ATqCbX#Q*`HxkK*5}2^4@v=wxCeu5F;e#B(jvVoGfxBwn!4`dj!$ zKV|V5ImiBJE%d?sYbf4ln;iYt-@kf}5agV1L z7-T6f2prKOo>l-Ep&yy|^1xc=ZXeZ(HeiWk04#9~n*SdF>&*>Uc$UDTy0oOT(9M7~ ze%}p}?qg||-mwI;M(oU}FI)j!@G3pEbrdxlaX$WkXyg53#-s4ySJNj;4m!V!txBD$ zU}RTkC`?9yrj#cvrd`65uIe!PtKntM*k;nzD2Q4Qv%b!YT;K=su_A-5?Q-EWB z<68S87)99go~Sm_{V@3}87lE4!Chzy_@s0#bYZzJ z{zjj`s=cnxNFDLphvg~W?f)J2%afTj1LXL$BJ$f^oQ_(Zqa6!3*$-?F6$B0%gK5U z)FkT(ZIG--7m5hm{;=9jr`v4l8+3 zI#`*|`O0=0&R2HQ;C1el9VMzVlRJvj@TOOe!ut#)6Bfdu?a-tDA(dgC}8pT7= zgbYbltKctb%QUkfGmYX4XcS*Sql{`A#TU>hzJO-e`423jdI$?vmJ{a4WCc&OLu>k} zrgSK|62z751V$S+XS=C7iV6;Dp%Lb4!JV~EaCgWar zOe<(2sir}$Qgl=m$0~ZET%s`TdJZUYXN8A32(1%(Z2p!tza2P$o2~ilvB<_tSXrsP z`Zs=8cpl_{A4E>a(9~QiQI7t4@E9Y>Ztfgh+D#ys_ghCpf&masN9ZX!xtx|3%t~nU zV}jenLGcYm8;!W*>|_1=)?Lv27tf10SazIlQudLCFaeM)oe%T@#aZ-V{cF}q(Dpr= z$s(4Jk?7{|k`kjsRv1*f;s(jQPUMe7B@5zM3;fp6M@_xzA0skBFi8)pcmqmm_a?iZ z5OSEOC&~?AGN{}a9`xWGWjb~~Q-8#!6AowmXvw(_j6s+I8cm=xOsa~_L89vvtUL-C ziz%!B#Ci!j|Ds-2GW;ZW`9QIbL5^(Y1ib}D!5}2-DS@L)&^WvRB-xtG)O`hDVF7Wl z956`LL-}Un25JU?(F(hA(@e{rI4C<&+dZ;%cJf^RrA;s#IX6(}9cmibtoASSsvR-c zpRrd%gj@5f(UegW&?yv#OoWI|zgL#r(#vW&AioI(sgQB9Zq?>0F+eJ@%8pBQcyLy2a_bTkPR4=tQB#XEP`BtC@535oLa3SG`Ba@D(G)i8^IU@#4e9F?iAa=-~-!!*;^N=H_}n}avbo!T(^=sS&946=`5)Sie2GXoBf2r9~z;`bO(h{ z%pVI$lq-H3iJlScb@t}~z{X=BsG})Je+yvthv^s{qd2QTpTO4bYN-aG1iol-4B43{ z*A|H%W`xIqIf%Byl#MRA8695<07G^SebkfBiH}++CN&5`R9#e~RRxxy29-2c!vp0R z{U<6n%7K$|^Eb=n1uSFAyH;a<53}JLiyjbNka|D#!xG+2tt}i)0Nez3xW*dxh1(0Q zzc`Z*3`)WcbBI7xM90a8R!NME>?O7ZE@9XI*>A_McJT-3E)lzMn&nucfFUE#aGyGn zM2ns9mVLC5e^xnHVY9(Xz2``Wny-RfS$*ogX`L5;l3A6ltp4&n@lWKmAvp@jh&%8h zbr|ING93;vq}KAkkWkZWqb934jLa~^e-&TSx`I5mb(yxu5Rf5V}P$VKJM<^8n!@|lk$x8oK`E;laf!m;SQ*UUostD;rH(SuekE~USr9Q zp#%N^xL8nja+dGT=)BIzX|wOs+ek;183-a%@hmmBHQLbsn{Mz_5qflLztYn}ngCM^R zT^KdCBARJwe5;Mv@lXi_VN#D`|es*O@Uqif&B z&OnSejzy2NnG!7#OUu9w|NBHXwNw$=K2$`^^#CepJIAwLU{J1s@Y^PoaQ-S0gZ#Cb z&869bB0{qbn~&xKJR-vyIlJ*u0Eo7uxWrur>Z3qZ{eLBt0i&as&e8GNq-{DBV2zw2 zRY)d)3N&XFw+)){J0+_6OoTK4E|cWD7D7`p+H3Hr*3lGEu3wsr$bsITgIYxDNqV*7 zaH=(khk}S?AVM$o&LgO+AhZx~JLWc@*Ho?hm~WeU(h0uD)VRtp&X$UDYX*(-#{F8e^#+?nGYSJj*3sf{krh zd?oV!R`HX#9wP6z;sEvtS{OiOO5I^_^h8YGft!9o%LzhZta?KV27z_#tkm2!B|Imx z5GpnYDTkUU9jU2)Fzg|OBvD+&A1&@B`q4LTD0|wLw)Pxkh#-P=&T0A&`mOXv;XsxvbPHd)f_3DN9KWcnk@GeLb9>Zq4v&>Z#hXflqp5yJ?q0HH3P zZ8-)}_JtS_u@J-ROpa^By|1QA>!2-j$RUOauq6gy{DQ^>opqqsxOu5a1fAHnC}>b6 zkkHR%0iGU5Y=kEU5M*;azu*PAO%?BWfuI2x0u8_rXrxX>q33CypPWjk7JD~$4h0^3 zU3f3{&UD4<<$jX>@>D?pR>(=G1U#uz0veqX(8#SxBey2a1<=H_D+41|`PQVr7q6Zd z@@ga>iq8bhRE}t_LErSLrm{D~*v7E~bQOQ~=eND<1^_XQdLN z===uj2t5zqxxm|^ssVmLx0&4nnT~oMIM&js2ez2AdXi&09In_1y3MivbDIq%H*r8# z6E|{|G!o)Am{~Y4Z3^NDNM0RC$Py<9^guA)LNNm-t9>r>`8p#upUM;*wh)l6 zkcT)em)!84;^QNc88#_Bf~hdUF*{=l#`?$Hj2I;Dj?_^I;R*g^OO6+2!nEZTrr2+D zY@)!4?ro}L;R^+6G_w`f3)G~e32msND+qVTMP0Y%#hXo4cnT~GI7pDMG<{hq+5!2e zg$KBh`O?aO!QtdK1Wa-p@?S%fIfd+llOP#-nFc1Uz|MCl6$9Uq=e8vFWB15Iau#n* za>I9b;NWjv#m(E;1mZ_vMU0>^bcOe$S_BPdST_|d8NT+P^P&0cNKj){X{)=Wa??|= zG&n#DIRSY08w(dIt$9n^i5E<5IqOSiC1O#mx>j!^CJrxnMI=ZbbbVON{#4v zVh+As&W|ETRb3k_nBGs_lD=>;Pkpz7*@HVXp7|RCRCJh_ss)L$Nbm;pf#ykaQGtn= zDo2xkRzxGFO7ky~i~8!pMs@uf@(5{;3@%ag+QFr2jt?$VbNirFb7C-1vycudwWrd- z3kXgBPkr+?>xAZXC8? z_G8I>RUlN0nv}XLM1998_&C&}RsdGQy}(j&yE?@v*gGv`4hqbQ;t?c76u0J)H02pg zOZS5NSjpJ^(JC%im=IEDQB6zb)j&krK=~1)e=*|p_+jVr*Ab=9l`R(a1wHbot8;6Z zJ>})LVnkOokEsh~7TbAXrWY|>7&#r&M{K;S#F69Lff zS4)c@js{f7%8yQBmEl7Q=pQgfyc(XLa-$Ak&WexQ*X*aIO9D2Yl9qu@xRc$k|9h%* zG2c|TxVRFtcqgg7E?pbLP%A@6L7~YSg~qpXr#glEOJ-zI!?7ElXKs^pQ35Z}raF;W z+Ue`z+c7ir3soMBI2&@|`cw|rjJoyKxaV{#+y*r5)IH@uLkCl= zm9YWNWtu;(|0Wa3V|e0WsJ zrJL!gsL$!+tfsLGE?MYivFkL1gy|T8H#ZT%q}#=3bPGzTWU+X5Vp)KCSqG#v-QueB z`<3F1){NdHB~gkPy3MM^yA1Wb8fpQJS{Uo&Ov{U9pji#sM5vk3^8K5Ch%A@QPDo}Ig^4H1bh|8Ah4)9)epyxa$GMm zm2?Ay_5%w4)8eB# zS_?HpltYh9LpX`s37OauBqIzh9WpdxCM@m+(9Fi+ot z4boKNxC>iZ3GcV7*`esOx+GAcKATuotn&F~C0pkCBP@b7YjNxs&2|cc2znJvM%E{r zJ5y)eUTT%+s18BZxs}v=099zYZEVuM0YQ4)Sf7<^<_9yq5<78ju!)108Hz6Clm})< zRiTj~1VPjenZyhyyIH6QZ5ZAmDKtDMU?P_kjO$gi#f{29VOzDQ*>1xhw$hH}M$fAl zKnE%e)~Oe=xgqcJ`=!=H2w9yJ+_m1^FEtfUueI|Q#SH*+tCbMME(7C6P=6IK+W=TI z0_HHr%+;o#=*cZ^96oOpy*k`X<-#D`NkvqiADk~4S}Nb-F~8(}cTOIz&oYQcS~9;6EI=eFtn3eA=9^z;vLjhY*ngIy9n^T5P1V=<(49~M5$h=7 zM{7R4Ff$!6_)JAF5TM`HH8Q<$Uzb5W*1^Vr#54j4*Lz%#LMmCejX6)f5oou`qqholLCDy$J{f}CUFxmIB;TPc?p#PsuuuqEGj-{gNxZL@px`RX8}fPgm;x2 zmqa3gNSClR>|4b>Cfc;sLK4W%YzTg`gS!2Y>|%w)E;y_I_b*8y2{)VdqG8YNhdY1< zqxXj4qlWIQrQL(}8z^T)DHyE?dK4Y7Nnl2wd#R6CtCU=&zp4!uAgc#9RjbP04NACC zx4B#ntKde>9~<`TH@bvfw&%*8+Kgq)R+PI)_#05^bVyWWi73V>%6=QoHoOz~S5-RO zD%T!WvC6@c*M;7!gI*H;8xX{9Y^&dA@CX;SO)UqH#(28SkWzjX(Ct#zAyMGF47Ruq7kzxp%;pW1F3N^!xlU@%`z zYRw92K2WyzA@C)7`y1iV+(uJgEDi%D?tsq)p z^VD4`<{X2$YgDaIdptsj^;u~tzyUA;2DArz1jzBE->?{nBrDq%^fRh`GX^2x(tA4A z5q${aYo#X{EVK~{juL`#6fGtzX3fPEb?e|j)rhHhv{9~b&+6x)w7m4NM7RvGsO2-x zMvF0kGIR-0)jPnLJ^teAgGo@{0m)bU@J+)UKmv0v3RHeWA8x|pVVT93NO z63o_sDXQ$F=_z15kK;LUG_vJl^HWCn+?mU0}hlxW|wL7`W=5OwsTorWMsG_Y{$~0LH3MF{L-P| z04i$3)(@3L12Q-;KPY{PmPG(COIzY9j1dE7>Eo;z#k#IQIT(p>bD+t?3(%hDRv}#t zLRS;s)xf)28KA}E0a_88yLjQ#a-fmyLua{nHtU@kd8`fCvr#hQ_}o<~vXf=D#RK7z zOh{_(8r*O=dQh2Fo@%0e-dwqM{*ax7hzXj2(Gn*3y2gBA7why8Qf?9u_s5BJc5%nH@+SX3R6%8zNF1c)%;7->{W9<6 zbZIFw=cI`lcgoOzQ04`9>}T;yqYwD@fd*dBGkE3ZIC-7}>muQ7fIR5NqS3M&u?m(5 zGq}qH%63Q3zGL`3qHXki!@f6sS#&GA1?;2ngfA_q3&TS zd1wo~z^1oeJOl~~uD};~x2rYJ2xPmiiFszzef8D#AHc57)5lv8KRYo9=^wYNzJmZCUWlTf#p%1WM8< zx&{6SvyS2gu2W@86h4MQxfL$}i3X_+4|nNnc%x;8MEYwgQZ^VDhHr9lRoM^U93*a4 zRN<-<>Ry@4109f)w@sljcHpp-8^ZfjI9&?@5oT2@Q3eN8xs&O=wtnox7F;2N7PsdC zQxrK%rKaE7AJ$l&RW((=(Dq;@SygY(>lZroi->`GlUjFccv0|W%U%>7@9XgwEqdIi zQLY+3z9l@)Rlj+?W%1)87J{F2_G7Ve0nHqzv=3pGtVB1Aj=Nze%UN^Mgwti<#1rOw zh4WJo48gVuC*m=Xhuxryov1pP`||P!tq`Q(p+j7u+hBJUKKKk%vquITHw$D{;D$JuOEXBF>Ov zFbUd#{_-L4lVPbTtxQg6QKg3v^$`{}maer`WVI>mc7BX;z^iAWOAuw>i2RlE?|mY0 zz{NOd#%xhyGS&zYdTd_3^0KT zCfYqXHWTX#jx*91w+sUcI2()U>IC(w;mC|8Fp1Z&O^u}*^k6Aw%@dn#i(wJQ8vq^3 z$a41MWLZfOz6@Pb8*PS2*q$m60<|LSETe8`BydEc<35pUwgDvQP{GdeP=aKmrnyq6 zjIzC1)+y*JF)aVYh`y{Y;b%?1sb0F-x*w4i+X8W7dE&9gF4@*V#FyLG(RPR6J_2d5 z$8g8s_B1Knm$u~(q0G3QGsO$$-9Cm(_RkQ zegr3iNFf}V1d(I`f@p&n%Vk2(Sx$Xv&ZbZlS`9HK*>00Lm`thQ9>FF z1OHK?u*9#yp+y8PE;IGSqsalEl4A~h((GhmBDz>K^I&)S=0=^*aO7Evbl5s=-$kX0 z5o=M>Fw1p(Ar*{HnSFg)KDNMq<^~tZJcb~|jl-8brQf}O)JeRqE;_4$(}mFl$qBn* zzXVE8Qtg?)c4ATTS0BDQVa{E!ak9MVkfyLGNrkV4tELIZUEFTF$TqW!dGVJz8QJbT zxGrjT*b%rx5a0)%-go zEpnDYf}v~=TqGBlsr(K?A|G8gEo<5((m80v48RVE$QGG26i=QdTps^K6tigDq&aoq`=wbm3XrN&ff2d=N9lov^0bVR503N|fSzkhi2(Co9 zYN2T(S|xyO9gF=Z7r~mf9hffE-^Su#%Ah#&TzR-!17}z&y0n(kmH;v_B(71AcMZl3 zl9|8feN}qX)@2t~!cnefK_^+pT9;E-`!Y7L3~)lvdXR9CYCA`kzouLZ!LRh??;O5o zu=3@1Wn#g8hPV{C#?aukc?;x@h8$I0#4?F94Y+Qpk+3nbY^M8?W&$ZYAjA(7c!^Ko z;s}3ZQ9=syZv)T1BA@VxaX_TpNwgN6%P&nVY7uV~OhyN6(&k0hF_NoFuNlqCoP@P; z_(BA(k<)(+PlOD@n!y^P8Ssv^0N41==bH}=d^fp zUcY?w$HtcLA#`5g+O&*bBHSX`=H(?aa-vlh<$@-^6KX+)6vSmSB3mVNqrrTwjk=!A zk6Qc0VwR~hzU8@B#}`LiAl13&c%1YU0QcT_}6n-|id77ixt6v9}G z2o&(4`x}r=Qd1v3MV)}^DNWBOPBnEnU}pB`5OEH9n2UpYdn1PUcRTA2i*@>Tzy3q~sc zyIxoQbn{=~Z}0A{6x7Uh#vmIepANU>er0){E?(!?gAtfa%j+gswZ~6St@ln1a;5vLX~?;L4GqVyM`$kHk-e7YG6Ah6PyFpP1BJe|%4$cppaMge?;vuO zc6JAmtF+HU+Ngd04kA}+U$BG7Rocxvh+L(;Vh53{v@hI|olavM@Vj;K5Zti$g?_qv zaUk$VM=qs-tdjv-AipNIpaOwgYE)K^MuEUI3IwK6iA9=Sel~2UJtmK{aIo{6h7pPh{EVkh!2W^ly{I=#Ur~cAG5b|4-T<`)C27+nnzOr+MwQo>S z(QB_4^Bpx38NiFiyvYX8PYmE(Z8|1JwgH8$0ymrn0C#|hoO1aw?(va-LZPil9ILqtkr)&UF56nw_&R7 zx5wK<1m{>2s@)!F%Vu~HAi@S>Sy6ptIdYe#C@fg{TnJ^x0meuOv@*ja1^1UnRIgC; zfPpvUXf6UT%GDf%&SVaQgT9k7Ig_e{vLu@1OiK!lClZRGo>!o*R|RU2`>x zd=VQfMJa;8d}R8vPqEF%z{l(C5SIX184lJJLAh#FDuY*+|5^X8tpUSwj1HJEwquG_ zBk73sMh*=G>EE%YHBQS+apioK%SnJeqSMW_zjB z8Hxlr$AXE;qss51f;msG<}L~%%-J&!GtWHaR7ByXmUccvW0{Be52a&T66!1sr@zWf zwYy%3ELKUf%iW^=2o|Magjp;?A!LL*$2XLmK4x494yh~5!)Z-=0Qkfi!?p_2* zNv#(BL;K|8QA}K;zT|qYM1tMG>aI$_1a_M-kyR69^KlqR4G9InD+_a}@Uim4^*xhw$0%G2XuywX19QQ7LPX98hw=G0Pv|UNt3_DSILFG%`l(CLSmJvqxf?2HT!0=EWFaBC;f8Jw zVpf-6W-4^tbv;Ic30z69MyBqPswdnX{p z&)dw#RTo}0KRfuGU_FS53v1(==uP*Ji_C{7@lEv`xH+t<_QTI(mZwSrX^K#PNvx%Y)tZESQY( zEPpZAtI~a@YVn|{T1aQd8p)fZ=C?B>2p4yOO`pyNSuKhI4KiK!YFI+~4EW>IPzNHP z(=8T~&i{Uyi_g##1`V+-Y9y9vlwnUJ8<0jeAkBE;&6I_M5;FlN#ThfuN-UM z^h`yKNj%!n77<+-y@aKVjTUdA{^_)yic}K~;t5W1pjWSc^=#BLU@rB{tP#`Fq@H1h zNIgSKDo7?zkw<20_x@A5^a`DklK3eXWx)|)lE^0{{7*t)L@NcA3D znf4bOV7un|ZE^Y13u5uus_y2anH_LC>TW)or>YHo0m2|y{xxOT&OoS&4KuUdyax#Z z!lD5$=+iI$H53qpA@FOfkSQvvHldpn`eM6)z~B|rXSs?+^IKsFYPd^oB_XZ0FX8HI zs!2{Vl%l3$WW8#5VxXva_yTcTc48n}HD;sl5CIx)A_L`Y7_0C?o?%(P0?Ya-kzn&&J9K*yXof^c*Ah+7NcQOuhkTG8o%-9T zSHcCsQFNf%wg){4Y>^i*S*+JH{oOW!&`%H}^`9Ai7T3~M5G1yCV|Kpk-GP5iMd4BZ z-#`>5rgwt)Sn>|mHGZ=g=IuIkr~WGqro1eHI0xP#Y8(IBu5`lZyuV)el`oO`* z-WZ=kHQ72@ziolQiKJe0grYb%plhQl&D#09x3jsn-x;+;lw; zvQ6YsE;?!(|Iq%SS@V>TN|H;PV;d@7lEIs{CJ9_bk`2WHB@+H%f5@;!7Yu|iBO&Y~ zMBb{)qhnjy?69w>%a44;c6vg+0P}9nv|~#Ba4UI43Gt+d)c-}m<-ZJhM{xrWhqQP- z%;I|9r<3*eW&lrL$J2>}D(+#(U#E~lyLryD)G2FI|J&lNY0Ob?lqQ2CgCDX3=^>En z)${nCs3K%%-{wZYl__vgPuj=35&zT9>;i-%#aIW^kOOpJG<~E(BWWmxjh-DCX{gfK zbFTcDE7o+N5*>(`?pYdh#gb^N^iAq=$Q6szS+_$_#spVvl=-_P^Lrm^J*CUlBHAHd zH|l84TQ1NgK2PdkkLCizc|f>26>jqen2J#lWhFKhMiADp5cpnHGmI)8BGQ0o*VN^) zqkO~1F4rw2hh%JmT2voKcH$AsgT&=j17ldv%~(2c?)Q*D2m6dZ9I}LI$ffTLcb!knoiR$4<2j@gc>m)=9oCZWNI(frV6!_0Q@x+fGWsdTf zD4a7tUbl`}%z({>r;~uWLEXbUlN7HQ=_M!ADQqO@C z$CPZ2bY$i<#Rkpg&xI1p_&`7P)SB>^r$i1DrN5l#*j5e`>1i%Qe1CxRtUIpIALO%3 zaCdyY6@eAad}+yM4PJP8!4Z#EBoI@Id!J0X_^NeMb74FtP#Op3!=~c(Y@)u}%qRR= z`nYZQakh9}{C10d%uWs1-9et=YsBQBOLLG=nu3jmI`g_iydC(rsrWMv%y}B@OSW=M zu+Tj!)+yG{&)ey3_%j}J-5?|RCdJrdW|-Rc;MdA}2jmX>`TNpACbcf( zW$@RX2a4fI>&KtS=T~G|lJ@E^-f8uzL2G;Fp}K#>@fX9j_o-!SM~_sQWUk4;rVJM_ zuPdll9r;D4Kla5xNmXYtTsz-?O4g@=<_FN2UMx zrIgUyMj3V;UUty8d4xJnX8FNbwx~b0gxvw~wMJ9QNsBGw_?Fkak4~I}`ZBEpKT>#m z8vSX69@)+?W1ck|wf=Nc@5ERUYiQRmK}v{Ii7}ubE65YwR)^-2r{=;c8MXLFE}fSm zWv;v+n3a$M1mj<$_VsyfKX|^|emJzfn5LihMWm0n!+vyQcFDwjML`Q zJOg9U?h8`PhZ%!r8tUFH{?ff$G|fdptMr#*K4=v4L33b0Xt0in*Q&Xhgmju$5}Mw= z0$XLEziu4>Pb#laeuU;V12lvyP`fMrb(~aEn%f6B4pi>#5;Y4cwcu#c&n{E@#&m#8 z6Jg?4<+BKJw zS}dAo9dN;mk+63Dx{|fiY+&s)TL2`@47Rzrn4Fqgu?LN>GzPmCW0_Kc44f7JL?yH# zGNN=kQgBd0S&Dnl11Rtd?mbpPi1GpUtAfSs zH+l}R${<~!1#wN)3n>tQ6Deqeq>tiPru3r!&C0sfpq#)>Bac5nq}1&x6sbVRyqg`h zhXtJ3`csK`0-OL=U3|8)*MCaz%n+lv1A0No`GZyBh4qyKN#PC!F4!s!hj}OoBoRW5xC6Uab14{SEX#y8c%r*(1?yCmH!_@5Lsx5a1Tv|_2%~iW_wQaYK zWuzq#bYa;92{v6hhlc);aEhyv_}_x#KT%hm%H8MujS*ysx+lE<#E&;B~VW2u@2 z@2^G~FFuxmyB|!nOXcb-sn7yg4>%6>tL~L)RrU_^XAk9taj?o-^w!pFLI3n9#-c30 zDeK+@@XFdf7wd>wUR8WtCT(z+QIM$Z98$~PtCGU%(D1bcMuaT5X)#%-vIPVsuGnFp zppI#~L1_^E2t_@Mwqlq`m-@|zb*K?>;qcp@RqM9UhP zt=M9>UOhHjP!EX)bJIZLAhzJ`b9GnRDgvd)ti2OoZ^3S zpaOAKqh>GJRp6jqov7E$BcG=23$!-fxA#yrQBNHPDNe$lx*N;s8r&)76(7^7x%3kz zr%LmjfY@hDD2Ie9ja41AF@~C;L%K;0F^2dMtj~}YCgIq{g4XeRZ{Es}86>HVB(~Kt z-e!k!h#^feo2Q*eeZ7WvB<>{B_3A3chTu~IE^3M{H(Gw^}~_cjWKzy|g(s{gQJ zV8(S|#++^fa{++~Tt2ho5diqaCEW*zZ-b`Nb4`lCd*R{p{lF&_%A4Fri4m{jyn`@Zi;t4Xi65uYY z7F3eMK|5#^2n~qn*eH?FFW2lBdMSHWs>e+dD+Y+O+-JUE{thJDcgaHG7YJ1pBrKZ~ zBEIl|J4sovyM9L$jNtku1R%IL0kK~{t6gA7SsjM9SK1$1gou<)G;RQ!;n*0Cz(&B- zWUOc{L9%8Ntp0{$J=@xdYsKmc;j4*xtrbtgT-}~~i10YyoN!=RYIAZnXT!+3VdN)d zzG+650Oy;;UsAIo%UO%Ut)s=sXC3*q?9t-5cTHXojJn`mv)b9_WRrIdCtLKc@s~yZ zQ|xC4JcN>Yst-!C_KxfT&DtH=VHyf~+)Q)vj_j2*gR8S!Xl7LPvaJ=qnr4GS{@Z1B zb#{aXtMNDuc>uT5kOy#rhCF};qL`Hka7t~dSpR6q-4$c^@9Ja|OD(x=!&5!>Ga0b4 zlIo}*GEgjFNC9g6H5yNO1(6RHPdO{hxB`;_HX~kgUL&aqUaNA2uZ0MX8TnE)1SfLR zBL;PHoaP$c;km1)oz!|{rIb2TNU-(oHuX>usU`sm(yGa>E(MFs>M zNuP1zZ5ib1l@4I2+od`VQ}$KH9sYzvT^hKQpO)CX0Lv61lzQ8dIVe`{H+`f31$?$3 zJMb8W6m0eAZw3Xz!ZhDkAW2k5qQ2JHwReK!1q(y2A9)f!Dk?{%(*&izF0@>KW%BD3 zPa~PcD9Z5W)mG(Tn7&Q5;ALc)oDcfYpDXUCj7q(xo~lXW zX3rI`ascD7zT@ylzRCePqD8`n0CZr0(*bh|b^4kVzb@P_$o)1-0=o!bA`I5F9N!8K z(Clr65~fITOLQ->6A^WOQJY-i&!*tLrR%_G6rGI9VgVoJ)YZfTAQVNdq*7cxyeV*- z`MZC_Gw%UC>EVD_M<7^ueVGEXQrL@VCu)1#PSlPh76~AH(;Fa!qlbOwG4KUC0DQQ| zwj}N1(GIv#=DlyXAOsvxmTi~n%~`QgwZpHVTu?gE{*=AmcQkWsK`rj2;`y?fa1KiE z^{LJr-Fs|+sLXoDcuU>(QHbT((`Tyrf+%Fd&P&cLAyh1+Okg;-gvZ$w79|*%Mh(1^ioASq)_o! zco`g)7Vs{U08AIBR+qZWC1U$Ty>&l4^*i=UL9{2Z4dYpvjp1e?4h;)F#3Cv_hUrj; zI1&`ZPNU8e;DU~5Y8sN$d{#ia_)y04!34JFBT8hDn#P2F_M6Tw^BXjfL z2;-?HdCJOMAiu{2y5W=ciAnC(Yqn>mAnTe#GY13lYaJ8~7cT_svgt7EAcCiY8AE=G z9iTOKjJ*{n3wVS)h{VmHA<|x6c>5AZJ`=Yua|vPDi(FRC1rB z0-q(9Foo8N_ewU}F`kLYAREg_Di$l(JCkSa|ChIS0k`Zd>pa(5`*JS(oKvf+PE{&( zD#_X_CrMROm6S=5swCA~E0ekqA_NCp9GT~#d(tgam6?Z%89VyWR3T}k1sxQx;G-Fp z7P%5GRzLG+UlDtM33N{= zs=go}lI@;cDz;^wLC`_Av~<7N?Js-zaCQNm`)Maa#$!kqW^S6kgJ=sdnY4SOOCCmN zSya&3cjQo*f0I+#W5VkYEo7tw%`vjF7fv`;s31F|JsT!kEt3bbe8n%4t?@F5N&?V` zG0=hXJ2*U9cLWw76^}tWl_Y@Ba%;xJ5iJ{$)=z+|dEVJi%$OR=;7c^`cR6b;a4-toACCwHLqiT%#`GyLqaa_iG! zr>kp!Hs`ptCtSD6g!m7Wo+35TF_1zP@!BXiHN&clEf4-}Pbe!FKdMZx__0jP!;pU3 zJRXwf+$hUwuo@F0t%nMI&ZH6xp5iB{fHs_6t%jxKLBz)RPMTzXo^W>_L8kL;Tf|_r zA4Omw55E8mwcL`EX7pzb)HP*>{Kp!4OuJwmAXlt|ANu#RltP_YC;|E$NLc1UgF{`DVz>KpEjkbr!&;GO>FVDz`eMxlP+#9APAlD=q!Z#0scXlBzqK!z<5|Kvk7 zM01m*-`z`+5CUcEaD>n+cGn;iOdA5DaeW>rnE;;+(Qfl^-y+K<0?r`8e+&KK)`2WL ziYO(R$HEoJ6McYt^szU|JnS+g?U{?WPD>aEU}Ydea|y5Wv)(1Uzt{pFvvym(TRV{*IalM6`bq#vivaVGHbeBs=6Hr>X85y{<+c>=) z;&(BID0P#_|76)xVJNHupkRg*4biJ< zA$^^)$I<7C;}SlyUWlrF$pL7b|FH?T>tNqxp~5~sar|o9WKy77@)*k1lfu3nuOabs z1jEgw1try&$rj}sb5Sv1#}mtX38y+d1?;n>L1PGnK80xl;?+tKj%h8nmJd?evBRW# zJkBGoeu!>C^f{V?b-~^ogue3yw6rF=PfEY2CgO_2Fw9auYP{5{$R_>)XE1`uh4nKi zF0a_TFrxTMl2Fd`^wpTsYkZq;Im(&un5tS)GvEP0&7Uv}T-z>OK*;Pi|_F zpivjP1a6X2hH0*@`gclvf!8|`^bIwM(nv=eYd0uQrQ=TqPL6?uNpV>Au3J)AgZXhH z!=w{0%Jb>C+bnKmo9j;U9#U}u=o+LslvlZOh6D%_AxG6&-D)y~Sk=f<=@V6ys8t*v+5DxjOn59B0XwEw zPxE6jZ%8Sn2^JJ~&ZjN}4V#0vW-o=2qTSrZc(>e|o!}ELl#3Q;A}G_>&At5yn47#c!0}HI_zOXeKuzu&zy{5YX4M<9Q2gkU#G!=wVy^&;t8zXK>quKe14XHc8q4Q6@fKP z%Ye`}#DI+R$RNO{U_i?9PAgv|A6MZCxH#?#6VVgl>e-42C=BGb^u2lZd2?!;>fCXuV zmJmG`ZvTGyTjKd*4e)#FJPVE7@Vx8JCs&fH+uD5sOo=5^TGj>$mn6dpFv-E_Q-i?dT101>VBn zE!%`ewRu5Qn?_Wd<}j&=Gzw~^IYtFDn&V@rn+LVh+%ZN{QBdnnH418_xtsV^niq_B zt9c<|tTZngL$wv#x~AqH0y}ARqcM$cG^Wvw#=`@IxK{e~GGbY2wt#raTHSA`eP;0? z2k$fi48Qe3(=Rh3zH;4HF9h)1%8cAfI7|y0Lk~aVJ>sIEbNBIdvU|*l6&pux9{e5t z6hhB6e~^{$S(HnM*szjNE51Hn{_}dD!p%m~!jla!(fekf_z>B3UpHfwOKPOXF>U2i znmL7|_6a;-AFM>yE*j*Ny&@>YssQr^u`zdYa>VE;)rY7ci)!GCGHWVnYWxjF69Oh zgebpd6X5TxcN#Q_-RL?;LQ~gRDuaS2vA=FJpJ!*O+_hZoBm0gbDZas^h7H>X6L}ex zztXLC;+p^M=m`%`a#4cm*k$!xRHF)uRXf*kcP+l-6UD(4UEG#CI#E>(Msx z&gJ$_#M@Zc$$rRu?ruh3uRvV;iXHUWm-*(8wa{&rXG%<3XQAmq&s)sctzFgLrr&(x z3mkm;lf6c;V7ZGi7tdRqZ`O%bB#gR~vp5`=@r>sfYQE~v=DVD_VRKbmokJ_0Jq=RA zWf2$4t~5RQm=2bpmSYu#0l94K?PG!FBn5CsRbjRnrVK#xPKV>&dV;QYD|tFOdHjCd z`DUT~mpneX8h7ZJ(~itI`RN%-qLbiT%g7oLTdRJP@5K`Z=bM{=!kxCxNE0N`T74`0 z0Gb8j^azJy)k~JKt-~`E4`kBfAP7h=Mu%2nk)B?dRV(HD9>|(u5TjLnBB0O_t=egz$+3wCiz=z@G%xqc7P*5 ztxV@sxl+m2?5!@Pz|_0bIaNM@XJa#iaiI7|vudsBai%~0R;&&(7msJ2tmDZqqBCJo zW_RkDC$5Yq(241ZXHM*GuIxS&s007bB$E;Dtc}r*33D4OqhFQgwr_Vh68g2+^sEx~ zwU6x{DYQQ!I-semnuvlwdEexo;q{mroQk+aO@7@c<^m5JaaBCAou37mSEb*fUy0CP z9nX9~oaZw2a&>wt@Z*|zV&isRGxOyBcyh9x`)8gw5KnZs^Fa5Rw4KaG+i8$(6l1cP ze76Dk3x^xDDs~X9<*E68WsNc4uk0I`mNxg!^P8#ZBwk4xB`-tfPjcUt%uQ;$!cED^ z5fdINr~5dKg_{l)XL<*pV9;l1EZlUc$Wj?nh&p`%4FRSvq#?lcMKnZ~zLG z(Dcv?O%J`$^suUq5_~#TnCZ)sK6TNeOGh6Y=A&6-!Lf<)@(FEVX8hVCrC!kk<}#{a z5qwhiI8B=(Xt{wZ3(c1*3r({HwI)hGV^28T#+;HnVPIz!naQx6tq+4Fga`hlB!nri zEw?O{L|)6wMg|fhdG7=dVh1wuL4oKU@d2LGjJfy+^+?6+l>A2=j>h=d>;6hZEC6NvI67a6Q)&CmTjVMFCNwPpq9 zN}?5#zVE4dWnK0@rV>=t=*aq6riEh^_PZ!E9Lh8TK-W~pV>S&;c=A=Ce0k+7n+!s} ziZPW;u}o$TWWt!!TYm%_pXL-glFuomv?%$E`0?$s1m*}y(?w$1t3R>yVbAZxm7))= zyWfEg2$Nd#Dd|HvRGMD-JS62AbjKQVFQr~c79j*gl0rgv<Q<b)1mvl$y@iO5pTe<1*Qt=!d^cUNAmXz z8!KIO44dZe0E~PW&F+Y)&^>E3ih`$+VUtFNO&S?CX|_O!+VJ=0p~5YjnAPyyuzlck zY@gt^vwZ_I-tz?hbp>qydrYeeDTVYYTKnB-fS{{h|9}6`oci^=71JZi3F1|E6&l>- z7OsO#^Ue=(a^>6Fvqh%SF_0&3Wp$16X%-3*o|b@h_T1Ok3tbG6Va`gsf{{xWYHm~s zCz_78dEX-oUWcMLbUFIW(wttUUfO~nt zm1kyQG^1AeQTjFmx^*?r%0VM8@9}j227H=u4w3=H3+3EyKKwy;QCH@<`i*@h4wx;% z$PAp#`NCQp*Sqc0Zh4^tJd0s+;XzsH#D9%ouoqy09UQN&@@m!HcKDi`V)F8h#kiPM zEVQ$V74YKcp=SZ0ZSqn1u5P_TO&HM9zzlGbj@_m?;z^J@m zzx*x;WwO5rUT}_3$ro4_Kn%csB`i^`I~$Fka%cn;*TSjDYZH&LlI*I?Zgy`g$v$oO z#>@OoxuORx03=(_fRT)q@(|ySM^0G5`RxaaMtVTN2wh?(+HEAbx<_>LBtR~hm8b)VoaVE*L_rb5h8U*(#D!+;)@RN32z z#Ih~?(1-mKY{v`mr27?9gQw-5-Hw^x|lfOYRiU@(OIzi9$VKk4h4QdW z9;=G&bC8L|%qmU5T;^kTJ*jP!f~3Ribk|Fl#o~!qeQtUQT!AyA;A0Yyez}N0_fY@3@!TsuCjY z`Ih+eJfuR?0+82Co*yJ{#6XZ>73u+qITwqyk=kS&CP%ax+E(NF>~5^oP1GAUc919> zL(0CG+5U)*AU~Z%#tu4PzNVMRe7iSJE{FOl2qiyhIA(}D(DEAzPljAPv(cAH!nD{k z2*ls_HaL1 z)X_!i$;PZx0w0o!q3IJvJt5pc6AkOhg>$GX*lI}KJrJV(SiSdiXN)p03F@`)8N>EI z!u-n5ij}h$&i4@~^mCQn$DRwVkx^XKf%5!z4{np5M1`(w3)}Rkr^xOTj;89ozrRVS z*rxeikH@99z@EY>=~fd(VGI;jf!?YHg;kAoT4V%ixF}vFQ1gmcR32IazgW^f!`TmI zUnABex%+EOxJuCw9za19<&V$C(I=#WL-P{yZK^#ByblHMy*Nz(Jgd;@)qnr~O4oO5 z-3*4*U z?j`6N-U~ox&25&HstxQhcm7lKxRaJX8qklP*!rXo> zmTUB%Fq_X06$wDyD|Wx`E3u83b7|qEO>Z1X!a_ZVc+)?}KQDWZ-k{n{3yB^tu`I$+ z;p-~D#fYp33r-SIj+1e18&g=28b=@=qJ+py%0!|DiI4?d)#;2C^bJ9>$!kJd)kQ)M z=VJ<);@a>&!A>$rPDR5;avuN&v>0*_4B=hl2pZTT$?^dY>X}^y@$T4c4`dgrs-YU> zMKv;VLnN?ZH@^c_z}PKIp__p`%a5ustm~eM^>2Z(ktGm!0{Ik-kW&?rJxOwrzQA*V zVla88^YelR!F8*rR3FKnVjpEAAXZUK5W@4e0fSD2MH^H?R!Clk@&8CQ>!)pj8w2v7 zsj>wo5^+REz$P2LVUx(bPL7_T2g;9=L7K-?Qe=rn@rvP29j z)4@J~o(y>gbHK6~0xI~T{4F0V7?1W7lvOeq_spsRWe0RNn7FIa_Qj6MVzQb^Da9#% z1P4w5mspwNw8Vlia0}J|KmyA`@L323@WJ;(3(HrE)dcp0+#@<_G6JO3`^v#UrncJj zxVB54fQgevY7da*ddGs(ndU8*rk(?NjI#_9WZL`AjTS<)$(rAOl}zJJQf*qxNY>zm z!KzO}k(E_qq5t}P5;qpY#+8-72qrtCc2xxf*rzY7nPH*tmn^uj28J5IQnXCl>vy0g z*i6}puN*uhNkirj+5#9(6lnZ9;u8pkQ@RC4)JLOnmuyFApbVidtAdwhCzXB=% zvll4_$_A~K8_&R3Nq-c)B#we6=OQ1y62seql3-Y3gCftoT1odUag`v3YG5O3GC&Kf z2!xVC^)jT>2mNa(3cb?5XkvgAzzTWFM-F=QXUywU*{RtH>L;OpQjMiU$SlS3l@Hju zSiHjm6I2jT6+J!7^@m0p?JtC8xK*ydB_%_0y*!5E=E$GR^dmk-r>zqOqbUE5f~AiE zp3iIs)dodk^e-|doi*>mvOHJ*Gv=tv^Tzs8vLb&s@BZCP_dKyrS@V(aGdmMYRw{Yc ze1PAuI{`S&U&l|9oZ^#=TPlo^jlN?ODZJy2kt{N1%S}sBBX11N7NFYiZxbbI03c3| z9M8-O*fx(4cy1=TJJ|h^ncab2s2*HUkYipOc)5-&D?f|#JwY|}s8fi6m9jt>xb6tY zu&nj!9mU5|dBkZT#8O^lbD~sjzMS6jMX{R+#zczcS)dnJa&78?O){2yj~EgeRs;8u zk1m!9r#CP9Q?`L70_5popU*cckWVK)3Fav+8Z=Hl&B{nf&Js2H`6KpH_ z9LlPOU`ufg!;L9rvU$_{*`j}>oUxyJZg1a({AKxUwcby5ZfHg;5LnVkNs^9$NAJFD5XTPxlZ(OQXPM8U;4fYyo`&d^xy_ z_}ElN0C?L|Q-MOsFVd{)qB(RHou? z&0_^QZUh#r^ye2B`|-_N`KGs03>Pqh6Et#)B23~!-%q$=woHhV=9D$pQ=O?;_Sh{i z{Z5uc^SPVAq`dr=e!|`*b9yZYzthWDLBZD_MWd$m6(arY_rIw$O#rbxNBbJ4VTlqs z#DgsFr8e*fg4Bb!H*?P+@d0Cp$l-kRaL(1DiUyD*NK6T|L;^IfCnI5Ih6nMJF%)WO zh!3SRRu#<9s$&}DW0gnVQeM!9P(z=?%Jp_#ln=7(3h2`u7#Uu+S69g_gEj`0J`$&8 z3w>i+Xmisk_w3RQM8rr4N|JTsOCg{`OCdCBvKY>O;!xK1Esd9K0L##D6dgH(hdzm` z2hUwh-bN#{OG|CNt2n>?=aFS&Kc*}FjzZ4Ud489it$v_kzN25KiE?DH(e)xLZEllm zVo~>-GdTrgl=|DLEuWUSTtXj+*R<^{o~?T{3GB=X`27j{1B1NWGJHx@+*Y`g&0q%} z=0SBpgne^CFe2kOCq#hB(i}{UwJaUV_B2DTOk5^<2mx4$Vs~-`G*yNryLUqP!Y1`k zc}}@y!0XYHfiWmjmQY@PsN5Ng%T*?(_IsCn)Rb0bysF1|#MjU?|M|c9quDaCe(Ho3 zY92Ja1GLJ(rj)`A<9A{sJSS~_QMf~;H?|IxehcBjxJJRT+fJX?4~D#c37*ki>)xpnNU#Q^c9IjMT5)LYEj{R|7u&)`7EK$-l{ zZCH=lH3U~5DJGXeFtp#vq;fPsX{kdMu_+)n48q|F23uiv6mAJ38Jge!QY~3@C*06+ zUwX^GnfX+xTOfpoGV53!oh@kafuAQ-5r~$|IG{zf;UOE5idu99MJ? z4rJus&>2k7EXaZp_d#<+z$tZN%RfN@OU`KBNuvWI{K-rq^3kLnWIV&MbZYK~7975O z(vPAr&@F6xT6-|*u29$P^kjXIzE#eP1!0sx(qML>kP6WGpAo%_evt@{gi|~*n=s4P z?4jd%E6oV zdF%g^Lvfqr?%!n2klxianY{Tdd^l_1ic771fEo5{mhq@nrf<*L(M2TiBCL^fGRV~o zs~HF^nro3HQdY&N@iY(N^sA1sP{ZlS^JwR%L77Bbx|yAaMAY~}$)9Imb+OwN*s;_1 zX=B?vCtwPv$BWEHCm`mXi8Jj`W2A8p6`u(!fIYKZHk+~R(TC6?yRdCSf(+Dptd$io zSh`j-ifg6B=z8Th%}tU@@UnW0NNchSLF3EK45gFYxK|YX#{_FqLi2}zB)c*@u}8ZH za1x0*ZNSo&*OW*neG2EK9@S#|?9&=o7wqOM`r8AhWc0B84q4~r2@i4Fxc`vQF(ZV~B!~PX5)6r(1bo526La?%pekTDxDpfXj zUYpi@ma6*S1ytg{Tc&i4KC{X~$EhWXT{*4XgnZc4OQw#EE0KE7rCDhH9PLHe8JRRs zJX=j&M2o<%#br10jT+CL;V{eZn@gE93rWsu7p`d4)d_~ggtY?e(EeCtV_IOeiC0V< zyI-2P=isRBy`~-MH!T9RW5p(O_)L>P9VZ(kX`ZAy)62gO`B+eZP@(u0iSvlLDbID( zcm_{KzQxx=OCog#eS5&|57rYI`NslK2$Xka6#|y0bgheZ|7|A#77!W6iGiLtuM(1#)Wyp0E{3}XRP!ITitE?f$`w-Rbr`;6J#B93{NK2YkR1j&*a)8 z^gJEHnV{A7e&pzEeBW*_*)#jTXY2U;vhqd7&c@f#nB?=H8Qv3mCa+)W=dtm1(r<-T z+f^6P{@S5RT|4~mQdHI4AVetCNRo+#u|b{{L|F!6xBqIciCmx-w{#wmB$*W{`c5tI z|B{^+^yMOLeryUbZ}LFb_}E1Gxt?>aaR3;V3pXsS1!W&@Hc;b~5b%^UOP&F{)p0B(>notC>e0Srh~ za`IFu@JP$-gwuxKie-8t(?avhN9`;kjmcF+&~}dK4+UZ#G{hi`5ZLP;>c zXE_DgIO8kW#9!zq9{Gfx#irtHaJ7{kJz+|kx{l|n$%Oq0PS;q40x0>dgCFR{lU|fk zMPcUXRoH+I%;V@xs~o)WPp+j-4n^oxJ&Gdc5}o#GVv_Dn5J@q80G zTDqmdXEuLB{-K<}Pj-hVpfvZHJpxh(B`vTgV2#+PGKjUo1;-}4jk|I+L85APpan1J zNnX%Q;gXYq>geZF0ifDDBiYgFZ@1B)^A)k_e zY4~q%wOi2*ld4vH0m_^)^<8}x(@H$xf(TJkL854`7D+?yRwzE(3b@p4!oKmP^t+A! zl&j$j=N5&w(lb^=2Gw22hHU5N{XS!+T< z7-GHdnI#eEkX>GSd)MNj)$PX=*7kp`5i{@qT8H)2zs|$=;$f=^?vu_{B6wTiOj7%= zvtB54Q%Mqh?V!2NyIM`qjuf~}>UCsWdRJ`IovgW)IdQhAs?D$(-jHo)9cX~J!JN=P zbeVSndFeI4r0speq7{826-&(kJ6<4H*v%&45gFo{8T&FG0%ag2`(*^YM1LXk0p|)p zURT{?D;N(Ny0)WRs9-?YTR5xZnB`g%n2nw2cY*OzI^eE~it@)PoD8Ym#plK5(?6Hv zaI=M~izVxR#cYIns5NH_WEUDT*)d>profx-OU56^tGWKh1fYHk{X!P{MTf$)q?wAprLnTRFooN3S4T{w}12)h29W}tT zJ>h3((V_v-ojWLjuPKPOD{Q7A?qCPv4my~Wj}Os=9H3t7?lnR5#>k`T{ttEfKQ!I{ z<3O~s7{#iRq;q{hG!94DI1qikceO1+w9G-kdruo)o#Of%Rb>%;JEDsQi8w3F<{g&C z<@-iyRe3RcdepPK7yx@a*5v@*IS!kzbY`TuplkQ|4JEGEEPOqn04iu1>C_7|BvBfJ z{`ShM@4XaANY&zfW`DpcE8*#7cui4|%}VjzC}sNgQ1(4JM^@_UHB4^HdUQol40t;1 z`QM0UK%4Yu^na|1GSTy>J^(_zqLF_6awHw64iD^4zl`{ko2f_R(B-kb- z=#!X^y&n5#OGgYB0-424dhinpC)T?ym{6!t&B=P5!2hIv(aO6g$4=9;Ab_zdA`vOb zSP$>igFDL4q3;4V{0v3DjEgE{e$_OgZQGu^9Mx=D2}G{YP(cHp$DfyIYY_h`ZjZu& z1xx%fUPri z(Ha|DpO&j9ZWfc4tEl4bj~xjL|KUgzJuPVoXP;5U@O zLdodScn_OkE<&y7Utx` zWaj|`i3GcA)I$ZEQW_~S`E8n#(Rb$mK&_7jVjcJMA-{01k3=6F>dZlAwpk;lrJKD& z67xGi%JtqN$#63dCYEj_{Jc%>@EYT-S&hc`yDp=W`5`|v?N?Cp-FN=arn`4a# z>{Kux+Iv>*2d}iI|9rC=Rag9I)mK85Y(Wy` zRFME=m~UR!+2NbC+Gbz#h7W=!<+ta}O}yUrLQjj2wDY4BFU0nIG6&1 zAXmAY6+G$oqvnVm-cF2+KU_3Nd?{ENWhwlv|C%-L{G7GeYDw)uG_+7?(CW@Tt z*J%%KvHo>{cQvjYZy0Oi`u<7h z`G2z6^LS6Iq#R5;g@AA=8qf_b9sEJ5TV$?~(gVH2Ecp^~n#J-pg9nfH4vSxA%~ck( zV7v`gx}1ASp|;$^ zCl@|u4EknbL@#)$ek~s&q`-R?kBHQMYX0UeCMoc=lEE(7SD<{C~QR8WLC2y6(DxjmLp_pBZeaM_?GNes-`=CNlf zW7FVKGup!3{+XZx_~8Y0MeHzIPumr6g@OMuyK;RULxxC2bY(Vcy5fjQWUWwMB*8P; z;@nD+{Z48%t_tSh9r(hkfbGBj-~+UvT_o1Mz47Mggf!WG0^8YM3cfL;9o>W zM#1{Wt*T!DSm5PVs8+yrm+uwAE+Wbu-cwEeSAWsRm|C~BH@N~YuVH{28Ov~v!PClP>1^_l7kqKAKT-7Xh+@&@@|E&p zn(_nK3X0+L^)fVtvPY)N&_H)yQ~V=Bp2sXFiNAM3WI_lh>>|3|SlfEs`eJZ61$oU6 zeE_IMQtO~0G(>2ayhoT=g@#XcPtw*UH2mSM=A8q5vPvj=*&)ULr$`o}&tsKW(cPG_?4a>81S`#39`r>wfllR`fEu>Cp}l zuYg(^J_gONURM4U7r32$m0u#R)=Qp-`DT;su$&MR8%o@Qm`P7!CH$U|r89`=i)=jfA+Y+IT zyw`R#oQ_IZ5jky;;x}GGH=r|*4JoACz~luff-aGkbgIN+KyxPWFoCgv2bo$3!?BEy z{YkNxIOdM;IoizEM8=tXKyA#Vc z7?kcIvvW(}5fl4*5K!4ip__~>UY*}>*934eE|MZ9S-$eC#hkuk_~03twc;6xC13uSr@XyHWI^?V3vY%RglBE*uRxdceQ<|j?n3=K%D5gGtCCi{7fCS$cT zXz*aanBRCCK_{b^UC73^_m0{)@))(My8_c=ju=q zeW6Y;ZApR=(aN8)t`f+s35CH8OU5=bgzdf!$9Uz z&>u(~CM=S_ge^|w2D0Ybiq`2eVT?_+Sn{+*VT3&C zS8YAz8b@hYEgg{VKb~{%`V9Gb@+`(dv40`;J|!j$(4zw_Sd}I7fnXm=TCwAlbjh1{UEy%4NXF(T$>06R2N6nO0;&P1KddTnl^@Ii zLW<2Gq0XI`fj<8_;TdZY4nh^Bd|8!MlYOx2Si!k}@Upw$q!&W>0%;l5Fn{nbc(D9W zt+YSkv5gJat+hPy0uBo;t!@0U66Mx9igXZhY*W-RmuOud}5u0BmIYEvdKeqyyYsEm5 zdl!;|)%<60wmjWl@;RxeppwRJY-NR1!oyp+rVEFbHMB82_w!IItamb%+ZuliU zMp9(d`OOwD*D}HhXYhT*hPAs~Dmu_DB5q5XV1ZH$Z)gKIMp*jY&MfnCB$<)i_zSdZxg{$#s*dxo& zu~mLzN!O3_dHROzZ-0Dk+8_!tCy0ajI#AO{ZKEllSdMJXAw&o1j#$bLLJHUvRA*NU z`sH`D=+63z6Jm7IEH)_}l|?K$d*{fH+ywhA-`Z~Gtc43-r^WA0@(Y-PTw0iW?{6Od zx5nIAhRrCEcHph&y~e(`VyPnvW1 z5mAIPEyZta{!g1MrQ=BIE`>RmApS(>q7?ziU=f&cCwK&!84(imn0Jk$HCO+j(Nrf~XryLzoxO?LjILWSN2C%LkmP+4>zX7u z#k;ZaOdiucI20A81YQxjMl^y#(x7H!xYd~R;5$+L-2XJ=A74^Roec$yA@HvOeUVkw z#ShPRj4MtYMo zsL%rqX;RUseseu?@lUBPwR3_g#}p|&8bO-c{cv}SRR8P^ITjGM97sSr z)kg`d(tN(~#oi_v_l=zWCe=Z4@ZSK3ssYUF`=RrW=^P6tE%3L=%qgQPq%D+C6`;qQ z1P-L^D#qAP(QGvP6gdDK(4GBxnwf~>Nskxrg5xqg<5o5p*r7+`L-~M(;VJ4V`sBg& zvEk7=1VjbK73UxxOh8P<4^{)Rmw=O46IGuYiHkcR16^3hytgMOTy{vzrf`<%X{v?# z=X;AwF7#%r89n&4uW4Nr$(X&S)h=c|OpXP=>0%)oRWqVFPPr7C6Mkvy9ex$-8FFp- z@-E%hdVp(M?bg*7`lYQe@*7!SOb!r_+@nid4-_x)8(CjEwyRhlAjOB@UN*KXTrcK? zY4ULk$S_rSaRnyFSp(`P&6+EtEly5_~_i%9TaEr!}r~t=K#uu*b=TdhKtn$UeInubY@h<*T)H>JXk+Rwg?#o(HB+fAIhB;POsQBqhb-9Y4 zuE^zwu=r4#HLS7 z!NTz++e+VeLfvkwC_(G5gaB=?xczJ)d77JVB{`V_u6NUOxDUHMm))M-!93M-xRGo27<(9Yj3aO5#BQeu-?;>Jpy5J%iTmgemBLbB#iyWLSOB&O_Ru82)k85cap zb}QOAc8rL<5%tt66P-MibAinupHGW?3D!aaX+ihfRe|y?6{*fdS*coE&hd+IU=b_GDZxtsuzh~K3^|E zn|K#PCss@L#ZG+DFja`4Mw*^>+C_ml z*P(ZThC zmVqUdr&2|Rwyu=OO064%>Q$-(i4IN}i;6ETTOz651x(7l$Ikfm*b9x9Ygp9%!f*Q) zOOJ1FRke#nH9N!{x4S?YDM=SQ;Ds76x>!`iuL+x@R)f8`L)Djdm^C3hg`o^Fy=}&F zT6*U-8|E-5|A2alk_}UYBd%f<5Gf5O{jYqhUWgJ5K|};8X^vhtVX<1p&p3VkYLZfS zNLDVbc3VwOrmH2)Fcz6A8f>!;x_7hM6Kw7dUGS&6-!qHy5(n*~qRN47O#*r^O(2Kr zj*W|IZ({}OmJ^Inw&Aw?ZTKfO;Wu+IC=qWaM7#Oj3`}_Y__CO`S14HI+Rm?J-BF;x zm?|zo=49gGToMmJl!}|mn-9?m=?91H!#Y8;3U}NAC%mM*y*(^1RItca<%Ua@la$HA z*b~MeC^+UaHcVNpcJTrQL59uvvEDcyZ`APyS+wQv=#BcZ-Z)ro2hS~jce{K(j%!}a zAZvD3$N@%6uIzNMJ)Tkx0HjlmcQnk`zayYYw9G;g>snVWvBlVuFlnqEBzwRLG`L2ITCqy z8BqTX6gE00foz*u|1x|ZSPmT z2Jx{T`ajj}|YX zx#DQ?QW~P+AE3eH{xTY(;V)w6vOw16LE(Hh`qSgZ!HrQUAL}SvTzs01p_Zo5s!{1! z-G++KmPU8~(C8Ld8eO47Qz7cotW$WEWQa zzn+h8RQqT?KBD$R`S@9Ce=i^3to9G`@lmxO$;ZdkZb5b2Axwd1S{%rAsE*h|YW5io zVxC=>BFUbBef#PaQ1m>KUS3|PFT-MjwSUC=_?pyBcv&L!%J1C%ULMcxq$8SYJKAPt zfi*juoI7ok%Cyp4_&U^2F78lx0MAyJo<^FfC6p!70!~XUq91vfSCwG4?R>rMq*dv4 zbluK?q!poIovQWs?rQah+{LxMC+qF^S>E9q9bF>f=MqS`$i!N;*K#ygP{gW{v?UqW z_agr_1y^lvLzZ5H{>;`$ZtW<+W?(;X)%cFyK_|{cdG`fA^x{^Yj z$pr?BkG-gNgeFRYk%FoaZMtq1JJ6qP5o*eIP z5sobU>I#{Aiu20I=ST)17VHB+b^u<3EE@jVY$o^@wO&xrW>D@@@J;F5RJfZrsIORa z3-4@^E6UtejUM&geRfFVH%g!Fkg1vA+s>2qPVh;3>MpxJUdXLdcnNXn$kk_M4(=|0 zr%0t$5jbL#&2V(AhH#v#FHiE`j=0wI3eZ%_)^fVplVY9dA@M4E@>M6tI~jg@NY|?~ zko@wdEI-~}^BIFODOaQE9nnb(XJJHy7AJV+5)RLYbbxGQwlu zD34E#gSmvB2B+$6IvRF)$?>0_lG6QpJp;&cZS|u?6N>j_iqg7IVAQ(2e158Y$rOdZ z(g%0N7Hj}fh#Y{CHrL{ww+p1^0aS6LrITZ&geO`)GO1V9m6RiBmvIvKuZ-{2dW703 zLlA14)nCF$SC5u+DEV$?=7l$u;lDcGE!m217VoV`Zy(>Hxv@~!^RK9GL48uAKBwDZooF1>}Yw@eg1$`OQLB-AL zOHQ(#=t5HM(JIdJ>?I0dT(P-rt1jiH^FvvtSAc!USyrw2klcW7^lL>jmA>WWHB6Ec za%^P`d_DiIF!(moL{){j-Ug$DoyknE5mQ&YmCxOWL($`;D?cTs#eB9c<>VVf1f*V0wJ(TDy}ngO$tuY0b+}_h2oPLtV=c z<>&5Jm{P`otg4N?h81S&@a^qmdOHxGRapS=+PI~B4xYNliTxi{ml^ScF&)!O$h^m@ zdE}6hDv9KWvTNyV1QQ4Qs8O;@In1DMZga@(pKyozW`P4q{# zZDp9}`JmU&kh3^~Sg~84Ks|WiLv15HCnpZeVCZA^@!bzq@HB^)ja@V%O&>yE?Us>J7U@ty zARBAdc4P!`6Nk@fK-($p0FU}U`Z-yzEcXH7B{3b+=n)S@BTmhA!tjNp$m=LP^64@J~M}O6AYQo8@%3oMa7PYo0GaYtBiN5rQv5j3H z)!E2G+)?$aZTR8q)o0^Btb|@2WM)w5cVtiDRj*g&P(R0GejpQP!5$LXd(h^XD(o0% zq-HF?p9Ol%k3F<*M^lH&v|8+(?uy*dTZo(XB3Se6d-o*i- zRA9{1fx5}BY(7dsJo;HNA{@3qBUpCw9O<^|vQsqNfNR+C5MD@64!^rWB=vVE!2NNs!_Ki7Z_O(GS0;u8Ru@{p@i1MHnvnv zeL7z6#AR(rnl=uYyRpRtw|SP$S~ae&V((VU=RxYj`e{3NAolwbOiQ+V*SHvSuzWD* z6w~5|wwr}S3JTGw(8@;Cbt7uod|S?F4l+^bbPDZolXEVCs%}CR%U)%I&a$Jl<0Xg56Hc}A<5jspwa~DUB(X1 zj(0Xk#?=(XfGSb}MKjz5w8~0T@6-G$nQC0Y0iwLXrYgC-Pa^GgTBkW{m&e!oX|kP_ zjfGqy3(>x{amDuTtoTEgjp-$Wu{UcgR;pu^$%@5$WyX?zcImz9+UDiumor*aX|%&h z8kZf;z9zd9fZZpaX0^89X*Jcfu;ad6yNr`%$T1r0 zr*vBq{JoNwA{R4p{7E6Nn9E{y1B#=JctGf$khDQ>|DR2+I8m*v46`ij_2W(s4&2Lm zWflCg{N%8SYF@EXX*azhmqZ(B6k~~@QIso04m$FhTS*L!id(iMv%0ig(BN}tRRd;S zAsNtD+4XfWU{I}(5ZRfoHl_poD!V1%{85Bwvyw*bEgczbVN@M_uMsuhYA?DaN!x{e zMY$mCSJ$urg#D<)NeEx<7}3a#${jeTP2SZ5nt)QjxwI>uBKKowhKvOX5?TnWs{_JmBTJ5M}WiBi1`Vcdhv_7%q1AoMWOj}X*^a_;#657&!}bO z?~Nr?*8i5k$Ms+C$l{^nNjQs0I9D^fzOItge^6jrX=;@{-}K#{PSk zNo{)}pgkYs$|Pvm5hkUn~Qt-4U_jvX>K`+8oFFvAy@5kRap(lDEo_S&0qQPN(2 zGcHP6c+R`k9=aJ9CGBCmG;moe<0JZflih=`T-|8bAS_o$ZpKB)_s_Z+7bWe@b`!#K zb@XOjlzcvRbMcYZ)%-DcHNRn#+}2Lu_#{)}vCAC@gz_g!pNLcfcX$qQc*33#p(0k6 zy!jIjW-2X?fPbAD-R}j$c^W)nt^l;3TP0O73om37(OC2T0L*Bv{4P~I zRPW3VNR^ zic_Q)C>^0Q#|^7lpr&~>xQnSY1fpm~Yjp%C@h8~2LeH3xm#2&olWWNbzN&B;Pp!%w z!Ai97RcR(^<(sU^c~_%l;igyR^8^IR$7^Od4p|Ym5tWR$g%n1A)re7>8st7!j@Kg= z!^0ZSTdh1PW6DIb?W_hW>B!q*+f@1$hIbFLSRm!1Z=wOWQ8Lb3H-2zu z0MMtx4e5qM0ujZS7ghF|=t*&Ml>}Iza14zuK^GiDzhKTw#HB+@UE)^IhQ~}mPs{Hi zt%}L%y;FJuamIwVt6Gzb&xG|YZK4RVaazYr}B zCjxlHqOcwwxqd_!11Nqbzytp)iRA@J(y>%Zc^4pq={j3Mw$m?w z*9a6zNc@kZvlcK>h%*2MmGDjgOLYPiy50pyiKPZeP$&AY<%5g=LZo(q8Sr}v2o5pN$h=duS!)J3ed6Gs(~+gok%#o z;2l$Kg6=`0CYrE8caV~RZtmTUxfVcokc}3)hb?qJo$3`x%*ymZVqT>|Vx}arB<6iI zg6;&t>juG>P;jSrqRMIxt1PT7yH+oM_GBolPOQTAX>JANf%xZ;Y&t*qoWmaJg zGA1T1=gUBKW65h`y8vixFtWc`6g~_JS#CcvnIy{n>1WLmu(2NEafl#>e7@fgaAEoE zGbq@QDM>V^8zd@FL{2+QXw4BG@QQ5%-6_&m0TaplH9&0^H6O_)xJmXvHfD6kO&Z}Q zjYJa~i6%4(kEBs}B#p}1&?py;WCF$M+nWMIfkG@a~ws9<^-uqG+V&w zxPemJHD6OC{a$*t%?o$CVop137lV+fym$?y@+8;!h_)_ZJse=40k|FifMsqW4@QO{ zQ8Hy3B3rN;BIqQXhqfL=R6SZIEqATkC~$o&H-^2kHpBQD3N=G9^}cObE)%%+BF zy18vJ=)3>_CJUJp+Mv2BTB{?|hCk(kS87DN;~W}TM{Nh45sUXcsRdA>EdN6r zch+Ve_YPrxyMuK|eluc2*Pz7t{waZM%$7T! zXcDF^SXMxcn1B10OD7B5lEXVg+lUZQ9{U}aRu=HcXq?#P5Lu?)(qYy`VgL7>90{A&IklwUo$YS!0j2W)o$t;RXGhwO5XEmY7nV7WsB=8$)YjEjTj9Bi?% zVc3v`EFRLo7?R5Z(el;{zv8Dtpm8{`UecEN6x%pWp>sL~tKXp__ttkp6qkB5Ig0F+ zKif;9Pn0`M{W3chR?mZxtXQP?t~PJGD{UyL}IR8LIde{OBL)(oYv|U?xBHq?W2L=Ry2^p zbsEG;aXphG=VhBZ%qPz32n|vt!B8?$9j77x=0xJqkED|KZ^;oe3!@RMDrFBJ<(}@I z#3Hu5>fMPpqfhv47F1z{J;rpwwxP;k$b)6>!_a^&vVSN$)aZ_HvC*=&+u!(Wk6g6o zx5c`6oJt9j=sA?~0X->bgL}F3MZP}Nnxs3QgQ27bF$n?AH2TCszHOH89-pvX03;h5 zSO16aCA~tyjU6-fok$lrIXd={L9W=YR%uKJ*0U?{ZDeo-W|A|&6ZH;Rrs+yY3L>l_RSbvs0~@8tnwB(@MT z@1v1IL}O%{fM${D!pStD7b4TRl|-h=On^)$!hGCRr(f8f@0g`@k9IT+7M+bvKa%#( zCoxDGX&5vr;z=V?MGeQb!|FMH} z1T2~@P{T!2@I~mMP3v}3oyic8SP!^{sFEAj(#IX5ve3s(C;^L>*>}}0_(H#MPO-_8 zJhWd+G+B!~&`~_O>W=z{VKYl6^F$Dlz~V(QK~a3oaRUWp-A>lU zZV?$o?$4UrQ2{~vyt<}xni7=~_?H08c(#_GR44>lfiC>S~2 zw^PLoC9R)k95fLhtop51X8R=_VF59PHTu3Ns)s$|zdP#%V*9X_F14_>RIQ%kaR`02 zi)bVt+%5R7mYqO7{VAe8EFlQ%WG|H*^-*2j*EmkDeg34XgL7JsBE@G{mCiF z_gb%rkEioV6)aFm(`tk6%E8Kt#Eg;!mhK5GN06$q<(?s+m*U-0dpca2{N;rN(Z_07 zbHHRAoYPmy&vPi^Y;pOS1r9H0EEaJcp0hBMN86~}$AeYuni>bwj)ylaMyk(p^HG66 z5ub3jL9#m|5DeUu$UGgmVsft5ElVF-K#br`^r1mY__6nFa;=iU+en~7XMvocq_Y!N z+?stFE16y{HV}n6C(osx9jfwL&7j@K{Va{M`4)h}t%1AzN$S`(q23WZG1(Ck!BS?}FNe-uVrP$YhYyBug^~0Z$oFX$KhYKkAfQiB0HQ6#c;1o- zomI7TC-&q@QfvpP5OJhx+Z)KiZZTeLQr3-p5dSLal@pQ7U?fqCNw9CxWJ*37$`pw^ zviv?+3bM)5tqqPQZgr*2?zx9gCYxZTkZdyWV26RrCZuf374a0WU`yf)H#N#a_wl)W zaaMlm)U1|XJcjZ}Ip4HWpp^(zaU>p*^MXd28jUnHnk@((p=jXq$A=L$tJhuZ#^gIL zTJBS@=iuMEH}ec<()m(NWlrfRhC{_(hgrL3?wmo z0E_4UHfOfM>=EL73>UBI2;4MCy(SxCq4`@ROCvXhSyX$8p-;aliv^xUt&9IBIt49W z&~05agJ9lt^qTjutnwREelEx`8Qr8F_`W9BK`v-H5{PXYr4}XM!h@vko{-on{gxO^ zh7#9U_1|_wQPG9{R|@zQ1REBJ_kMiIH6ynSld%nH^(8hWJYEIT7ehm&4I>#vDyG>C*hdx{R#j~sYhj2%Y~4h2nrwQzXS$Ho?P0?(nQ~aopZx-X z8EjW@;?8!765?qQC0y)?8gs34=NTyTh!V33X*K6g&z(Cx*JX&x$K;eS-EONGeW3Ta z7x#dv+1L;rgcaV-;ya-?vvgv*Vr`rYVz-n=IRLppT>%dX!7x@nhQ7e}6)Nu@ubalv z3Cna`?zR+6J_P#`FOk`B0+UMutQmkbwh*reE=C8f+oFZ)&`UOU!W{NXFL9ERT%72) zzNr*l8;urtbdF{Yc5WwQGy!emEJDg- zV{wt4lMcXwG+B>R8A>UYv6grCCJiOIbD|*aT+pXsv(V7J4BkPPa1cLLFtV6Rq)!q4 zR?HCDNI>N`wSCX-eETelpOBDX)^T0)q~oW752+#0Obym37sX76mnguO5(Q`;!)R;P zTGj33k!ho?EE#;cRpfT~3)nDM>|c~q2EpSi{f}@c{{zJ(=ZFzP>EUolln%**=9|HOv?rMzTatwt z%*0Om>b@}nV}#v{ZM+2}jxNw#*2Z~n!z#doBh+AW&~oWv;Q52gHfWG1w1vVS6XHuA z>)wdMEVM^m3>Y+*z!D`5%Mu)DU>3YIbx{A_c4U_tY`Jo!X}N(0Q|~a)i`s!45eCi8 zERVR*{0ss>WI~`oLrhz^GDe!DLP%a zV|H%rwAnRT%q}dR)*-oI0INJ(NwDIj6y1d^BhUy>sYitKv#YrSQMNwmAW$|AAe3D* z->1X%P%E6sPTsU)xM&+$t}_*ROOLw(I)J?8?4-j&=%15rL)M*(Y8a^dtZT_&pw&HX z*9BmJU(Xagv5tG)V%arB%hpX`EkDW-oy*ADS}?%p)plyGe9A9{g@&np5F+fWahZT! zape(33H`KH95o4kbA4~nTmzIlrnJ7q1R+e-=175i{b92_!L{yiPw1dBDr5xEOwsjG zp}Dzy>0Hh6^DENcD&hG2iQ|t${%ZbR;a{g8ctkL(^OcSY`?^so6eS~HY46>Y3Fc$- zd&eMoGktMvd50$Ww&p6p0cv9fh1S;d&Fel}oF1zX!+i4w{;Y>2KYG28O6Q)S%L&49 z^l+zqkTS(ATT{U;_#vxI3#a}CZOR@Au<8WGiDv;c(=(&PW@b} znrpm{!T_uRhLL0qhNGMU1{(!g`_Xx|1c+}_lY4+O&X~8EM)3o4 z`?RKCCUc_g*$W#Cnm@xj%OrdXyS;x~U`Ja#p(Ug#c@+bZGDTAQdr`Vz@*Ys<EOPE^iprSwvT4pOS(|VE-QRKOI{mluhblE2 zcpQh9(eD{oxQvU5-_4vlbvN!}0>++(Izw@QX^5FXg_lH_f{G}>X?tx@(awvpkHIRn zG{SpY$nug2u{z8%cKT5{!Bz)Z^yBwZ3C3#R$9A$&F(JsOqk~|Oad4E~#TIUWLKT?6 zp2HrI-|D8^xu~TuP<08s_ty2KN@w^A+l5FhFpGl&bIi_5Dzxix7iCmdn4A)ZuRqJ0 zKZi`t%)qM%AeRaJ0zj_l0AN^0K-J`(1ga_%e+5-5E%a6Xl5I(P$+q67+%9<>?}Bx1 zuNCJQPrV!~tNlq#fzNMhf1tIGNfK(Er3@qS0=J>w1ezghC3+;yQY$!L8RKGTK?Fv! zz0$jM$@a-P_XxK@&Xh>2OKYVd(U<|vyn1r(S+wJ0IQQ`C9pn-0Xfw_|zEliG5{yrn zp7gn*7;Y@HSn0QoqOl3Xt!Rv(e89{eCKH>4ymi^ulVE!5=q{dJ(o=Q`ii$2{b5l@g zPwePGK`ukx##SV;6FsW%-RDG5>2(y9MA8mcXXOiLb*l3JMz-~%K|2vt{%B(fhEA8% zmnW6Jeq9u-i3|9)gAk!nDlrHI_b1~)%>dKa9>{E z!f^ypyM0n=B*jUPDT$@J7ZLa;GX7yIE%KpHC=4p~q3j?E-+9ZY=Jz9*s*4j4B^ir4 z2asD@66I_C$3t0$0&#AopJ!Q~;b-7<js9#98 z6WjQlg+`u{QZ1>tGyDR?B#Lu5Nlf=*4&8kc8jQJ55>Xif0%*lc$mfU{%SuxbXPh&W zzvDl4wVh z8C5|Xgm@|l;>YJOBn0?E3J3lmGsame_a84~HA+)OlC+M2K3+!b`n@5qhX#d8GI^c5 z#tH`Ula_Hyg~Dvz$PIqt;76K#E+R-a2N|9&;(4sZC@i-S39J@h!BC-QVX&R}*A^Nw zzRLdyFIJ8u-Al*hlZe17UmCfy2K`erqBg8WX_P-?foHh#5|k`5GB=f@G;^AgL&_XA^LyKl+Oughl6eG3xIqowqj?rwa7R7?xq>FF_Gbxm+b%L;@pMWCz^pbH-PcAuhVS{@*c^P7OiN(1o_qzuh zQxpzvQM8b999Fjom3(Zg+ZNy`a&LY67qsZZ^&*B2RDw(aUw}=k0D0adGAWemZN-et z0Y`u~%H^w^5XVAA?jXkKzdMzAH)?4mu4cunlJF@`gr9o;ECbd+1eEwZf(}em5|N+`~ite6Oft&tMx>{jReZrB&y_@ zLz7fW85#asD{tY8(UTK|;I57pgUnW?wt$DwDiVmq0ZXoEmj|oVMe7+4u(iVu!}Qz0 zo}5%n?;WW)gsYH>BjoKdrQ!sY2Sf0B|6H+fp?JCN`-E z3^<2m$a}4*x`YFZ!hu8Cc8V;C==#6`%n&P(=|bl&&0v+-eNc|?7BclxN22U(fl+BA z->e#E6%(YsXis$=tL*xGUyTI)Ts)-x>+>r9Za)4>>1oDU*bUWiQsr(oV#H3&>iqB@ z!f+6sO!BaTMd3S+T?^{GV1=SH3PrcrWSVb!%4xEeNbMIbF>uDMkO+OoR6)Tnv2B)tk5F&_^yotB>89-z6_RcD|qoYLy8%FBbPqTEiIGE7bQ&V4)RV-}+^x=Kg1B;3o>hvxKCE&%9ml0V z_tm|VJZ5Bi{=EJ)ps&iG)SWwY$8K2Vga#1-fE)e8;Bh_B25X$I@b{_8LBfv)T^Q*@ zFfvGWuv}irZvR+DG2?!cS1h|TQEa;<(rB9ViHXqCvxL-EBS!8>g0sdlJs! zZv|_yk*3}<*V+EyNhzR%4K%f2I{kI(z5QAo7GE=9Xsgm}Qv{}Zc$I{*R)(3KusP@u zG6U&a(LTKxXtHt6#3Aci_)-+q{@QVCM#Qnc+kR_C2(tcKRRJmf!saK7vi(KDkt6=s z-Kw)<-yN3i#ol=Ft=Wt9{GN77DZVo8MtE{I&Imh?=z3a88z>pO7$|D*8Cd|5!C+m> z0i{>)w@qN@tr-#1^r9W%k)GK#o>4Im>FF=}#r#GqQpc9TQnIl@6Q`<$b*)I#qTT@( z9qBM8@oj;HqDHfHp~X~10wWGYUSL_O2XBX4i4v#MC5vDSG{dDUc5x!#_?@awS+M0~ z9brz?M&Z%g;>JRag^CgJ%Aa_}x%O|GdSm@$4hlwvjuVR@f5vJYYe(ASSbryHMuCgy zffIp^Ks3o#yqIMAiKN$a&~ACt#uo{y)qXo5O=LVFam%bWzGXpGhce2j-I`TNgj1*> zA|AUIR%Re-_)J;KriHo1qn5vbOgA0u1GN3sCb1mPu+k|O;s_&aN5h@<4FDpTNE;bs z7diXuCsY@!%7lXUWK`*rv591_SK^>Idu2j9-GBq_Ebrl!iS1^?C=&wH>WKDA2qT+~ zvM=nc6a8>tuLNVAeg{cnYSK@iNmY(gwc){h^}1A#cWWR>Hlx;VtP!hw_5Cod8u z(Pk+$l-K86at)24`jh$1j*W{RGL6WaNjJzSXpx93#R8<%7;~?gZ(YQFbsoF4wW7 zCE4I?KAJ^BkSbR_10`i*{NNuLxgI{K-kW^%#$1=rLpLd#f+IX{2G1h`L{H4u(qz?d zjWB;T(%c_scd_mL=D%_o+|~SxWk%eLjBqBzgX?Pqbt6v@8v6&IS6})44&p~T2NA`xr8@t8K@RF)48ma`koOGgTJ#^3^wwwCoFVw0D6p>KvMjViBbf7aMpi0+x$w#O?YSD<{1ku zJ6q@qe?V^^>D~!g<`8^aeuSgR>~+qz(m7!{xGletzewv~qoiT;Z8fmJiT~p70)X7d zZe?WKh!<9nLe#0JgWe0OsAEP174CrQt8fQUS0yB{!X420n=(Or0Rl=L{8V;sWsns` zkpm3|E%x=NGiB_uu-h;-a503|`2BwcxQlL6(C1>##Q<6Jr+=%jn#=AVUCR@CAE(AE zE>?P^(#QGQx~osEne{s>f3g^TRxs@Wc;is<%e$+aG)RNJ0`c z7f1xYbU~YGt6*8y+rjw=oKf?}fg_)Io>)-(J3tn!SfdZ`wo>C?^I+QAs98 z11=h!gg)^}Jp2hFej_vjs|*>Bb+OL4Dvfgo!y{bZ<)4o8X(h`h>DixD`l}8pdQ@SOF=oj3Yo#CBC<5Mt@b0oMM6k))nJ<0LeL$R!j}HknbiW!I{`u{BRlNOG zRsTUpH6WvZ`-OjVw0C0ktvwshwr67A>qv+bxR5&DI{-l7hcPJG3S2mr<*cSE&ajz& z3Se~6EZqAxlZ_$0!f(U1A*2})@qYSJTYv!a3u0N1V6WD&oTUp3+aov7zNXeao zm_Qci7O@x-GpmM!iD(Mg#qh+(PcJ{uN0m`bFV@8w6EfKjboKPpy85i=^b^4h_LC1~ zf!WLuOD_T&VM25NA8qdfZC75`dG5zK=bn4dO|nxY#kCS;-!qw+)RTx*J|@E9nOZqaTZ2t9+N0xeYvD&V7Blud~Uw3eW) z(%2#*qM|~JBi(8-pYQMY`|rKaIXB5oC0LSu&pCVl_y7O<|K6`Zr^`VR^69cEcF@3F zy(z0D$|}$GhSM1dnxaFj*6M6Rfi}};EN;G$IHG+zQlkMecpFL+TRfkin?g1}Xn8;& z%rhbmMpYLZG#;Ff(s<@dToUS8e#qnq2SG!laCoJ9)9cfN?V=@wQ4!^gE5V~9J(Xws1pQ!)m8D7TGa8`bv~3>3yO zx-U2w&+vqVE-JuHq_t`zcfFXd#$rM!u@|NKDf9ytfD8-)Ts4IFt!4Mn9|_4~~5%uU@oXB+!S!TF)s3dGnbJBM1DIeqxIN7)ZKl!KekC zcnqJz(Bmgs;rU8gu<}jdhFUjJSOs)^^7@oy0P`pVb7&RE?Iqck_6nUF_+Ggg{D;M6 zc3F?p&Pj5o0lrj%0T+dk5${pMxdj%R@+w4I(_wWRx~X(|wPU82nmYesxSXzT!(Niq zk|&T?3?8G3>o)Gh&G=ws@1*QCC3S-6WpATg0RYi6tFkl@!@$w-r58#a%O$Q?n)3q~ z`HBS8GvYUfs-y}yzcKe38B~Y6+8Adve>Pfdaols=UJ}Gtw@kJ=GaX9<-Cul;zF)_k z@euS2@l-3;j!p8La1P~T&vK-2$~CY42YrDbk+{T`lo(eJ>D+6_`qKOB%=$_}K)e~8 z(IHR+S!wFVQR=1UM`=bh6W|D_yqGkvd<2dFb~K~vn`wIcM1~M+KJq6#qc4}LZ&q#y zrVHI-g+smC%J3UCzd>X2G3rQAO_wJk*=de?6wCtOnuBz(H?hevk{9;;3nQBi*%X87=i79zov{n$&X#^CHG*_gD)o*@Wt<(W0_<7o6wId2O>9M?%~YzBtXxxZ^Z$8$+^jOhp& z--q79D+shW%1~(%p4y4Dd?=MPnS*b92_t3EYdSquB1d&fXF+CB%QcN^Dkfy?0135hzRjv1dLpMX(fhbZ@9nuE zG*A?`2~CN@0@6{P{fNmdoTW9f(3w0*oFb|W;lv@7Bg`SCgXSf&JaEPVFlZbWZd|%} zuKq-Euic0RP}NUD*|4gcv;T$5@-2DI#ZZSj5DqPf{RV)j9m*o&&W{-PW=$!)L24F$ zr5>Ld!nHsei{P8_80;zaK+T%JeWSQjlcL9t36Y?YI_+R7>c1K$Z`T3;7S)qw;vwLt z>{m=lyw?FcQ_eg!BXu@qfa;&5WQ&&X(D(!I%GIrPHFy0mwbY1I&561)Uc9A-8bfgl z1!+gQT(i)Xaq^)}QagJU()GF2O!wV2Xq;}lr0jjaAz@U zlwnXc7b1!PU3|S4tg{8ni3%kE^uy4`qkJ%XNACIFa=stT*3?AOrp9DUh@{vrLWq+B z5J#=;G4wk`f?i9^+wYlivVjru1zM*kSP9h7vKNL!5B_K|%VHd{1{)I~ww$K0gT_TV-^ETt?_P!JP+en9QR4z=L5B(kdu~T2?1U6c*W;W5;GtK{a`myzE z*mxT=vk|qZ+lY^Gsh3D10Q<3!v?`QhNz)Q(x@yMMWA!x;s;{`HW^AE_n2C!uL^6)m zR*%K8iYcZ$M8r4{7#A%J4rOJ3vSrm4th`^Q+di`KMOPuBo`+&PQ@cVTTaq*6pj3aB zcajE2#gNt07@ded9>X2j+muQynEpSEtL>DaH=asicM; zmF@#J9W+2ravZD zf#R#J6bx3`O^l%GHkME7iGVN1*M2x!dOyYvr~s6I64jr%<16Hd^y*l>gQ+?YeI3p} zm(tY8OW|;F-LS^$$gFt_^%hN4Ts;wTQYloJiIBu2g`iUVyK|%l}F0XxIMcb@nt3=eH=b?RJaqx6F^%7%l*h zXphE9IoA*hS^$Kh)at@1dWyoL+-Y$y>7S@Dt45EmG_>rGpG&LxxqL0s9GH05rA9zx z3)LFGcx}EqZ<_XU;+avlJ{#2N*YaHKtQWOQ<8fK0TqJ$DsM{--ElAidLte4i6*fn@ z;S@_tXAsB^X>i%k<-=CLr$o`v@DL6d3&FFcJSvlkW7H33{|r`kbN0`q)1z3~Eijd2 zI2O3${uPer291v|x7j$z3JGP=CoUpK5RGRiovBk&J2EOAW7p6)Z*MbY=R~YohetX72APF2#k>?Mm&3)zWkQUSQf8N`@6!A`cITO60IcU_ zhm#NPpDx$fsFfHteeB=)TUqlY9Un>E;ixu*lgZxJtB0Hv=nY0XYWujMt{DS-J&Ey4Y)5 zcFEqR(3pw`>_PXHr_}b0`IhZ``>C_@4^D^8&-_qsemo@!`1TeXtVLT)nV!P^Z#mcu z0lzhM~OT!!; z>ypsIIeFIn^mn?RHq$uT^)R6saI~q-c=z}LRMM$>sy1TmLyS#kK^i+ct~77`0BjOj z6VhN#2V@8@nX@5WPK{F6(dN}p(g=iSqZ3OXEy1`r_KId#gN9ve$)$y`wZ)A6^iC`p zXoznnPfb8!kcps*`Hl28phCzG{z-;F`$HPE_*;A)0Km8cU48vPMXMbVu=Gc~HoC0X z9NYFPJ=P%9(H80yM4H(mzM-tS0OOJ+Y?Q!TObFFht$Q)u*1XZJ$pBFFU^Zmiha?^X~`mNZAC{Axc=Z<-9Qi_bBbf1D89`+fv-BP~R2uah8W+|F( zdzbe;$(nzIyBXif!%)goMH7urKsW7#kk!hiV_Uoh3K1K6F+~3pHZ|__U6n^6(X=;1 zQCqb^6J1b@_oStJ-;)-(qT@-DzKIdR(q>EVMveD9S#EwjufCPBqvc5?!p3yODwU38 z@ptA%2j#u+viB@8Jt4&`8}<$_5z_U?0bFMKs%Tmm zDt*dIq-$urPUX;}##^dn&BuRK`1FdriFPU-EN6z%sVZH`wamo?VDEsEHIIET28#YC zGa%${_#zE>#fLcduMzxSVXJ`yyx_tK@)vk41erq(cS*y zJCu__hgGZ_sCsw8^O-Tf(v0op<_G4-j0P@-@4YdFh}b+_lFc(}ymyP}P`co!9^R@e-?0U5fw2f>n$b=JdeUkZ80Fj#~}cu_}aQ}zLI2A3yxa) z>E?&Yfom8p`?%QI31FV8lR#D^Y_d_j9_=;7V%E~8(SP|%%|yARQ34;3;+fPsK*y8H zSCNkAX)PEk)!PP*w#M|+Kw1Lu@mFk~J;5#J31WA?(CV};L_KJK`H|)XhLpSho`T#_ zn|7Cccg28^USMHScMvNflhA;Qs99$Vp#+rX^D_b9zNP{Y3yWx~6$yUV;!cL;a)0yj z*UR_Bm>+m+&YrvW18)ky*Uym3iSpB00tvuH>p;Ci&`ti|VzI`dm(41kxDJJw&Eyzl z88Nae763kz3umm_`7M!|T()ODl>sUTqkY_$n1@@hj$4dgJqTPn{6|@VxRJ+>|FqZn88Q2*n7dR*{`c@n+BqtVyl5Ui;WyrZ7osK^bf;L2 ze+O}#qbzbV`H^xlzo`fN3nz+fHMv$sCbSHDl}h1WIMJ&RzwcII?%Jg4?G!e4=vku* z#{l>PWuLbrX#GeqF~O9A#-b%wf}C3$qGOx`l}Z2^YKAodDu}CN>$!ol9jY_rZ%=l- z$yc!yJS~bzAuJAN_YoOA3lRA*X~Txkl;27Lk`Ko-3Fo){v-u(u8J~fjc{{IelVmhs zf^8VgEwn+{Kb&H-jS0j=3?%!D^SOA5(X2x{@}HYm|1v5UoU`L2+6eZwY&mCsvHaUE z6A#-7S#S4R-dZ;K^I<-oX9vC9CAPBgm3Jsn#%V_7hJ#$gk}WM#SZ^|XU#lW{;!y3Bdll49bDNv?sZuCA7Q@dl z=9ARUgzVPlzR7TqsW&>n1g8dqvl&Y;CHRz@u!y?V(my&s(9irXhOOBTyT2vs(P5leB&kxUr%r8 zvm6+N(;}CxSK*lG_6z_=V-Ze|rzcMHdCj-19+~(28m$OwQhvZvaZh7g)POyik#2$_ z(<;nYxVdS|Qtiv*Usm8qTB3$@!mh14QQlj}aV7a6=TQIEv#ir&4W#Yzt;W|#1|*P! z*088~!g(7BC&C(rkl|k>0E3(OE;5YgBmtW-o`IR=&GqMb`paDx%R1&e0 z-^B^2Opx3XC6FKL?l?cjA#468DCS*xr;orhOV<+y8!d1#S(b1D&xe)(^M3N2nzyLZ zYfekat2gk7^P#@C7WU}c$Ef)pv^iW3pnWfz(7jz~Z>F`}J$VXKii1%6XubY|rTR1( z*h3IVtLjIJ9)rBXJY<+%n=)@o>g2!Xit<_sEI0?U;ZdRFL*@o^*Uby-_S}dFD}y3S~Y59ihrn4SE*}dqOw$s z^V=nL$VT^_7pj-O*eNBl3``p_N!KqNk!64vVoU62W(NkdJ3yeK>|tryrYXTx?%)k} zzWZz^SfH5vPH!L_*~_;Q|FPX|+5hVyeUyNrcm7KYX%PH7Q0Fodn$6iPjOYJpOze)| zjKxz7A%(~;>Jx8uKj@9g#z0377ud(Y8xg3$LS*-MuR-tsryx^GCA@r380Z*At$Ae4 zwoT=6X>0u`myd0-vAv2Q31@@`m#v$8TcEJc$lJh3!N^O1#7MAmL}KPSWL0iJGBmf? zEL$8!4H1ZZ#k-CXrO=JHgEcFz!BlB}#~Ql*N>72c=t0VB(@PnDT)m#w%CiO>JdpsJ zHqvrCIH*WgBAY6+B80$r)x>*K^V)%uyu*@ybpsUgtP z5*cv15kpd08LdJA#SW_1Vtl0?V4K~2WeO%YLQR~gN`pr%UcIFem3!;AJQ?0?MNb=c zdT+^)!ESBHRv>DEn&JUASjmqEe2s~=F`Sk;DKZEz>Rt{#F`uJcM_cFhY4r>$^RY60K zh37n?yeTurePxh(mX@Z%O+El{%yRRcl+MM?8#hk3r2x(2!;7Aa*{PtL`q109yw+=P z)5EZ~Kyx$lG7A1Ms-*1iBDKjJ?)HhUM%BNThaKq62F080oTDmt?v!dBYw2rlHldxl zDfDCTX7|r0g=m@RIr7cnZi`-Pu3TO*ev`T?O4`XvcESD6WIbAvsk@ z@6Ztm<^`K?|4G(p&2I}{u*oNv7G=bt&cSVAbPN4U{_{yXH5cjBT-2C_3k4~<$mPqW z24T49)C4X{Q{<7fv&%|+Z%W>S9%Ko-NhA?HQ>Zi(-gU2v@n{%3y zGzBn3Q}ZLxR&WVn9-O=`<=kEd%)TPB*!Rl#n*t|iPaHUl1*5{c=Z7=hAPC4T(`aY{N;PF8aEiEiZLMs;kX zEEb(HJYyz|f}2vY=M` z#AZGPFiAC1n8Ba*99X@>01+v$mP%!}060^{xWgQ9urF0ILYl5dh>uNk*pFKI&mlxF9B7$#$UYb|0D_DZh)`{332_hD!=s7thh%q)< zqB2(h1+(%eBUKi5Qz*H1CQX*Pq@xCj|5xwgV}Gix``Hg0B$x12?tO>@2ZR6c;!Xp& z61z}7VJr){gVL{5K9U%L8~fk4bWuidVS^C3N!a%d!pmg@Z4v4MBY-3lS2e3Gk*~@` zqHd(?O9A?DH`T&runTYsKfEgYu$oS8f=jKHSiQDo8}zWy?gDrol7+6MNB_cn#r+V) zHr^+kbUz#zQoS3wniNnAOhjbgj7(`AfjQymk!{*WMuSl87G5ul7GFo3kP)218PnKp z+Ky9{j?Ol1BS=lw5<5j%1SS)05o3|I#YrSF73U|KJjB{7zXsrGDwfN{9ZVOx!CSsD zLzTRgw~+u8BX)X0QGF-Js`?hT{r4Sap%Oql8upd4(1RTr+(csZ*uaYO+Y>ty*)wLa zB0v`JOe`md@ddwu?)4+HgW=xWf<73Cc^iUzz?n+39qX)nW2D)m7*yYSUBgIjRHQMl zjxlXyIn$zQmMlLwSj+^vIuT#84Di|tI`YI%i{=`oL$k9z+YiKsSxAjKKbG@)%5SM= zFNy1q_grX}h9C|PLoZh#2UJ6nLzkOXbBP1|eX ziB}BHHq>b-AK8ZqvaLR`)X8_#3hag!#Zpa>IQlE_HqA(M%WX~o(%Kym^m71IDDhqY znZn!<&zS2cOiBUrpDz}1sppaDSUmjO%n9Mcyk~zl-7)kzrFl{wbu!|&LMr3XC|J`0 zC8@+Vz$5G9BP*0ViGx|Drmoto=I;t?SaFEEs~^l&tIoH2RR1)kvGKKASEiyRX0L@^^X zCq$#@Xrcno!b8-gh{m5kWf+Jco9A9#M%dLsugRlZM=lHhn4{_9$klp_`A_!)WzzH1lR^M ziE}99z>H{J;E_jM;!uYz#%%GuFbng~de z4&%u4mJcnJfks#WEMDn36~o*~?*81A6nJ2mgSOnnn{8G2;;W)wUPxUpDc=cM>ntQUZof zAtbqkjiAswtqd}{>+_e84T)nFjr{$>Yi+OcH(k z@s&+=*8kQ$m|k3P6n*n_!tXF8QUDLS6tr(N3En7=x}fE{bSm~FNzsKIP!;D#=RlDO z5D(Ntk5@`&@1-F2oKSbK7i;D9Hu4O`$)E&*(v97`20-f1K%3bl8W<7M62Y|A_NZ|S zcbUEnGsbNT>`a9Ixz-u5)W$Hc#9NJZDsQ#fs)g`X$0QI*Q*ZB{x0+Ap*Rms++cT@& zul1wFX8kOC86ny@P*S@Fi{&B~dzn356ArO&=Zh&Fv5Y;!H3vzBVQ3n@zABCYPkmgO z_^A4DPAkrbX(NLdA9 z>>c^KX;;C>u#fbdvlP5tE=h;S_R(~x^`#(?bRRd$Bpj-#|2OfWV^!l2u&6}U-;#Om zR1+eKCOPJ1)sMG###r}S&roQb)LF5oP|pKhXU(2&k#BzslDEjIIgcEr`Uc zcYR1Qx=CEu@u!t`#sbqLj;B&Z?X0{ORa<9LFfj|nO1_X}pk=kvHKA;8h!$d3p{Q}$i=D+SHG-bYeh`n#Ay*ZTpnh`8QQGft*-&FH9sW`2 zmQ(md_;fdY%(&d65cT|=W<4!4X&l=X_!cUE3QRta+N!<&6xXlGpUN3h0N~}^aDdrz z+0V;qTt(5S7zjVVh-q-SkLhohpBd4rMnM)}Z}V9v)%#o14qrnOJ#gThrWtg^+I3%? zqO^R5vy>QX$8i*N+KH_+*==X*6=LU_C+9ipnSwxnmDQPMVjVt@Cq3S~WL+7l$I$>^F1b zKxA~=M{(w@H2d#+Y&v?`w0x_&eUF|$UB>Qzf!&9zk1lWAw9{@XUp5`Q6%om8<@2Z2 zo+-i8Z;2ZRHJ^)mI|R&>9y_-5;IS`$=}TXF&MT*bmraN9)ZqEkRR(`yJVVnRJ+p%c zrsMu2!;72d2m{A6z`0fTMABvSx-}X zKDnI3mATaQFp;kOVKjf$Z573aHu?n^GFg*>(179|m?f?5YJgL`RVJ)93E23p--0=! zTj8C6BW?vmy44!22s(c23wxsu(yhRyKk5tp)_Z%m4%4l`qkH|mT~A!i9GfaJFJ>cu zab^v{RG8-CG^=;o*Yyrr2oo9tZX*l&7ly0`D`A%{8?4y|f7X}S^q|O?_WbPt)t`<* z|HK(DGZcRq#gwMH62%s0mtO$T$V-4(BA-F2gLP5Blx2e5eOT@a#o&){p{>DDE=-+B zkD9~Y$^{Mm6c^gE-OUC2=bpr0f5*GC{n#d6wq9Ydl)-fugfJvNNk>I{*@DatZ$a}r z?=yW@YJ5KufDc{Xp5}2hf*E&f>se`F-zfVa6Xw)g&3DE&g&Q9n#J>N9(K>wCG1lC) zt$4b;!tBFHZ*bF7o1_aRD5Z+*&*x+=@k(kQb9Fdxp8EY<#dS@2pX3DAc>7Ip|4Zxq zrOlVJZ*Si5UG(5Vj3bC(KX4jy9Gc&!zxz_LQ34HnkQIs#^2<9uYh%_r)sNjmnBCu; z|I_?5-Qt^1d(#jitnxw@OjCq`g|WLL@YhQ~qa5 zlsUyryvF5;a#|wQ`+N#%&V7%E?uPB6^bFox4|ZlSp`Ln|x9S~uE8QMXUx~0DHV;Eg zPqdDFH}@{j`~@{g@iRn87?NTk46^S$_59$`&HT+PK*Y!D!S!W*?8qx$_15awhLg!>i!X!a z9c=MnW{oOXhks!qvHito273gaAbV?LIB9Jtk2ER&qxZi*6 zVjk|kGrY`Gc{{e*y4%gOZrsz88@NR!DqLpW?OWiiooAi4#Zl1knH;B~dDdO20_CLo zC(}UWLzhYbp*?KiN6C$nA{Ke|XY_AMbTpPbumdr|j<8~r-)RFdws>xTY>5dNj=@_9 zdMjVZ)en9z-ugJ{l;Rk*zX2bj8%r3T4aO3u=Z!L^5`2Aib}GDuvDH_(rDV2T;&IsQ z6~p808-|3+3Uy;JCEL@bwq6pyVDf^(iEWeq;0(MMEs&uL23zY~@hP_=uYO%H3Y)5Z zHoyr}PXwZx0!CYtv$y%;mrMZ8fr3@Lv6b(fWXaar9@z)U4G*iYewO@*1A5;_gO`OZ=R2*3OeMg-!N4F-j<(U`MtpfbmlRFPMIqE zKLUM~(wep9cyEASyw$z^Fb3=OqbTjn7oX1;StON(rcm}C$>xl?ed98No+m|kHZT7o9F00!Cl@ct6L zGB618jm3D92T_eCKZb+wVcTFGqLOPWf9WLQF&Kt%WrDUGbd0SKFA9}|%@kBqpT&D~BYBE31a zavV64h2wsuPZRkz3towyJ;-6Y%Iuzj05-JZr;H9iMpBE$xdQ1vp}Y5gj?g0zFtc9* zSuf36m~M2htCPFGM3@2D&tZn=$pIr=8n5VKMkLG$>A|A3MIury0buU6EDyqxvFnyg z*L>uU%j%PPYVlY_OtRUoWeZmf^~ZA2&upwWdt|XD=XCN1949>usapobHn?3tSwBId0 z^@9xBk4BKjj}uy-PZ9AZk|8nfj_ka@q&B@e zhELMTE*ecP&mgL)4zC@k2`cSFuyXlp!pmPff%DYpU=M;P^GSvpDt2U%9WNi z#H>3TaewhyxQOF6E{@ur&5Yu`E8)l{#0DA;o$SnV%oNVs*!+!`S%go_B zZJ@WbM3Ho<6D=)m(cMUe$YSsDnV}pbz$o}JKZa_}S*yH{Z#DhE5$|#7Qy#cnh)$Qr z1l*0D*m>$vnN|ON351FcmEC-tXr#qs2>><{i%%d+l-Nx3F!MfNNdBf#vgO)d(Ra#5eyOW2NvjE)NfQX0yzNF3RP-K)26 zMhi$#3q$H~K3UJ?uA<)QetPlPu6u6+rU46k3Jh}|+X6h0MKTC5gE@5(T5C=yJ5<%S z8Uy5$ANlf{O#on?>eX1W6|;_r$uE_gg%&q0v&D`ONX;tODalq1uM#T0R0$QAy_W{J z2MBxSdS)=5=4YDKZ(}e3h;hnsw0xYFiqd^xnUh0QP_1Z}+SQ!^TCJ_%o?wV`T>XDy zA^~R0K1doU$q#ITy$3G1%7MwSu8@RiUnbU&v_3#U-ke4npd%n5iJXwDy1*wmV*~rl zK4_w+o5z>=!qcH+cQ4Orq>ztMh_;L%UX;a&P^@ysXlZYv5UY~LP5pg4a7yG48B7Kn z>DL3D?I_s~jc|!D0Ui~7lI_SvTgXLQ$Yn2@k3|bCcCa6PnJ>3sLbi2p&6_!qP}x~Z z4sWvN2ko@crRFI-U0L(tOlOapB6ps+`IGDlH_~Pbcj$T8f@<2xhXd4BJM=lFI+25d z8@_me6A^CC{xj?i_V`T@SpmCFn81c;7~^`PB`>tgn;*v=&_#)z_z);y3djT#+URtZ z5=~9-74NJ0b<@}k)1i(3x^U^=mh*f8t097P)l>M|m>cRD??fm=+}SA;#mSmZx}x%8 zqKi_v0+lO+yMtFeSQn@GfS>d+{MxpzknO_2i4rsjM*Dk~uB#!nYo%{%t>G=>fKHss9L|fq;0Wcx?P}pv_w0Q?4@UIItJZxm`>>t>!(WVWYQWJGYz^M5ZnTyC&8W_bQ!q3pSYIAL2?=Nf<@`i`0r*J)F^ zW!7BN{McUz@Q=0!8n{1_eMu!**Hqsp`VC_hi4|nn5tMke)VbMxbz3yA-l#nd1Js^w z*C%{r@?4}@&OEPe6Iy$Uz_Oh?umKY;n&1B@tXT7n@~+l@8pAjbaT65wLp(nWP`@!O z+~s6h68)oDO<0yK&vnKIE2T;G%%`6GXUY`U!;M#ih4oP5yuVfJFjYPeb-4hR&Cbf%; z31XsZ@(+&diNa?b&&6>@Y1{)+3J}Y;(^~?k6r{cZ%wguc6qi7EfZADfbA-Gd>sikn zG5SD8{j{H?fbnTcQJ@n(+PsR%zbx{HN(%-Y%rgA;{BpliGvy~g_OKOz)!Bgzzd?g8 zOki8h^9Ns_V-%OL!MY?apaI!s`Z|)$%uf%k!>vUJ(NH3v{Lq*~_lkK%qJJQ*fVghj zHmE9vuT`^63!KfuQ9V7k)Cw70kLPrUJ}KDGr$fZ{`E+ERR3W7w(9K`z2OLhdC1oRI zh1ck=$S%zAAM!~{C2w6N4!qq2h=AeR5Hhe!=x1#(K3N(-{ ziZUIqC#EYsjJr>#6OAd=Cmg`0HWF!MfS8c&Z_a2 z^*{&lRtK|Z^F%zd;yHKEG+R_5ORbYQ#%4Kp@Vvcp?)o9rI}USxfgMSGfD0*uhq#an zaD)qC|D#+8`)?#>_N2x1;buQkE_RZ>Km|)I2uLv@Lz$OrLdQ9LTzZ|EFXI!tI#G}<(v?IkTTfA z{SpI~!-wRzzg;BAz-QY`X&E=m@JuOs;^LrnE^foKFrfj#2kikI8oI9YM<0aTQuvTL zxL+=>zON;?B(IvKt6NC-J;P$WXcYG9cf`}y;gD_=a*4}n8|7qCmtTk0gu?loY?M0?C8tART zMo~ExyhruED|ghxa~AiJ3g6@GQd^+J6>*5@+tb=-Jjuyy)u)#`R4`=nzSd$TLvU&A zKHo7CIk<9anxdxIf24kwb@8cp(hzofUv(*l;kPnaYg`~!wm%?~Ih#`c8nuL%h351Y*5<+rO zdv-3;Ex1Ux;G$kVTy&r>mn}Fex?_6J~5}Yo~^)< zlsT#g!C+)RSG3XnY<||9FREL?XPSRQhLXE|vu~i&>BO0)^lolonDxNg#e<)GNgj_R zuKpyxrQ zSHaJGu0g9fN(xpSP2gdGYB{zHL4ow|77%bdarI4Qe`o1Yod3=uBIqt?drj znf^J_#-IY(J&1rK_n{bxD9BQ>z1nWMSEZO@OHfDvVU!TqnEMqQw@H_5smEe@tsaA;a4PA86YNe=|2g!U zR#y}h>EVjtxu3(6WBq5EBi|+mY9`&f$zN(JC}tk@E=SCA0Kc6XKPKLgPx49CaYH<)m&BMD*9q$oRC9KJrkcf%uzn` zXGB>%hXQL70 z3)Xk*^1^kb2=s>k=Mn)h>m5hnAZs?ftQr@$EJoo0FVB<_T1T7u;$2wb`E(!41o^V9Bi(LkPZYpl9ad9i3#0J81fx}jR8#`EWf@xm)xj}V2Nto7k z555GChenwk8MDu0@GcY}?!S__fAwz7BRD@Q-r_u(Z$C?ATA#pPlInow%g}Zl%qF}P zn6PvzG0X9E4Hw^UP_SlD;>bK^(ua}XBWs}kMqld<`PW&3gM{>69j*Z~$WUa+1IjdT zp0N_X`V2qYXO~%l*q=EY(+XPCT0G$gX%RU!-d|6 z=D7%vZ92AiQeVq9!XeMXfW$6QuJ=r@O(Gk6O)Qew=bCZHd2Puy8GoA4A6-Ej&(tqp z1=m9HQSP}>Ys^`Wy>`NF`!J^aT1{8Hn$_d`i0L|}Xa>IWv}C;tE5X2;wd18`KV>b2 zbyWSCAQ}#T?0Ajo%nFOXMNjisA42Z)Qv(Z2w&+UAV5>gaX0IjWw2hvw*{r_NSSt|7 z*5w6<3oFBZ?H?l1%>k?JV$BKVQ}dwM@3uyLVZ|T{B^v-1Il<)SA#W5>Ja7IND8k(5 z&C^CykV$d{mq*1He~8yihJX!kPvF`#LZ-z zm7Ma7z66FsUC6p!o=Il!z}Hc4Kiv$@RCn2kH!96j@+s^@{6R)DQjy7lmy@h@wcgi~m4TqE=a>E?)8R z(dxSkotVmJSOXDn<1~E9Ea|*_n$6-~L#=Bxu>Jg2Lgu|O*N)DNx%T9Atv4#G#uV}Q zAz1`uj{Gj~no^x8P@Yb^gO7-?t>(uDP3o$?2KqUs{x}1(E=FfCM(mt(z<1+xr(0o+ zSFO`HRak$t*49#r#ki|y@T?8ayo9Guv6k&@1O5foIZd=s1Q?O7)9aMO;2S8N$pA~W z!;>aBIfau^fjv!QP#wEYU>Kp##aGPiI@V>-;lu`Rxz*YRa;Q|vT~r^JaAkj(+ z5>+owv7w0kCXdHpn`y(mJkh}}45hUPrU1MdKhT_ix}=B><+xe9pMUhR8Q*_ST_EUd z?V#|$(zAF+gq7MXElp+mEd2w|;{m~UKWGFn?OVecpdIcKAI|d|HC%+C;B`TxnL_(t zrxhMDNv}G;6HtRN4PM_f3czE8Cdc=(JH20krUj~+w|!n3N+d$2`5H6r>`Q5Dp&muN zYEa$BE=TfX$RFn(17Zcx5hRF%9K4ctGrk{6;>#nV((6PoaF%mtVFKbYiU2`JgZ-Hx zBkY1Z8ZW!MLKD+p*(hVv^S9c-Kjuf^v2X5__gPP+Q=@&=j^RtMOsH z;p+bW;Sp{&CjT}kk%Qttap&u%qmzcr zej_KOJI{{k=*V=F3(AOFX00X>s=N3eN56q!nE<)qbGlhM{ajGC#+T4;BD1zE%I1Bx zRgpaD$2>#Nl6!4W0M7GOX(nSGy?v8$EPJwfzl{^AlNTBX#s({biw#ym1g5#v+;|#* zdLrfu-F;PTq>3tdPxU$4A28)Mmh6;hvIWJolP!Z#l7$EyFmI}}FopBiZsCl80PcSy zc0Lez5ivSQxlN_r){vY5uSXQ#CN-6KqW>4TXEOq&R$=WbQdZof1h7p&DN%kg`q@tjh{g+|qfLN2Jb>g+X(I&zcE$ zj&PPRlWk00`!ET<{QxJzQrFBP@QMX}6E4@xDjS8&vt2y5dRhWrBAMS>mIg>gw#HZ$ z2CUv7Uw=Ij#J+JD7bta?+~JjdBfTDBOI49=I3vDBKY1&r3MshEVHxV~0>6LYA20J9fU zq!aI=VqH>unufI*@Z&Q*3l7&Ub_hMbJmNkRl`>B3Vhda=GTF z;uM!>-Bb{Rs;^Z^^swGVNi>(;D&!y5&!*%)1yetff~mipFP=Mc(R0yUo+5_5GX}a3 z4m3+?K^rAJ(jGWceXnY&Bmj{n=0Y`;f|R=TcXXK&~&Qtc#SenxkVYLTohyEvJdTr%NG1rp?u=E;+zG}Idf95mEI$N8y-~1 znt;iErJQEX7c)N-^|*u|`a3{Ms$O)xLS`!0q6Hu%SD1m`KpNQpEi9Y;I4c;EL!rZf zkN9$}AznptOcQ|-!aqKQxl151_Tf83eHh6cy`v~79%N%b`iY5mU5{;cP`0uZSE|n- zC0ZhJ7Q<iQ#jKI^Qkl!=X3{0*8^27LoqySIDiHe^6#xDJzEgO2}xo2^b(tej`SX zb>$$w?$h%Muha{kZUP#&bt8#o=s6ijq~T~iRy2k?-kmvQ-=OKdpE5+BO7c8t1qYCd zo<5hF!{^mEB>#-x2PAnuI)Yismq&3MbJ+q>g_jnhq7pcc;u%kI)l1z% zc_(TC@tA8z*x17vTyW2ArBAejt$w^*$MW_qZ*z-;DP%<NwlN&pMVae&&VF( zH_Wo>>Yb9ENY3_Mvblxa%}@MQ&p(`u8C3e7%ADa^1}-?lH%L7teu-5@r|nF>b!-p! z$qPu_VGgyOYQ&xEl`RtEr~QN;dqyH`>M5yEANA6u<-D7&=^ z5_8RKe{ly;*J^`tVLbcF&?5^~GNWkue$8Z>g}sCxUNbrQL_qBYx91j1pUDhl4fu6V<>c zMJrg`%qYAQ%-U$z?5WY**@rKW zW$;s+de4H)Z7k7u1R6nm;V)>+fIJAVTMoViafQ#VMKnPkqPi9K%7drYUCs`|<+fxP z6bae(OiGH16yznfT&yMW60c%Btim%=qvT6X#BUJKvk{cAZHMQK8SKPK%qfTa)jZy)K@Z z=5#`v6+s%^@XPKN4;Fq%vvcAaG*M-YWfRV}daDWRIqLOH_5O3syg{WLwEX1Qp6Woxs)?|}+<%?$Dj3tND@e;9mLodheeW)=o zk2bs18yIEP|2^)S7r_T}26g^U7n^JXvquqRS4;u5zu^)|8?~g@G;RBuX`f%sm**AO zo{>i^FI&d};R-C5`9xAe7c$4t|7Gjp+;at%ixgNcTTn}bHMv?E4Qd8c3aWOR-`@05 zsY(e+0TBsmB>&(aQ{xpCAR(aF2y)5oe>={gG6i$SrNS%A(^7`iGNBxc+aQOzlQ0gd zwuNzq!UcQ>BvUGfqs#B{em6w5d4vR0#c-f37m(0vm!XVaZ@7gY)UrRS>G-6F9p683uDC#?#trbxnU+RG3U!0r3Upw91KDi7HwgNE79e@(_QVP-DD1|T1zA4>iFv1e z>_Z=%X_XBBb4rj7#dBtOe-5FdHtUn_@kmJ3clOciISzm}Zf2u=D3QM$xy*xtR4>x_|9#uq1jF#=Xe z#M#Z3dlSIp8P^FV8`*N@O;w*JGay-$-AZJ88oVZeHsbUb2CXZ0;8zFQQ0=-A!BzvU zBqm~0VSTA+si}O45`bd2*?tE`$&Y9cx<#B?vS*TYf-b6>&v09c*ipIwu1w_zvrKt) z!x2|y+x24C#F%v>7EWf~V)&cqcc~h2QT;HDD9t1lyD4V$lrW>!wEB3P)NEz(t@W0A; z;VGxj_%IYaNs+*9A`U0K_!;{m5oej(H5ZAvBmt5OypRlflBX^@~XW0u2|C z09#=Fq42``qjUiDQj-TRW=pI!Ph{utQsu%SQfP_tG+42%U)$O^>+W6fck$m`)#ET! z?wR!~q$7a~5a%aggibiV)vfOj-{k6ac|QM`Z>`k?gxq6hqHClyQ59MwHt)+$!kd#t zzJlq@kJfCl`ADYJuUu23^SG)S=sWigSq*vfXnwl-iIr|aFifR7v!FFUdgRgkd4L1q zg7;ry?GJv*UdnjrT=B`WR1C%Ir4S`jU|;hkTWKpw5--KdyQ%mY=A#+?RNg$TfbCD^ zDVfw(ixXWkaM^$@uCWvnhsie&OHRQ(vg&C<14#g3%XL)}m=3l^te%bO&|-5NPAl3m ze=qSJ+dg1k4^=xxnkCAbMB|c7kpLzj8Er4Kq72n>DFm7tX@ndL{-5-xp^2c;2_@PZ zuT4iI=hbHJeR+PXm!b7+Gx@de|G6O@mEJOkGS%E zLbEXUczMcaYmqD@Wt)bf;iT)s?4Y!eJWFxdijdP#Gh}5K7m6g|tHukXm}QX{CMK8~ z(R^aC*r2}G*S2GV@HFu|RmgIYJC_T|z?ahPI~~{0k`mQ!QE^v=f-h2e{lB=+2Q6(q~G}cw`7M&p;Bnl!k`uu zY+uP^mSW%h^iRVNIO)`+J=;b`aZsu{&%tcInhOC)q?^%FY5@5IJU8HoBimr1Js$be zJtLZrjF+W#^-Ra4Bw*l#m^58sz)o;7s~(p@8Z632NH@BI%Z+rT=t3h-PYZCO>FHr5 zCNkBc`ne@rHXRR6Pzf?yUzN1stYaP>_Qe@n9z}RYZR*3=B$zPUiKodXs}LT5kV`V3 z{L1oTeaF!@?5AAIY<&wd*NiVEo%4W_&bfrurLX~?6gJ?ZumKl^4YZngzYaiKYW3m`(7|@=nw9megD6Fk{LygZfMhmoR z-cmEMAI7)i(+akU(y%RDr-MWV;+F7yLL`w@Qwv>tuOS)lG^wVxhHQ!tc_;aeWHI97 z+%uI6F5OG)-)%8~(uf8A=ORfkvw;XSEW7G6!J+9g0;^MgHTvTeXKq(sltBSV+%_HV z0aRpaoL*mT@ciJ`LQlY7XXRBAVClU;nlc|%d@xOafhM_q&h^vfl9N;KvkOVN>SB=j zCowtnO${+gYtv5jv(128%pVP`9-m9QIu$kx%5i~^=V>r=iFLi)(jgDD_~x>0RH5gG zR14&Y74f8Hd=Mo(u0M;G3czNo9@wR0C6}7N`&`!i{%0Y39ruS50`&p61Dt#WrMu-H zdE0n0erp|{2Kcxj5|#44FH>)@t6&?1JhVIsGZADPU?L>jfKQeuL9(3OU*s>#{Y9?< zE9x-!SCX7Z#1Fo0lwHN#QjZ1GbKZ zV>!GKzv4LFlZ~$s8NqH^Q;zo=O8T~=?r2ZE9nAUjPjHeBEo3PO=JeC8Crz-Sps6Yy zRGx&>Z8ZVMx_nQ*t61!@-2;w$n(HCvG$qumQ8gp`pGQhl!?aIsLFfi8U; zM4&m0A>o)9Wx|EQYt`x~OY#!x{GSShio#xJHFdX$IIKo~th{Tc#lvx36->4&57isr z#+d`gJBq~~1HGfZY#XzPW9!1&E~QhoD1t{k5Xw|_Rwj=)7$+r5Dv0AsA4!gVaf$OQ zfDy2E<)vT<%Z$s3qDg(hrHYLt{4-oJuWIuTg~#w*vf~f~dL5HiDjOh0hZ9?RrdbFH zdD0o3-zw5F!#Kx3z&u1eLeg^FlnU4CC!Whw~9&8z!1M7DzcB=dwuPvp}+{yPb?nsj1OUKAuTC`_WY62;(4__g;`b; z=pma4an9v(sx&QeLhS{3P6g3iR1nQY3Nx2TA=!e$j7qf)IIW(LVz8|Q^_)jY(Y2%k zI={)R+BV}65w9`7(DF%ZhhAG{rtCvvz3S*RPzyL4nCmB$g(HmL9*9kwE%PeLL(d&xEyau@ zl2ZfIZ3gBoOuh{b^Ms9VZ((@7#YX2X){m+87T5cE3k=HN!5!UOS~GxkTE{yH0I73J z`1ghsm+cY!^#r;f@PiRSvRVO*1V1{ivYvXuBT{`iR%wrs!IwG1b;UDWaqcR^)ykbM z(N!6)rny;a>yboLrnx~=U(6SEx1L1aM0X=QY@QX)hBy;j$vFNYSXw$e+?vMs*jk-q zvdkw(Ig>-8a(uvbY3n-!{j$zrG3^Z52scVAPm=Y`OU24!FSK5Rg>LPrA+E5R-l}#b z{HDA;E(&{cV(VT|n@`GZ<&!LLK9Q@bi~0{;0%kLwAv3bcgV$q7D3d#0AAq%?vJ%_} zy$~=ttO8@I#V?d`t}J>y&IO5F*bIT9WRK!|UX>O>KW{U^Hdu?48yF_!eiO{X*30iFl1tf+pMJh{X@j*|3o9$Ej+by}m=y*h=52Bvj$AykHMB$s4 z7q{e!s#D4G)m%z@r>W6P&8yGXro#xlD_BwTLdR5`hOvMVK->mLUC{{+tr3s^$dC#F zY}`oJYtIHIpiGXSy1Xf z)`Ho*D~n|yn!@a6qOE0arw0suqgwOFb~sMS8HLxn?DB9s5|d3WJ?+xz1k>CS3Q!E# zbEv~qLoSv{n|m}0GuYG%k4EL{sE9%#i*p|rdJOI70{dEM%y3gy5M>ZDZ`;P9Ke?f` z{^C1A3X*REN>iNTOMP{t9c%IRk!_C!`53@bl{A z$%1m2g$~O-=P&nW>se5pVA4v3*y) zp!d}^r1(i^*AD*ub51|Ty|b$NjKU2yXL>p%+dNQ|XRQp+ZX3l742?p(( z;$+srZ8W4%JO=jMcSv9|iai%fif(tx*o1Zp&)$F-o<`E1tf@du!?g?=j=%=mZ`N0; zWfWuOZauS0$DptLyLv0@noR{?CgpK3& zWhsN|`tpd9-^JIl-6S^MRdG-%|+b_VC)IrQ4AY?1Oq$i{`C7rV9(9niY&B>lOzm%O}l|ozpFFYM!alU<+4U2L> zs05?^>~YYw2UAx%n*RX(RR5(#Z1=|so%KQl@Y&-!_y_ua;!{+ASLd(;jLxwlkaCZziL;HShZy zdoR2rS0y3eit|5oR-8XZart%;r1B!(Mzxow?`Hr4onA{*B zD`8FzdAWod;xh;pvRxq5uVmT)<)8lpcqRX7T?Xf|!QlDmOz%9X zdSeM1NE8H>!511Tf09yTYM0{i~qA$cEm=Xx!XpCXYwnRSKp1zI2z z53SSbTZ4xvMlUwBizuK8i3yF|YJ$loM9-J|G@`!QMxDgAX(c<&4kmS*%A8|82Bb3#$n zj#5?a%TxTRvnkOQo2Q=6)o4v0Z{Q5*I=>Uy1Ge0++#IPgpc)_1McXqgW=yt_X%&Y_ zfSk@Q&XQplC4Pl)nP)PChWxdV z$;?V-zn*+_lbK(XOfI7JDPX{6CB;G*BAM)ZN(7nIpEY*WZ8b@lNCx_bw2LyUwjNGe zB%aLzNY8vx!NinFJG+!`NGoagf%PW6EG zN)g?VRAoC~7pVAP3ArHr!Q9Bg*>)}ad~`A92cd*ocS zoHEtV)1zC?MZV-{T3zzPV_&`NhiZjV%{!^Ey9~-*3}oG6iHkII#V>@SM#p-$)D%gf;EL~V6#pq z2jSsd;|FfeKz9DB_)C3h3fha^oT0O!5$IR!Y3T<1h4RK<`qg;wi=1<2*BAF3&S1v} zvj)E_T#mmvj*Q+3NTi=rLw{5A_pvJb%plU+80mh7J0C5}>}~eR-f`~SO_>_Mfh2cN zGu@hXx58(=^%-BTJ)m26p(hUTwJ{I7RFgm6BkCm!b-UWuV)Ae~f4I$u zdwqOimx47HMToh~7qUeegC$Y6DV4BUKiq}~4mc-1v<~@RPiPp-xZZj%@SEBYa5?39 zmY20-8=Q`ZK2du4G$L44#&mr$N@|98nI~talmQib2OPC*{xG}Ud2FTx#iJ^F;M*~W zyw}6~n*W)AOEbPRoD!ygsJ)wbb~eYeW50@x?mza`gD8E2MttF5_H_$BY_xzBxy!5f zVZtRvg4R^xn)3oif#+>2&BLq$tg6`>ot);SZAqcP0IU9;N{WI3TaF z`s=fMraScBdRl#>FAYtHg3f92==#p!G@g#RlSWlA^&Wr{d!bH{R&ULc*qLtw$8|paD4}Ph0f%5)H@&K7XjfPTiZ5+sVhO_c8#f# zgLLs7N%@JC&A@dZZfNe%6?vaXtEKW(lvll%^W4>*4LygH4k3}iN_5^1i6T4~_?0PR znc8=!4W!g3XhnqX)Eb-3f zh_?0-nmwVx>LCk=nHehLcRRG%IoX76!$n()CZpp+@*LaJ+e`~q7Sz*ujVEewU>kR< z<-UNE>m@KKO6(71t^h!`VU-UA_Mo%r2rz?xw}b2B+s{o$dQlaWy3cfMhz^-$5ij-Llj=CtO+5KGv>`%dT!MkzatkLpJ-KCgaWg+)>Q7}!pS zIi<1>&1M5h_DuVg_Dp`b%^K%gu3N4UX)<%Xn=71wf&aYis>Kwp=rxZyk*6R;iFq@XLdvQ^bso5`ovXg zM_#PjG+#xozAhl*?I<#xfgb%R+VlZup!Il4-m71S#= zwX?{q;`9J_0#@abb0pb~Ty`E-<7nlW-^zs?^HWKoLuHrX$tFLyyqWpjt4r;oWkwEC z=*)Ah6diuk!3#y_zogSl0u0lhcLav(>L;@voxggI^!L4}UHvO)@YBb;luUQns*hm6TE@WeZYO zVUE3_$){2o&JPHl$0w@qteEzp#2kDE zuGn;|aV=4|nRQU6!khNBv6>_a;Lg{VcONca0R58rpluSTIuzRz#W>XmL@uEN68I3g zH~}z|)HDXtX-7*43Y0#T_iG$;?m~ILA>Z5l4SkPw!~_8t`4lD4v3DSD#n6b(-AtHK zF4K6^*v-!?=pe(uC>fs6gfbxqpe3|XI9o5{xJkS#dHz1Sr`Y-MVBQ%0Y|j`ab2VE> zyt^^VMaC!>8U9@40py}XWw^)~9bI44oczKk9nZ%_#wZsVqg-x8S>%=@92LW5gTrC? zQpPBkJIGFR8eTFhU|DDqnL@+3{qGS-h<3MEFP^-6N1bK_V z1x}a0iGS=VIIo7OK80BcyPdEgP?3z^-MW*cWOd_Kcb6IADEJ^pG4HT>59%Az>`YDfxgoLd|PUMGc#oucB-?bjo;xU zv|S8~7+@uyQ7_?8oL+mltXY_VBk_n?AaKc@s9m%9K#gh_l!T zt8~X<0W0lK{K*2aIn(3krq^(ef(q}Jl()T4d!X*a*yd7Bm!$JGTyUJ;AdoPH5R2|Q zNr%EiQD%d$NGQ_!#&Hnmd~fsM*yO_=I&O%#v+-a#2kl8l+R(`tpRmI1aQWf~@*~hD zXKvUz6d-jTll$b%MmX&KsG2YRkXitR?cB@K>Ye{&UGR?Bbl_KG!Q>7ubl*DVr+04f zi8jqg!J7KjcC`EX^1);EYo=@Uw#Oct^6i7`*CGr^#bzF5FVF#BnMeUq;sCw!TaAn5 z8xtenP#lBHHmTm6S)!CZCmyF3s}oskiN=j zm|xW7XX=4^x$)#p#fvN@c>t?MpXR5>9y)g9K^U8D2QOO{u=-~ihrC%nADX+^bnri~a3&Rg=4%rTY7*}6 zkbF1C^!hOIlA$TaOmKao@;>16qIpCUOhG_VDQ<+Aqg(8&)o)UMlB{*~lF@p4>jbqO zU(x{h6c5?B3}6yx_0jcbA6t`HTYYrO>1$1)?K$+|B<&9qW`A&g#=G2zw_f_){zS7Q zduNgdl%rI4Ii1VrF|G6oa<@f^>OqWpqGdcwI81ZfdfV+fCWeifcPSXAxT-ov{%f9w zMi9d8n3vo6;6FRHn{%&?M|9S{u$6cCxr}oT3!7=p{OV^J5lpueT+l>0SSGM@SG+~$ zKS{6D_pI@jUH+DE1fZVl^Z}4cH?vVpvUiv$?AdMn38rxv_$J7L!z3MYCy_<%n8w-47niU&g-gemVO+ z2C%#NbeQe9c73}Q_Cfm@jK&md`x2P zF1~I^ga*<`LkPYMM>(D_S}dclkR8nS(gfoWl`~;b0cQ|3m?&?ir0v!SRc%AKJ(%QUXrd~Jn*G1dRj>vJr2Bw>M zb;k!Xo`@zpx5G37njzehA0yU2`(A5xaEiqMu%nQP+O`~x9rc4|ma5Og;FqInP1KpcIjoq|v^aT<6kuQpz4yzv@H_@cC-Oo;4k9Ur- z29!MQr#g&0feUjfO9oOeRE!ImA8;^Os2Eq5j5jGRNrOLg8sVvQI zRPR1q)LhVr_H)5&cYuqzmuTLrHU*>l+QW3|9M#W0j3~F$ZBB79I;qMMtX$%&@z30N-$ecx=jqYh%dJc(}188o~O4O|(g= zTw%8wP3FzYUF=XFnKP-7GL}&&S3KsY+s;h$?M$zr;DFzN_uX7@?%lzKlC4Z9@bIT8 zqa4P^4+~%LbHN90T|LMB+roC}fcEyaUwtdhrrx%n|tvtOse0R>ddv1mY40 z(Qd)MZ=IlWfm%KRxgfMoElx<-ZX_)XW)^K$g>m~{41401^MgTF`r#>J&a`krZ|~0b23I!H@X2g zx86Rc0Y6$9Vh(fbuIb>peADMbGjEHIatsi5W%xa!XB>FeGZ+0g&a~Pb<5y`A|u9-pViLUU6xn-bR-x$9gdY*f`>!`wB`aA-^T^E zxo`;mzm&*h{!B8r86(9`i_-TuLk@_5)?a*@t{(F&0P&bVm#50-o@L2^ps?2KtUku! zG&}J5#5t`$pS)(cSQOPOzLZt9Zfp;}B`(%-Ka5CI-!7E`neY{TCFL)fWMUh-9PTz% z8J`|nN9!NMQ+Y7^hJ|xHz_uaU&V8J=q|n3*Ldh;&*s#z+bs{mJR$=1Cd)ph0$uzq0 z4=^QrxFtJ=J2^%OrqLr9(A(L|pn4;J`V*bYibo#7?Yi)cdj;*8&L;>8+iP^h5ost- zWi(__BmrfN)2(KVF=hkc4lJbn`1kumSyX&n!d|$|dVeXLciZd#U@_qK(U{xo@Q*Rgjo6n6=S%Y^jsOOF({!1~^if zd;$dMpZ?*oG8`le#w}XrsJF_wTvEaj8=dfup~d#=?3{!(1jktZqzgj@sXHW<7)POt za|xL`a#Y&9S3X@)ik}pJOY!5hdsqBnSewLHK9(=4(O01|;s8oO(r%PBk->8S>1R?B zjTe6qWUBsbxLybdk_ouX3LXrqy6oD~goaiyg(CQtVv!^EN~RzbHpneDGu&`x=+l;Z zs+Cv?B7L(5*G_>T^9CmgcPejU)%Tv(o6uc^Cdm{gD^Sq^-e3K0nE>Ewj=tupDa>6b zI?BLHFhOfU%`%V0)=NO5HV%T_yuI2NFAgU-qTs|ul7oxj#AOR*-$`V!905R-;36Zh z-qX*Bc32vUAY5OBSmTKs)#}3jLa4sL|2pDT1N@5pd9QzWK;l@Ni3@-TR(-gHGwQEX z`pdo}z{;S_rvRSQV;Phz#gyc{>gU@`%Z@#24*PE+ekwCa?3T}mtW50kvbPQHXfBxK z2}4ui_^*|VEyH_x%@>9|0cP<_?0pGid>dj{9IcFNX6tdcci+uWk|H#xuBtZK}A5Gt%KN3^>~v? z<{nf(&>YJ)Z*D1MNtCdZe0Q*BXRsN0+P5bb+h*_B!oJ8mE<5!;HZS_o z!kv4EpRl8|3DlFn8Z34{t~=9HzFjCu07Hx8a)I1wD^ZEu=`9GpE{Ytz-z~hds;KVH z<7{&$;Ao!}S|&Jy>%J5N8p$)ysZ*$?5H|MJ36yKHV`YibazfgrB`R_rNE^cCpu%Pe zSF>%aSF$jWM2#P85nGD|rnF_liUL)SfoZXY&8Gfb{0$)L{3OE`GHemi>}aX{Oq})7 z0=g0|>!J?2AD7vd9ENSKv|jB8as-+nN!k}%%#igCO(KsZ-SGh)p&AP5%UFSUmXW~G zGBEZA^!3({5}j)E#|m)dIf^Y|#Dom*6tif!%@WZ2{wO=?{i?n!okkNAQ4={3d-8^2 zv9P(P_;*Mr_Pq)2x!a$`UC1w{(k6DV?@)~fdwz^{Y_{3LiR05^U$PCw^H@6j7p?&- zwQoo@DMkMCh5lEn@+8otW-7leRa6D^Gpp+XM_g*1Ib9D$22X`kZ%N%uF&C)p_=0dx zwfMhCkLJYZz{yb}2H-#m{E_4sQ;<@6KPh2IfVYP6P#`5#3TK*-iB#gW|D5dz#C%)W|D53r z83C(Rg|O!ixwQQp78We5HFrrg?;RGFiLK|&=XKUZt13U!E>nqKQa`uf-K5T{r!jY| zWLAD{K}LC>b72#H93%W>9^mk)bD=)Tn-T_i6M-cVHh;X~K0lN?xdMN>VSVcE`HN_x z3A$(zv?kWiLRw|T#a1BPg0wo=cIG~BU8CPBkldUjJ!1}@K$}#(mtl*rj*MCj>YcLj zHzNNA6I$v!jPJGiUD8+?)h_;@!Tcg06iA!I%( zXH=ckB_7lsvK~$Tf9Bo>-j1re`=6O}Z*p_*Imz4*B#@|cj!`dpk)RO}(weyv5?%xp zP_(}AD77>}OCq&ufrJ-%6M0b)R8)KoBB^hvpjd-Ojfxl*D=I1~Dz&y!Yb`3u|NC2O z@0mI0ULg4N`F#EfVa}N|v-jF-ueZI{+H1ePHFYV}5QB9Nuyh39Wa4wFPT3{H|G`a5 zGpixyq`ZerHf`)4BBz020Ae8{Q2FPRwvQ;Te3a21SfdgXAOJ@YQ?Y!VJrDdXu!d;1 z{4?Q`}p2d7e^L!yC)Z_syil%_7`E3`{{eFCF#p>am8Eml=@^4v`tDBPyyd zO~ZJNWq4FmQcMqNVtpic)$v@kxa<+odbVzn zOLbuKEc>MGqQ}`MZ5KV(SkRYoi9)7>bC}73KYI&A|V{VD2rZ_)Xel7f`oC}mrh9KifrAQPmkC>Vx zdv7C0w&raKZDZzp#SutEz>J$qkH%Uxf z4kjyu%UZI`xEw(`ESIB6hvjlC`5s)3C%2ZSpVwWWZzqys%eRxdd+KsZm!;q?8DC)~ z8xm)A)S;a?7@TeHSt*f(`OPSWnnDXLG@1LbSKbbM(RM%?t2!2R2^SdPi9tG8w9n3@ zF@nif^*fT|`ji>Tw<$q8Xl|0mTJE1l6%8pBuv*=s*Pdt~xSq8x5r14?Bzp=-s*tP5H71amu8oG zFOzOo+KD)fWEp`ISSc^b5m--_thW>obt0$F2NI%bp)FRqzA3jE7@&1&3H^qI&ZuyT>@`t!n&2cnU^qbcEUs z1Mm%!6e_U<)UYcfBzd;Ilh_cx^JPg-2d5LOUY2yxU%D0~$!^@(1M+3bV+eP0I@!kZ ztk>Q5sg`!XB14uXi}eyjzAV{0yfmSg{GBDd3~KF&M!3*DFn zB6$?g8gyY1(ektB4&^^455(>MPAEZJ&SsZ|8>J%T z^2*KZOPjH^J3mahhe+qMl552vsm*k7?|`4MLD$YE#)(1J(?(?LEK&h_yX#c#aba`q zWN|vJbMFybdkZ%8=5OhB%I>wx-LnDD{9?~%SvB@P4rvz)cs(X#xo z-h|XdF5Eny-4htjaG9r0Y!3@(H_mNUnNSSG^c-H2WmU(NQ zFAK#SYoTv^*BD#HJaW>6l4>V4X8HWd^fU(V7K7#@dNU!9h(FSE5^_J2@_fhEI@o7s zF}|)hSDW6c1tZ&aG$Nh}_TYen?HQ`GSdNFZRNu%i>ht6Cl%}V}SoDDQ^WE>QnD=Rb+^?t;b?R~S?(N| zEDi03!_grh8&xB=ZCKMjqr!F2temH%QJM%!NG2wOmMm zJc0`ekVkXbUD*Jw;t^V9wTcDGk!%%vC`YnY?72T{qgJuk{@E#UO?YoimAp2c8k_Ae zBDhN@p$9x`Cm?CaM>8#=7cu^7Z8@|eMfrD{;W(ls54!xaoYM%dC8LhrG@Q+vTKs#W zj(yZiSh?i*rftStw9Odz>pWCE-&9YIOW`4{MXaazHiX;qA>0prA&^kGN5z#qmp!9~lR2|auE8n)LFH0CzTF1+B#Gc+1pK7XU{Rq?Y&)LaZc zxEG78M977GIMQ&uy2&!4l^<5o5}>s;9`{k1xU?=!5S)(1#v8( z^j6FJfEyK@Czhk(12P^>{#`hj%qlu|Y2Fw{%fn7n_& z5AuW+`zNnN@3G={q$;xy4u9BzfAl_175R#hzA74xr$tG_qdJYuaw-;bfzb;t1eg~^ z+KopyPv;(M_&uS)q>JQnjB$})Y}W|W?fF=NKFzOYc_7vkMuV%J`Ls$rT|8YiUBauy zWcrN3!~#^R69V;t_!y@~2n<2i7!pYH&$HlhIUY6f#8YA3SWakZ%# zdhjJBBs)HY^SSCH{OXIuRHvo~FMk~dqn#7-*Psml40nH+LV3yJ{6y#J?`LFlrp9r0 zG`t+O#~%-wvH|45}(8!7|Brf+xTbGsE zS|RtwY+Vk<*}=umuzqlNXziaM@mKB%(h+hx2S2I=$Yq2MxTpXCmxO*WAogxe?B7yu zA)m-&Pzn#9*y3q2WhGGXtN`V*0_eFM0K6zlA{OMHLFAHS>;n#YOP+)3X;8SjAb*}^ zkK0VRu0e*H`hKxEOTx38$aN-aH9O6TQ_P@IQ0S+~Pu~J3b1jChJM9=Y0n$8Mm7R{F zdj#g>Axs;I6YLnLC;at+;2=Lm3#|>NiN;~JXbNL|yNx&_|J{`QK4ga-Mpy#|#DnnC z-VnD%+0j`77VL13e$obxjEWjy-9(1u2#Q})g-lO$mGnPCKr1U-w%X2H`;^-RY4J5e zU2C4iYG26(^Wgw42%Z&ONEBTjCEc)Rrar852;}NS`kFHt?IcMDi%Qa^st2NKn$!bP z8BMJBMO^4tnJ_@Vl#9CO0!%BoFftMcHKdhXfOi!aOqzou>*4KSxEP$*&CEuo@?ImM z9*-RpCdb_aI~ezdDybZz-S_AfrO=avy-S)sq|l2jPSQf-ur4SlQ4(k#-Mosmg_wkm z>&6y$lEl!`U@~(s<6>mWmUCE!X6I<;*jS2$AnJ@Eg=6IdIFxD}y;-WnfOmHPmNvJH zZs`plDt%7Q0$NHOk_8bhozHD@&ApftkgT%e8dw>=8z>g^^}Kv!QeV;w8oO1g&Q$e9 zWJgqf!XXwX3Gtx1h6lk{@r0AQl|_V)v2GITs{2g`XAP|u;xT6%pv0$TdRiR7TGPyT z2ua)S125L{+qCow{66?VvdRa-$G9sb8p8ahoRbToa;2$YrlIa^vJF~#3#Yw@?Grl?p38JsGX zfn8H@!IGJhYko&IbYU z);!_7Gf^{}LUbrZc8E!-n*D>ckXIJr;>#d=#DB1bi-Z`t3}F$I025>pE1UaSX=(nB zhS^##Hbe%R98`!F|H?AqUFV`H76lNRwAA4}L>J{}rVK_X~YW7#K0^pX0=9DWFAI{P?t5uP6kaJy^R!IkI#Z`SF@OO zsXLV4(XhR#WMoZaZJO;}IlijtIT(VVxtmf3?Cr<|SCvs)AmTOplG+RQ3Xv3cC#EdY zdALkbg|#C`ngRI(100wjOtt)7jvC?S@uB6ok%5vzSv24=#sp!Yiq)2b5xxP|%3wa> zxHHrx`I~URIohgx%(`Qvhl+byO;AWE@-m0jz@&1}hsC&eX*nPwT@Y*ryql&o;>m3VuIT*j zBJL1uGUApo+yKl@+w}K!pfCNjVbb>G&}pF_0;NF=F^FWA&h28%7tSH(WXO#{c^j#L z+ve?lm^`S2yNUTWn5rFI%uZhedT%+#i<@*ld?Dnt$&u4E{lX+z;Hj0t7@tvkL1PQ^6Kq+V+Y|o9dD=NUu@(F%I7|bM6w2tC*^e7~_ zup$P(J7kl@gr9`)X1d{GG_!mh;$-y;Q}Iy--)LY(Pn)7lMAu<9!TT$~&n6@h*= zChT>ZU#LSzFh$t56(RUv^E7Y*pF9m%-10P_mjB5el zNR^5Buy-7w8b;!fEyZl?+8I_XQF^b^EGIi;P6(md#Epsz-$!tM``Vi z2E{7f8%a-8Per^4G@>C;t9;Yaoo~CKR{LCuGqrSwf_M`}?deQvMs=bW^@i304PdD- zD&)Gg2j^bbn|%hwcxRuEh~Od9r`L6odzC_#J_olU(q zYmdf`Ky^x&FC*w^O%0~*ljTM_Huk-hOr~Q_fpT5q+1c_N@+NaS!vcR%dKZR~#-auX zg4C|G5OEu0uQWfISYgnU2mrkjR0SNR7XS{Z+ePP$)3>mlk%i^1GToNSg1*LJi}oGayatM4(X&;=l)X2#cY*U zu%iiNLs8?iT6kBLJAX8d`~T0)35ydZPM0-k!J5s5YiZ09%RP=~vj&#OJ()&xoCPZJ zMuaDVf$NbAxE5|n_PF4M#epgHL9 zA*5l$M#gp=Oy$)IeggWu#RZ`)Qx}nX7;YQF^TsoqcNg zBl58~k{lE5GL?S;bGW{quAC1;bz^Z!xbqfBCMqv1f@VUN-qk9y5+KGBmIVB;_Xk1M zc(QD@9#LgZ>#?P_>3d7J)mp_McBJcjfOCX}H4%`lb;}YWnF00)utq7b> zleaqel`DW5LoWmtpPm9Bg);aMW)416pBH&&-im3LE3mioK?OzWUiFD zWppSqVX%10OSS9YG z*!1?pUQk7$8TV|zRAQ5{wKXQ}1zfXqgrs!q)fA_VPR;LuJbTcFsBr-s!S=z zX;8`!YB5bsuE0>bB+o{t24Pm#=@k#8cn7PvlWw486DizE@3s_f9fHQ|%aP7p6#wL+ z_$QZLAkj*B;DAScjQWacX}_{&(#*O#i6vB~jCW>;gC|H@?9F5|q8zc`6S9g2B}nvgn!=e-O!e#M{W~d~!DbjBY20HLapl^Q@EKtK7lB zI*I^+46>afzgg$DXL>#kZ$Vz!Lw7r?qT7rKAl{j-cPq^+qej6l4S-!7<#IH+S71*S z7co;hs>Ptv6$2l9Tvs&KEi zk?aQZ>hBa}SuzeKa_ItwC96vgJGt{Zc#qTozCSfZUNZGk8rB74#GsM0bQndg&jr0| z|4ujj(wEN4<4P3Nrj|ps)a3lOtn9H3sJ#EtPp5BIh^In>p_z5%Iq5nj2;%E{MS0)- zoXpWPv@f$0;2DEC+yi~M0w2zQ zTUD;&7>;`G?~=yAFS;EcS7jp;RiIitK#3*L+p+;;wrVU`6+jBA-16_6AZepbAh5nk z5dQB@Eg(SMN>x8a>+Rjbg{(a8*~RRmdjwx+*Py5jEx#ADpTkS;V6AnzZB>yyu8kN$ zpId2v1BK1y0fu4usQD(JHB!LD2h_8v1qB(D5YmtYEr}9zcAOOzp-hh*17v9ry=<$< z$Qbbq0UO4#x?`TuQ{#WCXqeD=7Cbf#jTTnT@xFexlJqr z(Wp&LR7%*rIuhxsRDwVhtxbNQ?DPQF$Z4Cl&@At4?Y^g?k`J}RlC{U9TbHON>&5K#&vuAS9k-De|q2;F5o zOPWL2#bI2n#kH!WCNQ+4fk(<5^{h0nBKGh~e>7HyEE4-;xhNyWa`6W(q(M+`5T9z1G6`xD@plOk7g!|CA95fHzw=BQ_ zEN+%)Hd)Y_hY})Hb_KH;XSB$io#_g)!UGj&la5dHpLjbe!ly-_O2eMzr2~otsg#}g zFg)KlVi3*Ebi_Dw?iScF%|_g5=M9YXIldlp+h+{SGeDgCQ(axcwZsl|g|L{C0f@0T zfz`x?VmePJ6UFdrR#q$jpURSTZWcTBSsqF(HgVzGvIIg_-tIoE7R=B> zw&1cjWvua}-<&!~s#Ty&RNUirQAy=?v44A=fiw4=7NRXk+bseO@9 z<`E%=Nl>KEj>So1d&(R!C<0Fj_e0|ywO3&up7dP-P|AHih`~C0>;rLz)+j1pi8kj) zo#zCC!N_I{v9)*VCRD5Z%2#ocX^X{_%v9|UU8H;;RHaa$8BHQ@HVP`Ek>sz=ij+JA z=VWC9;sj7$AR;`(`35Tg{9zitZbb4#$=x82jSO}{5XZnO;&B|h#~9+T4IjfJojr3X zOZbD$6e*&X(@qh10F>OHHYmc`w`j%1e11Lz;KUO3beI~1EpzPFTq_DnwG^f^2!hD5 zlHul!(|okTEJBEE`}koCA_#K{mj}U&2(ht9`eXMhZ=5Oh<&Aw@iU8zwDMTKbEAr*2 zse{NR@GgAH6IA|LGxloCcWAZX{313{$uqvxWIs^F^o3hFIi})}hd~i8+aZO4sOHVt z)anWkF!?45c46|Pq0Z35N^cq+9389k;42};)67}cAX^i$UXTM7)=O--MzV+y9#Y=s zOAnW~%O~wk1qxvfVq^WfHO$__cKA3;^&=3A^NyKQrRkqhGIE-t&AWi?x=b@7c9t9% ztGgqWf*XM}mF;F6=+vdSCCKCKQ4^+=>N2Exs^^T7lgEYshSKbFHzQ(};k>hRH=*CS z#|cB+tr>_`jDy}|B4xh7MCVaDsOHpx=4NRtTiYSB#iH~lLN@J=%4s}HiyI?6G`s^E z8M?&vL)Z^RTqRfI2pD#K?JX3u@NCIjLxva{U{q_FTt^x3Jv8Pr8(T@o6$DO4K4@DX z6d1}|GQ7aDM1|Q3R!iu>u~JTg9vEezIEelm;xiZrv{L!1W%5-uQq4ykr4fLd$yeZ& zXYD}dNW)s0DlR>nWM=R`o4gDwRgIzoFA;bPrvXp8D6pVca8|kBmgdhf8`h4(Y?ZgA z)s-tjnY9s_8Bqa5`25czpHwD!NSy6Y=Q|oXRET@THp)6vqi;ADSWe4p(@uJ zIMGv=lc?8(9nxy9JfB2y<(RYyj_W|wfOJ*s0U+NI^Prwz+>d5^0E{#ZQb$N7hf|&1ejBabZ=8*ND*fM!szfot z?5_$O<#|tO!=GFk&xl{PM?4(Mk=ctJU~!GHM=?-@`a%ls;PtdDbWt9Z$P$0~*juux zV{0r5g{UrS*w($eC^L$SQTBsRuFMDoDNM@24o4vgA!*UJSqkNwKb7X^HK^Jtw%ol6 z0YQ-RktXF;_qAB)BLKI`v4#RGw{xe5v&-Cq%IRf*lDQ$o@$eQ|5D*z$BKs*@zkWAO ziPT0(%^EiqQfNm$351oWi*eCvi;GHXa@hroU=|4(cvz)6hO<>I;Y>peF#%PnLP*5h zFo)blb#a)=P^W?=T)Zq{mAb(WMB{VP%cy0>UlS0x+9hR%a%!2OF68X-NU915Nfw)pM-8fkM z*R~Su0%bScM0ctz!vlB|@a1XkIITAUxpgVKtmI3Q5ogrow2Jmq9=>oHeLX`MB4OoF zdjsn#72+x>8|ZYk7=UJ@sfGtg-*s?6w;b6Zk5FjY={M<1vbVstm=KC3Mbv1vv4|Q& z0suF=#B3|&-Dw4;8?W+LP}CMi{2qcN8nI!At`E-iz}*psV9Vw|tCHwzg|RG|V+-~| z1CQtdBU9I(juIc3P~j_JULJfk9wPExL06|mAPT@q&?uOLceZ?2fbbvB4rXhAFhDCy zFuGr+_A}K0tzI(d%zZQnACO}Ti1>WwW2$*@%7#EdU+Mu$#QpZ zW#LLDs&gP|vY}y-MywFt4I{mE>F^ZB))BM4@a=nbT23ER?%{?6P#%(iA*Q!lsvyX4z-xY2^_t z+U=Z^^M6_I;lgaH;rZYui>c*ZFjZmWU~3+6c=|1q!`LQ) zEK6H3O3^~C_@ksRa;P|l)er~PV?IlKa#dSex1;6pZMPE?E_ni9n?@V2B{`@>CNuE08={`^xLGBac)Z`#uZbZ|Hl#%}dOuOY3g#);M>W1>3AEnCEwDCO* z{*LSybDBPuPG#Q*9q2>waTfSkl$F0n3L#96jkJGS{x85j$Y@2$>rD88$rTWdV)PSy zJ?l@cgVHzZ#+jRK#~yhf`V9tuj;^$5 zeZM#oQM7Z&pHVn0u!&+Ytnf+x80ux^-Kh$9X(6Rg0GiOOeGI0oR#}p8?g9X*!N3dm z5r#l6zA|fYM+yVm3p=p)cSvmVlU-Sz+`+v&bT1QD4&)!5y+?=4>Hnl!FA^}^oXBpF z(AiIy1O{)d3i`Roo{;8i`xZIjmvVxdS9(g%Q_T>_igMn`JszJ?G30WU4qUE-9K|dV;Q!~>Gyb3V5K#aBzkZAu z`oSUydt-W4`quQ#>EVYR`j-dp`-wDd4K3_Feq!$>kA1>LssBAcJvTki{+^wlmA>Nd zU;gq_Uv~0KU-FWdJmxVkdCu|AK6df4N86v`nMWVBcI6ZIXMfo6jFDOGPG|O(jB+e|_SMU-W-Yc;O44Kl;4C zdhWB1JLVZre|mDn5o-=vePep?(6MQ< zB>3iCAvvC1ALYVY-m|O%rY(xMvo)( z+Q1$(C`N!8Z1%pAaNo$V27+lb_DQp8?V4Hilbu@L@q0VANwo`SSz>6^#$h2aZP+au)+(i~*%s9BQZ)_>g zK+;>mC0l3&%pxV%w%h+yO{pjW_-v{p5bh0v)N^z*JLP;HZs>2in887a#sKXPKWJ<2 zD5_cu&Z18Ywq}z`>a92Vp$Ba;xRD}&A(r{^{w7N*;j4I+lgpA;@|0H6{@{bQ8`4W- zyTP;cF>5z^HfMN)X?~ajQ$xjkg4ejO3jt9%<6@i?cA8}Ij_JQum<$f38qg9_Cu8DW zkh*5n-ATj6{2U`@sD$g}C9WTr11jx&Sk^OfQW*$}j1IHtEH`gUD0IMa>4kFgaSEAKE!>|H!tehE)& zl?gc=VRg(`QjtRNa9wZsjZw3#JZpP6m0bX9Wx`dKZ&u7#(oH5-YPYvO=uCP^<*KLI zj>(VqQHVikryk3awoYhUSZ#AT6Wmh>zh_j$j;!_FMo5OemWZFN%${}x8EG(mUJ!X0 z|9&Wl%*cY|v}RQqjpiuYhNOk*NQAKSC`|eHX(-L;w)o0f#i-2Of09UP!qb zaVVzz;eOf`li>*uD3vd4kZ!#;GSR90&fzlDMFwrIU_u?^;rtGfXQ*P_k5uxys0CyK zrdZ5&D9NkEPTf|i7#X^_{LDMD4dpgCO@&7C_WLXFYU_gO0-QF>uNp3x&X&4>;U$wbORQK!!Q>CsR3iAd zCDXxgb&=uL3oLS;Z3#kqxN1za=B_m6E5p}A{KSo46Y`e21KD5g~dyQo^w|O%K zbh21y`GYm!V29cY{JdcrSvcR>-eI5b=x5Lc+u4B^6J!`62Jk9rn^Wt^2LWx;VvhNw zlT?sv$k*_N(U$lBsvh0VRE-?VB5?&OM`Sii6zK0p03@ z?7Vj>+Ikse(_P#@)85)%p|!>N#c9d;6O!ZCg_hof(bSfKR%!AD_B0E>{M*vyM3?mZ z2Mk3qrpTf4Y3Ds@gXj`z?S+VlGQ*vqy;1cT_sd>cut0q_@4Oe&aar;LjAZC=(Ak9i zzD@QCS1PpH5TVkAz_Y0|4^WBC=S4jhHlTuugP%)QWwd5+xJXqLi`8cm-=kF=XiRO9F*?2eI8{LTMJPjj1(s0#*kss**T^rE)E?=o4U`ETi8*p+i z=wU52b@HR^)!k6pNq&|P{U~pNiGda?1*Ek^)`m?2<&2UT3gKaH>IUd}w726@@X-yl zSR1A`R@d~R(UhleKq6?YJYoxKz|0;1%)*-Avj(%+B{1R6elWYK;wFUyo0ZA4&?G0{f24V zxd`EOpl4b(y6AP(|F*l(dD%vsP@N)|Ib$0WJIMC}Fh+X0F74j99Ey9IR;1`k__e(* zLa7@9lyZ$cw_7o)mgbaaY$)c)Tsxf5guO+PI1CnVfMcTg!u`Sk**wJYBzmpmMhA6z zWpqGeO>xq8g6$LbHjs*<4TCvD>kV&!1AB8iS0bqjj{ai*U)p&~MA%~tVR`;8t=%5u z$hyXm6`xq-DD@{6HJ^xtOT+3za^lUHW9GbRUs*vc14n7sS?6kD-6pr1u*X{KoVzG_ z^;mCxOJFP*nOSANYVp#Oq~>^&T8{RlAdO{%<^%i2@0i9idmEfKd;WVuG*jVIb~tA1*NB4@`Us4weKJ|WHDInuuB0iGLo zfcrcLfIH#fy1bfjSl?agK!(=B#JM^Uqb-4;aTc#Z=IrgSYnhN=EjHTQn|N2%gvIa0 z9&b(Cw9};Oc5l>XYM$tNKpoA|z3~muGl=SdwmG&;E#~R6dwzq{C%_80r+xjfh8DA8p8X`2^cOJ`%FiZiFqa{(aoR%O zgyzN7g`D3M`Yyl8QU_rx4jwO;3OYVztd3k6K^u#0a!q`@>Sj$L8wnXz)c!5aRJrZM z4Ycx^1sgW@=yD^NqyWqzy`0M499a@Kx zFXP^pLI4DAa6n2`f!<;_-lI5ylomUc`B@P9QHi3m*-T@;&Y2WrW4HL@JVI0YZO*!& zila1GW_TUvr@4;TWscXY`({Z;^cjqyyy36`Mck{olq`4WWl<9A%(@0 z*)wdEgLS`bBD)X-P znXW6~S?&*Evn=-~-Wq^;Lmx0^B!hjyRoPbiR`2fX@4lr{z|qDI;KSQ*fP_N4K?cy| zrq{SblzzgfS@fOMO`%sl>`bLyP>q~8VZjoT2R7(@S=$9l&Hl3W3Mx_NB1|D@%5?py44Q97EEcN~{nkl2dct*a5B-pKUYoYz!3ThTb*Y!$MOw`ebH*m zKgf42_qZIv#XQ-gM2p&|*`jd~Y(k4II-AmwhESO*Hm95bs<9|`1zj?oD8#l<$t*tE zaMH=&A*=Jrj+QG;&s5GE7Rq!RP!DOY2SXhT{IqAp+Z3cpg!orOwc$yIx5!mAn1SHC zBkg~TzfCha`&E;(pF`0givgF@{sHE<3+Da(={NMlELb2HfdY>Qh^$v%sx$(k5+#y9 z46Ij&MH`XDhAz9HB0+OYVVyQn-AR>Pb$QBxqE^Jl_!Zh@-sxmV>SPKx;eptWg>Yn- z&jTSy3$~p=VC_zlAtKitU;`d2KW33Ng#!=pQD0`Gj^m?Q9Ad-4Ar`HPr|4zGg(Xr^ z+I@yf3p}Oyethyk?*`d@NO@rOfZ_1LyEtgNE)Mb*E)5`tIj|6vq~l$mW4{R|p?s(^ z5z8A4X%|3XUGPX+4%S+Fg!Xp2VKUr;sfuBaXmxy^1iNTzq#+1jXhnhgAp%0GyPGeF zN#vm2DidrPgeK0$p(0W9Y}#^{-%V-zHPy6AsL;LBr_bMT{rn9!CGN zB@&>cWryQbRTaY>gwAZA+w4PQXz)X&#DN%_v|jnkRjmd+j6)OE&lXkKoNt8SvSL_< zIgi=ua%Hkx1Eu}FjI&>XH|%DxIHnpp`zE_pCeBJD%3$KGbeg&-$nA3?gZza*gf99E zf8w>_iL)c&HldKZ>>n48Ir=jVA0p6FLEaBrH{_~mooM|yvMkxFI}Tm3E+fh_p9}F8 z78A-TY}?Ph@op+gm0Txop{XF^BQ-xFC!aKoOjtF}5km_-hq({s=16Q9ttysnxnHaX z*(g^@g}<~xkH}GppPOaMU;5ZD@UaVAGVEOFoFzb5`=o{P%=>f(O5my1(r|t#lHsY| z$c259#iY`QNChZAgu^sqeOqGhC3RxKHoP}l+VVE|gtMvRCLq`r)g*5Q(p*R0?Cp#d zkJm`@PY#tghjyx=NMkX2u*_jE67FXW@XVA%fX{lPYS1zPJ{y`m-v$&LfmuDn?nP@5f_^bSf&k<$GqN zE1P%th=z`@@b|d^5I+|{Jg*P;ZrB1J#3*p3#rdz7J(>Qsf@yEAdYPqEuQ9RDwLwo8|y=zz~~$ylJyZhkMYyP z^SUmQF=yroO@YP&8Aa_D)od#Hf}E$wX3(ssv1UN|~K+-7^g z$hn4*NJ9t=+7UrPyPx+LlOoUGknzn4kQV~MSw&VbfX)F(w*2o6g2>e-CCQSKNEZ|q zC)&@%y;E=~5B}8MWS}L6H>_Y`Cn+;q4!5&aq7L$e5D?^74$sccO4GzVK5EhOiX{B% z*3~wGDu83zPX!8t?C|289EUkF5k$7Wj!e|{m1@HKrXX?4zq!_D-w zWG|(`8oI#H7rh0jl3gIEhav7bmipUpn9lAkriz`Riaf1i^8WkpepUx&Kw11^Sns@P)`t_oA z+F8cHKi1Z9&>dzez$9?{32~sXt&ecf=mXMQyfcLrZmIhbn4QxCu!1on1H?QUMn`hl zWyCKD8CvM1ozzIvMyVUPipWOx&u&u=m$BP^*-eN8(2Q}y5&%+G{!Amj@zolVuLejU zk^n5p)MH}lNGJqjF1)LjNs%{Ax=)6a4!KD?!-s(U| zsPc=~!n!p;b9Ubpf6bpnPKgx1RzDLUra;FnEz^5bbl%Q5QYpQiHP#!mYg+GWNvf+G zlIrWB&syt!y?&d1UF%uTLG3Za-w3_M^r&ytpw=DMjB;AL(j453_NW;RtXw8~_^}Uz z3b+thfY40NvIiFP3sZF}*@>S_>f5@fqbHu%9c>}Bi;*?G@hH7V*O}nPT$wnzU=urM zHhUd*M7ECPTD%2Vq)n=+`lgRdxoUtT;jIHShstk;@txH-UAG0)`E=b@KNF^_)!FPE zNq;pfeyi%kS@B!-do}Lx=@A2ki94^Xmzh&#OvT^-VvSCYER196{p zImnYr3)0yfE?Pwxyt5| zBl<=i8`eggu)>orvdkbdQwO<&l|vhC{M)X!?X=euDr|n&J4YZx0v!k;bu##F4GB{f z^|t`2Uj1Gee|}9?ey@H!QUsaCDzmc_^*gvuFm^!#4|iT2aCt|-LE)K;sb?XC>9x-uNtV#9_l%C1m&XM7#zfr9Q(n$?|EBXP`Pa{cqBlnc2C z0n1zrG4(QChuW{gj?p$8L|#C-)98-^mRM$_;_e?!X}qFQb8hT_!l5QEQvFzdBC0{k zl6N)j4dX%Ksk#u2!fhA=OF~^G0l31~FsbB~MgZ*!>Vzy-JR4ZJ?IAPA=VPH;w1O^& z^KGND959vfw`v_ku9Y3IC-F7P18SK#7;w(ls7ESv{y2_y)JOZ{=4iEe!kAHp&VYw6 z6L%_*$z?^D|DSkMnTY!*p&8Lv`1vmXSdFe4Y^d6yZlSt=sH_b`u8|!A zJ1Hl0zUM4eM!l;cB5DEg(>Saw|9Xo_{AuX!^d=?#EIedO!Jjps@O6y_uI;?g1v8<@ z`{O`%y+pA+KU$&?sz|kLUT#K9ex=Ve7Kgow;gMosGXse>w_}^HX0ePi(?qr8aJFpo zOQm}+ZRp;g2ZWUu?M!e}$rJYT0HiTgl(3!{Ut&VmVc5GPvTgBJEXcn<% z^4X=&>CxD-$$mwjE>qAg^R}rIqv^#FM}=x@r3!TaTOV@%tvNAK z^s80DfQS)D70>-Lpdw0`UrztBCHvje;%$KWO-n$*JC0%yoZ$@=k8nIS8vsRAZ9e0l zvho2qVq&*Z@cz4Zi{*sIvZc|#Pw5yxveB%gG6vxL!T%3$M>L55|Breu{Z-HuRzQE> zesyH-K`Tu*8g96>{0z1^@DwbT)Ap$k`8X-P_2Vy(k0Wxyu4!`OSkN>Cn7=t|zuZ=) z)%r|f0cN*sk#T@gLLSG)(1O7%H6zc1;k)uY-~}5OnqTIo!*U!GvLKk&a*^sdW%)-* z#wmuMPDC2?ABvY8fjf{%^(#YJdHolM^3~<90>)kysK3N=ZvR6Z3v-%vUKV8LJ&tO) zig4(aQg!!)mtW~D9EFoeZ6yCiOmP3t@E(XoMCTt7|NdvyZB)k2{9!n2EAsrczwF1o z{d&5$B`7^Ueh+`T$5{sZ{_nc)D}Hao`0vp9tKDvnrtxq6!QD-%{k8&- zIiDL?+Z64}@|7FP8Jd)AWh6b2_yTNS1l@tj3nbRD8OYX{u~Ak7U-6KTjrXVT{ptRf zojrNx&^fqC7=z`QlJ6;}qU*Q4q9vm9TP*Tx9`|HTmvV6mgb+p4wz%#RT~1;VM^Ezz zw2c=m!d8(K)Yu*NKR%wZVnO*qrJ&@0l0N^RFfe0-dSJ-Dl~L^$bKwcL9G(hy(th5X zOA<4Xb@$+jGA()qY5fa&N_dq|fC6gL@_RV!3U#)Mad{Yzc8~|ifk($}R~#}$MsU=b z_d2)@A$xBC^)zv;9%Ics7X~2=I?mYuy=9ZhanQaS6Js_@JVB7{E;Zy=-P%tKSoqjS0=Xl$I$9OM!JD!wFfP(*x^>~8bBa+=fX5& zOOxlyG**yt6?nn5i&&%kNCs%JOs-uuLm}k_P?`b3^j^hjo@5sun0$!rzhXD-sT^$Eno>?Jlvu{9^ zM7Wln{GqAM64v+;UM+M*XaWoUBbgz_L=iYIZalL*vu^6s?EiQpd0N4H!~;M-pNWyc0f=p65rkOhBc=0BPRTFwc*)~lgnX8D@%V1B0_ zc}???3UiQwbHzUC{PK^MYRXthyPR)e(#pBs${zXGwQf2$v|{U~s+HAD=GpG<(;PbrkG{1JVJTEluOQDVmrXc-O$}pFy^C_pW@C*XIOzBW? zLl##J)0$8NukT(^q)C#%#ahQ@GjaA0Ln7;K$Jtz@v&`S@a9cW9UFp9PF9VC)( zphy6dSUW#}R&$iE4nWTZ{a(E3^+RdiOz#>H0Xn*G81T zB`aTB!|D+3DVg6c?BZKy8RA9$##m1J&sm#V>_{*?CL$6stMG7$TG zUFbcAXI~fEdxf|qR@9V@(r`u+^K`Q5jiQ`PS@D5HX&qTbC!FeCZaT!~m&!FLeH}t{ zFzlpiX`?bM7EdP6X2uGLV66NFrLbD43EG&0n&a7|yzXahYjhK-i#gtKbIBFO@Kic@t)5gZ z@}GP!DZlwEmew@6V809tcoy05wG_PAaYixvA0`ky8~HB|SPKU4@z|1jdyNFKHu*Q^ zp5bv+nn5slWJK^Q2eERA_rfN`{07ndC7}JZhpR`Y+z(4WRNE4 zlDH$#lKd|}jHf6GqAmA!FJ?Qw#rq?9$Ajr_Y4#U|r-`q>t35AvhQRGGqr$11PuX7~ zm>|;RAE~7CTfK4F0Gz&8?44gBDtT+@;_oZ`NP6g>L_^v+6+Qy$ogmGl$DU`QfmUgz zq(ZX^q;oX$NG507IgjL|6<7)}>-?%PFP;m2RW-1{B$;ogc2}MfGOQw^bfxubS&<-3 zQdDy_AUwFuh8g;WxPK{35PinWY}Y&FZEhLVku2Zlu(XIpy=@Q>3#tm6Di;YR&CzQS zY8D;ys7rNVayRL9T0rt+UyjJzy;;z!VwP_oY`K9x3v%3L#hP88`2Ye5zeDZlAc8Ev zc_vfzj>Z&0pja1LtGbiFnVt#3UL8RQ1ax)dRVRebk)fA&hDXio@XqkusiJ~NXoiY= z}vHqxJ(H;s^Moja@GfXZRCbUotN+a2_+KQQxesw&l_G9<;2keo=fH0VVLd3DW$MA z&>4{2=%Myos{~*;DmCQRWe=8H7g~n2<;X@L$kJ+;3rjaH7W78d>Cig#7{6xC9J}{8 zA{mh0Qj*Nd+72!VgPgZSo;q#s z{b5*mmo2mK{b6W-*U#Hwn~`P2T2dY%Fz-7ZI%9H^a$ph4C$F;yaCk*=r)OA)lX`dKh@#M@XK+EaYpOuZ#d&x^sd z^6pl}U;kPU$6sI6{_6-V_Hs|P&E*pZFyB*bk6OOo<{=)n+xSW~XW>Ebc}XZPc5h2h zCEj7YxvItpFHT7uy*5s7NF2R3Oz*m;@Jwv~5*Tb-=cfI%bBQ}6a_Zk?2~sp8LJyI4z;O|#F%*qm`8OpCXs1NNa(=Kq#&C7 zC`21LqHv9hj*PWm%)nI{!+pJ1%iG6H_e+7e6%HYxt+guamaU>Y+@(!nL9avQ%ys3+ zO9en1J;Clqn1u0?BCC5Ojgr;8t~ajX>aeU{T5pKE&POe6bR62~x-jII3ZbK6z*Y(6 zBz-|VZVhP45gc2qr^Az3d1+zU<|PKiB3BLw5FHSz?2~c)-CR&$hOIUdo!pgJvTQkD z5dJLsEOAF`T>CUnM_Ssa6Qrc<6Gu%i^-m{x)1Z@s^;U3C)1bxrs1FtQj3vj4u?k|R z+RtOkQ@hx#AQTx@Xn0HZj>9md?USxz-dJs{WM`;w%PyHJ#284^ikpPD5*k#>0yXsv z#+_)!AwEL(6LKPO(>|^BpZRi<10GxfT}e3i1li?3lcv-iu6=gVv# zl)Qu|@RfQ3IE6IkL@1s|gCk1#_0$m?r{E7{LI@B~mQ6s?dxZR0_8BJKFFUz-gzp)B zk+C|{{ZBsKYytT(z-V3jPhryk)-9ejVf1iCPE5o_Uo;ph(hV}3#YcmBY5s%WJSW)5 z9{*s~G}I@)EK~C#zc}>aQkl%Eo(@x1K?IefYAAB`Z$eQMIEQo@ZTYH|C=`su;y$xC zh2Q3s^VShgnu8^ypcXQVgSYd`M^M^hJYKmNAS7raBxzIF!xGdI1&o~B)L*c(<#8)70|dF5 zNR17vX6bEW&b6boo}(4P2#H^8V`pgi-VO?BE<#2@DYS)plv=Y(hDlol3#phzW0Y?` zvqPri9f|xUg)98ydZQY*MrQ}8Qk8%@7@Ze$i{q%Q1{rVLugWsd*`SP;d6AujJ;v<$ zbks9uQ!W|v;XoC|lKip}zKIYH>73*QcS7}^REwCqSBc2R-a0UY3?AtXGiV7#+wg-> zWNyu4iGWm=0~0I(qNm2n7Nzd+2#!!>Z-~lN0G0{lzaE?P;dhM9u%!q78e&HT#Kk9k1#9H2Ftr=3J^~TM6anhdI9qon zRd&@mL#$Z|2r0o@`|e>slB)TzoWT4nIUW9})a$!sq;C7jR}b31b&sBGlftDddSkn; zwzOq6P3Tc`9lcmk? ziX_-&r&E>E{0EAn+|Zn!zNN=zTgV+sxP+N|=5??d6YgMyF&PP0lKfqx2;N0`0TvPde3Z*+*Y50KyT zOGe5Y1Jur})+m#3d$sd4gJGriWfYAT`4oKMGp6-E?y`g^_NkWWsZyCxvuE{bg#>tt|*eg*aELkSZ3OmtEwt##b4EeT{D>4(!%iQyZ+#5=Q zkH+CA!_<_Y{}gg1e`i{LG7L1R!8k#&i&g9MBYlqg8~Rji=x!X!i5mJ;jj_NtBgJf4 za5RNd4*NXLIJ=A3RcxZr=xg^=(K)g=BHgm1MS>O8f7>`h;pK)_w4F!i4@robEhMYU z%)}npP>^skDIO#9b3sofqV(n&E}JEH361BgH+IJ>HW-KSc4MAa_w>n!=f~U5EN}AR zF##p~oPRIljs(jgo%JRgn5@ue7^|WE4pH0=yy@eix#$!8v^OUca$LJz{0|3q$|L&e z&~jz`y9Q$u(fLE<88~}Bh5(~RM4rJCm#P2kZBj}}i{^jsn?|E0BNz<50HLNqE2*MP zyJTp1!M2tM9E5iyMtUgAM@6-=P77ABVhK>9sw9wI#53Dk>tMxT!}m#LdZg$`ek*Uu zu_C<6L{*X{bh%CV-3CC+u(PCqLgswN2Qgg!R|Zx}6h#a2IX9e@mja zQnrr8)%Z=FrVwMQ~d?+ovy6pZ%CZ~LItfuQQ_i?q2K66 z|6&7Nf2d=&1Eb&JkLozq9W{s=dKu;noh#q+K&%f#rk0Ff3XK4Ll7CtV`ci1?MA@ts zU11U|*Y)`sAIv4E%X|@EqE8ADUu-6qZlvV_=mreVQ6-0462C05O!*mj13kMHS;&ip zQsv!U$#}l(prGCITQk1-e4ZF-CS+I00A{V!etu-|2O11K0yx75QsceuQz z9$uKNf$=@>p~fe}JkZ!zr;P8bq4^h83l9){YlI+GPW-LaBhv%$R{;R@m3v~U?!H#H z^E$0^z7|^gKk6(xM=jLz-1ZBb!%z+b(Eyxw9N@^&k+Yg+&mSkap8 zP8lD>l0CqJk)-d&Y8nUD8w0ifmJ_vvTBNHbp+&DEjB6yOw||S4-V+4()w*-F^j8@8 zH^Kp~ zO^TX+v)R0X0rS%o$N4Y>BH#LWSB9N3VC6wxw^@tjCoi5s+VO1_qKSBwj7M=wWE0PQ ztLmAv(Y{r6s9)*Kaa7zl2wnCh;%f%@ZOev~)sJ+Ic}cQZCL-T%9Li zLLQi??gwaK^0@T^v=uXT7qnvZ*hB4ah<%fb>WDM4xVy!qwOD`ZXFbe%^KR*P3!hoV z?0U=Ix8ulKN})!v8&1C+0DWPTJ@8-Hqv{=1%zth#=sA$4DCA^G200G@QRyvgLctW-Hm!d7g;!$&AWf_s@<} z20!8nHl=c-O8dZeizKU;B?)HiG*o+scgcL@*N>EURNV=6oo6`$O$6Ek8a+l{TP0$? zUm*bo`os|Mem^wu{N`jE5kIS@%UDamWMQqJaW&hTT4KV;E28BGRW~HZST{ci-8`?+ z4FXko_8nbGk$8Ngx7hrar)fX@gc$t@Q`^;sVg(-LzGpQ~cmp34)Q`Y7kdLd#z$hO) zg5R11eprF!B=Exk)L#jx%5tzsl&0RcuK9k4n^Ig!&_`0T6XT6mN`bB_`e;+)GN8gX zM^Zr$pn@dBIe-@#$tn-w^23=@2Ckmtk_kC+r$JW!@weImac4CpVK%h`!eu&-{>TTx zVm40UkEX$`_AN0f%{AqZ{Y5-*CO$bTXQ=$~bgzbR{FKN)TzLc1ML+?^PXaRYm+_I& zu;zNcNw#W}46e;-7S~#f0~yONC4c6U&pWc-h)5kHMlD6Wh#$Sn0rI*lbPaJ`+~SBR z@BM|=JCOafhU}+(zj=f3V5>7k5@M|;`v&&2`t_fM*I$5_PUzg8t!sosf9?;?QC+s^+wS!Er5bib%x2fC;&Z4D+P!66*L^}mJA9oPR>H4v!amo;p^Z2l%^cG#^8w(&%< zZeb;Y!i+8?m;o0O0JmDJ5T7Cd<>{=K0|~1ftZJ1yLJA)Hh1>>n!u$8oC1f<>3Bdmz zdah+yMT655(0}v|>OaEk&x-`~t9nqs>iaDc5T-%EKdaqvd=h1K6^d$gp5xM2-k4+Y zAYmf9B9VzmphBtICh@zr>E2{M?IQPa9%F+S6rr61^OBE7Y(?ogphcp2zhqHV0vxS17NKPbhL)q1AiKKylnMcwAFlSlK{O?YZme7wyMgmHUT zc^u56#b)Vf!T*;xmVsAxm*p3!x&LZ57a#nMKbYpPZI!>N9tgyNP+SLI*F*yk2=db&lIEq)&Ctkvg&;Q9lCl>L!G(`d}h0{Eu^h6E9hK3 zn1P>kW37STdV6_(p{$nQhW3u{Yp?UHB43tF^<+S6p)vbI+4IG`FmE zTZc-|xGzL%7)isgcc6fZ>`;Ayd^+n8L%rd;VHgqd3Nfo;IjNAdv0;R|HZ+!_>&t(T zTW(Y*iqnu1sYc7Iy<{gL#G{x`An2#r-^EFVdVUv1`rIgmIQ>Y~`fmNqFkJHczF)a5 zo8b6JK^>`}_3QAnn#w2S`d!##?-uHM@j#bU;?^&jus3SBU+HT0z~@nqc>Z?xPicUj;%#Be`AIeo`D>oqSShw?D>V zY%Kp6nmFDN*V#9WB@RF=V3sw)RhIQEc{-4OXgmOKBaD$L2PQw$FGMP}{&cBlfn8rN zd+MPhw-SC-c2xL;@uC|ql!W+GfaKZzTy&gB?1r$bq|d@Z7TzCPDTne4#EJJe5z-*| z+FG&v4-3Z-=`ZYT;gqUOlj$>bvwST@5Q5CuY?c&v${iQZC_ni9B>(CV)AtxN)&jbY z3+NhFJa>M3-+r9?;RijWfET;3$Rc8u3F-4NGNLoBS88zC=}KpY?kb#=po^%V?OXwU zw%(Zo&XFjTAz7M`q!PKADGE&2LXtWmN4{fys31A?IP(zxm#!~I4p+^1IX9Oj2eUpt zFge&V1{GcBiLtfKpR@S$98LbgbtPy_4Xk-|dVWC*NkAFU?h=crE2na)g82kVIC=^O zs0&q~fdPfzmRgm#IV*@^k>WIh;j_3{N|I8MUe{ZueT=C}`Qm-0Tw8SyV~6bB-m+rx zb9h2~q!eS5{ZJYGXE{#i zVuhS(A(%}f_R*ytP#li9iedo-^T|r-Wk;~`8zz?;rmtd$Y zZ zb&dnw_%YXWD76*DPu5!QfCHylr|e9@Nzx3G>TYw2#eYdA5GJM4cr-G?OM&hwB+vBD zS;vN7a%m1=tm6vDng3X&Juv{tD^*35YBJ7oFqc}rpmUmY(e!V1j^S+qWN*jrGV&9g z)KL|XnxAj2PfD?vBPYv*$yQs>9#va$E(75WWf!%k@*$yYuS92#p~TkEv7Q|(xxm28 z_`m^wukpdOoLgTLM)RyF!Q75-Vacj_C8l76Gv|_#AzZKgLe}BtPLy40qP1x`x>L{8 z#6c;xoC#tXohtgLB-;zwjESe6tTVdf*M&q}$0|{OZh(-fA&!`zD-Jj}z{Vbgl(M66vJ|Zi0?}AYfVExB8WW-3Jz3$H`gtU(?;$%+k;7(;z!05vz^^Gel~R5l+orM z3R>x6dqe}Vz1Hz4>-HQ?*=qwPkFMz?64XWh=pHWdFA5JHRXu2P`*a4s7ysmKYK^s4 zW%d`mO$Pk!itrWfiB~lHptzX{QQV%saT9I@>R?|8Yi#w0rD1dvX!4Le7r6UvyZLadhc*v zIFekU(gj`4rIZWmVr!zz^M8@=Xn_5BNK4f2V^LS5oJXQHH@R2~dXJ41%nuw>N-hgeDX2Mq zRMFZqlEt59B*AKRUJ{TP~Ato@!>J(u)gfIZg{H0xl0>A~ih9wB8 zN&bWznB67;&2uTM1(L`Xn7Xi$`Y?OLWc6v`vK-^ViR%px9eXQB$~OeKo`b{#Ik>6J z4`?Py@z|L10jn?*3K}b*)@>e&I!A7wIkatHG4?ll>v?{8i_e1UkPh;cu5n#KDke8H zVJrtk>X!#-FssiLC0rifd1g}}?4jgJc23wCIu%NcoNqGOAI4wF2g5_Bs}qa7n>Tqk z9f9?x(8V(!3P@;Hd6TX zlbbN~qpGC;G~Yaue->%DL>8>=qF8(kvh%V2E$=PXwukxc$3|cVfsi-P7Mwwer`i`z z!<=BHV=hS|H5;F`hYuqH{ALFja?EcN9^V`QKCB6_0g5;ZHV>Br6Jk(?GqAZ9p0FS| z@=o!Sr-8RU+E1GTYEN3%R>!PqNP0wQR2q*deT##VU>}fN29+LPEjc;e)c)`}s?KQ{V*2Hd91aFViU?s)gUOf^p z5U1P9S=Y;ycZ9~>!}pE~d!WD?2Fg}vjmD6LtVY})d3%w^)6CBsr{QWfbp{0a>7njE z<<)gl`wSP0VcEq#qkK^f@-oiwbW`(AhYBI=F}Qbz#@1+R9^BTB=y;bm5!{XMYBmt( zmgwCpElsWy%P+n=yd*vDuElpZU#u~*IGUl~$@h3$nV$swo@P4{ z085x%1qn@|(i0@kqWc6YagxaIp9wdIZD4XsTLe5BgYWeY2{z=LwZ3?7=<*ODty&nv zJUpQt09f}`-R0cQQ%4pNUa-MW%3?I(Am3i}4jY-e@&42X&^a_ag;AjC2`6o6d?G7k z9(3HBh78eh=mxK=h4)2deM}3i_cbAp8-CcpBF`cFemabS-6RL4^CAqv;&S{rR-#LM zOK7Lq9*Me)c(sjBHQyep(V5Gec;18 z#p2nzaZ1>T)BcP2@F4EZ@noJ$fKX5&E&o8idhLp0J2_AfBL;L)g!&$6QPE&aW*EW2 z=Ar7C{mzhRhAD%@^%xcXhQcT5ugG-o_mQ?-1iU|tlAS&Kxcdg2QWSds)&UW6HHs<3 zKD4@#YeOR-%bcCphGw4DRBa>Xi9|M)#UnL6kF;4}ri=$y7D=CPqhMv*@nPbZ+sJ;9 zmEzfj@Kb+2;JpOF|+)D!!ugq6vm>#B{xop{{t0Nn&r+xfrT{{ z1*Hjo1241p$=Wq0=&`A@c8`#+fNvEU>3)yhTr~j3Jek%9SB31ab69rEf1H)q z1qdbs9TOO5g|bwh(L@DK&`3J@Om-;Nn7(f9Ey*v*aCwb&DR?uHogxjpJB~DN?!K_dv)w?=f4|Dfg z>;lj)#hgQXEi&QOA`RvoYO7~3Q0?uac@|MTd#Kh&1OBpqa>RVz5c5v~F$YI^BgB}@ z$E;;1*S!45u}VH`A`nFsY1cxut@RqdYNCTO^XJ6XsJ4L#VF()jW*qW7nor{JV_~P9 zWtK|JCcloZmn`Cf>4(h>8}thS*C5p2VRZ<>%UVHtvI>d}{XwU5$-$3P1h{IsC)Caj11oQUBs{F$a;5FaOkwH| zSCcjkjKD`WN=wB%TXpeH$N`dQRYf}q^IOr*{a`|BIC3O9R)RJ|Of>}Ae!$LF0F&Dw zWV=*z@R15Yk{QV8$v>Z#AE{7ik`yWRQGcpUrp-qy*bz!l3S0bvc)J^Lbag-v+7eVE zU+83xh+lZ^wGM|~ zZ*WDn%Dv(&%k3Q0T6I`**=SkVZFVD*YX*Zv15721@MGU8i1>(a{+9w{oPXL&#KFTl z)Z+UnO8f7)rNH5qnzsw)ggAFU%(YSej;`&8w&fKbqE^p6ZJF( z<>#8Xy&%qE^Z-U7A+5*+GPQNO-3@^-qN#sFXmwT7Y7GjsX@+u|A*D?0JiWoFRM;OP z)YmKg8|!{-!F=O%Xai9d-NxXRGWupsrgCLUKK3>G$o zh{1|7bRr{TAoZUGugPAX^3#Q2J9bRDAJZ&Zo(Bme?(?CqEJI7SCecR4&_sn+mLanp zs3|oV$_{FQ{aUa|9{?F64JgEpWz;(5sJFDhU!g95T98m@PIZP-6`Z5}@B)S{JfjeF z7{0@qwpMXlE+0r%>I!toE{6f5OhPfTXAm>B{=9pnK}s6%J@hu1>s?#tfn| z+Plen1*I_faDJW)>YJ)o5!Z3WfIyWZ=?%+ci=w2W{-KaxFy}J`P6OeN5>VB0#{+ut zZa)*TEH@l6ok{z^_{?ZYJu@7|wdFn?k$*ZMDiZmp1GrBWk;nCHByu|<IEDSp^}3Jzr{K4bj_FDNX%bnX1-g-(?0_-0VYBGzggon;B{ZfEM z-MS0$OHFv@DM`o+Jq^dbC7=p84R#4E<|dM3-z9BuepVn>#~a7)!y zFF{|2KT$&c@1z49YQ1qO+7v4>HR)}S{cOMxf^h9!p2 zKnKID5EKC{A8|NFTW4R!6Zb#^m=SZ3d0!2vLWY>N`PG1|K26r@JVo(p?-#I^w8*_{ zv93%sW%6aIvvryYD`mnDYl?6a!uA(|A=*cQkfI#B)nRZuDQMJN0~}9jYSfOo76bc_(t{GDDsXo|0E3AQ$xJ1Z_kP0GZ{jAV-!Zzp#&Ho_O?VkE1k2=F?z4 zn{FCVY)l}}ujX|AnvERML>cP7iQE|`GB=vvIW07z`5_~AmFgaD?-%Ek_K)br_IIcK zX%a*FyZd_V&JvBj{t(@XxAv<^NPr`3p^{*rS=4j{1Q`N6Y8o_k)c6Pn>W=ALxEbx) zHA%JGd&faYm$*lh!nBo7vwuBVaA2WBE{ps-Exy5;M5~`9Y3k8iaW>?m=2&zGs#k+X z5LRB0)NZf#v5U^(Z1DeHZFW{KPaL~s3h$y(OMoisBk}uSijPf zo(Q~}9)@h^ts}n>F=GBN+qXLmZ;a}Q?zc;Q@~%W1h0lb}r|}D}4t?X;nuC&3tx{v2 z3&lS<<78R#EQBs|RxO~BsJv6Y#}05m*|v{QZhmFaz7Bt^1J_Ka{2$*d-r&|%Ie;G zUe;QB?Y;I+WwqAQ`jn#UqZF#NM8&*`Ts8my>Ev-o2?{AFfnQN}KH_1-0=k$*Q zADDa1%X1mexR3FS=WiTT>;1^a0H{r_75I{qgh8@rrEDJrV@!rXN1Hk$-ABQwi^$O@ z>~kPBQOQ`lLe}ldzToz43P;0+^iq{8LD&SG$-vp^jSak#J!VY3ww82)jn!=u+EX2+ z*4SA1VX)ohoQ;)1WpqTBl1^}H{(f9~CgD0^ASYI64pyihqv=q%MBq^%0(g>-ID_&%+ z4+CCz48hR?qPe$sM`-T}KC-~1z-nJ+3MkLs_mn{4a0?Xgzdq98=5lSCRih6l)k^AZc}`C zx<0@nB6|#x4ccHbP!R{Nnf+J18_*oi9nkkHp`(opnCL7zo-un8uLK1Z)DRw1Ma`@Y zp6iszmNHN59`y@0@mE^?zq|B+jd`4Crpyz4AaQ|uNHU7IVWi3vBR;<;^dOWb>y%!c zL2}_sO&Vc!XMi=$sLIi_uj-x68JK5p<|hJ_B2;47e}FEdXo!fK#f1-V($N5bL%qdr zz8aU5KQ_o^4FtR{3s>h4h6#z0N8!R3EAH0Ui$$eu}cI~PxW2VLp668e=Xt&LB)t8 zUkgB3FC4KK83Ul4nRyH^8IG`S9F-^16%yb*vh}xhHQ2`7fvk~Z+rxP)JCb`W_S zByB0u9)HmI>8YkuwW=p*EwFA}^2}x0jipnkXCpOh4V>Y6ooQPQC=l^0>CNMAO@w#( z&=d)1`~KFu!mv(jax#4*`(aFwEX$G%bBMM*#lseR(B{-oF?2ZoY6wWuobN}^^OGba zOL3|f4RPdPqN7q}JMuTqgpJ91q)`g8z>1Y|YTQ|!A*0R4(BB*y8y4{!J{2^L;w79i z8m6%^;xHItd19oH)Svv_$R~fd=qDuuAiU)XmVv}HVb^8xq@SBy+<<%wvH(%QGEO}N zhlll2bjo2vvJa*o8$Xls5<#>BNa^oTY@b8A*tl*>W;*XM;PFi#JLu=RP2UWopVhh< zRWl5XnKQAW6x&Ls`>{XsLfoD~h-w&MLT%dKHITM+XuiC5uwE6bld4ydW}$ltd%nol zCc=Z6V3bbGU5m<|t(w-SBuncIU+7`ngMYUV8DYwxOZOih53MPOe zn&LVxu>w3aQcgb_ZD(Wh+Ej5h(8dwl|3Z0GE;(@hD}$PILYO>%31?2$EoD_{vMB`rQH_2gTl!xl|jdUMm+Nk4F6F?Y}z(u3;+ zME$nf!=?fVf32L$Z->@SXXRk<919ZA%vR;TT*p7zpQ=_(OwiD&`_FTJX?ojcX6sboNJaPH&ki+S zS@snmW8{qDgCInNh7gm=Az%U3H4VuDzN%Kyvh_7q{DCoiH_mWxtN12IsfIzEM!_^z zH5N>3&1EJ8Qc(<%0+&EQ#%pHF+q#jZteWxSE@`3b;}w{vph<_a^D-W?}xZ`CX)5 zay7)2rr~9!F&dy}+Mu`$rZV%6d`jxX&q-!zxtO#usKYr7ida6ZYg$vdD;KxY>7Q`J zyExuPJX_p>im3Y2xkFJaYWbYYN^)A{S7LV{NnFJRV9N4J<=@2Qw0!{&Ak2ZhzEM-V zf!+~d{}h4$u>kyks^{&CEHWUcH~dKKXjt3Nx!M}fpdMdgaVjSNbFyc*V;-r0GFy~W zC%><+&p*fR0uB9h=*=Wt4P__@WFIA)`@)w_Hup8Zv&Mme$fij&g00BLmVjh2qXaX- z!5_c-n8;rM&EcH<8hnR~Ky5XX!n?{@vv{1F8jcommEwAc1ekFMW8w`_G7--TP*kaX zL)+zFd>$z}b~#ggReLf1B}`^SJ+pDTCpVe_>Y9Q#S+(c+^2+J3LQB zt7iVbK0jBb_`~XHE-yP%w5hvP!9YW3r#^W9kE}s{8m+>|;3r!5@uJRn-z}x)1#@B}G|kV6d0Fdp0!B zi~Na8@ocC*J{A>a+jj}S>=qpEf!L##$~2b;LbpE=IUI6ACU)S`V9m6&s^4Y@2Byc% zBM}M+gGa%xXnp_y~Y}FXg;^<2<_rMa*@t!;}{A=Kh9AaQeG8O zdxmyIJ_EVWX8VX`wdT~G!dckt3}j;xYFRh?&N!eFlHws=Jl1M`Idza^lN`;Mvz$&+c)6p4OY-XHP0(TIbf4hXcc zw2sKcqjyM2M}&B!BU~4UqodnMYq_qTQkX-#-vyXzqxv)RY2aljWEEMmpV-5fq_vjX z7=bop)n(;lQaTbIrqt6QLt`^4j=daY+$e;kQrGOx!HjuL+BHT^$&XPC5F5MTcM(Io zOa%9Mb@G+fqkpZM+BJYQ*NQjMk8pE}=%nWA9fw4&^Iy_8H~DoOC4MA%jw!cf2|b%y z5~zam!&I#c?FX4#`#~jZ6}~IvQTyvHrAUNB14q*5SePG+%b#VUi}3779v_maq7U=t z!y^;%DOjh@nZdxD+W5P6>+}buWzH+KD~s2;lMbs`&#^BwYna zz+fu&b`K0Tl&BXIKgzK_@>=uglAg{{ihbt!~yTv&Qg) zehPQ&vWMYf8y22Az2JKoKxge$NZG(3xUf!aRfdc$X-FA36WaIyPtZp}LBqbT&&*h# z@pk+d9V=E|g06Qi>$F>WmZS*+VLwg5T$!YDp+k!I3wEEEbU>EkhQ4-tKIl8G`W@=M zKRL5VXJ*cS{Fp)+LH&VBKr8uvwG5R%*w zxi2UBiTmCVkmS(;D_F8AiEHD%WGAx1HTTunWafL$s-l4N^CcK;Q9!x0F2m@BHE(8P91aMFqnaw;b5L;tLX6Q0iY4kD$hPubp zg0zpMqUdXK$=Il`nbq%GIc|kHX9W zds!7rSq|7BhSRV2=7Z6{>CLr0#q2jjQ)`>b4G5v#LMV1}9!eS1DP0hf{+^Z9vIWeX z!bGSNacChBC_)hi>2GCr0k+6l*~PM80??j-76 z@dc=A$2*;uo<-w)wn2Ml66|v_LoU8Z`f_Q>R2TbYi$6}QYv(%`;WxJTsF75rR{moe z1B?&1^j8f9S-}D*JM}`T#(KJe*S!<_#y%LVvf2XC6V5P6Ic5`}@>3YLUa#XAFO7Jg zvq(2dpu9A|_LN#pW!U))AkcS=@r?8==82<}4(G`mkXtJ^2N*(agLw<)A}X9e!TG`u!e)RFxy->he9DHefQ02Lf=U}=@3J|Y zy}zu{`^!S_4~v?EFLdm%iFtU-(ZH!kxeag{bl4cTPnpY@6{uXO@K*Z;r#-UELhsIN4zmD#nCP!7J0JwEO#JIJ4L&4VoeCUA|)2 z(kq571sI+bAV}Dlvd@Ci#ZMb=gE?sB6k&$B$yLyMn(fe#giER5IK5nD>3kqFIzM-% z7*1svsAZYvM~354&8&W^NvM*_IQ1au0Bib%W%~l~tp!iPOpWC~e`^S^q_{@J`CDNU z4;OJ7T=_nmp-*XU5^G^@Y;Mt>Z@&FNoHhd87hNsSA7+y+U&jH_uU9W-WwPUrv}60=R) zLQD`HNiOm~qCP0?pt}8QrdA2YoOC(^s&&OeHaLTxs#ao}9);vtQAlHzjx&1UQ)TfX zU!&C_g>-p!%cC!(iF9MK(hS1*aE6CKVwQ+Ce<(Cv?CQ^$W`S-!W93+Qerf+C)E`H) zSNcLtZ!RqUGeuL^^3z(>^|Nuj2gyB)>s(ftHKD2?@sp5s9qHYi2NMx3|Hqc zbm~bxgJyKh8JF56_G)inRq>UqdUg1GO>|5F%$#G!hUZzo#@{}@_;d%XeN7V{s{%Yu z(#dM4OwJ79UQ z^Da1)4Y+ozHN`=dOnlw2D>U2y4`>b*vzl)~79ule^|bN&MjMFo(8lXS8;=ktur{C> z#|>aP?XZlT_YGmD6BbK@gc+U=P-2B9Q1*z|23(e-Z-%=o&C^&;55j>FD`Bo-t={M} zNUHn4n|J{0jbZ#J1$hNO$fxUykq?uhh34~A<3taGuX4ICH&*Q=(biAF1hl_ntyb?j ztm?hL6B=9@8`M5=#%+TH5^GV&0)z{201870o1(5=dLmf=m%bE(|8}x-S*w+#O7w`v z6AJyFX8`8YHz%qh+M$K0VEeK7ZYQSRgmJp+_x9c6@ zo%sRoD3v|xY)*pFpyqgRwVtR1QaX(d!l&vsQU7XVu0Y!~kT7@wCU4n}i(}WxfXo5*jl<9#{6BnB7a_%~gH=Bwm=gn!_C59GO_U zB28dmZw?ck6a$OAk7kChI;w>|4x$M}+ac2$;zy?sJY}CZ*eiaq+85et+Z^fa7Jrsh z?;tf>*6S_9Hv&gcwLHXQnOBoCT|pW6jq$ZK53B$@gAXp2;zAJjXZrZd7uHx;pEk;tgug`EaBaUB$f{S8t=l!I<%b{*| z@m|zHm53mLEJ}vA#Cd+@uM>P%O!O_oE@I0vtk;F%yfpxg=KiWxy*0c%5pjc2d^`n} zCT%?OXPWCkN3g~uBnFX$#{RoE#`)2oApNCyMOyv$1r1tIEyL0f^NZ@ePVoaaZ`1dC z%EaT zBwY(jOdlB3V(xGa}z zrzH*V0xr~XxR{G++pTh?JOeH1n$O{~;q2^Zxtx4f_Dfvspz~JwaGi19Dmgy>3NDY3 zqpMY(BDYsdN3mVSWvvBlTjj>Hv%M+5A9r^4Qe9CoU#07#&dOe^>!Z)g-l*%Qv$K7= z;?ciN*S^Z!avhwNagb)KJk@~PD%WAv>-SHv%Tm|J*zumN^0Cx5)$dtqzv_D0Ss7>h z1t4=4El{qK-ZxWx^%(j(kE9p z&cghlO4ypvGz(N-r4bv1E$YQS;uSuF8ox;pK{7+%kVKsN3wpG?2i`Cd;SG4P2;Lah z)RPGly(h&zno`?uWF|#DRpm@G4E&~8!JwMwf*b=j9$L;d)soQ^_rtg1Oc`}nbJi3| zZwZ5CUQh9djR|V@w9(pcv&(#T;&LO?u-m9lIC2=MQ$<#`IE6jFR)pCe%&0FkHdncE zd|6fYM04eW*waN*=AztXE;=~w7&8x!gHw~L*g0rH-7UG7AWH@5+#}AxwGNhQf=JUV zJ7b`+6}Px&f;vf-=JY_AP~G-@cISYa0F>X{Khp$b3z0)N`H28XY$J2FL9iXR5y7=8 zfNQU)AY%=s(Ve@qdVx;6PKw__bC8~vkje%VV(VW%#{zOzQOe6eth(k$b_gy5=EuL> zZ$GL#xib1z@mxfAUUe?qy;UcL(MRQ|>x7t8HM+IU%xM@CY|orNb|)?ojrYA45_MQU@VqDiDIB z0$~VnV<3&Qirz;$X?GlQ<#CW`N0VOdl)AQWMW>cPuwkz$1Y0`6!l#M>8y+tnBQYT! zi!@PXml%oF$}Yqp!jc->&zjakYx4u7v7$$beZ#ZDscn_~%?ISSl34DBWoZ@P%AlJd z%G)EfW^@B#+;*Rq6{M?fT#2bvr^vA-$~xGbd3T3DnsXRR-9wa$a82tYEH8!jN9h?) z(z%IeRf9oDpB(@b&b-iCv0Y%RDjj{zXfQzGvRDWL$(jM?mN1b&fk!!s-qJ+OmMT*M z6J1a^ZR8FJf6JJ=4KuKi8WdO(8AKw3Vh9P`U$_(3RyP*?PC22N(%KzF`s6Urwh~UF zX@#74pfDr*b~uzu+H89(PwH{uK65oaDZbC2Jb`y%Y-(U)c3TGtsczvHFroP>VFiYI z`EW!wl=yCo9BDXC=f}lyOd&VM!xkVpPg2L5yRBHBrViU2~=CzxQYTNf28;IaxK z%w;uDh$>#F8NCVQ^uA|7=Gf`F@b&+p-jF(h5eB3yc zD|wLyNCYTzi8>b5*8m)CdoWZyjiMYgSY<{9gNbSlDsNq*3Lyy%M7X;u({^2t1z(KC zQ$s^kL!9Vr_!F3A(I7W{5V|sb$ksGuQQK?BA^qz1LVmS&$ghT+o^5I3?bELM3Q_qb zm4eG^f>vCXz^H}-KZw9Vj`b^^w-%xL&QBOTO*nwu(hk!V%afsAh$PIS$_%}x)$$kc zzxjFM>irJLJj~+A&q!C5=|zZ*Qc`qOsNlVSI!`iGv<1%!miM(j4rC>BqXXZp9Yhce z#$*g@<+Zw@Ghb({VRA4~zCJ<9KgNUn6;8SS{L!{8hK4}<( zQ@Bn*4g_xY65OFZ6hLaSccZaopNy!GQW;GMK zY}X>S?enBd3C`m)LXe-*u}$}YM5KFUrh9OaX&w=Ctyn;B11gk`pkX+OvX#Ec)b4Gn z=1aCMvJVVRsU+^)>;3*B+DgN2LrW94;393s^gSfG1mQ8&6thz>R})fyOt6AuC{=tb zff88+`k?NW{k(dYYrw9EItHU}m6>X~H%#0zHKxw=s#J6(<@dDwIo2|PwV#Gt1U}uO z=b>41RI7G@t^zNRt|E{}=tlGJZCRR+t0@fy5AG?Dagq7QMFs^I)q3HgOxLdq<^-hEk??n$pQE;00fG(^!5xx^qNa;+DL%5=SnB5p2$Gg9VD3~j-F z1ydL{zvHvvU(^TIW|015THLTXy>|ZysZY2XRuErzN{tj=yHZkO6kQ1)*XGzKdTZH! zOR&c$Y8|Ux?2J$yg+BR@F;0gAg5dVz0Ic+@hHH$!~A-X4=hPjA_xrm0jh=#co2y!l~5Zzp`IF?G$?fpto z*<9YRpKl}~oOF$BAxf2Am?%sf`_ut#XUsX*ag_!ku$W5Iah0ayRx5gj*cdvMXtX14 z#?AqWj8$AvX+|YSmGriyX`m9Y`~ubnf7lr*r^xJLKO0?=Op}{n3AfpWwd=feCASeU z_9FWMR`&iqgLkd8o&QbXeQTZ*ZKBKkR?&d;#|L<%A-`?KQV-nfTdNKlzxqUGroyyw{T)dCR_jQU^fMbo9FZy>-yK zb&zlQ#b@cC&z^rPxF!73P5!Wdw>kkwwR;>8Y`TMNN*w$x${exFtarzJc z!>wDswg2!FmcMVMUj60brc?g;F`M+~$=BZbz{kJzGy3zDdw=CyUw_Pt_2&cCAFlbM zTYi^6_uX2i_TRoizORoS2Mj7%mFbl`-#Z{y!I+scZd$_@wm#1Mn5sevlu0J^Y!L$t|}CB?I1jX^3JpnYhb!b38l$#>HU*Y+g*FgIiPO^nC6A}7FaZ{kX7Ouf zvO|CLRzu%tWVn^-<4M@x>3aT`+}fLk2L)Ih+H-4}Z28SEpK|hlD_?VHUvX_GLWw86 z@1_g2pN7IH39Au1uf*TKB-xVBnIxz_k`JF&drb>$bA1d6}zu!Kyx{wr7%6y1GEtX32?y2VrQ^ z7L?S`SjBtsyp_DY+#LVBF4vTO zBgIgeMSO;0l8J2eDiq9@TcKZUIu0$TG4v3c65+PS2v_h&c#3`@NIJF3Df&{qG|%O|>h6!rA{QqeIs!bRNRNug1AU0wVy9*9o&s9H+(h|_j;6HQ zfTO8o`cMhpJ#kWb7>BuMC+OW9(Mi$1_6q$2dtR4h%*1d2=bGGWpu!J7{MIA6a@{i= zH}l`mwa;lN{)q)YfFiA+nw}pzGGUQ6gq`1H0>x{H6pHEdw>Upj-(?>u4Z>o8N$)c$ z9A0ibW}NSUNFaRr$=K^z8KJ7x+;CdSIwg;a>nG(AP5W6s$FL!Zr-Cid>pb#g>4~X)@g2w8MP0YR{;_0(Z1qi6cW{7q96jHkQneoZ_Qu)9?!$0h6(`Xz`}B zdj0!E*?xrHYu=a6COXTb_dl~NUl^ipaB@QwhV05d7rE>5(@^#;uCN3-rrfDg=+y9- zNf~H3(u8gJg|_Zq0{|2g$%>awMih(|r;cV)uY4P0H$%r6Iz5iPKEQUo9e#w$fR|dn zFASuI65Q&XJv8Mls@400RGeND8yfOUp=5Xc6D*JEC$$j@SYXz@Xitv7!JQGuKZDqd zn|M!?DU(Ezl@#B~2ZWkYgoI8YDG)>~2sK?0aOE+G#O?T^V;Aw7-dh*pWewzsYJeMz z{2F)qm~(xV`F;$oQP3=0GzQes>=3sRgJ(j>A~8g`|2x^34dZ6^L~UlL#j8_Z2`KV! zV?{2eGJG#jr^fMQUA^W53D`bxcIDR0e)A@p!$0$hnF_6(E{c}W?Xd}*ACR|s-&?=WcH3h z3&z6E!7nA-@$Eit`z{SCyrjZ|EsHyuVb57hP&k$*8CpqkI30R0iD;yJ=S{Pk;$?Yt z^(A}{qbVoI@hCVqX@`;jpiKxpsV$-tS}~XC~5zi~J~D#N@aT zdOFtH4xPzlRhY85FE7J4XhLMKpWIOP)3>|YRm?>3fL16gW+}H zF*%r{9W#=rI+n*3&a%bwil{+1um`Lo<*xZ=$Bar5zE&iY2EzJ8?UVQ{Gi*#KFaQQr zec-QIR846_P7J4{7T0-;B`s>p8*?fbwCMggwfONvOhYXW{c<&YlvW|Jv($i_aIfv& zDa3$G5sS1@dPoR4YKrt;u?X*7iu4%~SEHOY(jN;KGgw?L%r@VdvPY=K1bAm&lbIPn z6H@>5SpvM~@b#K9qG&e7NjBfb)koOL6kb)yd%Vh~FjY%K{aj=VU8gy7?DKHI@M50hq{2d%E(vCrl(4mEJIZYul zNO4*7ONJ&KS1aW;cZzG(K)_T>*$GxL3D{sn^dpmc5yNrffKbdg04e{b#hW`cP$MR5 z)<`Qiy|#UVkQa3dKQZS;d(^BP$4{2y_H?0BWEA0$KjVUN^aUj%Lx*SDHtRG1Er++k z5|DqUgi9ax3TNCXRh0!(RxF3qSchsr;^H<~mb0=Da7^573@-AQ{S6bbA8JatIdZ%A z&WVKx)(CPff?&|GbM&QQ78s%tHrO`O__Q3?bROLbzfsKD}?tA!~oh&j^^~W>_JBI9g z>LmoSYpb^q0dIM4Xd^x%4|ONS?X7AU>-I;T5YxG3@o6@{FeK!2%t*|;8HnkE?kQllVw7sl5d!lIOOm_XM$WkFZ8C>`bf zg%ltFK50*tJfQR@90nuv2V0YBKce8dp|Pnj<^Qi$sYshS7{a=oun=$_BvzypfJm<~ z&Gwdbp^Y}mVm#UW7&ciNY%;+9>dB$j3Rh2EZPHYYmmXEmv^Z28qH!A7lpGZzRjer~Kf-D1al(b)zkebSjb0P!ESKo@AEkU$R1}cHBi+4;^$;D`) zl}cHI-yGt}qKUh}v@s!NDZEqpDdR~mViqB9g+wi!37)H7ysH9F)m0d6fbt$kE`|1^$DTSgg;7{(rC zQ!XDHTrX0S67llh0og9G&}CN5n+KA5qQGcA-*Irye$sxj=N-6u^L)C8h^aD_d6LQR z6y8b~e~T9QT8UMS+`NiJJ^r&~Nd}c*_o1zE-fM|vau(~ywR2wjKf?6@TNz6HQ+y(8 zEYW`)dv4y^9HCV9bM*JqeTrW zvlct!Eq-dW#cE!bL2yRE&~DRE)2-)%lRknwh)z>IgEu6m{JswUJHT`0o9hGFFuZ4D z85vUx%4F;Yj5~Ej8+cd7O#o#GH03N~HwU4D*+ve=03M364`8J1o1sZ<=(ClPDSNZz zLVS81mnjvD=X?#c=*UPm1+(*6=Ap#9gJlH?CW9QP@*hye9K+S$Pjf9*PC!T#vRdA) zY6bqrGpI!YzV9ki%2nx+7S1*b^q%Ie;_c)OeE2{r0eZ_T@I) zzb*Z-@cZb4t5%cKfiCZqI?C?lknFOjUJ1n*dB@54dk6oQjI?5FUi7{NA1a<4{GdL(~KIo)nu0t>Q<)C8hm&a=svb zTEAM|z8tiZ*Qcenkf=MWdnnI{%%RE6cTenrjc|t>J$}viHXr)*O@H=^&eeENs(mkR zZA@S(yTtt8`r=k~8~+`6ajWR-k=epXCL7v*K36R8UDvdVhgEl6)2iO-?^d6=hQTDN z(k>RN*$rC#$?A>|n-Ec&D+GdUmmHSf7qxu4ywlzps;2H{6Vq)gO)!i2i<6ByUT`n4 zqD{3uX2duoy=A<5o3Jze24a&C)&^Bxk>q6%7rS6!2xmz*YEdu}qzbJT_n)&1$NbCV6asqK@7odWYU@85F&+yCLyPx~*I zlAV#hci)q!e2uEE5mNuiwax17KT4`S#T8X;8mmGWKd9pw#Bd&x9J|JnA4*=S*|(Nn zDo>O7{w%$8Ex#7?{rx&qDN}|WC#sW?HVh+z$$#7GKg!?Sb6NF^oa_#$!5sq)80?|L zD_-}i>edjNyz~5hgYn0P@YbV1F_+RlGlPYFdGZ0ESH%X zV)FX(OZo3yWR@LcDFR?{>>u__V$sz~l%j?HcZ}#xbtrD7`{c(GIY`xWGpks;3?>%K zDvtVgMn3(k|AKFg6Tz%j4>I=ArAe=P^X=T0BK|L*;tyNq7@JFqewdT)^7bIl;jHf<+(V*^6K1k6OPanGsXp9OJ&2#xEy;6K=Cb%vkqeLbto|wk+(7>S@nYG*IDbHX%sD=$7Bmc}FPR!y7Z+(kyL1 z`qx;D_VY`!JQ&2UXb@Lao1juT`qS#J9beOd&09g^WcWT0buE z1yK#hy$Ew_$`A^0dv=Tkh$u&BT{JjC>(Jo(e3M}&T<%t@UO_G`zMevCS zCn@og47N~{l(^CeNy+=+B!vWpq~uGABxNaq1X&ozQF>47BAwrnI3wln@s#*-*G3&yGj9wCa9LxMat}K&#%O3>5w-wkeYY-pY=KA>*v3 z9*lAR+hEV1WeYtbKc+Y_dUthBu|;YYK`v=i%DNVRwmWCK?!~hWs9(~?p)e~Pfb`(S z>T%nun_rsCd!-LHCXYQgd8~iR2iQz%mPXDrwb1Pbx`Z+`CfrDtW+$a}TG=n~uxcO={7GC*lU6=f?*b%;v9d_#l!fRvZFcLtrEe2ocCeg+!0 zAZRz_Q?sPT#@knD_|?A_}I-AloD zoq!waK38*%x4rxLHm+gq1DeJ&$faw5BIl!5rMce!PxZA?gCKJJAYUvYdg5>EisFXpm*6IKp5iw~nfHDIkV(N779?j2m0#tzz(r#=- zcyL+a7K=N9j-HxGumI!zo<RH^pCX8@h;2tg&HSny`6vy)Z-$S1&c*amsD z=C+7!@|%UNpVL_D1=UShptL7rWaJTuRzGTQ#yPEt+pJFq&ojp>`c(NItzU7VBj+~f zWHX;iwlSgeA1;!|($G4QdI{^!MP?@#%gL?tSeD>Tt@qMaFZ=3$E$-p?#H~bv7@a~= z4aedHoP+5RbeCtsJPu)VUVHQEW^A983)tee+F@W#du)sGoR$$!QObhmf~=}?_)yT?;5_H0 zj{#e8y-*AT+`=wkqkTy(HUi5N9dsKh<{>k&?bZqSkIVz%s0>ESxfn4zMy%i0KHeM? zIPUS}nD{dKR`LW<`m_CfOp<1EphDA~hf(R;FGnsX#jnP-^I$)afLQf1_Ec-EQ?xw8!dTh>agAV1 zv5#@r%d(D>1qyh2R};Gp?}sE1y>Dt^$OIWeR$~)24aXM!;q59WgzSGr1$60cm=6+$ zZ^WBapM+7JRKjtrR&!yeQ$6H-_;K9reemBQ=GMp=;2qKU%ZsA%|H0pouk^nbf8Y29 zc=o>o1pdoxp`qQ_|4uAga+iy|zFfxBajZy?Jor3YjksK(iH&9+g+vof2E{bVBCT#* zMy;4o@x$44-0n%!^35ZEoS~p{1s(^62a}8X#_T7`cNr^IwPUJ}q9*7sj5D||+w0Nt z@3itCB@t7V*8+1EWc78dT*$VH|IEulz}m}!02#kbi%@f$)}vfKd@eHi ziYQh6a5_JPotHc@vSn)!@*=0}5%AnoBfZm*9BI#EhFwQTNI+Feb)4OjaBHoRd-j8qzmOf1h9x zCsE-9nR?k)gdu{w)q8#~)gV`R7Xi!SRt#ECLldk@vx${;6P@ba-o#38q6RKNkLv*j zigBD|A5D_ciNdK~Pl^*0K7~B$iE34tx(H^KzcJMW&B@`pK%>*10i8V`0Zo{);X7SF zEOd=L@~$5iKa9FI2c)jw3c`B;d7^r_eIcIpaDSCr{utEtoB}hXbi8C>v5##4{vLJa zeY%gZN5>uDZyWh33G} z5J?20WN?H@J<=NC(6Qq8JJln-8Mol+;ZZ&+Ns>o3AJu5}=-~^G_7|)c6!e04#Qxa^ z=kO2~t(D$Y&8f;oo9u@H^@{uRs$Vx6#^3$1MP$l4D^sQA_+=c~(lM2sNjl~_E+||| z&ZOM?1}@Zj-xRI;GtFQ1+u6b$F^l@*Lkisz6q!JB?svAlIC(6RG6^QBDUj6%H<3Mg zZQ9Qo`ePOtJYik~Vv5V7kyXWhVfld64^G(*X&A?!VHE-6+mi2Yr<3Du z%cJKOnweiGF0ubx5-a2uT2i6(MDqlof{iyls)vW9F+ezvC$)_-NR$CTV)e!ca#gXK z%TZsPAn;@-gNd!9J6xm2t^ldF3L4zJc&Ft^jO5^vVvgrD;HS37qOY#2=I_iYVKdKR zMck_1*ev)0i?ZcGQzLOaNm#?6@{KmNl}|lWj+N=4^Wgcv@d^FO=@zJqYFXXMshL2C zKql!xcpz|I`!FyJ*x)0VJ4&mnCd1);F0~}@x=gE-9{Kg!!B%@Ia)TGshhr&$8Jj=} zyKPRK7?#_0MN`22F2&y3#m9t>LFKf}#3(%oD8n?Xsf%_GVSy5E<966aRT1VoZ zoso7B(5)F&^p;vIpshif_I1<=Y@lvAdE)tj7(67_i#eW#<|2e%Q(e4;JZ92t+7A zGP=HnOSyyDi?&L?Nz@>=rtRbNr(hE@2sEuXeYb)YdwlhbWX0kzcZaT2{>X%45zFVw z{?s!RYJZWjl6+W-Q#5_pYV~ z-b|{WDvopqD$Js|D3H_F%Hva10Z_lwvVlV-1_2oDEHTPVgmlGUn0)3hie~dg^;6{Z z%5()U3b|`;{RNs9BGX~&(doK>D7Lu`ui2* z|5I2d_fMtmE2Y-<&+>Y4S}@L*+C%y+%mW`yn$iBE<}+ z%NfnOw3{5hi9%a!mgC`o0WBI03t(sOn>;dEF&SiqaC^D}ti`Q$B*3&!kk`HaOgiq? zygd38yy(h9O=Lq9ntV9+mLA@mIeVxzo?}|$TNiOlHe$Nwxq>Um6d`R%k|M-Fj;Z;W z#0~q36D*1G`lVjT1CG@ue@t<1ieT%QSH})l4;>-l+KnQnm;`zYZW4V~QH{)XWN;&C z@Pw+C!T}|HN4R%yr*T$H{s}nGM_$k7*y6cs$f@HX6$rQ=m}hmycBTWfmPWMi<#vv^ zxO?$jW`_}Cl_+9GijO9{kd`TG4Z)Jg&k_`;pG>m3>hmsJVb-6qza+?}^}p_p3%Gf& z-K5&q4L_2E?0tWcyzoZZU%k_J+1CfoTFemJ1@v`zFPyj{k0>|S!qtzV+XkH~gF%x^ zql0{u1lTUqofi!z;51;$6*PvhxPnd5FcDTw$H3#Z!y3+m+RI1h@GYUdD`8aiZE3@( z79*iT+7u>o8aTW_&S$Yoae#(XB+)1~(T7gQGM!!iX??eP&|!J9;@eVMdx4w8eeZwJ ziPnpU)51pV9Dk=;r{p1{Cv&pqq|C0nUALK!4l@=Ae3}Y=osjR_w7zlQx0!^nt?_F3 zy$@##voRWh{6$nfB)SOLG(N1GV=b>VJ^L9qf8q-<*PR> zoty5?HxEe5R4=}>^d`PxIUwo(nMIICUMV7BoxHMGWWp`fI+;zTO+Qp_8Ob^Z#P45( z{dI@R0XmNe$5fwVGQ8+;6#hwN)3+dfz)#I}Ye^=M>X3;a{_$j-er@x@C8VD6VMRgOO#I;wdZ`^iOwAF(zl1xW$oT_mC3qnNVxH& z71ohmak;JgIp83QlQufTDaBolqw+B07W`1hkiZh0rM9oo8w1>fM!;mHh->C-)J4bU zbCk&DL7|Q#I=Cp{NKL}n=5i?}GG5QI!gx#EMni|fce9`{e`Eo}4rBq_ZW>j`nq<>* z#2~M`{)MT0>P41EZ>N9tU=%(0g~`+R4wi3u{pu>dARo^ z?acW2)Bmr_KlHm#@uve0F)o1)r&`W}X8#;<3r zG1Iqfwn|I!4f=S7HQEYy%Ds~J=4>s~OGmo7Y~+`JmNh=Za1i=5n!axDr5u#(gSnHg zz#vxbI-$~a;WiKV@Y*1uq{3#fh;725^O4?oMQUH!QHwOv-U|?jW^nIXpiP67Ylez0hjUTcw@ePDVtl&tajsTq?oA!EV=MGXK;Kdm~s| zdqK*MZnt%tcL|YShowXoB6kNVWY^m^lPD>&w{y^=0O&|vPu5~Ca2{WXi*OCMWtatzUuRg11Qm>5WbwU-y~eZIh$-mrHs14+cmM7HS-(k>%a31hEi>WQ%9 z>0+6oC6OY4*6ir9O8VwcK@H*^emGQNCYk{sCp!#F^s}O~odK#g_Cga_?cii2{6G!Y zGXIpum*22gw!;33va|R-E;<-z1{&N@qgB~ExOvm{d&_+9Rs9Uu^CoT{VHZ;+M>y42 z`DF)rs-ekq2K%1jyrn$h!eM1yAZ|Mx?WA`7uS@WEviQ3ku*`rCFtvn)ODdTq*6>?zg28)Qr5~xflIYsII~*x}DiCXGF17#vsPe;-1EWl^syF{e z1K&G7aP+hv^T6LTx$wZuqub&pyjw7fV_0gzd0X9PoB6lGvxGZ9d}ugT@BDDCfMrs> ztA1(xmHR#)&!xb{NMQz`Q`{ExS+ zpF4TW5dIFDB2doeMbLoj7pZEauko_Tj!mk2;vY#r$&n3kT(B%W@sKD0Bff=1N(Tx4 zahPwfx+`?h6WuvL695XtY7ahPog7~rW?bs#tD8>^Due&y!oP&g)x@lC(-pxn7EpK7PZn9^z^zw$P-<;k518V%R; zES`Z}L!hM;1Xdl_w0bPLV{oH>s{Z+H(w$vesTcO)0jfb;Rs4EYhVnqUpQ-6d|2t9s z%jw%^u&*oSB6t%U8G6EP33!4Wc!||qbq0yn>X;5vD>r1#SrZ$#&rE<8KHpTxQB7@A zt9(cQu5t(?aF(RomgC~GM+(5GYYo{NORFzig~{nouSyv!+nq!CTAYQVFebn=KFB9*?O()v{#9yy}^6WFocK&~FvV9jL$~j|UStsju z(=MSHes-82%u*i0bygx9Y!M$O}aMqeW6A8Uj{KsSm}8AAvSc9+QcO$wq>@MdZ->0wVul zzA(L{;ciqfW3Zzgci3>j*KjNl${#7W3%s!{mm?};8#v<9cxjF&L{chhD;`y-{@~-2 zDm@xBN7p%`48!oip)fs01L@9Xtt8EIFpmrZMhB%!X=GoyphRCV)dG~W-wO1sGy|CX zRi+>4)Ou4JEmmL+DE=>j7t&m+kNb$ivUsGTk>*mJTo5}L`fo52$Z%VuRkDyP7Nyj0 zFDm{}T*xfog1tYVO&9LfJv#D-1@x73NBD#8-fJ}u7J$Z+;ys-QODKP6$>9-;V_5y& zKQ=R^dhG*RTPLK_tP@oHr$qdUKGo_~()%R*dEaI72~=o{1|xl}lZPEVx@Te`9yL7d;7Y(FDmFO+p)YCu43Cud#xIrBTiW5&AprsY z&9MO!&cBNRboCq+&9{hQ*yV|;T)eF2-jTY*UdyWeAO{{-2&mGQ0*|yg*7M>Xj);#4 zV5@1J)N(+$75jBWCd1_e4GbU`$+KF?KdbIagfaata>IlXI9YZ@muIBifyG6C0f1?r z!daJ?YD@EgN)ki)>E>j=Y>-zy9U0`$6x`0M*L|CvIG+dU*#NM{)SR;Qxb#d)i1HDk z;o0mmiD11j&qjUh1L?}?3kc9w`+jI@Oi!X3#X><=@N}BLP5msWMPM}4l~|IG3bw?U zq<@L9bbO?4awC8)dhfq0G!0m62^a=CV?!bY#B3iuL^DJa*L#r>@CvlSUPdTe+xZEM zy7JNqM37Y9c`+(faoLa#tp2UN6_T*2%xg=S6nASm+D^kZj$jDU36iX&gF5w5$%mGb zZDs7e1Fadk7+tf0!mk2kuq#Exk*n{i7U^9*7>l%7O#ZA7up(wwmVaF}WN*6Rv_`d|?W}k;;H^QwD`Nd}@Bez0w>M0+b&~EQ1p{twAMD@ss zmyH&h16W5=3M(&22VHd2;UY@JX~4{wzv~O4p98`K2;~@<(5W#2Av^(BO^VxcD0~RI zw!=lB`mu!dS%C@C58^V~sq6sYpK|3~ifs*-xPdE{RF>Gzv%aO62@2d)iUb#74i{9Z zW0@|Eureh{s=F{kk#16bytJy!8kRX{p-p;d#iiER*?Dbk)Z(@=Yq*#UT==OMpSB^o z)buTbt<9^bjZnjKglltZhp}rN?nL8~CkSy#4V%ba+|gmg$k4k|W9!6cNXrLvhAIyu z!6;HX7Jqe3nbHOi7q)z*O8ukejV5CjBNuJrB;jpDR`9in4XK0rdT9PAQD&*^P?Ir} z4n@R!V~(1St3q+*{qVFu=`1XB&{+4#BV2dp*JzCk>CS;wEZ{Vw0g&NFPm~=QtE{;R z=|%SU_?FM=`cJkSy0dR@K|G(#dPlX>WGa$r-Jdv{9vC|3hV)7RsmOn|i70KjdY;aKt z1E;&B_@c}*8eO$9xeU8siq?wiP%?Uo3C+O_>-~sPoB0h*Zm7-pDjr+1Lf7<8MVsAxBpi4!h$;}YX2hwCgjd~nIG0^pZbFN$aF9Ya(! z-3Ap5qWC_`7A5QnC((Y2{wqATt&3A|5#=O zyz!yxjy*(S=>6TIqI8k%RqIW~5Z^e)%wrY!0u#BOup@N(0WuZjF65uF{i@HXQw)ww zT&rI~re2dJ|6e&v_f~5o|2}&7F zWtT`5l87P;a#Z$?a!+g~c(^d0@@tkA$1$4-h!Jq0$Ghywia$rouOY=Gk01F*=laHM zVSu|KB_xykh)$nt>oij+`K7ceE=xK>Pa@G)viqL^%D~|f{1Lu4M&XI1`0Qkyb@Zl4 zit_RPn!m)rC#x)t%1LDe9>*z4Rj|lJsbnakwAP+nhCW*q<3s^#gkJt5%#`1OiUu+& zpqny%)|xW8l>bW7Kc2N_AaYU=3aotN{rMBK0@#&gK7uYdpz?f3Xe9kK$a@$1V|COM~4B9ZQL+$f_uF)Kp)DmCLbCX<|%xubZx94%#fM!I@HwXkib$Hnq2dGUp;pGEvbkINh_ z)QD}&R1_i@lHLY3JB`4AE!Zq@5+6S9U=UKY8zB}eRo>i9mybj2BS~#F4?yz3G-XTi zt4=qE$Cxdpi@b_lRlt?|J%bC<(;c`xYxh_xcgThK| zUZKkp_`phs4o=BCN!yfH5xkrgFBwMOh};5x-O z(wS$7!HRR}U$KXBxx9u0QSi`12Kcci;ne)cDLFc*-qC{owy~c!M@<4hz)Unc<>q2J z9-+dH92Mn+Zj_y!e#d=lD~%hWEW-Og*odxlRjwzxtdNn!g%xZL7(u-lYz7#OCjbw! zix}~WODJ_QkmX6bp?5N%DlW?<8GhxCGg6Wms1YzSgO)Ix4=7y86f}0MZjF7=(_p7C zvP(9@!s`f9^MVDaDXYU|2B_GSs^}4!=J%9d!OmqH?$b?AP#`zLE}wIdl~miIvyMTQ zr(}2fEBr}aoN}4#SGCW@1|(l(0A|}kCn@T{2FVd- zA=50vQ=6QX;l0DAVf_IIern=uUn?#qO&n^~78hUd39wGA%q-&$pQk2afDxH@;YU1M zL>iQ5k3g;`6akd(%bYR$ArcQ000E0Z`?10;jkM$$%dn0MZsl1nlo!~*h4KQMxKLi; zOfJjG;pV~)nkREvaTX?5P!~UZ4K`v(wwEt)} zyECOp{+u1){&Mz^8$X!Zm|(PBS#s^{9&|5(Ppx1zNugXb!2F$IZKrn(PQv}w-Kiai zPz;-U`NsPPCp zb%I)v;5_$rk_GjN&P^!j#SFSHP__K2lKZX32{K{{zP;ihQoZRqM()~*6}FB+?(EO9 zf&pA0cTv4n6ESiZ)vKBa7sy>y54nr#A$L*zN~oU8NoQqSxWHE~h&i7sePD z^%sctC1vmwaan@omjBd2&W05w3!*l)&>l=w1nfqOT%pB|sa6mnqwVZ4X)d*7 z7HKL%>=NUHOl1MAA=yunJ={AeUXpuk0!B9&Ztx8@TJf5O=ij_fa={^vQp+_>7$JIY z@R1fDmj5Rpy49|&gTIWQnoBE`_866D!&S8I+fXs12@pOCxQ6isr!}+wgw^1-R*lQJTO7};RJmh%$0gg)^(QPC6^Wd}{W!doo{K+5UMuM%IT`&Q{RyU%%pK6##eu7hcNKn%k zYq18tk!;r}D%gfL0C5)|;?~}9YkF`KuvBD>1gxylSg(gA4Ppyxngfi3)Eap&`0bHz z!5J{J`Ob$PqVFBG5uD|9VuhQ4C&WU)_h?B+bch>huX$Lud{1koKDhiB)Yv3Sw zY<4N?Aipl_bC!`W>@fm4!>kpu4rL$O>b9!RMPM(Sz2snkuabj{wuG%RYUdg5IL@J1 z@u8t7wJbGn%ttO;6$eBG1*4Ir;GV?5D#dhK_?grGvPx%$tJ-sS&;sjqM^$NTQ5Ao- zQw6}smr1k)jFgnX@W5rlcxYKYac-UtKMP^Up;1-8u-XQ?&I34RJma4U7#LG(V7i9< z?`X&|b8JP*BY% zhC<-!LckAmNvp#j1@jD#0?2;_9gibDqP>f~BAZsV9}OJdt`5ckw8%;YvKI|_&sGHx&+N+r3@l1HZN{nN?ld|V75_fTtHv+OuEd9p@`v%63|dHH2d*XG^J1!I6HPuZ;H)_zGDjkf20*)C2C{NDZKp1T z%U(Y%btr>796+6bL2*|R;pNX8Am`Q!2|yLEk1JG3992S*+(5(uRRRNvN^7U`vbk`# z;%~%sLgic&sqmN#S@n$s9aYXIW}KS;bj@Il^u<TZ7*#^9|k(k19O(&ECCp@nsJ?8WDNDnv7`;mJs)!e-w zdAZ_j1Wj%y+;hPRvWW{m&ojBKJR7%1E?>wT7knXGxSVu$b^#Y$BA0Smb#``H)PV1Z z-j7SL`1mB*ia2Ahpzm!YwQG<5MoB<%hhj-ck$#p65@l)|(!w9WWO|3`GK>d9|D#8b zN=dKin?5ZQl3z=xdlK=U^}1LBb6;i)f@er)(ZDT~J;1|N@Cj^N@MAW+CnIwhRu=iO zX>)pMEiXyn%BjSA_hwhXXZhoB7Es4`FflgYY+BpyWq5(U1r&OI&;cAz5`%ADS`e-3 z{q?fNPL-b>2CGmU1xYUQaBz`j!bK5&F7+OY2lq*f{ElH-40FUVEp!+FPGXr;$oxwT zx`J;7zp{!QfOk`wU1GYY*nuVeRe%4bhU2x)86yKiEU~7<>0vp4HuDO|IKKyEwUk!l z5A>ZrJ1>PX)4I!PG^!71cMAeW)?IL=AXba7Od^oQACQs|eVeIteNPW&=p0{cKDT=GI7pw+h$wkcAgu zG3n}I5&~#FW7nlyHshfZ?K5`W7}g}*RH%Ug*3F$D*mjgi#s%>=X;f2K+q8gR88EU$)-$fXN>`zY5PS+5r)I>B6@fgA8$gnr%sD2&_T%MNkegfl9(wja*T~bCinrbd3Ee z4P~~rycuw9VqX`fVR{GqFD?9FFSRk3@}qWGH0jyXAE!+I0Cu%)eWHJs#7yjf}3 zK~*+f4~`GGKhDg#k`HkQ*!mhU!5Z_b!YD7Qoz@dUk0!6Oc$Ic;KpkQdLtvVM14{r$ zj2PvtTtJ2KdZrVVSA^nsg7=zH=s7gLr-_K|T@p`xhm z%!Y99H*y_cKkn~aQu3Dhflnm4n&N|P_sMNQKy&D!g6l&$0(S$^y89KAPm9;)@N7tn zx5`v!LfXlu=2@5>WCu90n_W%fefXz#R+AU(rmUMa00UZglqOi#mMpIftJB$@+-@$Q z(PUDH;ZUa!i+5tEO>PNdnH$>MOKhseaiIt^R$CIDvkS=RI(Ps&2Qb>TPKL26UZ^g?Rd3o*XMxae~FM-@Qp?-oL8`3XZ5#s15Y#TLR zRCb!F);N$^1LzVTku0BF3BRlt*56=K1(Eoh*~sCvnqI+!Y2~Y|J~O)w1%)(Wd(0bE zPPv-UkiCYV75Hf}2NYb+ui1|p3IAYw-c~|TY)qxV6zEVpcj`zLWmH&o#}pg4*cnO# zrEr;+5;9Wxvesb)5|CmKTb++WppnY;>V-qVN`|Jg`>9Pumt>G%y&nPqy{Wi#pvxP+8EsqFmHmX}OBmMC8!v}6A0Lrd1qwVE*hT7XJ5u8yE!C!0RZ40&o^l77ZC6 zdw?(Sk0DK=t2fI=X`S#2KlABm(I$eDu0oyxhw31Y&4X`29NT?yqIrMfj%KBJA`u#! zs=E?jU1ZVzBwK8oS!2W_^T7cMPwxxi}Gq+;fB{hLT9t0{G{%mq@=wzEtB+w1a2x$w#7FI=LY*StVBtV??O6H*$#38uIEvGTZf7eKO@} zK$vWeu`nw%J}|c8NrTC@kcmoRwXqs&iP0obk)?W5Nz&rGF|#Aaj-Wm&wUA9z*YXNQ z@V8{3)+myrebz8jJ0hI>vth+!94V<*LR{&JJUL}S+!V|c9R>=Ny;RQ!7y-2i>oncuTn59 zrb9+5+80@0%5>_jm|~?Oe;bP$QsE5_BIf}p!SwAY2}{=@EQ8Gumr3NPE%o6yyj))x zLx+p{6fz)1zB|(>IbnMEu_tcCPbHfB2t8kT&;R%_X-u#R%c?X-<63@MR;4)_*YOM8 zc{ZZRhM+tDc57j}d4o+#G;6TF(}Z8OABtH^-VaMLEC~%rFqL?S+6PRK6}*BZ!kWI> z`u=Vtd|a*(hmBPY;2=--pwyu<&t)K`QOr?kIYInjo`mqWiukXR*aeYb5$=bYpm+i` z+ii`lZy!^2|3Uc|LhzR$mkdedt>yS&uPMzz=b0dFiyLLQhK&z$MxiGS_X=oQw$MJa zSb~5dUKGQdwVj1P3~$vw73<(7>HzgphO7yWI%(@fHYhLHTLa@aY%xn~l>d`M`?86n zo=^qV3o*DXiFXV$D3*jKG4&WIlGaQTEj|yCI;jMt#cdi)>`=A+u%IZ`;E}0Z@{MF9 z&+WLxQYE#pu9^SA_Zr^H2>3>tC?qO1$!d15B{f_-afZ6SwG%WPln{w|612ao2to9<)-38##%k5*ER2>2r+}~`PxAgXhnAJcoxb9!I43pvt@cDilGKKV)R~H z;NJ%`Xgw9*67)>307~>T!6bD2Mf9XWNz*>w%%jsAJ8XPcM?s+F;Z}eOC17I)*N` z@7`rOzeYE?EJ19?V}V$hInbVT)B*d05^|qqWRT+|tb_MiJ;L3)cq+#Mc*{%VNrMo* zr-67wjZR4C2L+L<$m-?jNJD!WZr@r+MrB8SiH>R)bgQq+gpJs*Bnoz@q`O#`i7Tu5 zBMCz=Vp?_)k5ZLTbg$fGAYUF1dmR$*kIAN#J_9yNK{uOHrls*%OMG6yWB({!SpIA@ z&yt*8xo%wb9(iQj7NwWowM`6 zRVGW0v!3zhr1#mQ*RePzKH6@pC17Cm2E%H#p%}Yp$3cyM)u8=E;!^x?-HV>R0L9!? z_|nbo;pTu5t`Ei{RxMIs{+nnS;5jMg^PwXI+!ksW{9)T|R$^FE#e|>Pe;}bdEl?t* zix+>7l^3-LLu$Q-n?zjFRBat5Ek_%!Y%?>eg4rpxR0QIB#vIB5yY1_e1hoSB5S$(( z2nuE{aI*cBQibD*aMgKowO8lqD`-hI$Zdj1km8^5)gzf@%J7OCF}+tWVm7WD8XU+X zDGgj$_@iWT!y3e^I8RUVlAR%vp2+)gTV{j~Y?%aK@Y>Sxg(VvlJHe5>K|geIEf3eB z3yy1{+)kWr2_>}#ZoG?Gz|D$(A@{)*G0;fQ=?BtQwy!qE1tt^o?I)|RCI+c)F?UK- z5o&)3d#;ibHQTikX0OXnuJz+G>L)>ViSYW%Pjw?fn!5{{Otadz_rtS?Bp)s;jEIs=HrFEvfC6 z?YG{@8JVvN03KK3!Gs<(%g{ z_uE0#6DP#bccJWZ3)~6H-u%zhMu)&Fa0-Igs+3aj%&eeU| zB>QW*!OG>^Aa|(tpS<$=Pd=yp} zDCYU;!#S=@&2S-c7L-~gpU&|L6|ffJCuyQ*#R0v;`L*e)S>w8L0seQ>LkB-A24AE9 zsh410{Vk?zaUqbFR;;my&{U{iO2hLSX?@1}fUt*bJ|MKU-UC|!wlAjA0T6^WPNTRJ z3*jA4l;HqdNP;=(%{+tO2B*Wl=QO@p&x3@KIe$yS5*bYhp3sN&vKzqfOieIav#~ev zQ-{!;cC)JofTPM8Wk<6!6zZK(dtp8R;WJ_JrJR=sRq*8*5EH5E4-%e&aUyTbDYmK* zzmP@3cS2+K_1yVTocG^3k`yPdeQV#KS_mhYTD-^~vGF1vTK%Pn&7Oza%)7y%oH;Ya zlC6CyAAuELrRQieB`UTw2+raPWt@POjms4ka{ES(5T4CK`=aa<~+8JP5!>*YNHL22$wao(#ZK9}0GFI(n^_6%YU-Sn|OPi!! z*B^&qsf`ul=SoUl4pxsuzY0^G-M-h^K60ikR&OX0Vxt4|%}`cU+jvO!Ew7uaDFWwE zAic%QJltfzz(hVTzB^yNXk0@Hg;2ZM8R%cBULiZRW!gF3e+gondwQx{YA__-Sp6c& zT~nGpB!-H~ep2y-J|HG7BP=bw*hSKMec_u0Gr*1 zi7Tf7elguQz6B!n4U0~(K8)LUty<%Ct$U2yVl_>8>pC|n0Sed7E3|L?dAAn16qe2^ z1|wMOH&isLwh>g~9WYmGxQvA>Z+w>!sZ9e=dWK#T*UDx~RcEeen*n&;-tYN${lMLtnk_r# z;ca-p80&e^Ayfi;o_%X3CaQvJeHhZY)t=tg4%KUfHvWJ~;|(c=o`ajS>XpXhYI2CX&DI zl!9PB^6?uzIjtXVV_6-8Vk`zRm?Z2~frl7YtzERMVvgGQDt_NyFPwoF%+(9RQ(uu6 zc=W?Q+kbSx>Q3MuYd!34^FOh6)o=*F-@YTQWA8MwUg_mlW5;$fSv0TGm z(WbK)Hi)AzL-PAI-%j|BJiIYaJe_ozIP)F8X83V|4?yv#JFiY<9m&;2#2j^lr|uzS z?X-GU&X2A3hawN{J))o8!KQd_OVVXYN<$NHp4z- zGsCJkG&vvvDuKPI;Tg#0C^=2TB+!KHl=`?9^+TjfzEG4I5e~EqvCmaf{tO_nB&=N; zHK8}?t~sn5n3v@$!^q@#LPYVfa*aFldj7Zs>tuSD*n~6ySzFl4>gnERQK+I=<&H@) zUOudTZo;!dl)Q_mU~Y?CJZB|&qNxcP=z-UMIB3kb2kXR%>NJ6CuyE@8UQfqZ}#A_F=k_W?ZzvMv_t8EWDaf(J@X$FqccMB52-k{zrVI4m)wlZL* z{xQ{OF$2$y?}ra#sY`6z6rx0h47*NQJdz|v&4s_R>R$s~=M+h(UL)&^C-g*bQLs9_ z@eYqI^}`?O9qfqQe^H9I*Cc@lQ5V`Ae^QisE#=xO;buD1k-zVTKluvfC}w%ElZslq z(OjDAoOuRmW^PW9CjO1Go4ixeC*Yy)y zAjcPM`+pfor0^`;u-7Qp^q1(r;X6qimVgXELsOQWLz_W-TompFV!q7ig7jrR1K&eh zpPwZDH(Nw(Cz8^~8@@%_sO-sSnlCC5uLzPa&ULorIfs)}ug^yigmY-(T1Bf78Wdb3 zLd?YN?r_IfazkY4c0)7*^a2hzF|eg7D;QpS#W+#H)AF<*+%d%8FF=oLoiMWO6_LZ+ zD^j?R8>+Z7*gY)@{v#({Co{;d_s#3I)kr8puvCR?9xb^vGHAQhG$-crY+XvQYw7n4 z7T~qS(@pWSckj%%O%v^8>$xj&Gr3a2m5O~aNGV~EQox+Abh_JF~#f~+y5n5#*wax@zh#}__$U!~b2%bXzq(m8&b2Mj9# zMN!UziC%Olv}A_p1d#?2C6gIda^2AYmxW=$L(p$pbo!2&MS^w(3yDXD%x>K3VDWuc#oECla6eW@)Y&qjVRyRL0vLNi{Ai4 zG`>HMzY@ovXOv6p2bB^}L$kMP1f?F)_uxHFu^+TQX}xl5_H+7`B#XDA);wZ=)6h*t z8ebYG;tJDD^{;^5*agvX?M+5t(%D$No{m_VE-ts}5Q0(EA|=>3&CQ1I{WZymm-Fzb zE1|BX<{h4fvxcUoW-#9>Z7mXoX7bK_*1zs%n&}z4ll_w zM_-@)Sw6Tm`+4+25&Y&By%u|P8xY@uV|)08-v&8tkD`xZ+V^$o0z1F+DUOnt`^*2aRTOJ=xlm%R$nU1byPToy(&mC@T>UkE zgVdg4puJcSB()dD*dkbC_lX)!UXrPkdT>w>hAg{iOX++!Ko@#5O)K;!S)+$B>g(+*! zJ36$hjlO_6t#-$Fwd#)P*SinE=l)w-ZM6UGjtTfsoD}bH`<^?hH{*Rvmc3n{pyP|3 z7hLQ1zSydP`;e8L5F0hved*EOmVrJ32{6_BW>Ry8xdayPw9tYjc3QCKI9QGN$W_wjcEH6-L&>;^=lSKaiP6-Rd+o|x zz2W!zb;xxz1KvuQZ44nhrs(#xYh9EjRdRSw!)I+{N`2LGaYYIaZTg^PhNA7r4*voT zQ}LInVJaHMK?X#f8m3~Lt6?g}`5MELH%z5(>gI;2H)GFA(HMqxC4C?x(BxKRPDuS* zR@(3I1PG=NcvlXbJ&nfC3D(>eas}i4AEJ7kl--fZtQY2mL1knly07^Am!7!? zEtH3-`SswJyLoR~Wu8bHLubuKL^5P^Y?;|=nS^a|rv)2SrE+DuZc+=2{TT_X;b(LD zFxF+b`AjHZ;@NueD=CS(0458oBJabb;)b9Q3$V}S4n%wauUmak%rk26c5gBb zX$S!7+%KL&Evy_(IVXQdx@6jbO?F27!r_?wfNT@`&uOJ518X{wz$My^UF+FP@rzuZnPnLR{B>i#he?3^eiSQrcAv}COz0IJpt4kR!g-JMy{1xBO{+(stbWV%?S%5`8Z}mQrXPv$0 z$iX)}6z0x`Pygra%;3`Ckh{6OlhBQvIEu!8iu+i<{Hw-l^RRSAx!y7i&#f3~UmE;= zUgQ_b`^z;rkCBE_claAZA|B0ulrzPLZThf{5B}Q?;UY~fxoq;ojp*OFC!s>+a|tjIuAg=ov+lhZ_J5>^PiLcVM!mB;)h-Ou!|26faM)RYVjt& zPG!|R!LOsh7NaQ~I&C>dKxy#DIf+nO8ISbm3YO{mlU!fe!bxV)N|x{BaX_KgdTK2M zPHW3!z!ZfU@`wD08ahf|=dV>Q<&1tJc3c-{m_~^j4U6Gr7-4$iK|W*I(BUSgd+;!^^WWFS!YorwBho3v1XG6B{O2?avBy1>NTVaMcfSUs-hI$S%TXc{J1IFE}f& zdNez6Ua@KbuqQ0OS`vudmy;7?dDOl-c8>4Lql3W@b~iVVo=EK>lOh|zkKMJ(AVI?L z1rj(cb3=;wW!xlG2+1TyJrnyNYdfA86+ZI&*umA;C&uSV4_tT$Or}kHShHK4-@$+$ ze~f?y_e6$A93XNWhm3+i*e}E_*;_v1)0ctvkTBTMyd zpe$>Rz5;&? zKm-xfal=0g-^J-enr@pH5J5Nr6N3UTjbK59`CQ#V&sumy^IW@&1O2%R)*v93p>-T$ z8*5Ak-&*AN7Z;Am?zjJCqa0-Wqt2-gLLtymv$zDc7U9)rl}lSZ{AiOODPB|OBx)ZK zMM^27YoKhe?svT7aq zcJdcodA=PW2ku#T1YTF7iNk}Gu!M*?=qW%-=_yf259jaH>@i2)!Fc48>-_KH&;91% zTZ*@fEYQDk&B?Y!PeWHw7O>QAWwjpQuea&uACw1_kwc&zF=HlQ_|3<1oX=l1LHsr^ z=?y1TJ9Pt@S&Gf@Ml98mu_s&$i+d1;XAutYaz${NxSUMwd0A*FX0ptL2U(b2 z9=Qm(%*&CHJ_U&wUR??~wS$sP#Y?>tSdAeFGeBN&QC+-vgQE)L$5w0x5I3VkIfI#L zd0k{ML}}y8fS=SPhtx*Tf7j+&GSBF*^m#I+Li(1U6l4enl=V)Qqjx%Y$-{quAT#cc z+(p#1#nsMh@|O16P=F@L)12Gn)qj?r8CeZ+f{yPelTirPW$fem$X#w!nHi+};a4Db z>5T{?9BEf4-(wp>D?vldL6P}$XA6qVlLBbX{Rh`Tq_8@nEB~HYsn+v`IYEwU(en4X zHAa#oB^?@kRYq__ew_p{T++`Y65Mt0d%x*PvFliuq6g~yW%7I>C`Il1vcWcgpq_i# zM0USakLcB>0*VUGK!>%O7w~XB5i^Wn%rRk`D*Q1QdZ(H0Y>hNNePdoB)s+1&S~87< ze!UzCXL=~)r_^}Jn7=rQjb)XGQRuV;rJ11*9nK{QIr2Tz%VKW1DiIfNUcRT+DF3sEkkA%K?S!i*0DmIUuqDS5l`5># zaTs62gj5A|%Kml71JMv=I%$UsJgsk<8=F@sOcP#jnT+r&1<|Y_qZ1|QN|z~KyFY8B zsyDF!q&{bsss$X?Yc+8Q`(mg=`rtfRrb=Xnd!ZRQ3n{Rsm=1M z>AC_MHJ7aE4V3D~Sf?nnA;w5gH*gLRDdA@i+Xe$o7a;{Go8JSq>5C8L`jc|L_}b7 z!=reD+^5S*UrvJ*p}7(fPYSw58dS zJe?Ll(t{`@Fu~%Lg>i&uQEZ{KUYI4+Jxsgec~bAq@gPmH%70Rt z&qS)u4|ANEvou${YO%K{A**u<49>cqbso=0pFWSre61kAqZI?{PZZg{L3YT{l5k`i z3>$fUQqv(ZdUA*Cq^UUuIX5Vs{ERu7`hq?ui-Db#H=bJ#kl)-2ZV>W(! zu4=4q_ymPpxVywT<;$F+D!DK@^^CG8D9w*kE?1V~8UZlz}B8-iV_f?N1s7 z`#UDTa?BxblVZZOg(uNP#si&yYQ6M$AuMHlYpiR`RBvg~#a%+$f4bvsL^K%i8Vno2 z`%GKXFb?b4IVCG_E>OS)B9Cj0OtwPNFeGP+3ZU_{!jBtTxo6n-tcq)+$|L!e0BKFx z2H#)&Ggf0Bh}D?tS4WMVhS~@D3qFP-Lsp731gT?efs`{^NrP>we`x&)@w72C_N~h^ z_d=X(O=ZojO;;wjXdP^iaDR`|=OEnC%Hk-C@gR4#1UTe2lL zqL>&kUxTo*Q>F~;qWZoT+grCNS5_82NE{3#T;|sF4rv#4cPl-;BU^_)@f*{doUQwt zor?w-hFDDXzlxhjK0uZz48md35q+M_X zG#18y)KcK3jiv3gQ_Bbc3cU*s!ZeXunDh`QH_7aW&cK!Gv4Thj`-YHO&9dr)1@Q#& zMp&6Xzh2pRa`RtuHpfa+5by1Co2xQ!8`pTiOtKLmx}0q=*``kEl-#ga&Iz=+5j@w^ zDH&Ab!LacN-zz|?wEu9Y6V0Nut@(OU?luCA5+AF?N%_3YQM3R-iV>OfTIEo`_L&hw zhK?Ylb0fc`;_)BIpbagHg=Kk&H5t}aT2=p^D0w}X#XTS+*&&0p3XS&~xlW9rX&{Qb2;6AxTKz+Nf zt$CH*M6QVZbh8>Hq*KuuAMXalDry4uGO${z1U|>2ch!1M`g`3UIES>xR|S?E1lkZp zS`bJ(ft}pR7t}B5-BzZ*1UpdFcF6pom8l5Yw%LQwK3^w9I)Cs#3widU1~LtTxHmBA4&a zcs11-t@R{xs9QZ)M8imYHi97Gp$A>&0(l7FlqMR(F0lcB5EN&3Q0BL<+)Rm+}e$(oLKpadp z130>u!HR2UytsxEWF_^?SaA)5O5zghy$vP;u?{}k-R$T*a5)ZnL-L*|Zw7`Z4<`d@ zgc@4bXpC~zIpmdd!RJZ&#hWt30nkc9Agc(*{%rLG$hD!jBIs3wk7s8UY?%!|ri2jM z2r3DMhA$Vp4NVJf#JLDP$Ti)0fZjp&5kk1Rco2_fjH-}v5}u&gP5#Nc4UIaDqPQOv zhwY-({OiO_$`P~CFi*T{~Rqb6N7&H4xCctm8q=3PotuvuFM z9(3lSC9z{jMojw;@vS>&ZPjCL$~;?sf*JQQ*CGpUFZ2bPw~PzK4`=Rb@!Q=&kI} zewzku$5B0#NYK$(sGlbq5*_H98rF$Iz@_VRYSpipXfyQqrs65Ki7Lv-M+LNl=6H^> z4LOG8-U1D2m%A(#t)x#4N0efKIbM@|4C6nXe_Hk}yZ9-_$$;wPd=_K-xJH2eN-lfb zPv+t8A7TcBXwBEE`2nLJS(RKrX7e+;X_mSkT-}*)3WNU9CuX`OzQA**~7ea)~`$Y(M7u z_@NJG;bR{ZG=L#$6_$B;=xw?KK}K6t+2xvWDxGi_R1tohJdoZvr=uktAOZTAYg0y- zTNqp_4>5zQYwby@M1` z-tnXUj+msP;5e^tK?v7B%Hmx)E80MHtC?x}tsu}LEvQXGQu2afU8bhc}J85Pq^%6Mc{q}bF-iUh+B$ULNFfVkQCzf9$k@jAVNcvfool}kjp zc{;baJv;>|F)cM<*H&^0CpajwarFwf2mBvD`lhFQ1xpeB`jXE*HqaRR#>GdZ!<CIhKY29?)W68y6a9=ke=o~XITqO z|M5IV68ga_T;?~WBgFm}<1{juY|2M??$VA-jWy%yX=}tcO4i4A7uRiWM){_Etg>F2 zv*!xVC6MOI!wz7KGaSUWXE;PvB*Seg)RHgJj&r|##L4YCt9_&|@A4zt?X312imw?p z`ts{XyEMFVv|Gd7BOGknk*hSkYJ^LM4!ffj4fl>{g|@G_Z*+}@^?Y=##s~A!bsFE0 zk7|uqAo6!QO(62orm6L>3l7R4w=f{D!NFz#Lt24Aix;nqDg+%TSejOVGh2U|lCofu zI%B#8W-4_QSf5QF{HI?+eot6D9bR?L1D{2!)6}B}WZH;v z4Q0}xZ7{`o@?-!+i6(~-(r?OZ9&)Au8Q7O9G%K!HVg#?}SF>H1P}vD26IbjqeQ?8h zPk?aF_mh~;KDkY#|HbZJZl&yuW)Vg;qO!&Xv#t89dfi9WiyE*JwSd{T!ik1JtN<)Y zTpTfvKE!@&GCXDB4lAbE&S&)y-=>5lJNE{5R$+buxp4S&xb~ahNgg^J795Z(W1*fs z6F!M$xZpo@PKWnVlZeZ98+N}|K+VRwX>_52DrQ&w6eJR{zX;7ZKLL|xpqr0g|ksQp@Ku~x2`CM6uzUbCAo)8G5EUG?m@TvXdnglHkk0618~-WU`RL19e+7DBPT zOZARRC&7SDeKnW$3>oVkHYl*Pc&Xlf=?*1ekw5~m+OtHEN}sZXck;x0m((A%8J+3uT+0gViGi8$y8IOGQLbW-jStl; zEFVrOk6i-`T4_{kIH5^q=Cr`sX;3KY!SO~OH-IXqh#k-;=yH!|_~V8@!Tu9udCUM+f7^q~w zDRB*i*Z%AP&ZB=&2E+j~F`MG(^la;n*c>f!_d5%~1jS>i;}?Br)x8je#0%xGQKF_^ zBR?fpoN=lXEG0X|P1BB|Onuq+tz@g9VkJjh-)eJ+lS zHNq>x&$BLe`iAp*QRce(*t3HUC}9zlnica%lu$2pqV_O`~?<2NUGvq)wU);sd&+BK`$e!kL+eShMTo&iE6 z=aklo3NprrXns!PgM7*p_+S_i`kNN%nvk{+4stku;jm+is8_K41zXwlB!O->vVk!+ zGb;R%fd*fp5^s_q^ej-<(}|bEkNg39UWMcc8|%z-trzN9#eg?Q%@7c#GC$4vOk5&o z6a(Fr4lv*V)?^0Acl zZn<8{n##4i8LqmyILmPL&Bd!2aKqfgKrP$74Av83_qM70QoQ`4?3oZ$oz)9`mQ$9!1IPc9@v3=feeT9Ri$k|vzRuUtqeY1HZLiR#2`<@k0|; zO8br%Z}t-L6HQF!3G{idi8*K2y{;rtNaGpTnP7_0r+3&3>O{9B(DGn@(U@M;RaJW4!Iv;bj| z*zh0c#>zc?FG>O^Tp~?s(_N8ex5cfO>z zxH)-rZz+DcQ(<4$RI73sosQqT{Ggm^={hggljV%&zlTmsTp~xLF4Rl>=fQdj{aHe$ zlF`KnUe15`P<;oUeQAlH6LXF&|A7upCePBclXPKcnjMG4X$yE6{fb~V3acKJa~v_m z6Ho-DU!!4MG>*jQTPc$5%WA_c)gTMol(TWB33Uo}_oe62htW{uDtrMrDlyh6rC8zz zK5TDh4^!64-=+v5qiyDbIVx}x-~H;_Wb#F!ZMunLg*x|>I3U9}1;=LPtJ8^HNw1jG z7jqL|;MngdU5K;$GCI-vksI*JEJ>7!BR5Lxm&b19x1h%2Mb%NI_&q&&3EdXQi*iu# zu_&ffGe8u38K5EZm;_15Pbfz66KN{>i5QjqM2t#)B1VM|h|${_5Thp;ke{d0eDI&z zehj{6cd=u0-}sMDFmTJ+K`(LDnL$S+GHiM3wD>r`#S#)7UCF0axDmqv7&ya0Y!C+V zaT?CwHrlCAx5FG6PI#NIQ!qq6$xX!|Hx*Z2fj_Bo!V){r&NO{Cq%S2e1{c{sZhWbBjKsLj-0+xcq`BgAovFHnT`*7G;z&sS-Yh(pLr zqSKPkf)EYs&^&M?fDoLgEi+@ni><5!JP!N9+wnEq2Nui!_h+M^#A^F);il|*s;J9z z5YJ;7r7_BIz_)@3)*9PfM1UciSkDb*{Xnx*t|1zwOt^=JOoB9kBU$x(-J@KO;UK_J?kO3eEF!o> zEonw2I5>;QVIy7;3guU!Mefh8ks}Fqjxh}D;eFu+f?;uq`DG_TI{6Z^dblDy=*pcU zI+ES@0(e_Pbk9z=VS;u3V6zj)fbohdMbE`4I!OZ~!rNi?iGzy~SZP=MVtXxoYH+Z~ z`rjTUDD%XtKu|*xR4ix0I>vLqm!23C5GjCxvI{pchb%IUM5)?udY)TNv|bF`B@uWdN*MX&XyAyFr=He4y+YgX@dyH6W!bKM|hn0)M;1VT$fr9JNv?KR>? zz8Pbfj%I=O1crq5ix_phQMmXc=y#ikF2NvUHHmLCdvGE-qq0H#$knjR56c;9*rx0G*fRmTo7?k8G3$@(q=!k-nRdsXRjG z$Hj_b;#@#Pvo6C$_Jz(eV2Kny>)yBTNXD)thB%smiqWWJan?E(39zA$xR|_zyg9NFRQsVgO=ye~(l4$On^Kdq$po z6JG2CuIo$24;&RdOy81l49}+^wFwvHI088fA=7|Ke>s9d7G?Vw(8*UB(8AT53{_6O$xIpV)H`oUy~%FpOO){w3@GEL z7|fYv4a;7hbn=fUo&5WD7fTmr?uUXW3ss)nLML~p3OX|7S5lSbRAG=)g+bYl40~NC zms5pLa;h-MslqU+j7!lqEnH3&ev?y$K~5D0IaL_$8UYyTzI~fYrUs)xC&gvs> zg9>Eek*~)-$_C=Yu!)MAzQi#l5Xv#-ACZV;6G_<|D{XokH};!dvN0qlrM1xqN{w*_DsqT#+6rjA)pS?rcc&9@AETv!pr1-i=Z#x|%-y8L%m(&Z`M4*nDKs{c! zgNQuF-u~=HSqy~YfMu9{HR<4-b*F`tp{q~G!z9o!x!h-Ar*{p)GFb)ix2E@S)R%@) zEtj^W{?1V&XBM2%$_~L*-D4y%kko!M_FN&X!cXDE!8ae(!Blt?dJ}m>=t0Ii*n7FY z@sP?9-jk7kih&l=3R(qf=o`2S?23gB1W2_5roI5k$l|O-3z3xMAp&A67XO!>Rn0+kO=pG96M)(p`sc~7*s0;bLEQpq&K7Kih@aXl*wk7Lp2;5 zo!gvTFnGh3&LwH_Gm`w|Cy{>UnCzR)yvqr0ShI?>VZ^);oH0vYXxOX78|V zVnt`(xui$-W8lFMvu#GW;FcC@owB%R8PG@56kHL?>imcr_?ZtF-Snq5nWz%Q$@qfJ zr81Q`51pivk%^~3F!q$F*2G@WtzsU%8bju@s6>TAGk9II`+;WpE@P`W(uA{x@ZA~d zv;ntqU1>o{AJSCNo5Y9GRHAOw>Ui*_nVEWboWKLkRd)^8WnXAQ!iGZ)NgQzyg3U(> z*0%h7zBqDWR4~C3{A9vTF}saA;h1Jkl%jF)QaY%4S7>APawI5^HA@p3*>cCU-dHnv-~niHS#62tvD*{;=z{PB?XQzZCi!AaYJIl<+z73 z6p*$+!m|*%OPw3K1e2v`ve0Za%%()4li(N3Sz!4%QV@~Zt zdS}zePDz^p%TP=kM~lOM>Ls3t=`Yb%PrQU_NO~r$i_|KeE5k9jaRqD>M}5YLd-`Qo zeMRaW4oyXr*g$@sR>{&tele#qTHnU>5EU-`q$t2(osHaPoRD}R%m6F4`qSK$59Oc1 zPl41RR3}!>tNbr?6926vFmZ4PRh1r+NzslX$6v#+`I)Chx5gnZ6_$ZyEf9SG0a&mN<7*{T< z?`P$X|C3kZsWcoPx85k}vM{C6=#l%{3sV?I?~d|w@`z2)l?bAxh7_-GXKb3eXf`l&qeFCgyUYj|7|>V zI+QqsK>;BKRopSCcz{9091J?!g+ay03_9C|L1()#C~uiT zdCLqsA(lZW#4=og^%%XU&&#k?aMsCwgacyc84TlDt(+c$+;!ANH}8+ONu5NaJ|R+( z;7GbT8$#_maeu$vkpDuxEqpP|QD-j_w(-YMs@q4i9^mE2o6*5DCjwk3*IXoEBrny& zlRT%MdOY3=6dSrvTb{OcpSDJIgG=p8-8#UDf^IrjeUdV}F*z~$)YO}IuvE34FYduj z#587BvEpeQXJ1p7ezwj0J}LZyNj!$%7|YkzLDhCL}e_h z`iLGC{fu@|A_x{oDuWAmtTOV@j5Q_CDK?s12&_*29Zuy{5~&5D#Okm#rV^Q<2{~hx zrtF|4T#8HnPAa(IkRX-;({kUE+v>bJ*sK!{SrBhb9V#%!c{ z0d2;C)_T#nHC+^GJnR?f4QNplv=^kS5*0(?4zx(hl zx7_0txQ_&)1F>>)){a71t1E1EaMiY&hqbrBqu^2&gwodu8QNuLGU#_C~7cx8`6VZ`pgEe2+0D8C-J4@vrlzx ze599v$Z{$idTs3oPi$S+<}zBX=kcE_nyO)s4@; ztQ3cqaR?7>iQ1u8%BG;Sy@M4T*#HBO`3Wgf5wRoEKh^6Bp0drKA_n2wU*aig<$hYq zw(uWOV$t(nbagr|#qzuAEcGm#4Sq^WR{dXjIw2*d?=b^E35ALW1X(-=rOo!*&MUWZ zjK&Y48_c7*?X^ywbR`kpp;Tpw^G_ru;Bb>mv@dAE(7k~Qny;J)MD+zi;<)mRQm-pz zji8PNvgH!3`Gj7!mjPesJ_dZDq<%;tQ;mbA`C-p0O`$J;#%&DvC)UzL-fwEw;C+jm zWzb_2o=*&M$sn`Gt$tcEh)9^ zWRah_j4E%LMFV8f5FY&^)w8y!HcQNCzytgpM4isC2uppT3}>6?V+IFhPzq^A$%mQ{0l??_y~XUf90BRr2cD$#*L|Mz&pI`LeW#o^6qhOtHFo zuCoT*;+^r0&N>&|)dGcm1O*v}q9u=o*KFj&3vHDqbx^PpT{RY7x(ZzD;cb!_>QBxo ziXmBo#%&f-6b&(`z>yBjM(8<^VPUgvP7sN0XXT|jWmY7g?q&hjjzg!kcEel9VIayU zUa`;$B8~#UB=}5L{d&Gp_2e4YF$du~bd4;&IEoyE>ul877h+U~EW7I8F|{ae##gY5 zn%amiOcrWa$B?z~wsnjah+F-@t7T#rm-DL ze4I+u%_`i`fUG#;h$G*Px+GZ#99dbLOLhC;kC3cH){*wQ$nvlAl=db~r zBnaX%dVpx%Q6tQB^lmGp<2no}k%T9k9gYWg6CatkO$I5k)U65#-Y~IRo-CmawnUVQ z0$V6Wdh);#PYg|ak;o)gbAlnX@IjQP{hZivm)ir}cd46;$A)6DnC+Y<6|HbRM?e3wSq^xfusxe!Ipwu^W_qk=mPf3 zl1O){&2KKz2jTA_rt0|B6H=Xg?O7MzxI(rP-m@;eXI*%c=^_dy+eE^fxSxbK1>+Ll zmP_*QODGW;=@ z;jgfESqNjC{qSw0>6sGoLX=7#SUE<(hK^k0h-J8?m!2R2*8(2|9;q z@b~@avR9UM$C7!9lSSq!gUnL~nWqfTwpUhcWFgI5g5BuGa`s3WWZ7l)y&PT%Fy@ZI zVrVspOi8$_*jX}$j`IC<8yWR>aX*H)jp&8%RChFQ(h|*E2zRFKx!|swUbq%k=~4xE zs1xh>I-{y7UeB!6)2pa1H1zd)VKYwzN!ekr4#kR;8_wo)Mz(Q0G5iTVf-|#Wj93Qr zgTkXHZ<$2<6L}0sV$GUMsTXKQh292hUc(h1l?mkRj9f6rwk7%=X|ETG0ZG zPz`3HQUIq=wNY}J0Ohzw({i$(MXOYJ z1u05A$J%LHn!(+Gru5!hmbshiLIoM^d)-c=&B{S9c|Be2k}`pbp_wMF3`pOYHz!p2 zsku$S(yUW@Gs~+u6Mi*2w#7B}&b?Gz#+A$Py@1B^F&1Ne%c9vU$dVvHZbW3B8=(sj z@L~2NlkX>$M2>bHVc9n7vbmci@H;5%h%a_~Sbk5Pd`xZptwX=X~BVP$5@W&2PKete7G%M+)4kRp|hGG$6(xq9iv7w(sH z1(t-j8*(C-C4r{dg0kxc1Yme_%)&I-=+C2_CgKL-q}GVfs=p{fpu}M$1VPXY{19VO zig0}no-iN-72FruL*osW;Hu1lF)}2IRn9raFi3Hq&V`6Hn>0BinkI883FX{PX`*z@ z?PqkH0SYnO``q?tNV3Pzi}=pmj&v&4yjOr$+H_bee{>K;#P#98$VSv*6Ere-Nyd_= z4N++WSL%1EWlhfX`=>c3Q1@^phdfJt22y}VUCe<4G~kakwAZb=hY$QZ_|q*)$cAV5 z#e{joON2Ih*T`ZweR#rUz5TBEP!(Aq zsy2!1W1>mH?8{(1zHL$D2k->gC{+r~?KGmgBv?HvLT0~2RVB9gM&1AOo_=%OM4}YN zJODVAF1h2_P;eh-R1heN%!e0v-??X2iN-!{>aI$M{Y~9f>oJ%S<^nT=sFOiX1BR#T zuzv+a8tZsS5~Y2GstwGWA1-L)>kg3Z#J@=gzSE@q26?WGaMYn6eaoQwc35nJp+hI^ zq{^nXy>c>7gASN4))FBr|1{rE{v#t;Sp88hb5xm$=D^899>oEMuL(lF3BUaz)aOd) zJ^9PSxQ~j^hCARA@nUGGkktF&) z$&fD~df#noyWaoycGdXflu6imj++yr@Ft;9-BD;Z>KpKxhEX z%GXH->QO!k2ZWhNVW;O;G|lS&Y02G%HAS;fmw6D{*J?`swLFR&z8-uT5Do_@)|{}XO%Wt5qb4$r1l+39dE_t+bhGRj5o#A9()^UOutJ?dzk2y~{&LIj5yezJ-Qrkxg+fxPf0DX|$BKbn!^&Y}uQA5znbGkmXu zDbb0@)H<(M4ZeZnGxPgvuvTwn1N87b+TkiT>++$%wjbro?D)BcqoKgNIve~+2O%^?6kCd4$px3fmm`v-I)iPicoq{o zR!|G@?6f2_m03yjDy#)+g1t;;ABC?>+3H_m_p-?O?o+vWC<e{4yJXIA7n@cDsYv2iFgSLui3(pv&e=t0K;2hVC2Q3&Bv|v!sff7DQlbI3Y3{`4keVCwbK?v=kzjI80Kfzkc~@)9d1skAL$>k z&-l9xat?XcwgI z@{AgOBo+{!f9&CU={^<{jZ=I-np(Zh!YWJED~PbMuTpDCAjGEqB(f# zZqCS}LS@GZ1Dei+n~tMJ%~)ElO`emya{bcf7gcV%Y#8_9M7VI>WBYW-2gFY?0B9Y!61F#pZ*?c zLo*}Qw&wR-482!}S>*2Gxq8TRC%)<2LtdfHW|qA(Q1|SC-J^i!dB>We3cN}1;?s-p zysNG%yoi28;v(O(=CBO%wqJ_BH0& zrB<=XX9nRzx3X!aP(D{~Gb%u55Z?Fsj7)3(%Wp;w`8)>L`Z9rpr=I$EIM*KkM>`-e z-v`+L@)O_v)7|6TPJs`{t(@bcC+_E(zxWcKvHtl2?|iT=ca+ecYgTrwCuGkK9&NU( zk`gb=Nls^P6c?s-8l?cjPl_xBYOUI|6LAW?Oh}9CggCmKCAE;1Faq79JeP4>FlRvc zKB97&<7|`?+r~IcbdfH1Eb^)Q&sma`)O!F%M?boN9)qLmwEO1^>y9=9FfAVqlvlpP zw!90ZW=Fl!z8=#TodR<{QA{SyM}RS^lj z-U@AWfM-h27P0oii;lr?As<8Srn0A;SIq*94`W)}X2K00F)?n$9EDF4YyspP_`M8*MrW$3eWu=Vs*bQdJO3@R=O4SDuYCwfOf{dk4Nu;3J@ZJmO##?~o ztUlB=ABim-G-tD=_C$25#+z;8JG}Nc+Rcs;SCoUq0;2*W7Co*+#1{)MjZ5)tpSkKE z+x&9r062-I1Eh>8=t%P1Qc2Mp9b)seV8PDx!|ngMawLe`)Nsf-&yj$vlp{f^gmNS- z%rc!Lv83uT%b&QNfmDeT49a9pYD(L~;cxQIR_lb8D-k|I!FDGT14_u{v|PMUQOe+E zN})187Ab=hj?c|$9e=vcd=aWxaP%r$-L%jhZLY$zJa#Cp+m6&3yua9-RXefhvC9YD z$2~un&7)07FP@K#e~c*cTyFA@AZcuCjoN7v3m88`VGh zlES7vXrW%@?w6KwsrirXFGeJW#T>CNrx_2QseU*g6+&JqIy_KTIfTy_lKs!vUBE0= zP_hArAshT%{~@guCu>Z-V#zIuzPTM0#G#k>Qh~P&R#`blZtkdw>J~tgPqB%>!f6ETZ{qj z!@({VRIVXo)vr7}xZXj~gCcq~4?Q7=1e9<_kFeWK)MkSpnkjml&4$&n*V2+7;8kul zFvx0PAR}DE64Hc0ZGsuvBYes4xxwO@e0c?Gf15okA0~zFnxooWv2Sv#n6f<8V3q9! zxBCq(R&sC^?&`bcskVIzu=rLX$&NN!=!>@ypa{cTL)4x?4Glo8J}cK{aZL7_w73$@ z&$2EO3zBsJ!q7s5))JHD{j|rD2>-Kd=>Pt2wu+a6e^R_>!f*Xj9-jCEXqIMhakhy$ zg};Bh$Ss78KGBpRXetYwSLfA~)n72tw5AQ~5iZP3%3i99vP_SX*d<6JIJr ztWSL!c$bB5ss5Y`6Qw7q#4$86ZSP7enYC1_WF}kBBmY)ap@L>Y{;ILCco?~TUeJsz zs`+w2#$@6Ps~9TT;H%}MBUQ*9Y#{B#xkKOwK^;P)7S~xiGZ2A)I8#RseTxSt!#k$G z??(Ca*pC{zz`P#mZaxQh;tVtpHXB_Q->(3tlSL?z1Qi#@CGQ~6q^N^U%n%I6d4gSI zMYhKC3le8tqo24K!tO52cRHP3FYonwUH&fzVK}VlN&&VDao>!Oohry8ybW~k40{;7 z(xnSDdrarB^lDf@`I7T;P|<^-kG_h|IRg@uVdnU}e2VtNdgnZwsM~>G#zM9tcuGjPbhGYbl zl!;nnvRyCI4f4d?d3c2JaVFxKto;IT=8c70E{O+u%q1a0E|O@#iiFKfPW)V1E^NX zF%4}sGVBxzn+rU`L>9l{9ukYs!t@v> znJgdg#`4qQZZetrW0NNVOnidL07i?~qlB!&L^Nm_2t~K-X2Y+s*f{5C;317E!cD7X z18`_?qo?rWu`}V603R(eyQifG7CLN(6-UI#SA-J09AD}-*lhSaEn4TWl_}3vA!Sd? z6uS{~OIzZJua+iMy|dtsnDuIRqzp~%r#2;Sx%q=MwF!rUDM1UEru@OiE2k2PA3nyp zJG9eB`As{MiZ=4_e}DsX;6O}M@n|UXBY%k*rs7C8U~fI=6$KO_D0(;-2DfHz zCVBPCb4)*`ve+(L8Z!^HI{1BnTAS(1_Y99-tY<}HIV*A(kT>;xRM zorHY}89ecnKpcyS>86nt@D$Gsov(hj`~vBq#00@0oNKQ|g#{zn8U@u(sg(~Ka|t=J zBwL_M;+A?HWPJIkz9eKdl_e~if=l`)dLAiYtbR^gxP5}zBqJ4PGAmC^OKlBd<;oAl zh~dA0R?8IZ5!4{pNf}^MB%@yCz?)eMNfIrw@K|;NR6eNp@9_6;fV>)l<5fH3Tfse^ zyh_lb`W^JXbVpp!PG>6As_^5^$sYlfDK6^x`PBc&v0RX@3XsL}WA!l)-(~l+O@QQo z4!isTY!qKi;s5T)zWzu^NPRb&cTUb<8Fr_e5*_f^<#_QM;bL6M4P+CRVR`yeCOMQC z0duuv%gl%vs7?A>IPpUDwNsnQ^RJ4_CSN<;Tm4=huJR|N?{IrPNQFMVaCMx?8<+_x zdu6!VuQV>0)HD+oR`v3QgazCQ+f4$!(6Dc0elupW5}*I5I5TlbrH`vmzd0AuQpBEg z*a#T9BViUrmC+1&=2kZfB7y}CL%6DZP)k6@Z7Lp01Wa$Uex@}88^4#qs)ukDN}yR= zQze{P0qudYh8+sndJ2!4vuBe3JecvLKfr%Wws-6#nAsad(h(Ha@rPMhw8T zH64-?@inzR7ovU|8L|;kUH1ky3GDx;@~6fYyeFnS+gzH#>&l|L*)cPb>^X^5rf&~j z(KfaF1{4)jv^%morA zfgD00T+VA|{1O#9zMqm4wXu_N zkHu%!X~PXp->_KA5rJKb1EbxWRUdLG#W2jEz<{(IZs3@LBu^ zK~12?r1UR5{T5BqiKW+UG*7R9act06-C%Hz3?^BMc{zdkr7;iCxQoIgU3rqrNDYVp z1{Fh9y&05l*@`HJE1X61Y$|HUtofh9Q;}T~eH)-X*b9J75yjt0G$7;efR{sX55Mup zOs{%ZIk=mQRz4rZ4{dxAG(b9MqF~Z4EJ(ojjXDHEf9aYa|69@YS>#(wdgz<; zMu!CQ2lqSaaoSF#=FZ?F&mp6Ce^ZPTk+xn;Y)^sCU5ih(dM1b+<>vS25}eZ^qG!#) zKl{(MBxd;}40gk+QfgJMd~CdU`1{1Vf&WwQ<@B8O^_P%nlHaFRzG4DVP^Ub#_Y|9;0toW($;|45 zL}_W;#b72L5OE-{{$ByMB}ou8I{c)MirW}#jU<{?f73eRi9kky=bZ5w01#Dpt8DVm zb&8qI3c$Xx@-q%DO0DG67tSZY0l!-;F|&fRD}XuPUyARK%KYgk0i*(IC7|@fRTjVZ z@>@$F$Aj?-@~T@Msh%-25=f~)OOGMgAmH^9xmDkg;Ea6X7jcl}&%_2=KF!vV$#a@x zCzK=#^wmlh!Cf%`Fp_Vqx`DyME0|5vJz+iU)svp31pCw*oud{!uv@(c0Xt@^OcQ1` zff$;wU3hGA${s4om~!-<`ILEd$`I^wJWlJ`+PEC9a&J}!@V=v)YOg$I&5!P`(vSav z!^OZ+w}v7*c|O2%SBw<%&gaybf-VJ^J4r0;lg14J-EtlP%#sB@A`HZxYI(tu@ z|KfYTvd&Y0>AtTz&oAT8ov#`UempPp`||s9b-u(guG$bJK0N1|D<7Kk#25k$(A#SK14HC{E?^ulNQrwMP&z6HlX5eB$Q&j=bip+34aI z|E-ST#==o2ea13e{3M+{JI)4wqTF1nu_cp&QpBXLAX!0&g7c3D>V55b__p_}t>|@ z6){g+G=B3nf+==OeXz+Nj=UG|UJ(}Gm2q&fcb0XP7Q1%mW zQ4D<}S;hWyhK8P1=vc#VV3Of;^Xk)=gtqpUw%&Al{rq+gW6n#D?j7JCS`Qy`T&{GcI!0e z2Cl!sZo2@9Wx5oOEPABr`}gM9=EeP@cYngf(Ga4O2Crww0;?vY)s+qY$-lIf=$5(* zMOg3Du}9795h5=~vVTb7a6AzB9YD`HT;B8Ds2?ifDtfNfWYZjWNd z0&(zj77~ac^o>_zXzjmZ$HX^?+)vwbUaCyU7j^V^kxi~lwfZIWp%~|0Jo;_iT_~^q z^NM}49H>db3aNP$rUHdftO(^njttX9_tssH#o2&ns!vi$K^h%!f?_31vhen85CF{= zPcvQCBc(R_0A|$hi%I!3iPgzE^(AMBTEdnRCeD7CKrP1@qn$mALs~lV0g_8WT@uIn z5%R~G4T1BRQrflZ2o0I?9sSM9blm+OrGU@5 z^y?3v!0sOjT0Q%zJ-_ouf8&j&Z}YuHzT7r99Xe%0DKqVVSRx61@S zuQOI5UxMTWmhL}ik|}(izsRBV_fxi^%k%T9$f)^1c9dm2tfG%la6ue;rBUc@5*@WI z6hpAhwQxNB1Zt&#`zO4kdo)QrGO7xW%rH?_9XARWlWEd(TvTih`-7Zk$3-?h14l@6 z(Mp+h#7~Z@c zx*+L(@r%vK-6N%1WUbN|$j`0!)KNn6!1g#s`iUzRb_qL0rhRLm=A@e5#Q06TeE=qUe+ zNvyaZ7jLbum4jLPvkZzV~10DAR{f2nVK$EY)Ihg7!RxVK#i{XMr1mpx79zZJRByY{M0z zd!$kJ6wDPC8#9Y(1KI~fDwwlb04g@s08qAwzceuqtkT~ya$B-DdMO>kQw>_sQt@Ez za3t>h3=0zwCUobOL4Y7U&@AdN8s>nyCK9E}uIHzaityNtQV~FDYoSiyNO6MzSFXWf z=EzxL8H@a&vpol4+v$366P1|%Aih30oavUdX70#&7h>~JZ4XpRR*r7V#OML5EveWJ zM7mxzr<15x8cECqc=J4GKIfd7FewI|Pl9nW(yf_#P>5l5?y(u`)nMf!!gZUZTgltR zh0&!VZF<(nZ1{l};4um*=Oc2_gsU0SJ>$?pfCX)%`T~H2J*^vnHS}z5Ck%x*uxnsM zQ&kHw@6Tp6lS~RG&r=L!UKC9Cd#+hMT|F$eS+JH3D;M)zRkG_z;G=AzMp+*mZy}5o zh!cKzCd#bnP>`g^?~OC51=_$5RZGb%YG(8#B{LhPi(o3+mfa6+d%_CEgckq6o?==6 znRHIg(-6y|A5%C?=DMr_hCS`nJiSFa8_cfy2Qi7*x^$?gjU5wOTFZRTTY9NIkLn~7 zg9Ju}w0t9Z z(O{5f9Dk!~cQ_PBA;5oF+Zb6rtA)L&KG|lq*a3Coc@V?le3({%dUBI64Q1nSHapgV z0pKC@DW$wXW9)NV;!%o6wKZkpQ4!3Z3o{!&{kPC1G!nC6ELJ#>x;Jjx&&kdtZ`7m( zWX~wF;1-Y!A=BH;5W>>1lp_X9BPS0<`5PP`AVGnKqWlfoIY|qLctl*})JT?D(bYi) z(((>5SOd9Yi|(%>8~jDF**!RsBaV5K!9v{1(SUs?9*qEYm z%8RYOt99Iukv-Rm;JmSA)XzMt!-DLVZZna5L)dpInXi^$Jb2CEhOgtGF@~=nk&3gA)5lgc+&wZ&?d<4UeR|dC8V&c1uG5L|_l_EU zTF*zd#s~A!NaHgym_I|`UPW+)5RG&bOmN%e4ySUPR!$ltOXr;OR|pN)oFx}z4M?o& znsZ=rnu%&^+M5blTvjS`Gt*3u=+#$O{~Kp&KuFDXRG*h?2`JtAY5;g5u0l>d|7WV| zLFy2pRX8|*^!>2hsY`6;{3^<~6}Ogt!Eu;nh=%^WlD69Xn0XGz(gw!P(dkZ8Z|cqw z$W!2o_OsoZ9M`iR4TGvJBT(5AynKjJZV$ASO6j0UQ$kL;d5id{{yh(k!K_8i$IP9! zFpB2XV*%qfB`4eeCz6<}mvdt@D;NC6C>|}dBP-Vsc;@gs2(ToxM3V4s)vsxuO-im! zwkMuL3AE}v+Veu^V?dCri(9i7Fj%wqnm-;xoIM}>LM^3P|AR7N_80=_^vK?@m2`%p z=uoz+E%H06Km`I6g)#bLfA)NxHOJpAPet`Aqeg?xash(~(3nr4P z(QK|#=ds)@{)!xUCzp)lJeO;aoIH z?P6;x4v8)Z*;vFLgo$Y)8}Z96)8fdIA#F5F4NVf#a+;%jGL!5AP=cCnF80EWSj4}O zGuLP;RtYkOu1Qfb}nL%0)pW&Tn>7adF~U7yn~_h&f2Zq2qQE?`coN=5IY79BQ1LnR$a<2V*$!(Wf9U4o>%k&U1Z=U$4VYf|@PEw> zk7CyPf&(b^XEz3N8=ku&SU;reovpQObtJFJ&&f;y+EBX=S44&R{Z)6G&?N3`((Y1sC`U`Y3Q9s|Hk z)a~PtPJ|sNG3~=4DishnsuQk-+lI=&BWw+O(E5Er2OGYIO?xMgZQ)}d!C+h#M|o2L zpn6g^-^51yy~ZV`!~-*8XV)ZT*CKkjT?T70`4DRaj2|cYFq8`hz#B`7{0(d!R}4t7 zMDxoCO*cX+>dln+MLV}qp$%X+QC1^+79-^gkQU)aGY()x&Zvt2I%>^f)xB~$a0hIR zX2E=Abdx#%I>7)%-_BqY9Y}9X%*<`OUU>A&3=5-O=j?snj|J_=cGdF2%vNtEB$Ema zFxSdfOj<8#4h2Pdp?;U$5+Ah#Ywq0OhJxyhEHqs?Qt6B{rV2Otdg1RLajJ-BUn_2A z1?y@oL`1eC1;Q@-vlkG(pMDh^;g(;^V58aBGFZ)~15xV%;`;5Wg&EDiTQ1=y98ACZ z4gnyRCKvz`-|T47HVZQUVV_ZZ0W~@cMUfF>MAv(s42UVspJUzl{~l~-U~=0rQH(&DU_4c?ndpUo{4YM$SS-O-rm5bPH$rq* z9U2)jI&R*yGe1d!ET$NTaq5dz5eD_dA*uDyT?qNZc{A+BhbJ++7Y~h9`PJ}ed4Kgj z47FV$qhWp-m2Qie@%l5I(8do-^;IGz++`<67~7zI<_8fPZPqi#mHo=LUd6M#EXiB| zC?apxNu|Q4@bmly{DzctV*#-78DD8@AzSBTuup#JoFA$3C#v%E>MOI0>!;nR#&&7a zBR4jX-wR>kPnW-mc}P)D8l+w>eJQ%CxNlWXDpm#Qknok3Jfw|uJ)|=J4C_9bAo2*&3hlNF?qSKB}N^av$ zwQYwkTXkUsZtp`FT~9**870|#icke225^&_CK7g@^(s1Y1ZDK|>CrowIHH6p0F?wx zgfL&+!NWLX3+-UL`a;MAAvJ!c0q}P)!3080D1s1z`E-uwHGB$LM?oTLL>L-%MvV5n)O;>B_#0` zHcN4h9REFD;|gn>DpPbGHt}j5*nOjrS(*V(?}IG&CxPA_%_44d2hLjroVQE>=h_II z54}G(=v?c|TWUEEr|uHH6~+L{>-=gwEpyd30*veY>M^o%O&zbv!n>c~?bV;>Tv$(B zXi#Ij{E?%nM~?i;?ZW?r#l9(v4lVCH#ETlc(>G_)H>a7ndF#yqyo+p)*hrkf^V-L7 zB#}SndHxvN<1`28ocrQEdwtS&uv?cSxyrD2;uiP>p?$gbN3+RwPS-Vg7xqGJ?DRHg zXANelDvt4cFH3ysf)@9#=N&Yhmn&aqbd}+He+AvTteH#e)MVr2CX^C5+MX81>xi7w z`BxkM_K6LDew_O6eimMURD8ZaHR{sIZSFh@@`Newko*yM1)!X95KWhreG3AOe`P*;9#_}&{NT3*%yR%W%rqs zlcnyIa6<&+4YJ61Q^CQUim=1*d+9{Np#s z^8i<`@GCM5n_YU!PVxO+rpUcQ{s^)RX2SC=1w;)cbmdZm%Cu*+JE*x2@ZSM%#EjZS zgCFjIEU>7BxP`v z^Dr4Q-vn;-iiee>cb@_Q9Wj9}B+oQt^=M)nu!x#Df7^jN3 zE*v`AEHib~fsVGq{;uheQzw4&f_9rT+vXQcJZAIpVe;CbSdkZVbMax(@`s^}Wr+(% zND!c%;cA@W?>w5-%jVfy^=BJ@wtfP@eXfSrFhOApIP!VYh`)_|jk&`aJTdO4$j@>$ z`69Seg>&fndqQ=hso%}TCup!$U{i^5~ zLa$?Q#6Gvj3GI{yh8(4yZPGZh7sAJMHG1?upfDztsCA!#%zb<^s z=o&UTq3UeCd<+!8Q&#Jt$3~zMnnL`U{iDLKT;q|Ys?U_^Qrr_RK2ca)R6*f_UkTG3 zL*t;#RtPCI*$=v`?lq0pbyjgNZWnCa$hJ$PvZ!61<88Zz@w-tW4TTj|W;=Mb9==1( zS6LZMiUp!f0jdXSpo*&u6D8btjCgBzGl7Lc!F~Shar2xoA#OpbYA3N zXZ1CJqMot#*R16f-y&6@Wn=k33QJpRlhLUbZiTx75bBrB?*zBd^Qb0A#&T9{X>qy- z+Uf3c@;u?Jt~oY?78=via>_GI3eb%Xz&iUCb~t5$zji&`&UtgZ?P^K-ZYaL4S^PgZ2bA zh1{{x*kjOko^~fLHvqGEq9J{v3K4`aIe&>(#dF0~8zimaj%?ux(vJu$e`8wPmpT9t z!g9rbsZVETYs5I9z$as5kHIx`RyaDRd5tfMi(H)GA~#2He)s!eQ^v_|_9rg+6C+!I z^i?^7gcar72jyUvM8aM%{bC!yj2O?$H=sHeCwzu)x3}1@uZ$-A8FxT`Zr+LQK_i6 z#>0~vjo-9zfTM*=&Ns#3Y+IZKh<+$;$DD1)A%BFC!et%-bx}4e-kV%C6ILQfh|`O3 zI*xpa_!*JzOj6T$?U%*ZUiJU8_bzaH)#bhKy1ciUcV@BzQ6m%Wn%CG9O3>_@O`@bS zYs>`!m5OflbKKU`+Mb>XZA}{4d_IjZm`EvAYqwX>T_!;dws5M|UE3;xmntf!hgP(- z+Fi8TYD*RG6qTIs@A?1#YpwTvCz(qU+}j=z*1YTTzdrZp`9Du~V^TcX_38pLcpIp~ zR$isuS(E1|^hj1rf1Q~TsBr1!aL!=On+(<+1V^r}<;#%S!W~I49Z1rMD%yoJ)QVkjQoF9Q@qD?SGAPFGSssG~@PQ z*m^C)fdo`BI61j|)Vc*$D9)doN-W03N3Ac*eNL9iHk$)fZ{A^{ZEkN<=s5Q_kzQGU zO{M8{PV%@!a=S9eMP$F;J<*8b7|BmQdqvVoXlda`=L;8QD&;hC-@>!SvGcURUys{V zb{phe4j?K69eBx4cd{DMBv^yZP2QThQ;y$6Qk`5|%Dw7X2XrCQ@Y;4-fiN#LvVeRp zusk)pSwz1QfW8;giuXKQD}hW|+8`F8pr;wu8L3tL(#bN0o=oVyF-;)6gRr%M1dkX? zz)bxo&bJJ}X1}NRy>r>R3^awtqqV3jnc!Z3)EvM=$6a8c5We%ped+4$V5^f!cx+V(~Cqbe}QRK@b_! z*P~49I7^UEnilDi=9~v_74ww;hyh{Na2-c#2x^OfYzrhsy;k)c7Rm_Gk`9D8PAlNDC~Zy4Rtsk z&a!>ngg7uY6VtkYTk(){STY6(Z{v?n+F&ewEQ&7RIH+W87Q< zD){_093z6PbBt)_s=0%ND&20J1J~t~;_R9umgrLvF+z|6MkjxBKoaQGhu^KXD?LjzBYVj{mj?oksSeDWEJsPM(%RA~^eIVDfx!RDn~X zy_}VCP*>cujzXa?4TQJs8T^18qVocR1Ch{7Pxg)9Om`mDmt1i(n zyzjw|Ma=$F;pwhh5Gad>F3@&o0Iy}UI;eq{5JAxLEWOKCw+oD9@3AySJ-~F{|8vS2R>Y`MdDMMXW4ZdLDV`Ek0Q&w@(@TK%!Sl{;t{Zm(yMfk9ewK;Z z;0ED&gF}kQgSR{146jBQ{?5o$685rB$zmD(bgx1TvgA)(cDkGExzM=&AKLUNlj`uw zP4A7JwpWQP6`onc49d=W=4r7BwUGdPHb8&bsPxwv)`6!{9glS4qp7^INx(cCa}Y(^ zIux@$XS)fv(Fz0x@6V37>Z{8D)(TBc-bkDo#nieWVF!2)irg!b;arm^$WUt(D#V0` z@-+!GsKUgOkmcU4nU;i1FZL6%v_{A-49n>V+42odVHI4yl{aMZ=%C`cxl}x*xPhZ-$#Lmr!q{8A11TkkywsPM9OqJj|Ie% zNMadhINZ1)`6zZs$g~U$cc=}1epCSo8Gu>r?cuw@jO^U|U2mD*bs562!dGmrn^#M9d z@YX(#>GDE`>f2c0jhGE0ID!8&)icwZAQw-HUmx#3QhZcFY{lI!y%5BEL-Hm5-R#pV zj~X}bPy=o z(-+;4x50}{gk{=NYpLjOv-+YIp8D#~2tL@C(*)UN*OxyCVtq;TWg8dlt2wLO_lh;3 zK%)@@{zUVgaPw1mdQdl6MGrbol^*pe3WyVNeR|cdKEGy|UocGS_$Q#GKGolL%};vT za3^6A!?_DTF|QI@Cwhg6Ezk+R;IL^5POTz8L<;y>g|;{X&uxwhY7Yqf3`%4p`->zf zk^U^MY|2ecSlO&JG3ZPAIRwTX9_ee!7ZV_87x~T~+wc)Rcz@l;2o@Y6tUMM1Vn<*C zj@)ZF0%JF_gkKPl0nLaS^-UOVK{mlH34!6ed!U5EE?UDMG_VMR#)MIyy&%s1Bn?#x z%B&y^z7NrtG)6={cXTz@kr9q4mlJO9hOnwo>y)9a$h2s|8j^J-CXZ%DEJYrBFovk|c|&Kgm*<++w`%flIsRiBh9CUy_& zzBFUxGDP`LoH)CDVGUV9EFx@=X`O5j8IaRKsjYTg*@#hO&Q(C!2uGqznJ-k9ISFrz zIUPLrC@rmd%lV+}0w5apYKk(QN#g_GfXD1!h+fzSGU+wYz8p=8q%YzJAPL!1fn-F= zGt-E_WDPV2jiSKlt^;bwgC;r=Eyu_bh^9{lw<=;j z+Ur6mle6yX>Ni+IMb+;2;^A$m+2$)d2?uNzTWYU4xTQ|kGZx?#y;w(30&;*0g5RLh zO=$u7EqZ91;8l&{BOhiW#Ef}Ns0@{fEwXG(*okn@8o67T*2Iq1&=C4_SV*%3F!A4S z3?G-T8u&8dF7I+?et>l=EnL2LQ0+ zhEw;*mKfOAmx9U^j-|?Dv-j%5R`>GicOjb8&-E89u|P4O4)-^jL>SWgUp@DntMW z10@nIf0@FH1ne2L6~Q#NtNYVYGOeBsayeoz8iaJNOLhx1dRi(cuX{9Cm`h41!ohYj zHk?6WQ>C{Hvso%G{S120bqQ2A05*B<=VYdafR0W!zosZd& zeIdpUzzlP#SmOJREr=0!#7vZ&Ng+l&N&Pc~7aBO9w+F+-2*+EmRtE1&)8%NR*qd*o z3D?n45h8YZoevmDK2ALPkiahgH4E216N|-!4$4Zz;t;Wt3JV{dMjRC%`WQlSMPfTH zlqx7NPL5DN7Y3S8io7sJNC2q*c+?elfQ9%51*erFA%nG zu}&c}w3=|?>k9b0`HBEimVypO7 z9sk0yC|K3vDP=Ipyf2jz$QmFXv;$2G=CIL{NVyaVbw6dmS&PO(*jAt&W330;nUHXT z(iB1!(t%>Eysym?%anzI5SeqHnXH^jNZ!CNMCOeFk2iTC`L+ezB*(BHS~L@=xER&y z6Sz{O08ynLF3|N(a1!lte0@m} zfcayHQ2s#&)J}Lyia&TNvRhH3cqn+b{(*TYIgkdm9Qgt51h6qg3JVw+ZPw>X@ek%%GpdGhbd|J9T9}tJoE}&DG1(`K))cVrBW;|G zo?Y@nB4G~8+5wT3Q$riYL!{X}xjB#bU&7f7-Bo~hLO=~Ra=pTb08eh)n#V_G0W$bv zw;2^zZR}o~Ch2hc-J0XAqUzA&KH?5@JN{Y?0ajeBhyK~H1vqkJ$<9)2&2bNNf=IHN5FJH_oE*fmJX(qt`)QZ=b>6A+o&n!a%T<1Db44?umJTijdwbyyB z{+@}iCLX?X3CF{@`x`5J*XggNBYuPyM z4T{n81d|4LZqVFfS`7PI23vpN=F;tcDIG5KeRBA*8#CmW=;4aXDozIYEnelKTG+@7 zppsnjSS3hb>q2Of6yl)@q%xOcon%HZfhnO>GAp*nh7l(Krs5t0S#`KXP0HxF+jz9z zv~Q&vLPvAnsAw+>_p|^)uEYp%L*Hi94cki|K!rKeGki;FUgL|HNG@7kQG7)_ug7)2 z&=Uc#C-_0>rQ1^9wSFY6nX;Pls8mz^5SC|jIF8WpSrJVeccmoOc6k9FxhQiCawm|v zMkM2W?rWjJ^JOO;FJ#26J>xP5b5r0b^@=)>NJ`HW>{FF=)?>LCV0|pmk-1KZTs=wzpX#g z{rmF;;IxK+(l~%qE`n1oOVD}-0W|2XH2__Wh+G2a@-tIPjqgLa?!$*}n|`F*^_c~> zt43B9AeTNwdr_+CRSNM&qnaB%)&*C9$V$3e`b{7z+P9M!tIN67G1=#tc{od9|DtXt=n=2@J7m{BjI&&n&2kDCV9tz%#6fWJr<#6!AvrNTjM>1r8KH5cC zgQ9hwxJx;_Ow`p zQVcjNr4rSc8sddHYfG;n%rVD$DZdcg7gh3|I}w1y*$$=r)Nc@p+cpO#i&W~)^t^hQP0;c{766gSGU+t|8A_i!E4jYL&EOf3{@4HY9T@*QeNVVRlP zn54Mro3eZejKc}vlU=XRjFHrrKX$#otq8yc#+7tBnPxU96H*Vl7dl4)k<^k-^K@gx zII&S+GO?s+d%Cz{Vt@gS;ms*;Bt>M!v7Ap=Z8TG9EQjA^*)XSiOW`vVf795pFbHjdO zJRx20S#*Z#zZ;cEiy!Y+7Pmc$=FNIB@7pusi0mkh-7f_la)jXvCn=sb+qIXwABwGZ zt%l%-?1w7_(+ZL?C^u?k`D)aP=+Q^5fpNDq?k3}Ig>g4*&{AQ`VNVx~-VIzsDjLt2 zlo@D+Q}~k@4VLL*HXOw}pi$YunW>biG+242LY+-#XbMwlFcs8qZ2%EaEq&DKn@Xdw zskE_M5E|pQ0Ftk$5iYl2AmA!`%;NmM$N?3ebcpEJXpA0X&A1$Vka^YF=gxYvHZ=-RWjVvir`|ZF{CN07B z#wabHH|@6;O*S?1j@oZv(Eo1RZ}!&zCMy}=M)O#y*6;t%J4Ap52pw&zOt*9O zK?a_oV}v1ZI@}?Vq^#CP9RT%X zMa&v}yv12eUqB{!Iam8U2Dv}Bn|-_%`~wGWl(x!_OkfB*GFmuK zDJ!z~=}y$)YqX@o{iHVP>%&^OO)e?Ek%fZ-uR2p8jkZn}G!9n@+O_ASS^e zWqt|k-5JpufcZ@HY`$X;7#XPm>~D<5!A>d}13PX+e6gI7qv^Dh2%$Zy7s8~l{OaRI zuY2=VMt^XGdoe z&*QBe9got41khDmWF65UT@kZ8m{F*d;h;LWRS;@l5N|%|H=!C=Q^Bpb1{;poY2O+sZH2_3UV!O6}%;@nITrneMD2!06wN^I84jvr_;w;4*EFP_bkS*_vY#H>CC&XC9_~3nt5pvuhWH+KGS6BhbAbYUMYgNg= zW{5-#r>O}@WX!&GS5zU^0Evy)f-_Y=Kw!O5zyNgECfkmor$TJqywh#!ouMgLZ-E-i z3|wNdicnRe)nn_H(~j7y@@KKk`>mf)hZ-mJeIbSvk-afbX0Almlwm149~vUi_Zte!;qL(PylQ*})}^n+ zi4_1KU5>2nG4~h?<$1+!^~@#KgGxHFZX9DwzcgpVT%#Fd zv+PNBPy=9-bj4WKGXqR?5GpruH`L;DkH?vQKw?zscVzCh-eQ4fki2SvvV~HvM%m$% zPpfcQzicA+CPc;NMvFVWn2E#QZu`idJBc8cIY<7mE8hEvWhQ7yTpBC zCAqe(D;#ywC|=(p6Sk*N(Ct-ap2Crv$xS|fMQJOT1=I;4#>8`(eoUO3`Y&cqWS zKG94#ZbsT(qCsdsAiV+Acm+{aQ;zsJ0OD=Y9@8aCbzledJ@o5nj{5zYz~7g0vG+?5 zfbcQ%3npP)Ag91d5*7`!p73+Ygp@qqsl5RXCVO4DLLCpV14sa{C{^kp(DFo1(2f3`kF9P=qw(a9DyWUX;o+-fU6N`*yar;P09;iiX3mhLn)2-k zL>lc=BA|K5*b-OfCCxq-hZ>cEpK2fy;^FS5tZ1DrB$uyT(UE5MHLUx-BKn?MG)N`RYV$+5KS#zPVR`FDWJ$m3DLiz)vyhP`%>do^3}L5TM7Q<<~9|? z(P=_bwVp{>!0GyR@e~YZNp!pliM~JD-5bY=@~%&q2giwRE|$2xdX;2A5Kll3&2CZ( zz~h(boyc=VpxH1**&;hR;P>ZjXEL*USBf*$dwe5fX7|Qu2#p?djt;w6L{g_m7W@sK z1xUnKQEmuw4(H-BhCnqAd~l@h_K(}hM~Z7Fkjz9N{1I3LSpub;AnS=Q7%xFKNK|UG zo4u?zQhYL+?R9RMTJ67g`tRzx$sP=;$-rUgh*UzR4$gv(9a+xkld_H-ND68ssDgRV zj?jjoIl4`1?c(--QuWi1E6~c5aO)!oMI9An9n)kxJy?qXlXGf7?2)EH1 zSCLk^H{y&KdGVfq5*7Vk>IBt3$(L`)#JQ%xgk7$cE4$q-K0JpOk-eSzYk@~d^mDJN zFG((A6)Q9jL)u#?4Jyd_qD-R1H3mJ@ljA28c&K_RrQV^QtW}cB<@Hv>S=HiOcO}^u z%Y;YD=m`lDWuZXTiAff$!{u)H~k z6|O!|I4?Tl@WS&Q+cOOlGt=-Q6yLtXL8k{SF(UjpWLV}4rw*0Uu;lC(-W&g_V>E)T zZ`9;m>&}Z|N;RyBUqh=sY*;o2ChxdTlzj)u!XYokG~K#5L3a$P!4rP>q+ARN_6cgO zHkFdQ$~*$E5RtT6etAz2$8&Dwc}->G$it%;I=n+$8lZr|IL1JeZW_M)mmy;Ca?1P$ z7Cj|;l-~u+7HI2ab6s^A|CyUh&gbAc$6tF4<<~GUM0ty%lX;t5mluJ;a6QS^ke@M( znFx*=N5JtGTGO>ZS)&tL`V0L$=N(PbYM8{LFL%dFhk9ducDaxp&$N zP*`#Qh!8MZva(|Enah8LA+Da8%dhOMKGI7su(9G)q$t77Q0&zog~9|Q-Rk_bpG8EW z{OgfoY+rHoC-&Y986TH0NRCyJI44PtmKC;6FCO?im?`nh-xfspQd=CBXjaBZ7pF&h z)tPwz)M{vP0PL>3yVh`smm4iyQ7km;?EP2)L$PDqn{w)!;I*W{^M)(TW}0u#0ebyQ zwQUvg7`wEW-VC2gG)rv@0}Auh!pLWK5ew!fCcEu3L2ZDgj@)#F=Q9VA9!c>HQaeXD z29Bl&uAmsrs~jSR6|u_7jDUz%)}y7Y>8l?jX65TE_fanL$V(PXifez0fwQuma%HUy z7x#;IelB8|zxP*0Cwwt3PbZwNKI+SBIiBEaYuVCQ$jAiREEFeRm>`R~oqmLO1|m^9 z4ct!b>ZzItgFwA7&$Cv`xuEmpQjB&&zep03>MF=q2;T7uuundk+J5%U!>V=x=Eb$& z($@#vJbdvk6+*UAAku&=GIT^um67ACKKDJbetbq&Y)~It!pE0;L1E|6_D5P`G(ZYRaftT6y4(0^H-|9%sFA zf!k?8#l}1lUugun%@n;5M=E8Rv%3$dVeAmawbVnErL2iNyGVAq@q|qWu>_1wS2H_V zx#it_Qf6|O7>+w?==}3douoZ{Y;b)gO>4kY;8bmcXvvv8xYX+|E8ND;3ogm(Y>2_G z<-29q8iAMnD)RDO7d<@#ZBpAyL^gw#&1DL__%>iqC!C8;4Rzu>tsCR_nW2LAWo zpw|ZFGO+a$$D%(Nh>Wd7YbWQ%82SZ8oAEyoZEx&0cZs`rl6^IqN&}RTT_kmeK!(Xs zH9rq0I2u0FAPHb|Cl%%Z2Msa?Y(_O@>l`32Qk#e_>jKTw61j<8Kyo6?EexnKthzA* z_Klf`Qn`F=r~>$8_GTL{_<>a5MujpM9CCi(UZYU*btf`ueHpj|?p~Wg^Qm7q8b8)@ z6eg=MG2gD&6zc7=d#xRLvR8!MHP67VCDVeoBiS(y%4u~}0?(48S83_pq-U^h70QAS zxy5l{J)CiJBcI(31u^^uQWN8&({M4I2ll7Dz2mq){N~>peaH zd^()}qZWo(9o$h|55GFHN)1Nk_eY@zw~Q#Yhc+K6n$3>{1abCYL9uh*qG5dt>qk*J zkWzYbyNC^DExlWN&L+m*0z^iA<@>Rb<L136auajATQDw!b_j>HVs7xM6l zCkA7BIL#1c-z4zuai*S^)<3@3D4&5o-PB6~DngxuEcSaBZm zVZ0kAi=$ETqZIXoGPz;{PlV-R`FjGX^3BA~+s242b-rYcDJPi+`#O9D1i_X7Yz9!t z6GIRPUyPf=Ealql^BI(*!EB|tsqm{fdWY%veZb8_gHF`?*Ff^@9kluiPMLt&0D|t) zWVJ+|R(cQy)WB(@STvERa%(*$x=i3{ju0J(b{OS;D@jU{5H)2Llt}I^sGgfUXbCV6 zCakPgAW3oAs`>Okf{Kc;c`F_ido$Tf?AlLeza6t1iL-)+1J2zBE87>Ud}IL$_f&wN z=-GPJS|_f1+7Y@`>>HL%WMxjQX9_XtNm3*73vV>5hpc1=$jrSYier0hKA{FA#^Ym2 zyO^4j{Sh1Rm3qRrPJ|DNC`#@-#=WF< zkRZQ6Ca6F%+C$nW-|gOfgu}r~O$Na)u-T*&&6Gr#iA=EEq0#~le8g?3p$>A`4TZAc zd0_WN;fPm2$-nZ~3H}`=w<7O8AfJYDS1iOeJBf2O77A=jvVV~s)5Dip0|J+CP&M55 zSO~k4eK<4dMSb+>j?t?t?q~*i#1Fu%bV$eO$NY=k1IU_cq)a1kh&sZQN$@5CL8R2B zmWWtI)$8$thQb1={ev#$2{0)P+mlSQE>y$DI4E1ImX#sVG5RV|3*}@G9Yj6M*P=)d zPwefJ(H^xkG%B~!=>Fm*1e7|PAq1EDB+5SmV;}Y~xh0Pm8od{uSxG>}ExN}hvm$Bq z5PZrbDX+h}Wo@*?Bm?*3L&45Rm=UfoTRc&T3Jv{BCvpf_B$ob7rylUW58E9Akq;+> z$KW2>cg-WQ3DWzxxLdokvHJ)p)_O-L6a(3~urbZ(9~~9RdgQ>4@@tN)2fmJU z*Qh=G;Vn!>A?AJtQGQc2O1Qvo))>Ed23=# zghZVpR*yBu+O4s%4u6fHys|+k`^-n0tV!!spNhsX<+GqbDh?N4)qDftl%&8_N(j_7 z+)RLzF}&b=!Xhm?b7>I&ObIS$U{(I?LxHCgJCI52GhxmjY3`NNEp@N3FNw*ezJCVooMU*? zBw+Z^2`F3r0~>IlqX6axa<t~S{+79X>}-f%ECgj1&~`*SEb?*pUIS<)C=pl zU{zetg>yt3xOC-fPxG-Ym9KqTj2|i2@*2j3b{q9$kxKftp-!r z^7~zi!oVkdGR}y@@hsfc`3Y*5z=j0yUfrq$XRlkPAi+*ymtK>892a*?5*i-c@060*7Ir~(%qRp6os zIxdRJ;G&}nTojeTMQP)?C~Z8K&BS4F*-8Kgmu+~$I%g)+xbygRJ}xmXO8~DxVjH*Q zO~>$02e|H{1Pf{A5l|r~cbcbEWTjO^yJ#7K%7DQqlbXpX)kj2-gEV3`I>c-Q&gfKr z8ro{d1++0Z#{*wzWLHCc+=tHf1)NWaZjpWYP9j2GKMuB`Oih5n14{Y2AESTMk!b;2 z0$d$P7?_71B=XMGDk%YSw+3v%NOooMXB3|%p5ZJ!xv-&e4gwWl`%5%T-CPG@+GF=} zL@YV=(&Dq9in_ffdul216rBfsWXw#`lgVy~l>@w$eAGiIMMgDFFf3-fV?dYgmTOG&{dH%BnLbi6Y}Wy^J#$|A>!6ro$0QB96n6HOV+! zqd4@}G5Gi#7Toi!aV>aYvSDH+)3TE#3B&I&Ow2!1X1G8NTV=V#QwAxGVN^9(@SJ7WI6AfMD`$dd|y7wgx2TLPGuRw%&dgk@@bCBI?!~5wO3iD-q6Ds z>oNAk_@_A%Oh4A-=&s&4jsDFmWBp6ZV=Rh7c?NOCU?*e6n$Taz5~E7C z((&98%_%IH55O+|VtX@N;q16-UWH-tT8Jdf<3!FNOBC_c3dTo!M$hEgO8Eys)xY4S)EHU$3z$O z1Y7+2WhBRDvF6g*;xsIW=7h0%FkBZ#IaaiacYQI={#y9ygIcV~U@I6?GjByI%*Xfb zJ%_&pBF__XaQuBD$3tZi5TnKW@e@FscsN>ogNTkb1SdJNNl(0_x_H$3-IBc6mb#=tE}j#;F8fY9gp-r7-r=(i4=C*$UfvWT zEAC9Hy>|gN6AB&>_v{pW4$T?29m{-MtBXw+LVU7f^)9MK)5dDS@oG1m07W6-=D(8| zJhb6y%j&7Dlx71CfOi@y3z`uq>wPHzJT!%cr5A;?;OVa9VCb+q4-=%QIij_Ql@kQJ zWdQqIw23~n2Pr@}uYs`HE)Iv-M##1g!l^G}W_q<-4=Q7JNUif8q)8Xs?xu};*Y)>@ZMSVRYikV%T@gg6dkU?tgt6;|e4 zd~`i>=}=O$cWGZ%Entz4{-aYsQ2)BK|J^7&yrcZMK@zf3qhHYB0e!VnP7 zqA3&;CzeQ5LmnZ+T!sX~uO-M1!haa4qOZ*0Qk+H$mF2*aLTF)<&B^7@=iN!gB@8C#ZnRF@p(^|TENpdD+NXjz_HNszMPz5D8Luoi`LjM9wip5Tn9zw1Y`j@t{;lycrOU_AU%rL$7%oQA021j-5Du(f( z+{#{voZ&06h9jpS3~LOdNVA(1$Y052NcCDmHo>jWNr-P|nT90dd*UP>UZz@_ov=)2 zA`k;|ONKR#yaF#LgH{mK$o{M~mDHx23`}=_U$Vn3^0l#8L69j?Kv@Rg4d}IU*u&-)cFt-X zbWb;PfA;*kwd|8E1cYSJTDG+cwZm2++QDV1CXzETkswydzVD49W+~Z>nSW`9k0BOI zbIn`G>R?_Ev}nTm&C^a`rRXh4R$yzwCoKL6PuGx%nt{r2l(2_Q<02rxD)#H++vDS45w%BD0c z=~>2&G-SdW;~wV(Q0?(LjO*X$l2CxcGsuO$KWB+(ak7ivyb+?5=8+^L9G7^J39H+& zcL(2;Mj&(sr<5yutXIY>MMd#0zRs-%iPUyKncXayR_5op2$7n6^Ir#iX?5y>c$(|%kM&;&2kNf3^b1%#usAm7DD zf1voFDKHaa#E;^wKahqiLYCK@xKu2_vl~X3eR`xs26##iH>v!zWM9E zZ{ED1&RS!N@{zKJiPjKR)0xt_r~=s{5@+0<0f%!~o}Fnm+=nBH-1>rxa(GB7jS;mK z6_qHPM!C$8tys>5n`uDEqBm2AQhWD6^{pv9YQgWlc$i-$rJ`%V;+>@c?F~yoz|l}Q z=%dMSajhE8hjlSzcX?+0@+`V8C8Ws(fjI^Lv=Mg2;3_%{UIVxJ2?E0`M?&%WI|K@j zBCr6`O32EF6RywkY}&XN@)Nyb&cG(>sE?J7Ioks1j}_;gD3V!B2v$jXVwXvc?%5Ap z#pQW!Fto@U$SRhSNzmVZp71&IrX8OWCPoRfkBkhZ|MX%j!YXTEI!4$i6I&tAJBB0l zq){<5@wODpbHPSqHp+V0*Hd7bmN2z&%kqj^zPm}%<5*xG3!k&_-A^S+>$tX@YX9*W zJG`*{@2}Op1d~n`^>8nTbcuQh;Ra@e!Et49?@xY6g&CIgJwUPR3Iy&u`N3gX1sW4) zu(sEkiJ#5%W6KQ`!OEd6jpE+gk)P!&2dE0>uuG&9SwbfOD(q0O;`p`2YaV59YIR50 z$Lw)h<%^^(h2Tmb7|Fh@A`>7LfjEsI!%D(AipdP;dck+ZXiN%hbBr)9aEKqLvG)GcCt;~n^}?!8Kk#g2Ax*dO;pI?XVlUffmSf8Jyla6%dJ z=H_}1Y+#@TRC|a)_*=LK@gZhXE~c?wO1PaG&C^LeTF-a7W<1DUnKI_fja)d!2MSSH z+iM-68X}}Gdqj@_O&rol^7PAvfN_h)<84R_ZKzA#V=hjv(%QcxVevVQbo2&n?{oVP zD6y4DMX^p&&y^~1z=1xhiz?fo?r#eBqsEoROPcoa+=~w=RiGe`et29VlF(<#!BG)|T1MJ1PFL+l3*- zMNwQVVz6hjC~O*&y0;536NClA0NwoG^mA1ez?%q|UmfeD0?IBlqP*LGneGZ#j) zxjh7bI>-)=Oo7Q#nxgKz8^dY6YSuDiBz)tvJ}y#mxs)g1mKr1B8BHxJLTx#T$yt<= z?C`Km%bcVlRjyz#+OsG2kCSS+xTKuq%t-7WSG9C2?iZhZL#&rSVP`kJ7Un`1oc6;~ z!AVcE+*#UH5VKX>TyB&JRh>PZnU>Ap1?&^ERXI{-F&gd2|(eSNRnw;i+Mqfas7R4y-PHeLV58^ zIp=Dq5&D4zR-wj6f@bab2nx0Wthniuz%D`TmBo~$X&SjFwU(Bq(Z4j#c-kz!_Ubq{ zxCX_3h-o(1NszP}^%>g=g%ctDpM77SRSVVk84I;Cw_KHJG^}0_cz-0T*I9V=Ui&Qo zOH^Tbt5^T*VP3s^li`zgHQ1Ac3sy@K2I#mbs*j6c&&(8y2AT(Jy;(sG@-n5I%*DoQ zqDg#&_GNtO@s~3{1dx2wx3#E%e0IiEQiI225FSPECF(LnH8%jFRWpyKnF>DpnpuX^ zMn(%88!h^bOJToUYDeO z5Jz$CSn+BBZ}FKvNjd~6^L$xu!XbzYq%fG#-t_Q*+U?Q8u=d7p81>6^Qr`RCU>kk- zWh?9z4PY&NfywwJVC1o3?O|FNLTQ;`N!G}FEc;I+4cvcu#(1Q88RKO` z3$!>G<4>(>^CC-210YwK>(RkS)9lx7@zGRdDa0vQ@Zq0j#MB z*&(#dVU2|`pq@Kfn~OiDz62bSdjlM5c^o3I{)-0XLg(9P75`n?*_@_=V7;w6*)5a$ z5FWKX9u0o?6uzr)sqZ^*=_IB04ww}bKFSZJgNIvdV&j0i?4(C-S}JezMlI$`9afiL zq|+OH_!g9ts~xE}jqk}zR+sBvQQ@<;h9^f`mQsT0AEhKLUJw!Qi-&{ej$v_GRLYi# z7jTO`xWxjuK@rGB&BetRJ}ZpGE{J?Yka`H(@un8tlc*HlBh#&W4^eq}af4yLW?Sh# zEaJ`29ZS5q!Qt34bg%HmsTOYzU^gB_p_M{`^lYF&aqQAV2Shzz*0uP-yPY1om~Ie^ zZd4xgUz{|NrVliVNWd|)2n#CaP+r+Ql*wx7gT5%E5YsQk{Ost3L&)IdyQp~OXFTy; zRDcPpQvI8gEx?3z2?50L?4fC%6ySK_5ETv3@%4YR1zA*cte_)&amt|Ml%dEA2U&7h zgx_5vxu_N)d~wpqMF53hnSR{@pm1_gWI%um81nZ|a?;5%5TyL%RO82y1r}vN9Y}Pe zt_m%BY(Qo!uLFsE42bytEJ*PKhb$&?V2-U=>H-$}pa4NmYhSH8H6llVo}dD~{oz`u z0bfQ~sBd~8!Wh5wb*g>zFfG#?7Fec}i)0I$8KUC-!CR4SnL556U9q9+n{)W4l+yAO z*P{dU1U7V_In0I@6!V2<$oH~1aPiJDHheK=UDlkEUrhKmAiDVT1jTp1?76l1AXZnZ z5~o3%&S>nSA_#u*VeA9n{7j`LnR>;EZ3SGkoTYH)&d91F_`nD(%}wXLFxw#}hKPc4O3T{7^SG+l{W>ct|&t zCWNpmyFtZK<+Rj|al3&iucMl}F=02Z(hcPqX%wsM#w&Cqw;P$=IG`I!NYW@)+l_;| zp+qH(;xxPQO5IQblSXm6-MCse6fV&y*4T~T)D6pYQar+LT%#LiW+@(NH-1Yu zx5y{dPu_!H13y2x-*s-|BBjvf1qYQLR;@S!cl(M5Sn1z`EY($-jd zr8UKqT;jw?VRvhaadfSd;GjkGB|2?q6;eu>=j8{w_F&qBQYX+ulcJaezmt~{m!+I6U7!X~huZ8>0mTR=>Lod^jN0F%rL0zx>)HzGGgPB*NzyNT|8 z)7@Ri-F0@ip}XI5cXbjXx4RwP{kFTip1bSqZl=56ad)?JcdOkc2Jp(_yYB8b?ryWY z7%I5^J$HMW+suZcfy~@~z}?=??d`?CMFN>(F0t?*mh*hzl$UX7zEIzslRTdbQ$9cE zWQoX-lHz>5VS&=X$;mq_LgP9v4%C#%iIt)Wue`!KZs1!9ZPJr!g& z6^FA+%617!RW?B*#r|*~yLtK|Q6a%p0Z+(ITX{stg3;BRX%riX{d)n4#?DE;4Ur>C zid)H~?sMxtZsn=}aevZ%ARfl6m8xqNv}zOKL8 z$`kOf`l}gIZ-rd^Vur{RP%ipl9d2k1koxk7p7FesN6WAzFqoF~qGFbOT7D z#qh7STfiGYe#YbTytYEL9l>h_g4Y@#ctOyBri7Ksp31tG_Sw93OfP^@sq(9H`KrN>U4ZtX<{_Am% zqY?Z}^ykP9K$$}@If;>&t!|$k#oS{76s}4>Z)$hU;SsQqQUX$WMmZl|gw@2P1c8W2 zw52Fr`67tTmpMt?;_Nqx(b3K!i&@_}gTuXApKg$!8Yqhq3DLUu4Z3`2IQ1~Fca;!}S85{8}EaS#x2pdJ->-pvu4 z?4^YV_kR3A*lA|hwR$lHQu59VWa0-#`-bU{A2hSilKCSbL75yikM~kPT*%d^vZ3}v zlq=im@Y(u%8M<4CLjb!uEf;W&GP2GEmKm;jkh8?7hKzhj1q(7O<|8kkiJ=kur$%RD z^dR6Jz;EZH&*qh+$Q7*J)??F1Kr(~;QR;pjJ-X_E?lR+lMz`V-A1dk2$o>}`@7u&- zjlnimwQZOXUO!2HpxmPkCJH}|r-gKF?#TjZbAPKi@a76_FlM->K^vck?F7)qpT!_+ zs?df!sj@!o3I=UU{E8p_>JlV}F8M=HJ{iewnW9u%fih&CKOJBf%BAW19% z#Ayj}bOxs%-j|9vu@EP@xrZ+P0tN}<^y9ZjoOofxk)Cbk%w4qaQn4qdxF|y15y-z` zPdI1fuqPSDo}kkt!XAV{ut&H-{4yb)|D5#1hd`tjxWLmI61DUqXWfib84{f;MEKKI z@&DHN$H_$m66eU8CMk*w8LdjojOp0j`o5#>cvy!(e?^R=1bqR! z=NgLwys-+G1rq*t@<{)IR&nr6r;7A12J!D-;N0ed4m>Gf5O;-;FO9~RNj9nkMqcJ+u(g7MN`sAsGAP_(-^%zBBWDHO_ z;k!K5*(aQB+@OT4oRwa(;I z4^sApXe!dS1j`-h!US?j9Bz5`uZ`&2-D(e+XmeI4umvsjh4TVXq%r}jW2FNEK@6jp z0+{WZLMKS&Z9FBrkw6+xXUGhGjMy6#QlQzlDdiDBr)hvN;-BDq3+i9fL!gH<7n#QB zoj}p7)W80iHBjXbQ2k8(8!hf|#B4>TL8jn!yrF=-?iU)v){G66YKL_wn!@_!ZAH%i z#4lA0;UWVY7bRWik}GAjlCF>FvIIphWGj{$o|xStotEuFk{cFcq>Aj7BQwzpnJcRnR(MJ+4@{H*3@@3aPEUwX@e2iD6HnFby16`W;TN zw~NW0)bW7G$a6&z5qoKz*BA}|!FrUBSZa%%)bZvQr+l%gU^}BRopvPj(gx z8R8RqKQP z6YB9?C;4wElkS525SS4WE7{@_0$NzPArqNkNG3xIbr~>#)lFsH;~B_~WgZ)#b9M6= z1_gC&X+s45ZpEE0REk70TUCZC*^op6*{iz!N%tI6L!~&vneHOGKtci_LJ#Z4YOrT=ckzq;2zM-`kGHRoC2jxX(d-W5PSoSv;P!Nc z(&J3KeB_8A;ROp4!HSobHn1Tg7;IpF(0xx`ytp4mkMt73na=t{^YM7(&h{ga#r%}Ru|z_g@e>#{Q>(HC z7zC#^2rglc7J2A2@WA04!yH~Oh{Ho&mdWA497sTdofbvA5&&DrvXu?6UsX-@Qrs~i z@73NW{m!@I(Lraz@hz*SDR^N|2R9&>3Rd8G133cde3PD^K z^=+ucL2o*xGD?z<)sQJ*p~m4~0WbSsNvRh=R!-)suhYD%d@WQ5G){Bu8Bo-LS&kaI zk~Y%}UM(lUjs${_5_V&~Wb4ZO)BQpyzmOlyUL-LBtFsI18XdBqUelte-H`pXCZYoC z(NrXmFU1Dagv{Zlr19p2D2v(|sw_b^t`PNf1K#ifgDH{gQO|jqz|~M1LTX zi&SFU0ElDesSVL5+t;4G{W;&C8kx>^7al5|9pku(W`@Ixx^GES)hmeiyMCvG{9lvs zLo#kvEI^-L5_clG6m%Nc7gMTx-aNMS;wQ#gao(Qd{x4XnB2&SQqZvVlttAu9C{5Eu z$?CG_yO7u56hyTwQ<3*O?7$EoWDBSA*f)r-Diodl+*^Ci>$XSszk8qd3nIPm0>)+( zyJ!Eqk~kg@a1KGCQuJC%+YU8?W>y4y(<__B;ZodKW)jE26v6*~H|H&@oJ@Gb$?Bz{m6Py)jzcyj zennFgVIR+%Y9;$+pOz+lYwvVr2f5uqeM4Lpw3TcFq5jz zy^1fQ;&s;kDz(3AU#{f0p@XS$<-M{dq`Rl~<#_vya=r8PMrt|oAU#ZxKZ#n6o#T|G zw!e?2yEN}hl$trcfr{68dL5S2)5c@Ahskj|g^ODMjh*(#+}!1u%5`g6wsK2tyu-hO z=3$#-gCT2aw;Ds^#=N1CT|%(1TWA$}tk!{U@K+uZ)4WlmXkE|maYV~WvY1w@(!Aa; zj0L^94Kqj@pGczEjIpV2r2Opu+vF?R&mvtlH}^XYQaan8x8I;Y!w9de`mj+lw4+CF zJDNU&m0I8(3V~cOY2)1f)|W-sZ2QudD-KtGF^ksr7kul15C6okzCAu%{nev}o|b^d zA99V$`hpf_&2jfC!TGbsxf>|j{kP5c((T*-{y#s^{lA~{)Wf!memwV{r(gcZUAG~HeCY7@hhA~kFYbE8_ij5pk2el2Uhln_8|NMFHRf+Msr#h|Zeyg4Lx&K< z%MPcXc33yv)p=N z+{VJi#rvQuR3r)_VbLI@9yi-6W`zZ9i=v6N@jKW$^QJ z$*fwxtv7P`knO@q-ad4QwWBwtJb#$~HnbSv4gYcfZ2$T*cU-XHicg+*c>6DY?h~)O z;OhT}<=!3_k9p^d_x+{*e8x}y&d)ygx!Q#7NB`j0KKIAJ@;UvPK1u)k2mWL`>dSvv zVUFs7K>TtuJGam0U4}B>zg6466aVjP?tS7@Kd86Sd=DMk{=@VspC9@7*UmdUuWgQt z*V+Oy0pHlY_K;@g^YQof_snGT&LM3-{sGJ$r-=6mcXWmy*F)}*EkQoghM?>CW^TSNU2VE@tZ$#5Yj2YnET2HzMsze z@9gbgg!J>aU~?Y*LwRD8Is zIJ%1Oc3CJCdIHLM#sgaOzx&Ulf6q(-^ELbYf?UMz0QcDk{yxTFp@iknLziv(Q=KdL?&JcvgR z+(Cpfm&6{fu7e0;dHcz@RN=6)g^sCKX&F0b_0hYZZKb38Ej_oCf$E58%}F)xL@q88 zxyGfLP}EsRVa68|vL=q9AudNVnOK?#RhOK`gSZ4uWsg@O7_h6Wyl4c}Ux;`X;NUhv z*y2)YUVOvFr*HrC zd51ykRRI(wYJs=E_o3^Lrbdqs20>q}&*5Mc-OEP=O9K7CKLq+vMeW55@<;r}r#@$# zjj)s^bOiEuXnqRl1%4fdMAPtzl%BOd4p$r7Z}`~dca2>C5s3L8UjCZL{P~_c&zncM zYvww3DJIa!#}03AJou*TuDkAUz(>B-y~g(K&wlFPpZ1Lp^WFbQKlR3!?EJV;_yw=) zy?*`E|4M(p&QSQv{5j88El4$_R*bwHYCgLCoU^{M`dbgZ;AhnA$o%%t+;aUVx4!=U zKf@>U^Jr3eO2#fzWhOk9jT8O1xK8>vY4HXZ#l38uw24m2zJXr-d8)d9k^I;w`q@9H zD^m6ENsITc)P6Fo>i-z6=K=D&7?_rZ;3b(({x&V{DVf1C?NLMPdC!l_dU|4YKcanh z&B%=_TG>0&;?@5@q{6cXOnfZpiq`XEY4HaqZ9VT!lXS@@Q$jVCJ$y0K?H{Mb zp%v~bhVU|by5&~teu1JeCw*6s<≈t_}sRFJ=g5SEZ@+?;~cA%2IM(wSDC1(B_&n zRo^4sn7^^4W%Jsu3Lwh+e0-qQOK+5cA#cq4`-pnBz2$3cF&e5j>iQ_@C2jEs)8b7h zZHs>_S~Yau8hUJJuSX<(uASw8xW%*e?d(JCfZ!q6)ti& zH05r9n4S=)84kPjfx`B2)V8` z_ba{^6e~-lg}EdcS1f~8_l-Zs zun_?pur8B70&K)3Y?SPT4Z+wT=|k+x-;N@-%SjdKA#eC-KT8fDSM)Bxmz^I41J}CiBg-oPz@+W|f`n$$U3naylsvydK|6?DX`I-!{sA zYoto91v11ggir#yoX#$u5I{B)uVVPTOikRIJnX59w*Wt`Csf@Dlt%5a$>zbV%km)oR4naAhTrw*ThsI#;6gq94p=sr z5bCLuEgf6|*>8_v*K6p)Cg)hb(`n*d8#3)$Xtj7Cq17YYw$N(KfC`vR`trQ+Fji3Y z!bxCYZUlhK@=9_U&Y42*oL*KQg~3TsMMk5D2#OehE6iKQ)&y_CYsZVPl+yc&93$}Y zqB@usfXsz2eT-;Fw6^1&wF>cM%L!omQEB67-zK)~$A8*u&uk{Yk^Em#@x!*%@TmCv zwlr=8AGEU`VPrCthlm4NoDSV+np)tA?w09t-R#Z5j&7ECB%$kRrfvRwM^%DsgM(oS zvd#5r@%!cGo~ZTjJImWgj&Cf9GW>}5ac~!}>zLSz{krr);wJD?t$W74R$`9%Dh`*w z=Wm$5ao&vI?vpPA3{md9C5^-8nuz!xwwD{KZ_F`FLwxyWnR)Bm?tBx~wlBpu@n6$o zeudjE-$X!PXLPw^IYt)<+>$o^M`?7qwT81t4QESKR1^q)D`zP&1ZF?k6StRd?wFme zw*Afx7&h{@`5Sm<+piDOJ{Ss7*Cp#&5&~aKvA7lPtN~meTz)rpi=m{#oavwSw+*bHqqQ&+!p-3Tmmp!BhQ@ zH=b`fV!=$K*wFhCv$`hEfxDXnFTJ)MZ%VVb7?32zV=trpE|DR)kVj_DyXMH=sR&it zzALpQzSCEdc;FYwZUt4P-BQX$wF!UUj%MTk{x?|1JMuOXgT|^z4Z_-Dg6p_r>bAnt zoG-bp@HZ6deZ~BBsiJwR7F{dhHT!ffpUvZE5viA)!HSU#!^3kFAmu{bz)@Gx;-Hp;H zU%-<<@vuxEhtUNo=Fb|%t4eR|%91ZC=3#-Xi$7LQ*|)6BiTH!0_-3gJpQspdu$eZN zAr3CpIYa1W473g%%vp{Z-)9G1dOUmN%=ovGi;tL$fS5i^)Z~Z~d4q`X(yjAKg6H2+ zXlfiHA3->o%Wi~u7-0a-ACgPJUY=Gk-JID|^cGwyyWfJ7L?I&kpCrla4*4Glki911 z_5?HB&lx>1J1XAuj~`HESFj0)7UV7BB8=s5QRe zyYT+DToP`>qWc<({^0Q;LZ(6k^WC0_vC3Dd*mXr*I6p(%E4}DX$HDP%0_ponaqkMD zaM+dfU;|#bbfsjeQ1~O2Ye;OjAQYDLJdj?LQiVM$r`BR{D6k1|Si&;*u9}g9Q9I^M+_oS_qSuh ze>lX)G1G07IFNvlCugN=892t9Gt;~m@9#B^yic*4`knQff67XLe(}q>3!zAKd&5k; ze@nVSe{Q-s+@$@@NyPm~T$i9RqyjbGnSXMsGpI-cq`cpzM~y8U)b3I-Z>ZehG4iV~ z+aUJBA$wR~F2*qCY$m878r)#}I%%2^~-inam3}T#w)p^&I8p66?{hwgA z{|=`L_MXaJy#|E30+cdD^4Q=pDgD{Tv;xw2Kd$mX1|3{Kz2wz)mjANIJH{(_2701ZDs+1(RSRfgi9 zkYLU%O-1RI#X8vGIucu8+2^mZON+UWr?Xn2cap}3JJ@TZvA79=?{@iM+Fp0IdwYuM zkdF?!k7!p)QPm3ImR#Y6#0qLix}=x*Aw7Gt`-w)XOjbj%RXZShEHgez{$l#P6murF zfMjieq5K#d^anhyat{z>Tkwq);@n9qYBdS zwcXb+FFC}A3Ohz%1aBQ5M8go#x&(Pk#OM1MmC z^5#tZ@;@bh$vHY$Uzaeut~D$nNkqRRj0GOn3XcBIJpUUWh6VVeB$0A%q`NxTQIq=| zu9@Ks_t+wiP-RGh*0a=}eE1xhUe5-@YLGy(m)Ip}15?xubfsv@br$7OKeF2aeX-wO z%Gn)z3V5`55q);PmxA2dM+F~rJSizQSQZla;bc!KYmD3S5D~s;?b2O2D{DNM zd^!7iXwk1X{v>&)_=^9#$=~<+za141C1pT2{=rwwf+pFaRwcW0elm7GQZ@=KJqz>+OA0v2-vwv#!BEjF4a1ea|jVH!y@n;V{6@SrFp}>6{ zuO;zt5lL`JK!xHlyXYY154Vt|s39>f2odU2jX2Rm>A-%9(eXKJcs@i`$w2e?BKH^5 z11u!4u$Ot#J%i`jYew8iZ7kUZc|^L5Su|Ga>o9(I_p535|FlW(uy*%SXe|O6v#+MT z$Uf1SZ4kA#&W?~_>;qTA&%H_GdGtWzwpi?!pT zSUWDNyu`(jOf^4X;Y;*SIRFCq_W`fb1yC0*D#AoaQO0q`>}AU1^s?DvboQ31PC5-j zws-Yfz<9ez_K`PL+oz&3x8xntJPCmNy!CcKtz#81y?}%O*>nOgjkNqav-2FsA{0EL zb0h~!XhhjP4O?3E$g3oSt$Ng>T3=d0Wds%|Fy?!Z+4)ZqovY?fO6f?bf*}XVRtIzJ z1BDN*NyitGO}ACae2*oY*0Tv}>sCokQ8HgHO6JRDgG(y7aSEH_hGdhn6KqH}lL>&! z)~N|ymLTE!JbsUhdQHVXCfH&UD|yJ;3(+VpNeU~lZ>j$n=u|J`BzY|UoyMcrKI)N= zm^^)Q^=T8?f z3P~9pM{G4CwOAep*u5Bd5ZHqNz@H=@Dn&7TO{KW+Bfzf0e$$~QI_A4Ege_qrp8)X^&r=+2`SZV}c|wy372CWB+|NGAbvHsv#9y;g-wTDjz5waFP)M^z@;w9m!$r z4Qc+-*l9y=IO4|}`hPDX*&eos2F~l%%&Ad)?r6G)q73K8+1ToVZ+XoTG(I$tSInL* zmB68qeIbVaBObA)dGjgJyJ9t{^^W)S`2BAEj?RuqsQN=d0ASe%g#S^@3MsO#Y-mgw z)o(_*#167|Jo7{(R7QI+4#_1~TXg66D!qV6b<;<*NITg5prs4|(C~)XuG85~@z}(` zTs_bgUlPTqUG2sAG2ZzCpr&^OXb=oXF8YDD_=xy7%hI@k4&qjjZ+$d3fPK!-D5qZ3H@{oYh>Z(j=eY+liSBH@qhhjo8@gEuZ5Ug zGhqePq0tpY2$JK3+kIG4-2X9c+Z3?D1u>UQ{M<4wTP4b0V4>=mRs6u=geF@&z~46O z^cX$f6BbUJia73VZf#e9tl-w_ST?A(qo|eD&4<2X0yFE$D1pZP2}avK!RQE2`V)+{ z3zuNDk-ae~Y8gg7tXPD-uSC9LLlp9}=~`&;E(Px@SG&wo_!H~uO0bW*((GMVvK=0& zQtlk2-^_(P6xk4#F`Tcof2GUSK2mma@!vhP;(Az?;)})$BNo`fQf1*RPqSDApcXCmN~lRK zF>^?#8N*}90L%qVG%l`jnrJU!_^~OXW-IN}LJPFA>O+u5pEm0Da<%GMDb^c!r&_g2 zj?`p!>k@QaNhxM3m*E`B!NA#J*+~n)UqJ@%=?rHvpB7wL1blDA?KBr1&*CDLk&9GD zE-G}#MYTk@sFny9sUKX{qjzxGfZoAnqvRr~ALF`gM(^OV72eEc+tg}ZmY{`rMnHgk zzPmSy4l*hNw2sTVS)@k6#wwT8B=2VLY)*{?$UtozA*qV(J0*(7S*L_$)RJVcjVVQn znm=-ObQS=DoDolD#eaKSJaw9?8SyGNRu^U;A9+ID>rEgGO_8S#s6=ltwIQWB8bkz? zvZ=|izhjpop|XJZ>dzksxfo&I%_l^}>1$mv7w;kETADqGK^Ly7HF-ju112z7TWmFQ z6lUG)s;#N9Za${b@TO#4MCk1Hbn3KxEc?xbkH?-Ek4gYtosXRzHHuYxBq;F`eX3n* zm#_%z5|SFPnO{#}WJUxxL%rR#nce8|jI#ccLDKgmUsc@~!jyg5xG=r`t^C3-% z{VmnLWr=i1Tf*P%e6`&tU{0c_{hg7dE84Yp2Ou;mph2t;s6TBxSX#8=Y-iyWmXP5; zCquqS->48LW87RzmXiuF0zN$>4KF-dLW;d6q)Wgw|FabC0P&G)y_UeXvk(_)kzjl<5XK&zWL#SI| zVCfYk=8|(bFLzXF#PClP9ZYnmQ6!lKv~;IcI6)z*#CZx)CA5905*KI`c;%}4p^GR> zJ4v5}C*=21v6qn?7O|cSo3?=qEMg-USi~kSu!zlEGI^Uuw13;e2&PesSfOs4QJx(= zxBHKcq&a+Kp;iPzD#VnN5FsD@68YdFvjrDfoVdv1)HoAJVCYLC1EHt@zEZaPRk(_< zJz%=iKZfEdU?5XB-6L;MTdozz$Q#%@t zAuX7)2OeS)n)DqQR0{&IUO5P?jwku@uHg(!vICu2G>0m$#cIrXw@jH5F5{GaI)cuP zoacJOHHM*z4tWUnSk>-eBre)L=!%p-cV>qcTyl6kuo|$}z+L~)jCLt8!%tWUY0R@& zQJ{f@GrvmG6i5s)eN|byi1wYp4s>yom1Y$t@y`0CGRxSCtGP(i5}cx*3!l-p1*ZV> zmZ~`VdM}`C1m4^>Yh&G}iVm9jRv&ms@p|@Li1AwOy(X3bx%G#-sfT*W z9zK)|NAoNg_H9R%9Wb+a;)PrU%v_eh#SDDCNr$0QfcSka6l)J-X5j=fu@4}zkfJh} zNT99%A9ZgZZ`obf_pXP%_u1#{b0#avgbqw>*V#^Aom?i8*S(QILd#iWW)hMBQLv?b z-Bw!t!`BSlG9&eJU#~nINyL;=jT$RxxDGxrph=CDD?w=)N~~yUo2qTS5)?HERn$=N z78S^Sf4<-EZ>_Z-X6DR8VoONY*?X_`Tfg7;_kDi)!GNt31?kN&dJjRgSjVQa`Ire= z_4|bkb;lx@->^+33>FE*ZcSLGtRTnUI3D&~pxB&G<#@^s+qX~K!>vD(6wNhM6tHx)sBg9H!bc8hYY`bcSE?~r;=9}PuyQ4Vi zAZQ5V)KfW)GA$4#Bv5ui=++JQSJXxY8igcFX(@bPy{}-*;8kEr0k0CSHn@zOS*ek4 zvtm9UA3R|g20nwobHww3WnihE=QeGQTG?)9a`NE}g2LG3>G10873eKeq?+RT?A3S| zxV+qvHyv_OR^QdS`dT4Pa%O(axYaqPWsCh4Vp9vc{(EyZS-HzAH8V-=;;w3ATHKiF ze_P+RMTYO}0R!dy0RvM~2=(0EykcGbRniT*{mK%m>e+H;n#1Z1!E_N-ae=CK zLQaDja?+L#dT8e2%eM5wq(!2kWNYmLIqK}I3&D^zzMtHX#pc#$K4}K4^D20^9WgU| z&iy`xS$9NmZNV-E8c~rEy%nT`%>QFpU9gM0Rn6 zN}Lw%k4nix)%~>eNZ?)XyZ_D2RZR=dMWll*2*sI}2vf#6fR-Vr>BqCf%U*;QfGR*; zE(SbqZvx+W^$3($kFFxKY-~IPQDRI1e>JIS!4EdvH7D{zt6q^JhG%)8S4|J|r7JW} z&rrGMlQo4jHNF$=#*m0#1mNFIe54%~?xYE|oC$dpPp~X|A~*+eAV%Csu?ZHtyIEhp z*7soUFb&~&nuhD_(gN`0S5Lx6oJY=$S~PoJM_L(=)`VG(PDOJqbmHtBgU-+&pZKIw zgoT47c{LNSK39g=9>$5u@*c;lm7ai-xn|Fb==DAx6il(^CNJAS;WzE4`6WD&mosVk zcAM?We7UXL&)+itIMMb~Z}W_Tw0J+A2SUR8ld%Wk4qNrfw^}xn_O*9&S-W*Q*jV8~ ztt$=ZJ~Q?$Eht=PV;|4b6ouSh4g3>kt@bc0{AnwGd(f6(AS%IbV{5NC#CsJ&>TSm! zw&SZ&4bqVAhI3>MKb#*|wvpr`yZ55$7;{5ovmY~w)!^pDCY4p+z1j$qUGWFc@2Xds z1rJYLZFfpN(C+AZEC%Bpi00J~lgZ)FCq0}k8(&wxDBPaBY9n4{l&uI6FSC@m)?^@X zu6Z74!MrQp!cgfgyV8S33h7aM%8-aChkoIGm$XxaZ?ff=_>-PkYTi$%dB7_77w^jf zyVh@{>Xgja??IE$&kyD8pjB_syQ_B>O|>wp-hFAhjcJSIFZH`Z0R@<&kXa@xF2qSn zl)XX~#+J|lWf&MWmxW`Qnr!0P9R}d_S5BT@DJF~d>@~7_-5u6bPm=w;<@OgE3oZ!-5E{Q-C6u-y@rr1L2S$wGQf0|keN4M z(W<0n8v{Vq)iycJZbA-x9%1`U2h|&yU@n%jakRPXWq7|%GaQfanZh1e%d~tM;v<o61+q*IRZ)YbSh^XCzZsaFB!SPu`H-5Mn12*5*UD zSTxOgS&EqV*`_&6q$Kl6rYD!y17K%q%bm3|M?gqKcW0AQqirCm$?VhWzmJJr1Yv&_$<6 zK?@XR)Dqo^?}G=ft(Dc^n|+dp+_DQCFYB{gjZ`qOUj9DZGE7NQG+-G7>{+e(+?@8}1P_LNl^A*yB$4 znX1@CU_PKLM`X8`Db|?IyK9(9dOwF^XeDe~4%wBK?kcvGw$JxfekmU{^dkdu=tncV zLbVH3idSb@vyViJWiHa0RlBmJ0~Z;;)s@6pjVLJ#=zR3ZAA`h`?`EnFiBOO@17_$m zTndS#CIN|1lF|vZ^N?tR(4b^>i=0g?1)lE$69_OqY!-$IMkw!Zw_+(J?8sjaHn@T% z7O(w!O8XTGmK{W|cm==Q`ATe)sj##MXb$5=pfk9P6b+tGjWnQnbO}`qz=aal3K;`j zaD&E_t40tj9AcqdAv@0mF;}(>cS6rf!_Pyk4fZp^U(2JmWZmX&;ZBf?#Yk)E2&1H@m;SFyQJ|HBeMb9%Rc_kVK*4OUFp6csChuuB}VUjn)T7Bt}D?(#c`yS04-&$>53I9zOE1s z-y?y<2<5+((VJ|Q!lOb1lZ+R^@rp>?jUpm%dy;-u)rIt1MVfp8$455#PYPulW_Q|Y zuf9P>D0Al`uCj3FtRCxL>SCExb7}+<`(n4nKP3Gi%`Wtp{CLsF?Hqh~X@RMa+eh+6 z2lE-1brxT8(K^4X?^)d}I(c0eZX1c08N&f!4OwbR^*UD-XMPbsd$IRMlawms^1(OC zHvmKwL%(<%@Uum}a<^MF1Jrb>lt5+*tAy^!Fhqwjq{_-INMhwMutTgdyNr0*_-2LX z;m>H5<2Ne2cXc)tbW!&>ze#z5e1n5p>ZtP8u#ZV8m1d&Y7WbeOEBXcMmg4tnSY=`p zQlyler+E3g(zBQh`Gz)}z7=O8OY?FbEU;tAr*yW%PbxdGSj3d=XM$8(c3xdG&cZq4bct1Vt2lf{F`0SUN1EFVh#YsAw56A+5SbyrNT;>JzNAP_`^j$ zoM(MKce(HtFmtg2WYG=EfEZzMHbyv{lm-PM->t`CEeqO1$^L^Q+g=pIz(sR!{Ow#c zoo11tD?; zBQ86DN+<&jDSP&qOj!0>&=De_TWN`hFn^BkrFiD^NJ{1IwF@Wk1a`Qx6tTbaP4NOh z7g~S5p4l|{(ao$BCsKY@!^@4=pi4-TAh8B~&^?w(0};2kn=X(UpQ$0u?)Fmm82ga| zzx__piTxT0CSi zALe@M&kw$inJH@yHKVz5vtZt2KyouUJ1v{1zxVf_C~wtg)ku>=tP0XW^i@#osV?7t zW5)ls@BOOgM^0=GtM$!MxmD5l>0R~k8;P?6fx@=wX!TD3zek$teDePMnG&yExUdyT zbx*`zs7O^lOZEO@wsdQMaogmdFUf;k+KM?lNZ9!5I3}gXXm`4D0N#p_6NpotR{_aWj9bls~;M6amxuQ$|xH_|54*QEO zl-uAB=i_$~e@KjBJ^Uv>u_UzJgI6b`U<@v*&Z<5pJs4OO%?bL#b`UEP#GE-g#0o*I z>_M!PKxQnQ`lDQFBS3-Z8W7)KyuC;uPugeoK*|HZOx@QGiY>qpp8N%)IwK== zXSc7UP9fSaEwc{K@kN#4t{TmTfy&icw)chE zm=tNBj_A)~Mi)UDR5n`TXDL zz#2}Nr2uX4sm)rl6v*8QuFR{QvvzbZ9{Pox8n?QwX19$N5`R9A4Rk$`)Vf~oVi#sZ z6?tLtg+O-_eOb&4i!ZWFV=NcqV~|2!W5-~!Bv7X0u0(F1;eGpyC*k9~7jk>jWO68A{keG|&A6!%oz(v&nT&M;(8%lfb z>uO5KWA!9LVv0LMLA6Z2_0`~8g0U&fAQ>+aM}#N-bjd>@t?eO~#H4?lGl_?ACe6T( z_XzsJ`YvaMcngQec(QO`l(_f3rz2^QF-;F8Zf<=1%6OtzAInc+F8y{ z(%9MaR`b{yeBj^Lv-?5Vd~P4kXy)54BrqBtGsVXTi`3uqdGytGj8VrvE@0o;C_GYf zQI@mj1T{NmvyR}sxC#C_lb0iX#C4gzx}P=MwO4_) z3DoA5*TeXldTxYSJLz4YEUMpb?W73Qh3?+$YQE#mIe4I(9&hz`Zc-dbEub|x8R_*A z#@~dqNbPrq!uQqxJxc5Zm4Df-Dd{ZNtr6#BP+5ZFV=@QOB8A!y)>FlI(FK`K@d`WC zL*KuxPT2}-DkceY(ib#rl`)^I$qEL z$wTydbRsfarTZ~+l?~_3U!ft$5j-bNwrP@bcatBb(Ws1tatp>jxWy&}J7cZZY-K>O zmZ@KzjoDlpo6e>o-q+c|a$W;x0hZPp?_3y-S|;F*f z#~G#C6ow)-3<{AN#tNl|x$~NfOgk=?6tuiQm2;5w$>+*NWA2O*!Wj-TE7na+Nopm} zcAXhV3Xh!y+NzJPCXEUKVDQ)dl8`Ns9$or81Ap{i!$~rv|IEPraLRu$XNt(()ZiS) zIfY@JXE0vJ@H4M_-|1d=|LI=$!0hW>>yFoT&VhK{eP1fAZAG)4{`kTd+3bn?E#;wH4s=5 z>9yR;PNR7AqLUaVL9_iy8hUJR7dMHQ?m3u!{c(bZ9sg_|oEbmiLj$i?`8@WgzXA91 z%o`4MNC@BlWM=gwrs|(})!)3HFhU}b_h!1gwQTV}$I4fn{EM|>*J3(uj~q7){cA3R zvm2XT?Kl#91&OVmP@7}46x>u)lS}y+SD&}o&bZm)1OWNJnri@p)qXcsJ#HpPXe*=Z z%gE56VppXAynVXL*A{8Pu#DiaMEQ2X$&QlRNG_dpV7!vzjOJ}$6zP&M`*H-gSg7PD zI}X1Sdej5m%>~_}sWb*2B#hSl*zu+~E*8gU!pU{nl=cznAVkRR17BBvVCPZ~o5w7n z1ATxwJZgXQl4P+PRs=t6PW488UpFdAsy=(0wk>$s zwACffXQ~xz6%5RK6)I>vhg8gnb=UZAE`q5#^w1_Iqg(-Cve8s^f?Qu{LEoEe}u z(ysA1*);+tm!q4zm?{mOa-AKaR8G`OE@NtF*!hRpdH&TN-NjwyxBj0@E4sonTY9Jo zEY=gAhxTl)Gnnnc`m{jDYCdSslA)y$?Or9PN-D85-Ae}|Erz@X;T^YC{KeGhu14q< zd0UsXN*J*b?Tu(ph5af(al0yBsigN!0TAex>%{reOi0-#{h@i{&q$Oedp8pfK=B4@ zbcjb-A^-Xc%XWF|P1Ptrh`t5Y;l1>Xu={0fFn(8^07UcLl0vHP0EUfCnr{JFgJOE^rZ?Qw=1lmL%wqIP4x;CVP!y(Z|JlQ2PGTdYQa`=6*r9e`SNees zlx@Ow-TT2szBevyD}xn%vQ`H2eOfC6RYmZngzAEKbyipGfRosWWfw^xZ;M#pLmF}1Gedq z@}%TPa79ja1}`y32U*Qbq5WEPg7#W{p0H7JubK*B3FMe3=6z`gaxBTE{9Pj>Qtc(| zQrGq+sZ#s~gUL}f#6R-pNv=}db8v1y5 zVtY~oJ5A*704U+wAyYTDC|T+L5bqcMq-W*Fxm%N}zLjUgkweBY)mUniBv(^eZUqDo34W-TrZGgP~n7v$sWhw>I1BE_AVeG{WcsiDm*1(p!XECddm>}lXk zDX94AER5}CHu?SS`S-e9BkQ)<0jP>*OvkrCfLB9WtoIqu0_1@3u9 zd|7=Qqcr8jlRDnLr9`peO_Zh+Kkx61XT7uO)sKx*doH!}uy^b?{El}-^&dZg-Jrpb zj(8X7f!@4<5vz9vx$&a?Er7lF4`+Y%>-cc|_LQy<)fGVV+ zBBXB7s{vfL?6KssEvezwG0&{arBc7reie1P(-!;|7%cqUtu8U3?9X97ris=PHF7LByH9)m-d=xYZKA7@?4cvN{h40}DpAA~FbyX4~`JOmR)jl&j` zwmQqmoA-Pe3ZNNOnRq!ONIZG*M+MiXs;JZxT)SUlpKlMNE(2IK4~GH*^KN<8Y=5T>?XlWYb5UDrnm!$%aT%9u z)w1|1I>Es&_7^uoVq9*9YPjrxXroje_4L#n(UR#RuHiD)TRJVOPpM4b$U1HfFNxpW z(c8eg3rp99o+0dA^-xaoOZ0hndQa#`{%{+4Ms%bu1>C%chjH4P5{6s|7BHe)6`B}I z*rMFE7j4wlN!~uJH>{)d|D}e~P(uR=jq6<}+ZlK`im|vAgWI*VP-j9*b8<#!kOO|h z($+`!+&kT1#6}q=(y#m;D&M@Pb$!ot14l1!>Hh>#KUm22GdDB(myT97ZEl}muJj8! zom4zDI8iOciK9yCW%JL6B|zJg>T)7#21)e^K^&)3MD_7bxJnAGL`T z^~UYSg4v0hNIWEp+m%5DDAS}wuPf1(E%b>X@sRNrha+qj8pV$m#LPnOo4DCi{R2R| zs@PU}6S;)WQdWWmWW;GXU_O{YUsyAZ(V=?nkhq#4--`XO#dyM5O=|nm*Q^X zem|F8*U@Q?Zs^z1Vs21Z*A*|}!d!0Tf_LHOq!D~9GnHVA(0MZAPUd06tzf#l2}fTD zAS6uKuiwn5lk&3vNHXevWl1)F&w^$UxNdomr zfX#=oyw7?6e(`>ZhfDRF`h{|N5iT(iEpOvYm5t*xBKO0)H5_?x}d^vgipE^91^3(K$myz z)qMZke0wd|-{Fe+&R-uDiQZ^`K9L=n!q5-Ym!51_(eZJbK427?m!MUz5QVcM1Q%L8 zz4YX?RFkXv7&-zJ^RXhN(0s1r2rHjkm)iMidjPR0u(<;fgpLXEyGuZdq&+Fq5y_N9 zk}HAgpHWIAwU&A8G!xxM2ACCYimbmqcGERNJt~ht$b+7h8^{HhyA%nW-*daH&YOkYML0)tj`(c?0-;KX7&$hbRd*V9A@FOrEGcSiK3wACROC zW&0p1dl*4kUsBV3XYcfqL(au4S;huWD@uNf=%H=Eke_1S)K|g=8VB#}&HCk z^_l=`k1uyFw9COn(W31^x>>mJmR+w$J5NFqb%JrvlhC;ZlGjC&WPkCih4?F}B?6!s zLwv;Rw7+;YtmP*ArUz3^!e*d`8WJu{uf>dI?ub@>(B`yQk#H%wAx1qnM62A4)W*2o zYg9oVXVT1%=!D#snlnX)GkdPt$$_~Uw^sCX(IP+@QUiJBHa_L(ftVyZ!KgX|>gZJ! z4nkpHi$No+$Tn>1F#emFoBSEt6i`X>1zshUs&k*L6Q0Ot+$W@Fnfs*GELmL{c`@Pu ztuFL+HfJ`u(|_E*B0C8u$c%r*ogl*2{l#lxK%Mi_xgf*H=H%kKm3A;`Rnb_W`NAjA z#-v$EuWI`+X}#fMS&6m)0Cbs)g)vRWIt-TjSbQ?f@n#prz{(pZt&uZ^&nW8pk=TCc znp*H;FeackPhEUn4ed-#S7F}CC&MT7F{y0mV^Y~Jb(PJ!0uR(9m@_ErOXv#Bg$ZsY zmF+QC*-i}>Tc|9}yqfpnm>sYKVIJ;E4@J-ysd?<9;u5f;EZ~|V=mT%^ADWOkOXL+{ z-XxtJ7Q2%?N~Sof*;~JAGfPDe2h@G9Xx_Rz4eAn~FPiuMo+$9Y{e~q6=B{VCtE9!m zf>14((>xw?gN?5zr0aU$5o%Qc9zo`Vbgl`IS>7B`exPdVe^*pLtg75l4C0Adp8|1P57<`Y(Rk{5xVfZYS0GSLIjggEVA?;qNem$-cotvcQf! zOrra^mo;6Th5aDrB91X*Is`ABP#d)nu{mG60p~q)Y~Wl=?FQ{VILL0uZb&7podE7@ z_+B@~DxP5t|I}_Y{Bqv&^Q%1#UnUFF?0`j_KAJY8?|0F()?9)~4BM{o!jKU4 zDVipaPTM-kZnj=MB3G^5rF;sJ`OTfaKio{boSS!>3eO)Hf+9jVge(63RHyh4H+Kb* za`Tlub(!8(^T*}r{ecmxf%;wxX^hQ4edXK(8~L>B!c>eu`hlVC3LAUwvq`R36AlcVNOyqe>gwL-@a6z205 zfB(upSFZ;c3ms@o<0y+^hMs^Cd0@(ax{x5Tvo<7%nbWYSv^#DED67XJgL76uW0ApY z>a{j9IAcU4&oGZ;2ecigumb`P8}=HYVY7naRd13Fq?NLGX`aNF*)F*WG%bgQR?zL7 zn3p)3L4q4(!szp<0yLP8(aiNE>YqW9h1BLJ@kj8#PmFv68QtBa`F<<&4K3fgG^Lr^ zo7_$+w_Ig0LA>a=$y`8K0ei0IKj(8I+~CQ6+wm*ueVPFL5{JEPs`Y2Vq|LQKUxD5&PXPFwm^`=Riwq5w)IlVYL$=!aj^ za$WD|7EF|3ia*Z1x(&Yuz4I1olNZ71aP$=>>~yW0cN;hv0Ck1q3KDt=YcyJCHAO2f z<}9m;P|o}#sQ0Gb@9UKN6p1u{DZNYm5e%M=n9bmkJJ?Ja@|ezs7-Yg9Qu1EhxB@#e zvh!{vDX{tRPP;I+}mY^~M^^nEeBpf>5y=hg#BZ7y+zoRYoCs`1Rn3kv9CB^G?k|Yp&W zlw)1$VyBtUX)HfwsDr3k8>EX?W^VaKGqX95IxyZ3`=4k141>LC`_63ngtDUfvj^Ux zjI+cr{Nzv{$nc9kW&Odq)jN=}E*XB&eXRAlJ9)q!G^lq8GoO332y3l5X833kw#2Bp z!i3|R8-7y=#ABvvgbu#bxwegv50 z(HrVGm}|IT@mf%oSZx9Y8`{){{&2Ndp( zvmHggSmri)WJ#U&(md~3!*mDgraNwZap%59EFxJH}G7IN@ z+ho0ZZ!f}c_FYQ)hTbe{79NRYM`qRQI|Fhe(44nLmNwDKxF#2S53>v2!(T5;6?QE& zX7~%)M=_V`5A7(HhIT%^gbTU1RPUALD!|fhuOUha8r&iZOlHip)fjnOq3u##nD<;G?f3fZQQc zy5|R@o3lm2-P7`F?0V&#i0aNaqBi+Ne#S&y5GdQkGay-Z)`==SS9Ehld2b8Om)Ue#*Qz7lY5SY^_BYo6!Exok z73i?2(khh%<$=<2c9qVf9o(iRw7q<^^R16A6d*7v?fee&wUxY7du>``wBCK;^UsoK z5+Rg5K#3{T+U1_zWZU8JO(JQq4Dk(2vn-@=(bWP9rlT7oR-Q@;_@;ed$6JtL!Bu9t zj|>;#2AhWMPYz`s8lq+j`}(>F};QCB*8LgY{c1wWzw|VErA_mAj@W;@mwQe?8C94dd?iIjrM5 z8S)OkAn(*DF!5fjzwYQ6`JvAS#f6H{0o_Iu)wz1}GlD8-I0+qbx4P0qIX6`Ol^BC? z4ChQ-E>I;DaL-D267FPHwQ7W&OW?e#dd+l1zjA2;U*9T!!Ni(h385U^T82p|n@M3% zH>Hb6H=oZ1w>wS`w}g$)KW}W5+?pk&xx7h7x$y@Kl|JwzOR(kWocKB;%`IZfi|4WB zpB1Q{`5g;g1$y{$;p<*Tg$f(A3{&gYnju9gfksH9gT>z-+))od0Dk0me&9!jH)ip_ zWmI&r;qs@34QHUD1eJ@+n--v=609@xj1cegX*)ffBT6hVke|P-GKN7;OECmKh-ugle6fRNEs-v7JsTfrb2=XD z)k$y0+3qqbuiAnBEj6;Ax#)90*4-wkzHr`UGl6|Yp{KA~` zc)7QZn!zPcbkYvZx$OhA=DZEy(ol~Nt1mGI|53xHtI9VhKzLQT^|#?qaQ>S~faCHe zlHB!$dQp8dCK*oUn|bJMG9bykAezGEHZ>0TEB{C?Dbih}sStRik9Yq;{Li=9RP9+} zAocJlVZM^Fc`1PtvkT1TBXOg7GyyZMjyKv8&tr9jedbp8Dy_qSrPX26YIW#f;P$;g_h(OhdJ}&32EGT^wD0_LRdFv; zh=_ZgKfk;`e{rc2-0X(@CH^!?z-GUlqE3jAxblMcb1xM|85a+i%eDt=w5)CXM(o)- z5ARPIPbndyXx{Y{4^^*fS|5Q~c`5Y)g|_;3+>OrSWac@RQUsM>q;kY$=2?f=$y=XW zjxhljjF|(S5lGpdD4mNaor@@4wR~VX7wdU>6-gWueX0opb5V&C7nL}1IVWcDNJ;Mu zF@s(OpIL(DZ*c|JnS)9W35zCJ)hlgbw@!eojVVB0&34H)up79j-OJZ92Q~~!6?0hW zj3vfN@rL9FWtA|1O*UI-@kKRE0IR+rN&{o*kZ7Nu;wt3$3}g@G@SiV%Mw`$j1D4^A z%j;Ej!JiJAzj_m_t{{lS0($NzHJ0MpThZm`gL!518Tz9zW5y7Q*G0D?8-dmEb@keW zT~^+!S@WEf9vEPkW+Oc8a4n**#Mv_l`F1Tz2b_sD<&Jes!K1s;_@rn|2^k9 zS$V}3qrq^j->+D|;*u*a;SiDX`Q?dnx_;wV{GD&Q;WwXt`4-vIb=iKZskqqtVi-ZG zE+cR*hj&n@r@suE4?@91C^+(8p67?PJ||Xc>Gb!(6l#!z^4qtSQ>qO2F;=}eWE4v_ z@A^&&p;x8k_~-hNSEL~=TCeGV$;~zD%K^S!pZ%8bue_>!v}o+QT^`(i;$yox1^dx= zTy^)!X5}9qZS?2srsIe1U>4lSTmCksC8VZE?sgMnEXfj}W;p&3!RKWWVh3h3`%aS4zSI!18uR5$bE0$59c+dUf*% z4-d$_J{)I7A@n`Jg_V&h@v2lF|CfB!%V$SL_^eZ+E7^0)bZxIb)v3(*OrgYp^SPuuHqa zt}3^|CqJs<4exlM`H>fw+oJDn@)YJ_?CIiz=DmO9_!{{wyM55A8&A&Bmdkvcl;USQjykX;i#>3l`TqCh z&C|b&?g=b=d+#ad!fLUgNGh2h-O;Ey!4UU;W?=}=-$+A5;>M*u!Bl)CQUfVPPmgG+ zk1ScL=W7g_?~nbAl#R+qN(EAo?skdTEU(TUqG09NGLBzQ(wX*mrhT^t@-HqQ*UKMY z^71%&uK7stsYvOVe>o$62G{ecU;d{*|J@@7C(ltMo?0@Zr+*BZKYO#YsmK7i#FvwJ zJZG~c{@TWNn{Py|TmNy?O;t5*ziINq;*)yICzrg%Q%5@di2RXV{+3iX+yg(o(s%ey zTD?PfOWx^OD1+vEVxuAvCC*?^Rnd-kl$~nB4sJj2yMH}+>~tb73+uRsq{8Mpc*)cG zF<1$D_MrI_kn>b{EcB(LBc~JPuh;DYPsu*v0AIb+n;L+{)`;SZqt_ z*bbg(YJmtE7WkJu>$GLgf63nz=dq_F%}bLh1ApK7$dp#13{0Z1DtO$=>rJ7*Uvs;E z$=vqL&25j*&Ch$^2!l|pWDW|QRC9>8P&lDC(H~%e**tgdP0#f=#lh}TLE%hG!uk=7 z^T?8Mo)_aJLG?Tz$J^nw$El;t>4XTfyXuUALfb+!)rRb~A+qZJqS@S~I25Xn?p`jIXu8=ht9ly-}A%{?g4~e=;wW1r3x-G1z&B7io z)Y#NqtR8wr8CUz$xCb!xvdO!Z+p@$K>9yepP}wG6ih$Hr*dkUn!|4(59*hvnV%&kf z(bdpgb96eO(Tm_U+h!Q605!`YHlM|Wc`=ZRKakU%77tfv2gJZ-Rr5ekn;&)Td*ou< z*f;r}_QK?)pgCF_mhkYeN4emhqduGV-V5*e?8~`x@Y&WW> zHnng}j`UFn|BD7k04O+)Uffmq*jXTxw=ct!x$P?r4*Obe- zo$n-a&%ixz4MyJpy31WcAYyLFai}Slg^TUrlNQs0NSo)uO$N=M6Sb6ncmN)O1GG9= zyjpd&efB73`wtVM^~3whKeF7WwnQ=bBA%hLv;mvymQcx3QXkV~_}>}yoNoSZ zcWLC!^}IVA8n6bZ27FP2_MPq+V4UjDY31$YASQD05_SGbNeXeIOkP1!BTR$KO<$%uyKn_00{Zq?btc*|G*4g#?hAZgtp@7Az6a8sQh zhX>2EgS>holky2X@bE(XgmC8K({ym>@pNBX)EI4Mz$E8qc14v=D_up?Su6 z)Ia|pjz?YSjJ~i$!u`+5o<9Bzu%}=ZT?pVJvWlM^5x85(={mD=hUZA`{LrL#szRId z3MDIRwxD{-&~vOXvP2I{TY>7GQ$pFsHpt*2Yvay?yZ$Er?XkL~7~`JOL8xk8daQZs zxBM_!`ckVFDjtV-tdK=M41ti21pTv848b`q#aE^4Gm<%nrugi|O5h@cW7Cz5LX3kC z<73u<5-uU0fW>>`^K1g43c*3lRLZLl=8PRm&CJ*%FFvp^gzHZ!J2tQW9?!&fETJllIE)5yB;{KEr;^2`fZ^oif*LIEYR}sI0pvz$Tu-XWPw8Ri@ zt;OlDa4)usFuG=6CckkA#2Ty>Sl6tJ=OT-bwx@ne^Uj~5xR%4;7FuUm zT6ow0FKN)OjQ{kr)ULrd*FC<;&>WD_U|SowY-VOZ?o&%oDsHmajfkS9Dn}L>y4nNc zs0PK{^qytNONKl8_SIR|?7K+;CP`jLv}8*%7f>y$o)Z4|aXGnVM$MhHj)x)%Rvw{c z$sn?kk|ITQ#7W=6K-54Jdkv^%oe(oS0{W6;YRrD>ZKai4r!@qsGC7Wvul{aA*qK_i z=*>_=Ow|`#Z7Xy_;E>u+f~urem{2+il6XP!4q66v_L_WokA z#O;Ei06v>g*>00U&S*cdw$2I&`_#I?v1aMxEoB*@B#;1SP;46o*8xI)mc2JRX*9n? zcwSfoSElb?A#iK(}9F49W6k;+j)^&dXZ=Y?HDhD z4J43|B@=!aDdn)yUSA=(BP1_S`YqHc>yBulS$F&SwrsA)y4%N<-FuOJA?J~xnBQd8 zN44J5^OPB}xF4>K&%@3T%swCFYM5NsBRG&+&}V3{hJ#UyUHX7qTjlr%Tg_7s%6&S-3{5vse?u%uMv5*vhRoCHBz+xc}J!=R#W8M@o0z_sq+v4+mcr!8OHO%6gF`1 z-tGGpi^K{+2~qcM1|+QTzvb0^I1i3tevqfaHtn6NKSnou|C0=gPq%!+aRlyT96L2^ zaBN#KU944wK+ga5$1<-O!v=fp+brIO*j$ zt5e7%jpq6|0VIjWK*jcc;6b{>x}sRC=onQ!G&_MZW-oX^v2nN$ut3cR=g;T$x@#o|`; zUBazJ0FBrYbcyV|U;n9{dO4t?HfCk{b7xZqu>nxmLm3nfB{T#WNYG=PP+}FkXqJjQ zk+mhnu$%b(@#i;RMD!AEjFhjgFYZ!h5itjkj0bp|IBsIls8IwP7gWdd7F!8|&bYp_ z%6H8l`u>tG_3$i;kQf)YEIo3j-$mDZY;mW0Y;mz(>uRRE)AqT`SR75cX1h%x-?G#R zBqSqBm!#Vu=~Of`=uV%pBt=DQWFC-vv;)RRLkiglx}`Rhr;*@#+5+=G7C~oYVd*7-XUV66}(5bJ~>#(#10XxO*PAaI`pND5A&)ZfoMun<|c}dB_r~xg_90fO>A8cq`E6vzQifN_3Fegm=i(*B%y@;iB+W`(UK8d)XAiw9eXD0s@@=@`Qt7^r&^%CZ_(akfrII>~Qlhbe0s zH;@0ed&Wle{N|*srg*tL?gHh2~3%>ENSX73p&{J5Oi z`_G1|<6|3CcAb{zuaDE>JjHF;JpQvWxyW%Np(K{?$!qQEB6p26koet`(uUO|(*C=) zN`Yp~#`^7fIZ$d_G=rLvXGSZgc!mW=8kwYF`62P0NIYBZ&(8D1T3H+EVV)VoAXcasx{sKWasJ6HR3l?{dzrg!Bri5 zV6Bv_d9Iy)Kr7v(54;5LKsNc1q8AH+&i$Q6u*8(XhPjI91?*F*fSEE^Dwc6oQB#Gm zGaDwviN`W>GhxOwNJAfekpcy|AtsiRngyGjcZJ&hxPz)6k1!u@@|niH2v!c!>`R&C zu^r6B8_cyI@`0D4joRTr*_^Ak=*Jr(9N^pqZOsy}5T1nv8>Yp>5o|z3cEiL^Y6_8R z=JU)OIjBmflH1JPI3|)}y1TzNj1+s&ei!S~YiVGqrf}(*2phlxJ_Tn?p@a4@3MW^w z?&{(YU54}L9i;N=YFgUsZ-jE8v==3HaoM*yl9GZRI+8%7*vtwj&@1>LvcQrjHSH^b1kD2KubNvJdPPleq^aBUs4XX#USD}%33K4*dFa{Bh zke+>`mEXfWBI*3D#rTB^sm|AJ2)~OgqVaW5oLMG1xCoE54lY`~t}{t=Kwvg`YOpN) zclr#v$jzD!|EZeC$Y}@Ge^SI2sDfkw*M8CB9KZ|F4cnT=k6kEkB98j%i~f6PCDsmSz*o&fos|Z4IR_!KmiO!7sp+(4$ zir@qro!v4W31iAFVpW7h%>~ zet6fg73s-KS)#!+#lR#FOfZz=P?y;TdGY=8Ns*vawew!i5KaCvjz(p3<>d7w)!tl(IE3FmJfKhDYU+uLi$H?4pRJaNgQ zb8yzHA1hf;h!^Y7Eg__Bx>;VKK1&4Nm&bt-xGajp97e~jGaJ%8_zR}BkDB||9WcDj z)h|SBJ<RV__AR{Bk(aV*W@-h?lK%9QJX?IYXso7zisW9Tve=4ce`^$ zKLyOfIby4DFNGyGZW!z|*|aCS4{>gl4!~ot);HIi?O${l>GQaSlDknxmtGq41(YX;U>92$`Hry#-=W=mq(B zocC=|XbfKZQTCiareg*`^0^*W%pa zT(fsH4F{5K0v-oRgvXxB4~s0slsjlidzFr3++{OwPB{^zf!*&UPiqX^`JRUUc4nPv z=83uh-|l7&Mh$^spHO|Mqb*mjD!(w8UO{cIeWDrnU}_w*x%X+334QyzSgNsVxE8DldVV_F>N%!Me(|3%r`udI&zoIAN*d%8JNF7@?-M0*`s!&_D>7hqnEQAL4P*GOhR9K zikyl;-7{BICstD*?tY~hZ#Cas^XX3%)o}o#usSL@Yn;y@T?=7Nn z$zCtOpTerF8Psba6%IZ5>vq^pILkcmDmFRHowe|s>F!_tf9>w@oV9ALuc}?D6uJbo zaHqjs!;#kcrB>0mP*UraOE}ti^CEQlMqNec6SpCXoVt9YjMRKG*VLK2eACcdUB0i- z`JD9p);WLl{8q~sdVX8Wk{V~wT+i<&n|x}JkLCkfSDwv%B{RqZ^1HEyKYpk8D_u(PR7kLOF>snZu?C^T5%0}&XYu&`S zVUoK$snaY=e=n$yABpoIAb8~*mimhx(`3+ ztg(*fTKa8_KWgqe%zy5D8FJL{O&<;)+h8t-a0rEA-df$EpY=(ByTUfdVNPmDXjC&9 zhby5OAsUxt9H!H5hw`>c@A0tp1toOD*UZ0aZXPqbLE>a{UFmL~yvP?jP+m~8Xz?mo zu=;tIN1MA|i6LBTS38l$**A8_H%tdNX7Rsos=L3xF}Yj1Lz*}MIBXS>It4N3-6Hxs z28#tx7np0`a=;o+-i-Ua|)rmXEc`QIvZfaD<-}9T9bcXyp-vDCxChuY)P- zp(^>d9`; ztlK==RXD}v@b{oKbE!)Ivb*c^EQv~}?@6ckE%7(?5Fx1%?r7rE4t$t>4-qr%Z?gF; z`;;JU5w*7f)>mh{r`XOnfg(LBL9Acaoraw}Mp^Z5;SJ6ol3ahNwwxb>n%#;2o-dN*X;=^_ zH!l_E>sQ6J`(4{x&cPPs;OtDlQ!qRws93|SfNYCzP+}cw2ee>Liwv}E(>o0l&)Cm! zwh$~Wd~DqJfiWnsP-C+rF>i6HNVwYpW-74}z>u}JghkPL8aIjrw=t0#A;2x9A zLVuxXm^PFo5Mv1Np7^1SKwvQFH18&ys&Q7TAIq6QI7Vg)mTbe($?jm_~$ zGdMa0RA##k%(Rca2F&g}A>Fn5UOaow>|kYDfF|TqQpdjtqPkr$3^z(<36tSLnGvo% zxr!Uau+Y(!YA-G=K@FV!EjKcHdd`Q3u#F-zQKpX~C;tH;l z{ZW2?)ezt;Eb6o+x@~v;#j^`y>kBpq4v}=2|Ab`;X-AUN?Qn-)=Vbcr-f4Y=&#O2& zE!ZXTv)F-mu{=4UefF$&;QgOvkF90z`CxE z7s*gS+!qjY$UT^-wA-u7JySmgh%;_cylOF|=a;7PKA&FjgMVoqI!WvP!qeG3y}!S9 zlR#dwR<_|m`Q8(zJJD(212}GX)H(kgj286d!9wT!536BHG2bwy2SU@{VN?>$1q(xD zVw|95N*JG8uj@ zoLXN4JGRJ@SP~w3qVO*k%R0@UQQJHVUu|0->_2^X??cHX#u-g~L{bdkfsDpQ_ZS5A zrAUAiu5eoFS3)iD*h)AH|p%{ zicltrE4z_G(#Ks%K@DZ)9Ly9*X9)M){z;C^x@+hP*G4Ba;&2=*o&Ho*l$(!GpkaP zug_|}F#7ujC<9%T<%$Lsdr-nx&}Q}Mz^NBeGKM&HqdmTP+VNfk4N6pqtJ!Ov%HvzK z;_EX#+`gMP69zfoOs@n}SFJuVE>;%LJG!=`&;>V#wb&A&TG`ef`IE1LP?^4E(CMPn zfcf$ObpSi_i$rR{ob5T74y0R7*JOPvZ)Ypf@KB-})L$@H$K3 z-{$z>w{71G`JKw@HHIcTf4Yk%5q6_w;Z|4RBD8X+wpUFdBBk1!8I$6o8b5^6N(iOd zOiR1F^L}sGDa$r;khiTn&IrD#$RYJ_tGDQfls$mUAYO?Wg^W2rdXJ|DBG;5Dd*Y6}#Vx1FZ*NjJv@40Bn1K=eSO0$f-pw`P z_n2EJ2sF}*b8glR_VdGcZmubDW9`oA26t~#6jJjC8WdfUNoZh1{^grj*%xc|uG?+F zLqUT*TEG3cdHaC~g~WByLPVboCd2}`cLpZwn#j7rg!xZ7jX2(3*t?6pnq0kpM?Lxa zDI9sNCX91Z33|SFox^JlN${UnlgF#ILX$@=cFxYObdM%~AS;MaaGyRIt^B=&NxIk3J=_+ateo+S#YPEH|6 zEm@CBer6Y5@-jJ_MAI>x;R41)Zbqs@E2|HVHj6opesI+Jpqcv^=JcMiUDj3S^z zmkS4}yl1W0b@yQY$fhTs6||AF;>r2 zBlBlJNopiL?Ju^R1>Z<17N2e=$A~+XtH$Nkn}mFJ1n|U=f(J0Bu|1~+_Xc|SAvmP@ zvO!J=S$?w3Jn?O{x$i$39MgR)E#zT=ArN%45JK3UQfvK9t%H@DQ}DeklbpQR)0`zwr(|hiNOdgHY-*cXzVx%W=Gj^*843F zvE^%gd}vc?00o(+5~i>pCCXH{$(gD3B~4e|)c9cnLj|0~W&~B~COU|HtYi*3dr?PRfrC+bhJ6+V5KE~@VzvGTgYm3hK;lryhb4O&C*@Wl>s~Qy7y@*rC zFL&fAI$}RrB9s5(6hA5nj!X;Ot;`fH&NbCxB>TW{ zkX1R+lF0RGb1+yC*c;8}4eAVzSoR?=QJic<9iE))V4u%KLwWe^VmTf;e_SzPx<>AWqfAnX)ZaZI=I@q>Mko1qS7#gW(VgG#R=c{)m=%mf}aKgl@^1#P=S8arEojX*)Sqc6iLakY@Z4)0Du zT^LUDYnhUh#gRUwNa*v+*VL+(zC4n5+%H4>qv#Q zlT&u=uie1SgXY)%eRczqS3;yj%7AH+4$oR$Qz$IZ716i0AWrTH9#ZmSu0vPmAnzi% zX#V)!2uC2_h1US1#6I#Y02^}Claq_)Q|drO2&|2)p#m=4>=L=C{zDExLmr#Hm@-g= zrD0JIqkS+Es_YqVeq$fXc*c`|fd)Gd#RHoy5R87;5AJ5QXT-4J|o0l;&MWh|Ob-IoLv#wRM`*jM7>lNX!a?{8=t3j@Kfxnw%?A~UU zY~740Bu=CO;>p-icDnlGb~i6V@LG9=32@#q?EOViEatMD9&|c#VW%*g^9T$N=6`E5 zKZw^%9s!qM$s;gy+o{C?ghd}haGK#s2@T_I3E|;l)$jDd1KPonT+#tMap~&aAO(nV zfx-VFXCll3?kApkz_qS)SbJMpZ4hgy3)j+HcqL95XVlvni+Em!y^zv9ck0OO=$(;3 zs3=DNl-k5_6T3Js*VH1gKK3k$OdnTDJ%tQ-(O>708cP>2H2q$a4 z@QGXtX+d`}(h1(OLR@1Znc%Gb9m4Nsb;9D_ZJUSAP}q^jEF45mSG25lp6fU;HZ|Sd z{_UDUm&C-d>f3e<&b#pE7}g9eC##P&W)jeilAC+9a(7rbrYB>{KUpc?ucip za?T1o4gXqp#oLn;ZRTcqxycB%*S49qb&2qy;ej|LXu3*AX%ha9^M<~g4|ko;Xp;NN zz0>p$vsV)ma2DKmsL=|KP~x1k&~ockw+vI}97TnPz9C|Ey$v25pB24 zYn7iOV8XP3BCiLKa-6FzcJ*_)IQ>W^8tV*$^BU1QEndz*BtZBt(+szDY)`If>$JX%)Qo|} zy+LC$zUUdlq>z1hFuykno|8X1!y#(!*q|nRrms>snV@0A(Ze*{EF1yNE_8%mnX&ue zruc39=AjHrFod#2T}F(he0hrjF|05MQGtKg8)GE{TDl3`!$UzW1)sl%kgg1b7sQ~n z`M5Ra%0)h+^FtQc?&-ICRzJSV9Wy)Pust=oRc5_*-B??Hx0hf>lEaI;&CV5^&t)oL z;%CK1Ugzxo9g#$l4p~+wrvBEOCqA)pwJ#2^1nYrJNg zsNJ<~HGZ9%)Uo@FAz$%D*u9mOMj&-@UP7Wt)Imo{nOZ&n zO|<=+uCzS=?r-5pnd5LU92T4rQ;(1R#cV45dghXb-#jEWaN+drUjGzam)RzGX4I#P z4A{Z*;m620DMU&X#J)LwUQW;%N>6P^-GQ;i;l5h1kghS9=1SN&Nqz^>8`9QJPV?q3 zzXCn_FT=P>GVGxn`O+YvQnB5+3=#Bz_Ia7Vq^(UyI#qoX8Ew~m%{LK$X+M4B8|T#& z%8PUK2AXEY6QBH0`s1bTcUkt0drwS9?O~%|qr*l=kHCCWG8aj9lMj$$fkps_elaOQ z#KjaHkZd+F)I829se|esxxIopnMY322QYy!y~E_B4Y;yIFe>!Ds1*i>nOBH$%&r1!>jkW?JEy2n-&)0g&(hP1ec7zvR81x(8=l=2l+FB9TL-jA4Jn>_hFC>3(K}7lG(z z*cYZR0t=g6J!tjCqz_5YX!XTlJhQ0R$xT>OtMZ{%6vF4s(U>4bU4DCV@nKl~T?S z7K{0<4I-XZIqYldraLDVJ`@lKUcOI|5)}5Xo&b*+?>^bzZvv-juQIqHul>#|L0!TX zd$?eiV7n{MszzdiW*=?{1u_QeujG5O5_?j}Kqt!8ZA$E>a<1GmOl<-pX4NueoF-|k z#BQNK3sWtTsMlPGL=BCdb&A`7nw(tQxnfdN*QS&E=Dt^&?{xjXd!+}`aK6`LUgVRaR6X~qAxn}B zJ&#p#HqV%KcC$N}Ku<~Hyj28hls_41C~jR|@Z{i2@6jaNMB#OPv3}n@C#Q5d)8Wf{ zzWb-{s|3(<&#RDP1aaD1;0|re6?Je-v*|k`4I-OA0@{H^cDGRmexLT4Y%@Rj<){A~ zVf7(;BdN>y?cL{f`+VF|pbdoKd-LS9aJ)@UJBt)4SG8<7p6uq-xvd`3dMz5Yr1MDf z>b;6Qh0}??RN+#D=sXy`YSbRVX#3q%UzjBsSg|nM3NI|>IgdoIn)flH&{2omLP3=w zzQ71V`z#^?ZFi>|Qs7yO>gR!VJjZ%s`)HmD=D7mA0A@i~E0$y&FU^*AnJxBc=1RV6 zD_WIsYzF_RULi-C-^Y~9qIe?0`3W~7q8vShWV(%vUnF+vPl9qH4Fl$eNIr_`C5(d^ z>KW9El+)eja*L<6mO=!(XS#|E+K~5H!Y4xBD4YQ|?+>+FeOI2klDoWTU~A2U%;Kl$ z%yc1vL1eqEg5Y6fmC1u-U31!O;`Qq+n;2)}0e)K}Lm|mE&nEuG!Lt)WJiYbMw;z~H znI&Wm*He#2b?sgOWzzZWc*2l1v!y)njS!Wd(%^WQ%sGu4%%im$O?7w(>6qV2?e$wy zoHKZc$J>I1%-9!gQ;Ex({N+OK)|yGpKb?IBo9N!hI-E0ry27OypL8-!xGANz{>u@w zZoSZn<#9vGW3^F&Bg|=;iTahp5ww2+DeQ}J!bi)+bM;PB{_m5ZiGo=eR`} zkA4Xr(;nTJ3%}%%%+w%2UW%jb%#zk)+qewV4l%O``ml{{yvN+n=U|8?Cg43WK9Voy zg>@t)3@u_VpAeJz!MF6!zHFC5d5BKF zY>gWkaOb@x7ysz`56p#wbIZ83bfg4GOULoA7qfIO_KdRXLTB`YgJ&;q2wlVwH%?q! zQWJ?=0c**k90Mt`u29k7rPeXYn}ZnzT`pGi%ahX~oJ2kQm1o#5mz5+!c$v@m^chP& zrQm1qm6WX1ibEuXlrb;9h5lZF(;~Y~8Tx$NNvY(xXNc-QO6LrQXO(tQ?CFj)v@u^; zo@A@~H+nn56j^CUX&D&P@LniMq-k|30DUf(yY>8ewX{H^=>=XA7JF_KJ;%oL279kc z`t%078F6hhKQrR4^!Vw{kEB>j_WI1GBg;D1y0}H!VR_Nm>}5%5sIVxt=&!d?I7s$E z4g*E5fNAxrG8E=&O#1JWd(V5Cd(o#%L0b8BzBzBk7yYS;NDy`Hr@GB#@{;z&4J+S5 zb)qK1M^mX~vIIhae7vxCC~&l|t}|4di=GI_)}!|J!sV#FcB;a{L2qv!7pse*w*xy# zY(En!Sblrh^E+^jt)31erbFSxbX~hc8o7(dRnvVJojIvUYAk1t*~I12M^*iUbN3w2SFW}7SEl|@>5mh)<8K<=^&hA@K@@GS_i(|}f>YN<99 z(JIv5715f$L*8|#4AEj8e&=y_bD(le0zsvR50-DC_ca`bB_&;G-D8QtOl$_JmW^{n zh_=dq`o<$HCDUmm7W-!=`f^InI(?bkQ56$YuFDSQMun`R$(9})6GekmQ91MOjM8EY z`!g8zl(ODq7Mt40O7nq81JubU%B!J(6zHgRvS?&lQejMC7c`}hL@u_y0?c3)NeK1m zmFzPn9ab!hBNw$UIi(ZW$%#$F*zIxp(-A-BZOw18d6O_W zfSWU${QLZwQE(MqEt;=-xfEQswmI=#rWr0%bT6uQ_?c&DJu}+*vLyC-zg%AZ>}q-_ zc#zortV{kv^xy}Utn@-s)=xZl*+!hJF8l}iVhE*|#F-+l^6lcAQr!Qn7H`t4;3d0> zYtEby38&y|c!oKP>r!5PXZ(c;imZAc&2~}fJW<*eG+u0-;CBvvqU)+%<*{)hAFs#5 zv|0!-pRawWbwVyAJhG&Hb^b~|cZz7N2Ne2XYpx_WMh#}+z_V`QJ71K5kXGZ??zgaa zdijf3E0=4hgEyG`FrGQ(sF9506;uI+$}_UuM62zh+>!}ce{wGNJkrk|ok|odkYK=r zncLdbf`GqmzTaOgGN2y9m?+O8t5lbi^$TR^$`Zwqvv{xm@PH0IpjN@gURo-I(Le_W zl5TCZmj|VDFlFw_L*1F(Wa7x8f9tKXS7=v#s3o7|sMHg?4;dqp(&9`)-2>n%*T~1Vi!&|^9M?#PvqL3az0s3n@O*$+p?G#Ri~wZ{``fKkXRRr5by$a|n1YvLfO+*V zP}PLVhc|dqzd65q$&$Hh)in1kn#b+T0dkf(Gtz)|r4BLW@8%1B8o?Y3MIUv2vb=PX zHK9w|;h3y1=M++VD%NG$O9WnTu@e`vYw6y*R_71jC9O-JHrEcq3LZMR_Le&*Q(75) zHT1D|*L00^7mE406-zDF=)SsDQY!ES`y#vJMiYbBYQE@`?zR)E*LH>?m21+WL+Sj} zIqA^c`>)v;A(%hp-eL&%(j2WZ`HKkSYjbV_urQbUdlnOjlEqq!h#gQi2T$41L&eg6EMgr@s(9vnGcj@YrBVyj_(9Y2dmP zPcb%7`7OJ3-0|+C-3WyHIdfI-;2-F~n6NRBYfV-W4MN?n3u9(Bxfhu=&i3ft>Ltcy zHy8LiTgohKP8tkZNaCBucDan);4O^E$sBwIVMoyyC_A)c9xlQOq-Ma|(KX62Air|9 z&l%q06<_J(+l$5Qi&<&tg^Onpm(rJP3$5EUV za0ngnLJzo=EH!#iSU+~Ko~;)08$%o)ZPwV9bpVz(tFLR;{tuZUe1Lv8~Y;99JSE`@NAuj}vcsEJ< z>LM}EntTKxPl#BR`<%Ix9T_$cJY7zv!x!XJF?&)oZ^)ilKK6e{(s&Xab{x zoS-g63_?kCDmX@Vle>R_^ATf4mBAV=WD=>A1Z*84`ib|Hs!GvSQ_;~P66w>-wojzP zM|`bln4IV??gTq7oBc;7w%LeXJsSCh$zxhp{|ZNmLqOK8y+|4Wp^l3{A`6-15XG)c z&}*{h$&B-DCx>S~HXqeNb>cK9_=9C;+Qa7lk4QjFvqSm5OCu*^6<* z14Q#lc{NJ{sI7|`=haiI%?&pRbl;m#UV^6I7@KdtCzoe{0q9fEy!rR?BQMCa=95oK zc}Cgi>!13pRVmmGKm?Ouc(+e}vRn*pEKN50%cF@$N*pfhOU~v)? zuaF@zY7L1x=UB~6XnE{o|U<@thrLXhUOS4v!Tu;6O*|C?;QS zMr(F`Th7V#*CD6I%{97kTeXSgQN-RQa*FixAoqSaqYeCbQpKIngH$B39Vc)JRrL4x zR0OwZ#6O0|_ntpd!gbUV$r3Fr3%#ubuq`)0$^}vjhgKdG)bFXz;Gn z>ho*(@$PTokha$}`6cQDXw2+3Y5DQg<1S{sXjiH9esoU!pH8O>vzkpR*E7N^N54_m(WA+$y$ev7(+fVb(m` zDzY5$Gmc$2tovj!G!a+;duj(dKzMRAfLg$r^X{ZRBSZBm7-O6aA&IAds-GEg#2ut=H}Nu)nBk~iB|3!@)8vLS|Dz+UK4V`&-|F=UaSJ6Au~S=Lk7dJgWv`eXar zWgxv`qjbJu^VCPIL9|2{Ik>}S`+?toqC|YbC}??vzAh~teO+=0Gee*7LnsxOTa19t zH_Lz}|NE6?g=zb{=$Nron65AqA>ljAMQ#`_swLsF8~+Oz)pn2MhFQ}m4u3zJZa`QJ zwrLWGA`vWHpfDVEHQqpEj4Oh*^F~O<6u)C{q&%80b{}~eaEz1Qg%qj|L)4lIY5of` z1WCqG%;n)InfAyU4fWK$uEj0l+=`~y>j$Wwa=X9-J#wU1>qyLk;0ixULdufw5j^|g zMzZZ0MG+RQfj0zy)j4b{M5?T^`HdKHqJPr$yp}0~ch&%Aq-rKK0ml{cBYS7_>io6L z);;A8bco&hfUK1FQa$CEuh@yjr~<*b0n9lp6IwU3h5CWunk!RkzZZIx7uck*Tl3Fe z3a_!bgwA9jN_dMxBL&*l%{#k;OA35pusVs11d9?luz`@X#jCZn9_W-T#q{MM%CN(+ zFOpOun#f2wHZnrx7W@%7rB>Q)jNsE6q(#rF9=OsJVY&FN+l=?cI)=Ude6Jj0P{VpUQUdG=zFhpeiQXx7hdBMgb80Lo5C_7x~&rt z^+GQ6J-U($>d3yt!uCt2gr0w9yo{cEZQP*C4Bo;;ESk$aAv10evhwwftZUJ;XRq_y zfz1$5XN_q@0|c*LT-k>j zoM7(=EJ1Pb@r>=qv+CQAfEcBNhQ$eFwT%x!_s(Es0Iop>(56U*QgEWGK@Dzu2xEVP z+H;(_A1oL*sE};UQOmJ8rJIl~0MZz_dKrL;j8iM4vWM5YPj8r~x8DcdeYz=ERii0B zBqvK6fh%2AVTT=a!#0H)V!m$D^bTulU9KxOoYiK;z2<>5=CUG!9wlnQ9p=lDiGu8P z+}C8n3kokt{a3#xIUnH?8WvCjK{-v}16$D}jW2B}rXumMdm)Fgm`GT~TIerQqws)% zDRII`W32#FIQT-zN#QXb*n?utW&M>Pr=IT|_Vt+kmGwdLZktBnDettJ7RRS+MS?!7 zPs*I^lQfeA;&20MCgBF0RkzSkU_55Y`H{>Fz^S4c$6_NVOT`38O@RIK-5k%@YF60E zfa8i4hK3*?dGZ~Eoh8EVa`NQ#7uI2@3AJ$tN)fz4-KxTjdu?|KHOVIQJK;Lgo$0`uULmdqdB^6jR@nY7YR-Y2+4^1-Fy)U�Mj7-mExvehp zEa%_n)-{u=?2vdto}4zG-ssMvx3zJ2;LVkZ22Li4-!)Gzq($f zp&Am{do7Ok=Ivj$a8lVkV1G=Z`C_X?iz9awR;hpju^utnBNi{OReLkh-O@lgV@_;} z{37}CEF+N5O^!iJlcQfLmie%IRA#RRUnCXrwVX@Ox)2g+{)3qRW~sS*%TRQ}m{YCp z+jwdbeA1ew#wjPQX%mM zq5`vMe%@~J#IBQ1;=waJNjsm!yfXp|Pr}MF2V@eR#eto21#mGbHKcr{X&h3|lD=kv zcPT~Hk1OC9ID+CR<;1MY5gL|EN`{zt-Yv+-uOtHGqRK6g!%Bi8FVRk2CDr*wS@m`j z50f@({?1Tb8lCXOkRUK#M%P?YSUrpV$g7WQN}+Vd)1iA@)JR_1og_@Z;{tbw#sa2o zoNaef&8k4VSm_%1`T>m0ff4&-!06#-Kt%%qev)EcwXD%Z4;|a!p+gFCTbLp?IxK{C zPa1S1N-yJ9x3SYk#Jiu_jX>>Na7{m}(7IZ6wzwf0~~$E6?1r*r39y z@Xnq!c4agr!tTF_r+MG*aM0%FvxKy(TNB}Xd`WU8Vv&EC6R-+oL2~4qJ*@Wa@ zqL278wLcMCa)AHgCB}E?n{&0tv+35Kk~ONT1PnUh$6dAjVDkB z3haIev**}xj`z`gx^if`$_Iq%3yZfK8_cE???b?MH{=h*Z}&^IVD!8#KHtYx?t$&R z=Jv;s=&ukLN606Z449x=%F@d%$X13XL_HlHnr0g)1G>{>KJ>gsD!P>dTc8UK1)cne z?+@MsHLS^+Q=i~uEV^(9-@pha&4)J})hnF~)m4Z+j4i$IIRh zR--ksHvQiY{l_OsF@=g4_|8+Xh zV?P;0z(&qKole$?SX(F?V|(fV4gqu{8eXN>ui1 z`P=I&#^Il_Q@Egmta>=#ER(CIZ6+YpcBc&GJk=@P5{{Yf7U3Z`39_POQD?JqefEIi z0>?tW_F(;w1?_A2Uc@Ds&?G;>#2qw)=6n8aZZHWC4S8<1>ztv`+x6s@c_*nh4m(TY z!`Yj#n00E!yu_A{kCeaAo$KD)IUFIq-Fp~xZ;w6(-HtG+X506=WiJ75c}iI@skZI9 zNa9K($063ufBsj#E+#m;*Mie5PRF4*&1ZiRo(73V_ksVPxHAEat11`&nVGCj3lWMI zi*OssYYR=Au9P-qxJf5%AWO+oiily7Oxnu2=cduJv|p&MR^lvin;I1QkG_sofNjCH26lLLik+6^LiX}oZudNh z_~(5O+@<9Q*v{IPhl>XF6FbC5%GVlX`vv{Xdq@`TC_Jx+X$mPe^khZ-t}ELxJCNC$jOCjdI&8DF7-pIpM2ZLj91!t87w8U5sH3>hs?h zVb>XFu6yZ@YcYd}xlRL_WaAl)fx}QJ=DO^jui14hJeq>NHEtS2hxdpsG5$^JOs7`pas*aQ-kZYN zl9c`jxxnA9rb{vW7@FCZ%U>X(ZKV96;;?wl zwK!5t$W`)64qyL(nn#M3e3Yy&r}TXJ+u^n@UJ$?11;gFO_-t zvX2gA!T!_PiXQJ39Z+DR`b{O6zHy=pZL=pp!H={}PY zEx%jZ7`o`7{ka8NxKvyPN`xo{MObN6=93pJdHjyF%Za4A-OIjiXl zvh$|>s7B5PmUxKFJar<8L5{mz?~#p8=Ang47=Fxu%Z}Sc^b`Awh4y^~4&`}}&^-{I z7_fh*O9ky>y4c+3BhziC^e>FT%N>Boe`o;yFEZ5z^REOB!zH5FI1_MN;-u?!z3Np3_;`YW54f|9N_z#uUQ{|R)Gf_| z(bqjpp*BC87Ss0ON1|_&{7B$$RB;P3`69$6$H7sU$HHDI(mI_-=aZ4CzRP{!k@a7^ zNGEJ4qDpI#@|&Q)0lKIoD~FlDAO3}K!Y3kAwU8HV_6q=c&bk3Js@!n}&fdY1Y4zT`@PB9;s`TyVJ!}ERUyVQri1Wl6h#)+P1agoPm|5g(H-BO0YNi?r4 ziT*b>+m!$NnvK;(v}QC>|E(oEIO@x0*hk1x?h@-}N!i_zXyh$ZJo-5cXT%1I8p3t~ zx*T|Ngizj^gm7gM;w7>f8{Xd$$d*?0L^T^L3Rh&j$P``Z=5=tJlLq zY=De&<%y*Rk{v~365$ah_afpzj!c6Yg}r~C%z-vpn)=f0CWyykH<3uhKu%MZQFfS} zq6!9YjX4-Lt`oSYd}J-AjA#Cp?!KUW95@36Vw|8GSR8R2glOfsqmkvOcKIm2wyZ6H zVabZac4}XtVR=wsbV_Vm&Qz<@hCy4XRzdFeLud#)Ey4M-5pTuJH)Q~@P{28`P}~uj z1hy|tJec}**~_Py&U|FrudmBSTr{Zck(`~Wm$6z}>}x_Utocorh~*NGV(u}ylnGst z=UL-c+52DFj^H}h1*>6a&`-NH=HGJ!G;y|UflaRt z_Mgz*ux0iU5oKAKKmt-f-r2I(kXKTFX6C^=TViw~hp&6WJV;tnP9|V9ev|}pqqO#Xtp3mDE;*qKR zr;opyx0s*4E2l4uMhRBY03>O zq_C{=ha^JKSx1p>vI}?#M!^&2S`t`61%@?;vwvz1iT7|`DbeNa`WU=F5_rm_5U(k| zpaq<`D;FEf90Ff4hvb`(M2D&}?5AiAxkZ5$m7)6Z(^xfStS}KUDzlu|ks+G0vSD&} zDHU$a6at1?`^)e}mw3a_w3fzA46;yKUaJuch%J;J9W|HDf-2&1ALNdBy$BWRA`mClSV#t2t zq)d1~BJCz$Kb~gsbdGUO9QX5#`0quO;v^PnPJ()z!c~p<*u_ToqU#tX+zwX!>45(LZ zOOzTE&Wi0S5@5vygOam~1W&qPNwLKe91kM9VQm+mEtE#!3=9{1Vl5}g7!(m0-mZJ$ zjdd9>H?l80q!gaBzN}R4_JhRDlF@+h7{7dbMG3xL*;ACrr~*07#N5e8XNfD5by?aU zwyR}W0I)L{LOvjLFJheRx+$qjC6z40EFt_#(+Srg9UrzOoh%(J!HE@4TPb5dL-y$5 z#mow#u{O?QAsn+e^9=TUD)!3e`m?t4iC%W{te7cJwtF+@65}?n3{vIMaI3Iu2YlRP zUg?qu+la`fUNXhAoI-&UN-VL&n?F*TT`r)D(A4Z}<9x*-D>YCG07vg}lLWkuhzD_d zi(?wV3l*UuTg{hc~K&3DR*VNXLl~ zXgSGJVot0;d@*st!Gyv9J6AC&0u*d$1VC`bM9Zs4#SB7vm1zJ#Oo;4OTk3!LS#@Yi zn7HlCD2pAuneugG;tzS0{(|_`#XEk)DBn{f z)DL-veZcUMQqK&(_(Y(k)Guivh}b6*5Z-dGRK^Q7+wf-01r*H*%;>q~l5&AYJOJYR zEVFkKa#q9=V)3_IBBG$vLWckY&{sIVTY)HaM4@Re1PMkkEjZyMAtF5>L>4r6%$+A$ zEg7+RM&Sx$u2KhS|30`104i`P{-z*OG+96YcSugzh*ijnEL4R$3W-pn2pzVY0*b)F z@Bk?>zpRm+@#MlZv$&ej2b?07zUbP-3R0XfE26u)Ba-STm|S*GRvQuyv)zyEM8cIY zsEWcfJR@KE@~qp(idGa)IJp3yND>u@MjOEpy_3y~pb>M0)D!_b0<{1Q?Vu&~(-edU zf3_cOnJj3BOb93;Z0oXEHco@J=T0n}6@~%Gj_t%1E;6rXyO(gA6{>8U6%$!o0MBtM z|E~WnEKdZ?JY4G<^~=_n*FgPZ*+rw2cWCbRG2G9gp%wxeRwZUHCz@lwC8*C8!n~(! zLiwVAW+N*0Pc{$6km(jNO(X;+9<7sTJUSbNA}MgmMfM*d6{RI65{(rUl@-q` zp$P=a=yqH)S$fP%5TOUwcbS+K=laNjV+|E;@Z_0$=cl7 z1#hdR!t=RW{k9AEE#ZF8o@Wk}Cv)Wb+2ZpluGn5lWpXJAq#mJbn!k1dl}ZH#WwjDW z?Y{DojVy_ZL{tz6P`d0UN5OW06stB8lfoTzk?m)RQIV}BiaWqF0Xf2Q;5hE?Q0^Sg zkRfE;qD^G&LjlG(B?+2ZkSmF~dZSsaQNsDMO-RTD5`7WS$Y7mK%tXq@W0B&?bTUWU zg?^ZMa6}PkT#T89uZV`pLs<#MNjNU2{gA>OxfEVBhcN9ZB+)VsmLF5qbo#sms}{&w zKw2OJV=0d>{3(VpYWKWoFnvVvu-wVU?nIh|u}uoyp;ji+XX`mzked=j*z%jAl;fs@ z03&uHa+AO}iHq3}LgEPhFB#bn!+vFoxwi~H$5a4fvisW(UcrdjfW;?Lz}4hbUG&jU z&!DEz@vSX(RoOisUV`Ex3|fRxwJ9L7SX~c_u2wu1yMj3nWblu`S|-nT^@|07iG&4O z+xg}s^UW#$;}%CEKJjn?vJsYp2Nl?;fHsyu2{?(otCZ3b zzKW=S3sg{GC;QJ4K(FwCShNt$2cGnC_AW8-O9Z&r%0Bnp@M!_|reZG`xyF(duvL9P zz!%LWF4Q!uu`366nNMwpm9}Syw5{MLD|dF!iv{2}BQIXcRuast3|+2K2}miHAVeAh zOEaRwu=g_jSn!I%iOr7203%E?EXlwcE0P4B2Wg^eJk_#PgN~vt9;u}OztX)UXCZz1 zjAi+H`f?j=mjRW0B^9EQ*=zR0SsSrCOcI-~WC;RBZ=Na*a3BmEcV&urEhe|aDHUua z$`*`)I|}ene0sK><$bD#LsNA_*sC5ec^v`2_U|Di}}%^q6|t zw+4`+%k*=OiYK!~(wSQ!pUzX95{fXxUJ4Zk!RUlTFT1ye4e&=xvRN#8va*7zWmI!E zy`dSPk_8x`g{s*C2NtOx;F7UL>EQdNx~4`o4ll30b`qN%Y${Bu$R=b5Aq;?I&63iC z8NS-I=sk~>h{Xb<7Mp7jjNsrVD&m=-fNT^4Fn9$g(D`{LfLsA^CW!HrUGG%;@oZ+s zBrt+Sec8`pX8Ds6+vf~nT1&A0k*y$5$rKK;GO)iG0%1jzqGfr&oPM{xD>E>=LiWIf z(i{4%6|)+L=OtF1m9$~)Hm0!DlXf$|<-d(kyR(OB?SWjQREwZ(QH@Kj${TdAj5e^J zA8QnL0PPaWPiGhC9!3?!wl4@M9@w#g770DDqb}ouc00R5hMt$2TRI?ZRZB|==`HA} zNsgJY%@lkVQ5vgVK0Z@oRKRwP0S^Q!2o;p*+={|A<`5^s%HRmko*jswZU8HoIxv_2 z{%p+?U1MIIn}-h>mAgFtxiY=Bf&$$E&=pc;4#7I-hJa3?IWJHvf(*NCK?^4c>b3X? zT7u_?XXRzXN9yP0fxWa>ASwX3nJlk?1ltI=emtM-CzcfH2xDaR@Re*q93n~{^)jW|u-%Tk$@i(NiUMCQp1FyGhY_8w9(+X9Ph z1_mU}kv%EP6AEbxXUvmfP72{jkO)N}QWR7uO2&l5(H@`SRBA4%y{PO046rowK#uZakUfCI(R}^ZpH>0I0>oX#0_&bRpol#Y3JQ?pq_s#k01Sh!yhG5G zZCizo3C&`nDV>_ZAG_;@k&Wfwp54FbSMRRMTCT?%BDgTXOsv9 zgjy={=xgq(JBNm_3Tlh0@MgKE?xH3`;^(P0&3-Muka3W9GxmODyBK8P=v2ZpAhlXpJ(n{XJ?NId zrvRg-EQ}GyMnEJaZ75b(_p^>YXE#%`UZ%fv*D?D9RM8=UpDGSSPeJo4h%I< zMW%-R<~R#2vvJymoMdYcPW!ReC6M41b0NNLUjh#nDFhXb!4R4&EFk<0WBEC`er*fF zR7N`4a20raX#`Ps-9TxY#?RO0oUj6nLOTrL8Ce`*CvjLWEsU~c3GZTL9y2DiBI-Y{ z>sWM46fxI;@BlET8BaWsvmqU2?<)9@X>z)i%RFG$_Gc2If=tCsL}`@tMPimkpo%St ztU!HKB_SrXQ{)Buvx`p}AHW@P)W;U0kNa5<=tMVNIuu&(#FD$~7Z>mDVRXt@4%gXBP zEZiA_K0R#%cCSVR6g}b+igKVajYF zWic9r!%o#eGQL$r)IRkzX8m)qz zb{FQ5PC6{mT4mTY6AwuU))pogLs2Z#HU1t?MQQ1|MFNopB4n_vSmb_KolYsT%-`$M)$g&BZP?}se+Yb{6&?=L%|$yR?QVNSoCxk(={i(eo8iAsC zLPIzel<$q`J4wtfrVpr)GEv#)St9==Z9(}ic^)Z0R~$#0UG?sQ^2?$KSuTTEAeQKzu~1mR?=E!1Sm(L;$OEfe)_E@CM*icnw;vLn zId$iin*A}xDcclxCv+oJY_dDAFy!;57~>X3tLGgk8CK6bKu-H%nseeHKzBTQa9GnE zBQ$#+a;C({)Y#K%dt#FYpvl=*i!CiFZJZ9elYz6)^KZA15#Y`xW>Bu(J zM8$9WZ24jc60;`Ws zX1E;5fA~50Bdvl|M9c4s(P}67>t+=}?a^5pe85+8Ty`6p1X(EmCqA!0Zr40h)ggeM z?t9G6u&tGJ9%GPzK_L>p~{v} zAEXcZ$N_y+6A%XC7^DS1c*P7fHz*`aZ113Ng3>}NXC!zb%9bbtY&VK?E*wQ06&3L> zdm3U>4vPv*Fl8agSnLCEbe~d>{OrUL%!1u!B;x=2N|_1C?{*qd6HdsGFr@H-7-_w1 zJ1sO(Se^gn*clr4maDL#5ZTQ|BE++8qd>Q{h!z-FuK2baJJQI|p;|1A>bB~1d|`AB zn+?kl;O3K^i1n(3eTYL%k&!FNFaj0PJLVneK*{Y-Lh1v{?}|`mxJwCWldTfPILFMR zW)^M2>e6{WXNdsDEzky|U zHi>$(h$tzkK)SbizVZQc@Stav5)%nryqBA8Bh?QYY$MKJx8 z@00}}R;$~?{41_>=4pBNIk#?4*)#?VANPQO$WMWmX!A~ByL*~%@p{y zRNaLGD?&nY*byGE^bek*YS1ma!AQh^@-mVu@Y~KTt2Qd3w4RXj9A0sV)>bHl{*a)i z0DM7eB{gieD*ReLPQ}R*M26tiwxQ*JkNB?+haiA_XeCPl{NfG#Tsmh1fhhJv2KlwW z#ud@+zs8new?7Jd;;?3p8;Z(sM)m*#b>&0$ zYF?YX2hddWIw=o4hA*VWyaQH6R|hg`jfCKp-B~!*dNi%69pk1*k26s^IZgHp>;53} zE!CGQVD2RVStLvqA>Gud2r1u^&KDsAUI@z)VYEUWJs_w!6gi1d2~ksN1ve@XuawQv zHWg9|>QR4>_b>Pk(kc=Yl7NIl5>kb@1q%hm3o1$gVTqY7M2Z1ccqL*C+De%}@m2Ei zfB?*h|IJH9|1KdC94e1VwVabHi02H$VR(&%I7rR3IB=oy^*GTSA#*dWdrB3z*%eIb z9I3^DoRx=51iSNW6~depmw{WsY?s_xuS?4>3qOn+nl>Ex3Cw^dB7OxJV11E$B2YI8 zDE^uVAI<`e+8+zk1r9~=SPln*X)a{%l^w4BRnVq=Ion(1fOY_|YB?^usc`Ct9dj&B zjH{UkEHIS_8k_`fWw3>cy|Dks!51t~8IaiQ*;7z9t#L!B>^!P|9JST4QT0S87R#YII0vEt%F{S!IZf46LL>CZlK7FIYfn(^Pd=RvarUJ~_Z zY?!4oU0_&XCto!qsIe31#Q3f3!Oct%&cws=|6vn9OLBq_JBaPt(VnQ-L6FWxs9}73 z)2MD1Eztr)PLxu44`7h>q{OVC2HIrHvrSRZ%Wj1e)r?Mi(v5WjrYCBHR4tHS!mJ1a zIPtI0I>f;@9!n=Cc|h_jcm^NpoeGE0O7LU9Y`;R0+>2Xny6P#N7awW&P#YtI2 zA&38Dg(t(|V=>sN7jxcpB0&HKlp!|!s*RjO5iqi2V$55}wY5mzl~wS93551kM6FC~ z$vRwKR=yHoA>{l>RP);BBj=OjEnd+Zc*k1`TVt482#r)^T7#YifCK^lAVIozI-ObY zWzA;Ec-?QI9c!(1!r8#ws8MNr!GfQ+g~hn(Loshh|7xvqM6lk?Dl*tV4pmd z!L*~SdBQ%0_ARoKilT;WPpKcElW$5F_`f#&9N>*0Org*66HzjcoO=ettFt5lD^d*7 zia7OL?QXaW{4X7WGp;QdaPTMQcyv_MMUSZW$?l@sXe~7XT@@v@Gu|Sp9PG$eaiz?5 z#f;jrw``t^jRXtZIo^ytB#fRUjldK_K;m2htBAHs8DH=@-va-OM=;3o*@s zAiM@4QgaHw0p%0O0O8Wc@(W>s7H;TFys_Yv-U)}C;F_q3x>{>?9Giw-+Vfu9zak@3RCt7k~ z53=TKQ~vuXB|4)uib$a)0RSZp%36=qMy+5Jv7fD^eWE<%<-oOx{Uz&NvBqjse(wyb zaC>cM8*S|cvb4@lk5p;>l`gXKmEGXZE0k^Y<-3kErde9~iHP`(1u3)gLcV|0Zm#hH z39N!)KUV?0okS(*TOdc*1qdDRFh@)y)-^iC2f7cBDctA}k*Ug3&Q3fkR>B{Y_NjEv zNb8=%wx|2r?lYGCt}gV;PIR7sQOy3n?8qAxL7y6|ysszZeFYp#58#??}*|Ts{R9KcQnU=5-Sz#rA&%}>G8aQ6m=-C=aA+rD? zi{}aVCR9nx&G2aP4vJe4a~y&?Ib_=8V}v3B6ieU(t859elyC^H3T5mMmUu3l|FD!| z;ofIJ9K`>E$t21;N$SZ)?W=-_UM{IQ*%G%uW-H#LTuX#eC zbD6*Bo=hzhihb(~mq;Kmb&Ks(>QmnxD=IAYDE1$Fkd|b{`H*`#cFj^1mR0+USjVTr zbPS&|B(_4t=DbP;0)?+eg|8A(o!dE^k_J6VWuiMcp#kxaB@+=L*=|9SFVWcat*|17 zyrbSjGNT00NsWUR0fKHw7MdXIR|6^F=eOia0cuk~`i&v(xFRwBOVmqDzXJOO(~{Q> zUQ8}H5DFf%1v{BQ+Kjr&ut*zZz2=mRb`=KF#MdFxdl$ zEKP)$6%kz`I9DyDSH$MQ<)n}9JFBGsvwUeY%k+x`0A_lnQ|5$B%Io!O<}C8DHNaj4 zh$s{ciz(HeR|6`<$_Lb@R9rs2fmUf{h7vyJBdfZ8{vdL({no9M8)P8DjHoYy_R>c1f@ycn*T`nz z+}|5TVe?9rFTCR0Cn%2(zsM@?oq&<3RR=;;L}>dnjKftwi9HxK{+^Pu;eVcYbZWyP zTaP#Tx4O=lzyGs#@y>hJtbNbe^?#lD`OiNmbo1x&n)VLpmit#O<0>$MZdO1|I5kNom^&wu`&`{SSd^UNQWY`;Bz-=_NSedJ^3$1hmZe8Vq( z)DbuSKTFE4Dt{tAc+cBj+p_kCnw87{aof75C*r3){No!BK7Gena?hE^UH|w*{JXsu zm!I{fy<-=iJNWxUel-z4`01@HTfcW%P3FQw9=z+JiTK|y|J&>L-2e8mN1p!K!tD=C z#FJnDZL;~Vr`LS_hS52RuT8|SdvN)wzy9Ffn)9Ff>Nk)3---CZ+2@~j^Y!nlIq;Id z^>6v)MEu!_=dOC~Coix0>xPk|uezQ3Zd@|F?thP~`M`G{T=w_}C*oy;doNiLJ7a9_ zga5p<_lAl10iR!TRO{yd9y{sOgC2-nJrVEtL-S=5dp3>Tx3vEYpTBe>{^~#f;O^Id z(85r-`VlT|NGU0dumR){6k;A_N89V!=H`jb-WFo$9 z*&`iK9C5|iAKr1<>c5>a5x=MH;P_>iyuD`hTSJeX+C35fug6}s^TvnXIrjZG7F_U) zQzzo5FIjWkUmw4|=EHYyTY7Q(MEu>WFZ$Mbzq?}Wbq_sTv8iby{*HTZUhfZGTJyup zy56?7ej@(nf?wZNc-EepcRu{)D;wey@oR3q^;geb{?3}!U893%t>*p4%#(B8ba74m z=8v`9zjPx0{P~d+@ueRr9r)#6 z&#U?6BS-w@-G?*&_YA%EhI#A8_CEBJ2hN={5&y)DnIq>N^Y)su*spKC@SutK72mr5 zlB;G9)@)vK+--NxoQQwwBX>28Hl1H{$fuXi_-D~XyfJh8qmkN+YL@=E@!8?XMErzj z9z5;XpIuS&{HuFDR`Tq4yx`Q!*Y5e?MPq+@?^T^&d3rp)ZPSVO{qcmW#=dpinqzMH z(|G*ys*~nEQ+(Z6?~e-yKKl50{ClgeIqvu0-7)sp_x@(ZPk%QaKV&AX_ z>%sR{{c1cu(0J4>8{d0jO~s0X8gG7NJbr24g0oIP=<2b<_S{~O_{n(u)JtBo@rqlv zj2*T3uk&X7a6CTu`i8AHEIMcGUAJy}=r7+LkH6~nFP;9!?z)<)OOmIT+&>qr1 z^Q_O^zjtTN{G(R=;3xNt$Itvl`(vMf-PJX-e)imT9~+}TAKYP9Tyw?PEsNg0^J909 z#~VI)^~3i)a`9Mg?{_}%lTVGuJ69k0`L8~*YwWz1cW*xW6XWrx-+1=p^#@%vcHmW~ zeeYAU-|KzF-caFykZ@6^Hr>{M`=DDxE>-z`YF&-~%KkU(8cJHlO z*uL>+#UB}u|KY2LZo2SmD{4Mnf6Ar*b=!D+`tZ)XfBB*D_^nM7YrnGmvat(0*4*`$o5tfG{lB9x+0}Nzn0N1eE9yTu9^bNM z^RA!WfAv^pMaOxoKQJEeIrJ@iK3slsP5QRR?{~a^JiegfP4`TE{OYl9uRXW-J?|Tj zpLh3)i|;t-jIn!uQZ{-J_v5z>d}d;6_t=uxrfNR+-tqWJZ~I02x`+3SU2x4we|t0c z-#P9LZ|ON=*I1_W@!yYff7hGe{)H39FB;3d^+Ox4=l;^)b{xL!(2K^tv9)&dW86RZ z{n9sm>&Cq`@zWk@>7)GDeW>Z~hnJl_c5&pf^laL*{R>;$pL_h8nq^brXE;QJe|yM*yL{P{!I zT=1qnV|RS*_4Ti1yarDm`SGUjUo-Z{tJdG}(5>TfbLj!6ZoOk~&2_z(KJ>K@kH*;lukRl_u=VTT zTL0Pc_=o@Y=Zdmy+ z-X}hI-j!b-kAE&byDPdX3chmjSn4;Yo!xuic>D)TAN|!u zhrPXKdDRJz-|ztV^trJIzx%l>$4;v}?qjhZfNx93Z(Mrc-kL2RuRi!a4~@q^{)Y76 z1$`IP-1FS-j_u&rC*FPeyT1MN^Ty74>cM-qgMSw<|JGG!zV@=3J05()b?^QCc>M1V zefNYb&fYuL`>A&7KE_-+Nj|8T57N@6X3iyW@(nb1o@9p=!fKyy3Rd)gPU;ckIba zW|dsrG7-O}c-_qxelSyW@lF4Dc+QrI_<M~|Hi9-bvpH5^~E1-dc);4 z7cTp0?6-Xr@e{X4Za-zs1vRICBJ$L{^hErK<33S5?+53Nb>49H@^_sx5&y=l4QuZ{ z>XNaA@Bho}`imyw558^9=>?z4)I1%3`|lR-orv!kdG|?=f93p|^BceRkCU#Sh(B@V zgI65%*DJ<;viGJB+<6o9KlA!Wul?vd#{RVR@~Vw@PQ**R5Bp>HUS2c*4axDjpPh&= zd+fG*uQ~dHnsz9JvHG3g(uwk8Fx0O=z;Il zJ@#DVamK&l(6Sr98aY1pnMdQx7q3{gxZ0fkW>cA7TzQr`BRw?OIXsfeWOkdr!QQ^X zJ}#2I?xHo7?DvD4uF>>vlSvH>ccwE#BdN}wzL8WnSG&#NP{vDoXO8q`l3o2NFZ*I> zI5oIFOqSj@(l@xhb09S!nTAF)-cYaS?s}7b{iz-=Gvp=v`-i%dnUq&K>UHhTq|!O5 zHu{?znm2ge{mIdE${QM_*1@5{s^r$KBdM*DXUAxYqNR~TBT23r1~YX-!@EtJ{%&5M zN@qrfcAKWr{!HI+|8Aq{JBJ3j93AZM+n(aWcA}y(UEys@rac;)@-o|!gVdMuhDZ7a zDA?Pc+HHDy)3x1q76)*DV{GO3Y4Mr+9H9vT?#PwgV}Hh#Oe zB^l!$u38v+e>5{>?~+^%Br|>8o!R>;dpR^RESqmx$8#I4k&o0xNk_l|!Y9P7G zG^GZbI8|0J+hwYEnYz}5-=6T={o2Nax66#2X@=87XPQ2m)0awjGB1Op{r#OIJR6kf zgPGLU)QC5s9vmkDAKv%287v!sJLQ+2ajoMh23@GTZBTS-JSAv(|8K>FrIYG6Jj)phuE} zTLpL*FXnCE;Lc=!A9<5J8yp?zVgz`ch4!uF)t5Y7HrV5hq>9iQDYSs z+5@5$=d`Teuq;NJ;gw3k+4Q!d(f%HWo(DjkVmxgXgzOz1?A9hq1_pgwivECNX=!2i z5D>5{W7?#_Bh7NTS%3QmEewOceS^cJ86$+IGt)PaVnmG)gZ^zp=}a*DJ%DI1t%9U$ zAOYSGb&a^EX)m>lj+^1sNLtPgO*@&mP8ks<1q88|L5uAjz|yZ{Y;Sv#kb-17W$%Ex z(SCQmsny@m1_*CUW!mMkO$LcM*PGrX zPa5T?PJYrmMuIVukuw!T*eg5K?q-CVlBDe(%9z@| zOfx4?jo(ecrox8_V5ZaFg7lpNo9@u(sXZ2b#EVr z^w>u^w{_V!ZONSgucS$ObsH0PCkli>o|E#ZGTqYb)wML&H#XF@2lT#Y2oO~Qkjy|5 zl7qXwO|1=0e(NdTiHTE$I(9TSoYaxXEvRmEBt0~;QOX=nf>;@|zM-wXp_x)ct^ti7 z1yQ!qAV4SCo$24Lv_3hqbyU!fAsf)Mzp23k8ii4v*_YYo!6m`&v$%zWO7T4&V+{9^ zOp_BgcQiImmkye`X=^tbdQ!bfXrKqh7=^hB(kksbwK9F0;GgtdhbT$nCR$vZYT#-* za;L2m&KRWkT;XP8vLBeDkw8ly5FkIoChF)Smq|Lb8>|74>OUJT9@|L#9!)eIt%cQ-LzOCDU^KE^-nO42r z7T!0edMQH5tO1Bq4)lYIu1>iURyZIKVFyj=4~b(m#F10)+Z&OoO#fQ6Dl1uF<;4msXW0U=TT?Qbyx09CzNyqpmiC8ySC9T`?z14Z+i7N)78HS#=b~z zMhDZQ!;XFQ(jTGz$Oy*DEI*{t?A|sqG&sby(qv)j$$nwByDbe*ia^Q%B4Iq?^8%m+Rm+=wgn576Cw)J!$B{#Gc_2910Z@pXk3=cG|2~3sUA%`gdF1} zhrFa&*4vZnXXuwWu?R*yQWfwuuLn{h!Vi2I>LvrP)G3|Ax%0D!JP^FGTxs8BAT=@L zsm@Wxvj?%I2UP3_h8g0%wEh{+0pk`~(n|+a->dT4PHN0)kpK!qj3l4UGD2}M;Fp+7 z$Tbon;6Ip_jw2QAPi33^x{i*f7f!mXmAM`o7?d_9ySwGI%eUt&3P7d0VLJ?Xrvt~d z5m~6Ad3|C_V!hBHM-ClT4^V}Mc5GTNQZ>A6eWEeJRd&jh=LmJOAa2WSZfOt8eMJi0 zF$zoT?E}cI9wchWRHUY*4b37!FLEtjq{Q#V+g!J;58+WI-k#JjJQPtLi8mJ>yZeWj zatFAhqLVr%n==%QkG|(OpQPlL_oJs?7Tx=Mf;zC^ha%Sqqh)|@mt+98eXhWVif1t>0>npKe9 zR0gzknsoVdjs)$sCfYk%o5f%f(3zbKh$?K9J1M;z!!wY`fpKZ0?WOSKs^D7qx-dlK zTOrq7s9izB{Eqe(#Ol^WQ=+*&PXM5eq6S)jD;+VX(P^eCAA4$PsJmvFa!S zoS3r08b!ZBVi4V4T9`rT4eokU@GPEYhg;}{43#vnLJcH~kE)=l{XN|X&_cLH#({OL zPwnjMPSqh+!>8z*kP1+$D{U5IUqB$SHWo%I=axI=B=%WgVHh3h^U%G3SS)yJ?7Pvy z?U-KR7PAyqx?4mhynsuf)ttE!zymtx50d>S&>Ih17aoxM642I z%MiMn|6WRNPi$$=%_GlL+p?OJmSdkaC0ZNmCMOMBX#!)D9WPt6>w&?XLx&bGU7e-{ z#_MPkylQA}Pi%lsp$c>e;R1l_92BVk)2u;h)s#261VMxPx zNiibxVIZ_zM=WL`E0KaiT(OPCRw{!w^|6kDVd(OOSdvbbc|AuoZH}po%(Y2nRGS8L z6QiCb%fi{=6(d6f(vGQp$TCe{2k;rvNuJS0WOqjxLUqxzVzjDtxv5<`cx@7kK<=BQ zcLMY%;NTEIu|y$%i{(l*7-^o%t#muox)nCFFI92!db%tP=XqXtdqwSW{XH2RP(6i2 zxw9GoK2u`>i}xXbSo3KXLc$cVP#Q_Q0|h6r(R#v&V1dlCqIG4PGHPJgp-T4slpZip?N?l)X8ETX^B;T3UdS=;^D4=bD5H>Py#~mqNZF7M znybn6o%lBfw*xtoUgpjyMo4VygIhJ18x^$#c>>%bKIxmL6C6R)JFJRg#kLr_M2Quq z7|Q{Z!^5ehcCNm)rO9EV=Ca8Zm>C*$)}1s>L?ldg_%@Kp0545BnM$~a3j83BVsC)? z`YxE^yob}^lQkM!P|}Jq3p48?(`*xo2|UyCdPZ?+s7opb!zR5E2`2};^4ei7$NDIQ z2AK<$_+@VNRRDw*#&YEMyt1^l`9+0@qUB}5ESoeK5a61&gmXx5@J-m;Ac;J)#;ZX6 zw~gx?=^pK8Cd106wAqfM44*hc;Bb8q5VpK7M@)%LoE#NWQg_-Lj%Te_e#1XmLnk+MkM3@p{?kZE@fYOyVtO!#og}O zkjjV$A)$%!wvlCI0Jp3e*e<`r80Kia{yJ$-l$Oo`^6pe{iF%3 z+ZJD#;{e&m1)@d1k zV5&{h=yabN%Y+bNN;F{xc*0;t2X7vgW;2LDH7LGnF~G_AnA@VpV6I$|o=&lXujqsy~j4RSf~wlYOYeq`Rv zZUEfWVZ0j=UsDSpklKMQxxXJ*mr3-eQ;8i0mp${Zj_UQJ!x+VfhRq411H)#?XnJHx zMlR6)^g^K1z&^!+qn<&!!;@WYnbffHw{F$5kT$(goe_7M-t21YPmyR~bP(sQLQjWY z4an`l2*YHbHgR@4W_TNa#%%;HJpVYnGHkyFl+LI3a&ocejuoObacSOV~@%h z7>8hiyP$$Y8MSo*I%lOuhOEc!4RW8BkPPeNT zcS(bEm+|TktkyEvqR292d5)UOFU1eX<=jfEZy;>l5{UM`ODv=Sgo$LJ3rH<=5qguH@>F)4dNp zPGX)6ssdCs#+&KvHzjA4;s)9 zB4RcxEiuAOM6l_XbHbg)7;Au(L9qorc(&2I%i*rMrk-1DK0byWm7-c);XLpJJC;LRim| zQ2-u!%J@A!4Fdya1mGGl{rW4mII-?`rne11ld9y@>Nm6{9IcsR`OlRws?=qb959>2 zbtPx zxEmOVec32U>?^$#AyF^dg(cfZbrO0a!mMbT`bfnuF_&6buyJfk1BDnWio{~nz1_X- zX1r{mgMEiAtZCY@W!kIF_N1bj6kE65h|M$I$4P#N`wZuFpWMp>Zso3z>B(#}13<_& z>oeBCz|Q{E;8vahLs+eY8_1nR&uM%S6i8E?*+VioS*CM%G`&r|VElsQ{DNYxP=W@# z?PV8HJ#sC;rPeMiR5<>5lI-fjr`xCQAS)>(`?rckdD{T);N%EN1VD(};mQ$UVi5tX z;Lcj&Y&TN!Jh^kL8AOB*5}>wdTUB^M1|LF^8QdC>uOZQX;jRFzgzbqvK*CDF7^hvy zRU2q4S%6(R2Sy8uRo@DEy84H@v}~f?+~ZCxkHDY$lUq|;#gw~>-+9%Gm#&nvo`~)o z%=8)=l%ZZ`q(@FRt`A5RgMe$9Feq@L*Hks|GYF3LanAt{G!nWdZcS6YblLJ1D_0$} z`q*SwH-ZloQX&hhSM*d7MQMLLxmx3XRxMsm3i(-C-D_5G(6FO=anh+6DFzrLf~&$| zfY9<#EI*E^HBpZvuDK4cq5}ny zk*H*_N-g^?oXMK8Z&E#1#am1$$AndWUq+WvBr4O2S+80S)(TmQFH6< z6+o~P3@`wUjVd zKrw4fGF=i=8pO?r`^nm)M6O7zf8q^4*2c~%)#yD9IX0{8V1k4O#6H#MA zHa;KiI6Rktx6|E z%oUEJEITL^@~Wy#Xrho@!V3x3f&xl}CnhS9>_k=zUDpzt!p*>N?abw!9kg=Yc^Im+Z%`;qwR<;F@O_{`CPxeOO7g2G5 zHetHa3p$?CivZU3W*1CXAirJG?y83lZc1jh387>W0Z_|q=#3z*4yc$r^~vT|drl5O zqelq=3lLr3W>qI>x(0OR!CN*+MN_LKi&%LPHTvnI*o$&*MWpE&%1G4#;Zi=M4<@4&X0!`$elKiya?^KPTUtk6b)7;(PIdLzyOm3o+Xr8Je1j| zG)$L4@Dw}_6K{4tduwLX(HYJ3E?vcVb+p$9=PJGE2F(Z$Lm3s*7r~<26^!eKhPL;m zV9ZItPcKzW1!q+NP>V-k*+PWhnldyn)IM1~l1`&oBdDsuCcF>4;(-AM6vK+#BW$}D zq{digquWiBzom1Nzai0C*V574zOH&#ul;kpB!lV0Sh8QM*FnUq$OeHh->El4!;lKa zFFl`NLt~rd+4{bnsNnP|*`G>x3!>{9kHEqXI>QSwSQ#4(rI&#b%e2S~^mTq6^F|AE zH^RN`osN5#8+UtV+_`8@nZ}gakTT1vm#wI(URkwlxwmxrnq@23EIYSVI3w>#OB>{_*I_43s6m0ew3$0E#h z^)5YD3hiFAtXj@pdKP&~?h#nJ&+IWx$?d6D%&sFn*uc}7!5%Jjl}+Eap`jizS21*W z!$${uM5C$K3y7RG)dCe_)7=hF%H9JVO zbBCnEqu%ZObaUVxQ&|9WMklucSZFY@JW$>en8JD>-GXAm>wqRK(X4?H)OMaU9%J=k zMUq(4Qaz9sf^KsSLfIEN&ZTKnDE$#JJRrIh9OM@Eihsn4h=h%qtivf3n1Zkw<#D0; z2yIGikLqcbd_qewP7!3no#?!p(UleZ`-`imja2 zT7i}Bda_||wq7g0=?KI0wJ|O%#EM?wWC$OIZ@5@*O}j}fd6lEAI}y1=goYk5ZA&y= zhg@qIi;VxihFMt$3ANSvqa3`NZU%yP1cad+Gh$*jB_wXB+bV1-Av>cGqFBE9C2P7IcH0$Dxsc*wF$xB)AE1cKanx=VVJCc17Sdpzi6OX&=jxnT918w08b}<0T ztccN*mc67gy{o~M`b5bR8j$-e949&+h}eOEn;kCe1=UCqXL?4?L^123)DWPZzm9nu z&Jh^gN+m3321^!bDp&aJl09aZ@NM^AFGbJN3sG`eD!5#Jvij{Zxy{vnO(l=ebE}pu zO>*>z-dnY-n(J!!++7E>5sO776hhIBi@*kfu~6}WV6{#jEAtdu>Exln|JG#-Mh(g`gL& zqi2))hi(XPJi|We=P*a!n<*_7CgKT6vB~_(F(ulGv zigliNN#n8$90PE%&_X^$lPbH!AuO0#4w_yi{_LPbrlEPk;>C*>dKeYNPZ&f~OO4c> zpSCjH$f`82t)rIZYb5Fa*5{0|e}I_4M0IJj!~($m&_lntCD52m1sQr(TFXP%p%gZJ(ga*fdn` zuEZ>ApNVNyuP{mKnUMBn1oPT!Yje=+O_+)F!Yb%`nU&P-ZEEW>vgfcUyQv9}3t3f^M-LeXVO5aQfG5|V9= zFzyyNNjlYLU%8^;DY}MMqFWl;6P>10!^JyAco26RRtlh1G`CY3nCkRtrV9|XPBmFF zjO;gg5vGk~G^a{@#A)VK{+q@`eS1|?OAfXX<=C_d?QgxO$Y=cKQ?lY>h}>DZNjw_T z3X#2Yge;RE0S`A;D^$+f9;{^31PtejLHh`y3^bH!UpM;ng>hlMN>iKHQXlFwCNSyA zYOE~=hrH(4O$u3(yB!RWW!jT)<%Z^}mQ9IPAOAVXCXowv$x2(oZ-q`Go!fwInmjpq z6CVDCDq9-49T979+O)o*)%f+aM4^u`XruUS++sOp%*d1!X$8m1G;$q2vjHSe=rVN4 zih7eXII#3F*zggeJXK!>x2>5MyMtu_tWLfk$WkNY}RkK zV18xg;>sQ*i}{OqzR)}894U}rVQra_1w34|^l0m~T#%o~=2*DURWIm9x$~{8s)LYi zkvL9t-4|}mZA|n@LNYowS$YSqJ5coij!mYmIoWJZlAll;)y$^3#q;aL!C{F^V~fAO z6B3nZZj)!|(foSKEhJdo)Fw9Yy9iA8Ha4tZpWxcEvfx&h&@e^y66v8N%SP@Pueqbi zY-%#CU`~_qoAMo9vVK!NS`O1yiO=(H>1$eR(uq0}rl*xVpuY zt;FBd`gJE_cQQ*A<2dZAEuOxGvs8rx6VB=4IOO5_tpEM$!dqiAH7uHsT@ zeA`B!h?UMdq!CTI!KUN{URX@bSz2JIuFhYdpnzIhA*;$viyXo()+Zza3DjQ?1K_H? zQ&ut56Nv;F^VgfUQvi%6=oP_9bw&u5sjaOQ-rA{;d~-aNuCex{P#w^aaM&2}sn8lU z^?=smuR^9IVzo*gkLfs>*Tu!mghm!OHAt=_$C;|*R zPi03MI8+NDJxRs1D=ZhxR}wmZ5vn2oQTI44TpOV1lw86|0}WD<+iI3v%5({;HG5X; zba>V-Pb>{+wj@FK9hz?`#unY&Lz_@pIp1?Jyz{rr_w-LFl`YM-($msh-fY&+`BUhE zp!TB5o}-tpUg#wnX_?}Bg7Pde3i=@Qunw4(71D$FFL2jMr3>=<02R+`MR?D&i6?13 z1GdI430L^R<7jnt^|3DOU^S{z?`rXH=ug#Z zbs^Muu%ieRqtkEQux{zHV?sh8vPMg5XB#YN-HPgCSA{Rs>5zRaeu&LJ%u0|EicyaYP}PY%5KDqrago$L9>o zSC@jCr6tuGwg&AHEc7kQniB51H`m$~Xp4qH3kRX^QNR{Dbn7t=jcrf1h!a{^hAYJY1g_UrOI?%Z=c0Y6fGwVX&N)g=76>LR zJm;MG-eku`ehTeNHha(|)vp31QuC5Ubitay8?_)XD=k{O@VM$=q$t4-P@cr_Lgh(I zYmN)hJ&;P~D~9f)u3)m75=|^CZD(4m&H9t%SJ2_)mevy!t)1-~g=*_7$6TkpkkpAS zn_7kRw{LXWo0@#4MDUJ6UC!KRu3W!f5*)j1+4AMbEUR9=YW2z$#~ibAbvDl?0l z%?<5sZ&8i)5kYVL1 zx{Ik^5BeXT!y!;W5CJ}4n3^m@g`$i%56#EPP$IoJAAm}5li+060^oU(`lc3%)U$}? zWdpFdMG`y&c!}XwQi!IsNO--|Ru%~mx@+)76bc5rJH9Ya4BZz)$>Bvv$!rI=FMfkG zyI}rK6#Ds#=7-`J2C6)XP5K?+#JXxgAiMBAh`>Y1!*P)F2Bjb{RERBucW1JZ)Yib? zgLMujtedx~AT%j0OI}$tq2>-!+WZ0BKq~CgRb+i}?OKGF_@%6S+vae4#O!zaz!nrV zhE8eAr|+-6$_7V;f}PlD=sjA8YDM(isrF)-4JKk=xcV}{cxiyh0$$9gw;-HJ^n9J$ zun7(fa%{wiE$w2y0CwHW+#sn1f-4HPD)9%j!y(hsg<1bszRHqyicO~uc$2Fl&`@il z1^Lx2r3blTYBbg!$r4yM9f1-TBzJ0D^`iL! zVGfqb@0h>P%vdP8DT}5ZoMC&aZ1WbpQ~}M>5rhrhO=^l$XYEFn{Y#VJ>VGWueE zwOY*LZ>g+X}|JEVD2$@?_iP$;8kmEjj-9|2fo75kjE3wGDw`6@>qHQxd_ z`)sCD3;fy^_VBWAtjMPOZ@LJL`HK6^g!6>UAY4&G507#YGkt^8mMH@+fy}zHK*Sa& z?^38@R$c=F^VYO&5Y)5Ei1QHTv`5Ar8;H|!a$Zd8GkkRFOJRGoecE@Edl-<}Tz>Z= zfDvro91x#{Sv>PzY(5o0g>YsQI%~O$D?)k*n)DJVf7qn?k_mc86|Z=+ETw;AXQesP zfn^wPH~D_C3}*nlxey_9s>DjiTT}Vy(5GO@&pyfZq=b-Gr3vuQ+wDWdRHxZ{hDPyD zS|eT0BqN>}`)CKPVOyjM*_bk1lkWnyoq1M8IhU%kTkI=lf&M!8Ae@>1`egDtKO&ge zxEMUhP4BdSG=U*+N(N160~cWT)4z80I;u5&8Y?bnX^#GB8$wA(jWi-xmWI4<#$Vb85lu1mFShC+9CrdkS4M=**vG3 zQWwSX^OP;<%md+&yv*R@rqfPWNOMZD*ad`g(EfiCW4YWg^kJmqDzVjWMuGgo9Ur zxmcU?A5w~YuU2OUQg^u^ZnkQuw@O+%V&{z4o&>)Tqv)L2!A@5B-d-<2$)!0+Xwlkj z65$B${;4*?$6kb%1@taw?|a!LJ0P9;a+|1`R?S+tPMs%{nmY|ae1%ExOKL7+W`1j( zLqq-G;6Q7WcrXJ)LU6VQ1*0`#FloitB0dd|y`^;Xabm(#1VoHt&((NTPZlU@T`uqqsw&Sc@{Eu}&m8Z0Mojx=(F}fGRnFNQb<|M;s-dX? z{Nm9J`?V@#dS*n*jY*q=LSwd?NbGQPmMJJQW``*#HRdE!K*}>s!2!l}8&hJ;5QmA5 z&M@TK#ZeyF!mlalHIaxhDHDkvZW8<+U^Y$*bB`ZMIY!{|i5llQ zqT-U$8D%qP9dKazs}4GN_93r+&74DDJNK~H9e#v2uj2JbR{q!g1q+WldQsKlCE4QF ztgTshT>N-j%hqjuXKe2uAY69GNIEmR^UPhl&pP#ur@g83^nJfS`)PwCzv0GrzvsR0d;bSMc+-b&zU9{2KKzl} z@A&AQcm2=DKK_YMe(KYox%;!98~gnK-t&boe(ByXf90!R`}#M&`K|lDegAhJ`0n=} z{QeJq_@f^`^pl@H{If@X{)=Be`m106=C{B5{r~;pvB&>7KJmn#o_y-he|h?^&;0H0 z|9JMfe?HF~$UH>kpZv)G|7L98$?-0kr@~lagnv=~$$9d1~B_h5$pMW^|bJjd?= zUiqt-=1&Va{y+Q|DTqZ2jsJ^ZN6M}*BtqKm8f?97;vTJIvwQ1lC3qTt>jq5UjXsiu z#6qxpuwRRFPuv~iOR5(q9B`j#ZIxS`Yg_6XJFMD9)Kjb9dP+l^(9kx2b3$#*Ha@0- zn2wfqd4VZeBX!v5q0KtX?J_{|zI?<5x2t&6c^)qHv>xf!Q`~N$yixD6wX)YH+D}d-XwybA%UVSo!0H25hr6gf z&NFCrX<`6aKZ-M$T0>{6IP%5Gs_t;c%nFp2p3)r~DPji;@2veyfR(JQ>h5B0PWDe} zgP$}jPjSHpsz_;+2M+b71RRg;AAPrkGA}ZWrnb{m+yK_|8-#n;wYIdi1$7c5~=!qd?PQ?cv><6pyQbBM4 z-t)GO=2{7WORU$h2j;VRgNcB^!~wzxHJ;*P-i&|2A0lNpMWZGPAulxt zK*DF6*O){3_c}8V*?*x~Y^u#lv&yVBe1*u=LCJ~5Fq_RA`1d9_K+5!)A^5@B`tL2~ zt>yxAiMiZdWv({Ynj6jg%&q35=9A_#{QI2wyt&tW)!c6$G(R>!HIJA_&Esam{F#5x zm}gBaQW`lhatQzCMh=U3k@=CMBg-PIBkLngk(NkD8z*i(VSNB6>An zg#4e!BV|`dii-;iilBi-#j&EI;^J6Iw5YJ4AU30*xTv&%>(bJK;#jnxps1`UT3lFI zS~R1eC>kr~f?S0&iVBMh3X93eMXZ=iGfN97fO82Y6%~`Hw6L%!R!}-C8Z9U)Dk*%` z%;HjtqlAJ22yaPIL1|%0K}=Fna6&w#yloxxbt82Z1y~^=i|*E^&Bzda)#+o==~n^gq}_0Pxc&r z(w@to;tVq=`Ln$*c-o%5zu5Ef&v1@X)ZaMo;rw@bj!^IqIU_<0nNgE59_L^yY0z@mw1JY@$=di=J`pKf_|5Cr z8jc5$MC9+!5t{R{-yU!-*CG^cy4RS0a`XF`@xM&^|Bg!guI0Fn<9d!8IBw*4H^+N8 z-plbmj`wqXfa8N4H*tK3<7SRqIBw+-)+uFufn&O|zR2@0anOLgvbdeLEE;aU%rRYA zU*Y*zIljh`+b(XWElb+aJ~QhA)B{e~y%0RCM5GWBzoqF^fBZDvqNLHs%wvnTTrS7OqQ=H>RITk2u>IO{$~^!?gdl+SSm z#~)T2vzm4vMqTft{QGAb(?}aX&e(3I+?f zFJAo2wtEp31f*EOf})~gS1erYz4wZOiV7%*yM5O(TG@LiyC9> zy=yEO8%lehv%442Z!qtDfA9U?KX2#G-7|B}oH=u*?#%3tTmv+aS0KKtpuYs1fGo`+ zTMT$4b|;Dje*yaHkYhaV{WvV_sVYR5f%^pU6+jx&;Ag{qDg6EFLC27-iW|`cgc|`n z5cVqK>WXy6yFyOnVI9PA8}#SvVLSy+{P~@noSh34aB*>U zb#p6N(B0j`!_(8tt5BiBg^Ls^TC`ZP;>EqaeSAukC|R;psnVr=ean<7Th`C7T)Fb) zD^&3JuUN5CrOK590(e75wQAL?*QimmX02MaYdZ%?L1f#WCLF6*LB)uL{DpA;rZb*0 z0dv(?G($RPC})2F(uaimkT(^hB2)-X4Z`|-3x&=_B_I^!{B@u#DECA)PLND0Y3SK( z3F*R7;Av$a?$d>u*U6=zXW^2*{!l;Zoeti(0ThL0OQcHkA4u96K&&4BVy&F=ZNZP?m*@ID$(w$91InK4G)5 z#pUa3E9p1|6ps1@Ko&NEE?Tk@mjf7QFoT7cgo;|sJBYbEQ;=`g6+|vULC)+SL;#qW z!FCj+C=}E#h&kwf_}83CL8fetlN|E|IkyV}E6K%$Y=`0DcL!8=VejeG=zVd20Q(U3 zFW5)0k71vnL`;z!wY_f0L8LSh4tM`x$OsR!s8Vy}hP({rA4uO7sDKKP6bFl|5z2z< zTni~Ru3;z_8i?bkg6(SP(6W?lYuVui#amGuw!=~5B63w{gW|>4z7~etNFLE1uyt_u zm2@QjW}_X>0|Ao}xXZcX_P~%D$gwCok|z<`9sN3vz1Nf#vR6au?%@G!+PQ{5SQcg3(NnK}2aNaPk$Fe^&b zv>is|Mz)_YWsaLAIX1b0QfNx1i>4Mb-QGr$A0xwcyjf&s1{kH*F4Pt@R6eX)FmwOS z%$Fb|EEPe_B~TWVfz(bwAtgZ>Hye%$$b?c{e&MJw7)mW2V$I5~$4G#$k5iT#8?+d2 zvByd1LCSDJVouldqFYl?ZP-y7Qu`r}WH?IaX>EueXG+uC6y44@9U3f$S~Ev-oFzG< zJ;H-rR>r?YZ^`LKoO-F^Hp|l=!({ZF3s7S20KSd1uY=u%-qR2G;mGBAkPRD9sS^B4 zLeZr`>jOdTxB%d8`XL`tz8fH2_HesVgqH*NBA-FKri#Ix6SUeUPG)YjemmR(Xw9W`;hT&Vr1{N9yU_F7!B z_?S;d6bQ90oLo^U)+EF-&wt9?cKtqG)~s;R0TpI+o#Yfys&1arqe4SFcPrOvWAlz( z7K~czvZzJxFP4wW+p1-cnelDfZm3rxXx2Eg{W)K9tfmkKOhclP9ti^=+>m1!fnmNG z*)s>~txq4(3>0rvKDE8@ut{A}%t5zBDq6(6ES4hp{l{f-vZ{)^ zr?r4fK{pS_LeA(j%}aI7n?IjsOnVx`sht1lK^?$MvgY*60RvwoPZ6&oh5!G(ioG8l z>n+eUcF2B53D+;<9!RzgizLVLcIw>k_D~3MA0gW3PWj(rY{^R`$8UOOre~&8W@cta zMn-z-+e}K&q|^+;lz0ZEz0JTweR^72T6%hFMp{}XV9F#Arl)6QAV_)!9F&>yCN=dH zQ98jdErVXCWv1honUVSWRa$0hYGx*8E5HD}GAQ+J%GVVrW~M?Q{X!BTT-w`IPEBS; zDt_syscHCuF()nk1%yFdh=HX?ic{ZaWTd`CYQYbQMevN*DR0385v0B4G$FdTZ{B96 zWTvGMCyRf;LMN$j(^yw7I#(xoC)+h!vNVA4{ezc z3(~UEjLT9@JF5nZV6hO>d}Y)?b-7x~!lse55PpVX(zDc9F)+FP4^f6F5h6m=BzLhx z9Fbr!b-|`A2Gx=X7k^@Utf>?!eJ@>>O3E$dMRI`B_{4 z-{(IE)1^60KTMP^q$@~Ogz`e+w6&$SbOeuI9WkGrDs#^^tCblr_k(V)>D^>6N-#E*lpT2t+b^y?%!)WwK^6* zOC!^4(^^@M!*8c{T=ze&`N7S;ziU-N-^$Wg|2H593!4U(VK99Gsk)2(ZfIjHzA#MP z#L~pl5yr*hVOa{d6QH7&;^4c=vIXV`-DKcF zyJfGXn&pV)s3pmA(9*%u)Y9AXE6g!VC(Cb^&XzNlJC^R2f$$k**=jk2dl$=2%a4|y zEI(VKER!s!ErTt8Tb@~NSY}wdS$0`&T6SBuS^l&Px6HFVuspFOTc%iMTb^6?TV7aR zT3%UFEC(!SEw3#JmN%BSmXnrymNZMMWwM2=n4`C5U{+nV?y)T7Sq1CYmP|`N>oQAT zt76rx7Hb~sAC}9Oa~4PIHOqNReyfMo%Ua0lX)SCmVBKu_%2M2#*IL3_%39i5#_DVJ zvzE1%xB6SFS}R&BSu0xutkta5tu?GCEQywVmQ$9R)+*L|*2dO$7>Op48A_g4%&$g)kUxs{ezl;%01-t-J5d)RV z7_L>p#6UHDL8T_A9|u}qePx%aOQlj(gGKC_1Af~TaT29Ag zJ>MqlF-N0R8*;XSlw)-o3rd7lWFmd8qAMio4wFQ^V1Cu{xtEAlSb|xN<(E$&xxsac z9?Nxbxk+_Ipx_0~3L+5tdWfqffHEwqdm&2r@XYD zx2}4B5{Ohen>D#G*7A)qpM*Nb?R*kqPQq9t6ggGygX1r5PgtvCLE8ZEON<(l(4WMD ze+;1J&`A=eD%a^T*lAnCudN==@QFnz?u9Zieq(O&xu)hm%8fzGG6y3TH}pd8NMS9# ztZAaI_?=Eu9*oRbL&MOMcc#KRodbH-oscjdQ-@v{O>#`7krU;>lSC=q%{9dfJyMb` z{W|nW%*6>kc@ko1pwrYvm_W2U{-UC;(ayRrbL#;*zPsxGFR_V76QMes2c^BUu6aVc z*#pb{r%_U(F3r?LUQWp(>JKam2ZUcNcrc$``sFom8c2CZj z<>rWbflkLhWgs=*v+0(BN=1xKb-m<43zQdAhWYi_3ZRbOLe6!Di*wQgsq+He04xTE zkT;~_auN#5Jj-Gnz*2kYF79>QAho+GwSaVEv*bv^6l8Ts?g7JFrJCq1dp(R|xjv4? z1}Wy)9@tyJGCU2EXG_g9-x7TKL-wX7RkrLMsS~Dp?YucZd7NT*7lX@Nmo8M7pJgel zOFm5RBaPHVLpnp>9J`S(tbtg_!*@gO&jB}qT?AP?AfFdXa2vQ|Av=dlGD}0Yz$`XvLtjk4IMlvs#bCu2&vmv0gc!nf5X6(e&JuZU$V2UU?+NDNUjh!Ur|p;A`if zWR_zt#V>TK&$B49r8B~0|BI}?K%f*Sk>M7CO{Ig3Z=gU~Sf_z~v1;jyY z0J4`U-ADIli0joW*aFz3_8R}i=r!^spU7v{ZXS=81qI{p(#@=Jm(hM-rb4i+vlqz2 zwmvTboy}j!LuYU~j8?gns81zz*d1Z7!tW~XhfzB&!34qHhCGvy{u$U3 zbQN{uhF+#_0K+=-)G3&@Dr)`+GYP8X>G3@?{!L#FJe^>IWJ&r4fU>-i`&r*8^HE0=E|+Htq;r0xb%|CBWYuJ+l{} zmazQa4gXzqx)SjBgv*P1!(9OqdgzvUIO_bErxB+BWN>#!I_JZ1OCyM9OM}HM^KQ6; z#r*f&cK`o(|39gLASn(d^= zi;In-kWxq~tCUxKL0;GD*ZmQGqT*qb_4A+~f z=shP79xu3NNh@rVoGlO zJ}eEVX@~N?vO~$#)0ZJq#al6lenra8P=K^o{36}}Zl?uEc8yG?c=6nn{y*g}B+iNM zA~$L3ORFhCPLL0YTjU^}QPzkvik)w6VRCBc!>KWJn}iav1{;-cC_C_U**jNBCyHrE z`((_owEvep%T2QP^R9xlL#Zelh?>$^swG_)SY4GSDr2=?+E~pWBV#VRhPH1ifzqN} z^K6mA`Lak!m4l>>B2``^_KRT6C=vCf3donfX!Rq}idRRBoO^ksJSY*I5)0b74{NE6 zn5c}?oMCq;;}w>6G-e;VV*7SW(G~F)7h|Y`v|rd@7b%MrMW^`zrQkGT4pg_OB_vl! zzeuUC@&8&q#krRVFiVm{}c@=FEe~GWfHhG6~U({1K zt8P*{^v1gTu(ldVx#d1<%30!nPJ_YA_^&73MSD5&BpQCB| z>;H$P0XJP!QF6}u%JF+^Rn@9!568+}U%8A_l6L+}+PJ)IgqFwVT3`M2oH}l%VTa-_ zv4#@`n|erFfOMC3i1mtx#F`!|wu_z0>i;@zf6({xBBg-R1?Gt;DU~!!w}lEzB~aGJ zK-NWyic)kJTL(X^sUU2tWLdZ5nzjI>>Kl~29m*8U!nPG;73aRg#37vy{w|D^nNYjhxF=dg6Z}YP-<~ME*8` zAr>bAI%4Gj1fNCZ}>l~924y@`@pe16QeMy&AsQ% zO`09b4U}_3lU>xh;;!(5c_y|Af5}^T;{}zvD)&L<@PbM`j1vO%wAGVFp|l>8r{-E7 z?&;5A?e%`}p8g*s-9t>Z%v_sGs8@P#&*lC{aTw|QlPZGdftp`CA}_=^bP-H9wT`%o zmtu~h-R>ZFlsm~E)?XOP+I%rVsr)Y^kuq9Cp-~^aeliPdI=Sm@6<*M}hY?Y3`dckV zq0EoOlU6^>F$~C6A3;(h%<=_ERm4r@Pw{E4{7#}I4ODnl{HzGZ49gn9qlReNRced% zGl9X(Amw+nt!*m)P=?5#p=>(Sbx}`oR!%E}l@E=VRFo_(EedEqMh!VB&cNr4a#(pK zhSF+vwXA{L$Ks+IEvw3PQ4lj~iqcAis%@~ryE;l4haQ4`)7%T~!OREOhJv}a>SZK< zVbBgGH_1ou$u}qp4OGf%`=E^z7zs-1=i-FugVG)(X?UHT{0+(}QBYc= z{Hi$M*`*=fLzuxzCGoKclxk27+7I`5+K!a01JoKl(g1LIgq}P|^3|$I_y8+ekfQx! zh*&Rvz}j77Dk?R>^J!CI(oHs^~k$e0g>|J2GHSodbJt+`! z6~n0ZW6{pk3-{!_QRosz)OGO`eHn9h&8Y>JqBIe{cpgJJfh=x#N^Fc*(^%>a zSW#$2Z&a3i3?w&FcMOz@!cT1rV1lGzfw?QGvq+aCu?q2&X2{d!FU8+9Po6JFi>;U` zZH-ynYoeHH#WQ++8i5g3w$wH)K{+TIDNi7Kb!j~nRU;`|_KWf*xu<*sFUMIi2D2&; zkeUt3YZ0XIOu}Qt-bB|c^i4fQKlKyQSeJZ<%zb2E(FSu1m^Fp2S>L>~L{a*SP;eQH zI3p4Mg#5K^731lM7zo*eBn#-a$nBKz)K1w7w^b>Rxzh$zL9H$&;KinF$%CX#c*&`V zI#_;!`H<>bkkkdw!V#i7v^5%~v#qjKZVNuF*9bKTa}XPpk5$$y=W_?@Kvi)cgV_i} zx=%z0ylfYb=X-r5CG}CONPi0tXbYbzr_WGwH)7p4NODliAsj)TASo~0*fk>-WA@=W zaxYuDd6>m{seFmov6^dZF=O3UU5=TSWiT~SI?>XKC783Qt!wKlW>Q$M^PrdP(#iRv zC~2akSc(~s`D!aIJ6}3u-nOUQmAYa+uM_z}5?_Q}tacC`#Uk}F*4dhf+3FOe$37ly zEV_v$;+D8ch1F`Z=Z-iLx`w z)Gb;8o%PT-U%G1r^gP@tqC{!cN$sZPht75(MlNA>wCd1V4G}By2uHl8SwSnW{VYDB zXtk^~LUp8LYMh9{PJ||E1bIs3sG&3o^FWQ&>Edf;hH%w)Xk_cGk@QUYR6J5P(`RBQ zWvH2Iy1E5(@l{2d+D5*Hy&K)=fH+5AVYc!iwNX~0gtbzdiy!e)>aWTt^3Pa}X)j(- zFC~$-(RNA@n?(rb_4*S|?VxX{FLv3y!aUVF%-p04K!gnD_Uh?s@t9Fsp%lf;^lD{^Qk<44vlTzgC!U~Ek`MN7e5?d2R_x!XsEnWrN@b-41t^uJ zFeRS|Rq~5cnEl(VI4I%r3al@dra4$2au#)^?`e~AUpHUM#@+tkUf-uZS!45udROTR zYnVS&Hg*@^W7Syf6|%hJmlJD zsvoIy)K_Y_I!&FR#;GUOQ|bvdT>Dc!1Io$jHg&K1bq)^MvHYKacB;Rqd(_?PLG@>K zm->ymUHw-5PR)QWQk8%lQtVJIYJ&Qux)FX!>i6nCHBoia+G=gIJ2|NCDmk_C@A3{+ z4Lw@)`!IDFzPBK&QL4MvMm0=V+&|1Gua+lAPJEd5U2Ml(I5z{oXKDkrqiH&;L27-q zwQ5x#E2FiA>U6ae>_}~@x)6r{JHh3Ny=JZ`KWv7YCJJf!9oW{0X|y(4>#g=yM`@#Q zzoQP+R;tz1I;QEZrYKY4HxOLef2wZT_oX@l^eM_EgiTQlsEW#_j4uBrK%Tmb{pv#Y zYw9(XsjF$#v@z-!bt0rV3-?`RqB>q33*P0_mRd`#sct4{6Et_ND@wg#x@v{gLP)C> z?ym1>wgX%Ru$wL<7rkX`x5zu;vi(0n$Onq+e_&^-v(*0Yab0G*2xguwf3M(LD_FE6hQd<1i;+PGUil&1ozToWme5H**6^8dqR= zLE)xpZef|uFxSyt+}6!8ynA*p%RI#3@)8CBe_<2MBS^vvE`~h6VLJeC3wW-ZXXs4Q zVR^eVf79RvR{CCI!S*GVo`iUXMIIRge#``zhPNj_g~6^z-6+B^#v)K2Ec9#QEtX5} z!(7&lBf3mSk%F%1jlPJIiiMO^$ihoKy!gasFP4K1!!i~S*~SGO19uJ1c+heX7cop= zb3r$DSN5Hkx!yN!S)ty?@K+lyV)M28I~4pVTnNS!T^)9aV=>4B^6|#vt5{%q08<2y z=7uhdqC+$w{^xBEd-2%oqni?#3@IT>!SExsFBa9xh|;EENgnIQ2<<2Qa`0ila;Cci zmXs>NR2F$*s_KTfkMJfI-lS49%hbXmcP%W%*N15UQxAq0wrsjd!v-rhfiQK%1$|2; zZ>nU&3t0Pzm$mkyY#xQ-MNKZ5f54oAG0NsKY<{?dQuYufinoMt5y^vvyNl$eYpa;B zn==^pm(GWr_FGvb6Z90S`I=adcQ!^(yd4(A+z&!QPV1MnH&zWDz3NWzh~I9Yla zzP*hTeg_dn{*0H!5pNIJ&ah+Q?w-Rv{XO>_xO%c=Jc_9E!@nHd9iz=>1LSi zmK<)T!3iXd8VBQTq9Eg4v{rblXe1Eh7>O$-5<0*;#x6*A0PZ7kXIRG8aXe2^o;(f? zR;vY{^Uy!0!Q)cn{U5v`%U9&c!F}~lJL8xNd^XC2YvUy`f+XI_zq^F|`=?LlyAG-&^?O zWi>n}<4rm9UK{V7!QUq`WMnK3mcn6vI4&Ni*9{sxl0PjS9vO+OijInjA=?emm9k)7 zqHG@3JHJ}lRjK8niXy5ER)ZiG-&^4oRT)vGBC4t=Nt59hf_oh9c#Ug2{Cy>qxB(;- zXThI>k}#0A&_ty0FSo^rfzz%4{kVN}ASMUI5i_4H4i`K;pip=;8UOHsScHkvN zu2uXtdK}(B2aT#nOtxKsMKV%@d+9eO=kHKWK6S^dF=ldWz|EHe3u#g~%rmmh&XgSU zec`5~^mu?<3qQ1Zw(X1?Yw|PWI?TA|WIK=hWy_g@M!+94ldvMwP;QmkHnWLbKeJJ0 z)6C|X9kBMkH**HMw;o~z=62g;wxq`yX_+<9bUqLbq)wO}`&!yB{VC;@TPWS+JaS1T zSUDh#mb+li{){|IN{}{5Ur9w|ADL}x#{VueON^4o$S>s-xwg_knXJrGRw?V04a!Dk zv$9qBPPwK$Qj(SD%1h;qQW7J-nrdyemD&MMA&b2=BLsZFfTJFXYQi=;<{8&E-kl`mxuyVLurlVBsZ65D%})c zxwqU@X(Km9E7UNvx>8H&rPNiXD>2GJr6RRd@+p1r9Qlj#lk!lhm>HbeE^~fnENPhW zekk}eNJH>(qkGZ}d9M76{7NpabW%1cmz7h}btPS?pf<#_*b0oe*J5q$D|M%ONY&IP zm}NMvUR1BBs(c4C%qePKwJV;sNjr$|Ka3HMT7Jz{^T4`6No}3FUQJT(sgKmB>ffMG zg6o=ET&trUS6{1cS_!S7_ChU$NYmPqYMWi?&JoR{K)>LHkuN_ELMJrD;#Jr`lUBRZGWbF}PA)Ko?@~O1W$0F1AHAyqU`<+#7uZcCF>d{6cZe zVvf-p3C%d20}cNlXl&vdXc6I&Xte1<)f?!1h6gKyalkxyZ?B!)9?frK86PX5wNMx{>R%WXG>DCC)<+5t z(Qq#^+_qI8$^11#y_MY#7@#eFp6n<&=0&p&K7g5N06yh2B|w=z*%r0AP^ zMBcdbwGdtQ1ZcMw!hD79q7Gu}*Ep&Lkc$+;F`BENZ!n^1Q z^J0wW-xI?^SRc5L;(ik2UMt{Epl<}aBe?g1{{js0Y`A~Z2}4`Z6o>xIUy0)AfHpq~Z!K@kI<4S13%!yLe0m@<3> z*x!_4F5u5y4ElM1r~!i9A&#D((7JXZsr ztPj5gRtXJQhCjnk@Er-J`2_GC6aEx1PWgkcz-%*GTMWG!UJLkV#LM*S0H;?l;LiaE zqqS%M^?(b4p5YBl@5Et|KKyNjZI1k~yT1hRlIscZ3HaLt8=&jlaBqe?7WL1L-vVHI z4)<56LsOT_j~XpGtGZ{{abTyJS1iR z8_!PsRVm|QG2_tU#Chk3J>9^0b$tA?B z01A%g56pWH4no}`Dd!wC<57;*gOU$ zBHP&s52%JBbfxoo^Y+gr8fD9_P5ZG)WHZlCf;N#nJ;!mt5_KFK(LZWf_yAqW`jG~D z`Ov=upGDLOZQRX0PR<`nqZSSGET$m8Ll=>d5ec;b0pb7J(Q;sgYi7jL-PE)CKZ=WE}3Q}Gst7W z%cx~B)C!959vl+m-9HSu5fg?qA&z#@Q6r;prh!@fSfi$dMupGL9sb;Vf1vq*OnX}s z1D%GAgrG4a!!b9+?Twiq*(J2Knc(ca$%@lBtSjs629sMBnzff*BHrmbc!_t6-j-%7!b~xm8XT_3O;)xRSgLH#h9Qx9DscdW zw{gCepZ+g7W_oe%Q)_f+;e&B5N(ee7w8jY3 z!EE99q(-9(WVH<~;ll+PU+LG|K)YKn*r=gsS3`+CM}sIjY>2KR&c&FpXuTt{-Av%8 zsxPFTlq|l-+Hq+yO)Dxd#g6e`OlvI7psCU@IZAm(&t*>)3m|eUt&=ofd?N3` zyjpwg)B2gdlOrfo%up(+Z?MxT47)f!qn%oUh><#C+?B9dcFgO;lW_V~36qA0;iXkq znqn6z*{;GNtp)HmfD%pAerlu|f_cA_Jebq3BiaMZBNVgLwluf&v0%1ti|lw#|7sp{ zWy{lq)82eejoL&~nqNWsy=xh|Qtc)6zm!OISMitM8q$FF8T9kjEwnS_Ak~R1MW-uP$qy0(QDcld}>hd!j@-}EJG@A*_2bAaR1no#nVq2#^$B-MEFG2Pl! zl=_4$B5UEhG-Fj5zDC=Z<_8U?xbvA*CZ;uMS^ypGQjm@$#L)Pg{b=aCMDjY&lztnu zpB(OArtZ_q(cDo7Xk(G()M(ok^6L6KeNkT})sjh7C*keRD)(t++pF~R#46-lZ$A|q z`jkFP=|k0v*P+ROAEjrriqeF59~x3>0{t2JmMZ&?rh3g?BwBPF!+Ik>~Dzvs? zwx&1DoY;hJjqs<{hp^YAKc4hXPoN!NuArKo|D<#EU(tGJPij3XjY2;uN5ju;p#c+8 zXx#R$_?-iN2ii_1pSeoFC$7=W>Fd71G$iB%u(p~ zgO1PXOvA0@*ZdBp|LIKhOBxkhdYp!zctWoAU(%yzarE82{q$=}Sz4klrF|pnQ$>gG z$g%Nrn(eZNws?=Hir;@mO&8-`-zt?TZ|4Y#{xY71-YZT4$ClGr_ZDOudy`&Vn?v`P zuArNDr_-u{6*T+tQ0m*a2K}6#pPGHVg9dFFMkAtwX@2i2^jX1OwEK<&%?~I|uSeF# z8vsQpUtU2it%Iq;lWx>>b3Bc_C()j>rRep6tSNA#9y#+=F2xq~0o3{9kn^UhSISrzKpDwf)eI75v)MUtb# zJ}UPzoZJTfNo6dbP;aFj?FhU?4@VuOS#Lb3`Ot|}w9HSmJlu~C9si29x^<%Xn?q>! z1$^-&x*aJSexcEprS!b=aC|Db3_To?Km(JSQ|R@2wBpJ%THjy=HC&ob`DV_e0NYhs zT>BHcGJGC+?7T_ zkRGc$$uF!jb?vg3nr7CaA#Z-9*k7Jg*(KL#3mz*6&U;15v4Zrrghm%`7o~dNZJ@4& z7gCMi9H>q319JUk163{gJtc20L~X+o==8oX$gzPF^&ImXm3%Xb#?Mt~jz=^d+Sn0` zNjK@~Us#T7f&FF|chcs8Khda@*p?s_rEi}3)4Ww!6y7?TW;VM>uY0ehLvb(YtK>>_ z<gwWI;-wl}TmmTPS2uRVwE>lUnb2 zi2AgR7DhzUvO%>eU~f;Fey$l+zUEH9`ZuJ~A=T-~@Do(|*e=>TEFF7WKPPqAZR&Al zE%`(>rT#9b>BnBvX?RF;8rtPLt?D4CUFVuq?9ZK4_1OV(jqFRkE8oUf!#7dUZ}-!> zDmBQua|1p625r=9A6giGo62O4ro3_-+I4?w``cRb{$dq<_xT@GsdpaQ@g|rGTs%e- ze>p{~FYTi(9((BM=Tpc!q!+&2?tz8t&NSIAnQmBSlAB{FEw|05S-)JRi|OTPXz3ql z{G4i}KF^>Z_kK!)hqR>@68;Yy7 zjE;K?8gXSN9l81g?d|uHT89-NVHryEwtq$6CZ3}9_)cfB)cmw8dOxk#0x2=5I%${3 z)Ah#3sg2)TI(zgm-G6SQ387bMb?AAz@Jj$~Sh1f*cRNGjw+>SBMOXT%PF-r^*@QaB z_NCK%UQ*=ZL-bX}-ju)5V=7WVm_iQBBER$pbnonQDly?GMJ=jM*6Rl;^W1!j9CDMk zryrsv)_pXg_edJL^;`Na@)N2bJ)RB~7(%a4ZX&;!YxMn*pRgj=o^F1dk4FAfitbG8 zMddzvvH&Ft-)WYOXH_>0e$zQ3$8TxryuFSiZlvHC_~R8 z_tVmYHRyao7uu2VJ)JzBpIqknQ&iV#RH4fpT6N+Uo%Q~ahW6P^^~Bv z@gkKL1V+%!nHA{4ndy|aV-r1n@;g@_UK0qIy|At1)S)`_XQ~J*h{Lm+aLA` z-S2&zuJq|ggBGl&#Z{lu5szII(rq=}=(?NQPdh~C>pRnx5zWZI$Q9b=xsH4)G@;`rpjul?(4Zxksq_8KG}X5j9lf`j+UMIqtEzrO zo6h0jDzzDfeVa^^XMahvTdklszt(HRTf+^#Z zYt-jVUm8DX1O4>XIO_cBb1FZ(B-t&d`(Rc&ZHR)`;*ViK&miyDLIGCqH?XqQ(T2Y)Nrp0 z&GwC_F?Huq!hzd#=hApOP$!9eUp%DOgHQ$*@1?Ny<*DA1Z)nd1N7~T-GL^Y9fWmKF zp^uk(QG(wx8hoNGIXvD$jXv|HHY<vE5Lo>}R8jA^1K zwWcq;+SB)Mw$RjTXKDGB5OS{}A^#`{82E#>@dCgLVfl)O#jpn((J?s{#mG(uib2qjA5=j*-tWhrbzazIq{Rw-_M(<%P8)6SmlJ zx`qjFbVrwN!Ycu9GvR#bBDdS=A=)=4`~YiF->O;2Sp!cgKd=dm^+&urOsrf7>v!<%?^m7Zd($&N7Q}uq;m@$Ru+xNB0p4Z8lPco4 z2orV)#&VAdZ^B~7&nCPQ@NN_S+MjG+9g!Vos0t#%u;GRJc83EtV!^7(YRr2BTkus zy#jj`_8RPU*c-4nVfnfRdmCRxMmz)2$*rX$Bs1KYrl>nS1GzffUh2G9+1?WUZH}cl8+353(R)N0H=xR0tot3V*KTUKzfGl(t^8`j~ z2)&EZoyxz*{1l@tKwoF{mYmg_)sn(!E6}sg0zE!Qp6lse3t!0r=%8pwq1-al%vk*=u?a?0Q7YRFe7Mt1i(m63VXQ#H~SKR88)&l1z_OTvX?7x+Zp() zIN5e*;SRHx8*t|VINd33NW@K&9%VA43j!T?8R+3b20BaYE8#1-1D(L=k8)^951q(p z51>ymI?b$$S0H+?NHnKwRvZD{@L}z8-b@&$dgwxBkg>aAg zk8HkbQt`-?EmK{@Acil1u$E2wDXmP-p=SUKqoTV!^~VGaxg#7=(0fHXY?|Yxly2j zj=K%CAJFj(*wEW<0Dw9=1v&@hQVu#OZ`z)S7hCde$FoSzGf4%Y{Y}dx*rjiKkwp@B z2P74Nu4Gy!!Nz^t8X$~_5}2ei&;h2cf;;x|+YV%roB~w5D!i+iwmR;-y`L|Du#h-~ zscOK9R~~fB$2Re%f4;J)*4_nGZ8+<|2Ex{bt+wBwGRiS{9cHR}z|@Cr0Lya6o8xjg zjTn=eDhN(n4yuper&@UrR2-i9*m-R<<;sdN@k3O4hH@J3e~2neuK4@^5F@|dz*km` zyFNsf72|bKxx6nuc-i6}0HIfcvT=0&y3U(|1qL!e6slr&$?p?11i@h@xM2>H-X~}T zf@CJh!1EYi?-Miz!ODjqcxVpN-X~}Rf!koA5vfxVgow~K+Bbx}mKaHrU-1#s6H=!plnM_ITO_G$^->_>?7m6gc~EoWSIx1&>XqO(HBKSAiW2)!0SA*>?mmo8q81hxagVJ3*o zIl2OSyLe2H%mm|eb}QguPazYmdPgauX7_YOfbZ3 zDouhc8JHkG83dzp668=a=Cy6Rn4ojcROC=H6I^G4koQtyh=^0{K`{Fn2$t0_yzHs4 z>wyWjgTQI6Nsy)J!|=sNrce$Ty*=-{;cdxwbll%yZ%6B)bEKd%!Y44nq?|P@M@Df$ zJH-TRc|Hx7nUh&cVuBPV`05>kY&CZQ!P@5_=pCdpFge6$abSYOOfckK0-+f6dPXHP zL74e)ZqFz)%{sx#7tjJ0GxRGa(GQ;#o4p7jQgKCpdF zewA~UtsI5#eY#*g+uVO8JC+-XfU&TnVEG!2`xw}} - */ - jOpen(filename, pFile, flags, pOutFlags) { - return VFS.SQLITE_CANTOPEN; - } - - /** - * @param {string} filename - * @param {number} syncDir - * @returns {number|Promise} - */ - jDelete(filename, syncDir) { - return VFS.SQLITE_OK; - } - - /** - * @param {string} filename - * @param {number} flags - * @param {DataView} pResOut - * @returns {number|Promise} - */ - jAccess(filename, flags, pResOut) { - return VFS.SQLITE_OK; - } - - /** - * @param {string} filename - * @param {Uint8Array} zOut - * @returns {number|Promise} - */ - jFullPathname(filename, zOut) { - // Copy the filename to the output buffer. - const { read, written } = new TextEncoder().encodeInto(filename, zOut); - if (read < filename.length) return VFS.SQLITE_IOERR; - if (written >= zOut.length) return VFS.SQLITE_IOERR; - zOut[written] = 0; - return VFS.SQLITE_OK; - } - - /** - * @param {Uint8Array} zBuf - * @returns {number|Promise} - */ - jGetLastError(zBuf) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @returns {number|Promise} - */ - jClose(pFile) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {Uint8Array} pData - * @param {number} iOffset - * @returns {number|Promise} - */ - jRead(pFile, pData, iOffset) { - pData.fill(0); - return VFS.SQLITE_IOERR_SHORT_READ; - } - - /** - * @param {number} pFile - * @param {Uint8Array} pData - * @param {number} iOffset - * @returns {number|Promise} - */ - jWrite(pFile, pData, iOffset) { - return VFS.SQLITE_IOERR_WRITE; - } - - /** - * @param {number} pFile - * @param {number} size - * @returns {number|Promise} - */ - jTruncate(pFile, size) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} flags - * @returns {number|Promise} - */ - jSync(pFile, flags) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {DataView} pSize - * @returns {number|Promise} - */ - jFileSize(pFile, pSize) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} lockType - * @returns {number|Promise} - */ - jLock(pFile, lockType) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} lockType - * @returns {number|Promise} - */ - jUnlock(pFile, lockType) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {DataView} pResOut - * @returns {number|Promise} - */ - jCheckReservedLock(pFile, pResOut) { - pResOut.setInt32(0, 0, true); - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} op - * @param {DataView} pArg - * @returns {number|Promise} - */ - jFileControl(pFile, op, pArg) { - return VFS.SQLITE_NOTFOUND; - } - - /** - * @param {number} pFile - * @returns {number|Promise} - */ - jSectorSize(pFile) { - return super.xSectorSize(pFile); - } - - /** - * @param {number} pFile - * @returns {number|Promise} - */ - jDeviceCharacteristics(pFile) { - return 0; - } - - /** - * @param {number} pVfs - * @param {number} zName - * @param {number} pFile - * @param {number} flags - * @param {number} pOutFlags - * @returns {number|Promise} - */ - xOpen(pVfs, zName, pFile, flags, pOutFlags) { - const filename = this.#decodeFilename(zName, flags); - const pOutFlagsView = this.#makeTypedDataView('Int32', pOutFlags); - this['log']?.('jOpen', filename, pFile, '0x' + flags.toString(16)); - return this.jOpen(filename, pFile, flags, pOutFlagsView); - } - - /** - * @param {number} pVfs - * @param {number} zName - * @param {number} syncDir - * @returns {number|Promise} - */ - xDelete(pVfs, zName, syncDir) { - const filename = this._module.UTF8ToString(zName); - this['log']?.('jDelete', filename, syncDir); - return this.jDelete(filename, syncDir); - } - - /** - * @param {number} pVfs - * @param {number} zName - * @param {number} flags - * @param {number} pResOut - * @returns {number|Promise} - */ - xAccess(pVfs, zName, flags, pResOut) { - const filename = this._module.UTF8ToString(zName); - const pResOutView = this.#makeTypedDataView('Int32', pResOut); - this['log']?.('jAccess', filename, flags); - return this.jAccess(filename, flags, pResOutView); - } - - /** - * @param {number} pVfs - * @param {number} zName - * @param {number} nOut - * @param {number} zOut - * @returns {number|Promise} - */ - xFullPathname(pVfs, zName, nOut, zOut) { - const filename = this._module.UTF8ToString(zName); - const zOutArray = this._module.HEAPU8.subarray(zOut, zOut + nOut); - this['log']?.('jFullPathname', filename, nOut); - return this.jFullPathname(filename, zOutArray); - } - - /** - * @param {number} pVfs - * @param {number} nBuf - * @param {number} zBuf - * @returns {number|Promise} - */ - xGetLastError(pVfs, nBuf, zBuf) { - const zBufArray = this._module.HEAPU8.subarray(zBuf, zBuf + nBuf); - this['log']?.('jGetLastError', nBuf); - return this.jGetLastError(zBufArray); - } - - /** - * @param {number} pFile - * @returns {number|Promise} - */ - xClose(pFile) { - this['log']?.('jClose', pFile); - return this.jClose(pFile); - } - - /** - * @param {number} pFile - * @param {number} pData - * @param {number} iAmt - * @param {number} iOffsetLo - * @param {number} iOffsetHi - * @returns {number|Promise} - */ - xRead(pFile, pData, iAmt, iOffsetLo, iOffsetHi) { - const pDataArray = this.#makeDataArray(pData, iAmt); - const iOffset = delegalize(iOffsetLo, iOffsetHi); - this['log']?.('jRead', pFile, iAmt, iOffset); - return this.jRead(pFile, pDataArray, iOffset); - } - - /** - * @param {number} pFile - * @param {number} pData - * @param {number} iAmt - * @param {number} iOffsetLo - * @param {number} iOffsetHi - * @returns {number|Promise} - */ - xWrite(pFile, pData, iAmt, iOffsetLo, iOffsetHi) { - const pDataArray = this.#makeDataArray(pData, iAmt); - const iOffset = delegalize(iOffsetLo, iOffsetHi); - this['log']?.('jWrite', pFile, pDataArray, iOffset); - return this.jWrite(pFile, pDataArray, iOffset); - } - - /** - * @param {number} pFile - * @param {number} sizeLo - * @param {number} sizeHi - * @returns {number|Promise} - */ - xTruncate(pFile, sizeLo, sizeHi) { - const size = delegalize(sizeLo, sizeHi); - this['log']?.('jTruncate', pFile, size); - return this.jTruncate(pFile, size); - } - - /** - * @param {number} pFile - * @param {number} flags - * @returns {number|Promise} - */ - xSync(pFile, flags) { - this['log']?.('jSync', pFile, flags); - return this.jSync(pFile, flags); - } - - /** - * - * @param {number} pFile - * @param {number} pSize - * @returns {number|Promise} - */ - xFileSize(pFile, pSize) { - const pSizeView = this.#makeTypedDataView('BigInt64', pSize); - this['log']?.('jFileSize', pFile); - return this.jFileSize(pFile, pSizeView); - } - - /** - * @param {number} pFile - * @param {number} lockType - * @returns {number|Promise} - */ - xLock(pFile, lockType) { - this['log']?.('jLock', pFile, lockType); - return this.jLock(pFile, lockType); - } - - /** - * @param {number} pFile - * @param {number} lockType - * @returns {number|Promise} - */ - xUnlock(pFile, lockType) { - this['log']?.('jUnlock', pFile, lockType); - return this.jUnlock(pFile, lockType); - } - - /** - * @param {number} pFile - * @param {number} pResOut - * @returns {number|Promise} - */ - xCheckReservedLock(pFile, pResOut) { - const pResOutView = this.#makeTypedDataView('Int32', pResOut); - this['log']?.('jCheckReservedLock', pFile); - return this.jCheckReservedLock(pFile, pResOutView); - } - - /** - * @param {number} pFile - * @param {number} op - * @param {number} pArg - * @returns {number|Promise} - */ - xFileControl(pFile, op, pArg) { - const pArgView = new DataView( - this._module.HEAPU8.buffer, - this._module.HEAPU8.byteOffset + pArg); - this['log']?.('jFileControl', pFile, op, pArgView); - return this.jFileControl(pFile, op, pArgView); - } - - /** - * @param {number} pFile - * @returns {number|Promise} - */ - xSectorSize(pFile) { - this['log']?.('jSectorSize', pFile); - return this.jSectorSize(pFile); - } - - /** - * @param {number} pFile - * @returns {number|Promise} - */ - xDeviceCharacteristics(pFile) { - this['log']?.('jDeviceCharacteristics', pFile); - return this.jDeviceCharacteristics(pFile); - } - - /** - * Wrapped DataView for pointer arguments. - * Pointers to a single value are passed using DataView. A Proxy - * wrapper prevents use of incorrect type or endianness. - * @param {'Int32'|'BigInt64'} type - * @param {number} byteOffset - * @returns {DataView} - */ - #makeTypedDataView(type, byteOffset) { - const byteLength = type === 'Int32' ? 4 : 8; - const getter = `get${type}`; - const setter = `set${type}`; - const makeDataView = () => new DataView( - this._module.HEAPU8.buffer, - this._module.HEAPU8.byteOffset + byteOffset, - byteLength); - let dataView = makeDataView(); - return new Proxy(dataView, { - get(_, prop) { - if (dataView.buffer.byteLength === 0) { - // WebAssembly memory resize detached the buffer. - dataView = makeDataView(); - } - if (prop === getter) { - return function(byteOffset, littleEndian) { - if (!littleEndian) throw new Error('must be little endian'); - return dataView[prop](byteOffset, littleEndian); - } - } - if (prop === setter) { - return function(byteOffset, value, littleEndian) { - if (!littleEndian) throw new Error('must be little endian'); - return dataView[prop](byteOffset, value, littleEndian); - } - } - if (typeof prop === 'string' && (prop.match(/^(get)|(set)/))) { - throw new Error('invalid type'); - } - const result = dataView[prop]; - return typeof result === 'function' ? result.bind(dataView) : result; - } - }); - } - - /** - * @param {number} byteOffset - * @param {number} byteLength - */ - #makeDataArray(byteOffset, byteLength) { - let target = this._module.HEAPU8.subarray(byteOffset, byteOffset + byteLength); - return new Proxy(target, { - get: (_, prop, receiver) => { - if (target.buffer.byteLength === 0) { - // WebAssembly memory resize detached the buffer. - target = this._module.HEAPU8.subarray(byteOffset, byteOffset + byteLength); - } - const result = target[prop]; - return typeof result === 'function' ? result.bind(target) : result; - } - }); - } - - #decodeFilename(zName, flags) { - if (flags & VFS.SQLITE_OPEN_URI) { - // The first null-terminated string is the URI path. Subsequent - // strings are query parameter keys and values. - // https://www.sqlite.org/c3ref/open.html#urifilenamesinsqlite3open - let pName = zName; - let state = 1; - const charCodes = []; - while (state) { - const charCode = this._module.HEAPU8[pName++]; - if (charCode) { - charCodes.push(charCode); - } else { - if (!this._module.HEAPU8[pName]) state = null; - switch (state) { - case 1: // path - charCodes.push('?'.charCodeAt(0)); - state = 2; - break; - case 2: // key - charCodes.push('='.charCodeAt(0)); - state = 3; - break; - case 3: // value - charCodes.push('&'.charCodeAt(0)); - state = 2; - break; - } - } - } - return new TextDecoder().decode(new Uint8Array(charCodes)); - } - return zName ? this._module.UTF8ToString(zName) : null; - } -} - -// Emscripten "legalizes" 64-bit integer arguments by passing them as -// two 32-bit signed integers. -function delegalize(lo32, hi32) { - return (hi32 * 0x100000000) + lo32 + (lo32 < 0 ? 2**32 : 0); -} diff --git a/packages/replicate/assets/wa-sqlite/src/VFS.js b/packages/replicate/assets/wa-sqlite/src/VFS.js deleted file mode 100644 index 12966b9..0000000 --- a/packages/replicate/assets/wa-sqlite/src/VFS.js +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright 2024 Roy T. Hashimoto. All Rights Reserved. -import * as VFS from './sqlite-constants.js'; -export * from './sqlite-constants.js'; - -const DEFAULT_SECTOR_SIZE = 512; - -// Base class for a VFS. -export class Base { - name; - mxPathname = 64; - _module; - - /** - * @param {string} name - * @param {object} module - */ - constructor(name, module) { - this.name = name; - this._module = module; - } - - /** - * @returns {void|Promise} - */ - close() { - } - - /** - * @returns {boolean|Promise} - */ - isReady() { - return true; - } - - /** - * Overload in subclasses to indicate which methods are asynchronous. - * @param {string} methodName - * @returns {boolean} - */ - hasAsyncMethod(methodName) { - return false; - } - - /** - * @param {number} pVfs - * @param {number} zName - * @param {number} pFile - * @param {number} flags - * @param {number} pOutFlags - * @returns {number|Promise} - */ - xOpen(pVfs, zName, pFile, flags, pOutFlags) { - return VFS.SQLITE_CANTOPEN; - } - - /** - * @param {number} pVfs - * @param {number} zName - * @param {number} syncDir - * @returns {number|Promise} - */ - xDelete(pVfs, zName, syncDir) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pVfs - * @param {number} zName - * @param {number} flags - * @param {number} pResOut - * @returns {number|Promise} - */ - xAccess(pVfs, zName, flags, pResOut) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pVfs - * @param {number} zName - * @param {number} nOut - * @param {number} zOut - * @returns {number|Promise} - */ - xFullPathname(pVfs, zName, nOut, zOut) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pVfs - * @param {number} nBuf - * @param {number} zBuf - * @returns {number|Promise} - */ - xGetLastError(pVfs, nBuf, zBuf) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @returns {number|Promise} - */ - xClose(pFile) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} pData - * @param {number} iAmt - * @param {number} iOffsetLo - * @param {number} iOffsetHi - * @returns {number|Promise} - */ - xRead(pFile, pData, iAmt, iOffsetLo, iOffsetHi) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} pData - * @param {number} iAmt - * @param {number} iOffsetLo - * @param {number} iOffsetHi - * @returns {number|Promise} - */ - xWrite(pFile, pData, iAmt, iOffsetLo, iOffsetHi) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} sizeLo - * @param {number} sizeHi - * @returns {number|Promise} - */ - xTruncate(pFile, sizeLo, sizeHi) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} flags - * @returns {number|Promise} - */ - xSync(pFile, flags) { - return VFS.SQLITE_OK; - } - - /** - * - * @param {number} pFile - * @param {number} pSize - * @returns {number|Promise} - */ - xFileSize(pFile, pSize) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} lockType - * @returns {number|Promise} - */ - xLock(pFile, lockType) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} lockType - * @returns {number|Promise} - */ - xUnlock(pFile, lockType) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} pResOut - * @returns {number|Promise} - */ - xCheckReservedLock(pFile, pResOut) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} op - * @param {number} pArg - * @returns {number|Promise} - */ - xFileControl(pFile, op, pArg) { - return VFS.SQLITE_NOTFOUND; - } - - /** - * @param {number} pFile - * @returns {number|Promise} - */ - xSectorSize(pFile) { - return DEFAULT_SECTOR_SIZE; - } - - /** - * @param {number} pFile - * @returns {number|Promise} - */ - xDeviceCharacteristics(pFile) { - return 0; - } -} - -export const FILE_TYPE_MASK = [ - VFS.SQLITE_OPEN_MAIN_DB, - VFS.SQLITE_OPEN_MAIN_JOURNAL, - VFS.SQLITE_OPEN_TEMP_DB, - VFS.SQLITE_OPEN_TEMP_JOURNAL, - VFS.SQLITE_OPEN_TRANSIENT_DB, - VFS.SQLITE_OPEN_SUBJOURNAL, - VFS.SQLITE_OPEN_SUPER_JOURNAL, - VFS.SQLITE_OPEN_WAL -].reduce((mask, element) => mask | element); \ No newline at end of file diff --git a/packages/replicate/assets/wa-sqlite/src/WebLocksMixin.js b/packages/replicate/assets/wa-sqlite/src/WebLocksMixin.js deleted file mode 100644 index e23c841..0000000 --- a/packages/replicate/assets/wa-sqlite/src/WebLocksMixin.js +++ /dev/null @@ -1,412 +0,0 @@ -import * as VFS from './VFS.js'; - -// Options for navigator.locks.request(). -/** @type {LockOptions} */ const SHARED = { mode: 'shared' }; -/** @type {LockOptions} */ const POLL_SHARED = { ifAvailable: true, mode: 'shared' }; -/** @type {LockOptions} */ const POLL_EXCLUSIVE = { ifAvailable: true, mode: 'exclusive' }; - -const POLICIES = ['exclusive', 'shared', 'shared+hint']; - -/** - * @typedef LockState - * @property {string} baseName - * @property {number} type - * @property {boolean} writeHint - * - * These properties are functions that release a specific lock. - * @property {(() => void)?} [gate] - * @property {(() => void)?} [access] - * @property {(() => void)?} [reserved] - * @property {(() => void)?} [hint] - */ - -/** - * Mix-in for FacadeVFS that implements the SQLite VFS locking protocol. - * @param {*} superclass FacadeVFS (or subclass) - * @returns - */ -export const WebLocksMixin = superclass => class extends superclass { - #options = { - lockPolicy: 'exclusive', - lockTimeout: Infinity - }; - - /** @type {Map} */ #mapIdToState = new Map(); - - constructor(name, module, options) { - super(name, module, options); - Object.assign(this.#options, options); - if (POLICIES.indexOf(this.#options.lockPolicy) === -1) { - throw new Error(`WebLocksMixin: invalid lock mode: ${options.lockPolicy}`); - } - } - - /** - * @param {number} fileId - * @param {number} lockType - * @returns {Promise} - */ - async jLock(fileId, lockType) { - try { - // Create state on first lock. - if (!this.#mapIdToState.has(fileId)) { - const name = this.getFilename(fileId); - const state = { - baseName: name, - type: VFS.SQLITE_LOCK_NONE, - writeHint: false - }; - this.#mapIdToState.set(fileId, state); - } - - const lockState = this.#mapIdToState.get(fileId); - if (lockType <= lockState.type) return VFS.SQLITE_OK; - - switch (this.#options.lockPolicy) { - case 'exclusive': - return await this.#lockExclusive(lockState, lockType); - case 'shared': - case 'shared+hint': - return await this.#lockShared(lockState, lockType); - } - } catch (e) { - console.error('WebLocksMixin: lock error', e); - return VFS.SQLITE_IOERR_LOCK; - } - } - - /** - * @param {number} fileId - * @param {number} lockType - * @returns {Promise} - */ - async jUnlock(fileId, lockType) { - try { - const lockState = this.#mapIdToState.get(fileId); - if (lockType >= lockState.type) return VFS.SQLITE_OK; - - switch (this.#options.lockPolicy) { - case 'exclusive': - return await this.#unlockExclusive(lockState, lockType); - case 'shared': - case 'shared+hint': - return await this.#unlockShared(lockState, lockType); - } - } catch (e) { - console.error('WebLocksMixin: unlock error', e); - return VFS.SQLITE_IOERR_UNLOCK; - } - } - - /** - * @param {number} fileId - * @param {DataView} pResOut - * @returns {Promise} - */ - async jCheckReservedLock(fileId, pResOut) { - try { - const lockState = this.#mapIdToState.get(fileId); - switch (this.#options.lockPolicy) { - case 'exclusive': - return this.#checkReservedExclusive(lockState, pResOut); - case 'shared': - case 'shared+hint': - return await this.#checkReservedShared(lockState, pResOut); - } - } catch (e) { - console.error('WebLocksMixin: check reserved lock error', e); - return VFS.SQLITE_IOERR_CHECKRESERVEDLOCK; - } - pResOut.setInt32(0, 0, true); - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} op - * @param {DataView} pArg - * @returns {number|Promise} - */ - jFileControl(pFile, op, pArg) { - const lockState = this.#mapIdToState.get(pFile) ?? - (() => { - // Call jLock() to create the lock state. - this.jLock(pFile, VFS.SQLITE_LOCK_NONE); - return this.#mapIdToState.get(pFile); - })(); - if (op === WebLocksMixin.WRITE_HINT_OP_CODE && - this.#options.lockPolicy === 'shared+hint'){ - lockState.writeHint = true; - } - return VFS.SQLITE_NOTFOUND; - } - - /** - * @param {LockState} lockState - * @param {number} lockType - * @returns - */ - async #lockExclusive(lockState, lockType) { - if (!lockState.access) { - if (!await this.#acquire(lockState, 'access')) { - return VFS.SQLITE_BUSY; - } - console.assert(!!lockState.access); - } - lockState.type = lockType; - return VFS.SQLITE_OK; - } - - /** - * @param {LockState} lockState - * @param {number} lockType - * @returns {number} - */ - #unlockExclusive(lockState, lockType) { - if (lockType === VFS.SQLITE_LOCK_NONE) { - lockState.access?.(); - console.assert(!lockState.access); - } - lockState.type = lockType; - return VFS.SQLITE_OK; - } - - /** - * @param {LockState} lockState - * @param {DataView} pResOut - * @returns {number} - */ - #checkReservedExclusive(lockState, pResOut) { - pResOut.setInt32(0, 0, true); - return VFS.SQLITE_OK; - } - - /** - * @param {LockState} lockState - * @param {number} lockType - * @returns - */ - async #lockShared(lockState, lockType) { - switch (lockState.type) { - case VFS.SQLITE_LOCK_NONE: - switch (lockType) { - case VFS.SQLITE_LOCK_SHARED: - if (lockState.writeHint) { - // xFileControl() has hinted that this transaction will - // write. Acquire the hint lock, which is required to reach - // the RESERVED state. - if (!await this.#acquire(lockState, 'hint')) { - // Timeout before lock acquired. - return VFS.SQLITE_BUSY; - } - } - - // Must have the gate lock to request the access lock. - if (!await this.#acquire(lockState, 'gate', SHARED)) { - // Timeout before lock acquired. - lockState.hint?.(); - return VFS.SQLITE_BUSY; - } - await this.#acquire(lockState, 'access', SHARED); - lockState.gate(); - console.assert(!lockState.gate); - console.assert(!!lockState.access); - console.assert(!lockState.reserved); - break; - - default: - throw new Error('unsupported lock transition'); - } - break; - case VFS.SQLITE_LOCK_SHARED: - switch (lockType) { - case VFS.SQLITE_LOCK_RESERVED: - if (this.#options.lockPolicy === 'shared+hint') { - // Ideally we should already have the hint lock, but if not - // poll for it here. - if (!lockState.hint && - !await this.#acquire(lockState, 'hint', POLL_EXCLUSIVE)) { - // Another connection has the hint lock so this is a - // deadlock. This connection must retry. - return VFS.SQLITE_BUSY; - } - } - - // Poll for the reserved lock. This should always succeed - // if all clients use the 'shared+hint' policy. - if (!await this.#acquire(lockState, 'reserved', POLL_EXCLUSIVE)) { - // This is a deadlock. The connection holding the reserved - // lock blocks us, and it can't acquire an exclusive access - // lock because we hold a shared access lock. This connection - // must retry. - lockState.hint?.(); - return VFS.SQLITE_BUSY; - } - lockState.access(); - console.assert(!lockState.gate); - console.assert(!lockState.access); - console.assert(!!lockState.reserved); - break; - - case VFS.SQLITE_LOCK_EXCLUSIVE: - // Jumping directly from SHARED to EXCLUSIVE without passing - // through RESERVED is only done with a hot journal. - if (!await this.#acquire(lockState, 'gate')) { - // Timeout before lock acquired. - return VFS.SQLITE_BUSY; - } - lockState.access(); - if (!await this.#acquire(lockState, 'access')) { - // Timeout before lock acquired. - lockState.gate(); - return VFS.SQLITE_BUSY; - } - console.assert(!!lockState.gate); - console.assert(!!lockState.access); - console.assert(!lockState.reserved); - break; - - default: - throw new Error('unsupported lock transition'); - } - break; - case VFS.SQLITE_LOCK_RESERVED: - switch (lockType) { - case VFS.SQLITE_LOCK_EXCLUSIVE: - // Prevent other connections from entering the SHARED state. - if (!await this.#acquire(lockState, 'gate')) { - // Timeout before lock acquired. - return VFS.SQLITE_BUSY; - } - - // Block until all other connections exit the SHARED state. - if (!await this.#acquire(lockState, 'access')) { - // Timeout before lock acquired. - lockState.gate(); - return VFS.SQLITE_BUSY; - } - console.assert(!!lockState.gate); - console.assert(!!lockState.access); - console.assert(!!lockState.reserved); - break; - - default: - throw new Error('unsupported lock transition'); - } - break; - } - lockState.type = lockType; - return VFS.SQLITE_OK; - } - - /** - * @param {LockState} lockState - * @param {number} lockType - * @returns - */ - async #unlockShared(lockState, lockType) { - // lockType can only be SQLITE_LOCK_SHARED or SQLITE_LOCK_NONE. - if (lockType === VFS.SQLITE_LOCK_NONE) { - lockState.access?.(); - lockState.gate?.(); - lockState.reserved?.(); - lockState.hint?.(); - lockState.writeHint = false; - console.assert(!lockState.access); - console.assert(!lockState.gate); - console.assert(!lockState.reserved); - console.assert(!lockState.hint); - } else { // lockType === VFS.SQLITE_LOCK_SHARED - switch (lockState.type) { - case VFS.SQLITE_LOCK_EXCLUSIVE: - // Release our exclusive access lock and reacquire it with a - // shared lock. This should always succeed because we hold - // the gate lock. - lockState.access(); - await this.#acquire(lockState, 'access', SHARED); - - // Release our gate and reserved locks. We might not have a - // reserved lock if we were handling a hot journal. - lockState.gate(); - lockState.reserved?.(); - lockState.hint?.(); - console.assert(!!lockState.access); - console.assert(!lockState.gate); - console.assert(!lockState.reserved); - break; - - case VFS.SQLITE_LOCK_RESERVED: - // This transition is rare, probably only on an I/O error - // while writing to a journal file. - await this.#acquire(lockState, 'access', SHARED); - lockState.reserved(); - lockState.hint?.(); - console.assert(!!lockState.access); - console.assert(!lockState.gate); - console.assert(!lockState.reserved); - break; - } - } - lockState.type = lockType; - return VFS.SQLITE_OK; - } - - /** - * @param {LockState} lockState - * @param {DataView} pResOut - * @returns {Promise} - */ - async #checkReservedShared(lockState, pResOut) { - if (await this.#acquire(lockState, 'reserved', POLL_SHARED)) { - // We were able to get the lock so it was not reserved. - lockState.reserved(); - pResOut.setInt32(0, 0, true); - } else { - pResOut.setInt32(0, 1, true); - } - return VFS.SQLITE_OK; - } - - /** - * @param {LockState} lockState - * @param {'gate'|'access'|'reserved'|'hint'} name - * @param {LockOptions} options - * @returns {Promise} - */ - #acquire(lockState, name, options = {}) { - console.assert(!lockState[name]); - return new Promise(resolve => { - if (!options.ifAvailable && this.#options.lockTimeout < Infinity) { - // Add a timeout to the lock request. - const controller = new AbortController(); - options = Object.assign({}, options, { signal: controller.signal }); - setTimeout(() => { - controller.abort(); - resolve?.(false); - }, this.#options.lockTimeout); - } - - const lockName = `lock##${lockState.baseName}##${name}`; - navigator.locks.request(lockName, options, lock => { - if (lock) { - return new Promise(release => { - lockState[name] = () => { - release(); - lockState[name] = null; - }; - resolve(true); - resolve = null; - }); - } else { - lockState[name] = null; - resolve(false); - resolve = null; - } - }).catch(e => { - if (e.name !== 'AbortError') throw e; - }); - }); - } -} - -WebLocksMixin.WRITE_HINT_OP_CODE = -9999; \ No newline at end of file diff --git a/packages/replicate/assets/wa-sqlite/src/examples/IDBBatchAtomicVFS.js b/packages/replicate/assets/wa-sqlite/src/examples/IDBBatchAtomicVFS.js deleted file mode 100644 index 7e921d2..0000000 --- a/packages/replicate/assets/wa-sqlite/src/examples/IDBBatchAtomicVFS.js +++ /dev/null @@ -1,820 +0,0 @@ -// Copyright 2024 Roy T. Hashimoto. All Rights Reserved. -import { FacadeVFS } from '../FacadeVFS.js'; -import * as VFS from '../VFS.js'; -import { WebLocksMixin } from '../WebLocksMixin.js'; - -/** - * @typedef Metadata - * @property {string} name - * @property {number} fileSize - * @property {number} version - * @property {number} [pendingVersion] - */ - -class File { - /** @type {string} */ path; - /** @type {number} */ flags; - - /** @type {Metadata} */ metadata; - /** @type {number} */ fileSize = 0; - - /** @type {boolean} */ needsMetadataSync = false; - /** @type {Metadata} */ rollback = null; - /** @type {Set} */ changedPages = new Set(); - - /** @type {string} */ synchronous = 'full'; - /** @type {IDBTransactionOptions} */ txOptions = { durability: 'strict' }; - - constructor(path, flags, metadata) { - this.path = path; - this.flags = flags; - this.metadata = metadata; - } -} - -export class IDBBatchAtomicVFS extends WebLocksMixin(FacadeVFS) { - /** @type {Map} */ mapIdToFile = new Map(); - lastError = null; - - log = null; // console.log - - /** @type {Promise} */ #isReady; - /** @type {IDBContext} */ #idb; - - static async create(name, module, options) { - const vfs = new IDBBatchAtomicVFS(name, module, options); - await vfs.isReady(); - return vfs; - } - - constructor(name, module, options = {}) { - super(name, module, options); - this.#isReady = this.#initialize(options.idbName ?? name); - } - - async #initialize(name) { - this.#idb = await IDBContext.create(name); - } - - close() { - this.#idb.close(); - } - - async isReady() { - await super.isReady(); - await this.#isReady; - } - - getFilename(fileId) { - const pathname = this.mapIdToFile.get(fileId).path; - return `IDB(${this.name}):${pathname}` - } - - /** - * @param {string?} zName - * @param {number} fileId - * @param {number} flags - * @param {DataView} pOutFlags - * @returns {Promise} - */ - async jOpen(zName, fileId, flags, pOutFlags) { - try { - const url = new URL(zName || Math.random().toString(36).slice(2), 'file://'); - const path = url.pathname; - - let meta = await this.#idb.q(({ metadata }) => metadata.get(path)); - if (!meta && (flags & VFS.SQLITE_OPEN_CREATE)) { - meta = { - name: path, - fileSize: 0, - version: 0 - }; - await this.#idb.q(({ metadata }) => metadata.put(meta), 'rw'); - } - - if (!meta) { - throw new Error(`File ${path} not found`); - } - - const file = new File(path, flags, meta); - this.mapIdToFile.set(fileId, file); - pOutFlags.setInt32(0, flags, true); - return VFS.SQLITE_OK; - } catch (e) { - this.lastError = e; - return VFS.SQLITE_CANTOPEN; - } - } - - /** - * @param {string} zName - * @param {number} syncDir - * @returns {Promise} - */ - async jDelete(zName, syncDir) { - try { - const url = new URL(zName, 'file://'); - const path = url.pathname; - - this.#idb.q(({ metadata, blocks }) => { - const range = IDBKeyRange.bound([path, -Infinity], [path, Infinity]); - blocks.delete(range); - metadata.delete(path); - }, 'rw'); - - if (syncDir) { - await this.#idb.sync(false); - } - return VFS.SQLITE_OK; - } catch (e) { - this.lastError = e; - return VFS.SQLITE_IOERR_DELETE; - } - } - - /** - * @param {string} zName - * @param {number} flags - * @param {DataView} pResOut - * @returns {Promise} - */ - async jAccess(zName, flags, pResOut) { - try { - const url = new URL(zName, 'file://'); - const path = url.pathname; - - const meta = await this.#idb.q(({ metadata }) => metadata.get(path)); - pResOut.setInt32(0, meta ? 1 : 0, true); - return VFS.SQLITE_OK; - } catch (e) { - this.lastError = e; - return VFS.SQLITE_IOERR_ACCESS; - } - } - - /** - * @param {number} fileId - * @returns {Promise} - */ - async jClose(fileId) { - try { - const file = this.mapIdToFile.get(fileId); - this.mapIdToFile.delete(fileId); - - if (file.flags & VFS.SQLITE_OPEN_DELETEONCLOSE) { - await this.#idb.q(({ metadata, blocks }) => { - metadata.delete(file.path); - blocks.delete(IDBKeyRange.bound([file.path, 0], [file.path, Infinity])); - }, 'rw'); - } - - if (file.needsMetadataSync) { - this.#idb.q(({ metadata }) => metadata.put(file.metadata), 'rw'); - } - await this.#idb.sync(file.synchronous === 'full'); - return VFS.SQLITE_OK; - } catch (e) { - this.lastError = e; - return VFS.SQLITE_IOERR_CLOSE; - } - } - - /** - * @param {number} fileId - * @param {Uint8Array} pData - * @param {number} iOffset - * @returns {Promise} - */ - async jRead(fileId, pData, iOffset) { - try { - const file = this.mapIdToFile.get(fileId); - - let pDataOffset = 0; - while (pDataOffset < pData.byteLength) { - // Fetch the IndexedDB block for this file location. - const fileOffset = iOffset + pDataOffset; - const block = await this.#idb.q(({ blocks }) => { - const range = IDBKeyRange.bound([file.path, -fileOffset], [file.path, Infinity]); - return blocks.get(range); - }); - - if (!block || block.data.byteLength - block.offset <= fileOffset) { - pData.fill(0, pDataOffset); - return VFS.SQLITE_IOERR_SHORT_READ; - } - - // Copy block data. - const dst = pData.subarray(pDataOffset); - const srcOffset = fileOffset + block.offset; - const nBytesToCopy = Math.min( - Math.max(block.data.byteLength - srcOffset, 0), - dst.byteLength); - dst.set(block.data.subarray(srcOffset, srcOffset + nBytesToCopy)); - pDataOffset += nBytesToCopy; - } - return VFS.SQLITE_OK; - } catch (e) { - this.lastError = e; - return VFS.SQLITE_IOERR_READ; - } - } - - /** - * @param {number} fileId - * @param {Uint8Array} pData - * @param {number} iOffset - * @returns {number} - */ - jWrite(fileId, pData, iOffset) { - try { - const file = this.mapIdToFile.get(fileId); - if (file.flags & VFS.SQLITE_OPEN_MAIN_DB) { - if (!file.rollback) { - // Begin a new write transaction. - // Add pendingVersion to the metadata in IndexedDB. If we crash - // during the transaction, this lets subsequent connections - // know to remove blocks from the failed transaction. - const pending = Object.assign( - { pendingVersion: file.metadata.version - 1 }, - file.metadata); - this.#idb.q(({ metadata }) => metadata.put(pending), 'rw', file.txOptions); - - file.rollback = Object.assign({}, file.metadata); - file.metadata.version--; - } - } - - if (file.flags & VFS.SQLITE_OPEN_MAIN_DB) { - file.changedPages.add(iOffset); - } - - const data = pData.slice(); - const version = file.metadata.version; - const isOverwrite = iOffset < file.metadata.fileSize; - if (!isOverwrite || - file.flags & VFS.SQLITE_OPEN_MAIN_DB || - file.flags & VFS.SQLITE_OPEN_TEMP_DB) { - const block = { - path: file.path, - offset: -iOffset, - version: version, - data: pData.slice() - }; - this.#idb.q(({ blocks }) => { - blocks.put(block); - file.changedPages.add(iOffset); - }, 'rw', file.txOptions); - } else { - this.#idb.q(async ({ blocks }) => { - // Read the existing block. - const range = IDBKeyRange.bound( - [file.path, -iOffset], - [file.path, Infinity]); - const block = await blocks.get(range); - - // Modify the block data. - // @ts-ignore - block.data.subarray(iOffset + block.offset).set(data); - - // Write back. - blocks.put(block); - }, 'rw', file.txOptions); - - } - - if (file.metadata.fileSize < iOffset + pData.length) { - file.metadata.fileSize = iOffset + pData.length; - file.needsMetadataSync = true; - } - return VFS.SQLITE_OK; - } catch (e) { - this.lastError = e; - return VFS.SQLITE_IOERR_WRITE; - } - } - - /** - * @param {number} fileId - * @param {number} iSize - * @returns {number} - */ - jTruncate(fileId, iSize) { - try { - const file = this.mapIdToFile.get(fileId); - if (iSize < file.metadata.fileSize) { - this.#idb.q(({ blocks }) => { - const range = IDBKeyRange.bound( - [file.path, -Infinity], - [file.path, -iSize, Infinity]); - blocks.delete(range); - }, 'rw', file.txOptions); - file.metadata.fileSize = iSize; - file.needsMetadataSync = true; - } - return VFS.SQLITE_OK; - } catch (e) { - this.lastError = e; - return VFS.SQLITE_IOERR_TRUNCATE; - } - } - - /** - * @param {number} fileId - * @param {number} flags - * @returns {Promise} - */ - async jSync(fileId, flags) { - try { - const file = this.mapIdToFile.get(fileId); - if (file.needsMetadataSync) { - this.#idb.q(({ metadata }) => metadata.put(file.metadata), 'rw', file.txOptions); - file.needsMetadataSync = false; - } - - if (file.flags & VFS.SQLITE_OPEN_MAIN_DB) { - // Sync is only needed here for durability. Visibility for other - // connections is ensured in jUnlock(). - if (file.synchronous === 'full') { - await this.#idb.sync(true); - } - } else { - await this.#idb.sync(file.synchronous === 'full'); - } - return VFS.SQLITE_OK; - } catch (e) { - this.lastError = e; - return VFS.SQLITE_IOERR_FSYNC; - } - } - - /** - * @param {number} fileId - * @param {DataView} pSize64 - * @returns {number} - */ - jFileSize(fileId, pSize64) { - try { - const file = this.mapIdToFile.get(fileId); - pSize64.setBigInt64(0, BigInt(file.metadata.fileSize), true); - return VFS.SQLITE_OK; - } catch (e) { - this.lastError = e; - return VFS.SQLITE_IOERR_FSTAT; - } - } - - /** - * @param {number} fileId - * @param {number} lockType - * @returns {Promise} - */ - async jLock(fileId, lockType) { - // Call the actual lock implementation. - const file = this.mapIdToFile.get(fileId); - const result = await super.jLock(fileId, lockType); - - if (lockType === VFS.SQLITE_LOCK_SHARED) { - // Update metadata. - file.metadata = await this.#idb.q(async ({ metadata, blocks }) => { - // @ts-ignore - /** @type {Metadata} */ const m = await metadata.get(file.path); - if (m.pendingVersion) { - console.warn(`removing failed transaction ${m.pendingVersion}`); - await new Promise((resolve, reject) => { - const range = IDBKeyRange.bound([m.name, -Infinity], [m.name, Infinity]); - const request = blocks.openCursor(range); - request.onsuccess = () => { - const cursor = request.result; - if (cursor) { - const block = cursor.value; - if (block.version < m.version) { - cursor.delete(); - } - cursor.continue(); - } else { - resolve(); - } - }; - request.onerror = () => reject(request.error); - }) - - delete m.pendingVersion; - metadata.put(m); - } - return m; - }, 'rw', file.txOptions); - } - return result; - } - - /** - * @param {number} fileId - * @param {number} lockType - * @returns {Promise} - */ - async jUnlock(fileId, lockType) { - if (lockType === VFS.SQLITE_LOCK_NONE) { - const file = this.mapIdToFile.get(fileId); - await this.#idb.sync(file.synchronous === 'full'); - } - - // Call the actual unlock implementation. - return super.jUnlock(fileId, lockType); - } - - /** - * @param {number} fileId - * @param {number} op - * @param {DataView} pArg - * @returns {number|Promise} - */ - jFileControl(fileId, op, pArg) { - try { - const file = this.mapIdToFile.get(fileId); - switch (op) { - case VFS.SQLITE_FCNTL_PRAGMA: - const key = extractString(pArg, 4); - const value = extractString(pArg, 8); - this.log?.('xFileControl', file.path, 'PRAGMA', key, value); - const setPragmaResponse = response => { - const encoded = new TextEncoder().encode(response); - const out = this._module._sqlite3_malloc(encoded.byteLength); - const outArray = this._module.HEAPU8.subarray(out, out + encoded.byteLength); - outArray.set(encoded); - pArg.setUint32(0, out, true); - return VFS.SQLITE_ERROR; - }; - switch (key.toLowerCase()) { - case 'page_size': - if (file.flags & VFS.SQLITE_OPEN_MAIN_DB) { - // Don't allow changing the page size. - if (value && file.metadata.fileSize) { - return VFS.SQLITE_ERROR; - } - } - break; - case 'synchronous': - if (value) { - switch (value.toLowerCase()) { - case '0': - case 'off': - file.synchronous = 'off'; - file.txOptions = { durability: 'relaxed' }; - break; - case '1': - case 'normal': - file.synchronous = 'normal'; - file.txOptions = { durability: 'relaxed' }; - break; - case '2': - case '3': - case 'full': - case 'extra': - file.synchronous = 'full'; - file.txOptions = { durability: 'strict' }; - break; - } - } - break; - case 'write_hint': - return super.jFileControl(fileId, WebLocksMixin.WRITE_HINT_OP_CODE, null); - } - break; - case VFS.SQLITE_FCNTL_SYNC: - this.log?.('xFileControl', file.path, 'SYNC'); - const commitMetadata = Object.assign({}, file.metadata); - const prevFileSize = file.rollback.fileSize - this.#idb.q(({ metadata, blocks }) => { - metadata.put(commitMetadata); - - // Remove old page versions. - for (const offset of file.changedPages) { - if (offset < prevFileSize) { - const range = IDBKeyRange.bound( - [file.path, -offset, commitMetadata.version], - [file.path, -offset, Infinity], - true); - blocks.delete(range); - } - } - file.changedPages.clear(); - }, 'rw', file.txOptions); - file.needsMetadataSync = false; - file.rollback = null; - break; - case VFS.SQLITE_FCNTL_BEGIN_ATOMIC_WRITE: - // Every write transaction is atomic, so this is a no-op. - this.log?.('xFileControl', file.path, 'BEGIN_ATOMIC_WRITE'); - return VFS.SQLITE_OK; - case VFS.SQLITE_FCNTL_COMMIT_ATOMIC_WRITE: - // Every write transaction is atomic, so this is a no-op. - this.log?.('xFileControl', file.path, 'COMMIT_ATOMIC_WRITE'); - return VFS.SQLITE_OK; - case VFS.SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE: - this.log?.('xFileControl', file.path, 'ROLLBACK_ATOMIC_WRITE'); - file.metadata = file.rollback; - const rollbackMetadata = Object.assign({}, file.metadata); - this.#idb.q(({ metadata, blocks }) => { - metadata.put(rollbackMetadata); - - // Remove pages. - for (const offset of file.changedPages) { - blocks.delete([file.path, -offset, rollbackMetadata.version - 1]); - } - file.changedPages.clear(); - }, 'rw', file.txOptions); - file.needsMetadataSync = false; - file.rollback = null; - return VFS.SQLITE_OK; - } - } catch (e) { - this.lastError = e; - return VFS.SQLITE_IOERR; - } - return super.jFileControl(fileId, op, pArg); - } - - /** - * @param {number} pFile - * @returns {number|Promise} - */ - jDeviceCharacteristics(pFile) { - return 0 - | VFS.SQLITE_IOCAP_BATCH_ATOMIC - | VFS.SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN; - } - - /** - * @param {Uint8Array} zBuf - * @returns {number|Promise} - */ - jGetLastError(zBuf) { - if (this.lastError) { - console.error(this.lastError); - const outputArray = zBuf.subarray(0, zBuf.byteLength - 1); - const { written } = new TextEncoder().encodeInto(this.lastError.message, outputArray); - zBuf[written] = 0; - } - return VFS.SQLITE_OK - } -} - -function extractString(dataView, offset) { - const p = dataView.getUint32(offset, true); - if (p) { - const chars = new Uint8Array(dataView.buffer, p); - return new TextDecoder().decode(chars.subarray(0, chars.indexOf(0))); - } - return null; -} - -export class IDBContext { - /** @type {IDBDatabase} */ #database; - - /** @type {Promise} */ #chain = null; - /** @type {Promise} */ #txComplete = Promise.resolve(); - /** @type {IDBRequest?} */ #request = null; - /** @type {WeakSet} */ #txPending = new WeakSet(); - - log = null; - - static async create(name) { - const database = await new Promise((resolve, reject) => { - const request = indexedDB.open(name, 6); - request.onupgradeneeded = async event => { - const db = request.result; - if (event.oldVersion) { - console.log(`Upgrading IndexedDB from version ${event.oldVersion}`); - } - switch (event.oldVersion) { - case 0: - // Start with the original schema. - db.createObjectStore('blocks', { keyPath: ['path', 'offset', 'version']}) - .createIndex('version', ['path', 'version']); - // fall through intentionally - case 5: - const tx = request.transaction; - const blocks = tx.objectStore('blocks'); - blocks.deleteIndex('version'); - const metadata = db.createObjectStore('metadata', { keyPath: 'name' }); - - await new Promise((resolve, reject) => { - // Iterate over all the blocks. - let lastBlock = {}; - const request = tx.objectStore('blocks').openCursor(); - request.onsuccess = () => { - const cursor = request.result; - if (cursor) { - const block = cursor.value; - if (typeof block.offset !== 'number' || - (block.path === lastBlock.path && block.offset === lastBlock.offset)) { - // Remove superceded block (or the "purge" info). - cursor.delete(); - } else if (block.offset === 0) { - // Move metadata to its own store. - metadata.put({ - name: block.path, - fileSize: block.fileSize, - version: block.version - }); - - delete block.fileSize; - cursor.update(block); - } - lastBlock = block; - cursor.continue(); - } else { - resolve(); - } - }; - request.onerror = () => reject(request.error); - }); - break; - } - }; - request.onsuccess = () => resolve(request.result); - request.onerror = () => reject(request.error); - }); - return new IDBContext(database); - } - - constructor(database) { - this.#database = database; - } - - close() { - this.#database.close(); - } - - /** - * @param {(stores: Object.) => any} f - * @param {'ro'|'rw'} mode - * @returns {Promise} - */ - q(f, mode = 'ro', options = {}) { - /** @type {IDBTransactionMode} */ - const txMode = mode === 'ro' ? 'readonly' : 'readwrite'; - const txOptions = Object.assign({ - /** @type {IDBTransactionDurability} */ durability: 'default' - }, options); - - // Ensure that queries run sequentially. If any function rejects, - // or any request has an error, or the transaction does not commit, - // then no subsequent functions will run until sync() or reset(). - this.#chain = (this.#chain || Promise.resolve()) - .then(() => this.#q(f, txMode, txOptions)); - return this.#chain; - } - - /** - * @param {(stores: Object.) => any} f - * @param {IDBTransactionMode} mode - * @param {IDBTransactionOptions} options - * @returns {Promise} - */ - async #q(f, mode, options) { - /** @type {IDBTransaction} */ let tx; - if (this.#request && - this.#txPending.has(this.#request.transaction) && - this.#request.transaction.mode >= mode && - this.#request.transaction.durability === options.durability) { - // The previous request transaction is compatible and has - // not yet completed. - tx = this.#request.transaction; - - // If the previous request is pending, wait for it to complete. - // This ensures that the transaction will be active. - if (this.#request.readyState === 'pending') { - await new Promise(resolve => { - this.#request.addEventListener('success', resolve, { once: true }); - this.#request.addEventListener('error', resolve, { once: true }); - }); - } - } - - for (let i = 0; i < 2; ++i) { - if (!tx) { - // The current transaction is missing or doesn't match so - // replace it with a new one. wait for the previous - // transaction to complete so the lifetimes do not overlap. - await this.#txComplete; - - // Create the new transaction. - // @ts-ignore - tx = this.#database.transaction(this.#database.objectStoreNames, mode, options); - this.log?.('IDBTransaction open', mode); - this.#txPending.add(tx); - this.#txComplete = new Promise((resolve, reject) => { - tx.addEventListener('complete', () => { - this.log?.('IDBTransaction complete'); - this.#txPending.delete(tx); - resolve(); - }); - tx.addEventListener('abort', () => { - this.#txPending.delete(tx); - reject(new Error('transaction aborted')); - }); - }); - } - - // @ts-ignore - // Create object store proxies. - const objectStores = [...tx.objectStoreNames].map(name => { - return [name, this.proxyStoreOrIndex(tx.objectStore(name))]; - }); - - try { - // Execute the function. - return await f(Object.fromEntries(objectStores)); - } catch (e) { - // Use a new transaction if this one was inactive. This will - // happen if the last request in the transaction completed - // in a previous task but the transaction has not yet committed. - if (!i && e.name === 'TransactionInactiveError') { - this.log?.('TransactionInactiveError, retrying'); - tx = null; - continue; - } - throw e; - } - } - } - - /** - * Object store methods that return an IDBRequest, except for cursor - * creation, are wrapped to return a Promise. In addition, the - * request is used internally for chaining. - * @param {IDBObjectStore} objectStore - * @returns - */ - proxyStoreOrIndex(objectStore) { - return new Proxy(objectStore, { - get: (target, property, receiver) => { - const result = Reflect.get(target, property, receiver); - if (typeof result === 'function') { - return (...args) => { - const maybeRequest = Reflect.apply(result, target, args); - // @ts-ignore - if (maybeRequest instanceof IDBRequest && !property.endsWith('Cursor')) { - // // Debug logging. - // this.log?.(`${target.name}.${String(property)}`, args); - // maybeRequest.addEventListener('success', () => { - // this.log?.(`${target.name}.${String(property)} success`, maybeRequest.result); - // }); - // maybeRequest.addEventListener('error', () => { - // this.log?.(`${target.name}.${String(property)} error`, maybeRequest.error); - // }); - - // Save the request. - this.#request = maybeRequest; - - // Abort the transaction on error. - maybeRequest.addEventListener('error', () => { - console.error(maybeRequest.error); - maybeRequest.transaction.abort(); - }, { once: true }); - - // Return a Promise. - return wrap(maybeRequest); - } - return maybeRequest; - } - } - return result; - } - }); - } - - /** - * @param {boolean} durable - */ - async sync(durable) { - if (this.#chain) { - // This waits for all IndexedDB calls to be made. - await this.#chain; - if (durable) { - // This waits for the final transaction to commit. - await this.#txComplete; - } - this.reset(); - } - } - - reset() { - this.#chain = null; - this.#txComplete = Promise.resolve(); - this.#request = null; - } -} - -/** - * @param {IDBRequest} request - * @returns {Promise} - */ -function wrap(request) { - return new Promise((resolve, reject) => { - request.onsuccess = () => resolve(request.result); - request.onerror = () => reject(request.error); - }); -} - diff --git a/packages/replicate/assets/wa-sqlite/src/sqlite-api.js b/packages/replicate/assets/wa-sqlite/src/sqlite-api.js deleted file mode 100644 index 37cf8d0..0000000 --- a/packages/replicate/assets/wa-sqlite/src/sqlite-api.js +++ /dev/null @@ -1,870 +0,0 @@ -// Copyright 2021 Roy T. Hashimoto. All Rights Reserved. - -import * as SQLite from './sqlite-constants.js'; -export * from './sqlite-constants.js'; - -const MAX_INT64 = 0x7fffffffffffffffn; -const MIN_INT64 = -0x8000000000000000n; - -const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor; - -export class SQLiteError extends Error { - constructor(message, code) { - super(message); - this.code = code; - } -} - -const async = true; - -/** - * Builds a Javascript API from the Emscripten module. This API is still - * low-level and closely corresponds to the C API exported by the module, - * but differs in some specifics like throwing exceptions on errors. - * @param {*} Module SQLite Emscripten module - * @returns {SQLiteAPI} - */ -export function Factory(Module) { - /** @type {SQLiteAPI} */ const sqlite3 = {}; - - Module.retryOps = []; - const sqliteFreeAddress = Module._getSqliteFree(); - - // Allocate some space for 32-bit returned values. - const tmp = Module._malloc(8); - const tmpPtr = [tmp, tmp + 4]; - - // Convert a JS string to a C string. sqlite3_malloc is used to allocate - // memory (use sqlite3_free to deallocate). - function createUTF8(s) { - if (typeof s !== 'string') return 0; - const utf8 = new TextEncoder().encode(s); - const zts = Module._sqlite3_malloc(utf8.byteLength + 1); - Module.HEAPU8.set(utf8, zts); - Module.HEAPU8[zts + utf8.byteLength] = 0; - return zts; - } - - /** - * Concatenate 32-bit numbers into a 64-bit (signed) BigInt. - * @param {number} lo32 - * @param {number} hi32 - * @returns {bigint} - */ - function cvt32x2ToBigInt(lo32, hi32) { - return (BigInt(hi32) << 32n) | (BigInt(lo32) & 0xffffffffn); - } - - /** - * Concatenate 32-bit numbers and return as number or BigInt, depending - * on the value. - * @param {number} lo32 - * @param {number} hi32 - * @returns {number|bigint} - */ - const cvt32x2AsSafe = (function() { - const hiMax = BigInt(Number.MAX_SAFE_INTEGER) >> 32n; - const hiMin = BigInt(Number.MIN_SAFE_INTEGER) >> 32n; - - return function(lo32, hi32) { - if (hi32 > hiMax || hi32 < hiMin) { - // Can't be expressed as a Number so use BigInt. - return cvt32x2ToBigInt(lo32, hi32); - } else { - // Combine the upper and lower 32-bit numbers. The complication is - // that lo32 is a signed integer which makes manipulating its bits - // a little tricky - the sign bit gets handled separately. - return (hi32 * 0x100000000) + (lo32 & 0x7fffffff) - (lo32 & 0x80000000); - } - } - })(); - - const databases = new Set(); - function verifyDatabase(db) { - if (!databases.has(db)) { - throw new SQLiteError('not a database', SQLite.SQLITE_MISUSE); - } - } - - const mapStmtToDB = new Map(); - function verifyStatement(stmt) { - if (!mapStmtToDB.has(stmt)) { - throw new SQLiteError('not a statement', SQLite.SQLITE_MISUSE); - } - } - - sqlite3.bind_collection = function(stmt, bindings) { - verifyStatement(stmt); - const isArray = Array.isArray(bindings); - const nBindings = sqlite3.bind_parameter_count(stmt); - for (let i = 1; i <= nBindings; ++i) { - const key = isArray ? i - 1 : sqlite3.bind_parameter_name(stmt, i); - const value = bindings[key]; - if (value !== undefined) { - sqlite3.bind(stmt, i, value); - } - } - return SQLite.SQLITE_OK; - }; - - sqlite3.bind = function(stmt, i, value) { - verifyStatement(stmt); - switch (typeof value) { - case 'number': - if (value === (value | 0)) { - return sqlite3.bind_int(stmt, i, value); - } else { - return sqlite3.bind_double(stmt, i, value); - } - case 'string': - return sqlite3.bind_text(stmt, i, value); - default: - if (value instanceof Uint8Array || Array.isArray(value)) { - return sqlite3.bind_blob(stmt, i, value); - } else if (value === null) { - return sqlite3.bind_null(stmt, i); - } else if (typeof value === 'bigint') { - return sqlite3.bind_int64(stmt, i, value); - } else if (value === undefined) { - // Existing binding (or NULL) will be used. - return SQLite.SQLITE_NOTICE; - } else { - console.warn('unknown binding converted to null', value); - return sqlite3.bind_null(stmt, i); - } - } - }; - - sqlite3.bind_blob = (function() { - const fname = 'sqlite3_bind_blob'; - const f = Module.cwrap(fname, ...decl('nnnnn:n')); - return function(stmt, i, value) { - verifyStatement(stmt); - // @ts-ignore - const byteLength = value.byteLength ?? value.length; - const ptr = Module._sqlite3_malloc(byteLength); - Module.HEAPU8.subarray(ptr).set(value); - const result = f(stmt, i, ptr, byteLength, sqliteFreeAddress); - return check(fname, result, mapStmtToDB.get(stmt)); - }; - })(); - - sqlite3.bind_parameter_count = (function() { - const fname = 'sqlite3_bind_parameter_count'; - const f = Module.cwrap(fname, ...decl('n:n')); - return function(stmt) { - verifyStatement(stmt); - const result = f(stmt); - return result; - }; - })(); - - sqlite3.bind_double = (function() { - const fname = 'sqlite3_bind_double'; - const f = Module.cwrap(fname, ...decl('nnn:n')); - return function(stmt, i, value) { - verifyStatement(stmt); - const result = f(stmt, i, value); - return check(fname, result, mapStmtToDB.get(stmt)); - }; - })(); - - sqlite3.bind_int = (function() { - const fname = 'sqlite3_bind_int'; - const f = Module.cwrap(fname, ...decl('nnn:n')); - return function(stmt, i, value) { - verifyStatement(stmt); - if (value > 0x7fffffff || value < -0x80000000) return SQLite.SQLITE_RANGE; - - const result = f(stmt, i, value); - return check(fname, result, mapStmtToDB.get(stmt)); - }; - })(); - - sqlite3.bind_int64 = (function() { - const fname = 'sqlite3_bind_int64'; - const f = Module.cwrap(fname, ...decl('nnnn:n')); - return function(stmt, i, value) { - verifyStatement(stmt); - if (value > MAX_INT64 || value < MIN_INT64) return SQLite.SQLITE_RANGE; - - const lo32 = value & 0xffffffffn; - const hi32 = value >> 32n; - const result = f(stmt, i, Number(lo32), Number(hi32)); - return check(fname, result, mapStmtToDB.get(stmt)); - }; - })(); - - sqlite3.bind_null = (function() { - const fname = 'sqlite3_bind_null'; - const f = Module.cwrap(fname, ...decl('nn:n')); - return function(stmt, i) { - verifyStatement(stmt); - const result = f(stmt, i); - return check(fname, result, mapStmtToDB.get(stmt)); - }; - })(); - - sqlite3.bind_parameter_name = (function() { - const fname = 'sqlite3_bind_parameter_name'; - const f = Module.cwrap(fname, ...decl('n:s')); - return function(stmt, i) { - verifyStatement(stmt); - const result = f(stmt, i); - return result; - }; - })(); - - sqlite3.bind_text = (function() { - const fname = 'sqlite3_bind_text'; - const f = Module.cwrap(fname, ...decl('nnnnn:n')); - return function(stmt, i, value) { - verifyStatement(stmt); - const ptr = createUTF8(value); - const result = f(stmt, i, ptr, -1, sqliteFreeAddress); - return check(fname, result, mapStmtToDB.get(stmt)); - }; - })(); - - sqlite3.changes = (function() { - const fname = 'sqlite3_changes'; - const f = Module.cwrap(fname, ...decl('n:n')); - return function(db) { - verifyDatabase(db); - const result = f(db); - return result; - }; - })(); - - sqlite3.close = (function() { - const fname = 'sqlite3_close'; - const f = Module.cwrap(fname, ...decl('n:n'), { async }); - return async function(db) { - verifyDatabase(db); - const result = await f(db); - databases.delete(db); - return check(fname, result, db); - }; - })(); - - sqlite3.column = function(stmt, iCol) { - verifyStatement(stmt); - const type = sqlite3.column_type(stmt, iCol); - switch (type) { - case SQLite.SQLITE_BLOB: - return sqlite3.column_blob(stmt, iCol); - case SQLite.SQLITE_FLOAT: - return sqlite3.column_double(stmt, iCol); - case SQLite.SQLITE_INTEGER: - const lo32 = sqlite3.column_int(stmt, iCol); - const hi32 = Module.getTempRet0(); - return cvt32x2AsSafe(lo32, hi32); - case SQLite.SQLITE_NULL: - return null; - case SQLite.SQLITE_TEXT: - return sqlite3.column_text(stmt, iCol); - default: - throw new SQLiteError('unknown type', type); - } - }; - - sqlite3.column_blob = (function() { - const fname = 'sqlite3_column_blob'; - const f = Module.cwrap(fname, ...decl('nn:n')); - return function(stmt, iCol) { - verifyStatement(stmt); - const nBytes = sqlite3.column_bytes(stmt, iCol); - const address = f(stmt, iCol); - const result = Module.HEAPU8.subarray(address, address + nBytes); - return result; - }; - })(); - - sqlite3.column_bytes = (function() { - const fname = 'sqlite3_column_bytes'; - const f = Module.cwrap(fname, ...decl('nn:n')); - return function(stmt, iCol) { - verifyStatement(stmt); - const result = f(stmt, iCol); - return result; - }; - })(); - - sqlite3.column_count = (function() { - const fname = 'sqlite3_column_count'; - const f = Module.cwrap(fname, ...decl('n:n')); - return function(stmt) { - verifyStatement(stmt); - const result = f(stmt); - return result; - }; - })(); - - sqlite3.column_double = (function() { - const fname = 'sqlite3_column_double'; - const f = Module.cwrap(fname, ...decl('nn:n')); - return function(stmt, iCol) { - verifyStatement(stmt); - const result = f(stmt, iCol); - return result; - }; - })(); - - sqlite3.column_int = (function() { - // Retrieve int64 but use only the lower 32 bits. The upper 32-bits are - // accessible with Module.getTempRet0(). - const fname = 'sqlite3_column_int64'; - const f = Module.cwrap(fname, ...decl('nn:n')); - return function(stmt, iCol) { - verifyStatement(stmt); - const result = f(stmt, iCol); - return result; - }; - })(); - - sqlite3.column_int64 = (function() { - const fname = 'sqlite3_column_int64'; - const f = Module.cwrap(fname, ...decl('nn:n')); - return function(stmt, iCol) { - verifyStatement(stmt); - const lo32 = f(stmt, iCol); - const hi32 = Module.getTempRet0(); - const result = cvt32x2ToBigInt(lo32, hi32); - return result; - }; - })(); - - sqlite3.column_name = (function() { - const fname = 'sqlite3_column_name'; - const f = Module.cwrap(fname, ...decl('nn:s')); - return function(stmt, iCol) { - verifyStatement(stmt); - const result = f(stmt, iCol); - return result; - }; - })(); - - sqlite3.column_names = function(stmt) { - const columns = []; - const nColumns = sqlite3.column_count(stmt); - for (let i = 0; i < nColumns; ++i) { - columns.push(sqlite3.column_name(stmt, i)); - } - return columns; - }; - - sqlite3.column_text = (function() { - const fname = 'sqlite3_column_text'; - const f = Module.cwrap(fname, ...decl('nn:s')); - return function(stmt, iCol) { - verifyStatement(stmt); - const result = f(stmt, iCol); - return result; - }; - })(); - - sqlite3.column_type = (function() { - const fname = 'sqlite3_column_type'; - const f = Module.cwrap(fname, ...decl('nn:n')); - return function(stmt, iCol) { - verifyStatement(stmt); - const result = f(stmt, iCol); - return result; - }; - })(); - - sqlite3.create_function = function(db, zFunctionName, nArg, eTextRep, pApp, xFunc, xStep, xFinal) { - verifyDatabase(db); - - // Convert SQLite callback arguments to JavaScript-friendly arguments. - function adapt(f) { - return f instanceof AsyncFunction ? - (async (ctx, n, values) => f(ctx, Module.HEAP32.subarray(values / 4, values / 4 + n))) : - ((ctx, n, values) => f(ctx, Module.HEAP32.subarray(values / 4, values / 4 + n))); - } - - const result = Module.create_function( - db, - zFunctionName, - nArg, - eTextRep, - pApp, - xFunc && adapt(xFunc), - xStep && adapt(xStep), - xFinal); - return check('sqlite3_create_function', result, db); - }; - - sqlite3.data_count = (function() { - const fname = 'sqlite3_data_count'; - const f = Module.cwrap(fname, ...decl('n:n')); - return function(stmt) { - verifyStatement(stmt); - const result = f(stmt); - return result; - }; - })(); - - sqlite3.exec = async function(db, sql, callback) { - for await (const stmt of sqlite3.statements(db, sql)) { - let columns; - while (await sqlite3.step(stmt) === SQLite.SQLITE_ROW) { - if (callback) { - columns = columns ?? sqlite3.column_names(stmt); - const row = sqlite3.row(stmt); - await callback(row, columns); - } - } - } - return SQLite.SQLITE_OK; - }; - - sqlite3.finalize = (function() { - const fname = 'sqlite3_finalize'; - const f = Module.cwrap(fname, ...decl('n:n'), { async }); - return async function(stmt) { - const result = await f(stmt); - mapStmtToDB.delete(stmt) - - // Don't throw on error here. Typically the error has already been - // thrown and finalize() is part of the cleanup. - return result; - }; - })(); - - sqlite3.get_autocommit = (function() { - const fname = 'sqlite3_get_autocommit'; - const f = Module.cwrap(fname, ...decl('n:n')); - return function(db) { - const result = f(db); - return result; - }; - })(); - - sqlite3.libversion = (function() { - const fname = 'sqlite3_libversion'; - const f = Module.cwrap(fname, ...decl(':s')); - return function() { - const result = f(); - return result; - }; - })(); - - sqlite3.libversion_number = (function() { - const fname = 'sqlite3_libversion_number'; - const f = Module.cwrap(fname, ...decl(':n')); - return function() { - const result = f(); - return result; - }; - })(); - - sqlite3.limit = (function() { - const fname = 'sqlite3_limit'; - const f = Module.cwrap(fname, ...decl('nnn:n')); - return function(db, id, newVal) { - const result = f(db, id, newVal); - return result; - }; - })(); - - sqlite3.open_v2 = (function() { - const fname = 'sqlite3_open_v2'; - const f = Module.cwrap(fname, ...decl('snnn:n'), { async }); - return async function(zFilename, flags, zVfs) { - flags = flags || SQLite.SQLITE_OPEN_CREATE | SQLite.SQLITE_OPEN_READWRITE; - zVfs = createUTF8(zVfs); - try { - // Allow retry operations. - const rc = await retry(() => f(zFilename, tmpPtr[0], flags, zVfs)); - - const db = Module.getValue(tmpPtr[0], '*'); - databases.add(db); - - Module.ccall('RegisterExtensionFunctions', 'void', ['number'], [db]); - check(fname, rc); - return db; - } finally { - Module._sqlite3_free(zVfs); - } - }; - })(); - - sqlite3.progress_handler = function(db, nProgressOps, handler, userData) { - verifyDatabase(db); - Module.progress_handler(db, nProgressOps, handler, userData); - };; - - sqlite3.reset = (function() { - const fname = 'sqlite3_reset'; - const f = Module.cwrap(fname, ...decl('n:n'), { async }); - return async function(stmt) { - verifyStatement(stmt); - const result = await f(stmt); - return check(fname, result, mapStmtToDB.get(stmt)); - }; - })(); - - sqlite3.result = function(context, value) { - switch (typeof value) { - case 'number': - if (value === (value | 0)) { - sqlite3.result_int(context, value); - } else { - sqlite3.result_double(context, value); - } - break; - case 'string': - sqlite3.result_text(context, value); - break; - default: - if (value instanceof Uint8Array || Array.isArray(value)) { - sqlite3.result_blob(context, value); - } else if (value === null) { - sqlite3.result_null(context); - } else if (typeof value === 'bigint') { - return sqlite3.result_int64(context, value); - } else { - console.warn('unknown result converted to null', value); - sqlite3.result_null(context); - } - break; - } - - }; - - sqlite3.result_blob = (function() { - const fname = 'sqlite3_result_blob'; - const f = Module.cwrap(fname, ...decl('nnnn:n')); - return function(context, value) { - // @ts-ignore - const byteLength = value.byteLength ?? value.length; - const ptr = Module._sqlite3_malloc(byteLength); - Module.HEAPU8.subarray(ptr).set(value); - f(context, ptr, byteLength, sqliteFreeAddress); // void return - }; - })(); - - sqlite3.result_double = (function() { - const fname = 'sqlite3_result_double'; - const f = Module.cwrap(fname, ...decl('nn:n')); - return function(context, value) { - f(context, value); // void return - }; - })(); - - sqlite3.result_int = (function() { - const fname = 'sqlite3_result_int'; - const f = Module.cwrap(fname, ...decl('nn:n')); - return function(context, value) { - f(context, value); // void return - }; - })(); - - sqlite3.result_int64 = (function() { - const fname = 'sqlite3_result_int64'; - const f = Module.cwrap(fname, ...decl('nnn:n')); - return function(context, value) { - if (value > MAX_INT64 || value < MIN_INT64) return SQLite.SQLITE_RANGE; - - const lo32 = value & 0xffffffffn; - const hi32 = value >> 32n; - f(context, Number(lo32), Number(hi32)); // void return - }; - })(); - - sqlite3.result_null = (function() { - const fname = 'sqlite3_result_null'; - const f = Module.cwrap(fname, ...decl('n:n')); - return function(context) { - f(context); // void return - }; - })(); - - sqlite3.result_text = (function() { - const fname = 'sqlite3_result_text'; - const f = Module.cwrap(fname, ...decl('nnnn:n')); - return function(context, value) { - const ptr = createUTF8(value); - f(context, ptr, -1, sqliteFreeAddress); // void return - }; - })(); - - sqlite3.row = function(stmt) { - const row = []; - const nColumns = sqlite3.data_count(stmt); - for (let i = 0; i < nColumns; ++i) { - const value = sqlite3.column(stmt, i); - - // Copy blob if aliasing volatile WebAssembly memory. This avoids an - // unnecessary copy if users monkey patch column_blob to copy. - // @ts-ignore - row.push(value?.buffer === Module.HEAPU8.buffer ? value.slice() : value); - } - return row; - }; - - sqlite3.set_authorizer = function(db, xAuth, pApp) { - verifyDatabase(db); - - // Convert SQLite callback arguments to JavaScript-friendly arguments. - function cvtArgs(_, iAction, p3, p4, p5, p6) { - return [ - _, - iAction, - Module.UTF8ToString(p3), - Module.UTF8ToString(p4), - Module.UTF8ToString(p5), - Module.UTF8ToString(p6) - ]; - }; - function adapt(f) { - return f instanceof AsyncFunction ? - (async (_, iAction, p3, p4, p5, p6) => f(cvtArgs(_, iAction, p3, p4, p5, p6))) : - ((_, iAction, p3, p4, p5, p6) => f(cvtArgs(_, iAction, p3, p4, p5, p6))); - } - - const result = Module.set_authorizer(db, adapt(xAuth), pApp); - return check('sqlite3_set_authorizer', result, db); - };; - - sqlite3.sql = (function() { - const fname = 'sqlite3_sql'; - const f = Module.cwrap(fname, ...decl('n:s')); - return function(stmt) { - verifyStatement(stmt); - const result = f(stmt); - return result; - }; - })(); - - sqlite3.statements = function(db, sql, options = {}) { - const prepare = Module.cwrap( - 'sqlite3_prepare_v3', - 'number', - ['number', 'number', 'number', 'number', 'number', 'number'], - { async: true }); - - return (async function*() { - const onFinally = []; - try { - // Encode SQL string to UTF-8. - const utf8 = new TextEncoder().encode(sql); - - // Copy encoded string to WebAssembly memory. The SQLite docs say - // zero-termination is a minor optimization so add room for that. - // Also add space for the statement handle and SQL tail pointer. - const allocSize = utf8.byteLength - (utf8.byteLength % 4) + 12; - const pzHead = Module._sqlite3_malloc(allocSize); - const pzEnd = pzHead + utf8.byteLength + 1; - onFinally.push(() => Module._sqlite3_free(pzHead)); - Module.HEAPU8.set(utf8, pzHead); - Module.HEAPU8[pzEnd - 1] = 0; - - // Use extra space for the statement handle and SQL tail pointer. - const pStmt = pzHead + allocSize - 8; - const pzTail = pzHead + allocSize - 4; - - // Ensure that statement handles are not leaked. - let stmt; - function maybeFinalize() { - if (stmt && !options.unscoped) { - sqlite3.finalize(stmt); - } - stmt = 0; - } - onFinally.push(maybeFinalize); - - // Loop over statements. - Module.setValue(pzTail, pzHead, '*'); - do { - // Reclaim resources for the previous iteration. - maybeFinalize(); - - // Call sqlite3_prepare_v3() for the next statement. - // Allow retry operations. - const zTail = Module.getValue(pzTail, '*'); - const rc = await retry(() => { - return prepare( - db, - zTail, - pzEnd - pzTail, - options.flags || 0, - pStmt, - pzTail); - }); - - if (rc !== SQLite.SQLITE_OK) { - check('sqlite3_prepare_v3', rc, db); - } - - stmt = Module.getValue(pStmt, '*'); - if (stmt) { - mapStmtToDB.set(stmt, db); - yield stmt; - } - } while (stmt); - } finally { - while (onFinally.length) { - onFinally.pop()(); - } - } - })(); - }; - - sqlite3.step = (function() { - const fname = 'sqlite3_step'; - const f = Module.cwrap(fname, ...decl('n:n'), { async }); - return async function(stmt) { - verifyStatement(stmt); - - // Allow retry operations. - const rc = await retry(() => f(stmt)); - - return check(fname, rc, mapStmtToDB.get(stmt), [SQLite.SQLITE_ROW, SQLite.SQLITE_DONE]); - }; - })(); - - sqlite3.value = function(pValue) { - const type = sqlite3.value_type(pValue); - switch (type) { - case SQLite.SQLITE_BLOB: - return sqlite3.value_blob(pValue); - case SQLite.SQLITE_FLOAT: - return sqlite3.value_double(pValue); - case SQLite.SQLITE_INTEGER: - const lo32 = sqlite3.value_int(pValue); - const hi32 = Module.getTempRet0(); - return cvt32x2AsSafe(lo32, hi32); - case SQLite.SQLITE_NULL: - return null; - case SQLite.SQLITE_TEXT: - return sqlite3.value_text(pValue); - default: - throw new SQLiteError('unknown type', type); - } - }; - - sqlite3.value_blob = (function() { - const fname = 'sqlite3_value_blob'; - const f = Module.cwrap(fname, ...decl('n:n')); - return function(pValue) { - const nBytes = sqlite3.value_bytes(pValue); - const address = f(pValue); - const result = Module.HEAPU8.subarray(address, address + nBytes); - return result; - }; - })(); - - sqlite3.value_bytes = (function() { - const fname = 'sqlite3_value_bytes'; - const f = Module.cwrap(fname, ...decl('n:n')); - return function(pValue) { - const result = f(pValue); - return result; - }; - })(); - - sqlite3.value_double = (function() { - const fname = 'sqlite3_value_double'; - const f = Module.cwrap(fname, ...decl('n:n')); - return function(pValue) { - const result = f(pValue); - return result; - }; - })(); - - sqlite3.value_int = (function() { - const fname = 'sqlite3_value_int64'; - const f = Module.cwrap(fname, ...decl('n:n')); - return function(pValue) { - const result = f(pValue); - return result; - }; - })(); - - sqlite3.value_int64 = (function() { - const fname = 'sqlite3_value_int64'; - const f = Module.cwrap(fname, ...decl('n:n')); - return function(pValue) { - const lo32 = f(pValue); - const hi32 = Module.getTempRet0(); - const result = cvt32x2ToBigInt(lo32, hi32); - return result; - }; - })(); - - sqlite3.value_text = (function() { - const fname = 'sqlite3_value_text'; - const f = Module.cwrap(fname, ...decl('n:s')); - return function(pValue) { - const result = f(pValue); - return result; - }; - })(); - - sqlite3.value_type = (function() { - const fname = 'sqlite3_value_type'; - const f = Module.cwrap(fname, ...decl('n:n')); - return function(pValue) { - const result = f(pValue); - return result; - }; - })(); - - sqlite3.vfs_register = function(vfs, makeDefault) { - const result = Module.vfs_register(vfs, makeDefault); - return check('sqlite3_vfs_register', result); - }; - - function check(fname, result, db = null, allowed = [SQLite.SQLITE_OK]) { - if (allowed.includes(result)) return result; - const message = db ? - Module.ccall('sqlite3_errmsg', 'string', ['number'], [db]) : - fname; - throw new SQLiteError(message, result); - } - - // This function is used to automatically retry failed calls that - // have pending retry operations that should allow the retry to - // succeed. - async function retry(f) { - let rc; - do { - // Wait for all pending retry operations to complete. This is - // normally empty on the first loop iteration. - if (Module.retryOps.length) { - await Promise.all(Module.retryOps); - Module.retryOps = []; - } - - rc = await f(); - - // Retry on failure with new pending retry operations. - } while (rc && Module.retryOps.length); - return rc; - } - - return sqlite3; -} - -// Helper function to use a more compact signature specification. -function decl(s) { - const result = []; - const m = s.match(/([ns@]*):([nsv@])/); - switch (m[2]) { - case 'n': result.push('number'); break; - case 's': result.push('string'); break; - case 'v': result.push(null); break; - } - - const args = []; - for (let c of m[1]) { - switch (c) { - case 'n': args.push('number'); break; - case 's': args.push('string'); break; - } - } - result.push(args); - return result; -} diff --git a/packages/replicate/assets/wa-sqlite/src/sqlite-constants.js b/packages/replicate/assets/wa-sqlite/src/sqlite-constants.js deleted file mode 100644 index 3878b16..0000000 --- a/packages/replicate/assets/wa-sqlite/src/sqlite-constants.js +++ /dev/null @@ -1,275 +0,0 @@ -// Primary result codes. -// https://www.sqlite.org/rescode.html -export const SQLITE_OK = 0; -export const SQLITE_ERROR = 1; -export const SQLITE_INTERNAL = 2; -export const SQLITE_PERM = 3; -export const SQLITE_ABORT = 4; -export const SQLITE_BUSY = 5; -export const SQLITE_LOCKED = 6; -export const SQLITE_NOMEM = 7; -export const SQLITE_READONLY = 8; -export const SQLITE_INTERRUPT = 9; -export const SQLITE_IOERR = 10; -export const SQLITE_CORRUPT = 11; -export const SQLITE_NOTFOUND = 12; -export const SQLITE_FULL = 13; -export const SQLITE_CANTOPEN = 14; -export const SQLITE_PROTOCOL = 15; -export const SQLITE_EMPTY = 16; -export const SQLITE_SCHEMA = 17; -export const SQLITE_TOOBIG = 18; -export const SQLITE_CONSTRAINT = 19; -export const SQLITE_MISMATCH = 20; -export const SQLITE_MISUSE = 21; -export const SQLITE_NOLFS = 22; -export const SQLITE_AUTH = 23; -export const SQLITE_FORMAT = 24; -export const SQLITE_RANGE = 25; -export const SQLITE_NOTADB = 26; -export const SQLITE_NOTICE = 27; -export const SQLITE_WARNING = 28; -export const SQLITE_ROW = 100; -export const SQLITE_DONE = 101; - -// Extended error codes. -export const SQLITE_IOERR_ACCESS = 3338; -export const SQLITE_IOERR_CHECKRESERVEDLOCK = 3594; -export const SQLITE_IOERR_CLOSE = 4106; -export const SQLITE_IOERR_DATA = 8202; -export const SQLITE_IOERR_DELETE = 2570; -export const SQLITE_IOERR_DELETE_NOENT = 5898; -export const SQLITE_IOERR_DIR_FSYNC = 1290; -export const SQLITE_IOERR_FSTAT = 1802; -export const SQLITE_IOERR_FSYNC = 1034; -export const SQLITE_IOERR_GETTEMPPATH = 6410; -export const SQLITE_IOERR_LOCK = 3850; -export const SQLITE_IOERR_NOMEM = 3082; -export const SQLITE_IOERR_READ = 266; -export const SQLITE_IOERR_RDLOCK = 2314; -export const SQLITE_IOERR_SEEK = 5642; -export const SQLITE_IOERR_SHORT_READ = 522; -export const SQLITE_IOERR_TRUNCATE = 1546; -export const SQLITE_IOERR_UNLOCK = 2058; -export const SQLITE_IOERR_VNODE = 6922; -export const SQLITE_IOERR_WRITE = 778; -export const SQLITE_IOERR_BEGIN_ATOMIC = 7434; -export const SQLITE_IOERR_COMMIT_ATOMIC = 7690; -export const SQLITE_IOERR_ROLLBACK_ATOMIC = 7946; - -// Other extended result codes. -export const SQLITE_CONSTRAINT_CHECK = 275; -export const SQLITE_CONSTRAINT_COMMITHOOK = 531; -export const SQLITE_CONSTRAINT_FOREIGNKEY = 787; -export const SQLITE_CONSTRAINT_FUNCTION = 1043; -export const SQLITE_CONSTRAINT_NOTNULL = 1299; -export const SQLITE_CONSTRAINT_PINNED = 2835; -export const SQLITE_CONSTRAINT_PRIMARYKEY = 1555; -export const SQLITE_CONSTRAINT_ROWID = 2579; -export const SQLITE_CONSTRAINT_TRIGGER = 1811; -export const SQLITE_CONSTRAINT_UNIQUE = 2067; -export const SQLITE_CONSTRAINT_VTAB = 2323; - -// Open flags. -// https://www.sqlite.org/c3ref/c_open_autoproxy.html -export const SQLITE_OPEN_READONLY = 0x00000001; -export const SQLITE_OPEN_READWRITE = 0x00000002; -export const SQLITE_OPEN_CREATE = 0x00000004; -export const SQLITE_OPEN_DELETEONCLOSE = 0x00000008; -export const SQLITE_OPEN_EXCLUSIVE = 0x00000010; -export const SQLITE_OPEN_AUTOPROXY = 0x00000020; -export const SQLITE_OPEN_URI = 0x00000040; -export const SQLITE_OPEN_MEMORY = 0x00000080; -export const SQLITE_OPEN_MAIN_DB = 0x00000100; -export const SQLITE_OPEN_TEMP_DB = 0x00000200; -export const SQLITE_OPEN_TRANSIENT_DB = 0x00000400; -export const SQLITE_OPEN_MAIN_JOURNAL = 0x00000800; -export const SQLITE_OPEN_TEMP_JOURNAL = 0x00001000; -export const SQLITE_OPEN_SUBJOURNAL = 0x00002000; -export const SQLITE_OPEN_SUPER_JOURNAL = 0x00004000; -export const SQLITE_OPEN_NOMUTEX = 0x00008000; -export const SQLITE_OPEN_FULLMUTEX = 0x00010000; -export const SQLITE_OPEN_SHAREDCACHE = 0x00020000; -export const SQLITE_OPEN_PRIVATECACHE = 0x00040000; -export const SQLITE_OPEN_WAL = 0x00080000; -export const SQLITE_OPEN_NOFOLLOW = 0x01000000; - -// Locking levels. -// https://www.sqlite.org/c3ref/c_lock_exclusive.html -export const SQLITE_LOCK_NONE = 0; -export const SQLITE_LOCK_SHARED = 1; -export const SQLITE_LOCK_RESERVED = 2; -export const SQLITE_LOCK_PENDING = 3; -export const SQLITE_LOCK_EXCLUSIVE = 4; - -// Device characteristics. -// https://www.sqlite.org/c3ref/c_iocap_atomic.html -export const SQLITE_IOCAP_ATOMIC = 0x00000001; -export const SQLITE_IOCAP_ATOMIC512 = 0x00000002; -export const SQLITE_IOCAP_ATOMIC1K = 0x00000004; -export const SQLITE_IOCAP_ATOMIC2K = 0x00000008; -export const SQLITE_IOCAP_ATOMIC4K = 0x00000010; -export const SQLITE_IOCAP_ATOMIC8K = 0x00000020; -export const SQLITE_IOCAP_ATOMIC16K = 0x00000040; -export const SQLITE_IOCAP_ATOMIC32K = 0x00000080; -export const SQLITE_IOCAP_ATOMIC64K = 0x00000100; -export const SQLITE_IOCAP_SAFE_APPEND = 0x00000200; -export const SQLITE_IOCAP_SEQUENTIAL = 0x00000400; -export const SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN = 0x00000800; -export const SQLITE_IOCAP_POWERSAFE_OVERWRITE = 0x00001000; -export const SQLITE_IOCAP_IMMUTABLE = 0x00002000; -export const SQLITE_IOCAP_BATCH_ATOMIC = 0x00004000; - -// xAccess flags. -// https://www.sqlite.org/c3ref/c_access_exists.html -export const SQLITE_ACCESS_EXISTS = 0; -export const SQLITE_ACCESS_READWRITE = 1; -export const SQLITE_ACCESS_READ = 2; - -// File control opcodes -// https://www.sqlite.org/c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlbeginatomicwrite -export const SQLITE_FCNTL_LOCKSTATE = 1; -export const SQLITE_FCNTL_GET_LOCKPROXYFILE = 2; -export const SQLITE_FCNTL_SET_LOCKPROXYFILE = 3; -export const SQLITE_FCNTL_LAST_ERRNO = 4; -export const SQLITE_FCNTL_SIZE_HINT = 5; -export const SQLITE_FCNTL_CHUNK_SIZE = 6; -export const SQLITE_FCNTL_FILE_POINTER = 7; -export const SQLITE_FCNTL_SYNC_OMITTED = 8; -export const SQLITE_FCNTL_WIN32_AV_RETRY = 9; -export const SQLITE_FCNTL_PERSIST_WAL = 10; -export const SQLITE_FCNTL_OVERWRITE = 11; -export const SQLITE_FCNTL_VFSNAME = 12; -export const SQLITE_FCNTL_POWERSAFE_OVERWRITE = 13; -export const SQLITE_FCNTL_PRAGMA = 14; -export const SQLITE_FCNTL_BUSYHANDLER = 15; -export const SQLITE_FCNTL_TEMPFILENAME = 16; -export const SQLITE_FCNTL_MMAP_SIZE = 18; -export const SQLITE_FCNTL_TRACE = 19; -export const SQLITE_FCNTL_HAS_MOVED = 20; -export const SQLITE_FCNTL_SYNC = 21; -export const SQLITE_FCNTL_COMMIT_PHASETWO = 22; -export const SQLITE_FCNTL_WIN32_SET_HANDLE = 23; -export const SQLITE_FCNTL_WAL_BLOCK = 24; -export const SQLITE_FCNTL_ZIPVFS = 25; -export const SQLITE_FCNTL_RBU = 26; -export const SQLITE_FCNTL_VFS_POINTER = 27; -export const SQLITE_FCNTL_JOURNAL_POINTER = 28; -export const SQLITE_FCNTL_WIN32_GET_HANDLE = 29; -export const SQLITE_FCNTL_PDB = 30; -export const SQLITE_FCNTL_BEGIN_ATOMIC_WRITE = 31; -export const SQLITE_FCNTL_COMMIT_ATOMIC_WRITE = 32; -export const SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE = 33; -export const SQLITE_FCNTL_LOCK_TIMEOUT = 34; -export const SQLITE_FCNTL_DATA_VERSION = 35; -export const SQLITE_FCNTL_SIZE_LIMIT = 36; -export const SQLITE_FCNTL_CKPT_DONE = 37; -export const SQLITE_FCNTL_RESERVE_BYTES = 38; -export const SQLITE_FCNTL_CKPT_START = 39; - -// Fundamental datatypes. -// https://www.sqlite.org/c3ref/c_blob.html -export const SQLITE_INTEGER = 1; -export const SQLITE_FLOAT = 2; -export const SQLITE_TEXT = 3; -export const SQLITE_BLOB = 4; -export const SQLITE_NULL = 5; - -// Special destructor behavior. -// https://www.sqlite.org/c3ref/c_static.html -export const SQLITE_STATIC = 0; -export const SQLITE_TRANSIENT = -1; - -// Text encodings. -// https://sqlite.org/c3ref/c_any.html -export const SQLITE_UTF8 = 1; /* IMP: R-37514-35566 */ -export const SQLITE_UTF16LE = 2; /* IMP: R-03371-37637 */ -export const SQLITE_UTF16BE = 3; /* IMP: R-51971-34154 */ -export const SQLITE_UTF16 = 4; /* Use native byte order */ - -// Module constraint ops. -export const SQLITE_INDEX_CONSTRAINT_EQ = 2; -export const SQLITE_INDEX_CONSTRAINT_GT = 4; -export const SQLITE_INDEX_CONSTRAINT_LE = 8; -export const SQLITE_INDEX_CONSTRAINT_LT = 16; -export const SQLITE_INDEX_CONSTRAINT_GE = 32; -export const SQLITE_INDEX_CONSTRAINT_MATCH = 64; -export const SQLITE_INDEX_CONSTRAINT_LIKE = 65; -export const SQLITE_INDEX_CONSTRAINT_GLOB = 66; -export const SQLITE_INDEX_CONSTRAINT_REGEXP = 67; -export const SQLITE_INDEX_CONSTRAINT_NE = 68; -export const SQLITE_INDEX_CONSTRAINT_ISNOT = 69; -export const SQLITE_INDEX_CONSTRAINT_ISNOTNULL = 70; -export const SQLITE_INDEX_CONSTRAINT_ISNULL = 71; -export const SQLITE_INDEX_CONSTRAINT_IS = 72; -export const SQLITE_INDEX_CONSTRAINT_FUNCTION = 150; -export const SQLITE_INDEX_SCAN_UNIQUE = 1; /* Scan visits at most = 1 row */ - -// Function flags -export const SQLITE_DETERMINISTIC = 0x000000800; -export const SQLITE_DIRECTONLY = 0x000080000; -export const SQLITE_SUBTYPE = 0x000100000; -export const SQLITE_INNOCUOUS = 0x000200000; - -// Sync flags -export const SQLITE_SYNC_NORMAL = 0x00002; -export const SQLITE_SYNC_FULL = 0x00003; -export const SQLITE_SYNC_DATAONLY = 0x00010; - -// Authorizer action codes -export const SQLITE_CREATE_INDEX = 1; -export const SQLITE_CREATE_TABLE = 2; -export const SQLITE_CREATE_TEMP_INDEX = 3; -export const SQLITE_CREATE_TEMP_TABLE = 4; -export const SQLITE_CREATE_TEMP_TRIGGER = 5; -export const SQLITE_CREATE_TEMP_VIEW = 6; -export const SQLITE_CREATE_TRIGGER = 7; -export const SQLITE_CREATE_VIEW = 8; -export const SQLITE_DELETE = 9; -export const SQLITE_DROP_INDEX = 10; -export const SQLITE_DROP_TABLE = 11; -export const SQLITE_DROP_TEMP_INDEX = 12; -export const SQLITE_DROP_TEMP_TABLE = 13; -export const SQLITE_DROP_TEMP_TRIGGER = 14; -export const SQLITE_DROP_TEMP_VIEW = 15; -export const SQLITE_DROP_TRIGGER = 16; -export const SQLITE_DROP_VIEW = 17; -export const SQLITE_INSERT = 18; -export const SQLITE_PRAGMA = 19; -export const SQLITE_READ = 20; -export const SQLITE_SELECT = 21; -export const SQLITE_TRANSACTION = 22; -export const SQLITE_UPDATE = 23; -export const SQLITE_ATTACH = 24; -export const SQLITE_DETACH = 25; -export const SQLITE_ALTER_TABLE = 26; -export const SQLITE_REINDEX = 27; -export const SQLITE_ANALYZE = 28; -export const SQLITE_CREATE_VTABLE = 29; -export const SQLITE_DROP_VTABLE = 30; -export const SQLITE_FUNCTION = 31; -export const SQLITE_SAVEPOINT = 32; -export const SQLITE_COPY = 0; -export const SQLITE_RECURSIVE = 33; - -// Authorizer return codes -export const SQLITE_DENY = 1; -export const SQLITE_IGNORE = 2; - -// Limit categories -export const SQLITE_LIMIT_LENGTH = 0; -export const SQLITE_LIMIT_SQL_LENGTH = 1; -export const SQLITE_LIMIT_COLUMN = 2; -export const SQLITE_LIMIT_EXPR_DEPTH = 3; -export const SQLITE_LIMIT_COMPOUND_SELECT = 4; -export const SQLITE_LIMIT_VDBE_OP = 5; -export const SQLITE_LIMIT_FUNCTION_ARG = 6; -export const SQLITE_LIMIT_ATTACHED = 7; -export const SQLITE_LIMIT_LIKE_PATTERN_LENGTH = 8; -export const SQLITE_LIMIT_VARIABLE_NUMBER = 9; -export const SQLITE_LIMIT_TRIGGER_DEPTH = 10; -export const SQLITE_LIMIT_WORKER_THREADS = 11; - -export const SQLITE_PREPARE_PERSISTENT = 0x01; -export const SQLITE_PREPARE_NORMALIZED = 0x02; -export const SQLITE_PREPARE_NO_VTAB = 0x04; \ No newline at end of file diff --git a/packages/replicate/package.json b/packages/replicate/package.json index 8d04e6e..2e8a6ff 100644 --- a/packages/replicate/package.json +++ b/packages/replicate/package.json @@ -59,8 +59,7 @@ }, "./worker": { "import": "./dist/client/persistence/sqlite/worker.js" - }, - "./sqlite-assets/*": "./assets/wa-sqlite/*" + } }, "publishConfig": { "access": "public" @@ -77,11 +76,13 @@ "format": "prettier --write .", "format:check": "prettier --check .", "test:browser": "node scripts/test-offline-browser.mjs", - "test:assets": "node scripts/copy-sqlite-assets.mjs --verify" + "test:assets": "node scripts/copy-sqlite-assets.mjs --verify", + "test:packed-consumer": "node scripts/test-packed-consumer.mjs" }, "dependencies": { "@logtape/logtape": "catalog:", - "@logtape/pretty": "catalog:" + "@logtape/pretty": "catalog:", + "wa-sqlite": "https://codeload.github.com/rhashimoto/wa-sqlite/tar.gz/07ad48cf2f682d279f9cd69818cc1d39b2ccda86" }, "devDependencies": { "@convex-dev/eslint-plugin": "catalog:", @@ -117,14 +118,10 @@ "@tanstack/db": "^0.5.20", "convex": "^1.31.4", "lib0": "^0.2.0", - "wa-sqlite": "1.0.0", "y-protocols": "1.0.7", "yjs": "13.6.29" }, "peerDependenciesMeta": { - "wa-sqlite": { - "optional": true - }, "@op-engineering/op-sqlite": { "optional": true } diff --git a/packages/replicate/scripts/copy-sqlite-assets.mjs b/packages/replicate/scripts/copy-sqlite-assets.mjs index 9af260b..6fde328 100755 --- a/packages/replicate/scripts/copy-sqlite-assets.mjs +++ b/packages/replicate/scripts/copy-sqlite-assets.mjs @@ -1,14 +1,34 @@ #!/usr/bin/env node -import { cp, readFile } from 'node:fs/promises'; +import { copyFile, mkdir, readFile } from 'node:fs/promises'; import { createHash } from 'node:crypto'; +import { createRequire } from 'node:module'; import { fileURLToPath } from 'node:url'; -import { resolve } from 'node:path'; +import { dirname, resolve } from 'node:path'; -const source = fileURLToPath(new URL('../assets/wa-sqlite/', import.meta.url)); -const manifest = JSON.parse(await readFile(resolve(source, 'manifest.json'), 'utf8')); +const packageSource = fileURLToPath(new URL('../assets/wa-sqlite/', import.meta.url)); +const manifestPath = resolve(packageSource, 'manifest.json'); +const manifest = JSON.parse(await readFile(manifestPath, 'utf8')); +const require = createRequire(import.meta.url); +const dependencyManifestPath = require.resolve(`${manifest.package}/package.json`); +const dependencySource = dirname(dependencyManifestPath); +const dependencyManifest = JSON.parse(await readFile(dependencyManifestPath, 'utf8')); +if (dependencyManifest.name !== manifest.package || dependencyManifest.version !== manifest.version) { + throw new Error( + `Expected ${manifest.package}@${manifest.version}, found ${dependencyManifest.name}@${dependencyManifest.version}` + ); +} + +const dependencyFiles = new Set(manifest.dependencyFiles); +const packageFiles = new Set(manifest.packageFiles); for (const [file, expected] of Object.entries(manifest.sha256)) { + const source = dependencyFiles.has(file) + ? resolve(dependencySource, file) + : packageFiles.has(file) + ? resolve(packageSource, file) + : undefined; + if (!source) throw new Error(`SQLite asset has no declared source: ${file}`); const actual = createHash('sha256') - .update(await readFile(resolve(source, file))) + .update(await readFile(source)) .digest('hex'); if (actual !== expected) throw new Error(`SQLite asset checksum mismatch: ${file}`); } @@ -16,5 +36,14 @@ if (process.argv[2] !== '--verify') { if (!process.argv[2]) throw new Error('Usage: replicate-sqlite-assets | --verify'); const destination = resolve(process.argv[2]); - await cp(source, destination, { recursive: true }); + for (const file of Object.keys(manifest.sha256)) { + const source = dependencyFiles.has(file) + ? resolve(dependencySource, file) + : resolve(packageSource, file); + const target = resolve(destination, file); + await mkdir(dirname(target), { recursive: true }); + await copyFile(source, target); + } + await mkdir(destination, { recursive: true }); + await copyFile(manifestPath, resolve(destination, 'manifest.json')); } diff --git a/packages/replicate/scripts/test-offline-browser.mjs b/packages/replicate/scripts/test-offline-browser.mjs index 54f4860..b681f11 100644 --- a/packages/replicate/scripts/test-offline-browser.mjs +++ b/packages/replicate/scripts/test-offline-browser.mjs @@ -1,10 +1,12 @@ import { build } from 'vite'; import { chromium } from 'playwright'; +import { execFile } from 'node:child_process'; import { createServer } from 'node:http'; import { mkdtemp, cp, readdir, readFile, writeFile, rm } from 'node:fs/promises'; import { tmpdir } from 'node:os'; import { join, resolve, extname } from 'node:path'; import { fileURLToPath } from 'node:url'; +import { promisify } from 'node:util'; import assert from 'node:assert/strict'; import * as Y from 'yjs'; @@ -29,7 +31,13 @@ try { logLevel: 'warn', build: { outDir: site, emptyOutDir: true }, }); - await cp(resolve(root, 'assets/wa-sqlite'), join(site, 'sqlite'), { recursive: true }); + const copyAssets = resolve(root, 'scripts/copy-sqlite-assets.mjs'); + await promisify(execFile)(process.execPath, [copyAssets, join(site, 'sqlite')]); + const baselineAssets = process.env.REPLICATE_BASELINE_SQLITE_ASSETS; + if (baselineAssets) { + await cp(resolve(baselineAssets), join(site, 'sqlite-baseline'), { recursive: true }); + await promisify(execFile)(process.execPath, [copyAssets, join(site, 'sqlite-candidate')]); + } const paths = (await readdir(site, { recursive: true, withFileTypes: true })) .filter((entry) => entry.isFile()) .map( @@ -69,19 +77,19 @@ try { await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)); const url = `http://127.0.0.1:${server.address().port}/`; const errors = []; - async function launch(offline = false) { + async function launch(offline = false, fragment = '') { context = await chromium.launchPersistentContext(profile, { headless: true, offline }); const page = await context.newPage(); page.on('pageerror', (error) => errors.push(error.message)); - await page.goto(url); + await page.goto(url + fragment); await page.waitForFunction(() => !!window.replica); await page.waitForFunction(() => !!navigator.serviceWorker.controller); return page; } - async function restart(page, { closeApplication = false } = {}) { + async function restart(page, { closeApplication = false, fragment = '' } = {}) { if (closeApplication) await page.evaluate(() => window.replica.close()); await context.close(); - return launch(true); + return launch(true, fragment); } let page = await launch(); assert.equal(await page.evaluate(() => window.replica.calls()), 0); @@ -152,12 +160,52 @@ try { assert.equal(requests, requestCount); assert.deepEqual(errors, []); checks++; + if (baselineAssets) { + await page.evaluate(() => window.replica.close()); + await context.close(); + const compatibilityRequests = requests; + const database = 'runtime-compatibility'; + const oldFragment = `#assetBase=/sqlite-baseline&database=${database}`; + const candidateFragment = `#assetBase=/sqlite-candidate&database=${database}`; + page = await launch(true, oldFragment); + await page.evaluate(async () => { + await window.replica.connect(); + window.replica.emit('old-write', 1); + }); + await waitForCursor(page, 1); + page = await restart(page, { closeApplication: true, fragment: candidateFragment }); + assert.equal( + await page.evaluate(() => window.replica.get('old-write')?.title), + 'persisted in browser' + ); + checks++; + await page.evaluate(async () => { + await window.replica.connect(); + window.replica.emit('candidate-write', 2); + }); + await waitForCursor(page, 2); + page = await restart(page, { closeApplication: true, fragment: oldFragment }); + assert.equal( + await page.evaluate(() => window.replica.get('old-write')?.title), + 'persisted in browser' + ); + assert.equal( + await page.evaluate(() => window.replica.get('candidate-write')?.title), + 'persisted in browser' + ); + assert.equal(await page.evaluate(() => window.replica.cursor()), 2); + assert.equal(requests, compatibilityRequests); + assert.deepEqual(errors, []); + checks++; + } assert.deepEqual(await page.evaluate(() => window.replica.closeRace()), { acceptedCompleted: true, closeMessages: 1, lateRejected: true, }); checks++; + assert.deepEqual(errors, []); + checks++; process.stdout.write(`${checks} real Chromium offline/process-restart checks passed\n`); } finally { await context?.close(); diff --git a/packages/replicate/scripts/test-packed-consumer.mjs b/packages/replicate/scripts/test-packed-consumer.mjs new file mode 100644 index 0000000..89ea300 --- /dev/null +++ b/packages/replicate/scripts/test-packed-consumer.mjs @@ -0,0 +1,80 @@ +import assert from 'node:assert/strict'; +import { execFile } from 'node:child_process'; +import { createHash } from 'node:crypto'; +import { access, mkdtemp, mkdir, readFile, rm, writeFile } from 'node:fs/promises'; +import { createRequire } from 'node:module'; +import { tmpdir } from 'node:os'; +import { dirname, isAbsolute, join, resolve } from 'node:path'; +import { promisify } from 'node:util'; + +const tarballArgument = process.env.REPLICATE_PACKAGE_TARBALL; +if (!tarballArgument) { + throw new Error('Set REPLICATE_PACKAGE_TARBALL to a packed @trestleinc/replicate tarball'); +} +const tarball = isAbsolute(tarballArgument) + ? tarballArgument + : resolve(process.cwd(), tarballArgument); +const directory = await mkdtemp(join(tmpdir(), 'replicate packed consumer ')); +const consumer = join(directory, 'consumer with spaces'); +const destination = join(consumer, 'public assets', 'sqlite'); +const npmCli = join(dirname(process.execPath), 'node_modules', 'npm', 'bin', 'npm-cli.js'); +await access(npmCli); +const npm = (args, options) => promisify(execFile)(process.execPath, [npmCli, ...args], options); + +try { + await mkdir(consumer, { recursive: true }); + await writeFile( + join(consumer, 'package.json'), + JSON.stringify({ name: 'replicate-packed-consumer', private: true }, null, 2) + ); + await npm( + [ + 'install', + '--ignore-scripts', + '--omit=optional', + '--no-audit', + '--no-fund', + tarball, + ], + { cwd: consumer } + ); + + const packageRoot = join(consumer, 'node_modules', '@trestleinc', 'replicate'); + const installedManifest = JSON.parse(await readFile(join(packageRoot, 'package.json'), 'utf8')); + const packageRequire = createRequire(join(packageRoot, 'package.json')); + const dependencyManifestPath = packageRequire.resolve('wa-sqlite/package.json'); + assert.ok(dependencyManifestPath.startsWith(directory)); + assert.equal(JSON.parse(await readFile(dependencyManifestPath, 'utf8')).version, '1.1.2'); + for (const subpath of ['.', './client', './server', './convex.config', './worker']) { + const target = installedManifest.exports[subpath].import?.default ?? installedManifest.exports[subpath].import; + await access(join(packageRoot, target)); + } + for (const subpath of ['.', './client', './server', './convex.config']) { + await access(join(packageRoot, installedManifest.exports[subpath].types)); + } + + const run = () => + npm(['exec', '--', 'replicate-sqlite-assets', destination], { + cwd: consumer, + }); + await run(); + const manifest = JSON.parse(await readFile(join(destination, 'manifest.json'), 'utf8')); + for (const [file, expected] of Object.entries(manifest.sha256)) { + const bytes = await readFile(join(destination, file)); + assert.equal(createHash('sha256').update(bytes).digest('hex'), expected, file); + } + + await writeFile(join(destination, 'dist', 'wa-sqlite-async.wasm'), 'stale runtime'); + await writeFile(join(destination, 'consumer-owned.txt'), 'preserved'); + await run(); + assert.equal(await readFile(join(destination, 'consumer-owned.txt'), 'utf8'), 'preserved'); + assert.equal( + createHash('sha256') + .update(await readFile(join(destination, 'dist', 'wa-sqlite-async.wasm'))) + .digest('hex'), + manifest.sha256['dist/wa-sqlite-async.wasm'] + ); + process.stdout.write('Packed consumer installed dependency and copied verified SQLite assets\n'); +} finally { + await rm(directory, { recursive: true, force: true }); +} diff --git a/packages/replicate/scripts/verify-sqlite-provenance.mjs b/packages/replicate/scripts/verify-sqlite-provenance.mjs index 10f759b..7a9ad40 100644 --- a/packages/replicate/scripts/verify-sqlite-provenance.mjs +++ b/packages/replicate/scripts/verify-sqlite-provenance.mjs @@ -1,14 +1,24 @@ -// Read-only comparison with pinned official distribution; does not regenerate compiler output. +// Read-only comparison with the pinned original source; does not regenerate compiler output. import { readFile } from 'node:fs/promises'; import { createHash } from 'node:crypto'; const manifest = JSON.parse( await readFile(new URL('../assets/wa-sqlite/manifest.json', import.meta.url), 'utf8') ); -for (const [file, hash] of Object.entries(manifest.sha256)) { +const archiveResponse = await fetch(manifest.archive); +if (!archiveResponse.ok) throw new Error(`source archive: HTTP ${archiveResponse.status}`); +const archive = new Uint8Array(await archiveResponse.arrayBuffer()); +const archiveSha512 = `sha512-${createHash('sha512').update(archive).digest('base64')}`; +if (archiveSha512 !== manifest.archiveIntegrity) throw new Error('source archive integrity mismatch'); +if (createHash('sha256').update(archive).digest('hex') !== manifest.archiveSha256) { + throw new Error('source archive SHA-256 mismatch'); +} + +for (const file of manifest.dependencyFiles) { const response = await fetch( - `https://raw.githubusercontent.com/rhashimoto/wa-sqlite/${manifest.revision}/${file}` + `${manifest.repository.replace('github.com', 'raw.githubusercontent.com')}/${manifest.revision}/${file}` ); if (!response.ok) throw new Error(`${file}: HTTP ${response.status}`); + const hash = manifest.sha256[file]; if ( createHash('sha256') .update(new Uint8Array(await response.arrayBuffer())) diff --git a/packages/replicate/src/test/assets.test.ts b/packages/replicate/src/test/assets.test.ts index 208adc0..9d1b353 100644 --- a/packages/replicate/src/test/assets.test.ts +++ b/packages/replicate/src/test/assets.test.ts @@ -16,6 +16,15 @@ test('asset CLI installs into a new directory and refreshes assets on repeated b try { await run(); const manifest = JSON.parse(await readFile(join(destination, 'manifest.json'), 'utf8')); + expect(manifest).toMatchObject({ + package: 'wa-sqlite', + version: '1.1.2', + revision: '07ad48cf2f682d279f9cd69818cc1d39b2ccda86', + }); + expect(Object.keys(manifest.sha256)).toEqual([ + ...manifest.dependencyFiles, + ...manifest.packageFiles, + ]); const verify = async () => { for (const [file, expected] of Object.entries(manifest.sha256)) { const bytes = await readFile(join(destination, file)); diff --git a/packages/replicate/test/browser/main.ts b/packages/replicate/test/browser/main.ts index a53c3fc..ee1e766 100644 --- a/packages/replicate/test/browser/main.ts +++ b/packages/replicate/test/browser/main.ts @@ -38,10 +38,11 @@ sqliteWorker.postMessage = ((message: { type?: number }, options?: StructuredSer if (message.type === 2) closeMessages++; postMessage(message, options); }) as typeof sqliteWorker.postMessage; +const runtime = new URLSearchParams(location.hash.slice(1)); const local = await persistence.web.sqlite.create({ - name: 'offline-browser', + name: runtime.get('database') ?? 'offline-browser', worker: sqliteWorker, - assetBase: '/sqlite', + assetBase: runtime.get('assetBase') ?? '/sqlite', }); const lazy = collection.create<{ id: string; title: string }>({ schema: schema.define({ diff --git a/packages/replicate/tsdown.config.ts b/packages/replicate/tsdown.config.ts index 0fec46a..661d349 100644 --- a/packages/replicate/tsdown.config.ts +++ b/packages/replicate/tsdown.config.ts @@ -36,8 +36,6 @@ export default defineConfig([ '@logtape/logtape', 'effect', '@effect/platform', - 'wa-sqlite', - /^wa-sqlite/, '@op-engineering/op-sqlite', 'abstract-level', 'browser-level', @@ -54,7 +52,7 @@ export default defineConfig([ clean: false, platform: 'browser', shims: true, - external: ['yjs', /^wa-sqlite/], + external: ['yjs'], outExtensions: jsExtensions, }, { From 62e77258ccb5629fa7aa407a0a320e3ad52966ca Mon Sep 17 00:00:00 2001 From: OpenAI Codex Date: Sat, 19 Sep 2026 18:48:41 +0200 Subject: [PATCH 06/14] test: harden runtime dependency verification --- docs/CDN.md | 2 +- docs/offline-replicas.md | 27 +++++- .../replicate/scripts/test-native-bundle.cjs | 4 +- .../scripts/test-offline-browser.mjs | 22 ++++- .../scripts/test-packed-consumer.mjs | 92 ++++++++++++++++--- .../browser/baseline-wa-sqlite-manifest.json | 17 ++++ 6 files changed, 144 insertions(+), 20 deletions(-) create mode 100644 packages/replicate/test/browser/baseline-wa-sqlite-manifest.json diff --git a/docs/CDN.md b/docs/CDN.md index 70786a9..d8fb577 100644 --- a/docs/CDN.md +++ b/docs/CDN.md @@ -6,7 +6,7 @@ installs an immutable archive of the original repository at commit JavaScript/WASM graph, verifies fixed checksums, and retains the upstream license, acknowledgments, and provenance note. Serve that graph from your application or an immutable CDN path. Do not assemble files from a moving branch or substitute npm `wa-sqlite@1.0.0`, an -unrelated unofficial publication. +unofficial publication with a different VFS API. ## Copy and verify the packaged graph diff --git a/docs/offline-replicas.md b/docs/offline-replicas.md index 3e61295..4336247 100644 --- a/docs/offline-replicas.md +++ b/docs/offline-replicas.md @@ -108,7 +108,7 @@ The copied graph comes from an immutable archive of the original wa-sqlite repos The codeload URL contains the full commit hash, and `manifest.json` retains the archive's SHA-512 and SHA-256 digests. npm downstream locks record the archive integrity; Bun 1.3.6 retains the exact URL without a digest. The asset CLI therefore checks fixed per-file hashes before every copy. This identifies the installed source and prebuilt artifacts; it is not an independent reproduction of the compiler environment or WebAssembly build. `node scripts/verify-sqlite-provenance.mjs` checks the archive integrity and compares every upstream file with the immutable source revision; `node scripts/copy-sqlite-assets.mjs --verify` verifies the installed dependency without network access. -Keep `LICENSE`, the full source `ACKNOWLEDGMENTS.md`, and `PROVENANCE.md`. Do not substitute npm `wa-sqlite@1.0.0`: it is an unrelated unofficial publication with different contents and VFS API. +Keep `LICENSE`, the full source `ACKNOWLEDGMENTS.md`, and `PROVENANCE.md`. Do not substitute npm `wa-sqlite@1.0.0`: it is an unofficial publication with different contents and VFS API. ## Verification @@ -125,6 +125,31 @@ bun run test:browser node scripts/test-native-bundle.cjs ``` +The normal browser command checks candidate restart and offline behavior. To also run the +old-runtime write -> candidate reopen/write -> old-runtime reopen compatibility phases, provide +the original pinned source tree. The harness verifies every required legacy file against the +committed hash manifest before it builds the offline cache. For example, in PowerShell: + +```powershell +$compatRoot = Join-Path ([System.IO.Path]::GetTempPath()) ('replicate-sqlite-' + [guid]::NewGuid()) +$archive = Join-Path $compatRoot 'wa-sqlite.tar.gz' +New-Item -ItemType Directory -Path $compatRoot | Out-Null +Invoke-WebRequest ` + -Uri 'https://codeload.github.com/rhashimoto/wa-sqlite/tar.gz/55bf0b6646ac1bb81b00b9c25636b59a87e4a918' ` + -OutFile $archive +tar -xf $archive -C $compatRoot +$legacySource = Get-ChildItem -LiteralPath $compatRoot -Directory | + Where-Object Name -Like 'wa-sqlite-*' | + Select-Object -First 1 -ExpandProperty FullName +$env:REPLICATE_BASELINE_SQLITE_ASSETS = $legacySource +bun run --cwd packages/replicate test:browser +``` + +The compatibility run must report 12 check groups. It creates the database with the legacy +runtime, reopens and writes with the candidate, then reopens with the legacy runtime and verifies +both rows, cursor 2, no network requests, and no page errors. Remove the temporary directory and +environment variable after the run. + Client tests use real SQLite files and actual collections/adapters with controlled transport. Component/server tests use convex-test, including seeded histories checked against independent source documents; they are not cloud deployment tests. The browser harness bundles package exports, precaches the actual SQLite/WASM graph, explicitly polls durable checkpoints, shuts down Chromium both with and without application cleanup, reopens the same profile offline, and verifies rows, removals, pending updates, and reset with no HTTP requests during offline phases. The native harness bundles the **full built client entry** through Expo Metro for Android, not only the SQLite adapter. With the locked lib0 0.2.117, the stock React Native conditional export requires unavailable `isomorphic-webcrypto`. Use a targeted Metro resolver mapping `lib0/webcrypto` to lib0's `webcrypto.js`, as in the repository Expo example; retain the application's native secure `crypto.getRandomValues`/`crypto.randomUUID` setup before importing Replicate. The mapping supplies no randomness and no WebCrypto implementation. Encrypted APIs additionally require a compatible secure WebCrypto implementation. No insecure fallback or obsolete isomorphic-webcrypto dependency is added. This verifies bundling, **not native-device execution**. diff --git a/packages/replicate/scripts/test-native-bundle.cjs b/packages/replicate/scripts/test-native-bundle.cjs index 54ceeca..ea38390 100644 --- a/packages/replicate/scripts/test-native-bundle.cjs +++ b/packages/replicate/scripts/test-native-bundle.cjs @@ -43,8 +43,10 @@ const assert = require('node:assert/strict'); const bundle = await readFile(output, 'utf8'); assert.ok(bundle.includes('replicateNativeGraph')); assert.ok(bundle.includes('PersistenceProvider.storeUpdate')); + assert.ok(!bundle.includes('wa-sqlite-async.mjs')); + assert.ok(!bundle.includes('IDBBatchAtomicVFS.create')); process.stdout.write( - 'Full built client graph bundled for Android with Expo Metro (no device execution)\n' + 'Full client graph bundled for Android without browser SQLite runtime (no device execution)\n' ); } finally { await rm(directory, { recursive: true, force: true }); diff --git a/packages/replicate/scripts/test-offline-browser.mjs b/packages/replicate/scripts/test-offline-browser.mjs index b681f11..e5889d6 100644 --- a/packages/replicate/scripts/test-offline-browser.mjs +++ b/packages/replicate/scripts/test-offline-browser.mjs @@ -1,10 +1,11 @@ import { build } from 'vite'; import { chromium } from 'playwright'; import { execFile } from 'node:child_process'; +import { createHash } from 'node:crypto'; import { createServer } from 'node:http'; -import { mkdtemp, cp, readdir, readFile, writeFile, rm } from 'node:fs/promises'; +import { copyFile, mkdir, mkdtemp, readdir, readFile, writeFile, rm } from 'node:fs/promises'; import { tmpdir } from 'node:os'; -import { join, resolve, extname } from 'node:path'; +import { dirname, join, resolve, extname } from 'node:path'; import { fileURLToPath } from 'node:url'; import { promisify } from 'node:util'; import assert from 'node:assert/strict'; @@ -35,7 +36,21 @@ try { await promisify(execFile)(process.execPath, [copyAssets, join(site, 'sqlite')]); const baselineAssets = process.env.REPLICATE_BASELINE_SQLITE_ASSETS; if (baselineAssets) { - await cp(resolve(baselineAssets), join(site, 'sqlite-baseline'), { recursive: true }); + const baselineManifest = JSON.parse( + await readFile(resolve(root, 'test/browser/baseline-wa-sqlite-manifest.json'), 'utf8') + ); + for (const [file, expected] of Object.entries(baselineManifest.sha256)) { + const source = resolve(baselineAssets, file); + const bytes = await readFile(source); + assert.equal(createHash('sha256').update(bytes).digest('hex'), expected, file); + const target = join(site, 'sqlite-baseline', file); + await mkdir(dirname(target), { recursive: true }); + await copyFile(source, target); + } + await writeFile( + join(site, 'sqlite-baseline', 'manifest.json'), + JSON.stringify(baselineManifest, null, 2) + ); await promisify(execFile)(process.execPath, [copyAssets, join(site, 'sqlite-candidate')]); } const paths = (await readdir(site, { recursive: true, withFileTypes: true })) @@ -205,7 +220,6 @@ try { }); checks++; assert.deepEqual(errors, []); - checks++; process.stdout.write(`${checks} real Chromium offline/process-restart checks passed\n`); } finally { await context?.close(); diff --git a/packages/replicate/scripts/test-packed-consumer.mjs b/packages/replicate/scripts/test-packed-consumer.mjs index 89ea300..1479499 100644 --- a/packages/replicate/scripts/test-packed-consumer.mjs +++ b/packages/replicate/scripts/test-packed-consumer.mjs @@ -6,6 +6,7 @@ import { createRequire } from 'node:module'; import { tmpdir } from 'node:os'; import { dirname, isAbsolute, join, resolve } from 'node:path'; import { promisify } from 'node:util'; +import { fileURLToPath } from 'node:url'; const tarballArgument = process.env.REPLICATE_PACKAGE_TARBALL; if (!tarballArgument) { @@ -14,14 +15,33 @@ if (!tarballArgument) { const tarball = isAbsolute(tarballArgument) ? tarballArgument : resolve(process.cwd(), tarballArgument); -const directory = await mkdtemp(join(tmpdir(), 'replicate packed consumer ')); -const consumer = join(directory, 'consumer with spaces'); -const destination = join(consumer, 'public assets', 'sqlite'); -const npmCli = join(dirname(process.execPath), 'node_modules', 'npm', 'bin', 'npm-cli.js'); -await access(npmCli); +const npmCandidates = [ + process.env.REPLICATE_NPM_CLI, + process.env.npm_execpath?.endsWith('npm-cli.js') ? process.env.npm_execpath : undefined, + join(dirname(process.execPath), 'node_modules', 'npm', 'bin', 'npm-cli.js'), + join(dirname(dirname(process.execPath)), 'lib', 'node_modules', 'npm', 'bin', 'npm-cli.js'), + '/usr/local/lib/node_modules/npm/bin/npm-cli.js', + '/usr/lib/node_modules/npm/bin/npm-cli.js', + '/usr/share/nodejs/npm/bin/npm-cli.js', +].filter(Boolean); +let npmCli; +for (const candidate of npmCandidates) { + try { + await access(candidate); + npmCli = candidate; + break; + } catch { + // Try the next known npm layout. + } +} +if (!npmCli) throw new Error('Could not locate npm-cli.js; set REPLICATE_NPM_CLI'); const npm = (args, options) => promisify(execFile)(process.execPath, [npmCli, ...args], options); +let directory; try { + directory = await mkdtemp(join(tmpdir(), 'replicate packed consumer ')); + const consumer = join(directory, 'consumer with spaces'); + const destination = join(consumer, 'public assets', 'sqlite'); await mkdir(consumer, { recursive: true }); await writeFile( join(consumer, 'package.json'), @@ -35,24 +55,70 @@ try { '--no-audit', '--no-fund', tarball, + 'typescript@5.9.3', ], { cwd: consumer } ); const packageRoot = join(consumer, 'node_modules', '@trestleinc', 'replicate'); - const installedManifest = JSON.parse(await readFile(join(packageRoot, 'package.json'), 'utf8')); const packageRequire = createRequire(join(packageRoot, 'package.json')); const dependencyManifestPath = packageRequire.resolve('wa-sqlite/package.json'); assert.ok(dependencyManifestPath.startsWith(directory)); assert.equal(JSON.parse(await readFile(dependencyManifestPath, 'utf8')).version, '1.1.2'); - for (const subpath of ['.', './client', './server', './convex.config', './worker']) { - const target = installedManifest.exports[subpath].import?.default ?? installedManifest.exports[subpath].import; - await access(join(packageRoot, target)); - } - for (const subpath of ['.', './client', './server', './convex.config']) { - await access(join(packageRoot, installedManifest.exports[subpath].types)); + const specifiers = [ + '@trestleinc/replicate', + '@trestleinc/replicate/client', + '@trestleinc/replicate/server', + '@trestleinc/replicate/convex.config', + '@trestleinc/replicate/worker', + ]; + const resolver = join(consumer, 'resolve-exports.mjs'); + await writeFile( + resolver, + `const specifiers = ${JSON.stringify(specifiers)}; +const resolved = specifiers.map((specifier) => import.meta.resolve(specifier)); +for (const specifier of specifiers.slice(0, -1)) await import(specifier); +process.stdout.write(JSON.stringify(resolved)); +` + ); + const { stdout: resolvedOutput } = await promisify(execFile)(process.execPath, [resolver], { + cwd: consumer, + }); + for (const url of JSON.parse(resolvedOutput)) { + assert.ok(fileURLToPath(url).startsWith(packageRoot), url); } + await writeFile( + join(consumer, 'consumer-exports.ts'), + `import '@trestleinc/replicate'; +import '@trestleinc/replicate/client'; +import '@trestleinc/replicate/server'; +import '@trestleinc/replicate/convex.config'; +` + ); + await writeFile( + join(consumer, 'tsconfig.json'), + JSON.stringify( + { + compilerOptions: { + module: 'NodeNext', + moduleResolution: 'NodeNext', + noEmit: true, + skipLibCheck: false, + strict: true, + target: 'ES2022', + }, + files: ['consumer-exports.ts'], + }, + null, + 2 + ) + ); + const consumerRequire = createRequire(join(consumer, 'package.json')); + await promisify(execFile)(process.execPath, [consumerRequire.resolve('typescript/bin/tsc')], { + cwd: consumer, + }); + const run = () => npm(['exec', '--', 'replicate-sqlite-assets', destination], { cwd: consumer, @@ -76,5 +142,5 @@ try { ); process.stdout.write('Packed consumer installed dependency and copied verified SQLite assets\n'); } finally { - await rm(directory, { recursive: true, force: true }); + if (directory) await rm(directory, { recursive: true, force: true }); } diff --git a/packages/replicate/test/browser/baseline-wa-sqlite-manifest.json b/packages/replicate/test/browser/baseline-wa-sqlite-manifest.json new file mode 100644 index 0000000..64d67a8 --- /dev/null +++ b/packages/replicate/test/browser/baseline-wa-sqlite-manifest.json @@ -0,0 +1,17 @@ +{ + "repository": "https://github.com/rhashimoto/wa-sqlite", + "revision": "55bf0b6646ac1bb81b00b9c25636b59a87e4a918", + "buildRevision": "44cc640c65f29de9bfbc2004974c9f6c2c690c2b", + "sha256": { + "dist/wa-sqlite-async.mjs": "0ba7e66b84408267ac00a5f75b1f3c733f258fbc6b6dc91baa567e0e963892a9", + "dist/wa-sqlite-async.wasm": "c3af64afbe6034af23fb756bb040e7d8d73aaf6596f9f2b3ea463c8c036bf5e5", + "src/examples/IDBBatchAtomicVFS.js": "0b72ab6b1a692c5e5d56a0dd387c3de5a65265c91a0da8baf90407a7f0dd043e", + "src/FacadeVFS.js": "dd00dc59720c0bebb91b6f982e5339351997467ff868a608e915cc020e13fbca", + "src/VFS.js": "55e7455e2ec0000cc4ba7a8bf7882f414a40f2a0ba6eb4c4ac847f379f54d92f", + "src/WebLocksMixin.js": "1ea5c7e9e02dc94566b910b396f17a3c93aeab04a208177e8c1bd3bb65618d44", + "src/sqlite-api.js": "8d7a59fa1df49859e584561945307b61460d3b544e10f9d2cb2514aef1ecfd42", + "src/sqlite-constants.js": "f7b570f0c39e4b54c99f2598b6ad42018d4d8bf791861ede20d295628ae49f8f", + "LICENSE": "547f9e97e461bd369cc64b6fc12d724e8b02764b8db7812691f29f0ec572be79", + "ACKNOWLEDGMENTS.md": "5dae12fa0c82fe1a6a70fcf6b765298b5f32b7d32449f4d72ae1c12468457762" + } +} From aa2307e3764239eac81085ea410214b18b25764d Mon Sep 17 00:00:00 2001 From: OpenAI Codex Date: Sat, 19 Sep 2026 19:03:46 +0200 Subject: [PATCH 07/14] test: require declaration export resolution --- packages/replicate/scripts/test-packed-consumer.mjs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/replicate/scripts/test-packed-consumer.mjs b/packages/replicate/scripts/test-packed-consumer.mjs index 1479499..bd66ce7 100644 --- a/packages/replicate/scripts/test-packed-consumer.mjs +++ b/packages/replicate/scripts/test-packed-consumer.mjs @@ -90,10 +90,13 @@ process.stdout.write(JSON.stringify(resolved)); await writeFile( join(consumer, 'consumer-exports.ts'), - `import '@trestleinc/replicate'; -import '@trestleinc/replicate/client'; -import '@trestleinc/replicate/server'; -import '@trestleinc/replicate/convex.config'; + `import type * as shared from '@trestleinc/replicate'; +import type * as client from '@trestleinc/replicate/client'; +import type * as server from '@trestleinc/replicate/server'; +import type * as config from '@trestleinc/replicate/convex.config'; +type ResolvedExports = [typeof shared, typeof client, typeof server, typeof config]; +declare const resolvedExports: ResolvedExports; +void resolvedExports; ` ); await writeFile( @@ -103,6 +106,7 @@ import '@trestleinc/replicate/convex.config'; compilerOptions: { module: 'NodeNext', moduleResolution: 'NodeNext', + noUncheckedSideEffectImports: true, noEmit: true, skipLibCheck: false, strict: true, From ba6fe201b319a01f5636188de12a1d066d3aa94b Mon Sep 17 00:00:00 2001 From: OpenAI Codex Date: Sat, 19 Sep 2026 19:47:37 +0200 Subject: [PATCH 08/14] docs: clarify self-hosted runtime caching --- docs/CDN.md | 14 ++++++++++---- docs/offline-replicas.md | 2 +- .../replicate/scripts/test-packed-consumer.mjs | 9 +++++---- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/docs/CDN.md b/docs/CDN.md index d8fb577..1d14f6b 100644 --- a/docs/CDN.md +++ b/docs/CDN.md @@ -46,9 +46,10 @@ npm exec -- replicate-sqlite-assets --verify `manifest.json` records the exact archive URL and integrity, source revision, and SHA-256 digest of each runtime and notice file. The copy command reads the installed dependency during the -application build; browsers do not fetch GitHub or a third-party CDN at runtime when `assetBase` -points to the copied directory. The provenance details and reproducibility boundary are documented -in [`offline-replicas.md`](offline-replicas.md#browser-assets-and-offline-startup). +application build. When `assetBase` points to the copied directory, the SQLite worker loads that +directory instead of GitHub or the default CDN. Service-worker and preload URLs are configured +separately and must point to the same local graph. The provenance details and reproducibility +boundary are documented in [`offline-replicas.md`](offline-replicas.md#browser-assets-and-offline-startup). ## Configure Replicate @@ -89,7 +90,12 @@ runtime version they were built against. An offline restart needs the application shell, bundled worker, and every runtime file named in `manifest.json` to be available locally. Precache those URLs while online and activate the service -worker before relying on offline startup. The preload helpers accept the same base: +worker before relying on offline startup. Configuring `assetBase` controls the URLs loaded by the +SQLite worker; it does not rewrite a service worker's precache URLs. Configure both `assetBase` and +the service worker's runtime base and URL list to point at the copied graph. If an example service +worker has a hardcoded `CDN_BASE` and four-file URL list, replace both with the local base and the +complete runtime graph from `/replicate-sqlite/manifest.json`; changing `CDN_BASE` alone does not add +the remaining transitive runtime files to that list. The preload helpers accept the same base: ```typescript import { injectPreloadLinks } from '@trestleinc/replicate/client'; diff --git a/docs/offline-replicas.md b/docs/offline-replicas.md index 4336247..dae81e0 100644 --- a/docs/offline-replicas.md +++ b/docs/offline-replicas.md @@ -98,7 +98,7 @@ const sqlite = persistence.web.sqlite.once({ }); ``` -Precache the app shell, bundled worker, and **all files** listed by `assets/wa-sqlite/manifest.json` under that base. Preserve the relative `src/` and `dist/` paths and all notice files. Serve `.wasm` as `application/wasm` and JS/MJS as JavaScript. Install/activate the service worker online before the first offline restart. `preloadLinks(assetBase)` and `injectPreloadLinks(assetBase)` accept the same base. Failed WASM compilation is evicted from the cache so retry can succeed. Without `assetBase`, the existing historical CDN remains the default; copying and configuring `assetBase` is the offline self-hosted path. +The packaged source manifest is `assets/wa-sqlite/manifest.json`; the copy command hosts it as `/manifest.json`. Precache the app shell, bundled worker, and **all runtime files** listed by that hosted manifest under the same base. Configure the worker's `assetBase` and the service worker's precache URLs separately; replace any hardcoded CDN URL list with the complete manifest-derived local graph. Preserve the relative `src/` and `dist/` paths and all notice files. Serve `.wasm` as `application/wasm` and JS/MJS as JavaScript. Install/activate the service worker online before the first offline restart. `preloadLinks(assetBase)` and `injectPreloadLinks(assetBase)` accept the same base. Failed WASM compilation is evicted from the cache so retry can succeed. Without `assetBase`, the existing historical CDN remains the default; copying and configuring `assetBase` is the offline self-hosted path. The worker uses `synchronous=FULL` and awaits SQLite/VFS close before terminating. Durability is subject to browser storage eviction, device/storage guarantees, and application cache lifecycle; offline assets are application-owned. diff --git a/packages/replicate/scripts/test-packed-consumer.mjs b/packages/replicate/scripts/test-packed-consumer.mjs index bd66ce7..bce582d 100644 --- a/packages/replicate/scripts/test-packed-consumer.mjs +++ b/packages/replicate/scripts/test-packed-consumer.mjs @@ -1,7 +1,7 @@ import assert from 'node:assert/strict'; import { execFile } from 'node:child_process'; import { createHash } from 'node:crypto'; -import { access, mkdtemp, mkdir, readFile, rm, writeFile } from 'node:fs/promises'; +import { access, mkdtemp, mkdir, readFile, realpath, rm, writeFile } from 'node:fs/promises'; import { createRequire } from 'node:module'; import { tmpdir } from 'node:os'; import { dirname, isAbsolute, join, resolve } from 'node:path'; @@ -37,9 +37,10 @@ for (const candidate of npmCandidates) { if (!npmCli) throw new Error('Could not locate npm-cli.js; set REPLICATE_NPM_CLI'); const npm = (args, options) => promisify(execFile)(process.execPath, [npmCli, ...args], options); -let directory; +let cleanupDirectory; try { - directory = await mkdtemp(join(tmpdir(), 'replicate packed consumer ')); + cleanupDirectory = await mkdtemp(join(tmpdir(), 'replicate packed consumer ')); + const directory = await realpath(cleanupDirectory); const consumer = join(directory, 'consumer with spaces'); const destination = join(consumer, 'public assets', 'sqlite'); await mkdir(consumer, { recursive: true }); @@ -146,5 +147,5 @@ void resolvedExports; ); process.stdout.write('Packed consumer installed dependency and copied verified SQLite assets\n'); } finally { - if (directory) await rm(directory, { recursive: true, force: true }); + if (cleanupDirectory) await rm(cleanupDirectory, { recursive: true, force: true }); } From 82ca43da88d37b27b06501f2d13b5801d5c8e5f3 Mon Sep 17 00:00:00 2001 From: OpenAI Codex Date: Sat, 19 Sep 2026 20:21:34 +0200 Subject: [PATCH 09/14] fix durable local mutation acknowledgement --- docs/offline-replicas.md | 12 +- packages/replicate/src/client/collection.ts | 15 ++ .../src/client/persistence/sqlite/preload.ts | 3 + packages/replicate/src/test/assets.test.ts | 16 ++- packages/replicate/src/test/offline.test.ts | 133 ++++++++++++++++++ 5 files changed, 176 insertions(+), 3 deletions(-) diff --git a/docs/offline-replicas.md b/docs/offline-replicas.md index dae81e0..59301a0 100644 --- a/docs/offline-replicas.md +++ b/docs/offline-replicas.md @@ -3,9 +3,17 @@ Initialize persistence and await `collection.preload()` to read local records. Local readiness does not wait for recovery, subscriptions, or credentials. Synchronization errors do not prevent offline reads. ```ts +const sqlite = await persistence.web.sqlite.create({ + name: 'records', + assetBase: '/replicate-sqlite', + worker: async () => { + const { default: Worker } = await import('@trestleinc/replicate/worker?worker'); + return new Worker(); + }, +}); const records = collection.create({ schema: recordSchema, - persistence: sqlite, + persistence: async () => sqlite, networkMode: 'manual', readOnly: true, requestArgs: () => ({ guestToken: currentGuestToken }), @@ -34,7 +42,7 @@ await local.connect(); // Final shutdown; a shared SQLite instance closes after all its collections: await local.disconnect(); await local.cleanup(); -await database.close(); +await sqlite.close?.(); ``` Disconnect does not await unresolved backend requests. Their eventual results cannot affect a later connection. It retains documents; account switching should reset or use a separate database. Reset waits for earlier local persistence work, remains disconnected, and a concurrent connect waits for reset. Recreate document handles and editing bindings after reconnect. Do not retain/mutate raw Yjs fragments across reset. The database must have a single collection owner for each collection name; concurrent independent instances sharing the same persisted collection are not supported. diff --git a/packages/replicate/src/client/collection.ts b/packages/replicate/src/client/collection.ts index 6df93d8..ae2eace 100644 --- a/packages/replicate/src/client/collection.ts +++ b/packages/replicate/src/client/collection.ts @@ -1126,6 +1126,8 @@ export function convexCollectionOptions( try { await Promise.all([persistenceReadyPromise, optimisticReadyPromise]); ensureGeneration(mutationGeneration); + await docManager.flush(transaction.mutations.map((mutation) => String(mutation.key))); + ensureGeneration(mutationGeneration); // Process mutations in parallel for better performance await Promise.all( @@ -1147,6 +1149,7 @@ export function convexCollectionOptions( material: materializedDoc, type: 'insert', }); + ensureGeneration(mutationGeneration); await acknowledgeCreate(document, mutationGeneration); }) ); @@ -1169,6 +1172,8 @@ export function convexCollectionOptions( try { await Promise.all([persistenceReadyPromise, optimisticReadyPromise]); ensureGeneration(mutationGeneration); + await docManager.flush(transaction.mutations.map((mutation) => String(mutation.key))); + ensureGeneration(mutationGeneration); if (isContentSync && metadata?.contentSync) { const { bytes, material } = metadata.contentSync; @@ -1179,6 +1184,7 @@ export function convexCollectionOptions( material, type: 'update', }); + ensureGeneration(mutationGeneration); return; } @@ -1202,6 +1208,7 @@ export function convexCollectionOptions( material: fullDoc, type: 'update', }); + ensureGeneration(mutationGeneration); }) ); } @@ -1225,6 +1232,10 @@ export function convexCollectionOptions( .map((mut) => mut.original) .filter((item): item is DataType => item !== undefined && Object.keys(item).length > 0); ops.delete(itemsToDelete); + await docManager.flush( + transaction.mutations.map((mutation) => String(mutation.key)) + ); + ensureGeneration(mutationGeneration); await Promise.all( transaction.mutations.map(async (mut, i) => { @@ -1237,6 +1248,7 @@ export function convexCollectionOptions( bytes: delta.buffer, type: 'delete', }); + ensureGeneration(mutationGeneration); }) ); return; @@ -1271,6 +1283,8 @@ export function convexCollectionOptions( // StagedChange interface allows previousState, safe to assign via mutable reference (lastChange as StagedChange).previousState = rollbackStates.get(documentId); } + await docManager.flush([documentId]); + ensureGeneration(mutationGeneration); // Optimistically remove from TanStack DB const original = mut.original; @@ -1285,6 +1299,7 @@ export function convexCollectionOptions( bytes: delta.buffer, type: 'delete', }); + ensureGeneration(mutationGeneration); } }); } catch (error) { diff --git a/packages/replicate/src/client/persistence/sqlite/preload.ts b/packages/replicate/src/client/persistence/sqlite/preload.ts index ec687fb..cf8126a 100644 --- a/packages/replicate/src/client/persistence/sqlite/preload.ts +++ b/packages/replicate/src/client/persistence/sqlite/preload.ts @@ -52,6 +52,9 @@ export function preloadLinks(assetBase = CDN_BASE): string { const compiled = new Map>(); export function compileWasmModule(assetBase = CDN_BASE): Promise { + if (typeof window === 'undefined') { + return Promise.reject(new Error('compileWasmModule is browser-only')); + } const url = `${assetBase.replace(/\/$/, '')}/dist/wa-sqlite-async.wasm`; let result = compiled.get(url); if (!result) { diff --git a/packages/replicate/src/test/assets.test.ts b/packages/replicate/src/test/assets.test.ts index 9d1b353..390939a 100644 --- a/packages/replicate/src/test/assets.test.ts +++ b/packages/replicate/src/test/assets.test.ts @@ -1,5 +1,5 @@ // @vitest-environment node -import { test, expect } from 'vitest'; +import { test, expect, vi } from 'vitest'; import { execFile } from 'node:child_process'; import { promisify } from 'node:util'; import { mkdtemp, readFile, writeFile, rm } from 'node:fs/promises'; @@ -7,6 +7,20 @@ import { tmpdir } from 'node:os'; import { join } from 'node:path'; import { fileURLToPath } from 'node:url'; import { createHash } from 'node:crypto'; +import { compileWasmModule } from '../client/persistence/sqlite/preload'; + +test('compileWasmModule rejects in Node without fetching browser assets', async () => { + const fetch = vi.fn(() => Promise.reject(new Error('fetch should not run'))); + vi.stubGlobal('fetch', fetch); + try { + await expect(compileWasmModule('/local-runtime')).rejects.toThrow( + 'compileWasmModule is browser-only' + ); + expect(fetch).not.toHaveBeenCalled(); + } finally { + vi.unstubAllGlobals(); + } +}); test('asset CLI installs into a new directory and refreshes assets on repeated builds', async () => { const directory = await mkdtemp(join(tmpdir(), 'replicate-assets-')); diff --git a/packages/replicate/src/test/offline.test.ts b/packages/replicate/src/test/offline.test.ts index ed3e152..215441b 100644 --- a/packages/replicate/src/test/offline.test.ts +++ b/packages/replicate/src/test/offline.test.ts @@ -450,6 +450,139 @@ test('writable default still inserts and sends document updates', async () => { await vi.waitFor(() => expect(rows.get('new')?.title).toBe('edited')); }); +test.each(['insert', 'update', 'delete'] as const)( + 'local %s waits for durable persistence before remote acknowledgement', + async (action) => { + const entered = deferred(); + const release = deferred(); + const document = action === 'insert' ? 'new' : 'a'; + let block = false; + const db = await disk(undefined, async (sql, params) => { + if ( + block && + sql.startsWith('INSERT INTO deltas') && + params?.[0] === `offline:${document}` + ) { + entered.resolve(); + await release.promise; + } + }); + disposals.push(() => db.persistence.close!()); + if (action !== 'insert') await seed(db.persistence); + const { rows, network } = await open(db.persistence, transport(), { + networkMode: 'manual', + }); + await rows.connect(); + await vi.waitFor(() => expect(network.subscriptions.length).toBeGreaterThan(0)); + block = true; + const transaction = + action === 'insert' + ? rows.insert({ id: document, title: 'local' }) + : action === 'update' + ? rows.update(document, (row) => { + row.title = 'local'; + }) + : rows.delete(document); + let outcome = 'pending'; + const persisted = transaction.isPersisted.promise.then( + () => { + outcome = 'resolved'; + }, + (error) => { + outcome = 'rejected'; + throw error; + } + ); + await entered.promise; + await new Promise((resolve) => setTimeout(resolve, 20)); + expect(outcome).toBe('pending'); + expect( + network.client.mutation.mock.calls.some( + ([ref]: any) => getFunctionName(ref) === 'offline:replicate' + ) + ).toBe(false); + if (action === 'insert') { + expect( + db.database + .prepare("SELECT value FROM kv WHERE key = 'pending-create:offline:new'") + .get() + ).toBeDefined(); + } + release.resolve(); + await persisted; + expect(outcome).toBe('resolved'); + expect( + network.client.mutation.mock.calls.some( + ([ref, args]: any) => + getFunctionName(ref) === 'offline:replicate' && args.type === action + ) + ).toBe(true); + if (action === 'insert') { + expect( + db.database + .prepare("SELECT value FROM kv WHERE key = 'pending-create:offline:new'") + .get() + ).toBeUndefined(); + } + disposals.pop(); + disposals.pop(); + db.database.close(); + const reopened = await disk(db.path); + disposals.push(() => reopened.persistence.close!()); + const next = await open(reopened.persistence, transport(), { networkMode: 'manual' }); + if (action === 'delete') expect(next.rows.get(document)).toBeUndefined(); + else expect(next.rows.get(document)?.title).toBe('local'); + } +); + +test.each(['insert', 'update', 'delete'] as const)( + 'failed local %s persistence rejects before remote acknowledgement', + async (action) => { + const document = action === 'insert' ? 'new' : 'a'; + let fail = false; + const db = await disk(undefined, async (sql, params) => { + if ( + fail && + sql.startsWith('INSERT INTO deltas') && + params?.[0] === `offline:${document}` + ) { + throw new Error('disk unavailable'); + } + }); + disposals.push(() => db.persistence.close!()); + if (action !== 'insert') await seed(db.persistence); + const { rows, network } = await open(db.persistence, transport(), { + networkMode: 'manual', + }); + await rows.connect(); + await vi.waitFor(() => expect(network.subscriptions.length).toBeGreaterThan(0)); + fail = true; + const transaction = + action === 'insert' + ? rows.insert({ id: document, title: 'local' }) + : action === 'update' + ? rows.update(document, (row) => { + row.title = 'local'; + }) + : rows.delete(document); + await expect(transaction.isPersisted.promise).rejects.toThrow('disk unavailable'); + expect( + network.client.mutation.mock.calls.some( + ([ref]: any) => getFunctionName(ref) === 'offline:replicate' + ) + ).toBe(false); + if (action === 'insert') { + expect( + db.database + .prepare("SELECT value FROM kv WHERE key = 'pending-create:offline:new'") + .get() + ).toBeDefined(); + } + fail = false; + await rows.disconnect(); + } +); + test('full-row updates remove omitted optional fields from outbound and reopened data', async () => { const first = await disk(); disposals.push(() => first.persistence.close!()); From 67fcaf4ec5da5c8d8965c5f7080765e3ef70fb68 Mon Sep 17 00:00:00 2001 From: OpenAI Codex Date: Sat, 19 Sep 2026 21:18:51 +0200 Subject: [PATCH 10/14] fix rejected delete durability --- packages/replicate/src/client/collection.ts | 302 ++++++++------- packages/replicate/src/test/offline.test.ts | 400 ++++++++++++++++++++ 2 files changed, 557 insertions(+), 145 deletions(-) diff --git a/packages/replicate/src/client/collection.ts b/packages/replicate/src/client/collection.ts index ae2eace..f985eec 100644 --- a/packages/replicate/src/client/collection.ts +++ b/packages/replicate/src/client/collection.ts @@ -34,11 +34,6 @@ import { createDeleteDelta, applyDeleteMarkerToDoc } from '$/client/deltas'; import * as prose from '$/client/prose'; import { detectYjsType, isYjsAbstractType } from '$/client/merge'; import { getLogger } from '$/shared/logger'; -import { - createTransactionCoordinator, - type TransactionCoordinator, - type StagedChange, -} from '$/client/services/transaction'; import { createSyncQueue, type SyncQueue } from '$/client/services/sync-queue'; import { initContext, @@ -325,7 +320,10 @@ export function convexCollectionOptions( const revisions = new Map(); const durableVectors = new Map(); const pendingCreates = new Set(); + const fullSyncRequired = new Map(); + let fullSyncEpoch = 0; const pendingCreateKey = (id: string) => `pending-create:${collection}:${id}`; + const fullSyncKey = (id: string) => `full-sync-required:${collection}:${id}`; let retryTimer: ReturnType | undefined; let localReady: Promise = Promise.resolve(); const serialize = (operation: () => Promise) => { @@ -340,6 +338,15 @@ export function convexCollectionOptions( ensureGeneration(token); pendingCreates.delete(id); }); + const acknowledgeFullSync = (id: string, epoch: number, token: number, revision: number) => + serialize(async () => { + ensureGeneration(token); + if (fullSyncRequired.get(id) !== epoch || revisions.get(id) !== revision) return; + await persistence.kv.del(fullSyncKey(id)); + ensureGeneration(token); + if (fullSyncRequired.get(id) === epoch && revisions.get(id) === revision) + fullSyncRequired.delete(id); + }); const functionPath = getFunctionName(api.delta); const collection = functionPath.split(':')[0]; if (!collection) { @@ -687,6 +694,8 @@ export function convexCollectionOptions( const editorPresenceProviders = new Map>(); const removeDocument = async (id: string) => { await docManager.remove(id); + await persistence.kv.del(fullSyncKey(id)); + fullSyncRequired.delete(id); presenceProviders.get(id)?.destroy(); presenceProviders.delete(id); for (const provider of editorPresenceProviders.get(id) ?? []) provider.destroy(); @@ -838,6 +847,7 @@ export function convexCollectionOptions( } for (const id of pendingCreates) await persistence.kv.del(pendingCreateKey(id)); pendingCreates.clear(); + fullSyncRequired.clear(); revisions.clear(); await seqService.clear(collection); ops.replace([]); @@ -883,10 +893,6 @@ export function convexCollectionOptions( if (upserts.length) ops.upsert(upserts); }; - // Transaction coordinator for atomic client-side mutations with rollback - // Ensures delete operations are atomic: if server call fails, local state is rolled back - let txCoordinator: TransactionCoordinator | null = null; - // Background sync queue for non-blocking server mutations const syncQueue: SyncQueue = createSyncQueue({ maxRetries: 3, @@ -1081,24 +1087,59 @@ export function convexCollectionOptions( return deltas; }; - const applyYjsDelete = (mutations: CollectionMutation[]): Uint8Array[] => { - const deltas: Uint8Array[] = []; + interface DeleteRollbackAttempt { + documentId: string; + document: Y.Doc; + generation: number; + deletedAt: unknown; + accepted: boolean; + } - for (const mut of mutations) { - const document = String(mut.key); - revisions.set(document, (revisions.get(document) ?? 0) + 1); - const ydoc = docManager.get(document); - - if (ydoc) { - const delta = applyDeleteMarkerToDoc(ydoc); - deltas.push(delta); - } else { - const delta = createDeleteDelta(); - deltas.push(delta); + const rollbackDeleteAttempt = async (attempt: DeleteRollbackAttempt): Promise => { + if (stopped || attempt.generation !== connection.generation) return; + if (docManager.get(attempt.documentId) !== attempt.document) return; + const meta = attempt.document.getMap('_meta'); + const previousRepairEpoch = fullSyncRequired.get(attempt.documentId); + const repairEpoch = ++fullSyncEpoch; + fullSyncRequired.set(attempt.documentId, repairEpoch); + try { + await persistence.kv.set(fullSyncKey(attempt.documentId), repairEpoch); + } catch (error) { + if (fullSyncRequired.get(attempt.documentId) === repairEpoch) { + if (previousRepairEpoch === undefined) fullSyncRequired.delete(attempt.documentId); + else fullSyncRequired.set(attempt.documentId, previousRepairEpoch); } + throw error; } - - return deltas; + ensureGeneration(attempt.generation); + if ( + docManager.get(attempt.documentId) !== attempt.document || + meta.get('_deleted') !== true || + meta.get('_deletedAt') !== attempt.deletedAt + ) + return; + let restored = false; + attempt.document.transact(() => { + if (meta.get('_deleted') !== true || meta.get('_deletedAt') !== attempt.deletedAt) return; + meta.delete('_deleted'); + meta.delete('_deletedAt'); + restored = true; + }, YjsOrigin.Local); + if (!restored) return; + revisions.set(attempt.documentId, (revisions.get(attempt.documentId) ?? 0) + 1); + await docManager.flush([attempt.documentId]); + ensureGeneration(attempt.generation); + if ( + docManager.get(attempt.documentId) !== attempt.document || + isDocumentDeleted(docManager, attempt.documentId) + ) + return; + const restoredItem = serializeDocument(docManager, attempt.documentId, crdtFields); + if (!restoredItem) { + throw new Error(`Cannot serialize document ${attempt.documentId} for rollback`); + } + ops.upsert([restoredItem as DataType]); + logger.debug('Rolled back delete', { documentId: attempt.documentId }); }; return { @@ -1168,6 +1209,8 @@ export function convexCollectionOptions( const isContentSync = !!metadata?.contentSync; const deltas = isContentSync ? null : applyYjsUpdate(transaction.mutations); + if (isContentSync) + revisions.set(documentKey, (revisions.get(documentKey) ?? 0) + 1); try { await Promise.all([persistenceReadyPromise, optimisticReadyPromise]); @@ -1177,14 +1220,27 @@ export function convexCollectionOptions( if (isContentSync && metadata?.contentSync) { const { bytes, material } = metadata.contentSync; + const repairEpoch = fullSyncRequired.get(documentKey); + const revision = revisions.get(documentKey) ?? 0; + const document = docManager.get(documentKey); ensureGeneration(mutationGeneration); await convexClient.mutation(api.replicate, { document: documentKey, - bytes, + bytes: + repairEpoch !== undefined && document + ? (Y.encodeStateAsUpdateV2(document).buffer as ArrayBuffer) + : bytes, material, type: 'update', }); ensureGeneration(mutationGeneration); + if (repairEpoch !== undefined) + await acknowledgeFullSync( + documentKey, + repairEpoch, + mutationGeneration, + revision + ); return; } @@ -1196,6 +1252,9 @@ export function convexCollectionOptions( if (!delta || delta.length === 0) return; const docId = String(mut.key); + const repairEpoch = fullSyncRequired.get(docId); + const revision = revisions.get(docId) ?? 0; + const document = docManager.get(docId); const fullDoc = serializeDocument(docManager, docId); if (!fullDoc) { throw new Error(`Cannot serialize document ${docId} for update`); @@ -1204,11 +1263,21 @@ export function convexCollectionOptions( ensureGeneration(mutationGeneration); await convexClient.mutation(api.replicate, { document: docId, - bytes: delta.buffer, + bytes: + repairEpoch !== undefined && document + ? (Y.encodeStateAsUpdateV2(document).buffer as ArrayBuffer) + : delta.buffer, material: fullDoc, type: 'update', }); ensureGeneration(mutationGeneration); + if (repairEpoch !== undefined) + await acknowledgeFullSync( + docId, + repairEpoch, + mutationGeneration, + revision + ); }) ); } @@ -1220,90 +1289,72 @@ export function convexCollectionOptions( onDelete: async ({ transaction }: CollectionTransaction) => { assertWritable(); const mutationGeneration = connection.generation; + const rollbackAttempts: DeleteRollbackAttempt[] = []; try { await Promise.all([persistenceReadyPromise, optimisticReadyPromise]); ensureGeneration(mutationGeneration); - if (!txCoordinator) { - // Fallback to non-transactional delete if coordinator not ready - logger.warn('Transaction coordinator not initialized, using fallback delete'); - const deltas = applyYjsDelete(transaction.mutations); - const itemsToDelete = transaction.mutations - .map((mut) => mut.original) - .filter((item): item is DataType => item !== undefined && Object.keys(item).length > 0); - ops.delete(itemsToDelete); - await docManager.flush( - transaction.mutations.map((mutation) => String(mutation.key)) - ); + for (const mut of transaction.mutations) { + const documentId = String(mut.key); + const ydoc = docManager.get(documentId); + const repairEpoch = fullSyncRequired.get(documentId); + const delta = ydoc ? applyDeleteMarkerToDoc(ydoc) : createDeleteDelta(); + const rollbackAttempt = ydoc + ? { + documentId, + document: ydoc, + generation: mutationGeneration, + deletedAt: ydoc.getMap('_meta').get('_deletedAt'), + accepted: false, + } + : undefined; + if (rollbackAttempt) rollbackAttempts.push(rollbackAttempt); + revisions.set(documentId, (revisions.get(documentId) ?? 0) + 1); + const revision = revisions.get(documentId) ?? 0; + await docManager.flush([documentId]); ensureGeneration(mutationGeneration); - await Promise.all( - transaction.mutations.map(async (mut, i) => { - const delta = deltas[i]; - if (!delta || delta.length === 0) return; + const original = mut.original; + if (original && Object.keys(original).length > 0) { + ops.delete([original as DataType]); + } - ensureGeneration(mutationGeneration); - await convexClient.mutation(api.replicate, { - document: String(mut.key), - bytes: delta.buffer, - type: 'delete', - }); - ensureGeneration(mutationGeneration); - }) - ); - return; + ensureGeneration(mutationGeneration); + await convexClient.mutation(api.replicate, { + document: documentId, + bytes: + repairEpoch !== undefined && ydoc + ? (Y.encodeStateAsUpdateV2(ydoc).buffer as ArrayBuffer) + : delta.buffer, + type: 'delete', + }); + if (rollbackAttempt) rollbackAttempt.accepted = true; + ensureGeneration(mutationGeneration); + if (repairEpoch !== undefined) + await acknowledgeFullSync( + documentId, + repairEpoch, + mutationGeneration, + revision + ); } - - // Use transaction coordinator for atomic delete with rollback support - // Map to store previousState for rollback (keyed by documentId) - const rollbackStates = new Map(); - - await txCoordinator.transaction(async (tx) => { - // Process each deletion in the transaction - for (const mut of transaction.mutations) { - const documentId = String(mut.key); - const ydoc = docManager.get(documentId); - - // Capture state for potential rollback - if (ydoc) { - const previousState = Y.encodeStateAsUpdateV2(ydoc); - rollbackStates.set(documentId, previousState); - } - - // Stage the delete in the transaction - tx.stageDelete(documentId); - - // Create delete delta - const delta = ydoc ? applyDeleteMarkerToDoc(ydoc) : createDeleteDelta(); - - // Attach previousState to the staged change for rollback - const changes = tx.getStagedChanges(); - const lastChange = changes[changes.length - 1]; - if (lastChange && rollbackStates.has(documentId)) { - // StagedChange interface allows previousState, safe to assign via mutable reference - (lastChange as StagedChange).previousState = rollbackStates.get(documentId); - } - await docManager.flush([documentId]); - ensureGeneration(mutationGeneration); - - // Optimistically remove from TanStack DB - const original = mut.original; - if (original && Object.keys(original).length > 0) { - ops.delete([original as DataType]); - } - - // Call server mutation - if this fails, transaction will rollback - ensureGeneration(mutationGeneration); - await convexClient.mutation(api.replicate, { - document: documentId, - bytes: delta.buffer, - type: 'delete', - }); - ensureGeneration(mutationGeneration); - } - }); } catch (error) { - // Transaction already rolled back if error occurred + const rollbackErrors: unknown[] = []; + for (const attempt of [...rollbackAttempts].reverse()) { + if (attempt.accepted) continue; + try { + await serialize(() => rollbackDeleteAttempt(attempt)); + } catch (rollbackError) { + rollbackErrors.push(rollbackError); + } + } + if (rollbackErrors.length > 0) { + const cause = error instanceof Error ? error.message : String(error); + throw new AggregateError( + [error, ...rollbackErrors], + `Delete failed and local rollback could not be persisted: ${cause}` + ); + } handleMutationError(error); } }, @@ -1333,6 +1384,11 @@ export function convexCollectionOptions( if (stopped) return; for (const docId of existingDocIds) { if (await persistence.kv.get(pendingCreateKey(docId))) pendingCreates.add(docId); + const repairEpoch = await persistence.kv.get(fullSyncKey(docId)); + if (typeof repairEpoch === 'number' && Number.isFinite(repairEpoch)) { + fullSyncRequired.set(docId, repairEpoch); + fullSyncEpoch = Math.max(fullSyncEpoch, repairEpoch); + } if (stopped) return; docManager.getOrCreate(docId); } @@ -1351,50 +1407,6 @@ export function convexCollectionOptions( ops = createReplicateOps(params); - // Initialize transaction coordinator with document-level apply/revert callbacks - txCoordinator = createTransactionCoordinator({ - async onApply(change: StagedChange) { - // Changes are already applied optimistically before server call - // This callback is for any post-commit bookkeeping - logger.debug('Transaction change applied', { - type: change.type, - documentId: change.documentId, - }); - }, - async onRevert(change: StagedChange) { - // Delete rollback - restore document - if (change.type === 'delete' && change.previousState) { - const update = new Uint8Array(change.previousState); - docManager.applyUpdate(change.documentId, update, YjsOrigin.Local); - const restoredItem = serializeDocument(docManager, change.documentId, crdtFields); - if (!restoredItem) { - throw new Error(`Cannot serialize document ${change.documentId} for rollback`); - } - ops.insert([restoredItem as DataType]); - logger.debug('Rolled back delete', { documentId: change.documentId }); - return; - } - - // Update rollback - restore previous state - if (change.type === 'update' && change.previousState) { - const update = new Uint8Array(change.previousState); - docManager.applyUpdate(change.documentId, update, YjsOrigin.Local); - const restoredItem = serializeDocument(docManager, change.documentId, crdtFields); - if (!restoredItem) { - throw new Error(`Cannot serialize document ${change.documentId} for rollback`); - } - ops.upsert([restoredItem as DataType]); - logger.debug('Rolled back update', { documentId: change.documentId }); - return; - } - - // Insert rollback - delete (no-op, document wasn't persisted) - if (change.type === 'insert') { - ops.delete([{ id: change.documentId } as DataType]); - } - }, - }); - resolveOptimisticReady?.(); if (ssrCrdt) { diff --git a/packages/replicate/src/test/offline.test.ts b/packages/replicate/src/test/offline.test.ts index 215441b..e799935 100644 --- a/packages/replicate/src/test/offline.test.ts +++ b/packages/replicate/src/test/offline.test.ts @@ -95,8 +95,10 @@ async function seed(p: Persistence, id = 'a') { await provider.whenSynced; doc.getMap('fields').set('title', 'persisted'); await provider.flush!(); + const state = Y.encodeStateAsUpdateV2(doc); provider.destroy(); doc.destroy(); + return state; } async function open(p: Persistence, network = transport(), options: ConnectionOptions = {}) { const lazy = collection.create<{ id: string; title: string }>({ @@ -583,6 +585,404 @@ test.each(['insert', 'update', 'delete'] as const)( } ); +test('rejected delete restores the durable document', async () => { + const db = await disk(); + disposals.push(() => db.persistence.close!()); + await seed(db.persistence); + const network = transport(); + network.client.mutation.mockImplementation(async (ref: any, args: any) => { + if (getFunctionName(ref) === 'offline:replicate' && args.type === 'delete') { + throw new Error('server rejected delete'); + } + return { success: true, seq: 1 }; + }); + const { rows } = await open(db.persistence, network, { networkMode: 'manual' }); + await rows.connect(); + await vi.waitFor(() => expect(network.subscriptions.length).toBeGreaterThan(0)); + const transaction = rows.delete('a'); + await expect(transaction.isPersisted.promise).rejects.toThrow('server rejected delete'); + const visible = rows.get('a')?.title; + disposals.pop(); + disposals.pop(); + db.database.close(); + const reopened = await disk(db.path); + disposals.push(() => reopened.persistence.close!()); + const next = await open(reopened.persistence, transport(), { networkMode: 'manual' }); + expect({ visible, reopened: next.rows.get('a')?.title }).toEqual({ + visible: 'persisted', + reopened: 'persisted', + }); +}); + +test('an update after a rejected delete converges with a server that rejected the delete delta', async () => { + const db = await disk(); + disposals.push(() => db.persistence.close!()); + const base = await seed(db.persistence); + const server = new Y.Doc(); + Y.applyUpdateV2(server, base); + expect(server.getMap('fields').get('title')).toBe('persisted'); + const rejecting = transport(); + rejecting.client.mutation.mockImplementation(async (ref: any, args: any) => { + if (getFunctionName(ref) === 'offline:replicate' && args.type === 'delete') + throw new Error('server rejected delete'); + return { success: true, seq: 1 }; + }); + const { rows } = await open(db.persistence, rejecting, { networkMode: 'manual' }); + await rows.connect(); + await vi.waitFor(() => expect(rejecting.subscriptions.length).toBeGreaterThan(0)); + const deletion = rows.delete('a'); + await expect(deletion.isPersisted.promise).rejects.toThrow('server rejected delete'); + disposals.pop(); + disposals.pop(); + db.database.close(); + + const reopened = await disk(db.path); + disposals.push(() => reopened.persistence.close!()); + const accepting = transport(); + accepting.client.mutation.mockImplementation(async (ref: any, args: any) => { + if (getFunctionName(ref) === 'offline:replicate') + Y.applyUpdateV2(server, new Uint8Array(args.bytes)); + return { success: true, seq: 2 }; + }); + const next = await open(reopened.persistence, accepting, { networkMode: 'manual' }); + await next.rows.connect(); + const update = next.rows.update('a', (row) => { + row.title = 'after rollback'; + }); + await update.isPersisted.promise; + expect(server.getMap('fields').get('title')).toBe('after rollback'); + expect(server.getMap('_meta').get('_deleted')).not.toBe(true); + server.destroy(); +}); + +test('an older repair completion cannot clear a newer full-state repair', async () => { + const db = await disk(); + disposals.push(() => db.persistence.close!()); + const base = await seed(db.persistence); + const server = new Y.Doc(); + Y.applyUpdateV2(server, base); + const first = deferred(); + const second = deferred(); + const updateCalls: any[] = []; + const network = transport(); + network.client.mutation.mockImplementation(async (ref: any, args: any) => { + if (getFunctionName(ref) !== 'offline:replicate') return { success: true, seq: 1 }; + if (args.type === 'delete') throw new Error('server rejected delete'); + updateCalls.push(args); + return updateCalls.length === 1 ? first.promise : second.promise; + }); + const { rows } = await open(db.persistence, network, { networkMode: 'manual' }); + await rows.connect(); + const deletion = rows.delete('a'); + await expect(deletion.isPersisted.promise).rejects.toThrow('server rejected delete'); + expect(await db.persistence.kv.get('full-sync-required:offline:a')).toBeTypeOf('number'); + const older = rows.update('a', (row) => { + row.title = 'older'; + }); + await vi.waitFor(() => expect(updateCalls).toHaveLength(1)); + const newer = rows.update('a', (row) => { + row.title = 'newer'; + }); + await vi.waitFor(() => expect(updateCalls).toHaveLength(2)); + first.resolve({ success: true, seq: 2 }); + await older.isPersisted.promise; + expect(await db.persistence.kv.get('full-sync-required:offline:a')).toBeTypeOf('number'); + Y.applyUpdateV2(server, new Uint8Array(updateCalls[1].bytes)); + second.resolve({ success: true, seq: 3 }); + await newer.isPersisted.promise; + expect(await db.persistence.kv.get('full-sync-required:offline:a')).toBeUndefined(); + expect(server.getMap('fields').get('title')).toBe('newer'); + server.destroy(); +}); + +test('a newer rejected delete restores its durable repair marker after an older acknowledgement', async () => { + const db = await disk(); + disposals.push(() => db.persistence.close!()); + const base = await seed(db.persistence); + const server = new Y.Doc(); + Y.applyUpdateV2(server, base); + let deletes = 0; + const network = transport(); + network.client.mutation.mockImplementation(async (ref: any, args: any) => { + if (getFunctionName(ref) !== 'offline:replicate') return { success: true, seq: 1 }; + if (args.type === 'delete') { + deletes += 1; + throw new Error(`server rejected delete ${deletes}`); + } + Y.applyUpdateV2(server, new Uint8Array(args.bytes)); + return { success: true, seq: 2 }; + }); + const { rows } = await open(db.persistence, network, { networkMode: 'manual' }); + await rows.connect(); + const initialDelete = rows.delete('a'); + await expect(initialDelete.isPersisted.promise).rejects.toThrow('server rejected delete 1'); + + const entered = deferred(); + const release = deferred(); + const del = db.persistence.kv.del.bind(db.persistence.kv); + db.persistence.kv.del = async (key) => { + if (key === 'full-sync-required:offline:a') { + entered.resolve(); + await release.promise; + } + await del(key); + }; + const acceptedRepair = rows.update('a', (row) => { + row.title = 'accepted repair'; + }); + await entered.promise; + const newerDelete = rows.delete('a'); + const newerRejected = expect(newerDelete.isPersisted.promise).rejects.toThrow( + 'server rejected delete 2' + ); + await vi.waitFor(() => expect(deletes).toBe(2)); + release.resolve(); + await acceptedRepair.isPersisted.promise; + await newerRejected; + expect(await db.persistence.kv.get('full-sync-required:offline:a')).toBeTypeOf('number'); + disposals.pop(); + disposals.pop(); + db.database.close(); + + const reopened = await disk(db.path); + disposals.push(() => reopened.persistence.close!()); + const accepting = transport(); + accepting.client.mutation.mockImplementation(async (ref: any, args: any) => { + if (getFunctionName(ref) === 'offline:replicate') + Y.applyUpdateV2(server, new Uint8Array(args.bytes)); + return { success: true, seq: 3 }; + }); + const next = await open(reopened.persistence, accepting, { networkMode: 'manual' }); + await next.rows.connect(); + const finalUpdate = next.rows.update('a', (row) => { + row.title = 'after second rollback'; + }); + await finalUpdate.isPersisted.promise; + expect(server.getMap('fields').get('title')).toBe('after second rollback'); + server.destroy(); +}); + +test('rejected delete rollback preserves a newer streamed field value', async () => { + const db = await disk(); + disposals.push(() => db.persistence.close!()); + await seed(db.persistence); + const remote = deferred(); + const network = transport(); + network.client.mutation.mockImplementation(async (ref: any, args: any) => { + if (getFunctionName(ref) === 'offline:replicate' && args.type === 'delete') { + return remote.promise; + } + return { success: true, seq: 1 }; + }); + const { rows } = await open(db.persistence, network, { networkMode: 'manual' }); + await rows.connect(); + await vi.waitFor(() => expect(network.subscriptions.length).toBeGreaterThan(0)); + const transaction = rows.delete('a'); + const rejected = expect(transaction.isPersisted.promise).rejects.toThrow('server rejected delete'); + await vi.waitFor(() => + expect( + network.client.mutation.mock.calls.some( + ([ref, args]: any) => + getFunctionName(ref) === 'offline:replicate' && args.type === 'delete' + ) + ).toBe(true) + ); + network.emit(page(change('a', 2, 'concurrent'))); + await vi.waitFor(async () => expect(await db.persistence.kv.get('cursor:offline')).toBe(2)); + remote.reject(new Error('server rejected delete')); + await rejected; + expect(rows.get('a')?.title).toBe('concurrent'); + disposals.pop(); + disposals.pop(); + db.database.close(); + const reopened = await disk(db.path); + disposals.push(() => reopened.persistence.close!()); + const next = await open(reopened.persistence, transport(), { networkMode: 'manual' }); + expect(next.rows.get('a')?.title).toBe('concurrent'); +}); + +test('reset while delete rejection is pending does not resurrect the document', async () => { + const db = await disk(); + disposals.push(() => db.persistence.close!()); + await seed(db.persistence); + const remote = deferred(); + const network = transport(); + network.client.mutation.mockImplementation(async (ref: any, args: any) => { + if (getFunctionName(ref) === 'offline:replicate' && args.type === 'delete') { + return remote.promise; + } + return { success: true, seq: 1 }; + }); + const { rows } = await open(db.persistence, network, { networkMode: 'manual' }); + await rows.connect(); + await vi.waitFor(() => expect(network.subscriptions.length).toBeGreaterThan(0)); + const transaction = rows.delete('a'); + const rejected = expect(transaction.isPersisted.promise).rejects.toThrow('server rejected delete'); + await vi.waitFor(() => + expect( + network.client.mutation.mock.calls.some( + ([ref, args]: any) => + getFunctionName(ref) === 'offline:replicate' && args.type === 'delete' + ) + ).toBe(true) + ); + await rows.reset(); + remote.reject(new Error('server rejected delete')); + await rejected; + expect(rows.get('a')).toBeUndefined(); + disposals.pop(); + disposals.pop(); + db.database.close(); + const reopened = await disk(db.path); + disposals.push(() => reopened.persistence.close!()); + const next = await open(reopened.persistence, transport(), { networkMode: 'manual' }); + expect(next.rows.get('a')).toBeUndefined(); +}); + +test('an authoritative streamed deletion wins over a pending rejected delete', async () => { + const db = await disk(); + disposals.push(() => db.persistence.close!()); + await seed(db.persistence); + const remote = deferred(); + const network = transport(); + network.client.mutation.mockImplementation(async (ref: any, args: any) => { + if (getFunctionName(ref) === 'offline:replicate' && args.type === 'delete') + return remote.promise; + return { success: true, seq: 1 }; + }); + const { rows } = await open(db.persistence, network, { networkMode: 'manual' }); + await rows.connect(); + await vi.waitFor(() => expect(network.subscriptions.length).toBeGreaterThan(0)); + const transaction = rows.delete('a'); + const rejected = expect(transaction.isPersisted.promise).rejects.toThrow('server rejected delete'); + await vi.waitFor(() => + expect( + network.client.mutation.mock.calls.some( + ([ref, args]: any) => + getFunctionName(ref) === 'offline:replicate' && args.type === 'delete' + ) + ).toBe(true) + ); + network.emit(page({ document: 'a', seq: 2, type: 'delta', exists: false })); + await vi.waitFor(async () => expect(await db.persistence.kv.get('cursor:offline')).toBe(2)); + remote.reject(new Error('server rejected delete')); + await rejected; + expect(rows.get('a')).toBeUndefined(); + expect(await db.persistence.kv.get('full-sync-required:offline:a')).toBeUndefined(); + disposals.pop(); + disposals.pop(); + db.database.close(); + const reopened = await disk(db.path); + disposals.push(() => reopened.persistence.close!()); + const next = await open(reopened.persistence, transport(), { networkMode: 'manual' }); + expect(next.rows.get('a')).toBeUndefined(); +}); + +test('partial batch delete keeps the accepted item deleted and restores only the rejected item', async () => { + const db = await disk(); + disposals.push(() => db.persistence.close!()); + await seed(db.persistence, 'a'); + await seed(db.persistence, 'b'); + let deletes = 0; + const network = transport(); + network.client.mutation.mockImplementation(async (ref: any, args: any) => { + if (getFunctionName(ref) === 'offline:replicate' && args.type === 'delete') { + deletes += 1; + if (deletes === 2) throw new Error('server rejected second delete'); + } + return { success: true, seq: deletes }; + }); + const { rows } = await open(db.persistence, network, { networkMode: 'manual' }); + await rows.connect(); + await vi.waitFor(() => expect(network.subscriptions.length).toBeGreaterThan(0)); + const transaction = rows.delete(['a', 'b']); + await expect(transaction.isPersisted.promise).rejects.toThrow('server rejected second delete'); + expect(rows.get('a')).toBeUndefined(); + expect(rows.get('b')?.title).toBe('persisted'); + disposals.pop(); + disposals.pop(); + db.database.close(); + const reopened = await disk(db.path); + disposals.push(() => reopened.persistence.close!()); + const next = await open(reopened.persistence, transport(), { networkMode: 'manual' }); + expect(next.rows.get('a')).toBeUndefined(); + expect(next.rows.get('b')?.title).toBe('persisted'); +}); + +test('failed delete rollback persistence rejects explicitly and drains after the failure clears', async () => { + let failRollback = false; + const db = await disk(undefined, async (sql, params) => { + if ( + failRollback && + sql.startsWith('INSERT INTO deltas') && + params?.[0] === 'offline:a' + ) { + throw new Error('rollback disk unavailable'); + } + }); + disposals.push(() => db.persistence.close!()); + await seed(db.persistence); + const network = transport(); + network.client.mutation.mockImplementation(async (ref: any, args: any) => { + if (getFunctionName(ref) === 'offline:replicate' && args.type === 'delete') { + failRollback = true; + throw new Error('server rejected delete'); + } + return { success: true, seq: 1 }; + }); + const { rows } = await open(db.persistence, network, { networkMode: 'manual' }); + await rows.connect(); + await vi.waitFor(() => expect(network.subscriptions.length).toBeGreaterThan(0)); + const transaction = rows.delete('a'); + await expect(transaction.isPersisted.promise).rejects.toThrow( + 'Delete failed and local rollback could not be persisted' + ); + expect( + db.database + .prepare("SELECT count(*) AS count FROM deltas WHERE collection = 'offline:a'") + .get() + ).toHaveProperty('count', 2); + failRollback = false; + await rows.disconnect(); + expect( + db.database + .prepare("SELECT count(*) AS count FROM deltas WHERE collection = 'offline:a'") + .get() + ).toHaveProperty('count', 3); + disposals.pop(); + disposals.pop(); + db.database.close(); + const reopened = await disk(db.path); + disposals.push(() => reopened.persistence.close!()); + const next = await open(reopened.persistence, transport(), { networkMode: 'manual' }); + expect(next.rows.get('a')?.title).toBe('persisted'); +}); + +test('failed delete rollback marker persistence rejects without publishing a restored row', async () => { + const db = await disk(); + disposals.push(() => db.persistence.close!()); + await seed(db.persistence); + const set = db.persistence.kv.set.bind(db.persistence.kv); + db.persistence.kv.set = async (key, value) => { + if (key === 'full-sync-required:offline:a') throw new Error('repair marker unavailable'); + await set(key, value); + }; + const network = transport(); + network.client.mutation.mockImplementation(async (ref: any, args: any) => { + if (getFunctionName(ref) === 'offline:replicate' && args.type === 'delete') + throw new Error('server rejected delete'); + return { success: true, seq: 1 }; + }); + const { rows } = await open(db.persistence, network, { networkMode: 'manual' }); + await rows.connect(); + const deletion = rows.delete('a'); + await expect(deletion.isPersisted.promise).rejects.toThrow( + 'Delete failed and local rollback could not be persisted' + ); + expect(rows.get('a')).toBeUndefined(); + expect(await db.persistence.kv.get('full-sync-required:offline:a')).toBeUndefined(); +}); + test('full-row updates remove omitted optional fields from outbound and reopened data', async () => { const first = await disk(); disposals.push(() => first.persistence.close!()); From 41a2a6f0b4b46a4fcfb77b9f709eca390f1fc98e Mon Sep 17 00:00:00 2001 From: OpenAI Codex Date: Sat, 19 Sep 2026 21:01:14 +0200 Subject: [PATCH 11/14] docs: constrain public runtime asset worker --- docs/CDN.md | 55 ++++++++++++++++++++++++++++++---------- docs/offline-replicas.md | 2 +- 2 files changed, 42 insertions(+), 15 deletions(-) diff --git a/docs/CDN.md b/docs/CDN.md index 1d14f6b..30a6f58 100644 --- a/docs/CDN.md +++ b/docs/CDN.md @@ -108,32 +108,59 @@ warm module in an open tab does not prove that the JavaScript/WASM graph is avai ## Cloudflare R2 example -Create a versioned prefix such as `replicate-sqlite/2.0.0-preview.0/`, then upload the **entire** -copied directory, including the manifest and notice files. An R2-backed Worker can serve objects -with the content types and immutable headers above: +Create a dedicated R2 bucket that contains only public runtime distributions; do not share this +binding with application or private objects. Upload the **entire** copied directory, including the +manifest and notice files, under the immutable prefix `replicate-sqlite/2.0.0-preview.0/`. This +Worker serves only that declared prefix and rejects other paths before reading the bucket: ```typescript +interface Env { + RUNTIME_BUCKET: R2Bucket; +} + +const PUBLIC_RUNTIME_PREFIX = '/replicate-sqlite/2.0.0-preview.0/'; +const PUBLIC_RUNTIME_KEY_PREFIX = PUBLIC_RUNTIME_PREFIX.slice(1); + +const notFound = () => new Response('Not Found', { status: 404 }); + +function contentTypeFor(key: string): string { + if (key.endsWith('.wasm')) return 'application/wasm'; + if (key.endsWith('.json')) return 'application/json'; + if (key.endsWith('.md') || key.endsWith('/LICENSE')) return 'text/plain; charset=utf-8'; + if (key.endsWith('.js') || key.endsWith('.mjs')) return 'application/javascript'; + return 'application/octet-stream'; +} + export default { async fetch(request: Request, env: Env): Promise { + if (request.method !== 'GET' && request.method !== 'HEAD') { + return new Response('Method Not Allowed', { + status: 405, + headers: { Allow: 'GET, HEAD' }, + }); + } + const url = new URL(request.url); - const key = url.pathname.slice(1); + if (!url.pathname.startsWith(PUBLIC_RUNTIME_PREFIX)) return notFound(); + + const relativePath = url.pathname.slice(PUBLIC_RUNTIME_PREFIX.length); + if (!relativePath) return notFound(); + + const key = PUBLIC_RUNTIME_KEY_PREFIX + relativePath; + const contentType = contentTypeFor(key); + const object = await env.RUNTIME_BUCKET.get(key); - if (!object) return new Response('Not Found', { status: 404 }); + if (!object) return notFound(); const headers = new Headers(); - const contentType = key.endsWith('.wasm') - ? 'application/wasm' - : key.endsWith('.json') - ? 'application/json' - : key.endsWith('.md') || key.endsWith('/LICENSE') - ? 'text/plain; charset=utf-8' - : 'application/javascript'; headers.set('Content-Type', contentType); headers.set('Cache-Control', 'public, max-age=31536000, immutable'); headers.set('Access-Control-Allow-Origin', 'https://app.example.com'); - return new Response(object.body, { headers }); + return new Response(request.method === 'HEAD' ? null : object.body, { headers }); }, }; ``` -Do not mutate objects under an existing versioned prefix. +Bind `RUNTIME_BUCKET` to the dedicated public-assets bucket. Do not mutate objects under the +published prefix; upload an upgrade to a new versioned prefix and update `PUBLIC_RUNTIME_PREFIX`. +The object-key prefix is derived from it. diff --git a/docs/offline-replicas.md b/docs/offline-replicas.md index 59301a0..0fa9158 100644 --- a/docs/offline-replicas.md +++ b/docs/offline-replicas.md @@ -90,7 +90,7 @@ The methods are optional in the TypeScript interface for source compatibility, b The browser worker uses **IDBBatchAtomicVFS (IndexedDB)**, not OPFS. Copy the versioned runtime included with the package into your application's public assets during its build: ```sh -replicate-sqlite-assets public/replicate-sqlite +npm exec -- replicate-sqlite-assets public/replicate-sqlite ``` Repeated builds refresh the runtime files in that directory and preserve unrelated files. From 9f0e0e8ff5d7691b4a970987b27243e749207165 Mon Sep 17 00:00:00 2001 From: OpenAI Codex Date: Sat, 19 Sep 2026 21:22:03 +0200 Subject: [PATCH 12/14] docs: explain rejected delete recovery --- CHANGELOG.md | 1 + docs/offline-replicas.md | 2 ++ 2 files changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3332dd6..dcc3485 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Disconnect/reset followed by collection cleanup stops each Convex subscription once and ignores queued callbacks after unsubscribe. - Full-row updates remove omitted optional fields, SQLite document clearing is atomic, and browser worker shutdown drains accepted work while rejecting new work after closing starts. - Snapshot/delta discovery works after compaction, including scheduled compaction and writes between small pages. +- Rejected deletes persist a marker-removal rollback before republishing and retain private full-state repair metadata across restart until the next explicit update or delete succeeds. ### Upgrade notes diff --git a/docs/offline-replicas.md b/docs/offline-replicas.md index 0fa9158..6b060ed 100644 --- a/docs/offline-replicas.md +++ b/docs/offline-replicas.md @@ -53,6 +53,8 @@ Insert retries preserve a single logical document ID without repeating `onInsert Writable pending creations are marked durably before local insertion, retained across restart, and retried after connection. Legacy writable documents without a pending marker are preserved when the server has no history of that ID (`known: false`); this avoids discarding unsent pre-upgrade creations. Read-only replicas treat that absence as authoritative. A server tombstone/history with absent material remains authoritative for writable clients too. This is not a general persistent transaction outbox or a change to the existing writable retry/conflict model. +When the server rejects a delete, Replicate restores the row with a newer Yjs transaction that removes the deletion markers, persists the rollback before republishing the row, and records private per-document repair metadata. That metadata survives restart; the next explicit successful update or delete sends full Yjs state, then clears it. It is not an automatic retry or outbox. An awaited disconnect or reset for an account switch fences stale rollback work. A crash before the failure and rollback complete retains the existing ambiguous in-flight-write limits. + ## Existing component upgrade This change targets the current v2 preview component schema (`deltas`, `snapshots`, `sequences`). Migration from the different npm 1.1.2 component is outside this patch; the archived migration documents describe earlier schemas and are not a verified stable-to-preview upgrade procedure. From e512897f316c1a9b83c5d5e44ac72314b3970471 Mon Sep 17 00:00:00 2001 From: OpenAI Codex Date: Sat, 19 Sep 2026 21:49:07 +0200 Subject: [PATCH 13/14] fix(client): keep repair material in sync --- packages/replicate/src/client/collection.ts | 17 +- packages/replicate/src/test/offline.test.ts | 192 ++++++++++++++++++++ 2 files changed, 204 insertions(+), 5 deletions(-) diff --git a/packages/replicate/src/client/collection.ts b/packages/replicate/src/client/collection.ts index f985eec..1532ad6 100644 --- a/packages/replicate/src/client/collection.ts +++ b/packages/replicate/src/client/collection.ts @@ -1223,14 +1223,21 @@ export function convexCollectionOptions( const repairEpoch = fullSyncRequired.get(documentKey); const revision = revisions.get(documentKey) ?? 0; const document = docManager.get(documentKey); + let repairBytes = bytes; + let repairMaterial = material; + if (repairEpoch !== undefined && document) { + const fullDoc = serializeDocument(docManager, documentKey); + if (!fullDoc) { + throw new Error(`Cannot serialize document ${documentKey} for update`); + } + repairBytes = Y.encodeStateAsUpdateV2(document).buffer as ArrayBuffer; + repairMaterial = fullDoc; + } ensureGeneration(mutationGeneration); await convexClient.mutation(api.replicate, { document: documentKey, - bytes: - repairEpoch !== undefined && document - ? (Y.encodeStateAsUpdateV2(document).buffer as ArrayBuffer) - : bytes, - material, + bytes: repairBytes, + material: repairMaterial, type: 'update', }); ensureGeneration(mutationGeneration); diff --git a/packages/replicate/src/test/offline.test.ts b/packages/replicate/src/test/offline.test.ts index e799935..b8203ab 100644 --- a/packages/replicate/src/test/offline.test.ts +++ b/packages/replicate/src/test/offline.test.ts @@ -13,6 +13,7 @@ import { createNativeSqlitePersistence } from '../client/persistence/sqlite/nati import { createCustomPersistence } from '../client/persistence/custom'; import { createWebEncryptionPersistence } from '../client/persistence/encrypted/web'; import { createConnection } from '../client/services/connection'; +import { fragmentToJSON } from '../client/merge'; import type { ConnectionOptions } from '../client/services/connection'; import type { Persistence } from '../client/persistence/types'; @@ -27,6 +28,11 @@ const definition = schema.define({ defaults: {}, history: {}, }); +const proseDefinition = schema.define({ + shape: v.object({ id: v.string(), title: v.string(), content: schema.prose() }), + defaults: {}, + history: {}, +}); const disposals: (() => Promise)[] = []; afterEach(async () => { for (const dispose of disposals.splice(0).reverse()) await dispose(); @@ -116,6 +122,44 @@ async function open(p: Persistence, network = transport(), options: ConnectionOp }); return { rows, network }; } +async function seedProse(p: Persistence) { + const doc = new Y.Doc(); + doc.clientID = 1; + const provider = p.createDocPersistence('offline:a', doc); + await provider.whenSynced; + const fields = doc.getMap('fields'); + fields.set('title', 'base'); + fields.set('content', new Y.XmlFragment()); + await provider.flush!(); + const state = Y.encodeStateAsUpdateV2(doc); + provider.destroy(); + doc.destroy(); + return state; +} +async function openProse(p: Persistence, network = transport()) { + const lazy = collection.create<{ id: string; title: string; content: any }>({ + schema: proseDefinition, + persistence: async () => p, + config: () => ({ convexClient: network.client as any, api, getKey: (row) => row.id }), + networkMode: 'manual', + }); + await lazy.init(); + const rows = lazy.get(); + await rows.preload(); + disposals.push(async () => { + await rows.disconnect(); + await rows.cleanup(); + }); + return { rows, network }; +} +function proseMaterial(doc: Y.Doc) { + const fields = doc.getMap('fields'); + return { + title: fields.get('title'), + content: fragmentToJSON(fields.get('content') as Y.XmlFragment), + id: 'a', + }; +} function change(id: string, seq: number, title = 'remote') { const doc = new Y.Doc(); doc.clientID = 2; @@ -130,6 +174,16 @@ const page = (...changes: any[]) => ({ seq: changes.at(-1).seq, more: false, }); +function proseTitleChange(base: Uint8Array, title: string, seq: number) { + const doc = new Y.Doc(); + doc.clientID = 2; + Y.applyUpdateV2(doc, base); + const vector = Y.encodeStateVector(doc); + doc.getMap('fields').set('title', title); + const bytes = Y.encodeStateAsUpdateV2(doc, vector).buffer; + doc.destroy(); + return page({ document: 'a', seq, bytes, type: 'delta', exists: true }); +} test.each(['disconnect', 'reset'] as const)( '%s followed by reconnect and cleanup stops each transport subscription once', @@ -1480,3 +1534,141 @@ test('an insert before preload is not invalidated by initial automatic activatio await rows.disconnect(); await rows.cleanup(); }); + +test('repair content sync pairs current full bytes with current material after a stream update', async () => { + const gateEntered = deferred(); + const releaseGate = deferred(); + let gateWrites = false; + let gateConsumed = false; + const db = await disk(); + disposals.push(() => db.persistence.close!()); + const base = await seedProse(db.persistence); + const server = new Y.Doc(); + Y.applyUpdateV2(server, base); + const network = transport(); + const accepted: any[] = []; + network.client.mutation.mockImplementation(async (ref: any, args: any) => { + if (getFunctionName(ref) !== 'offline:replicate') return { success: true, seq: 1 }; + if (args.type === 'delete') throw new Error('server rejected delete'); + accepted.push(args); + return { success: true, seq: 3 }; + }); + const gatedPersistence: Persistence = { + ...db.persistence, + createDocPersistence(name, doc) { + const provider = db.persistence.createDocPersistence(name, doc); + const flush = provider.flush!.bind(provider); + provider.flush = async () => { + if (gateWrites && !gateConsumed && name === 'offline:a') { + gateConsumed = true; + await flush(); + gateEntered.resolve(); + await releaseGate.promise; + return; + } + await flush(); + }; + return provider; + }, + }; + const { rows } = await openProse(gatedPersistence, network); + await rows.connect(); + const deletion = rows.delete('a'); + await expect(deletion.isPersisted.promise).rejects.toThrow('server rejected delete'); + expect(await db.persistence.kv.get('full-sync-required:offline:a')).toBeTypeOf('number'); + + const contentCaptured = deferred(); + const update = rows.update.bind(rows); + (rows as any).update = (...args: any[]) => { + if (args[1]?.metadata?.contentSync) contentCaptured.resolve(); + return update(...args); + }; + const binding = await rows.doc('a').prose('content', { debounceMs: 0 }); + gateWrites = true; + const text = new Y.XmlText(); + text.insert(0, 'local prose'); + binding.fragment.insert(0, [text]); + await gateEntered.promise; + await contentCaptured.promise; + network.emit(proseTitleChange(base, 'remote', 2)); + await vi.waitFor(() => + expect(binding.provider.document.getMap('fields').get('title')).toBe('remote') + ); + releaseGate.resolve(); + await vi.waitFor(() => expect(accepted).toHaveLength(1)); + + const sent = accepted[0]; + Y.applyUpdateV2(server, new Uint8Array(sent.bytes)); + expect(server.getMap('_meta').get('_deleted')).not.toBe(true); + expect(server.getMap('fields').get('title')).toBe('remote'); + expect((server.getMap('fields').get('content') as Y.XmlFragment).toString()).toBe('local prose'); + expect(sent.material).toEqual(proseMaterial(server)); + await vi.waitFor(async () => + expect(await db.persistence.kv.get('full-sync-required:offline:a')).toBeUndefined() + ); + + binding.destroy(); + await rows.disconnect(); + await rows.cleanup(); + disposals.pop(); + disposals.pop(); + db.database.close(); + const reopened = await disk(db.path); + disposals.push(() => reopened.persistence.close!()); + const next = await openProse(reopened.persistence); + expect(next.rows.get('a')).toMatchObject({ title: 'remote', content: sent.material.content }); + expect(proseMaterial(server)).toEqual(sent.material); + server.destroy(); +}, 20_000); + +test('restart leaves a repair marker idle until an explicit update sends full state', async () => { + const first = await disk(); + disposals.push(() => first.persistence.close!()); + const base = await seedProse(first.persistence); + const rejecting = transport(); + rejecting.client.mutation.mockImplementation(async (ref: any, args: any) => { + if (getFunctionName(ref) === 'offline:replicate' && args.type === 'delete') + throw new Error('server rejected delete'); + return { success: true, seq: 1 }; + }); + const initial = await openProse(first.persistence, rejecting); + await initial.rows.connect(); + const deletion = initial.rows.delete('a'); + await expect(deletion.isPersisted.promise).rejects.toThrow('server rejected delete'); + const marker = await first.persistence.kv.get('full-sync-required:offline:a'); + expect(marker).toBeTypeOf('number'); + await initial.rows.disconnect(); + await initial.rows.cleanup(); + disposals.pop(); + disposals.pop(); + first.database.close(); + + const reopened = await disk(first.path); + disposals.push(() => reopened.persistence.close!()); + const server = new Y.Doc(); + Y.applyUpdateV2(server, base); + const accepting = transport(); + const accepted: any[] = []; + accepting.client.mutation.mockImplementation(async (ref: any, args: any) => { + if (getFunctionName(ref) === 'offline:replicate') accepted.push(args); + return { success: true, seq: 2 }; + }); + const next = await openProse(reopened.persistence, accepting); + await next.rows.connect(); + await vi.waitFor(() => expect(accepting.subscriptions.length).toBeGreaterThan(0)); + await new Promise((resolve) => setTimeout(resolve, 50)); + expect(accepted).toHaveLength(0); + expect(await reopened.persistence.kv.get('full-sync-required:offline:a')).toBe(marker); + + const update = next.rows.update('a', (row) => { + row.title = 'explicit'; + }); + await update.isPersisted.promise; + expect(accepted).toHaveLength(1); + expect(accepted[0].type).toBe('update'); + Y.applyUpdateV2(server, new Uint8Array(accepted[0].bytes)); + expect(proseMaterial(server)).toEqual(accepted[0].material); + expect(server.getMap('fields').get('title')).toBe('explicit'); + expect(await reopened.persistence.kv.get('full-sync-required:offline:a')).toBeUndefined(); + server.destroy(); +}); From 5be07ea15a6dc537b29c1fe5454c358464763a2c Mon Sep 17 00:00:00 2001 From: OpenAI Codex Date: Sat, 19 Sep 2026 21:54:09 +0200 Subject: [PATCH 14/14] test(client): exercise abrupt repair restart --- packages/replicate/src/test/offline.test.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/replicate/src/test/offline.test.ts b/packages/replicate/src/test/offline.test.ts index b8203ab..ffe73c6 100644 --- a/packages/replicate/src/test/offline.test.ts +++ b/packages/replicate/src/test/offline.test.ts @@ -1608,8 +1608,6 @@ test('repair content sync pairs current full bytes with current material after a ); binding.destroy(); - await rows.disconnect(); - await rows.cleanup(); disposals.pop(); disposals.pop(); db.database.close(); @@ -1637,8 +1635,6 @@ test('restart leaves a repair marker idle until an explicit update sends full st await expect(deletion.isPersisted.promise).rejects.toThrow('server rejected delete'); const marker = await first.persistence.kv.get('full-sync-required:offline:a'); expect(marker).toBeTypeOf('number'); - await initial.rows.disconnect(); - await initial.rows.cleanup(); disposals.pop(); disposals.pop(); first.database.close(); @@ -1647,7 +1643,15 @@ test('restart leaves a repair marker idle until an explicit update sends full st disposals.push(() => reopened.persistence.close!()); const server = new Y.Doc(); Y.applyUpdateV2(server, base); + const recoveryVector = Y.encodeStateVector(server); + server.getMap('fields').set('title', 'recovered'); + const recoveryDiff = Y.encodeStateAsUpdateV2(server, recoveryVector); const accepting = transport(); + accepting.client.query.mockResolvedValue({ + mode: 'recovery', + exists: true, + diff: recoveryDiff.buffer, + }); const accepted: any[] = []; accepting.client.mutation.mockImplementation(async (ref: any, args: any) => { if (getFunctionName(ref) === 'offline:replicate') accepted.push(args); @@ -1656,7 +1660,7 @@ test('restart leaves a repair marker idle until an explicit update sends full st const next = await openProse(reopened.persistence, accepting); await next.rows.connect(); await vi.waitFor(() => expect(accepting.subscriptions.length).toBeGreaterThan(0)); - await new Promise((resolve) => setTimeout(resolve, 50)); + await vi.waitFor(() => expect(next.rows.get('a')?.title).toBe('recovered')); expect(accepted).toHaveLength(0); expect(await reopened.persistence.kv.get('full-sync-required:offline:a')).toBe(marker);

C z5NgTvX4Y)N7EJ%|E7dF}ETL#o7gVfHOmeuvasR_Vxf5yf4kPRfCv?*aYuWgi>0EsLh0wO>&{(fShXAgFrdpB*AaB0aF5PLo;P1==B68QN;9F(q0QPY15VL`-rX4+! z2!Glo-D%SYYJ-D=4GW{a6OMWjBKNh7{z=Dz&slK^=IUZ`z;cu&M8>DdHa5+85_g@n z_+^XW=drK5T8ZnQQ4N9CJ{)sNPv=>h*be8XWZEu{Pm5Wo-l%)9Q(I9O`HAXB#*Pwb zN~h*Paeon-PSLQZnA0>`i-a@>z=Pq%Blo8nvy@@nK5Oep z&AN}BB^jKCJeS!3$MlqiT|9(t(K)raQskmJ^(F<%WiynDE8;PSwPD&6Ltr7>eTk6NtVg>^^A9CAYsQ%V8dmFWr|EN(zks;J}gEQ$J z6?Mq|Z|^@#h2qV+tB589De2P6N7&5`?0no40dCicA>m6wC8R2?eXNl2_fV&25Mk32#FEloYQohCT zoMv^=;?SLUleQQPn_}xygb&wEV`!B82KpMHVE0;H|EDfdpwjUjInsUFWgRkH!MPV` zOv}7uJ}}8*3=^K0?Xt(1vy_LWO(gJuw8RGOAps|u5+m4K;N>QSXB^Z89CvoQK*Lg@ zdkR=v(A}ffmVu4o24<&jT>uLl=6Z$#Qjb_CYJ|G=@UgDEk?kvWPq#VNPt@QOheym# zd}^KdNAeCDT!%He_J1?~>DV?Xaf8z3Iy}(j=JP<8+nfiw+(I6Ro2_E~UZnLquZ?EZvZkNA-1b&oX|KrJWx=jgraIlB}GmWmtGHw zD6osgfhQZT{4mKHem6L^_sv50A$kpDukXw%S||91C(JboV+xIdXJ7>|_&BYfwfvQP zSgizWiq1X2foV!oFqBkoc2MYxQ&eu;Aov}r7Tqd!}PnxfI(tmH$s)`V?q;cK#CtG zdk*c?9*+;AbkQ|yT`U~I_9606`zGyanH`$>7EnDj4#a}ixUBF4FaU9)oQN*3+)r2N z4R8%>rKLhmQO07|QJ7LblK{>X`oFOc+NM-&Z8Vq|PrOyHZ@PD5vTl1uC3yqWK_l`z zX9dH}I+L_oC2!!Dk~i>B@&+CYlm5FEn^=A=!Z^f3d4ti7KQz8Tzm&Xzhmtq&Q1S*I zpTygM$EP@3<)P#aJe0hFhmtq&Q1S*IO5VUj$s2(ArSbRZ*H`eY=GRxpH`A}B8Mz#I zF3Sjs!1K^-{M~wTbc;l>Yz^ajo|uhy^*l8j-&D`#**K!+_fpM0!4InWk<*rR+nWB6 zu)A@}9KqvK%lU-?L*9`XW;B(aftB=v#D$!ot;TfJ(T0;aRN95=-4i3`LG>a2YxNt_cE4w=>u!&t8D1x-Kyq^3XawPAR>gXtSxvp4|tTRuCGi(8+S0{TG ze){7LQ;Ij5ULVZRhBFy9*mQ9Mgfr9lM&{^5zHAzTW-I>KD(uKarLrzRerLv1%wr;Z!c&vAd{@?@L8>kzDN+K{ z{%$khUXFK-jX|mUc8*ddYtc-^QB_4IwyGO(0;B6^8|PI)VStdX7 zgu2_YHyTHVs{$Rd_*$Gga`9;|`nMcMUjdZeYgDmc@RcKmIOoZ{r3V%)o>U3!{&)dS!YynvmtawL6+WIr0fi2t8+55N0$#@Ze;R?lmva z;SWK6^?P@a5qTFCOoD6|o7CHH4xz32@@U#;SUIrKG7W5TKwb3GZ;-4jEezF^$2L0c zEg*Jx!8Q$DQ*7`bTlDb_H?84!y?l`UAA&)supv}OmW;oP&qDbB{ri6u_+1pRX`Tvo z-ZlNMdM&Fr2e2j#4GoV>8*PnEpE1^+IcvSy>u+#O{pk8pxOE&+KfHbz2lR*353V1? z0sVpX1M2$|Ic&fBzV&@rINr|2-pbz0-pF3hev`eHy_&s}y_~(2y_mg_J)iwL8(Wt> zmmO1oHao2TtL&NV>FlX&?8)qj>`A^oo;{X5nyt&m9?2fg9?Blf)@Bc6_h-M%?&H6E zvwO0;v%9i8`S*+Lj%@7q?6&OI?C04Uz}=GlEW0_oCA%rRF}oqVKD#cvmiO0WS7)oU ztFkMzRoTkyr`Z+R<=JJ~PqH8L^+(yI+3nd6vma#N&o0Tnmwh+8I9tL0>fJ@zh5UCx zc7FDq>^%Q?r;nnH`ZGo*kAQnjMlIoE?-c%MQ#A$o9{cX8ZO0+c(=Mo5=S5`q#et zAOHK`|NSff_T_cizw+N+|FY*EU;5|&^-n_SBGCKdlH0Sz|MLs~$p8M2e}I~Q|KIkm#x0#cDkr^bNb2YltjXg_Y}6 zV%`l>J1t()HNX=M1A%BxVd*`HoiHUJ0PQZzx}#`g#jSd_26zsTbl1>= zi?P#B$)p-Nx1>0h#=&a`nsN)+X+{G}*iCJB6qi+-&Qmqn!Wx#c1k>qaB`5u)_Vwi@oA7FQ05~?eSK(_SnqGIogp*2CxRPB8|*$ z06WEc5@hZVRp3~+fhDTO$w7|!7Bxc5^f_+6^=8I0cV%*;*Y`A!0m^)~!#yRe%jU1- z=L$0Qad;sWgh#U&;ACNINM8_^4iCgUd%`UCG0jP zH>LPM#J%E#Od|$)IDwzNE8NaW8H324kr*|hT9I&g^ZH$A*31_v4Hb(eDSA0GPq!nN znOj7AbygssEPV|uMc9-02M+&=1LI)MIA~AWi+?Zgz)VBhFx+MSZDgOBeCPsBM63{M zXecof3TunPsqHb>AULogLN;bZ3qGs;8SJaAd9rv7=gGWBJ8)RbeSh7?2W~#EsbRZq zlA-5l_%Zd8)enjg$#A(WWp4RPow5l5|EJ_!qqx*hylf#7$=6lwd`ui-MNbEB+Rzr? z9=n3l4miq+-8Av+cuz=R^5a#DS3K}ju}@!3k1y%Lkm@Xt2yWYF|2e(Keanh*_6Ef^ zhe}3Zq}ApOxM*nCJG{#j`3P}&>1%AHq;^6l!o*b>Urb3|!p?y^>a?AZ!M_?9KZ;9Y zAQ?4>jDi0x(uh?^Y_lJQIkqOhMP`ER=kYW!*5>cexg$JT16&rqjF!$kk*IO2XUGem z{>jeS!211G0Hc6i41^KD9`J|r6_*KFG_4MozelVw8Gp1>wdP*3KvR_hqs zCuzrHJc?y2A6_C#2L~l1=TN>ue)rinL&&j5uCBx$Cl+f9(xt%_+M}3ylBk{{%hn+` zai+3yM}{i}jj^MZv}tH(TiU1x5-d*)-Du9t5qBTNK^nIy1WOBWl6#8C7l8COS;Q<71lz1vu!5Nl*eRm6N}RG?uSr9Xm!5shr9 zaqW-cr;jNS7llneZ&0O(L4p`gYjP4|er)kOUg&_JF2K#!k?}S^j7-8$oQ4fCpSFa} z7!w~4rvmxNz@=*;h$$NePr!9tfxgJbFdXi~;JLVL7(5AASyuFhMVn(s#8{`iR?uFf zY4p)8SY%+O60jvsFpk@Ci8mBkp`d^J<{}}~u}M6Q9oDZ(WQGD`Rq?D)$9R=P`&IFj zON^gY@uW*fdzC{`?o~p%%Yl3?=y6t%E8rX4|@jAZ#rw-`d2|s)sn!cpq4P5;A6hC3S)!S)i7(Bn<^> z?HdOooA;rP*8YJO_S&9)@Kb0`*z4#kS95<6O ze>m?}TA4;G-FIlEo=@264$THR)YC>jSoD;IDaARfqjTbGgci=+J#Aq=sC;j{ATFBJ zd+Y4{)b$S7km@1&9C@dr&zmM}meFU40R%eIEs0J$@o2X8Dexi1?-oQz!$$H1E;+{f zThwaGXR>xcOt~)Wt|vugqTX2#_ow8IU+cE8d1g~0^}#pOI_ojkGMrA6r&FNlsj2ek zR;OW^pHMu|hh-v$WxmcGFe6dlB&f2dH9i3~Ylf8Y zYteN&_=I&(o@!4FV4dgr49=4(kfYDgR#RC4Ws_V*Z!~@)0&kyq)$D8paprQ2G}wIN zhQ?xsfLZ!?v@?K|wi||T5AA`Fo{P<2x{apHhWxdH>Rr6$07^p*0p_hXFe$LDa}Dbd zR28p~EE8T?1Fz(32EuoA*we(DC~7|=6>>ou;QejUfv&8kIw`|&xkG{}HH(9%?*d_^&vvFabWf<>&A6=Hd!v-}5`!y8DC_mtAZrGyYi2F5QN5E@k=Tp2*q zd!Y)RP9fQ7N2w-<66rqtqV>dD7C&0E7?LL*lWJ}yn)yWAl$XMd+FbIQt+%5YWWquu zxQPadaTDEdRleH#WQt+T_LMlSzT+dc_Fuvao2CBkS12H+#HGyux3=F3>sPVD5?3Cc!h@3~1}k3U)YWO~U<+;%g7mDS29f^cD%}eH`gv zGHo{M91Q3%8Mt6Af^04x@-7(AFtw!IX-w4i$MXM_AnuFIi^V|bHe0V32pNdVR>e5l zmF=>fJSpFkR_ByejR`R+tqN};sdb#q6U01vHQsspJY2;lez>zj7z0kDTdT~-gt;Z_Ci3z7* zD)B<4#I}GE9QeT2^!W}NdjS)HZQOvNt=3xVRuegEUxLq4Ryj`4%{(E)(e(BW1Mu6z zM9o*Ts{T()(qW#jU?4@Oia~S^jZ)1a1cgX6w`I~HthqXI+1a{}ruMc>?Y+{ky9GU$lyool1N`i71KcSAr$lvzF;cviF!pS9FZ2Wa ztEqsK;*a#n)6CKqVB4~Z$VA69hBX{_&q()tzb2mf{hFwdC(_ng6VVG#U-#>NO*~yT zfp~T$wu`w;>N+$Yx8umJ)L$vl9!eJ%6Q30@V@1^3h8vzrx#wh^b5ZLV=n@LzTn&X(jAZjF|k&whG`5k-$^k3_M(G%c3+mE_W^umiNn{wot zkuAaS40*pY7*tx^K`Z^?7Amrq zhxs=3teGjx8V0lWL0XtS&)PFR4t{4JP*M45fHr6D)LS^z_)AsU~c- zR9qTy9>JU0ImmTj$*8vIOY1GbI1xQRTl=}8+_SSiT5v7tW4GaOuk}EQExgGx5ko9y zt;n;;v4(t=43_#XdxK|Nd!&SGdowc<-!By(lDs$RO#+Q=Bj}N`nt^y4qYozz08qz` zS+Iy_1k>8b6~8*ai&EZ2&j>~dq!T4p^_GBWW_pcAJ*k&k{htiNm1XHltC6=WTD__) zrB-bqY|@MVi`BW6@`_qbchmiDET`(bgr2SP$UY;1oYl~7HP_{E&}{!VnR8Vvq=D!2 z8p>0!--a2=R+sGumSewU_+f-zLslg6qIb^@70J6EPGd86Uw9~30xvWEtJpOT{UI-Q zZ*ZZ_DBKTOawJwqb?Yz2j>0L?j$b^+|Ok7A<+bDj6ccurj?7L7ylf;?NlUdD%1}0~2?5XAl4=j2dJrG}= zD{|uhvCjH3Sd8Q~Wh>xe*$PG*JFrn^GqHM7^K&Ds&k=4o@fLcY)Dh8^(qRd)VmhhZXLpEdw{|1q* zA&cBnDrZO2T!xNwI0%e)e!5_yGE3)XwJkhHLA!jOINT1lI=6=~y%hg$hntF&>`&7R0QlmNN72aq;yme*MN z4yzIEg$rjOJSv=_z zMr%7h*L6~c27hR2avnWQx4CV`aiXUgx7N94ZJKdocgLKOwx)&6vXIugqp7ty@eLLZrgWdBZU_QO+Z1k?8@ zhn_QNF0{9m^^u-xm2+4nNW%f4ef@{^=r?C|RyrKfQ$Qg7mvl=<{_&dNQbXU7GSKX3kBpysEsNQIoo`$Z- zDzq^RfOb+kIgiXjz5FZ*gQ71zB-QnlLfX{UOJ(6n$A`*ZE>a4qoRo#9dP_k2X@(RY z%XC(ksjt(MC3Ll($cvRC!b*q`Tb@WelwW%}MrEzdPxk_aD?J^M_6&6`oskNtM6Af9 zqYhmDurHmz>V*V)2x{|RF!o?3i&Z$j;S{V)L^DiMoMck7lkCWllSo*kqY$XgyPW)+ z=gHzCN!pIS$e8-U}r$pB?-OS48cjlOrS|qwjjm(InJd`e)LAt0J?xZj5 zOpnMVlUW)vd5)S{iYKNx;&M5NEH%A~F-j*9AEl3Vro*)8?P^Aj+UkesgeE?nz$hCk z6NWUih0xXO6h2;bk?$Yq)<4>VjFjTe2G#R=&w?{c-f|+0@@EVdnQ$sQNLuzoqa?90 z5;g4f5ZOAe+$@G#L)1VGQ}Wm8JE>_y$M7AGPI|R6`tD!4*z-pkYQ>LA}gciqf=_-sDe!+M+ z_q0E=5TzpMm@-F2-k;KBp#I@lGP+ocv(;v7#7iQG&HY}2caTGT>UQ1u7MGC|7dopi zbXK>FLVFWd-a4cJb%R`nE+leiP^P>*E1H4^o>gd8{$P!qoE!ujA4GPc#QV}2JMuKC z9NCM@3R&fOhh~x2gTAjPK;{4#DTpdMK_Vs%dorR~M9Z-{v#sICO2qnM`keFrEO!-5 zfkF9YNp3x;dT#k6rI(e45l=NVE8h&@$j^Sbjt4uRB98G4xn(x>woImg zK2MYr<69@UrzDzdYWi=S&JPrl*^>^@WYgPll#)M@5|TBjrhOHM z#NC+)B!cV7H?A1UBKy(Ch#To(TCyVj(f!3PGASIOgQpg*8vvI;++%Y3NXEIyl61u* z%rchLNRTvz5TG^O2SAZK>3#OG=yiLTnPgH1OHylg8q9F4*-YUYxu$lR zJCN5#A@6!y*2b}j;SMVSQA#6}=jo!;R!M*M0gvoVkY;B7W%RfZ%B`>>D0Lcz6Zu~B6* ztxBgcZGmKJYsjLbu%wE^`3ZTIFfgzxH_wt;C=T{B&ib+0z$UUsvwPR*FN8zP_;I9E zC0QTz#JauAe=pS&C18SQK2gyli&Rp#o{1JK73zRWUl|UlX*r~JU_Oo!#OJ`uXOV*M zkuSIB`$Iv7N)ri3e9zR>$hT+26rOf4KV)h}dg$qz8u=rjip!@G zn+)%N6TG-BC6lW7+_Z*!Dw)W|%Nw zd!DJ8K(-BFB$`T)t(1t8oRleL%Yg~P!lGmL+VtsA&gF~M+w(fjgnOIqr)5Y!%113N zuQ6(NtFKUDZQHR{#9dna%Obo+KiFm7aDIYJ^ca!Y|wn%2~$ znM(wL{m%+LWpnoDIsQCDPg+{eGha>%#*B!YBCpd+=etQbQaY6_%*@Y3A(dXF@vm+e zV3KfvJkeV^)>}GKEfMCoXsO89bRy#4jL(s+Njw2u9MPoJPk~Q&mO9W0J?ZWnT7!81 zs-FCQQBS%@5@LiDd>Gw}+)w$-S9_z8`zbX#>0qPWL1-`OlGT$#3BzW(FA}+-fWah- z!LpoB^1#2CrjkF2Uz$0sWd5|@D3~qsKZ!*owIl136Q2QEUaCbSxvcGWK(gE+s+=KK z)xp1&s?6j>2POMkUi6oVV*u&-kY<{W{_Wn+W4|bcHeyp}tL7}6mfuKy#2VIUKRHAy zq_iyEmtc?G5n{>n6k!DfUkaY#1@HBOxBs?QB2AIC^288#+EXj{c;(xol}I#Xtx)hR zFL<{XytQbhsyY>khc+VHg*KYth>UuCs7O0>m)HM!Q6C~Ow?z&?N=Mjw5%R9cO*ALJ zWryIRngt=l{p`t>zvRg2-;wNZV4A2EEHp{hgwT5 zTSaSJ7aE(kLNX;>nQySZNf(^Gt5!N0t3LWKSOs{~mbZGwLc67DYHa$C<1ghfcl0k);N8Co#o z%-}9>!mM>Ot-(rqXHz`Q!y*~dweT)8?2|x`R7khJBXsF$c~ekts`LRr6!R!Z9T8K< z)x5;)(IroyG_vDXc4`y(lYVZ^jcMRHO)?2yy_d>>cw!~Itnj(HxTJx|nv^H_a7@9J z2ql*vyrHf*rfzz&CGLVUn2$=MiiAtOoivY~`7ut|ndED8W6?+HhCXMR7xFvsiIqBt zcVzC<+uJR&8nNujIjq&bR(_F@*JzD(S&5Vw&x$JKF8sVAB>Bb#?xRqVv%= z^>TI1q?l+>x&Wrr9Ut>CKCK~Cpq$+B7d2@&i+2^*y~wo0E}zz>likpW6DgN&G2&nv z<_PZ{$RjCX_9^pMBw3Kpdvre&wQZz4^#aUleu_??A5JgTklc17^-nZZ zaLJe$!Ya38bXG=-O`HT*dTUU`2X9q;t~1G2P5JEkd;H||%HHpq@M& zUVn92-yH-BIf-*P`MQP)5^zj0lcE}LXBhXQ^S{+uPe1LE8p5A zl3{=;M~p9TD>xD(e71BLxw5@7c(xgUyxBnc-@i`5X9vbH27Kr!NgTMHE+XW}%RpiFE_S zTB$mkNq}#L~%N*2$JkaO@ZLBs%u1dQ$8Sdv2di5c*Nu>}7fal#6qu+>!NJ zEWcE5MX+vbyV{}r$Pc`e%E#*Uw9V^l2b9k4#6ihUA0^Mc#Iarb8fh3e^rHeq*8&;a z%p&2EQ|`u|I&-8g&XF26-gA^VXG?h|X(%VNU!+^g*M7)E#!U|I8t1-{7(h^r`N^jO zv)W6|pcN9VNX&F;0(Wyia4@LnWtxSh*9>uynkg}-5lHGxGW5^U6bnA{EKMxqqA%QL zCag%;lh=F2TQ@6~fVr=#@lPCo;X69b0oy^LLiJ?gOH1U3L z$;q^nWP8u-rNf?qX^13Ql?+Tl_H?Y1IZ{}e2MQzR-n=nbjKgf*&#{Y~e7 zca;3x8RY%};+F2T#+sU<`NdpIT73sh$@Ft5k#s0WFk)yJH7JpHh)w}TMcu*~c52TX zG;7ECw%dxFL5aH!L0ZL!N(|1%oMlhKm<_zQ>bZPoq3g;aJ@WYU&W`DlWq1SFBuH`* zVJIz6WJANly^4SJ#1Dyyx-GK#ZC4wi){O0Hq<&E2bNu=;TH_?;9y%Lh?TgsRn4(|m zik=Q=mZ@;s2SrApM3urs&P89{d$*Q2LQtB7S8<*6Z9{R96S2PnbV>UIO=f8o_%1(L z*0$phEtWF%NHB8HH$D9oBkgH_M6I3k$oI1<2|%WtXYHAVn8u(M`FhIlo=k@<=-Mnq zGM)0fC%mDfsFRWD#y>NREK{%c$rd!6dxjd^C)z)&^D7CKE5Xaz&X+^>I)LF2dkcie zf^ATNP|o38;2bY0|A6iPv;EgF0mBgsBUMYAt}TGTpWQ@@@W}ND((B zS)Na>B6M0y`8-WGx}eJ$s=FT zRW|htmqU1#nzOkBo)oyXNkLMrzo*t(AN;oTNV<=-cnY+Z)wPjQk3gDivM;#Js4?FB6kxDXf9a}nf)bbQQL54?uTP?WR ziRVdsqOC{Yxt0P0&|k4qsHUE!MxN-R{9`?pW9D%LG>Qt2r;|^`nb<{P=j0G3_FxXQ z#<_-3@PQ|=iLN~EaFGKn0VM%&)3#6$$kIwUGKmSz8xwq%rfGc(8m2H|>q`am!Ym^r zI_+zqJSR4_y&8A?iHE1yJuQj9s)-i)=BabmNBmtaHS`HbE#$DRPL&%H2y8lAO~_|6 zpQYSd(EKFCpLqw6-IHS=*7sPLo^-`O|K=T-BT*rq^v2+9kuv#sfYei7(2n|_@c`(O{r*@;h@i{Sj7`;owt^sbfYkm@BF&5D*X?d{yG)Z zTEg1d-mj7Wx-1u?V2r4dP&QPZyPLdrow@+^eBe3*#qn}k^`3W7X#z~;$`>3<5(2zX zY1O$JdupK|Xt}}kz=Jr+iV>lMU2f26xa_2Y@WW!t4l5ONXj?PK8v5|ri{1=qvBvwh}3{!;Jvu^)xTE2CX`7|>%eeK|p3!=m*NbJf+2{AGvpQ|J0iOE`X8 zQcepUgBqjpN*_3{IGigS&JRmC?}*QM#6=T(Puxx@KE3FjU0d94qe*Bs7e4(IzN zoT`P!%YWtZC+}gtJ>&-CU zj7+haVr1;NfbE8)Jo`$5v=`sV5wPFU@evGG-QWc8YEQk*`+;& z3zjh1=?lUBfiRcJw2JLtR&lDUkJjJRQFuaFD@MTW5Lml0B1Ur9S|RiS0rbS{eFZvT z3RvrUknOR5g~o8R`sL-~PIYS^Nb&ONJ((y~-n-t}Wzl$K4YNK<$bdWR2+rj(-m zp`rYse#J|R*}J1(`5VjiS}NUI97 z92T^o2}z06%wgWl5BfE;qS6d=tlhe(@&aCHwl1u^(BY9V;W$r{ROavK;^Ac%8&LEH ztVYdKU@vwCZW=s0SE+m3!tsDmp`rSwIn@nlGkRrZMJn)rgQ$({li*Ko|Q zwO2RtBg&?nY_0`=6vg5KySn%yE(h}XW0`ntF(2e%f!u!Y)SjUx_vGdE3PA4a6 zIMPuCA7il6DkDv+XyB;S00Y}TP2d&JQ)Ic=$YKOU#^FRJa(|~6RAQvwVLmz#7AO4! z0FQQnEBcM_c_qM5G2-yH2g_pu%Vxsz7zcV$50>t2keJ-3$gzPBV`KOn`&+8E&aL1R zh=`+lZ$ch78Rl^g^TOYW&heA05@g)y-LGovoC-Ryb!pEC#y-Kp<>dI4tdOt72@dfB zLnaKSgu%s*hEEI4S*4_E1}i7sBQZv2zLvPTUB&f_qDz&_sJfmSDLj6;NF2eNoI=|D1QduR& z&MYUVMOW()zTb$(P536s^bH5_9cw-0=V@h0WLWvH{T)r)(|YOz?QJGhH5PhLWr8PE z`v1+qU*r0~Q2xyd{spZkPl4ru%^wtex4Z|1kQ`}FI;p-DO=&Vhs&AE5ik8ehKw5)5 zDXWs|+tFm&uZh*aUDgj-h_FgcwxD|fbTay<2donP(;e1%zirIJ>~+SZj+{|eF4`AyPU_J6#&!xmYn;rx$}S%rKmTc)c(iX`{k>4!zY==J0ue zakG8BnmW&$3TB8si+l*Fp+4}R1f5xm{4YA=jJ75B4sZ>_jAn9K-d|SOeO*F)f5$tC z+3?f(cf3uey<>I0W0j*7G<}HAFH2R4AWWh&7euuWnkKJ_azX!EcD7O;wL7WI+F@5G z4z}=kup1OD{!WVnxG-Hf`sfx8**t`j=R^SkN8T?-%z z6Ve|x#)S3}Aw=$-*%o#tU71sfLMQxQF*fBg!)+%x(AJvoc?WxyFYHblF0|NDvZ7*> z9mOVV9(#*eA`WCXZHY0{*s}K|!i;a}R@mP8wwi9eQ#9L+)7eY(ZbfCAcS(%h!K4ugOILTWPS}vmBBjO&m_roN)fZ#m>=KC>bt@i2l{QDJXpa_HhAc!#1KBvjA zw5Y4K)P)|-`e78N!{X*2_7+c>X+fw5gG+lbxYVnlwy6dAA9MI5fggJltZVL$>?oMc z+oCjs_vLH@MmxJiTXl3}mzQjS{4^2Cc4X;Cc-JS36j42SBf;b>wP? z`|X}d<*RJZ+`6Vjs-FL0`|M_ZO<7m{A3LSg@;vBnKP;{dEVe9=xYhxE>vtk?T@{HB z2#M>;x`xEbB@znp{0^kJK9H!8;(CX){C8q;Llp}n#SLX$!{Ve83(dcGz~aWhq9nzQ z4(OY|6N#IuNEj(@D(e~&C-x$d*8em)ZjP4!uwdz%z4mF=a)?T2T0jXT(pwWe1d8&I z6ioZG5}#n&pE<~H^aFW91tj@TnRHrll(_P3V$w@zveh6NhJ?E$fDCd%g!z3-Y7hM& z39wtdu~V(F*tXhkDUQ3>1d6I8v%{Lcb&PAH&d(>;`T3+eEUjS$KpY9PTPsyU=-oQ0 zRw5?zTOCD0O^KcboZB1@D{4^mHV2a^T68iQWPF4y_UG{|DbkX4Ad%v@w~nt6oInx3 zh2WA)>XlBkoZ7c1TncL6?ueZ7&eXo6LI$Ju9h2%9<0@cN>J_>lWP4wl)G~( z$&vS+1xih^;B4}7OiX+QFDf=@tz#<{%Jnz#6?C-> zJq2m+icZ4~@TC-|yByh*`c0f;O5m}8L>n<$cUM5Rf38LMZijecKZr+{5c9BviKjK| zLMOQ=Kq3)rH1BbUCpZT{3eC^T3Vd&j!o{Uo;ohEFy;7#rK)%?Nm~BT(^4dGvR3k1T zH}hpnC+d6PYMKAX&q_HT9QSa*q-r4lu){s(ohkW9S2=G*`3bdcti}vyOSMU3LJWno#*KQQ6Xu%V_Vg-?t)J;eu0ZDhup<~KUr$g zoHA}#Y|o!;MeDNZ5M{NNe;A`p{p(zIuJeby>{zh2`WpApI91FRgC*{qe9e|XpA~TY zE|i$I1zDd)y9;)#eWuggQ--2bfq#DYJ)H%A(QWDi%wT81*{c-O;eE9Cu`%%MSkn^1 zkC0i=cf*fl$m=mK5Z^P@_0-^UuXB`3gp>5P(v9}rLy4#}^X5O%D?%g4kCuO&2vv@e z=(@J>xKUyLvcX#1o&NFeEZ~ox-x)c7$LxTw(uMi~t_77JjG%=P}CdRsG_N?3K8ttx|((ZuFfz467d$lyJV<^*7oht}WIy#LAP~~-$7rhfeY$Vz9qBnX-PooZc{{plUzv&nv`NuaV1bCuCotJ_- zL~BZbUvj_)8{pWW2+r&!4&^HVdDUz%abWX$389%t@p=!0P}tsxaz=_|3wooc zWRSx9uwS(gp6>0lG=5hF{Wk+>f&QBga#;`h&S(1;AjKWpR^_I#Bwv$#_^K(;tEImc zO-NW=B`55+yom$)H8D|X;vIB^w;iG>nFjG~hq%8%?A@cZ_71t%59hC!9}!vY*4K*P zOyolEnrNhWwDjOC_UF3hikHm3Zmj>0inKLlveey@KBt{|)gx)21diQ?_!OV>TKg(p z72U@H@6)dv{}Gs(kwrRdC3L~Q6^QBBCPCcSAx`vz_`jz>EVbaI;)A%zAdjxDm2~bY;TzOqq8+YSLO~Z~<&kAP&Wv7KK_U5E zB@~uA3SaMo!dC(X!PW|enYTL1`zM%qGi#LhcSv7LCo*65LAIr>-THC~E0Jo_p00Nn zaX`eC#x%YT-a{;eV$V{-tQ4 zz*+rIyPkry%N$ffwSAXV@MR9@-}{jDUkXwP*rWyYpae|Im>pUi!ERenO7_4TO*15yVn$j!i=3zxujnddZ7h~lvjTq?dkT_<* z;S~t&RRj6qUjJW%OeXGnd{2%js^m-Ox9=RvkC<8~$@AXK_GmWNv~3ck!sqpm)4QG{ zXol`c2QQ(Pgb@Eb(T3UW;JsX%%a@;M>DV<1_n1?>fo@xxO&-Ct?fC)CtF$wLJ z1H4VlnW#SYzhcy?a^={lX>#RQud!D-PCE85_K>=6M^68%V81G$<9Yxc=YamD1Z1Hi zB-mR2Q~*HM*$kh&(>^|c$*uwa9Pi-vEWoAdY)6s7bSFe5P3WHvL2@vEOBKL2n?or)NJ1| z)cU)!osf;iK=(9tsuPh3lf>hx-q!#4z1#YH*;Z0G3%dT-@{8!WqpbOD-4OmS<%d)y z>ArmV+v1C)PP_HF;&-kbqqb?a70LUogMq&(%jh6MWh}R;kh1X}{co{!PCjm#61nLNQbHO|K0u{Z;}c z#<3t8-|7p-`t*y(-2R1o`A ziJ0FLs~~npiI^m+A$EpC{Hs30@E84dSZ7v%1liAYAfK)F&UbNtUSi}N3t~a4vr1rS zUGEqzcNxyEpa^E82?cZwrif(X zpE--AGam|T6+WkeUi9@G2lVM`UkmhTPv}i`xkFU7i(UA+fgT>~3B7YGo$k>ze0%-L zf{IC)e8PX%b>i;I8tg4slBUk(^cO-SJ%+K!*8Ch=ykZAMpU|!cUBHZ_4TUsut1))e zQJEpzm$UnjAy}%4ZisPF8+0!RJzh8gA<}szkq}t^uT;d&^Pc@>m0q^`X+?z>a6SWG zaoqVG2d7D$v@v!Urj324A0!B_;R||nMofSiSZgF~JLd;j!%+%VfIZ*Aeo6>hapMZJ zrRox_dG}fGScw&GiK77Uux#(dUrYer zU)wUDSXtW>!#!@4+t;=vn#`8GYwlsqrBaQ22Xt^QD)P`e*QE`>rJW=d1myL%8+%Y4 z9&YGobI$}zW#)B8#VIW_enZ{fD>WICOL-3v;D!;;J(t_cb~BwBy; zE-nF2LhoX4;?Me`rv=z?`)&!MA(i>NMMcAHw*ohoexU>|lPPA_*`AU5UI6uddr7wM zIrvZZ8L8dMk#c24Yw1T#GDu7L7}v@81$Qz*K%`Jf<%#>zYGsV;rrK%JBAPEBXzf~l zhHcxeUCQ4{w=EQ^o$U*wc8Pa_fS;yMNL{|f(cis7R-1)s4mP<^tG}%E!enj+^B&{# zC)pdW!DJbO@cn3Nd#1`W+7o`i+E5hxK@`JWs)bA#{a{K#W_LLvvHSdCjEL3(?dpHn zuO2g1Vs57(PLKL>X#!CU&7t;X(yuS8cA-bkNygXTUz?e~fv~nXO51bU`%g+j8Q1Sv{$^@4TY350G~gY| z-w7ka3~gywS&XAtf+QO47&OA_=+u?h7T$#X4vzZeL9AB$c9|+Jcf@zC(jM|CBLoEL z2ykzX3Es{t6s;=)9KPrRcSV&BF_Z?b-bi+xPD9cHeu3u5Ek;b?(Gil|!yaz$LqtTh z7R%v?h-Su^Y9&`6PD1ORk3JBq@*~gKh|4Q1apP3d+ORS}aZw`vfv($^RyyciDicg2jnb9B{crdu(ltQS0oFC{y+|x< zU0(!%bU%UKr2eTdriAIjlLoND>S!t2MY;FeDo4m7xvVO>#+9NN3Kh4F~ID zM$%xET~m4zj~UWjI?`PD!L5QX>Ijyp-;o;tH{A6TU2GvqxX^^A=eBZ?9AfMGR#f22 zeCO=d3D>b4g_32hX$fCeSNk0Nh_}RiSZ|sXB!#BbQz0uQaTJO&C(^B~gw}p{1Q&x8 z%2K_W$Al1i)Z_RZt|dE-u=Al$_dg~X7_W9JQmENJL5s-MRkTc{fl+2Cy5)-lQXn^{ zw~9VrUYKgC_em31q$Ny(l8#L)Wm^|4+8$#;lSVz1Ja8UkGAl3vk;l-r?XHjdfiFkz z)gVUvngZAMtt20JJa;uSUEvH5kWQhAT^lu+Phz~HHx}71fnJzZt%(< zNnQJ6pN=8%waQd%DmO-51VHg`q8ZZQMhEsMz0$yt`Qri^&T^A|rQ(iPoV2(rSlX4T z%L)sSWWA1~{QQdG0P2zg18~MyrOZu%p)15GGC*fmn)^37f;$SqU^o*=%t#3-0Ghc| zX2e}vf1ES{!Jo8qxH$%((Y|9azqtS_@{Mg@5Yc-mDwfB5>6l7NYFb~*Mtb||J*)J! zdLH<*=%}q4={Qa?DpN;)<{0IDMq>MNB+M9kpjkt=E8bS39RE@AQVNl6P{9_`cm1%U zI<-(Dlx4W*gaVpcw3cTETs++pXg77q>y`pd9b(&gM8#gV#>*y7lh}aKY(KT8s2AhN zoc(!GJk7vh&_t1+SF3~wGzF-bVq!FpJAh0h4E!PPUTfV*sXAE>KJ7B&}_W5fIhcO*h82aZ=tE zq^ygSw>hXkP7`_S;6cq3@n4!lzG;i?Z#sWvOQs0P z-Fp!)JwVHSd+gcn39Ql7&=_a}&b(QJEHgK>FS4~-VBNGdO4ycBJ6Y`8%ne2B)VePvh-jVs`F|nI zwg>3M>DA+Q<`=)ajIe#*KqXjbkn6tGC+%((e)GP5-LcE=u1Zf#WV#CLQ5dt`ZTNJ2 zNh~Po^>w>^T*tteM)H>lzLW@0SMkeYETPy)%oen}GN;u2QAv59EKS1w{qP#i5oYg2 zkg>S66<B_Yc*FDSUxEEfO7{7XWB&jM*R5;w5^|T_S)!Lo%y)d zKW`iQlpCBCC%9+Xq2hxMo;Xmq4Dl-+88Z`|&<_RRF;u9BdH|38K`~L2)SNWY9}dtc zdTF9R?De-v6Md_qJ}lI1Z54yYj$OasU;eHbiKMZ;ul&OD({629{zeOv7%vZZ6KWD1 zu4RPud!#^5gM{P7&xZ0x9KjD1l(X4fPm6h@ee+O@Y}2qHEE#%ce}ZLM%O%ewUq98_yzI7VL%giDHkaH2oege_JJOZ;+1BeZ~Xu!+QDd^5q=8oOp{_9jB!E@Ltkjo2_?ED)lx! zi9)HwCS?iXu1#RAHLrZB7SqeQ#Y?s?`QHD6S>7}zE!w(qq~)}@Y*cF%yAk)^+Nh|W zGGEOpeA)L!x#xCf=8p;lSMT~pK4EfwRx%9`cBHUnps{S zVpLm*+-!HWHw#!T|9`W#H##lSs~6n$RDz8ZOb4V-IqbR8Dk943m~=F21}XG(U^CXf zvcY=sbhU<=LmE@FDq!99(>a*hGM|n%&{l1&w6MY! zlHq+BqDqk|v}rY{waSntZ2UZ#TC96_~eqsc2C%zqV4DR=I#3baMOG0U2xDKtfh zq{LEuieYilDSB2^#Alr>$WJsabWcRov);x=X`p5mJf9>-1yB-7G2qVyi4!D5(Q^)I zPJ%QuAXQbwbp-|?f?~VC5{dv?=P))*FxpiZC9kSmz1aM^fa^U&0R7rwZIEEa9hO8r z>_+u5?i|2pafUF%rV`1mnPDh8>_NEhi`BIC#l?0BUWV&+*&chsrR<5et4VXC99md= zPZ?$A$=Wnc$88C;tRn?au!U%jwXHp|83%{70C$Kt%tX6QK8zV^8y3`Fp5S}wP`xXQ z`E?ba=I5i^1P^i__vgLWvy;jVjwuMKUYiNqR~wp72PI$`y1@$p&iJGKc0GT=p{<{2 z7-2RQd^%aLYE0L%auQq{_f!Ugv z%C)Zsur!B2@l^*lGXa}c<$u+uyJAg7jz?wWUJFR#&4xPrnnP+QNO810R9p}KWUJ6> z2RiL7>T{HIpxqiSI?y2}&m7qU+pVGEC9T?+FHXpa_T2t}5olIEM1z%*AS@&)`JpsQ zJtc{{Ub13QQqD<}VHU>T0j-E_%L0MoQZ+d?E|506OSgW(SGfp=CG(Mi?#KmS-7))W zaS!S@i9`w(eyOaWzi|Q$RrjVgP0`IGcze}EiBe~(wA%FuBCiXkJUztb7PazqhdK<@ z9#;x>mdYN4Ubtg-rYyH+m!8@FZk_8cdj0(I1$jCP zsqfH`$Uwu~1x&iS4p5obGH4*Mx`?8o&e$&FvkEipEcP5TC3b4{XwtL5)@lU_8+~0@)zvb`udKolG<+uwF%pvuCu-AkVZsru_K!? zMY)eH*jrI!CM(}t1sSc`*h#OaEe$;nTB)bzX@K2Gy6yS`WoL>+YZ%GazeO0*cX<%5go^C?A8mldxC~Bu3hA$~5)155=IyEzD#BNfa(Ws>2V(R!HD$ zxL5%uns$q1r2WQ_oqg#J$zWn3lh3y5ZMKaT+0I7WXRLs9`P2sVVa*uLuW9by9hoc2 z*GhZdX#V(!mdof6l7a?xnX}#5Y@5c!wDepyt+UzL?2AQZLdLTmh#Pum2_W)i)1ZHc zKRV?CxKBd6p6kA!QX}o7OPwX|!K?d5x$kvZsPcSYFE&tU-;jhD^+2DPrV#KOnJQ5% zwEKB|I@@fo8OZnZ`pu$#)*;zS)*(|sN`hIWs4&WxkmDRw$0gR0bJ@b~xLwf}@a6aDIR zOy{R|9FC9I##lkL=~e$UD{DFXvQ|Dc%Bb;9CRa&_Qm`Qp8#}=xkCFjvtiCZr-Dv+% zYZD|U`$sJL2c)Jq&L6mq$ze$m4saA2A?NJ?w!>$M5+OjNVq0S^em}!ztw{rXj~uoK zCa{hCSn^%8+ec;jfn~>FeuA#g#V0KRsdWJGjE&v0`gpL+vIHW7D9gNVaY>U#vGI{T zs7UYJk%frU^V>7oihNQXh3)pF*j}4-!Pv2&{k=% zqm6%OP$X;efab$IP$gPCP^#NJu;$F>0f)@t!3r>s2mAI859~GbdElP5IS(>=EabuF zYAYVxRbRvdN4afzpxu0k2dl(Kc+BFUiN|_d*FVOCtn;7bu|Adw9vf_3|16IUx2}JV z$DFO}pXagB*7d*VvGLaRFYq98-xqnjXPf$$c#xauD?E^AU*$o@qNN#6G8l2$b+ChN z^H4oIm{9c`$JVK57dxk(P>p-{gPr-hfE+YBBNLJG+UT?Otii;|bwfTrwsDt%nj)aq z^Kp1tYJ&Mp;IE=z$`GRo*Hf=q)KjgHc_wvO$`OMr$TUW0eu3 zA?RSVf~unU=wb8fv-ZxuK8bQ`YX#}LgNfukI8E;GkV%{e9=3YS9v{$S&Nz&$bLSyF zI^)yyn9sQ?kIm8Ocq~NeAY9r@8LnI6pzzp^nZSSTmRh6c!nep}iKjz*A-ma>; z_g|0wI%l7gtP>7+AW_%erZv$7QX2^Zm9x^kcqnL9s{Q* zuDUH(P$*<49SY_gVi)XIP^N7V|K!);BWcx+0A~gj^xvHPbZvt zL`PFLoSGWCAjcF%Kc;rVEqdsCD|j>U`JEi;SnzwXQ%YZ#?4`c?_z)I%{lu`l`T9F< z{Qs``%-_EA+sUTzt_gb=N>%f|>iU0v#n(CvCqQeWF?ki=T%fmW@`@4Ai?yS(q&Wc7 zWHBIs=YTm=M&sg(PIAXigYY7=VVh6W>g9rxx?l55Z&~%wgI7Z-Q~a)S2`dE0IXFDm zaWq7lpR}cfT`~m@tS$R9UD3{@k5ldfUv*<60x;QV7eK__i>h>w&LS?#F4be8>OJ1~ z{1ER-!b7DHW27m|J-h+!jgf;8eS2-YOlDHOPG|#Ij8vuIp?I?wV2^Q3FC1IJ0^-Rx z6V;SG-Yb59>nT2}o&`%QywkR25U@>15B7_n`Ok2XpDLA8h6`HJ8Fcrg&GM1yF->!6k91a6Krlh* z^aq0PboK3Ir$`Yx7YL?(4h(O9akZiW(>@b3Xd}PU_?7=Bd{vbo+|s8MTZX(#x+L7B znk$b%>s!ZX!ntdC59dx^wDr_vP1)XjsdnV`H{~Ut@8M&yDW9t{hU_C)78apfe5S|y zRg&6pv#i&=>TxucAK@!MA z6%wY(WA=)t(f2YOGPD&6`km^nQ`r)(W3ld%lS^ScZp+r@8#d)AuZYC#7>_ho6?Bz)#BVoT-Wn)fR*_twQH&w4~KL z2R#;nS??;dJzM#3>4Da+>Y>Z_ovWCKR2o!ZH>q1!^z>FVy7uj#aE}!Qv+PfDQFNc-s8OTG=z`o)$TI-Y_ z;xkwn@tGmGxx!Y1#XL4FCRpk0;Mj;}&2`kc1-sRyjHWd>YRtXJ>8>pi=Eki{P$s|g zznRXC%g5QPlIoo=Ev{@;$HnytcmcG!wmdc)VMU6A6>#C0Ve(q-NED9?9X&x%@zs7@ zW7Nj%!8aolN3bM1Rwt^t@NiOmtyj(YW7tpuk&d^klhFC`ehF8NkNyO^GQ*Ve1CpPx({=yB>1vAK@@Q~Mw#9?Y}-a`*!=?!C6_fmKL;tGLc#pky=-&x zT=xD{U%f?{J(w*h?sQe)yaZ%8yUuG}vN>T-XqlAB<}+S3Y`>yxzl^StWWRRJuvPuU z&f>3Aaj#x@!_CPnst+Ha^60MXH*a|5KAw{BvH$j8b~${4dlO_49Ef4m3 z@i`3NwRth*+uD2%=|&?b3{7v?Exw))vI+?cPXX@5y{z+DJf7^JZn@|;-ICaUcYpL3 znbLk?Y5e7P0uS>qJr^m~#p#T$ zr5_IdXSx$Q!qFhFIu7nx~!01`bksnhySFPD4<&gE>S_V8Q z5G=m@@>4q(&CA|t^xiSzk$(x-9P6ZIUJ4CTM+019LIVW4{7ZQCoriqRC@+%x}F6`AsD{ttaO?Jfqoe8UUX>-^xENbilf$!ph4tD0j*;90@M#q z!EC-{BNQu@s=gys5~M1hki+~N#IC+yxOeZ#$!hNGZs!rmR>HPyJwn=ngmB?a(E!46 zpg~FhlBH0!5%+uz&=DnRg`gyw)_|oDL4hR#8$>U#9hQ=!5H%g>N-%t+j|oRmdfXwI z6mNr^9BD>=d`ay>xgZ5_Na3xUazTVoy-hhPvgq#T_YB*or3wJ9*rUDr(ZMT$9wdE2uvDJdRfK%-1X9fiK4Zn=iR}4GFP3e#Xzq8;Et*7R=N6l3R zlK?X^G{@|chA=3zEiNR#EOBx|6qye_#PH&kpMEh{%4}S!WQ(LqulV>R??g2R;9^H` zWstW+(O4M?$w_HJB$vRIzLeQBY*p;np2c_Z7-?^6QhWmKmz#kp_vO_OwZ)wkV5*X# z{m%Ap*-ScXJ?r{3&sho znx-cRX((9T^6pl#HDX}xjL)k+h^5G&^G^n}5g_m`)^BIk+Eq|TOT%orc%?ftYT=Gq zrRBPEc=e*wx!VsI?1FjyG0-H?Ep_e=8K9@Pqde zG@+vlvDgy8ep!MD?II{d|JKST76(~2j3{XYam82+)W*m~LVQzq>r*l+;3@ zLiL7|bb@h*hz`$)wJSEGJM>S*YRbvbF_nw{0g*VR{*>vmJjqi0X50x$a}yCyJHd$` zewOOh&?TRqXOd~5+k&@nG#T!2dWWB_&CB7GG1f~i!#kxl4LXnP>()$?jKn|gusm{{ z@N79{>^i;d^5K*o_veEo>J-=3a%hzIAZ={WV~i+bsC(vy3#in7)Ea@2u_*?#aCoSB zjt1R|ve5!kNi($x`w$}`Z#-r^zuHC^|)8fndXpP%ivf3jbqOVKl4q}s3|Fi-IgGJkqAp^$>2_$w6Oj9jn>Su@P5<}0 zi7Tw@1)w6<;cErQry~-mRA{oEPmvPufU`yZDCYDI4!PH%rXGxCU z&n#9$og{9fpBQ(rmCY*;rJ_g{@9D)@YV=ZTe(UNHdc3rS4=n^q{kAgqh-9fg&aMbl zXv%dL2DjCtQQ9~pS=w8tQK@0wyku6~qc=>p4TYxw0eLtCRARmu@TP0c4eeM=-lB`B zMso_tq>8k7LKy?`m}geJg^xZC*9*Ah;m20-&xE0xmv|o?P6b6S_oyS<^H0Z^W7I5k zTT$O;@j1IKMCa<;U|lHam_wt(3*|ZX33}*~;dltGUA#GqVKX2Wc&=edZyaQ-pQ%o; z$X(Jsr4(Am7mK;79+gMPAYMW!C&U1m`~c{jNALPU_WUUGwg28$+F8hb%8|~)Y$bp+ zX+}#^n+@g^nsw_zc_mz<2#T5`kV+xKHS!G^Dx)t$8lOq&4Tf-+xqom31*mk59Es7u zz(_<^n7h1SjDu)Y>5xxlvib$dJMD@oNM zaFOn*zE579+blfobe*ChhXe`G00=Nn{6zuL+#&R66=LXB0*nTM!GTiJV&-U++!i@| z8T6KKF3+YHE6cY%f{Y|fMUuA6@<>~zS?&J1H7Lz|t22@;6=@^+4g6>sNo&bSvK*u> zN=!N;#0#Y9h&SnOgA0co%Qr_n2P=EqvqGGGEPKH9)9N2SBSR&~%mw%WHq3_DYQM&w zufjqX@Tg^kQ1qe=L$*zr&c0@7`@B!tb>_mjIe9OJJJo;Kiv#l1FV09`K#onFDI0A; zyq(=*WlBU$4W{m}cP6)p;h>_bavby}k|6R(wwmF5KVq705h@gauDEbOI+V1I-&j)s zZ&rP^d_cMhm*iSSlTY`WdL1cIsR^1g^fgJ)-6r0KK+F?~0geL}&6Mmu_^g7R3-bm5 z>pDi+-UT7=DyLt9am7zl%1f0g(|ApF`A1A!_S}YkpdBRR|T-UtV=1^@ph%71$k#XK;l3xk*mw#aA3nCY%?N5Ok;q(m(%AG>INZ{F*M@U zLfn>?9+}0qkm=1h!FIMGxLOo((&|{FU1&KhZXA^`(Aj`~&xJdGXlP`!un$rkmbc@I) zmq71SE|^Fprur}<;{1i@=5bA`(+JM&hEmiQhcrUCicP78~vX< zo#Zx=p0Y@IMW(+m8D_h84Y-4@jfYMtokT=n4^;=B_$+Qt7;=6QK|!Q%)!n0PIZ{R0 zY=tf>0Fq0gzWMmWNhYzpS_Acvny*mXrM2e@82`XopzgDCK@`q^FDBsBe)p zVc)fgGWIV>CxJ#p2pE(L)%f3gOqs8Up(Kq=rfgd^B z53x(yuL5z6s=A+_?((iOq@l{PC>eDiscF${)iuq{038p|F(W?d9f8-)4c-6}#x zfFjfrURx;FVz?AC<{M_+Y$VvZK(BW$&$^3M^ED$}!9)|T(EJFSE`)-x>DFS?ks>CQ z{76kZB0(;jUB{k~jxA?l`YdC{mFYxM86?XyF!Tg|JaI6ZIR^@=?FjAxI8_wzt7r;cRlu>Qht_ zL2pEu*b|J2tThWL`b?NW1StGeV-m$Nu(f1EGSj_)((W0HzR?x&y3y=i)+C9mBDU8a~!GDdb$Q4MDHL24;F+2H8+6|j_2Sr$W{eWRy__z zNZH;mGKzo<>b3xhOMSHK4tG6{R8(m2tI_8iMiUwBad#$powhQK4ugh^{@z@1AM^w< z_j2<5g`Fz2>%+5Dd4@-r$nhuWtD(051M)pL<>zrEX7~;;d6z9~jft*GG9@v&R#YT0 zO}tPt;C}19g&i?E&yd$?qbo z6-0Hy&O z@U!>tS=(uKTm|$UGeY*ZG2Dm=c{R12p-Nv`h$FD8LBimjkEz__8@U35zsHZb6iP`p)yEgHXwG0DHXT1 zMDrrxAj|bx0TgQJ)Dbx@;lVzNY@i5&oV2o^Ebr90 zu}W*HlIqG9+btvoGd53Li|wM1r1Ko)WA(-szF+-73O~2&)0$2Bl{oX2$c~dwjo8;* z+zQUVQQ(mkZwD=FQ00+vY4D5X8Owu~W<-Vx6V!mLV2^aIx9XzIQlTkBwrwV6l%jrw z72u6Q6B*@&dAhxglC<3FT5N0uX&lE5D-JW7sFVHNT(j2tyivw-AEvNvaK}#g;kQ)&fJ609oOvK><4G2Pb3`DN}!+0}0gIP-@NP%%j zN2Ri3WlAhe66t^QF(su4Ysr~>iKRE9WT*E%t{ntI12AVt^cg|hSIzj=|7Dn$-U0>(gHdRR9~By+(UxPH)dSeSqz73s zYjGoxIpKSaX->f)5;|tAqL3E#41zi3@@KsTHhO!M6RF{&KsC6(u`4 z@g~I$O>P*TP!f&lT9K>9L^K$A@gGg%Z6M7ZYD8Lu zBn%;4vzo*yP7Hi^U{sen(bbYA8#`QU^fMnL`Gd???83u(lEwJr^H{?)5HY zGZsr0ld8dw=C_#J+51_R>K;5cu|HS%ylgKIlMm9)V#Whp;JWAO4#l2C&#GJ4mrGd(e-nB_vw}0-Y!2|ymL%VmFdPG?1a&r#Z#Tugv~tjig9Zce z92$_w&BTG0Fe5s~FKo}^R$0IW(rI}|d14lcirL4f0*rzlVE}ACZBgc#K!p0KUjnc= zor_c|P)nb=%aj*JG_BvMecr)CxKXJrZQCl$SACh%@5Ea8Sb(ldVFaKaD_}EkP*&b2 z#u}`%V;!7}K-V=_gNfU*Exe7imD6=wzOCN2xW$4^~>ANax5zypYEc4YfRp^;7_ z%zUvKNJT{h8JjDIdOQ4|kJf|58JB}uO`%|j!Fat8izdSJG zYSm(#UrVd7|J3V8vJe)U!?C7%BV>mp{9tCN+#PY`wzIU-7Wgmz0o@n3ra(SyFkMlP zU7cCIP{LGF2;*pdJE_kbzNScFUWE;%V^8BJH8y9+qA=(VM{=i{6sifXP^}~H`U~nG z#FzNCQ(nU8-*7+}`d%@cumN?PcTcxACupX;;2iS?MttL$N770%#R`GeyiuBhf>Qpcx1Qhp!r4_6tFCz|@>mwH@*D7TH;)f4;) zP3#Hr-T;Kr#3H6Xaq+~S7#|7@xGpORUrnnSQJIBIs1l)V4}6j3oUaK5OW}H@b=m@_ z(4)TEFQ{Bml zNE9Cpe8*ORp4WKKXr7;!+PublH=3+%nsLep0XS?A9y2a$)>=oIhPbvly_%|?VmBDv zpW-)6y9&f8o@&=x2Arq*#ZZt{-r6bw9~9%{`kE|2$v4F=o62&T3L7P~| zdt95a*{+M@7)PRG#upEM79bFmMFzay2aL*Je4tmY_kJcL9>MK7VFm?Q?E&pNlZuW) zZtA$clCE4`0>4tma&6+Ykug+nGEKN5RxncakxEWuy!yldtF-uRt2)u&Oah9-CXwHE zwZ3rYNnw!2MNV3Hr?H&K++j7G!j@MoYB{Au?bx5mlKaUfFjI2_tzoJ(DWuPaO5sh6 z&1}1}@3{eHeMK z_(mIK-QZK|OCM0NYp8NcNi<>lKN0Rnr}q1Q!tW;oO83iFQBGrq9MZ0Q2Ox?rri6JJ zT>6499XO2U0(_K^a6kT8folUAT|I2N0t(wS>}F_#VL#1=0jp;ieVQ4QPf|4F}}%qdu1hRfULCz!L5HVhkFS)1=Lq_dCb3Gd<};?fO{0(bWxvt0=t z5J_jH90y}80c20)tz50u+{aZ%rHwWTDRkSajXs`kjdKFVK6@F{eY)QnyZ}%4duuPi z$$nK*<>dNOn8TPGz?KJhNTcki+1LfyJEey(R;c zwJHs4KAX?6E0p<4*?2LfNgh!Qj80*`2wR~_@gT(oV>k=vU)McC+}6Vf06q3>Ya4V6 zOYEVG>k3t{x1&=S>n9VnI(`RdkY)U8cN+(s^g%$^`-@NKF#zVlbNWqz&V(Id2H&Dv z4bojvlfkQ2%Hb{qFNTQVNd5`YUa+aZv0ZOcohll5j=i-b*$xj zb$!1$Y=9t&ea7uzU!L zM*Ydv;bM~LcXe{pLtS>iP-o)iha`9}y%@|6U$yX*mJqK_ubEEkN5we8m-Bx5kOszx zc=pr3Y7C>ytFM0e$0#*l&0e(ghGBDp!c5Wn+}-~ET5xcK&oH-GeuLtFmz z;@^7w$M^ij83zw-X?_3q-t?w7eUXpc@Aqwa?lZr<;$J?(eSe>S`VBAMcB}4t;p>L4 zUw!81^zn7i*MIl&@gPriwp?`juRZ-c&-m6)9XeQcuReH?JwRpB|9G~za!VsHF1N$L z%vY#iGP4Jtpdn&+I9{NXON4Dp1)?_W8n%_r$KFtWb?R~r3}s8@Lr6Ee&I%54HiW7? z0S>%j!fB-KY3YjU&Rb=K1Pvu5`&AUv#>~%UOa-O_p=C@gyxB!{wSOCWMR4uV-v&av zp`goAJHjpv>*lmODarE@J>$^9tNZu1^VYtUC~;;yA%i=J zFLXqHP%@RqC@WKa|Mu6symc<5JI)w_8lgI6FCgu)vpM;h2CFcV{?0SL51qbp{>7+| zHT~Va{}313)kp8T^TGT~BtpA-*T+BdP<}Rij85Q46$wZyM@{)4Rci$Jt3_iM3duGX(U{QJ&0Sfg!E z%6ER~YEU^`otx*){PNaAXcBE<1p_fOz542i3%>Xn1NW6??CH)}5&}exeL*8}3O5-d zg>SdtWB_YS@L+r-xmnApJ_MqJqaoWOKh%X8Z+zuV=sNA{8HPlow`pFDXFv@4$qosy zy=^OFPZ~)4d`9&UjG7vCbO{9PwFmWYnb!lNS9&<+Su5$vnd@=9#1s)y@vp^0AR%4t z@4qJH_xNYa#CLx<{gt1}0KgT0mj24!-#JrDaoTTR@ZL2qf18%#`CG17_WWBusb63A zzyC2`@%cOKSEoE)nP~9#XUof9d*Zu3{{DB<)eF@`oU4DpJLTVDw(p08k+t*U-7?X$n+5AR9858lQVpJT(NF4ck~)=|lo+L*Es;zHBa%Xx z76-G){bN$lno)E@s;1v|3m@sVPBRm}O2uVaJbwG6Y%9{-)K9G|w(p|MC&8mMQxi4I zJhPPij46MD)lp{7K&MI>iqga??DfBqFV0nKKyQ?*rgC7OvUWIG9Fr)SDVevnl!(&O zp={;iwvr}mXA`8w?`MMsM3JYp;;Mr^f(Xt7T;(JniE9MeJoxQ+)&06TzJ#?j$pM;R zZQxgNX9L=`I|=CLmE^AY3N1=c(pez&n>~F@Zzh>7WR8pyz1&dIV&)-F#2pz6^lAa& z$}l(X^z0Db`K3BD#QWr;XMzy&$zmc1myRwSk(EYoSg_Lf<%^ZC#?~C|S%9o)WU|r7 zWTTPEMx!nCG$>|=TYfLV?%UvDbj2%M4T|w)$;GFrdCF}6{4SC{ieFfm-h;=>NU3_; z>$~h!3o9OTt{YXCm}zT&mA093T6~4W6Ug_VGICO(>8Y%UtP}W^c5U6^NFZOD8+Uo} zDa!UlG{8i}F&gY3j2j)*aQ;d$i-1hIi9n;^`$8th{h@t;R!=f)!9TZ?M})F`HmfdB;^A}F%UbU*UOJ93Tn%eZosB^CS`@Ip#HS@Dn+LSNZyrfFTMf6*{A-iau7LN zcvww?A&#t3F+?*%@dSw>no$~RiX16JL?Ri*sKRWj{Wbi<1g_invnbUdM!P{MRJ1oO zf_g9C&Pe|UNu^0x`oDtSRcagd1Fs^cVXhY>9TJ7{#ZAb8g)((<$Go_4;)HRs04)BH z>Kga1*;)L`b@<>?_CQbI?JlBwc~r;s=<<`zFN7Me#jSS{EaFrBzsy*OMW+TeN<%V6 zNhTUpH#N%OrO`sLg;Wc{wG&1Rn@?S2~mraf&qMI>jY*mg#l7o9_&jXLxGOP z(ELsrKjQGN2)ak`o#_Cq^3_3n;PeTcL;}tc@k!bm%Mw8DM9u{aNZJ_8(YXVpxv`3J z2hiA-49ZPz8ttpJYK(B5x8;i~Kfo#){ls}oLe zxE$;9=A=x1GA*vyoL+Wb5Srj=PS6YhZ7t)L$q%Iqw!@MI3R%e^J3w4=V_@V-@!v+f zUSag9d0HH<$vI`d7h{_sNuooC$-~2^2VGC?bbiTN$o>fslV`5Q6`IpAC)n}L&3I)b z^G+WoJGbkrG`Q^Sy{vLA4d!=2tiFFHb&n{km_#<;@QCubBpD-+)MD0pHN(?lL94K; z_>fgFW|gk%E?%Vu?`f*tM5MJY(6DfkV6>Dmysk%t^1%`1i`5qIQ9V~&i1&TPszKvj zwZ+Qj{SPZ(aw=cehCjAB9>S2`w}d3sr@oO?t>Tc$O|c{ozQs(Y5_&9to(i%4j4z~U zE2;kUJ3z8{0Ah1$2`6HBT1=GAX>lg>6y!4=_CQZaZ&$)oP@>ks?Yb*nt)O~CUJT$N z)CYe_*ns9iO%&~5o9QKDx6V>WF9|8w_L5HHdO&z3NzI_2EUX*J&&O1s;sD*K19Emz zR4|DeFr1KjybhS@krAK5&jzZ7<%)Y81!R7z;S=Qyt1E;i8#`vIaS*GI586tK zKa?pK5@PKwh6i;V8P(@_5tIc-q$dk5hHNBg=cz{-sbLj&HWWWA8|QW?3(i#wUy^t&E81qM z6{`g&P|J&3IsmaYn@fbf;Z!FYLfmq8T=>z#iia>JPb7G>+Fo4ZDD&ReS}gM(K@C4E z`*7qn{6cQJYu{Za2LlQfpfVW8I1h!!BK7r*`u^?%jaq7P^A4LH>>OX`Jz{98_;6RM z0JiYX)|gnWTcof}spzp3U~^4sbrBZkuU62I==YTHoSK#Elf-g${Y}c$g+IV*zteVY zh?lrw+b-Uav*0x)v*2~-(smf%j`|UordH`Mcqrn`MxzLfHIw#&#!7GDm#(9TJ1!nA zilBqZAfSQi{-`2;Z^_f{La#&vZ-7)XfN_fZLK~*Ts*y%ZBlCb}yx#Q@5b8wj_hErs zL)m|9hSKH?7h%q$?TAhm*6p%sjfI;D+O z2RH3>S4;0Nc`#aXqz{;!?Nomcw}NH#ig{ibPzhPvs6H)TraJzQNfAydCt4qpH?%&M z5;R_9vA+R_K7^E*`~gx`zGsL6!(0R>bnLz6$&sm1;?M5)U)M`}3zzdpuvoLVIgZ!O zZc6eWkrQ`LplmUYCMGu~Kp4jtKx_{0y^9 zk6%xxFUeRogjNSA1gOt!5E@M6^W4C`QNF0sH0|0@35p%;I$aUm-Esu3{77s`!EbIu>sXN+H zcho;EJr2c@?W|(PND5Rs1&TI+4!JQq~v+xFOS^Ugon56uM(%`v#{lQUH7_t`nmUd>11ooasO> zOoo*V25hBLhm6^rtvr|F2HZSkq8o*Q8zk7`@7h z4OS2$F|u0+MFr*?E}+BcUBMR@>iZr6bGH+gY*XT}sR0C(O#oR|{A$G5XpYnc zv8c*ng+0f#2SmR!X$Z%jt_8gd&e7BCHdN{FMQ%T#fP|Q<4-x6;uDHClK(-@1z%STE z2w&EL2eiQ3S#Kc>BBI7Ka~+PGV>y%L?^(k(ju+vOwzbqmS9YjyLoaN8q~tB>)RYj` z*xU!!tqpF8qF;^ncCAIAilPNYA#`-O@*};5U=C?y3r-*Tr+(UBC`{JDvlHL^FHL^{ zG&FQ`_b8~vH|Yj6!H*)m;hS_y8g2fkQ63_VHviKc0ZxrH`kQehPiSxKnMI_a$7VFdTD|r(UP!)&gJ@Cv=QJE|4w)-FaDp1r8V%y4tzz|1&uFS z2EA$$)X0l72CyfwDDx?2ewTQM)TD-HD-_esVNw(XziJOCviw+$GU-iJ> zrPUX7VktHCq8tEe-3wEt)!l%q4XA=&2!d9a3)b34c&<;9>ecK|?2D7r=PKchA2qQK zjG#`K&c(216>misGY}AqNAhs88%d4psJzVl#upE!$72Fhskt*NcR=;3PaBBXvOCY@ zf+s4tyR^And^$WKm(+gb?yV!BHat`4w|xPJgtNfQ`9&3hn8oSfI}4_nWbWQ2SwUf#gi#3E*)Adje9U&zE6M$OPM~Pf|wFar$R+E%2-J7LM*Q9tZ z-350R(mp!aC=+Y5(T-~ryMj{=qDM=2X)^jNP)%Xr>ZNS83KP?eOtTMw30v~%=DYGb z0X1Q>0Wo5l9vOQ0!9}T-z1l5;z~~?Kuz%b^#@w8VTE5O6?=u4Qwqs_~ls~4;x6ZFhZQO#TWYjx`ab&N!KG1 zN`k7Eb67nK1><;L6D%$ayA>o9(_AG(Hy(xKCyPiIIwww|#u9Fu!?MzR(LS&G#r7dU|N(=L_PVGy;`h@Qv4I16OpFO&0CHb z=panMw=qcrvx&f8sC617aeCU?&@qq<0@*R~=zwKv8EjirY)*l36~2Gh5-@Azk&R#` zJT=fEm>wQMYaE`WDW7-{)gmb4`%y>6w#T@xRAVsG=#_}8#R2_zJzlTK8J^)4wVc(sZUh8p$hh>XH za1RRaRHW5xvxz|rEb>7Fv8s)%7pc3&Kj0|GqX>Rfsa!osvXtXnlMiv2$ zECL#x_d&CPvIaCd?}J9?eYADn$Be!m0VfE1nD9O<+XDPKf`M4zI@4jS6j?qTbC4nY9+r8YyM=aw_Y^GS6JTm=_po8s~K z08na#su+5B!60meZi1R*f6p4WRx&&3c= zL20F+pwm*^PGz<7g5fdRR&0;q(W&I>&Vwl8MDlIs=HYA==7a5-1Y;&{mjaJQNwX7i z!)U|u^pR08MYij3xuTXuxg4Sxb{Xw*1#>y-m;qycP_;&S#h}API~W82_BAQ{c$g>t z+UhiI>1kEha26|&TA$$1*`rT#ypT+gp<#DUOjiv7+_UijwoXjT@VWYj%h;I}DkS0h zV4-lUFd@10bnG)#iKrcg(_bU$OtCEVN|>MP34eSIgFVzQr$p7p9SL2gMhSe&wJWY+-<^HNaLdwT_ZQ@>m>aHxZTDuigRkZpl6XnE7=_Jmty+crV66JTH6fi`LL-!cJcC8h~ zjVU7!<`fo4n7mfHEVehG<RxPx`*BB)LqrD`0?D@f@Ia#s#CYER0v^+ z9?kYYK?;jNM!?8Iw_oEc)9fSG29RRC1wc!C+`Ps!PePWBk(wrb`w7O-?=EMSMrSZKSk056kA!45}XN3%>j z=-b+dypaYM$|*E693By+1to<5T>p*j#r8u(X+fQa>jd|YE7wP)RU;z{-xM(7llo*F ziA7JB^}9)yWu0~}Z^={(4koS>+x6V!w0LdJuANto>Dhato*nsUP3oCSwzvzCgr-_C z-xHO;xVOH30KR<%Ig+8AP9AtoR=kUkPS%mt_#+JsJkuZp`-laq$NSxi2pBUnc-q|{ zxY8*|;V)S9EC88X_#|Y)&t;G)dCZeXvE4SJVrQ6noq>}Tdm`1w9kt^FWa80^aT>{V zHfv2C&dSCg32Zcv^n%&Lri5??4pz$1TOv}fBWk+BcSC1!>UP7gDdQi^q>(yJBV~q0 z?oApgGc?*}O`~nrG^=2sG;(j!NSUEoqnc3SjWEB#b&rqi(;!fodN~L61yZA5xrzleB8V#lmH7F)m zZQKb@@nu1OlmLnHhLmK83weyDxSse0sapD2J< zSsJipjt1VpipD%d?BSP(hzH zD*!6kj-61Be7`kEz6SKQO(hn10lT;#q-JwG#>y2SDjoV(ct3c@-?LWszmP7rGat1;j2OZjahl6k;&r@t zK)K_Om}4MtU=w{BN;cC@Mi6`~_~~CSffkRvy8O6Ab5}u9;TkK46R`tnnHzQR7PD-AtQ z+~V((xnVks)w$#x_#Dx`gamg+C{=`RHH|YnEe% z#++c8<#qF|yD$mA{}V|*pYbZ=5tfW&fRi+0=A6bMk-(?Iu0e$TkIZDn;yn;|HvAS? zg~=e1aVU;OBaUUJB4WiwJ&pVpH1#>9llrDZk!aQ+@oCoKzMzrcf~I*+se(p!KsHm`efiyKb@oLXwyY{A+euI zBh7#}aCjic0ZQhbUi^>Y3T*fxkv8;|guxK@cvH$~NQsaglE+?j6$4O4NCPLS*e1DR z4JJ_|dz&Sa6-wpI9@VI&r_zIc9ZnS&o9=+b!_QT`byC%=ReQ-^&B&!P5d>2TCgYqc zk14Jc;}zylo5uzIWj|kr@fz{J!|9|LF1TGLWDb;d0U8HGUoMIsBgLk4^9s8%DDa3r zl!#vO@9M60p_Ej(2?7}Zfkqg<&2pS)38>HKM+%sRLV43c2~fHkWaETlCwPWlP>ML} z5o{V-DW2UswHmz|!V~4xIh3!V6qEop#W|tqFej#~hsz5{^H|kMHUI>bp<6voLYh!8 z0bPHYoqQM-$|?2k@1rbQD1Zk%QDl0<<$^4W3HnM&=o6k9kZ;7bslkkmb3#RA@i8<| zKtnI5&Kgj-I@bCP$T3B(Ou2mLP>vquG?mi!ifX^qM`7DN*%A-+(o6Syc@3Y~evK5*sIxi8rmuE*@$_ zQg0=(t#rsSL{l&&Q5Zi1$5jH*Bq{qucDV$v=f`q5g(}Q(o{-6UJi=UxM|(1&uyMID zqFgkh5d|*`wr7}}*0@G;cd#tu)@{*P3mZ#}qI@7EX$0(YJFQz?mEwxnZ|F6OHj5&{ zJM4r{OQQ-uwAcX%!Wo&1wO|VT6*Wd{{Dy{@jXB6cJF&lM%@eJQ*|FA^U+OVYXYB2Ssv`X^0>_;v5)|F z+3>jYR@$LNyB@Kp#+jgFvLzxj*a+Z{>vi3+GF_3U}tZr&t@I@0d3TA zZGEGPZrv7x>mx&ptb{2X!VPX``P9-y{;Q5zHKWN+TU`wU!**IjgTrhcjd{vC?kVfI zrwksa`h6W$?3<@KZd0~}=9rVSb7&~0a30OECuh%#$|%Qoh>d%v=O3`JdoY-(6vrE(3lmUnFrv8dL5P_yas0ggq^lMRT;9E92`;r^f1k^%AkR zh7Ht=WLoqW)%tKYqj{fkiX>GTcKIm0!;vv+;LvIkqAzA4<&+&qERH z;mJWvIzK6$MJ3FUgVL_>jr@?{0!2q*a|VPX460#%E2t*rHp0T3P{86-t;OkejWU1Y zq>O+@_63bLKGDekL=$%AN-5==lu{b`pJ?QNqS3yT!`L2CT>vXCKw%G_pxK0er9feOtxQZ0e(&oM5ja(Bgv^SEUyYU?}j-67SjHo^0` zK(-cUwId+>m9manBCUgZLJL=lI9rdzeE zEB`YqzL4>rpq$xzVjNtFVe$`&HRBf9!DlpsE#7SOE9@x}VPhe9N)3(P+dD0NCK%Ey zUT6x2xXsZc2RNdLD-8w^M=JQ%0GPMrM(Tcf96<8RqvRgPbYg~TF!r|KnLb5a)F?47YnWd41Ln8}^ zW((E?%?^wSnsYEbXpY>p5zW!FTyC(;Q>sVV7G1mJtr_500td$FSE8XN6^)uzq4XL~B+Y&&C~8`zd7^x6y6S zpqJViNG~QXnc1w!h*JOMF?)y0sEJ4S`Mghv!#wD8#}fMXF*^X}SCs*&8I;Md9rFwlI_8vqbi8skZ=+MD%hdG+5ryuOZXjm=r#(s7+_A9e_;f zY6W`CO!2)sL(}{@X#dLzER}kA2hTc0y${!a7q00jUsHZ-6cS9wmF6%94eB@rue0?_ zir2G!*wH{<5OFcBqXS3IYx zm)jGzes$!6_45Rp@J7-KQDax|I#v{BomB6BcUoK=T*}j7dof_I{@>zt&FCM1VZeDi z!^V{zEoc!^$4zaYFJP#6sH+vbs+MBbjD2#ORJ9#@$CI0;L%yaBce2=iLewOQFlyl# zmUW%G2b|9rAP&82b9rN<#h^IAjtV3z?BFi`fc<)r=Efxpx5u>2fD>60C+ZAN8wWSL z(l-UhJSQrBo@Ui|S2+AIiTtqP3P)ez0^-G7;S50@CIDhC3+Jf9E-q0a4~L7h7%j?Swx z_cv?vQYs#{dk6~dl068Xot*8az8op1FlVlTA9V^UUoQX`ECp5b=zq7pc;nv2TFG;F zj@g`YX<>REQS=Irf*8I9vEqCR2dQ8P+3$fnx{LukG3jsup$W0M)#(NerB~k<#Y?NWt)apMN=3Bp#=;uK zswM)Z;%uUhP`W2lDr1rP2|T-MFu5(Ey1}|l-CJ{(*1<3zqA-OQ{S}lHX)Hx+xH|+- zv`{HUIC4d6Xy2kWOO_zb#c7Q#FK!|mtzn;w*31xIO#>;*EH+x>=o@G)lFmjMLRHd# z0+vwD;20p<9%)cUDg)b=Ntxo`T%!0#!)tHL3Tg=9#)DHNfVx&qBdwa|2(aDkQihU| zouuN;=sldBt;5FS^5;TQsb6Hh3B{WFGxFmcVvTIGQ&LNB4@p|3WLm?;Dxim5OTKGb zNT#9#zos;J#}nK37sCj+Pwc=iXW^{!F5aBmCYQ!4)9q9<@-B>(5Q`hD(RI*^p36G| zE@BpH+q3yr5pQxc40S0El_w*H5}+&oCr^&_Y&}WuF5G|?)1@ef&i!#!z86#<={>nU z8}uIATUBq5woFHv1Sk=RH;$p;SRPf|T6Gb8D{s28Dpvd=3x7NaJV@&YD`Eup*Bi~J{#3y-=w#5xrBq|pIb+pb{S z?g60W@rDH9>je^6|eREfkI3nsnyzsPR^c4o!<+XEK4UYl$XLsF00 zO>y(XZwxS+1c981h?Fp+XpVqi#Ow-0-$qji$F~o~a5r{kaTQb(rw1M6+^)H@Ww|CK z1dTZZIPIOqE;FSnP>v~XC^XcOj0)PqW z!qk`5BlYBAgQw1hElmk5l|9@j&U0ZXtnVyryz0S^rUp7JQILRpz~A~yJum% z73ho8o|Haq*xD7+XuNhD)&L%h>#`B{A*eIICFt+4U4ywi7wk&btpVzmlQ&o2rGA85gjH^IIxRcP0FUpMgkb|Vq4*3G0J!uO6Ma*yuBn8B3=(PI>i zr8h!FY+W66iq|f&!J?7aGQw7nPZ%ke6ip~agvaY}ezuW1U>h42=$hu&BfHrYl7!wQ ziDR;2R{Uw5@lvOZwk&1X)z`K;yzx369r3an=x6SAvW+?mHl6%3NpcxWXt7!;E}5CB zgLXcz$DVB=0D!Q@^Ri9Ik+F@ClL}``K?5x-i<_%bsLJAM<5x;cgHg@zlCMxoTt1bs z=KWXq7MHJRxJ2n8862td7OL3DCCYPhi5`_k=b`n95L$<2WLp`usXvm`BelmI=`acr zV)4pGWg(b?Jh0At$Q*5tLde3M=68brzX^|^`!Nq}t&OqwiEQ#(7h9rdJ;C@MH}@ZQ_`X$ z7ZOmltia>VWTd))cGTs4uDSrh;ynV^$c57qQZ!);17SbF^H@L|1}jL*xEp?u{9j|ZERSm@NmO-i=z$|I7`oC_8c@5aC4@WM6IM2zA`g7#zjGlqZ22f(RhTb z|C%L0*(k#qm1xjdQov&oG>SzWnJ(>#_+fh-K*$Pe#@4{XS_>*OkjA(d{RUl#ET38< zULr5<5vjr=Mf5iXZ%nApMjc}==oo*}UR zRNf!u6$+^=zt;Ct|I_EOXP4Mr2tMe{JTZmZlIU!{GG)sfti;)gg^Z=*K+5hJki}e! z$hc1y2Fo7ipm#b8syzaUG`K6|H#Y|o{!hF;;iX}}a`j}S;CoYEI|_;*K?1u%Qk<`S zMQ~K}MCH{t2v)`}EQnF90lRPf+k{-0Th&c4>!GSqH@T*}0ygo6woWs$6~$u(cFGQ6 zlp5a_njDo#=YVd|y*#6n`f@h!$YpG!FTK%b|23n5M4KO0r9Dzv6puCtA8k^moDk`& z6QpH_{ZTlb4A)Hl&YbdQcvvW;C3s*~dF?koZ&U;xM3oS0RhMz@I_z_Uwy{bd zrZcUgp3=If8zo4 zjuDH1f&=Zbh-_6-l`AbATb@$MxpQFaNSU(rY|2R+Dc5|r`r|+32D++U5wR;Tl6myv zhcHgyzYBIPpN1L%V`5Y-CVb#ZkcjN;VD-YHs$*L?w&Bap~W~r|=?}i_`sH|Gd zkSs{;P#LWnUB&+20^Tx(x1g*ZT?RxHl%9A0*V*D?Wev6?U=IxDl{_v`_dOInT z!S_b7LI@z=wo(@;cfXL3?*1f3?1+$H>4*-1iq|GklLp>0Fq;J31GZtFkOwZ0Yxxs2A7JRF>d=A(CPt6e%p+GAr-q zLJ#10k(6NM_`2xq2C$TBuVg1~zSMFGH>b}bSJO={7*!ANl&r1w$)BOrvq`-A$}L0^ zD5_^azDrD|#$1cl@%x(WJ*gEX9=3_DGh1Vy#l^%PfUmyv$Vca!dqV3fbt-$+(1+Yy z9;qvY?#GY_DoCsMygAi*JB&vuO_x(lF$>w@-9ScodWw&?2e#V$q@qgr;utrKL61Gj z=m|wBqD<|!tN!>i37ITaLw^$H8P?P~kYmjw(qG5CL8cU#?z2dZy)#|Bi>bk%n#gfj z1Q=6QMVRnMjRQ0mE<@iD48bp6z4vp-lj7wKo;5}=N5OeSEs;!|^L%y*r+>o<*qm7q z`r~MS*y)a(fD%8132T9=t#K@U;K~xdY4L6tkuzragX4uBb2qd2h4E$XgkN!TPmNOb z-SA@yBblfRdN9UsVCMBhK^vD=`G`zDNXYWm-1Lb6we55LKV8BAY_M`jPwYq9%)qD; zJMeHUBVf9-49>@J&fTsluc0)}m$}FtwSAaZ2avF$_$uL5e1(U@G{kR2rlMC^MMSoE zAj7TLBOJNZSO$P?1ZV0DB%e9K!AX-xZ7<`B_%(@sJIO}X>NUC`f^yQ^i+4jE^1>qY zrVuahXLS?VTxs?1$*w9plMio8^SlSX z-RUh`UaVNP@`U48;y){;r%9F7Amuu%ZvSdHP6NG5&YJg&JIXP|{qgwD2&_XSgKZHbKMsb(!7hg&yyd$yh-i>W|*Gtu(LDKkDbHC+eNY>C+SR>2dn> zczx0^rpSs;t8dwjEA{c)_7RD$kyTIGK2543eGZ9!A6w;vJey~V9CFObPEXm!6mtu# zWYtOAf?B~9;U+5~x485R|ESJ=<~n96t^V0wG^dYGXCM`m^LPG~MjzMCe>#1aGV)VZ zC95`R)OJ4CMtwS7zkOrWmume^9T%Pt9qwAj!_Y`tJwsRRo!_)a9;Y8q){n=A8UK`4 zBCS4Pz~M)>hBq(&Ao1(}V2=}rPpj{YJ|3@ISLnyD+mAE)_^vk2Y5O+1AWUf+XDY8k@wjKD8WC3{x6C z#7zk-WyALANrz9lw|W2z*1lymwrYnwr-+XuWAiFQYE@t6!D+g_L0!u)ZCa&*AtiD) zpRZ2C>+*MrD%{m`Z}a2`JpeTZTb$Ng)DLjNTr>pYAtxecb2^EkQ=Etl7@jjo`7ct6A}~Y(0in=%rrFu<*d-3&3lP{#m7P6Jq||vPhMGW0 z-yXWmBNM7PZWri|O>r8H!!d%}k-gv5`H6-MPuBR->dgXc-L(NWONTlA#_+ zwk@!3&$QhBhF=ZbO}Fynlbt1v))7gHRNlTbzWL9sAd+}Tb(4JzK5~xlH z>BBH~ykP3!>{1judY}nqX>~P*8V*`uLD*_0SJwYlYq5#nu&*qd1RHa`h(`W#8f9?O zC}p1pH~Ha|CD~V)O-fZ#U*cftv-mA&feceV@v)GBn?Kd(KE3409F{BPu?I%50c;(m zCz-PTQn3CZd?{O8g@hQ^Y*i&q zRifG9H=*pA`%R#3%S8|O~4^BPPaTsD`$@5?vjXNUcwv*}|IAtPYxSw9k^_ z?{h*+D0xzz32b)!26_RCcz(&-)z)*q`HRUFl*N)%31v+wXi8~$saI?|N?1bOw1wTZ zJXk5x6!dtQ6axz1Lb}6av_UOu;4$j(@+`|1Z+>t1GEtC|0m4pU7&wq2-Qf@`+NqpL z*V(-05)L8Q$FnTpRB+SQ1s;p{r-Lji(B_ehs&fhuQ+L&iUP@pj?*%a}z|U?osRoZE z4}>^Ogh9+jI?!G0Qffe8WQWv|7ra161c+#Ov;3!}Pb*qqAk95C&Jfm4!3i&43+#`ek_HKwMQ;kC&fFEkrA?%#3RT; zoH=wZnabN?x{h%$%0bEqAOQBrEz4kw;`oeF)X1oqErCgLk!q~G^P}e1WK_mJE)0Xy z@G8hR?vj8GWl~meA^I_sB19tXupfVP6dIloOTMzVjY8FO{@3q>(ru2_U3ZH41jE$* zF1!Fv;}3=@0=lvN3_>UEL;{CTN>3286F(8S6%tm0W>WRo<0gX@wUO`X-aR{uXEQI> zhnL5yxM}f4REVlhgue22uuCACbk}K2&(;xS(z(E37HA{1iqi@k$BXwN@?#9i za?nt#e1MQye9@@SM?!jHgqgVm7E<6+PThvY8##3)>SW(a>PysFC^(!lgqPrOj47r~ z2%m$a#8dVp`;y{~U}Pj2n32N6B#*Fsl%GNr)-(n#u~>Z$6yigfZe{_Bzv>v2$fFa& zQ!`6F;vTrYL!UujC_axA(oP=-?W6F-AK#i<@ca~m~B91st#&oxN zjr4^KIoq6^Z&4)No0}hs|0S;|(-*P9U5YjL;R{JcESuAP=558{df))TpqKrOR3v6y zW}H(Ce~{qK``?>Lmo4<>p0ad4CvFN?R%q(8AjmKBw0atCR;5v97L78qXjJ)?MwMS_ zwB3Y86;x=BVCCzLtl&QD$O^DJ)4sOaPbAjD_$9i997CMQGh4YUvRg%t5!MOsZ5Q7{ zaO2?BPx^7guv2`79huw1{jdUZaOtU2-S-LMu5MaA?7sxTHL7iCJ6x-OxV524jhIl;Qh{G$u3+@c{4R{xqmU^|o3RCS_K!<7uY5kg;1}P_X0% z{+`L%5IQ-iH7e5yQ3U@*paqqBgV>69qpqE4NY$XYSVOIP`E5%w{~BIN**VjSd4iQn z_Nv9=L}1{=ZJg4_SvY$L$P6IiXq&<;U7#f-@0?4(&y-*W+3d^tJCctfcZ)xREk!OL z@@0KdP*rwORurMh^8gxEdlE0M>=OP>w(l9=a|ghDy?3}^X4ak$kQcjoLz^+6b($Qh z13_LpFQQ3ua#DsqP9fZ#tj3yg3_?ouE~*YZ$R>5vuUdrwYO*%KX> z>YWlO_3;A;=Ol=WiI8uwthk~x5*A?ru{*;jUYQKQdJbnb9N_x~RXo#W=A@D%@Fiop z-&Br%$jVcW10&!h3XdyK2cFA*-XxIbBM>`M`Vl*X3Sc14FKvgmGJmxtfrdRxOCN#2 zwQ23@%e+=YX0;k3pFJfc?tD03tUfl5$otW80jN>58Ny+BBoqie!_-2%Bu@pIw0%gmB7JTRyVB|uH0!eEmk$XnqN`27y2bJ- zDVQ-%NvtT3_N++C)=+Mfbp+2@sHUm`orokLVHhYNtZIH1BVH?t*X0rLQGVzFY)(L5?f+#Q zMu9Aor)w=r1bVt}$dZ-4eSB?Qug^cTl8?RTOTes8jwM+`6bgo*3zI(tu8qChm3rzo zT*-p_qWimH9X3MdX9HWPrIWfJ2UB*R$soI?fGod^%oARxeGWp^@t3*g4YtE-ErT!U z-mqG19Q7C26G6Rvblt#mV}NH&YTfKo8_Qa48#R4 z!xHO41GoMeO7U9hih(1eFZ)0QG?vSwlyq#M#HDa-nO@VcJp};>bQhIxz!=iEe3KTJ zye<)2jrbllh?Ok|CgZpOpSd#wmx_0qVD;i?hSV85prCDO|SHKe7%@8tTv# zU(F(tM<7VCElnOgZ2p6}5F*RA&EK1o{w?Xl2C0pUBA>v8!`l>*ZwZUc65Lt__eSy4 zi^uG4DFdk`(H=!=UYtb8gZZzR!g{u3XWJJVp_1Ve7W~8ir;kk%C^a~L2opczN!_tT zM7Y6-qh9eNU7qNWZbi@>!P3bYm}~R3IXVYW8QK0JgAjr#KFCIixP;Jn+xOW@09Nho zWp}R$NqZT z9l%i(iFg!_=g|X( zBTtSJ$bh*aMHM&--#m=nQ%n!3u|7Gm$`FPpN^RwDZ+n=jzKbUGq98%*SuDh>oBR z5lJK`+*F`2j($xO?d331uN9;oP8JT6Cy`O`ks^ars#U8Ia(oQ6D@#he*=ahKCCC$_K6i_PiFP+#HOR^3e`l2>2a?VBUrsOM3zeOWR7J9IHq9Ut+NnBC~#E~z<4-i6ee|rF9(wzyHai`$C!*3Hv zgg{t}b;UU+Ox$PppG=#D2$>^mmHPOqQpw0!{U*H!MVav%LfJE*OJ*-sK-XU9*(ac$ zCffhWEM?uDOF6`MwD@W_2Thti%9;ng7eC9Xp8fte+u6ioWNDbsVs}iFrjEVl5>7?P*Xt7nP5OpqIE{547#Wxdlc;Lm9Olegc zb|ZgyeW`2#8xN%VcVv`tKX#qOQ%mQ`hkLb1t31xDYlD_y01lEi{<Fb~b{58dA zt;mqgUsK&N3g7ah5~|xz*HIE{^J~-1t$mk-N?P5Z{ZM}nAY6qh6y;tBBsiz0m`6Fu zV=R?TP9v2g*p#+w!NVYD+<=6ROLf?pnUHfa7?O2|4A%l#X0grHfh_2PzE1(fY=sE@ zx%mhSF1{~kQ*(1rGsXc6JVM%sf<^nV06CV-uF4iTmL@liYF#LF2|f4EsL5ka+aGqc z_HRD$`hUDD-<&LUQUKdIGQa-9mDjK^{r>mTr9!n!8C56)Y$0*;uo}Oi=A&{caMHYS zO}I;$i)%u~%C1gdHsotr=I1Ri1sq9`Ast!#RW61t zCVP|?8#bj|rYCXE7bRWnY!RSVeTQN$!;I3S;xXY@R`{3oOTrFfy>5l`FiVBu8Hlw1 zdY(>dKsXZT;G~A9vpr#$?#Dk;rkC_z*U!3(dDDhbR0HQ$GDzGVW)3x_ zV94VIrO;@nB8}CBm)>l(-&ez7_;C$dE6qBB8#G72w?>E6aaLeBtnTh~(62s5W`Q_Y znTV~@EvuUFF7`Has)*5m&Y`0k907oK@w<(h=%^DNY31`yplw13dRR0{JL^!ez7`aN^`iq_zi;1gN};2Bv6NIatT*f` zEXix$MhpWj2N7t>|EjV}LJl<6Ek30HjDpQ$qn+B^dYMg?0_Aah&OREG9kGt)*dSb9 zWJBP^8-0kwsj^?(ZfAM5h7*d_plOb)_@wOBJ|^~>*VWbGOx}H!TJ+mB8keasNaZ2* z@%};9?DKsCL4NsTksPP-#f*?|gk2}u{K6N8U@}lRsN|F2)KWov*Ued57?HVm>3@K8fs~;)@KKq@fge6pGN?2Cfvo3ErE8P9P033c2A|4J$;DQ}Zz?FpqeJL!s}G@*N5{!orx2p% zxxMumWg{tiCbv8#v9Y&ku)bE)u=`(ivdLRr7sc3yAVt5FKCJ7`wOV&j9CqVZuv*d9 z;i*cg&#OPVR4TpnZ3%e-gDsD`fqC?yDOZbJx$#uOaj z@0moSFhJ&%2!Y}LC^%Tu$X2^f+k2RRUK7!nF>i5(W&3OBpF&Pys?KP={}Upgt%E8o zxsV~;8#ZbaOTIUQi3V;|>!%`i*iIP7Ox4-$pQ|?8$Lq1kqdrrAlRAJbr~w&$Wk705 z$zP)@qIpWA7$-}Luh-FodaSG<5nLQxHt(ReF>^3zE6kf$7&oe*zPmt3&1{{xLUTAO zjDDW3otn&A#$x`nM`0k3E6Lge6e-#K1pOP9*iF^I^(Gy&AVPUd`9Z@vTx2w=xM}t3 zIm9d|@t>puPj2742!>+FbPGx(LWwQ#!3ri&LfR{b!Y=Sx#9`{~Nl#Z zj9Tlq|DU&a0k`A2>O8CJyzjY>l5{0qTe4MEzP7Jy$rgzs2|JBdn&=VRah#0dOPKUG zz=Xzg<@p8)V?wuM$=Gp15}E*^lK|bx3=fB3)8X;a^d!^RJOiX>GLry-;Stj5^w84- zf#DHC8qe>)*4}mMoO@$k%T8mIy62p#UHh?~|F!no9S3&KPa@Xljo)cT?{o7ma4TZi zdV1nM^XvjpE+ayM%NE2!oGNDEot;?<)9i>a-l>X|PB65(5|l-ZalF5oh-mN^OeTu- zxsExG(!(3yGu~L~sTBzj4#Ft8FiJNTKt5!7ZxT(%-MtjeH158{(%0Kz!>~pE*`W=^ zmsU136O#XjX2h;w(Hdb7bpG%7(}f*B#Yr;>w|vI&TZM>bOLzhdsv@7z2qdEXeM!JN zgbeKEE?E($KLAns8{)a01tAJ^NL|n&GWFRDsnKKF(Pj$dfCLv`u!bB|HzQ0s!KzL3 zPxGh0Ane~~c)-TjG?d-*AV04)E{6_0hPtYB{ z*80S|P;RUA&IcU?9K-(ijiJ^In>%AVF#%E+h2T@oDK^cGDb|`1B#nwL3kke;d+#I& z8K7HFc0~5XcEXxV>JR#TBn0{FkxfOdrVSYpd`(7#%xNWBVYJnq(-I<$Ecd73XcgGh zN*f`}{A_dKRcqn_r)>3=MHk9VP0sL{URH(>&ZDt|PeP?A*9Ogy-#;~Eul!^~X13$P zL96wneqR=cY-Y#C5R922aiyB--uc@>hq>83CQ9mUo(eXRi*$yJ!0L#mtB$EQiqYD}(fr3dqX;Z}`Ue{hvLPyoRA=Ctms(PD^&8`<8gm#g{&)%@EBqpMNI# zTJG%no!!ZuPd)QY@~GWvaE<=L@I8Sk{P;JqGk`yfw>C=?Vz zlI;G@Fue4sS#w155J2)lLg7LAx^A-|yDWB9J54G7K80;#=#2xuN0IPl7-4++% z94O+u`&8_ZT!G%@wL4{sw(|ezha^SYoW;n$KjrSAQ0(p|ar4rd6%$VeCrMzf0MSS? zv9d%bNyjfI6{PN!X?9%y!F>I*i@hwxjv*cnOvg6Yde13kB;KSye?2*Mo{BL1bsMOO zwzJi5z1o;X#~j7@TZ3=5iVHCDvI=bew;oZ-zf~&IML@J_KEb?Arnm?^$t=>X{6BhS zY&p3Z`L!!}WtanauVk&iM`E7p&L5Oph{K0mC7A^~>kMkd?^2>76t`xtCh)I@$ zqdBIzn!;3f#JP$?*NmBchWy@YN>>9;Of%g0r{>eSSvhrii5{{N3Fj!W;yLDfpdb!$ z4mNO#sG3H&P+1Nv9FJ1CjxL2?fPVBT2kep23V~a2h&*gGv;V!4e*^Y$)wQ7EJ5t3@ z31%wbHLTbs2YQ-KPkb!V0;jyKwV?yoyyK(^T~115%K!y{BiX@VKimI+34_gSM(7|2 z){NGEGAy|tz!++MxcjF)cbc$-t?qIeAtnRT-3Q3=f*85BPC8i%dL;935AjZAKg zSmtom>a1!u>F)&4Q2*P#58aO2m3sMK0B}T`-tu7LUWk!DHZbzjJghW>j*v3}Ou4-A zzx*dO1?{X#>2GIq_LwN25258V$tmJ;L{`}Gh$d6(6-p_8x1Vb~zamA$^u^Q-m`rd*q(N z^zx3qJ97v--ffU)UJo>xd#3xQ7L+tRl@-f0IQ7&h@Gu1t0`5AY21mxyb41HEBW#hq zKW?+ywBY9x(S;mX4-Z5SS;1K`PUtYbDVRTf#M>x<}^&&3luw1I}_q#*rWegu);WsDyjm+&s#V~YR{uEx2+DkEznJnl{mmDhD>WpHEg zdcuP}6@6?MN$+!@G9vSGOT}OoS|ECAM;Kp*bf!7&a3HG*hKaf`W;J~^VQI48O=zd; zLBXH-i7K^iU-?m_G8}hHvc^QbogZaVGbwIa>lkRBAyo3l6BmE~qstGTxcKw$*?-~j z@w+xD)7C1M)V9>jU>3Z`m(3Z5(7>!7n+;?~UPU10MfVP@gxM1P{G!T>To8dKIK$$) zna5l)re_%4HAd)-LdH~yi-S(yqMa8qf&y-5J{8jhJ;Vw3qDL5P6!Dq%BwD!V#9)IE z-EOmV7e$3GF(Yv=uR)pzlWR=hIGG~aUdFL3b+gFn4y50t%fJ=b}@88UdF0gVX=ZZ-1JcT^x7k=jVI#{d6!tQne(S z>C`t<&?dEyYJt0YorQ&kt~FRumRZF)h~AQ3MtzBSX&DwjnddL`*i_FJWSrpQtmlu9 z=-S24v*YUG2Ro;^asK6MgFg4I8T)fU2^yo*E552 z=Slmsl=d1VYG0L!Td$$w%bKvPC>=al?Hz>S^_Mpw zP2b^ciueS87^#*rJwybWKK&kF#(T2*qJ16SQ2#wag7=3TNhk2qN?o&OCUjPyBNR$) zO;5q;AF21Ap{w`00egj%1SxucVz%-hM;A)$#lZp0gbu9Fn4PlgJ@CDKad#{*)`H?_ zkEG{p+p0JCUMALwD)txH!{5Y=3z)LEs5TFDr5}EQCuAfm0asIOH$g?1rTU<;{A9Kf z)o6iBo2Y~>=>pakW6}cN=q?SKpXbRlo_hN!1OkqwqOyaC56P6EC97bZ7!1i z=1bODAoTPlmQ1U~x~-EM-q6KpU9ozhhme4s6`{jzZ5r zFpB-k&`er5v9|lySnij#t;*aevW2nS@eelalN`TisWU`6qz}%>hgP)yUIosLsLhg3d1OYG0>K}Yu=SF^WwD{c}LV1}0Fd1KwzrS9AStM9` zrH(M&{J$VFit*w?LIuxmuh$<8`okecDS~mCdIGj?O8K*}1squiR#>!Rwpi8v)^NLJ zzjC{i2#cNnaD$O8_!E&5!V?i@3fY>#GdvL@+myGY^@Wg9Td)z~XotPw>KP>t$iV~HyYr&eRC3-(1~*i9lh$*(6^vG73H6F&$6b56_Uyw;E66-CHwto=K& zqvMmXITJ$Bviz^o=2?%ZlV8gY`2dQIt-o|)h^jb&;@RI>spj8EE~L7*r<|7s#h<6E zIo%LKaFlDIYeORYjFfA7s+c>!0A*_c+V8*s`dIz#nP&Kd39}2A8m>!MYHk`}#IZKC z3hZ_v|A!H88~Ln8Eo0NEvt+B}$esP$JkQ%t2t~N@z*7J)K{ECtC8^G%?ha} z{7ca^>;`zb_B%noDcy3LSk9B|ZH}`m(z8C9f5aSf6CGH==XxfQN0t;LybC`sLiT}g zXyMnT_OJDAxMyAiPAlAhpngi95VJBdwXcG2pLxa{qS#{d3>o13I{!fZDSsxkFlmxl zR?`Tc>nYA*rRC7ErWsa-X0|_2e{R!enzyvuMf=GOD8{f6-iZ3Cc8k9EUBi`^z|~}< zztm72Pi`E8mWf1zSwbnaWK^8f}h;y`c zA^))~0*Osy6V?`KVa2ZlFdw2i9s)Nh`WTfzgv8R}Pw&>1@FLu)bB8ERB3@nN@)@oL zKlbVuaX+O?>UV2+TvY=w^u$3%28yBgUJh}oCHFAM2O_wL^Tji;ptJlU9&o%xZ7g_J zxtND~^7=-!CYIN*k*|r^BfQN)M#G_BGPY#XL!A?R>P!!2iz0V7FxmEV*W%w^## zCx<^|GO;*El0TJ|SyZS5 z*maOl43i{yQy55H))g#W8E7;3B{GiVgs1r2F{GT`5mqK9g}4>v$yj`?9Dyl~%@FSSUwB5FcJ-BhShJ&71=oG26Iz>rcn&AY{G_$b8}5^`8vn1es73&I6Z#rq09sY%NeZ_WMm4 zw{GA)P>4*ZVh(?6-9Z>uSC4OQNBOsIdI9g4+p~188evu?Nt$)Qe|n2^BhWnc12M-r z>8JoUR`&!4%3O#Y;3LdsEgY1>M5Mg}*vFkT{lgF)VzW(!Ye50&PymP<~u*aB+&(bA%mwSWcS#r^d4%>MAJs98ordx zrg?+=dO|equg2@dZe~O!osAuYr6%Rzt=KYokT%pwFNIe5M0hVX6>Q>^+O>A9Zy~4s6)@tNUuLS$gj5 zIha*=q#gwrS07)&>}~9$?d=b55JYeC1Zko^rma5mo8Hdbcspc^rOkdTk%iUq?gierQ>SDmnIFrFA^@03&`=Rd|g@Rj{>yA7HdPM)l? z#}O>-cqlR@SMH%#sfC*;<(TGwnF?P`__Ay9fR69I6-8sk)8P1+Ww>ERRW@ddU{gf} z<4O@x?af73+84|GPTZHn$JkbTfCqnLlZ3V}5g$cl2w`D9WqDF!xC zsle#&Ea5<=f*Jtu1x7ur2sm0~mdGs&B?2Zq37v&H1}(f#Yi5|VrD;y8Ke_Q^?}O9~ zBJ<@AMp&0ygZZ_U<<^X{#w?A6oZ)|M6=9(;KOzL?D7BTtPG9Xnn6oa*DPfVwhjDc%Z-{Q&~QbSNzYHWK}+IpB7rr%Pn38HB&90Taw6Fx#nr_VYxLv?OT5`XTzsU?kghVjth>CuR_G zZS^aYrN9*T;Ui6sSOxXSNsC{=dI$7ld}eys7Q{jk{0}l8{PX$f_Rf7xDb;#_|l z5!OFXpZKTlB9LtoCPQx)d!es6vXHXY-~J%2*Ga)!r9dVGBj({Iqb%NiS(L?MZbm_x zS{tX3G!1*al zSbyU49VAP3A@I69UT)|-aDPQf2VcDcSqC#g*7CF@mBu9kPXr^$7aT8RFW$|U5Z69T z5Z?35GXr-~uH)12fp4m^v#M_j&7}9At-lJB3qBBApp`rowc$cKbv!#BSWXs4(Ye1G zSf5}+bily-WOPd-;vMxbt*^k$NFO*`(=hdW_S{cbBv{J~QImWcr+zR(68?2`jm{vzt&AD zO(Z=wF=<-x2n(B($S|6tLtN(R5SQja5ySaZ&4MpgqnpbX;E|Du6HABeL){`-08VOH zfP0_@r?e^))~$6&s!dcuEeO`I7&z8@vKm5-gbdb89in04>r4ROte7^i*?p6OeWbd! z3ii=ZN39owvpR(Xd8~QG7`;=$xj_~TwE=JFmP1*{!k85?D~4y$5z_3Vps(>wBw2|+ z{V8U2RNc+{pcB>l3uqxy9?#vh2(Sze!9_y7P%eq>vF|n!hplp{qM z=<+;x9j>1!6S^FKe5+IlZHdHYiP6z!r$S+MMvRmNnWgM$V?8F|s*{^lRAN1jGYTCA zVL3>Y#pX(A8j{7)(0U!FYRet7d;hSSu-WS${i9YH_a=|9W9d}wjSVCEO;g8&F)EO7 z4iiA6g>doxJ5m7oFZ4m#8jBEujL35ad79ReJ%Jp!IbEq$XYAILGS=3f)DVSyQN_yH z955uRfTvJT7yu&hmIRX|e!e9MmXt=P1P?%ngUQ_b*;@N*mU&GdLd&o!ta)NA%#jE% zyhV3kaZ4gL<*$`n5}7`{Ynf+w-kg`q+LRVh;f4^Wmyhx3o9roAC@`e zfby`y?HeI>Z!gLOsNriOh}ynU{*DNz6E^OmeQ0rlqc*ROIsMHpUT!=UK~-;&M#45; z+_xs^*u0IMNZ69LlFxm63gjxRb=oiamp!4W(~78-USq0~0g3lrf&?=hNy?YY4$w;x z@o5VhC;;@t#wVqdOe#A8Xc`@`mq`Eb%Pg*-;q?~I6pY{tN1%%T^500gEv#RJ^^cpE zGh0=Y9;(Y`E=Y^ZPDck89jdTP*_f9Cjqx>3NtNn5fJ9HY;Jpr|DcQL2!pU{W`{SdIqJSIhN zhO&w%iKKE;_C7ilwukuhEHP3h{~I+BwuVd^a5cyyPGLGN;ZzK3H=!tm2XEHC2k&Iu z_l;wk|Mq}pLy;caUDj*{3k7LjuqXhUE}jVx$<;Q#qO;zW`B^GrW$e=ezvEz%s7!#t zV2PG*CI54h_nFp<7ayg3`a>rqW_8!k#Ns=C4~(nZsaeV7vJCnEhtc;a-)6@H6-<9` z7Nx(JV`=%VQ$J;gE+%%ssPq8ME$6=tbI?qEiZmUIs+|B=P6#2QqVKUi}O-%$QG)iTOzeev~hQu=@#uW67#QWjh+1?A|*_6WH z7wDB-V}_Fz7QnJ}gGZ4fWCj;m-&|Bnj*Hw=F0#G{`?I3FMxWM59pZ9;R39#fN-SGd zKczU^ek_eueL7Ae5to;7d<~Z~9Gk=C&XNqk{n_2+wfgj$a+^NAuDni{*O%Apa$mWo z-|jDW=<>iUkf+@iUtitn@sIH3xKM zukJy8zXeUOy+LF{A{>?qLh^2Ll<+Q&21}}y`Zmz+`jJlk9da5T$*JaY1uoU+a8s}5 z3+|<3#FTV`Z3gRKe+?BK0&ETg) z<&G0cd5wW%#WlrsuSP)6l#D)+7S}vhU0bX^Lbqf|#gPI3UGsP-YO;XdV3P9>q}8IT z)1}$*V$p>s*lRq1b4RgA@9l7;V)3R_=buOwY&Sr>D0ZMHZz!%n%Y3@8(|z2+T7aBN z+it~(a%;TEZ%*f{c^F!Qyg5Bk&Y>I?G1SpMZ0AD{Gd-}6!T#MMFUIf+C0(tTr*#Ah zuGM_~9jwjFkkl_7m%iqtbu?=>gvz zfws>faF%XPUj*NBIm|(5?#om(v6Fwh__rJCxc;&7+J@fei%LZgsp^K;QY{zrudp3@ z4cR~!I)7$fzu%;yx>xwpEV3Gzl?<-BTHGP=Z}q;I!zQ^%{m<^6at>rn&j&rWToczK zt5>tVP_Pq_^&b{FVHP?@;z+TmTXE|`!`yee8nN=41@WkHAN!4pCEj$QSb{z11N3{P#Cxx?Rgr>Ij=AGT09DIz}97PH`A^+&IyFJFUp1bLb;8vu(&kqw6#E$ z2F0TIRwwabuF=*qiPx!VJ8VQJ8N2WqyjG+qN->uFpg(~ERuV+BmWza_-KaaVx1-}5Y~kcl=~FO zTe91KF19xrmkZ8(!46%TYQYAnbt@L1+ZqaWEUi7s^pFNWl6-l^jm*S3A#@y)LB%eyE zie=%p0$_2C){32)MA&8zDt6W6?W5%?`+|yIKK}=rr9vVtQ)N zt9i>Hb^}~yl30oahNSnt67`|K;MUlnm~pPyX?w#EFOy|B;0mrfAoX-G5INJ)6=}c9 zG!ac*B`a`Gb(Ncf{0T`FS5b1pMXSw->!=$x)lpYBS_-&Z=wRa<{r}uboch`mY zQ8_z>Izv(}Nvi`VVMqi)ZDQG1VYRs7M8bj}eB^GHjungZ(h|{O!LFCkzP`0!!>25( zX<$~Nit%6{+TV6ea5NSTOap=e>&843@{BPN{#P<4n7lyKuy=dyM*yN}C`Bb=x)D3*_8Z{V{3C`B6v#SKTX8oBN~g4M`%*Ac8n zuDhu+rz>G%GCl{z6_x=yD6Zt-A${I+#7YAfHy*`mH~ z!D{4M9KmYjS{}h_+xOM81y9di#m_w zznIqLS%pBK9{+C2??zk``1}RfrX`3d$$u&<6TDq6?gX3v0?qLyfX%m;ooMucHgrnM zIMs7TE6*L3i9?U|Q2wa%W!Ql>@!y;)IIaOCT<%JMt~}epfU9895&jPMO43J!D|%;w z!Y1BXbK?XGbF4&ASc93hTin~U7>i@HFthfJn_*^mMr@;fBM}{S7%>-b?!=joqLj7 z@bH49b*yj4Dhwn_+9kS6Dw!_S27A$2%m#O`^uI<(`lA>vcG;|wqWJpSOaYuWmS4iQ zK3kx8DhpAu{7<9_0@YFyVn9wB?V!O#4rp#e3wPDOnZU!n{5Eb5lnXRAaQ^kApRQhv z>vpEXxR#HGv0x^O5(9)50u{=v)F;Z8*!F2d10gy^%0?YEK>ZMTJXqrg6kR*R!YH9} z#CaCzcs`W^Tq&hQhOCr<$hcA;20>mma&qM%XRZU4e>4KYzH# zoCTlACV0C|Fh-aH5+pR`=j8m5*XVEQt9SB%$u6|eAVzjr4CnTo#*_Tjv>H%OYt=I8 zF@$oljX2{vQnel3esP;c}u*{n~8#LSnRZBf^f5DqFama zLNn3G2^19kP?*6*US8}*EC-RtUZFyj3u8(Zce(J(i{<=>vnc)MqCU`kLfC?6<7?Rb zq@ev!(Y!b{S~3x+h%Ed)1TkZEG)y((t~jsrYB|{HgiXR`m&w~?G{p+4a2HE>s2ak7 ztTL_ff(oPdc7&O1+ih61##{gl+vq@F$j5M92#ZSJV37Bno#yMq`nz$^X>Hz!&iXnM zKMtQ1)Fdj4oZ*{k`o$IbSF?ys9Z(h#I_w)486Ws+#VVi+;v?uW@X=)3%b+wq60;OL zY*Lj|5Z2mv!sKixxwGagq!^`j^jj2F-nF6R2hZjlmeIeRF(5Ut>(zfwW4j_W=DT5r zq2rUSFq?PWcfJGxFzI-+35M}DWwX_9>gyLZn?VSjn)kP-(qY%()xIre7e9e|nDA}t z@6b*JSC+(S29V@(wwE8xE?bi>Ph3#PA@Z_Zg@iasS+E0i-OkzmqE9E%0E?fJIN zMpqScyq^fB$-?1TBgp&&mb#o&zL(9equ9pvb@lZ+23!Z=c7%zH=!`ZukC?Uebh%x! zYf3Ijg%qsnMvOhE44|Ku%Gl(-enH;c0@xkDF%gnGkKF0EX`Tp0Tt~4(I0vI1ok73inA_9KwcWyb(}M|kuAuVx zGd|0oH=lNpwS>v#M?`$NJXqDR!i8h9SGnM&%8|u&l_QI@Dn}M)RgNqZFGm(H^`%^J zNafGskjkIM1C>9!-ThhoQ2Dc09L?_Gf;TFE7H9P9qNDVgWZkn@zO%d0Q);Crn}LA& z0`r$>0<9HvV)E)zi3V}sEK25 z5rO!_fyR`p<$T(qrw@@d7eCV|ZF?)hXq=Md9u2wNC=lLI5EA(;7q|}d5i_WB~fT-R+@GXCj6!;kw#G#gC%C8 z^?oZY5g)F^nNAK%OU7|Zn+avTV-58t!=Vu1@OQ2JqcHj0OU-g2RhQ+DA}=A~nXu@! zte~k}plxL|NxmzH&e!!vKAo~PBLA12@sFn)ftTs*t}SfEC^Q!>J(N&1hTRK3CG^5} zUQBZKgWnBE#4?I@H-X^{go{*Rb-2d=&n7gnDMl1BTed(99*x)lra(v)eLGBUhkK`< zh?boAM1rN5wU$0WN~TXffy6k*QZS&yGDJl+EVaDVx_LA(PdLkjd+O9GrZR)NJD@E2 ze;3`e2z1mFPDN4Nsf8uw7DJejsWx{L+qflp1>)l}_ie_hj;Pgd_Fl+*R_c{*i8+VP zoXtVeunUU!+b4;qWT~`LH#G|xTw4FFNF3{Bq>Kx}5T8xXl1(V!Ve+5JIoN!#$mS{i zU#HW_`ojSPZg*kOQd@VhIG3fvVb}i8(26IqRtJlt(Wp1j|Bcu=Wso$m1LA`hl8}B5 zao<9tFd~|eS|c4nFEBE~91BmA zh%$LPxbXJ0`7}J;SE`cLnGo^GeTgrHUp*}>nQWZGj)6S+pf zBMdxK0gpZ_8Jl8x-Wk|LS=C47fS^gO?RUh0dH5E{!vIg3(Zm& z7=m9`RDtP6I40h25~!bz{Y~h-;rax%qAw>% z%IGs|POc$H+nl;H%)i0mB1OallWfob6?!}}tRSdG`ezK$9yuKvTE5I(YSouCu<$~? zl>Z}^HE^%N9nOmL4J$4c+gYN|ah@zYf&67n_8zF4`iOuHq|!=9{mmZ+#?1e51Us8& zfd1|)6Cr>JAaD0V{mzTso<81N*oi!toVX|G4EZJJZat6wqyD6=T{+;>@N`SE3v%=#qMo)3mFS1}GR*7lM ze?6<8PR`cZ%g^(b0~*pl{#IL>IgF`tM6iDG$!h0gmSq!+5!M(`PP4*B7y+WQM@*4i zL81<59ewz!JF4+{%Zrjn;nH>v%HsJ|q5~;|*`a8IJ@cY77BFCy@1ze&F(LyPU$ZSsb2Mjj#N^C{$qCARz6qFV=)a--r*>F9EP+ow-VI%%cZTy= z4o=bMBw*p})X++mG(pGYr$$I9KO@MpHH)MH44-_g+Fk5auA0rJpqn}TTF@{@mNBGu z7P}usxRIH&PMQrC!-N$0ZP%NsohL5X(}AEJ*^UGqux*PggeSq&wJb6MwrNYCn>O>Y zY&@p%6Hsg)iVg8Thi$~OO6ZKYJ6OE{Lx4K=i|qzw1=QMJ7jJa5nAylbLbX_DoOY9Y z;d%jnqLH|2l0GI*4=`+Do(F_&3Cj{^iz32k9b6`4M2G+N+@zLL9IG*z(Dn{s+$^tw zGu;OdiRISE{;u30Kqw5V}$oMa0W;Dnmd*=Ww%-!d%-D;u^J`WXs3 z0Zm!H2HytjV&G9&W|uh^T%r9m63Hx4o!!oEI}py(0V@IUb5PCqGJXU_zSgniYb+B0^;#y zZ)>-nz%*hU9J2(n$9BVnI-*~u+>~i#kE9eKdjNc264~2%)Q~*@K0$h5d4lx7`R?Qb z&L>E37m!{wqkcbvct5>6+rBXx{>hddh4q}2&t`6uWixAT7lgt2a<#;pP?p2IF0!Mz z$d2N2*s~IkL1KJTG@Q$E3@9!y!-(K=1_O%AorodIK`I)~r!Ck~CIPVSZIesRT9INX z61NL3p!j4?J3@8`OFR~jP4f@WVed|iEcQPlIk58he!~Fl%HoOov zH9ufEK3D*b?uI=HvB6P$%0)9H!Jnm*7HxZ~D6zoEvCLIfgU0iT8&|c13C#KwD-q=y zeiWR_=0IThM=?Vh1W=7qK_+Xprj4oEy^7Fur>Y;c>4=_R4YGcH`2LD zFL*WgF7c?=S=!guC5Smq_A#6~a0Nj1VpgHU|_X46C?1%D()=~Me-qE0I zt&(NTZ)7oLm*=l7wuSf|DaAg&ir*pI_>~#HOD5L1esTR0nj2Ej)5Bx^aHb=HCFWz1 z-{$Lw@>kID5Y8otC8yk5#9p|M^-Aufu}-o5pqJvslzCBo*qhbZcv2kb8qyoiS`E{d zR3%`IH_U>}0avt|&aCM=KTol2HO4sj`QB;?7n_qU>+KYuE#{u8=59?%r1u*F&B>hN zT{g*6^hSqb>BPnSRZ$y;0G4|O{h$d)gym9TgWH&eNo=?q5_I~tM}7&#=HJ8}A?jRxX1^>89mXI$xSUzLQ zJX$9aEddRfe@w{o0O82yhDeL;w=?~cwWJal9Xb)wr7P{N3B`s@d|&CWvj_KrN_f?saNUV{7b)lnShk@<7 zFf9#njNGMTNs~D57SOb>+2n#N0jMAnX5D?e0ZFCuFD!RP*)O);fJ`uLHy|xo!~u>q zd*Imk2U3D|OdniAwUGM8v)U+Cr*~i>)7?COv{$D3nWf`zg*Z8!s(zS+Pj2IXIkbmm zK%-Ju(Z0_7Ybu6GtuQZHec;p{g2?_<^D~-asud;L5(xF%VJ70^pUE~RcWfHHMN@hr z4!gFWopLNTs}3JbmRUnaCV!_<3UQlqmOsuqMMBUTI=%RlI|VV5LDYUUOafHST<9=y zkw>SYF21%p-VJd%U3i3y`<#rD`tyH)-+{mI4_g!znsQGn&EJtl2$r%lmlgYuBxQly z@t=JeXIbvIbIN39?~D`cXC?c@t;O3WGe&l5n637Wd2?f!G8pqzoUF->+APWb-%S^( zXqt%5shS9|wh|3|>7whIlKmgN&KG9FKbopIN}}*e$B#O&OJ3LoG*Dk+`x-|Yga!BT z$x}1Rv;+B8kk&d>-{Gc$gcJCsQzU1XWO9h*IuF!)saw?*T7gefWcQO(X>Fz=QGYn& zG4Xa4UbT=+JL0E*{gS|-A!MSUEZSH{+9Olh z<6kI21~6OZk;KFJM>k2(XytDaN=iyva5ch(Tsse6Zk^M`kl^?1ZdS&V z7&Tg+CuD@KnmIW6RcZQAkvv@{8N_}t*^5hKB{5hM(yu&jGZ(%*ae)|2`l7U|GHvcJ zvJq&M)ZZeMBM?s$!H1Tj`au*z;%ksNYjJBT=L?G9tOb3I(Z)Fow#L%CUd)o| zNP;w*fPt(7TLY%iKwC+PTAO(z&F5=?MlIs!X#P&-71>FL>8^%VlR@!TKWI+1StLbN zOQ6>|4*P@IcaS|Ni;TnN^;r|wt=MuzEU`||i4rHnAWDW3C2Xv;atIh9hs4z@GCf?d zSZI##_hL$NVaJ$#LzDAmqCa^9j3r6d=OG1eD@|U}Q${Zo7~^4vy<>zbLT`0kEH%tVu~*bDx$%k>hPsxoU(fOA2!<pMRThA_v!1l`*#!B&DtH)nI}Q{^7Jr2$Y^u31Z@< zge|Pnw~YCYWWO5eh|pLD2;eSR>DYB)e)E4y;^TQWedCQd$R zpnY{*w6BiKT4@0V?W^OH9SOBRMiO4?k%TQsi$ym8F$3V35#m=gRxJo+pF*LVqEQPe zvzpNbsO+#8q67?O4<+ufkoS63IelP=^tZAUmP|l8D5{j_WX}{6M-=?bW~PyD-K$vc z9H*?F!(gDk20qzR!JLN^-zy~xeuz2BB$_nn2XLGW5G>H?_G!FwcvyE zv|?W!tGL0xS2MQ!Fsz#B*tpfwFIwdVNKcUW5CK7{5WEA1udQq5I8HZ>(?|tBHC8`u zf<^GfxuSm{>EV<>tE&6}tJlAzmTLqFd;N)N;-4aVepRw({$Rokn$JRdoBBhEa|Qe7 z*C|~)FQ!y(AeNzR5FF4EJ5PY7lKg2axGo7rjlv$!)!+C2ln^=wQx@){AHS4PWRs(C zlO(lb*2uC`U|zD;KKS`edkTx*j6g#*aK7wsbePDb8tA-vq>fTh=HRPiy^mf7dy8YYJgWI^w0TW2zx*2{v%d z1m_6H`?}{<+0fB+#iE1bJnvXluzL&++GuvOmUP<8rA60wz)*A}|Me#E1X##<0yIcl z5urLv#&HNkON?N)-kPq(yGAAC!1f^I2)DV>e zd;)Vm#D(*?1C;X8s1J_|1sQ(_`Jx*IQOmTIcq~zK;!YEm(hhvW?l4OOc$10hUWm<3 zAs`qAVfX8ov@N2>PnbA~@&5f3K z<68C?5>J~KEN>>-U$Jqs!@9D=`eujqWrrQ@9JAJ92h#c&Ds+G6n3-oP=w#-Z>TvK% zi)UZl8OI|9BP*Q8@Q5_Oc_4!lI zUk{JM7%K~GchV+x|!&5AtPm0BJ*@AiuyKh`Q$~#Fz=}W8y=5Sfl z!fvdSaL&w;P14X9ekON3nHEzd|5*}G;#?6(4s{z@dWkejGC>)i(=9=y=@!7faZ8C> zJUuzH$qR>6zN2bBtVSA?PJ8UBUL%&fE`?vP==Dj7$gm>&Mpbr&Y^6OFAv}|gEVm3v z1IPg;PSQ7rI|TQ2^54UH@};&|nNtVsJU>Q{+F<8ge4M9Nnx2P3ByX@TbYiMcM-!SK zv=tp8Ga z9IgrZIvM}-xomEug>q;j=uLJ)m`?v(rXdm0KVK?%!^QSEs05}ZR;dIgUmkE*X$$f` zu*fyqh(lFi93nS@m>%k~3h;O;AxHKCu7?B}f+jnzbV2(j&7YWKBR|FB4$&F3B&Ru^ z!?b2%={trqe+}|)#kf(4Z{C2cf&{Qc>d)&yf^)EN(SM>epDb_{*_Qde6Z2W=P|^V? z0VijRtgxZ~#yyO8Xs0fOD38f(vDuTYZ}8(e2ieFcOGfvE*m=(Q}M$ z9}N-)hMKQeY6CnJdI9=5w+D8)c(Hqq5?=WUWwg~dD`10FDn}5zR7Ld}lH`+W0e;~Z zE}TQf%=1w1+<8jTdE5x+4cg=`mGtL3OdXps@FQ9M5`TiC2J8I8318=s1jHw9uURe? zA*+iQsjbVX2eqn-X#yBd|GUOovlsN}^ZAeCfAlCTWWmkm%c`E-Iwzo$e7~1rO zwk8{=gO;0|D;sAM147XZ>Yuip54nB*aK_y9@Y^g8)eicSM;RO;64ZkT#?@k8{+SZv zf?_pyZF*SbbD)M8K(1s7rJzl<6$^tPe`8xH6Pbg-C8I~p9IK~nrZ4)|6&8y07FH~V z?T1Ys88nu@sXMR&x7>i|iYjk79S(H(LrGAUb+T zHX4!UzkmIvRJ+a|I@Q*2HZX{gIX%o>ph!l+YeI$s$uxPdgb*-8f)1RdRw!-u@I(o! zmuCDA!Tca;#CVh~&^^+sn?DT;IOSh%ybf|S^AaN*^DPLFtScabmh9xyPobp|1L= zzr;MtAIm0&1~G`tSHYi=21qd9-jfMcxoqlt9d0*+XKKFMJZG88Hd%zlJ4}ivK!|Xx z=DH9NCbCGsBH{J>JH?4(k39N#{wL^UD2JIu1F}`a9qaK|aidZcN+?{fSh2F5HBTN) zw((PP8gB#Lr`xhqwm~V$SWJFzO5m#U$T2l5G{9N~S^os}?vFi|0DX0OqCQ~X!|#jVg+9eJ;n#R=FrFW1nCQynvDQ^DDs zakiGd-pK=8KX9}=6^TfNCO-g?Ms<$@O2chQJvfc+;eBvb-eD7byQ5u7G{1=*@+~9PVWTb!P;_Drv5$z9#j2~>n#5m?CZqiXO}eAhjjxd zn;6{5FajOD`dyF6kkR{ssRs#8-WP1Q`uni zAVX9JD+VO|TnAal7~31UTf8l~25)nbhUGHtL2Y4ywTc-M%OF6hTl5I)`%~$ZBWdJJ zq*Yd7i&r!Xi(JTC)J0K3E{YOz zQIwF2qJ&%y;~jI+ej_g0Z^T9WjksvP5f|+@;<5$Oh?VxKrgvJF)pksw?A&>dxuhkQ zZpf=u?}NZFKI5y|hIU zzWWrz_018vK~eLTCqGB}Zj*5dy^W^w@fXwJBR$GH|s) zohr(s$88dG1zJ9$E6Uzi?9}Q_PKBUCHx;A_liH!NFoT+2;@bz4?E!Pn8KA6tJa43w zS*Mf)YvdWEF0SxLPV&ibXYSbrYq&=i)PIRwQ^li|h|HF1#hgZ77;NOxGd6w5Ef{$s^2igB zDTJp)WNObV5t$A1BqB$d`%zCl{+UhU6UQdX72HC+%SF7)Wfryt#}V%udaDROpA?_q zqWAce#jnxom+k!+thm7a&=49@-z$awKu+Ad#NQfxUIe}nv89Jdu))Sd>K4}g%SP@9yI zPGZyr8F)c&%r!Y^eNUoBYbTL{T1nJk%=`fMW$A8)NI(kGfGoZgKWBqUcTh9b!@}gK zE37~*289&}Pm8cAv?;hCD5W-=uK3Y=JQ26!qN8K}=pyu6>YWoHJ2BoSLAbj4|GNc7Lc!5Y>mBlnKQi zOopc=0L?CuUXcjIFy^#EjwR6t`7ao6pQW-8AL|Q>h;fYJg1hyU2?&q}60x8EJ*O~6 z@|`v6p+3f!jAI`A(qD?F7bkidVjZP9UwEvi%}Jc(&m2hw02n~9Bb!5gYe`Dmu_KlmBaQ~gQuJTo~6^czp&@;>byn#F0ZB8=0Bcus5 zO7^@#tkAlsp8%=!aA7fc+Q!+E&m`AfuHgIz1c?C@P*j35ZAW; zc#{7k4$Sr0@Ms-_jPBPb5(Fdrr>=~$xVa;&BtL#{1D-cOMsLbo?))dR=tXnGWlc?- z6W?L*)=t*j7-?$xN#>C9Zb?7#q4rA~m_v#tyaZ#kvTol{;iVK^%$&9Clc_?hY)2NB zQS_*g73Ca!1gxh-E0b`!9-6Ap}5!D7L44I%9oC6e|ql9>1pI47i~cnhS` z6D;|#(ykvlk-myspftL2k|-UqqenYqdo1c#?~?X`y8BDCE1)Cq!d&W4Ffvb{h`2~C z=K-QrE!O}>&f%Vm5enSuW~3M<28bHLK%t@SKe(Eyt6Nf93Cd8JL35U({2iA)d@@jJZ<_X2}B_tub%6})Mv5)f5Wsd%DE59VBZTq~hX zHv7$;%u21DCIUyW;k-MTKmnDBbRc6XzCLg{HgijOK=vX|t+0g-kyw~QCP!B4ht7f0 zL|VI?<5n%yYce8c&_o_K8Nn*Pt@o@_Vq(b1THSzah0K60EoQVn329;}w%wq;Q^GcZ zk3ZLl+D3uHxNGsgW_In)Ft6=94>fm2v&QZWK1Tb_1I?X5GxGL7%Vr|P&0az=!U2h) z)#kBixs`6Uc#4lALDhNf0Eri^yd6w1^B#UlDc)11S&S=;WZ(tsE&VUmi67V>6QKco%+AfFqJ(c*N zYZJ=aISsMCFqybY(23;eAnO;qm=D=(nZ=g#bV+i=pWBZ(Ad6oaDwdkE1>*FCZ0}!`3Z%~$Q5}S;p7lGv-<83Xa*E2J z$et*APn<{}d$1av_(=NNvd918X!l4DJ3)Re$BoXl4F?pJ>j5Bvx%`8z6bnOqwI3D1 zmQDm4+Qw|023amfU!~{<<5OK17ik7gByKV(9ScHJL6K}->BPx8pY2NarKhZbTVQ;s z4LQAh=qTM5;zr;q16W%WkoRows4&jBBGd5c^#&N6%5wGqP=j*54vFZ{=$26%IwZ{} z6XFFyg=Ibd|u^1kQD3W&59eY$_zONX<**@4E?Q9^Z6qEk(G=^}~9MgBV%8BAOx z5xFQSmWy(wxQG(D2z272w3JKOx}hqs6QlNwWE<+ni8}klq@^vwY2*AU`?@l`>taet zN=%7Jw7$%?cRbiCK|%i8zXblCSWZzm)~Ofb^XD>&Ewgs^Qh5=An#k{Ba2Kn|{sJBG zGPOA$GO}|`>CqUIT48u$0x= z>J6A%Ympugh@()=%lMaK7wsuK#vzZuXX*IeosGalE8YlsZHY*?K!J_EX0q$_4uk=g z*6MjH;mBVxDW#szcb^-Q`k z73YP(1Ms^N?I6!21_Wi2@T`cLB6A01o>R*~#(G9URK?NkM=Wj?YjaMIU{RXCeg;o~ zm$K&(H;ohE&i^z0jp+}qTwWsz*%G%0KraIz(6>=)!VCo6vKuQsa#e&pRqLs(ZC)A z8&>x2w=2vwYs1M{>9$2GNAb!Or%>bTsF-`k>$c~m%)J0r;C3WPt92`F~PT$7=BS_XyX%USU{5IbBmr@?vUDX?0b?p@>go5OMFYkR4!2e3{1savy7F9 z7>YG&0@(JMPDGyiN=+tE%5k0xEM?EdGZFNhz(o~c&Wwk6nTNATE&n*lU$(41&iInp z$H*ZI=%KC+G%$!Ix3piuu)VmBAanD zqo7XfHoEwB|NCAHoDhTiC3V?Q$Tw8TG@Jy^^&$Dqj~pC?T;LuXWouNdbvm%y)C;ou zbARhSbjxiJkavJPRsq%y{N|uDz0gv>_VVy$_`a2(DJdZ8CpNT!`hRy5JgQ|GO{gEz zeikOUB;FaUM_0;hSgV0RsqyxKv`VxuEt*ZHH85@()6y7ht69EgE$ zWX$O6Y-Ty`8Bw*L?oGnA2(P}&MQ|dVK05!$Bgl7#ao*RN7NMWJ9y4H2G;=GnOwa5Nqpe5m*Ic zH-j3V&Ndpot!Nv;`lLiRN@_tMl5cQ{ru323KpAo+TC51R+hW09L1#X&(H65_L)q$v09>)m z784ekHqi_!0<=PJojLI7$xWuPWu0!q9hYPTgF40CGL+t-MBOHtL7LzsPOI-&&3~k; zFXW3&M1oAc$paX~}A2OdC5q!2%}JB@lp5jVcXM6GQldDisL8Edl|!2n67w%o8rEQq4tGs<~`I=?1mx z$iN~5i!F=ejfjQo*DA6`@E+F;m~m_zltAFboHm~7YxYCu-%zQ}g92bdC+hq%7P8iM zBZx2m7BphBVkmPZCu#x7Ga}JjYl~~{E*h41XCflFH>x%^QzOGrl$2taL+SJG0}!}2 z*LnldV^8z-odWDbf42m4Iflb;Wr_0-!V7qE3j3Oel)Y=4>@PjjgRt`B3 zKxd)FRgzeAEGk%;vx5z`*))oUGtx4?0R%@`TvE-Xx+$s0Q)YUT5I02?7$8;wG_SNC zqTj71+9*uK!IrG4Z`C-Z0HF;?ml1|IesnQpO5#_lze}s+nB?8rVSl|!KrzbN@j~To5LX7 zvGtuP*9&B%^*9zr|12#?ZXV;(Q(n)wTmLyWhn{N|FPwvGs)r5UNj@ z|NQJL;%JPmh3k@F?2R!vuWM|- z+u%Y~G@E=nBUc1W`40rZu6kK?4l&EK6kf{s+5O;A@V>4q1 zP;5|(8f|7i830MDl_KdKPi~`{ujDJ)gfdq;Rz5bq?6Ba-O*hF+CocIuURD@gzG zC|P;{iYTD)Ir$#!j1mY;%{P7&bxd0h^{@RP%R2$5Jxk?TO(L6*rUTaZpHN{fYktzT zO(WIv3}R}E)GF4obSF$a`}p+GgUWN4po3C|f=U2k7}b{G>YB`Kjd zGgfpVkLNj0Pp3ZS6Y-U;iGX(Hk=Q&;MJP6(hmP;c>bUzsat%1u^R)Vax<1s+2G1IS zoQ!|g@&f_#@J~k(NVD|{$5K|^0NjFg7Zm_<7sruQlxpt8hb}yF;;H0O%tp4a9))2g zfttOPa0fL)8e1($55f!FDe=9kU=y~RWD1!D9Smv68e2@~mj;a%Q<1v7hm%1%Q|4Sm z6-Wt%Z3%APnqJ4%qz()$XD6*IojXM3Hx3gL{J=g5@1@Io88arr-`3!sK@j$X(S{id zy=VD%W5v13@*C(hdjM6bs8Gs>ZNLnNO`@lRp$2{YEbnff^En7*6P}OsG`y{mo`ejc zP5}=Rn+Va>C}m;*@e7+E5SIafo5i#RVu^NR3Q(kyACx}`3#+5ZwCva(GDV}(Wj1Z& zK4IIfY`UbbXZ44M~-7^q>~)e#*onac%Vr1i0LNV&cmzpijx>* zJnK}KDfJr%#RP|u#iU3;C;u0%__blI#`>N{qt(|_&F=UN&6=*$T4<*6An*;paRRDi zhIMhboemfPw0iit3rf?Zmiiu&yJ}m`yBsQV{r)OoiTh{rkyTMp<=l zNml7A1t&GQOjF-yCN%F_rdty19c+Bs?}%SAtdfibh?Qh6K47V?#CL&KLT`*tJcKe>^~z|p8X z_W>6CF^DvisV!XGn^3UtQ~pi;L9V2sd_B#`b%M%No(0cNf2tPbxc;=?O2tq6g^h-6 zTvH8Z{y4|~9y?bTr?{5q>hje2^WX!sSqnBK711)ptyljpaR2Z90fe(hW&~6qGh*^} z#@7y-y9i6_-+V9Qo|us+7v2Z1NqMCpC3y| zqdM0PD_#>HIr>XRV*-R^fYR0>Bpq}{)5q9I$3<02xoG1d7i~P`qK$`KbkG?W9dyR! zo^rP?uPM=SYuW3{D|Gp~5>H#Zw%J{_KfAZwr^`2&=s*0za<48AmRIR=F)gpwb?a&i zf(3G2z*q(ok=J3DHP;j2R9B@IORbaY9bl)hpy;GGb;?e(d(7{)?THZR+({typur+Y zg`<8Ee#BV%S9+{Lw2Mxu!~4{8tIp@LecObz-U zR1OINQV3kgWXK%gR@B@Y`xD`0Wg>%N8*kUhiGpej)HKyBtz}=-;xk)%nn%9K`+CI{ z5mnQrGs*dGh|Kx!%#SYqyJg&OkFsUXG%}i6y3Oi_#q0gT`ulYvM z#~IffMf^~Ty@9`Nf38f(S@UsweWBRS(^_j~x*5SnniL+WBYObsB>0KwgqUo=1v%UZ z*v^jb;zw`F`qBxOqHS6pjEk$RLQ$n-hvEVF^PVTl1>D~5+*FdTz;WiyeWNAB}C~!6cal|Tw`$o z&+&qAwp;zz38zYVEPK(JhoEGqv|X^=<_M+Asc{7E8Bs>|Wd0_J)CRib4e|KLWo;5!-Vf>RE2sr}Q?;8@##jJGG=-Uu_3I(ejf*WAr9OG5GP?$$mQz=X0@uO-l#iGJ`vP9<(wAs!R=W@e2yXcod5 zak)q!3N>0CEHt5E_Qa!Zo-7@*7}gG&?kEcC?R6q#y5!Gm;L-$BS@4X_fz;*v-=uZG zP;(p8!a~D*si`OmSicOaCc?BXt3E0AJ#OVu4BFTC+s^tAW0op;ZPkNr`o&&-t@|uB zun^V8S?A^PkhvvgAqI$+*M~RTbR9FtL+5LucdRT&f$ctz!1a0dITb@`Mn$O;CGN-4 zVOQjTCyEaz(=BR3q6mtI)BQ0vH{wh5(Y2UXIHPXrWPVtt}r{Qm~o)uV70T9PCS^<&v7BS)gqyI+MP<#v4tGzrX|_OO-PW?gXSGe zrYivdr`yn3c$)RqVy8*0qV;s_V2Y(5IymbOch z+e(Cq(=Ef7y@AbQu3F11X8w4uUiBuM9eyVKd+4rSh*3!?z(B!u=ryiGeQoFG`0zaAI6i@o`~iMslW$&8m^STflu51>VR zYu;y!o>$dt&F#Ke`|USlx&7^*u!JV$N5e<}i}}*D*7$}n4c9l8zzy-~nF)Y@1QoOb zznTgRpAbxw*BkeynUH+q{E6KzlGR@#hIrO9M2qm>&9i9hI;9&bEgZ%p!c zk%Sdrw^92a4E@?(zwOOw{$suRVC!DWMVKuU$odLwtm2B|YI#7BY;LmWci^wGvHd20 z)(tVbaC7)koA_^TewzY6xa&~3t4|>Mkl!^46D~A)LN6T9P0&z4_ZGv1+-avwcH}o5 z;}eHXzLbjmyVw@+3`~*JH;*?5#K3xAIa|FvT`JQ4VNp9WUu3L<&o^`xM1hL zp3A%rTeypS+%oYj zvFBMd#;V0Ab%!<&BY(LZlj`t-Ph5n%a1rjpMYs!>J7IV(cLTq0xd*_7%WHsNxV#R) zh0E6gxNvzrC=8c-L0Y)nhm+0an*m(7+>Z&&!WFTjjkL+wW{me z)ACwf-;tKr>H5yJyk6ILrzNRwYuOK_^+(c@q_wq-vrP`_`b1jp*Okp? zHx>Q;+0Uls5q03Vg3!w z?;aTq?zWG3A^_*nkjiy=q}ZBbUVJCBulC z-AL9Yy%04r>3s_$x<(igxNGaJ(Y!WrL_=7s@I}_EQuqvAG3OTrk2_cH8W&|bEL42U zke$_XXXkjalg?F3+(KH6o-|~K%~>4zv+Go~jappA4SWw7aAxj0q&e_ob_$uvMDz|o zXIxb43_nP&VUa3z;81Y`|IKmE5J%GxKkC!;ljRZ35(bN-RM!lS5`ad8{$Gg4wMg~N$jxzXqBAtQZ~{}`%y&l>d%oi(FN4kOv39U z_X{Jhh|H(XsZig9GZwoDB@OZ~u&r5VMTNfo@8lrj(9Zo)OeWUIAbCYsGWbBb|(*!axuIe+8H73UpNKA;TcZSHsQ7ei|x(-876og z077i@zGFBd!;{wVj{3ddg&BaU>-d#*QQb8rrTxZvG;!iw6~>)%IuJt7oh3UJ=w=n6 ztG)sZ-4Yw;=)zYBRlk-+xxNq0-^7F05M0qlyF>86J8uUva#nowz|fAimtcQwO(-* z2NK{LOOQBa12am@L~2W<7C>yYTb+I$HW7cISX$t2>LqR?8Ij4Y27Aio`R1(aJ+jMI zi^;Q)`+?%dqCjYJ*jPo0E(y+MUP{wsy1h*GmgS}J4Y{)cn>S>>xTd(4>@8}|2QlgB zDXdmpA&fpCr%TbXcW1tUpsq4vspzP%Jor&xd7lvejA*wDES&%1T3+*F&NbM!hXLxh z9kj16jmG$4AHY8~B{dEJ8PtS?TY*ElyV$n}Yex@3TgCNtrmh-&1=>PV1rp!Kb+wj2 zTSPEnMab7@ehG98=$TOO3c2(}aq()gNUtHv2z!hIAj^Fisbhs2LVD|sv5)Q zF2#++SXXG%VOFyDT#g5b)hIKjdJK8hpxie<5-_uB^G4<@h?aXI`;eWGhn?%aAqJve zN)Fpd5+=@EY&$jZP+8g(6LhwDR~|WYYeoW<`PKn7y^9XDXF8Ezl@0+kW z_}E?ToaG?INgkIL*EBnVHwyUij)Etwg8@9AeHBA-7+1RK`z4-3vgAQbolI1a&p zvQV(GAE96^ib8xQd$oqW3FG>+4hbj4LAw5JbwGo6`*=OoeH7r}(0UizA{y(%N+MwExV68pcSa-V> zeo_Pljs!1+^c;R%_IP=0&Y@cpXz-d4iN0KgGpbRZ^@VkHgmzp%Bgx8c3f>#=*{Rzq zGvdZ%GjJOr6B}E=X6?q-QzmeoItarqMtrjBa@>j2vQI)JFMbkHH4 z_Eax%o`S68*T3XsWHITyV!JU3u7H@tq0?~<+`YhWK18*aSEys zY}0fcnbuZDu`Ob3qLLPR=n);21j0q|27;nObBlnYEefrmi1Yiu@B6K__CANC612tC z+Gp>zzV&_Y_ug-xPs5$1=mBzDKf_<|(JRJsk0*yM2|6Ih7IP>s)Xz-!0Sntqa2)ET zaX%nzI_q{RnZ8_7ndu0;%c~xQktCK|gG8~_^O#u!EaJ1lUzw|b<&Mxvtuh`}vn(Wk zsIAJZpP0gwAQU2_h>KdaaBwW=XzZfKa|&3`Lvu(nH$C0WE&Xj!F1e1A1N<6S*_sic$(41 z$!aw$Ci~LPgRPF|rD?GUTgCNXvjC1h^?Xz@^;2Yf33L zx3-r4g_;&|imsW@-3Xdv(~ANwUmv){aRPw%B4u5Cy~Cr)x)7DMz7eS98lE{#Ng|pP z0@hf~HU5m4BGQhKvZ4Cigq@y)HS8xKs3P&0$F)8WsRS33I^`VZS|8OUs*#(=c3JyQ z?N3rqu8TG7l(f4p%|ru}#W8ny1R&b(PbWv*H*}x=hMA|W0SpWNM!V%w=#&(Ph58%) zCPSFS1->cf|1t58s@ws3RfJY4sNdw~hqJi*m0Il%JwZTSh&yw$qk$1qhVAZuf?nX+ z1|LbAt09_$K1-<3#JHh{*nUM$nrlNBC6vkLg)mCP|3}Yv!Vjh`{ig8sn8*G|hB3 z_uwFmeSWk%<0gZEjbP!P3Z^|aMS&>A)fgf;e$JPB8z?jE+taXDf;!ub0N>u7z1`Q? z7TfFmdpK?7{3Cd8=XRGJF?70GoaeYwF|UqSyd%A0FBs~tct`gYhW9+KQ$1iN^QNN9 z6LkUZN?PuRY3&r#S}nPdL)b7axZt?F@J30 zm|3`Q0u`NYg*nKx?@G^VGqy7FP9wT^#lvJ4d8mON#sP%iNKe4&E)Guj8*#f~TiTF! zryKX!(9XTyz2Q!0Urgma>3(ukU;ws*?}^(D|I)y}nQrts??49?qxj7Y_cp}wTj_~* z<9;jdCPyY#*zP+rZf4(qJ3Zc6@^5#aPlDrj(v96E|4#Q#shl#6C9+igqLh~;zJS5+ z`T#Pb_hCf;Zalh@yavAE?@h0<4KKJ=cJO=S=73df*ZXv@1k(z)$s&7SXF8afl-d)E z3g>ImgdJI2-Gw@yHap4ROOsqGetN`+zt??nqg=c{-E~RX!#P7$G9jG@6#smGX9iBb zfF7JaSrzr^8>SYCXe4$Dp5TB)DQ^>45Ud&= zYBa9*+{Qb05|HBVq8zL7IGPe2;t_`W`UrnSa@%74fq*YViJ@O81>gfQY4>tBGWYy) zw``FlH-A5#R9mwP0Jv?x7| z2fKi#CaDGV2V*Fb(H5NF0|ap)XE4OV+8|Yg4tF1&&vfGv_MpUE=NI5PlLfa}|KZFM z+`aLK-4)vrR}J6QPO%*X8xiUl{83De+|&iXwb{y|_3)-K{y2eFkN>Os zkDGOgxLA`=soryoHlql^E(n2fyRi5St@OuEN4O(Z!OMa!KNQmo92*J8J~T7FS$+q@ z&|pCyP788_%#h{7@q{5ua~QA8V8R)JGr{b&kIE+i;%s~CHgF{RuW6;^8W#Vh571oj zldY)<^YE?%nXQP2-8=@M!JG7n%r@?5j0T?)G>2tv86D=Ucd<-!@5p#w4#BMy%7JCHIA^%u{eC+LG zF`D#MpKU-pcgqo7b634rN2hV_IL)7u-2Ia@&JuydNjWX|v4PA`E-odX7XM*X|4EFU zvV8d+QrK&XpkR}bW`0vYnYL(lQ$HEQwTeXpr%$CPx|{l`W@#qXH;ArJw@bhYYSHQ+ z9n_z0o=VjDr|o@O=rbvI`I%w;r*R*PE9IBy2<|^iv!VE4VsiG+nn8Uk4rv18x1k(c zOjEk&MoRol8tMBP37|@Zd}eN}d5Qez&2(ARzO<}AZ=MR|CQ(OL#0{;|{1?rGv7yhD zr<1qdKdk>^=5Yw`zqL2_*m;Hee`>_HUD8dAzTWt*zic0Oj= zfYtYaF<*?SQ>oYJ`=(KvvOikw4Kn0;^FGTfvov`4V44tn{dYe0rR3}1z#qN?k@mY- z|9$$^l7jz!{^u{HpLJx{m*#){hxBWoq~U*<`BmZ(?A29hU2rhe(Iz`n88hhvj!`8-o2Kdv?t z>wd3XUP^MM2#*$q>axJ;4ICL_>?51HKQgt0?-l<>ojn3Up{If0z!==G)H3{miB#oU zRu6@&K5z`sWS3_LPF|Zq$xpRmGMKBT9oGKJT6oO$YJcF)-rkLA;tzJx#3=-2Nva1` zpC2yE({nhc(avX7hesYzhes~z@W@4J;#`y_&P8eBT&}}!#bq7d#N~SB{&|`>7nSF8 zQF%TWmFII&c|I4F=X1FOFC7<^=W|h-I2U|My1bBVaV|;|=kj9MCKsiNb2*bwr{(A} zrHMa7f0G`5iLRuF@70y`@Jn?iJ^X39k{!FcNc4_$??E%}9mq&fLPhF4s;|}GNQKRO z*v+DQdTAsvS)%yGlxDvqVP`4<*DGX6DdZzre|`w|looDH2ap8L&xt{gi268fOq5%$ z;3&v)F%kz6&0i|rzer+eY!b+VnTQ8dL8vdDemeK-mB{2?8vu(eXK8#& zNFQ}loqdM0w|f$DMvea{Wgr`XQkmw803_W*R^kfhLVH=irw*Q9PAzpXC4i(_{T_M_ zse=k$6Q)zwjvjh8ahW4t#op_!C*~wrfkXH8Dt#hwvu+3_kBpqwY-~u1FvDr4QGo4+s6jfs7U-C(@UU z5JSq*&*$+0be%WFD~t%J2T@a-1O)Hh>HGUb+OJ4BrYed+MeOg6BldzFl;aEGwkvik z#G}rN@2=CrAtAou{rYBiweUSeicVPkYzM%x50lID3a82rE_TMSK9$wZlJ85t5Q=d+ z{NMx=)TLV3byBaz{lU?lCDX>3t)GUZ5vFJ z)V5NtRQzDCEcmBdC}?u2Z?t7wbP6Ch>yv=15;CPl)4)fQh*b!O(wx*m^u~6&6^Z3L zbv!fjN3k|2oZaTt+VtY*avKxqpv!I%gex-Q8}AD&h%eQVV<)0`hvP#(1h9~DqvH)a zWDCger4SRIxzIR8b$ew~NRCI(enzz`UNZt>OHNk?u@sdcY@;O8==RaftK|H>{n|Ay z_=g*vKs?s)ZEX0aoy_YGzKu>WbFa2O4E0aao_j4v39pUc+^}NrPDvijb)j25ZVgA; zDe#_x^f^N*P_`0U&TrC$11d$efpX)Q>%rG;N?H5t&A*O8+a`}OFvhO zoy{J#mNGyNA^_Utq$`ZrKVHA&7QSGA{YBnrVYS|i6(fhnsMBYGitM<{lVn%xMFND?C;z}K_!960HDD$f zlITTWumn67pHf&!X)k_alyX={ooJNS&i2pZhp%OfG;tDSBu{Q#RTAW`075h`Xo1k& z?7awPAhydPM%xqB&^Q^?KbKFbIB_nq3D`U#byaPMcj1y7rJPh71Sl`nuSVh9Qu* z8g*(p=_wy#YN-{UCZC$E^2F9vXqE-z+Ow@vEETFUlCYLxEZH+y5!C8jqd2DB5Nwn} zo&C*_p1HcJ_Tsx3Qt5c3l)gGMWUAg@(~wV}8`3sysV1LuXWF!#AX?;R)9t>qX`YbU zWi9*CXo;xtMV?MrB%o0KGiCJY7WA{Fa?1_X&Xr+3t{?t9eg~9WbPumeLhZRkskE+( z*x`#cay;=u2s68|rtl3#Ct5GjA!^qI)g%GV6Jl3ug7FtxdmMoyl41=Uwx#fRSUfY^ z?W?7!d1B9rzw8!&SxWo`T}k|<6dQX1|8C{q?WkZD>{^P19ri5}Y*oV_>9x*v_{r02 zSL=76KnF{Hro+uxNt%&%V&iOR)3k9mE~PwMb_VUEeLy>IlLg^9upQnK8L+`yd_>QE zO$^1zGIC(Q5)1N#)m8O*fwR~Xk+9klazNTyLkG(eYjDQk$?A#jJXh8EgAUsorG5h& zhHd3*+CUQ!_EK*WqlP(lF zr1+dh)29XInI5$tLyxpq>>9FL>Da0C*PS?4l9A}0@1TAwA6rs&zy%~9$zH>Wf(3? zm#?7`(X_@>6c4uy6#uDgIr?!hbsy9YPQZ&!Rvub)-RI;e>@11dE%p{otzoa_b~6RB z6qaO`*|D4hIVFmtz7%;pIupPnz9b)--^j>Kap@Yxl{!q?TpIGfF2i42t2GjH>jx>$ z?NKEgnYob=5mo(60zI?Kw^2q|*t1z8wZwu|xkLbpwh08!?Kdik6+aiNcX)51g4g%~ zH{ne)Ls;G-d7tm(qPE6z9WN6$Zl~u7z*+t0?~>c3P8q;WAQGcrMZAq?vh8T9*Or%& z`ywdGMkH4SpsVpK)#b}+NfcztOF<7BOTMD5uOSIp*t768FN36>n$^gjN_d1eq!9dp zS|`-&5AJkd7Vp4GW^Qdh>_eV%*=_%y;pWp6wB*}aGEo2qb@Gc$X4v3;_agv`@2d|n z6(pSJ3$c=I3gGHxJpwV>2bpn{&=T^Z_A;pBI6lXvJ zf%$kBQFt^B_)yQ1JtzgOAHokMvws`3>>ePBa`AclXL3XJ*BAkf8V@JgwleCkmt%&l zw#miO<3WsdO4ZPn%B35*A)71{wT9hbl4~+((rPP6r-y9Pgy?LyiHg{jXo+2kqS%$F z%CaH_Z;rN>5 zN4e*luzrNO{C7Tc55&ye0Ovk8z|A%$b06D!n{Ht@J&AfnB^tZSJtj9JmD*GSn;WnN z&(08EiHAIQdZh-@&FYBs>GlZ*_T=f6`eS&Wpv>*2Y(@&T-I&xcPoZ9s-L%_MPDd$u zdgiuBo?ekjA}rZv13nxvnweW4@i3$4;C}^>kIdhL>VL`5XddG#=m880Q(L4UXOZx1 zg69iSqAG{&rp#?CUQmMpgdB+6k)K@lPs+Yp=rBOGU<`7CY|s$=`@|8EJG;tRQYY~q zaGVwR$4=b}e?<QJGxBcP4k^fow@n;g&m&$PmIAyO?fc(1rTrjK?4nGyF$c8m!3% zl+dC50kkC2Q5MldGooHUgI}Y*=-gpHsxT2MCDO0=t-LE$Zmy)xa z@j+VGqsxm^71gXiPhNVHJaC*-{$bPhvxuTpLiK2%i`P)?H5y2%+JVwRPnSZ&jLCsB z*wp}%>uWj$9QoNWI?FS!PqRsEi}K7zByYRmYSm}RipDzkzyPbIho;X6+Iol2=Hl`h z^qm=D0(2e|$%uQljz4XFQzIbEGf@Rj++1yI*sFTzjLYq6P@q;iXeP!OteC*WpVAP^ zC8C#Vm;hp7gW+rff;!E6e`MJ?n>^3jpwB(OMAZRSnW)Bc7-otrd8x#?SBlqOD6TDoC$(p<(XWHTrhn*7f1alpvqLqDDoE>}mt4Np-~tEjNv zPh6G1c2rx#_HKRLY_dWK`?v{B(LasVf+wqAXMclfyVYt$5eMnNl85MeAI)gi!LnBm z^}fIkaPu|UM}J~oj_Hq7QRV|`6ThVT8N0*N<|bqq!&!s6|rlHifu-W zY>U-A%#})E0LaI&Eqok@dT-8wA>R%7j)pCl)5c+3e^~)f#)@a#qU-MX<Q6L2ie;(i(_K)W66z#BVK9%Z@Z{0 zWBsYrfSluz*O)Q8i_{_KB3z!qJy`*b2|E6+?J{?C*u$3MM+P$T6m~)jr|7rgY4~@f zoOPc}<}XEdA-cT!}%;){KeEStgTMjaNU^ zI*tBk{!o3H-YMKq^$+H|YfLvf$LLuZ;Hii$Y9g}wotM&`w60S*guA8D9!+Z56rg&| zk3KfCwfuY71EC?oNlGnAKN6tTLI;IGx+t4i!Arl}bgoo5Vg3cv<^Vam%iSb%HIt=N z6@CGj%@+O>=;su<_d2<^np~=|Fh&R=VZst>o|%unE7#0GWRB7yqX1)tN%EsA14m5_ zhNc((ROkh|gaUls%&6qQ^Kh(gZO~7K5jxj-H*Z3T=b0XLgGrJ3_(2qGtU#PNmE;Le zB^x2ZnW;P9C5}W-=b@BeG;?>fpG$6xzbXv1!fBpn2VKYUdQgs2?WN zd@h*56Uzs(7h7ihg6};bic*oz{5mBf9??7Eg^fJlhiy<=H5W9Fk_~})Yw@OjQ?B93 zkuDDPu-U?aTfmo=JdzPo3Ey(F)XGVpg$*dlkywq5XB$O z98%#&U^@7PTD$>$nbpRjqA;WxDiwvaL#d%&d0ZF+SN;lQ5tSh;WbVNL3*- zdq3~Qz(*iu4rdV9+-L?-?6IOA8UnO%ITd@%4Cl04IhT~NJoZlSYj-J3RAO^3OORK#0EsA#!CIQ+#qIx`wiRZd-5iiCXR_xCA&EG?6*vl)DBcHr0^dD?J=!Sy&w1FquKm)03Y z9mZD~J&-$9br_3I;c_%=uY1AQ(CxhkFrwN*=sZ!~ORBW6=F4j(HjQZ_b5A`M3xIML zRP2%}D)f}2KHgQBHKn>O@igTVQ_Jl_K8tXX=_-IpbrVhCJp-$42ze)p2atc)1txZDBLhd2vW3sno&k7+~~YC zm8t%z&r%zE0c4O$H?Wmshx}dcp`90)QOzL|xxf(g&$_EiXf->-&m^$ms%dAKDmU60 z!tZBECJ~G%1v-(31%feaF}2Z-XKE~%g#JOF!_1hGYl#|j0YzLr$i z(eflyf;#UC&@hJ`s!{36aA*)vz=IvXq9i2n%axl{5Ymp{=oYgOi-M53Jx!$`!DK}A zF6I1W*k`8Aj=)Wfc6=NR0rS+dS4Q}$D5NFfK*pKn^DKKo z2B@61X)B^S1kZ-L0j2T~x3DGM#R%BB#QmaNWThtG6e6b)wDkuXQAgtDa+$T!5TNH+X#)CYlbxTpaXvmLR15R7ZF+U@~*Au?6P$(2-7_+D{59) z79MGFSQV!iX`qkeX=;k!{CNqBbyT@99#1nC{s?NXQlU!=cjoy9 zlI2ARAI*n#HaXIy2u1yireqVsWhXvas9Y(P!!Q*ZH_X}xQS`E+5+Y=Y&WKL6FLwL1 zb31TG!DP>l*S*%c7qu{18O&Qcs5ZcucPfj~SdLv$g0jNz-_j{P(KBwqbYpVx=_o5% zA%TNNy2hqcafwN?6x24(LCF$IYbQ)0mVvozf|g0Of;Q?=R+P%&hEb|XX-92{6LUzJ zpT2-7Ras#&@)DB$7gmG=>=GI@g)5R@OXdFMX_Nh;`{>Ra|5wC)ZTJ7>`r%%b z`;4p&zV&NOMJ1h6!beteQI6yd;~XJBFp&cW6}aROB3bpcfKs{7NGh26s?cGEdII^f zDIM@r!bg5eI9;CP(j3_-;asfTXXNERlzFP$hu#{8&U{3zH>!SK$i>QiMsm))n7;@Dp5j9B&zYR- zGplf}vu9jd!42)7HN)`Kh2VwCm#_cA8Tc@v*1dg|K2vcB@FX z;S4mPla)*n5ndvi&k_G1CjpV+mBC~v#28i@)bErl^r<7Uqv40NnGlMOS-Oe^-p{*k zI(dX2JF8D;A2Rh`@tOR>RL9^Q@vbW zZ<*m>J^eOrafGbzY)Y~Lrm5K4{GGE0$*b6^)J~+$W;HBR{_tEL;sGZ?o;h>x_@v0V zCr}+lJ`adz^;8N|)c=uvahF`*4@9V6eU-WN15E%Ddp1~45OP#=FB~`!+D@0G8^KgWs|CMs%k`|<6jdk(K2$ydPi~?B zmB;7g&)|Rz4m~g7GK`ZZ7`ylkr3O-U9ZcfwZvw^b zEs|+(Kr$}#P>jmJCj@4Q>o{*?us4(b1$#glZjNM=xhV4DK!&Q1YWABJV*n1;L|o@z zIwJLekd9C77pG>y!+02y35<^BxN3Nbk88!NW&YGbXLWxD!6HF$dywg0_cvqa`&t-U zbc;0$1$(-Hg1Qu-2AAz5esI|VGv~4!);_$9YNRFo1<;=eSySc{tbL}=4fRH>q5c{S z_=gzHSbrD+hG;~b;qz#?4VEcp<`7#@QPl#`Uyb2BrZ`-UivLWYt0V@HaiJNq9ZZ2X z;pB}>!ae^dBgSkGrw;f*{^s)?ozX=8(ek=opDerd_HuJzx90-ghy2d4^wBxxednDg+$?+GL z`L1g+QrT^TSSF>g^~LJ`L)SWs7)VK|Kyrl;7j#k^Q)`f1mgf(ScxRxvz0(+v-YM)# zE$tHm_x=6`f6I|`GrOPQF?|VLX!4GzzpUT;F%$rzRZZn(avK>HJD*FZ;N;Bc)}*Vr z8NtwYV+w+$l1r8L4;@zN#@aQRe-wl9N`HmoXe)=-8CpD`GqfmKKI)avx0Ck9m(TMW>F0Zm^mlrV^c`L!eGX_IwW-Lw zhtU;OoQ&>36B<7|P>45#zp_Q2%`5QKK2m@u1wpsyfAeV?7Crawnk&Y>;aA1mRX!WY zZ~m^NxeN`tc!uJm5}j_hT&!<|87aQ616l{FyW{jN;^62Y3QHl9L@-Kw*xp8XXP=4| zWwb1DeXjn(ho$7yi5T1u<9edaz$`z+fzB_Lx5;LdpVU#|yJ30g5NMrfnd0Wd!~;6F z@}p*t@}*O3gGIm&%i*ma9zw#AJUCQZ70rhisjkFZwdJ-cgG07mZI>DVc(K@8ugsOl zH8=rpHL#NB(zSz_xpJ&nTk$X|6ILBrqGshSOJ2N+zw1|thZ|#1M;mkH)sOvt4$H0U zp!9Akj19>cSdccx8I5tKGe#o(pLi?$sU>{(;(6LXW6*hq3fm=$?)XDpK(EP!FD2_H zdyGum2~2ZLLR-m+EO_jxG(8ENG7cam>HMT}$72u9aPT?O4!mG@Xi_h!5c|P68@EFV zbCh~)h^XS*kK*t8i{D_VAV?z78dN~;b2@>IITJTGkO=&3s&@itu&eq9-{rsvmemXy zc)+-4hC&Zf(l}I{ihPp)jCFScDihlDp(KH%I%P9C7}x}$z?>5X!bOL) zgRBdp4)_dsy!hU{T4XJxqau5o)Ls6(iye|rtY+Vrd8P6U(YBtAlEs#FQwS0$z+Kiv z%FPMIzZp<;@_CJNlGir3eW zmG|gqkLIlUxPK$tVNJ4?(Ot?+3MuGA9#}Ogei6L_o$5gLJ|w03&@t_6K|I*WGr~2! z(wuCCFspeSsM;s~?G=yqQ{A~I5b6zZaWSXHcO1z2k1su89HV7RW6q;nY*Q)h&l+yV ze+#zbi)8lPq!XH161&NN!{TQ+UzZR3bPyBn+WeqYCe98m>D-4S;+|uGkzBh~K^`Si zKke2}e9xCKPU*dTIk5Z5_~HKi9-ZZ5xj(DaRxu9ygX_PgD!u+%(u}lc@&4>85TT?I z$yH^8tyap)EbD#xo_T4WS5^#qkR@=!puKuOWy*Y-LpJ&3K^@^7=(fl-^*lIETv-`{ zBx1GflT8G#6jo`qt_7zRqZ7|Y5c9y#-KMazd9W0ugaAMj*kSSLNb3pai*hBB5+9rXpZL4NJmgc36 z=C@KzmEVLrWUFyYX+(=_(vb($0c&i&27ohT-&@c06^Ml_p101LB%zG+f+_G-uc_Yx zNQS-|xp3!cn}b4Txt#DwI4?8>xVBHm(~R@coV490`6MM5^s-m>ITShPMX+%J(=Iyr}VzD2D@ zB(zzhY1JM6Wo!WjLPm4qeqM$zHR#(@1%7fuF(wq;G^B(lSxjz50b^Sv77%?sW!VwR zfh4**2FFh<+`Ne*u^?pwnIb?+ zEpD3F#6+?jbxhj`>|35si+W~W5Y-Vcb*4`vW&y1o0O+Pdew{)yDSl;`3i+FCZO~14 zD1@_Ye?|>_^b8d?OS#OkSzhL!)&KPqdTX6({2k!#zY;*1u95a)AL^;Io1I$WwkVpA z_JM5S7}`1z6yBq9AWvabGy|!(yyzIn_fWO7cq>J!`+{p}7~@wAJ}e%_L((8yX{s#P z0NkY@B)GHo=qzAWFiM>OHWqM7>x7FyHz7p5JHQe#Di(GlD7dxrL_$F+$)phRsyRi` zAs8`4%GZ_Y0@pLE)&Hmm8x7RoO{LlT>mby`6@5L1cec6vA#`)q-e0@$K z-jYC#(b>elHP&uA6Btjk8+kjN9{~Wo`E0^~n5l$8z4drqK-keqPLPL~)9~JZfW|c_ zD$KxA8lwNe%;*x!RXIvN$YCe7NK@*O2*zg~(FXGuROU7BJpDN3durS+xr zy?BFHY(>+8nR(7F&U+Xvm5Zv<+Tobcyk20&XynpW^=726qEur=vLDPFIC~odNB(vS}oT8&7cdvG$2j{T2fobor?Yi8U^HlnTV3D3~Z(L z4hArLP@4Rprh7q*=bZ_bRMj)2Ta7Zs;=C-IQ({)$kYEWrh1<4pW2Yg(%#GfV0C{b} z+UP{k-Vq4OvI25&g{bEdmYShr!DDOi=Pt^X+B+18E}?vZZBN<_94HN4$~7iNBOfYA zOeO3V=R%-#WKwRq(YTN^Hwi}AE^)JCIvEsoM!aazd6EBw*n~VWhwBBBP>1y;$Ex#R zALkXUM5}|H#dk2HvNI!cyMU!Er^c(j?o>Q=j$M3LJ@xy81&3q2eh+p0?|v5{iu%f< zRe#s?g8KcxlGnfgVZOmAjxDQfkn_oBd)tR(a=%l`d)0Y=>f=F{x@-lA0W1zvE6<$4ny>hJHXS%Go0eO1j+Je_sv*-W7-`sD6A*YHT#~*?lO=c8M5ccVq1f%Gq z!*;#90-3-fY@cCtSg`b?#H>UHH=}aQOwzWcGevgbymE1WCXKxQ&A-vfhvdnEVKx{0E^fdf;mKk|EGeFo0G9dO!> zjacL7Lzt-C4(M3DZljfVjwWi#av9k0F?4+k#;bpR$n)db;9&*#DvpU3OJ@KbsH z;LmepDn%%%k~U4p+e8%gZ$GTbJddq?n$N}TvbD4nTsCw{@kBO-akaDV4!#qqiuBpn zyTc2`EIO|8Fij%kC;S%I`GrK&`i*<)pZN!}TA7M!y|6N))+9%1V_Yr7YcIC=|dV#DEv2oz%)3eQWyTeXkhOBCZH<>+5gi^N1!!NnUba=c!er` z>-sCXEX?=kNFU1an$>F)z~rOmRAOzssHsp&EAR#qS^ZPL7AuJ65uHRIgI`m3kRJ5b z4@Ldick4mz#WT{{VLa(B?*f6wZn*yPe*MgJQ=nbaIeDU#7dO!f@M#y~`$z2uA7tSU ze2d&|yAlVe74_NoA=+#z(GkMXB27iTAS4}rlmNNe+5P(aIOb+lM^6adED7Or=l$*j zB#}MgmEn=0({-{H)4<+8LK`+Neog!)x<{CDKDR7T!kb4F@VV$2G3T#AzdD4&vn&LF z9d(Z92G=($uYdMTPWv*pn7^)5e#p@@vw^-u_tK@zp+GtC=;&>F6~5Ja1vauj-A&d? z{?DAX0y!ybWl52&CTnH#I9V%DqOw*{3zW4&@`|!ncIsSsOI}gB3dt+a<3jR^(pBJA zN>?Fy<&NY(e=K8_+2r$U`Di|5bH!8kotwA3gp-=@++665@7x-To`at|VlDW&%j4C` zUfUI9&4KKVWSDqIodtZ;~s*)9^YBx#y_%nV1CidU*D+hze82;?YcRo`dlTt@AF z=;S0bPz{}!;0=|KQPET4KrRG$g;6ky{(t+o62Og{cMi)*hT9#UVQM#QR>V2gv$pA@ zY4j7)-}zhJyQx}iUX;3Ng6*WC@Laf54RNUiwHB}6!qz0 zWA%#vq*}`Gq*?>b#fH!F>a-m-OwYGO8&dW4@6?JwRSj(^)LHX_Xw6wGg%ghljjkI9 zq|MdB!$5Z#XyS3g393$c9Zra&=bj1%eyn~B5q}^gZtthJ%zQ^!HMDImylD!H` z&yyP$q>|!b&;t$*y=8??P=&6|FBO@Hf7^Z6F%Eyh+l};@dxEn2XuKaqbV)Qzyqyb4 zpXugsjp?3|+&z($>JvN2$ z4*QIT$r8QJd>rnQoB|AZ3lEvCqe|7}J4k53y2~XYEt2RpM6wVFuSr|%PLf=;ie|CI zk>R%DcphIDP@)~=;oi${hqAPJtjIkUIh7oMoTB1l{lX2s5P|LU(7OEr_gcgQ^6v}HakFwM^8Wb|syCGu9&Q6GeKU0VT6Kq*_E1uDlLYYLO%*=fdx!2$K%~sszU@-&F z_O9Vv?or6=9|1-syu)VIv@}fWlh98J>Ag6Bd^O(X(9tBE2?n%;8SWJ5d*!}pdRRQ? z!sH!jG)Pc+pW`;jxG#=lW;-0;uq-^yxhs#JgaZ|J{cdQ`Xp zW^Q+zKF2m@RFYzBrD52&H;UTin&H(qtI3%Dx{FS=StQZ(17*M7wFFpum%<#A*YG+l z{C2oVz#E5s53Z=QXIS^{ienVF?z7?-2Fa@DCjr{Xo@kBNSdG(Z*dXgIsn1}W0gR>l z&!tMCJncrqL2HsK1p#$bDJ1|WwdV@cdj3m)W9#}&6V#NbBEx{FE*Jd7W{bgppCC0d zxnN|kkQOV9TrdrU#68LFeo{elWw7>O(On9`t>CH$-bOIqNdx(+T-V+PcOjv)d+HCm zIUBZpN`Xa(DoIO1wfG(eiWo9`-?#f9OoV*eMa|R^HzmJZu0MQ@{8ym2*+6_x|A!{M#F8|Rx=xfCQRlQc1jF( z!p6Z6uE`d;kgubTF68TwTHaHaj-HwY((Qrhvp)4E6}K*NPp(jtUT|LhWzJKhGF`(c zgh8eg9mnmK;>0e#W87WbFqynz(`3EQQ3y&ko^rcL+ALQKXa^bT6_|)P2CFSV! z>%i+4xy~ZhpM(CvWR%37esP_kCV?V-vw(ub%6gW6_muDlqt`q+QkTdcM2|{nv_sTi zXOo{8<@r3Mms_hx@L|8Ctg~NSU;|IQHRvs{`uw;oh`hJH+5gh++!kY z{N4ADgDe~J^`O`9^_Lg2e%4JojUy>N`tZoX-#6Y@*5X$&1gE3+xZ3{=tv?#$@V{F}aY8oRn7ZxDSR2!&E6h zh~$an?|<9}lYx>eqdhE>RCD*Z4~F5v8-JFB8ed~lVY&|rox6LV3<#fUm=Cj@9sv(j zH$3QpWcVf9A6COtX8DOamrXW*A>SyQJG3c<6WZi5hU0TNhe8GCWpUUG!tj?_PC|AB za1M3DC=ibrr+C|2RTahB1u+l(exHY0S*(YGyE&_R5;X^K3RKnc%(~%9f0l1dpPl9Z z*%NW0#FAlh^rbLT=kA6?kpCxTP5yjbyFW&Ui`p=94HQ4pXhS-mDE zB$(XEyYl)98j(iM`(5EuSTta$?!fz_{!m z=c5`QkrORz5_HzLB!0I^0|X?<%R@d6C8y)*iYY3ONTRLBZjf*aRcK!>>)&229nQWD zwXV#*4l7bgGZ;5l_4Pt-ycz>rXiIp*QF~DQGzw@!Y~(uG;epp6hO}xl7D-a-R8Xn* z_0Ttz^JIF=^-{O()2-6D?bGdE|ARvFLYcxWt}h!IguhD>F;N<(H(|wi%TuX65%pjp zF)ws7g&MGqJ<*;v44D%kAqe{eqA>-;c`_h%V)}o3>_GS=;YTXWk@jGm2>rcZ7wXu+y{11{yBHtI zcCuko#UCxs?PR0e!v(}G&0J%=F?uT_Ozo^-ZP4EuhiLO}Z0lhn%tZKuyhW!;Xz>&( zUSh+fnWf!G#X@h`q*&H z6zMf`whO!1u%`|&q4+$+Ue@moHuBDn{W^!imzkk)Zj3Q7xb98!{yLITHd21iG#44) zOi4)`mm>Me(m`}d#KyH_2rY+GzLulXC!97w34Ll9T*tfGudlmXm7e+Q!){HeJS^TQ zhT2M7rjxJ_#>||cqk#}p4n_UVD13!Kimkl*ZbX+jM9viBF|SDIc{z{VkO`=rxs5*3|i2j9ep@8m-Y zo3PdR=keM-AFjjYdHhC9SFvRhA;eIv)JYxO_=~D0rOfOThZ6UPNy>XWw0_Q!RTa)Q z<8uo7@pW+@MUx3L;C6#X65vX!-*TE9a+~rA8%%IX+)&)h!nXjD1pQp0gG#-eGMOaEH{hi+kugm}Fv!2J-L6LJSHT~6a!yoC zNm(Bh*O4->-`@=R+**xJB9mAElar9*EXx}iY-j`nK$4xdQ2Ye>5+YqC0|qr|4hGjm zT|6)2pVwK7Eq%=xZnHsF_0Rq-$s4_7w1taa=Yyr+Xh+g>pjL><1KFD^|`5d)gak;_7b+cPkJHi zY-8LYuyr@TCcBlT(uEwnBZ`xtuZ(?Q&98+00QT@Er5MDU+$Iz#e&K)?)a2CbcXmOL zXbcLRYe&o6tNo=Ll<)^que)h6?U(chuw z9}ZJ+F*1XTzsqYDENo6#Xy7APmqd&f8F~H^oP$SLE#PYgVv7ZACq)rrFZc~6N=dDP z@tY)bR-nM3T6WC=%}hLg)hpgRWHk}MLPF{WW(MN*;4_kP{rZ(VZqx*BJaI&GZp7?3 z<@}Nt5fQC$$1}VKvXF|!d-~~wuGR(5?wU{->Kp`wglpea!Gk{1r#F*}1DA`)TM1pX zFUdvlK=Kw;GvmOu?}3-O4&;E}&2LMR85{#4@jxDmECV{d%)8^^Z;$NkUA$4Hxvz7? zsc3iFid5+|CQ`S%54Dk{CRs}iK^{=~9+!PCQun(^y~0K6K{Cnt?P_xSxLl_~Ib5Uk zX5(@_313`}QpLyRR?7Fd+)lb0m*-Kw$L0By?+q^FY|~1A-AMu)m%FI<<8t?u-PEC` zyL7pSlTNw3n69c^PH}oDmoqtMAaH#}J_SJ5(|@Y#ISBeNT`$3dOU2mnYQ!!gcdqK+ zi*+g5eT4~ueY_7;E&a68{ZnJzrCY37@d;A%oC=zn&C|d|xSf2-&J|=1Q@N@#K7OS2 zu)ukqSVm((3e_IvMDHXr4VP0gr9CLbAyK*hfe-V6_)Pr@a_U?=Pc_-wN_Z2D<(KJg zki?A*)NOg?Q?jNncQDFFNxpObx)`D+tKay;%(r-L<05SM%z}uCD6&{EvU5kvZOK)6 z1*yUZGM!67&Z|mYe0?s2CdH2tcu6AY@g_y$jVV8AQsF_Y&k(z`Nh#)R!C$=~WW!?Z zvSCuZO-wZe!{faMJwr{}(_0dIfB%QI6D+;SX=vX9-(rD_&fp48WlZV)A@K)sSf~heNsW(5b4rs(-sOja6ti z<%lM0JqmUb%DM;oQ6anvTdMK#V@i(YI4Z}pnJ_#E7BQS~(HVGmQ10VE;4+LNhm#bk_)*0Gt`I$%)UG z=if&i$xS@dPP9B<1|g(j-D^rZ_+vpCuxHS7oOd zLq#%CrW8}TJby72S#XPcstab9>^EFcPLGvakC!{X8&CpNfO8C-0GlsxZ0g%eQ}#F(+vaQ#R&mM9#h`f@7 zm*sG}($d^=LM?btMO?BjL>&s9F&DqDYpzQ2MFWt9nkZ@F;OL{vuUaqNv1CA`d(`$0*V;TlUPKFTn>Y;e9%f1cITPdg{z-eg$|4hpnFw$3N~+!6Xow*N zNj*};JP*?**I!o!r2xb)ERDgJjo0%+Zk5VthfXPDT>DkQ`ZCz$f;c3z5Kyb$O}I*# zl`Q6pR9-kRe=-xi0s4+_>~H@F^^qj4Md0A2bGkjHmsQ&|PN9@o`EfW-fX6i2l7JcF z33!1}FRB)9;<#0ThOnr*+ERW{4yRk}PHXHH{pAYi05+KzY@D!KzhUYOHd2uqMArLo zl`msSGXo9aRg|Cc<$L$B>#7Y1HV}eoN=IX7vY9oy5GF(^|y= z!op!8lX8z#m&C42xlB5OCp+cEcc%m=ECNTZOik?emo)b`9ZhZPN|Fpg0Yb)p%LqMF zw!*TxF`t^PfDaATA8~~)os0xlDkA|Gy^I9VLPi3%f{X-gh5cNx6|UgIMjqrs@4l};`Zaq-9F%~ z9`yTOpa2+R07qM|wL?medpOR?&xbt(FA&=y(FJi#+ZD&t?a3RoX}KkBto?e=_7aD$0odhWjk()Xu>_hx6j#{$@H)o zUiTTqq?-5GMduZb7b#oKkH?nBTiNwKEjuD4dEAjVq*8h z6J+G$giTM9Z^caqXrvNSmMFC5%n04YH{rVGX{?g$ZbipUqjKZ zigvkz_82sm7k{GJH1=)T_a_W)HG8P2kI0k)$e_00?%28-+{YZO_t^8g#W42Dkwsg_ zKpp&ugnq}63zON~NVW~gF?{MNWk#F0Dm|qP|G|covM()fj0hcUQ_Ap%X46b=QIRMY zxv#i<<$ir05#km_gt+X(Kf^^{EG}w7#pN7my73p`nn0OGjzb9h8Pob1T&KU}663(l zzG@76Y=CWbf8EZp!pCi0ktk@83X1uIA5f8kOc@TMVu|RntgTQsJg8lN^4+`%Z!=yU zNCU42E{);TTq{td`xFU2EVNp`1|!-r3cqp6P=LfJ+JR1e7+CYrbKDtbSpkrEuM^qf z-HIJHAq%^E#H!FVMU=ZL8N^18LdV8&geNtU%G_g=uo2x4)`r<9g-m*x7>*bSr}`P_ z7}p?rUGXoYltuTU$Voc^K+;aQ{k}fHGl<{Hx8TuH9vkDvq4TfheGs-W{eW)9g0$+a zucJqX5PrDzsT5pWA~&StoQi&ntgOvnqv|~+*F5PCpuG6z*6-u$!(yt10oiUzPLmEQm|MQi zoC3y#E8sc0e5zCt}@uEPzm3h=t4WmG)aOD>kq^yRg~!XSL5s49+P6lzw()Tcc)g`^0( z?B7ZSeFnKQ_rCg(7=jOuMbk3My>Et3&_37{R*pwO@{3#4Kl{l{R@AYIO0D8wpdrvM zMhiZEAj|4fooE$)U7#Cqd6HUp{f)L3HfGI3BvQi^aUsKV$m%&pFQk>*7z1nI7?|Gl zNkSl!m@ESgRI{cAfG&jn-XiliVO z4CCW-`No9iP7+P4AP%PBZAVYUr-owb+RET`8g?e@5MyK#iAry3n0X2tz)1S_79x0> zX+}^}b`0s!?AfT+h0Y1aa%eiijN z^0=EI$voAb(QEtf<^+@{k(-jX$$M7+LB6r2cPC+1ENRLX*kX(&iB->A6Ei!Gbps`K zMF7NT&~VMX%^ANXEw>RYJ(9{W$+XQ+K6yVa%rk*s)x&g!(#?{_wjkuewAe)WuO@`k zm;b)I>fg;ThKS}KTE;%MIoRIUXZMJe2-f`yLf;wc``@#V4^z`65%>g&kpvEqR&{u)qP&zk{_A&~7oT?3oj;2FPs^ z85?3AhuxkBv9DUVtx|+#SlV}z$O%z(TsQz*{^f3`!)m?`ciBq!!g2M@?+V8canT=lFaw)Sdb1m}cqr)e{qy7uB|Rs3 zAGx^*p5j0tdLaSq*4&fen$Y-0PYYk7jBn?npfDG_k-NEAPX=7tS0UC26>O5S@IN7O zOHnY3f=M7+lu}WUeI|O|aSsH2=F9yP3heQ5{382{Pdi?8@?@1C%69mJeELrNRG<0K zr(Zrgl-)6zd@A2q2+$EvkY_dxj(!fT+@Zz<;b?!I-zdTkbP6v4X34Eu$ARo?l=6~1 zYQg1;caEoxRKuLg5g$^Nc;ZPHJ|vE1f(xJNk8jHt=Ot0cXcmiPq0+3;54p%_<|3n+ zi&8(hD7le~(kQtojgpIuW-hbcC!%xnIq6knS?(r;+>=`Yx1$!^pRRZ^|ce#lg z)0rvB;zy6}8>}L*uZhg}kzj=%k_9@E=<>K#N`Rw-6h1h(_S%AcExa>aGvRe%L9*WH z`~)f8g0Gb8b^hl^^Wx)Hg+iLZxN>+aS%j$y+C!~QKQ(W3i_|9Dq`4*5F)`0A`VyWs zd5r&_Lksd7Ow`S!gs^5e$MWLAF%u4Z43X5CusU1Jo*{H~@odzwYS=(EMcTnJnU%%c z^Au}uG*{+MJFwt>7GzM-J~lVa6?9xk+Mv`06YY~o0|`r`6qGjtXsAigiE9|ur(N*C z`_Sk+V(#(O3@2a<>@oM9q+SkIb``O9pEm203C($AHZ5^CAw3Jq z*FS8WD+2NP4f$i-HOrWd<=B;TO@okXzh&&aS zlU)wBD?ooj_gzhsI>RuY5FX8f>2@A5f-#3FQ;o(Gz;>}*Q36avdQ;VDIbnYA8#a0S zb7-}LnxHoh>F=kv9Yp%@tKNI;micBc3~&7@>iZ4$5z$SBum<~a1ACH4szuwvYK6B@ zEdazZTOj28xQg5LsmCX_#Q*5)4~4k-la`^u-*FQj^BHMw<>IE(vPg0L3pTB2m6;Z7 z(;79SX+}3_-RYZf>d5+Y{oqMpjZ_l0UwAxpJlOW=#-!5r7o&x0s>wC^z19$3p`V&C4x1LFm?vG0r~ zT6i>aK#T@tPH({Phl1h$q<``wGb|DJi4Vq0idpg}eSDLsamSz3)j)Bzm?5DHM&}b* zjZKJAVTTQ>=yFBS_v)#|evgK^<#E71EVGx?D_EvmS;7&8bU9h!bBdf_mEkY0KO3J> z+oWvmHM$^aTh5|Ob!baozpQsHUVVPVsIz-eF!TE1hqG(x_>kA-HQ5E+&lVo%uok}9 zLCK~cAq6AyOem<&)SyAVQvBZ-UP53yfy|LV)7y67f>c>E2Fc=PvkR%eYP%$S@#ia zAB)Izz(KM#%v>eos_x+sW??-w>;V1)LP9g1f{6R#bwRqmS}CzmmLQA%+LYqtR*F;i zCN7o10x8vV8zc8nulRt92Aa)@Ap&m@1mM)Om9udm+ksVW=^Ii_t}vjBui74G#ix`k z8k#id*R5LO)o4jq7awU@_E(uzKfhD|=KRgvKG!{NbP-Kch7x`T9qnkLLmlnNmr9Q3 z%e@{!+>f~A%PX);xE#c6;&L^v1TN=bD229j31?KPCyA2L0mpvv0XTYqITa0dRu_pR8dB9m_|wRQGSZyhi0D1Jaj zm?rjVh5gxe85$k&Z+Y|P3wjKBofVG`RFINy$Rn`O9IissuU#KR=sAWkM{tSCM-*#V zgX1h2k;4W>u}AS-3cH#v@{E)^`!#tehz;nz_(c@ygm4xiOX(;Y#>Yfhxh0kt@5qxC zmJ~SnqRsTNyt&yet-N^ILb9~{W|yZ9tab1qj`Ey`lKSa#6d6@bgj9qw?!v(hW)MIx z@!bnc&DL(WFtSd9)L}9>;Y4dA|3GZt#*|~?hAE9p5~~9)xLze8S)&_hoB}rlA_`W* z3>t_4b~Wrv?_un1T?~NN2*!G`eZnrncObjSnfOBL3aD||zJYIFH!?Yc%5o~eP-13o z?hO!4P1_Ayb=oS4CfoIadE>;*x0(D1**`Ow8-4?AWte@oJIw;&srjZnRS6tveb-mm zqnySR1cC74eS<#cL^(dTKf~Y3W+*5L6M)>>a2kMf*B%-Dq~e168EqckGpJT9vmYQn zkT)=MGn9szBmn=1K8p`ywAmFWeDi-^Z|#kxA`r7aJUHc9_H3)iIK`yL3^b9;ahMF! z4FioIQc#eGwVl^D6LAw$?Gnd6kuWqjJa2DaoqgC1OM2jAuG=cYxZLF7@hP~a-Yoru zD~_l@0XHl;i|=zd`79uB>xe||4MPD`l}un=9HVMt71%m98h1*g?`TGMTN8s7H*+TV zMEdu}an<>Of(P0!RjV&(vB9UC8YYwF>ne+OZf!*ah7sBf*r1!!UL1RXDE?34M`3(o zu?>BWU{jyNPXI~coFEqFm$+<~IS22UPHKTJ{W5_*nBl&Lpgc=_vEE~(*w+NZE~Vbj zUl|iLb$cP~$&Bs)gt$Yr5wx2-av->Xd)4>iRYyUYl>jW@qv&MGqyD;TiP(=RDC^CZ zvqxWtbJ(2fFD+LdeTmlwfXZ$v5(}`Lj6mfu7ne2{VuFJ;j)$W~NtIaVDH*i(9-D$Epri^J}i(yI!)|jYN6a6R9wCy>B z^ymhvMZAH3Nx`g_ZsgdxIS>K_Z;H6&Y&xv5X4h;k!Tv=?60@Ypk`HKcAZdZV?y#}S z%wSR2;8?;-JB$I3giQrLe+gq!Oh$8p*{DOYmli4K}sMAqe$? zXE*5HyvR>R7)Y!}-^65uiY{o=q6=8p*`3gh?3V|i0n%EJH{(UKMYz&G3a8s+6lMrO zG6-5|GV2zi_aZ7t@eg|LBA1jwtA4jcWpb}DsZU!3pdPA!Bd8-yyWM$Zy`#>#F8h=c z9V}}Olv36lSqwUr8jrmKEJM%wCYeD27CbCU_ohTlMvtXE9OOdo(A7y5zAh3S4nU%k z-dTTLPz8rTa=ydKBOju*Il@?*W(uQDe(s;Kw@CP+lDPuZNytP4bf}}cb}Ur71GqBw zu+$Ic{b-V<$%qWqmmQsZzIOdaMv`3M?e_c=TZ7LaoK^qXm-1=e1EA#p$|wTB^{e0A zzrjDhnIBP!Cm+cFMY+`mjPD%Yr!hC?O#Pb!hA9b!Kh!#H|9~y+O<#E zeyjCo0Kx4pb*K?nvKZE^Dgkhk91UJa_*aW4K4x?mzJsUIOY0`(!SDt%FRmz?f>8nx7L3*OA(wM2UQllyubT>?)%@W|j8%t#!pbus;$qC)yio}hh zNA9KVtT;=&q|@?+8Sw+aQ+8+iJw+#9u?aLfi8T^oQ=S#10jXPMPmoyC;k~6EXMfc9 z1G^yO)2ko-CFaRNf_y%xDDpl)nAIO5to+NO1$v6mhpag4wcM!{+gk=LbtD;;?jsB5 z93$i~X}K(U|7>5n$$uPdtUcJ>x*l3Lkz%y`HQOs!87F+XL*|A61%=E9d}nEFnWAPFN&z$$Z3aA+)a;@Y|UVNfJ8}wd@Yb{Dy^m%ly`^ z>o+4nGXkL&kl^w0#7b3^nZ%vSOyZ(84qVj6fr}F0xhQ9yi`qDFQ5y#?YU9A=9MH`A zRpY-5zg6_oy?&}xabq9g%}7k-@_e7T_krw6RBd^9SdpAbqrgY=8r{hsY$@ou%=T&9 zRRC_|uxpD-@qMu2^H)Xx;IF>eV;1EtJ;*Shq+w4F!rD{T zD^VWh=MpNH5{oZFN-SOl7qwQi*teR+L@`SGXBCtGS;97}uQ*=yQx%{%rFm=kP!5zy zg}Y4ZbEYD{Vy5zsfQEmW&sF{z4HT1K-$Z1y#$ zsGO?zLMhDX#Ezid%n7ed8u>RT>}hg~a)?QJ5$CRt%S1~8!}I(<*xRUxcTmbU1%56C z3!-vGoJ+T1@;RwSqeg*XX?K;wn>TS>@ynfvdpa3Qu_HkKocZh`(2ZY`Mig%S^N#X_d%)HwK`bbX zW<2G^Z-KCN8=;p55G(|Awxf`qbTP?S6fGZre4(!GpJri0=pv!c#ex>|n=#9f8=$HR zLSYw$kOkKS*&ZUDp-4C}&gp;~)TEoF8iJ5H<~uZL4-wHY$%A{OI5v!OiV!ANGj6l9T2b->S9gwsw*8zb7bF3Ipyaz5- zqz?Y%LBOUJWCjUy&BNG6sHEDGx?EJ_!^Lxzc~LY;2nz$P3!h@@$m9Xl$K%Q+K?seefR~nI{u2r z=*J`4d4-L1c&z6g86*wNhvJI&C{hL>ty%}A_Z4>?q~w8_%$8=tmt}*)fA|YO{;nT> z;L~sXj&BW!l;f8;B+_fr_^C*lm0|eye0+u5EIVp;wg3bjz|@~Ul9e8`pgblIUKfJZ z$H9)Q)kFawL-ux&igj%!Wu!3zhn_?CRi@pvdW4mPP{plQ@-(x&s#hkFu`j$G?;Z9= zrw8*m-bu+Z!SDp)SU7IAS1MZIfqf+CV2|y`(ZS{5)ZE4AfcR~-0x38`e70oW3e2j7 zd7}b`v4;D=0(oD`Z(%bnp2;hfUJiDdnBAAT=Qs!iAO<| z9W#)yhI}FgqZhx$g3*iR(zmf+;)YF#GK7guR*Y8+z|>m8<1QN%PaP;u-7qfPArV(; zBA*MN_E^LM2o3mqgK2Q@~^sg?ej`;3S3)ZsRqW#okV!?a6WBuc+ccM4+t- znm7-k0me9J zJ5#TAXXJi)PizROsAhv1;H%Ma8{o(YG)}L4&KFu|A%|1O`a_JQ7{r^(DaHg6F^U*Ib2O$ z<&1`a%AB&&kDk1k3lhNQz%QHeoO8hR;4$diN*C)V2RyvPlvn*IYi4e;^4CUYmTZXI zL34Tupi3wzu^-%!1Jrh~MdXxV0C7QKNlS^=KV@F7!M121ExkF|4f#8IwPUMn{a*bi znH0wXjpziI*W?IOX0W|ltWT4<%Xa8hW$&Sv_`Vz-pE~_I9X-080$BLobPZOGE+Vq+ zJv7~_fJyHmI$*Mk&p%bJeJgI_7-MadA=b*R-)hAcJ|+AJdOI3k>`T%ThDvhir+h@R zGdjyyA-E^I%?=#c*E^fv=KZ7eU2}w7oq^aK#;ekf1Vp6G4d%=kPA75|&$zuoifD~e ze3EJdXGE#vCfz7Jq=O8CRS|yvO@)^t>##dLpwopjCSCnX%fnj`#HkUsmXNxD4Ia6P z?V^Q$e%vTn?GTI)Ts3VaMUiWX(KAuX2!MAW|W587+@Zv(ODOGk$cil35-Dy z&EgV*u0m;bc4IS35s zyP1ZPJoRu*or3zc!QRd@?yHR|Y9GN1ToH*i$Q5fvehF-zbg1q-$_9l5Y6av3Lj zYdZCO#o~|2ZtuY$w}>K)Ep91Si=U(Du}3m=>@wc}pzVGDLkq4}y zNzZ9y*L^mT%}64i0_+Y!SY*e;3oO-NPwIXkj^{8!DB2$HD;GJ8EhFV-IH!qACIk+O z_L7kBwxvVbHAN|!*X07wvED;CPGFs@GUQhaxhHb>3np#I$3 zA;9AQ%ImgHEN+Q(#NtcCI#Lmvt}+Yw88P&pT&&AHl5(jj>|$}~5mCI^2h{Nz^${r)M=?R{zQ zRBxT&$_L3J-9kC}^_l(OtFGglYH&RMJhRT9@PM1Njn?c*oWy!c#2uggrn6g2q^1Gv zi6H^(_(B5U*Q(LsGyZ=s{uZJ*>Dkj7eP|tF(pMU;939SRwVDPfiZhE_Ch4yi+F$e& zdS;)I@2~IGhblj-o}{lOOXt=4`~EVg(T{z|&YrD6h5IYr&DU?Xuj@DHa`yfb1F(M3 zzd9RV^_cGKXdhR9R)DELJ3hv(Wq$VT*(vU)`U~S@GDJs*5B%#>a*DxFXiV!19KZZ_ zkwaSSz2EebxA5Ma*PKoBKYhP+x8|15e$%P9XzKSf$==zj-@xI!2B$nEIUw*eNF$Eb zC56AA*&oN9MRxz!H-7-^c7(HfHJrHr+OwT+%j~tRB)#S>x+zO@%l^eKy-M zW(kwY7yn7^Igwt9(wxCOxdgS#f_zP$8fPZ6rP;F~!P<3ww$hF@sQadqVFEHn*cB|d zc#J=MoTkDv(*xJ$w0ik!?7$1N{(5Qotumkr@sa(J*!u7K8xKj{w5u=PqnX$Mc7wEV zB=+Nbvy*oRo${HK?7{MT>k{%cLfa~H`Qb|E^+|k7sZq3OPB|1EdnOe(l*h!dUEq2o zy9ck0ZD@G1ZUjS#Ob<-LFu7Bgh;@)|u`|~crGo3SRkdWClGo=k4ip#VKygtH6qkeOSX^|h2bb%x9=WV@2mzPtIm2e@GICD$=&#$= zGhb)eoTtn4IjVx+zH?gYuRA%WfXiJRWy9rej)maz!s&&&<(}zOf1R4{*5w>Ll5uDP z>_kV@tRSgOb6Kv(%$&`8){!YzSxaME6^7q6MRPh*u7;;5$5Zqxy(u~RiMq&cQtLl% z0;yCxk|}fY02FQCH@}z#zZI1mdA-$S>1u-s$QBuP#lr(e4!T8&)yOd})?uaNYAHj!8m;RIWnJ;mm{f-h7Wy67HC{pGFs9*k5%AIOFjXpTJQxio@eHq&|ZVAFw z=k4p=p|&+OQ{z95Cjrz|9E-rm@Kf~G%kxoOoay-(=hctlpP-+gl9uV2VqF-lebqv_ zOisJTk!74bVnAwpxs9Jl8>_bH-3zx(i)P0P7QYM^4I^dM`VPb4peDMxr#*>C0owE2 zo)iqfFjYO9j!I+yQGV;wym6VPS4-6?oD0kjcPQ3G&3|2>5VRO;N=IF7??UUlIqLuIs%n5uN^7!nc2vv9rEusY)Xt^QKiiMjz3-iX?;IgTz9Q*`f__Dh{T<-U76DY>+;dD} z2#B6XIjBSb-Mnjhkxl&~MTa=OLU)zRBr4euY+w#O>J`&n_MGvW`*P)yTxc@MxXM?=2E`w%=BvW`mIXucV4S;gwt;a` zg4$qQHoY*I3%4bIjhJaa5pMWw45t%4iAfs~?Bvu7&Sp3xb+-2+&WWrxIcN+zqp=W6 z)K+>+rPU}C)nO|Zs9j3_8bicn7voozhj9ng7_$VDEBsyUDR&c@DlO><2*&XHn&G2K zQT_B90+Nlol-xKt5SCn#U@WGTp4|btiCCH;ypB{UQI*s}cS-olf=l4kfgkxtCXL%q1mfOVG zX2!$-EA4}*fT^3WCjr-8J30l3AAI%U*fH?x3==xE)3AGNoF)Rg-w^tm%`(jj6`mU2Cb3`IPi4X9O-M28)wQ}ce{ImTQIvov}9n#?VLuL8W z!&jf0vU4rsjuH00Q_<>)=->`E*NQ@yQn~Fc7iDwyh$_{?(FRMXmO6j0#-U48&)HxL z3aT%qYTVhu?6AH@pcxiej@uk60X`@VuV2hoUMwng>Zd^mL&t>hV+oCieg;6=Y@t)5 zV6aO!5*tguDfe`baQWy@QhSeYoo zg^n;Ow;rK`BiS587mT}^f^d_XkZJgmLnw~w52rYHhOO4#SZRR4_=!BZv%LKRQ*j@a zX+kwe4Z3z3HME3wI+_r#^>_4d0O&ITNwyU6Qu4JUpgXffVx$WJxYPY@d5vN#sPb6%eu#E3uBSo|Ye^!(e(C#u@T4=_&z{5FYo3uqv?# z378N_nj{_uWF_Db?8Z%i3{1eXoj1^(Nz;%(;s`n+A%TgTk1w5&V9)Qr*52pdTUEB? z2lGuH+PCgKXFt|n@4eRAt^_sL6dB42F|;ve?J*7cq(Fi_OvE>4m^2Ft5Q!aeJ9wsS zu7Ivdl#Rc8O6&&Y$l{FH9v(6&XaZ1RRt)SZuX;XYyW;2z;O??4KQEMm#|@SOJqJEa zytL`xN;S=4oGB3KS1Io(g$kj+jUa$DPU{js+bI@EmUVcT$?idFm?c{obClU$>d$iy zWEgU(ztco@CUR+S6_12}u`2Kl=f~=Ota->Vr^jwjn(}ls1aT6r$B}fjDNjeEhPm`N zVnXDqN_Q!}nubf1 zUPHqrN=In8MCr9OgR8kcX-bzUorsHDP~}(P)cfKx9*dD=x+UQ<7hq&YH#8f!s^X09 z1{ro`e!PApIl6K0GSmUePyj}(YK(3|GD1>wEtkp#LB+n&AwCsq5>=JD>QfhQTPSrJ5RC_)Mx+#jTPWMA@>^aUT6Fc38Z=LwCVwvdYO4d!jQAVD^}R1k~?O^mtbInnR{(5DQX9r zv12KtziL7UhKZL9Mco_22qL^}lI`MAs>wE!48O%&O+MR=26=P7LNzPSSDwC;FdVJ~ zC!siY#36SQeq|ZzSe6Y6hhU1}(D|??x@v*X8lH{`EzO~xy4j@kR$X{uD~~xuS;5UP zf!8&Z!Z(Tmd1gzGi*;7;)@4$MM=}-&JQBgsXt6XR7#a}_P2s7-7oH1KE44seEr*JX zWdo5iJG9t}a)we=_`-E%kAeeRdo4I|acCmH=y*|h>ar4Gm9r z?touWK>s9HT1n8(6`5TZgPnLqMr0|W2B;M(E35vQ6Y@dXIYVa@>`kIRty#jjehp73 zIK4^g59ZuizySuFI1T;Vrx}m^dmTuAe>M|7YOat^>Z;j}j7L>1OSU>S%!UZij4+~ByAi!dM!DGJ% zsat##V8@>WJf3!Nd|YlUBXD$o^&82gwevl zU&Sfb*SMo1-%$VkoA|*2VZtIU9u=hoEN)bm5kV0FmK48AFr5QL{1uGjEo>qFH3ECO zi35va^WJ|!tx&W}#?98`?QH6(Fw+{0pq09u6rY!t6@W2B3TF}}m;WxJJvh@lGHI7l zrHhK(3A0QL&W(at{DO3@27(bIT^=(8^W$ts8qDs<2KeFxy)V*GgRoTw)%6iY8g+er0H&UpgVHD#Ybsnew>7y1 z4dSKz`}HTFdy!0hN`%sIynI#9*tn#=xiWBnbSy659T__eoi$20d*&8HR(vBJpsu(m zKx9BMB1pEtY`}Lk=Z-c*mp0Lug|_gZoGk9nBj>VVdAa_U&lJCoNIB~M3>&OgO?7z8 z*^KCGr8M&`L!}E=!~BzI>)=ImTZbdnCiy6$hFwU09aBeH!FVzT`ILzU6$F5a2ezXe z;luOXQVuiZnc+xxv7Qfx{APP;`sPU8oT0VYn2DUGIJ=~=95@}Ik$q$O@%iv2>KiMY}aIG11}c ztiIe!?o*TjkLWaoeaxfYN0Wt3f^kxUC&C|JN~;9+jrK|)Sea}LKXc=WJ$ppY;*vH* zMXLtO%^!_5uZsQaDs)~Akg`b~U6EG9B*3F5((4)8xrnDHDfW|Ji}z-vu?2y^fqu(X z9)A>A=yf_?qY@e>N@9*tTD-Rj1n}^}811K{64ZYY-Ps(t)qULW7?I6ozp;4Lh$Ef) z)}WmZL?t`Skq#L&WYdDq@GFOiQ_g(#I3=rO%0o+R-VVlU(A1qcn!TauGt$S+c}NJI z>*HYR8U&iEnM7F=3;28`p6km6k*06K%Xv z)&uQ7lRWSi##UUc6+hpT^je@y@Aqf&H78pqShH1O>CPrj4GJIJu%~<@DP#n4J@Etq z8SVO?{`3zPS~{TBch?@Rzxl|l46k5|?|6#+PM7Or57Tvb{mERnEL$Pkxz4!1y3ea(0+qUU$#%TSDn-xT%O?S_$rGPmZFBqh+unNb&#(B~MRRMu)!gz?u-Kb6xA4rOxi#PF&7bg9wb`Z5YZmGF zEVMc6Mqj8;*rHj4HyuKVYKPE2J@WZCwXR1YV(*jd?)>P- zerVhO{P}Co1XX6|cgEnzosXQZF6LWDo-^!wd2z&)mz}9*?y1&aH?#FRX8*Sj{=fio zEiZ2Lp<4RT#qUKQ!q>B~a692`V&R6clt|)`Gz|9`SUJ)w@m`7j76%=yqmQx~=-OAS zC_Y3zU@o@k5ihde zw#^($5iGsuRmOQSk7yW5V`mzOpy9B`N%AUQ$+*vV(1N)=fR|i(dD?{f7rPXks`L4J z=7(Tw`jQBns;FOcq|7n5>UaN!gmOhkklQKr>Gy<)rOI=mOZ=_VYfo z&zXHSjY!W0q;t8zLr@$p8*m}a`L!=UQ>`1vi*@685g&X=bFZEPhoqVkqOGm6%~16C zy3>PZwGL{HO*GdZ=9RdRp;~hG+B3ftK9*-;I8QMMswgq&@4sh|1fB6DMe9I{oRyUw z0TmVeGax1uy7I?pRvu?MoJ;{r?U(Y%FZwZUpTY;iTY96u_{Vw`5nqQn5r%sa^4U!9 z+_gVwWrwEp1KZ92Tjf%?D#kGxOiNf#3|7lACXx{!>=Fh$tu8d~+LAw%MO&vmX)ulo z0XRgj@f*ZG zCd#o@$nHvFngBp-vj*@xcfJJ71gtW1^e>@?A<>Ebkg#CHU==0elwS^;b=C^W=DWk! zNfPLotZDL4DwPPBgh7ITut0_ptF0Fv$}LAjdOoRb&U_<_DSP|LyUc_aS-HZvT&F%w zlwfPG4uF(6c&1&pNZ~|la-(u>x|S7qz6Y~p!vj6^DY~#ZAx0619}ojjUbyKM`j~K zx`ZHWNVmgFOb7)y5-G?H97+c!4P}oqbMb$l^b(#02Na@kE{?I>v{P7>ZX*z8l z()5%b^WYOy5QP~=enyg3l`9F0S=E32htE?rV|0%vq&P549*5yM{TXNU;OTq3yM@;E z8_WD%%{cz;-7Rj&CJ4^-ua$S&mzZL|{LtM`KfV2(?|kQ{`N;GB+;y*b`R7*uw}*M|(fp5o@zwi2qUXN%t<~FR4}MY~-}>G9 z&lmW3nz!=nZrk;5zvHVf`SQ!ol4tJ- zh$=dUe@JlI@VbNO?CF+t`y`lA-#||Pn(PTZV*g3*j4J)tpGf|PjVmRlPeP(kJn_}X zbIgA-4%E-WKje^sLZZ>_!8ASaM^ESh`}lVM$QGR*BIFqANyymS%lr;eyo=whMzuQr zS+}Vp=6?Ob(@j@jZ>-4hl2oXs%Q8_vIl@#(dPb_*860fkzt>%LWNyoKzkTMxGuPey z&yT)h>!bHS2%i4X-N%3PA0Bw0J|10n`Qslx`T>3X;8)%O!hej9QjKE|WqRGJzo`D} zOYeUR)A-8tZL`<^_^)5f)8F;7Pn`b2>HnaQKU^OE(4Xvmzdk;3XYvcP2OrkQX(NXJ z!pDJ*Pa<$NOJqlS`piAhf}|yzcJ3W6YQrxA|2yrQd*D|0R3`U2FmnpOi+*0$%3BJ1n1qo|=d|m?OT-US!^RDlWbSEBmebN~n8MB&*yU396=C97{uR!U=&rU|_Xh=$L^L+8=Fk*$o`~%%wk#DOy zH;;JwA${{C>M}&ReJK(E6HdPi_hl(^8*#DQN8sHl?x-6Nr4wxQJC>c_D<^*MT`>eA zdgal+kihg7PY@6<%_}Kl)W#ioZ&>VOe$*NN^vGNyQ1Osi*?tLLcT^8uD1vEmb+#$8 zfLUV!zkU(Lxt4e`M-bq=&Uf>=TLC(8F0>oP)uPH@5LOJ&F)4?GQxT#0Q(@b`x??4b^Pdnmg_1AvgXYx1AOqw&Pk(qd`T2|lv9)J3a&C{GZh}edG zYp0Z|&}Q4LEc&imTQG6-c>Uqz=-z?q*k_!Nj*@)GQ_$-F^!8ryQ)vu&i&0GV+Q9?@ zDM;+Dl0_y#St^uF&`@+E!pp1C3tmMKo`)p3jFwVw|j zj6-c3V{}>Z12LzJV;4Ome2i~)RobDfK!&9L+g%?_1?1bbaNgk~NUs>_T*ormF zYqmo|X9UV<2=bF8x-Y9D`ZxCEc}D2I#od(j^!FFdO4AX8iLZEGkzRS6vK%q1$Z)_O z5f1Q*7nKz@D2Oc{`9?uN{L2kZkA7L5O`;vMhnPel1WyJ6seQbV2xQ|KWrgvor2ezN zU}G4#&R?2fdDega1#J``AaA*oq2*0b)YqJY2v3K*?`bg_1wb@cpob}V36`w>Md*bx z?~^P$6kiF;HqcJ&(;?g_)Y)?{!y>E-c`I6&HqFq=N!=4qvf|T%XQ;0dXe!@L*O(S{ zdcEgHj&?6pmc9CSZ#Hjc15eLE0iLRn(ux;^8wnV-*n9F0iLlHN_=jQ@sN6y1dSAS8bwLaj21e)AVsaIn@TGFW7G_uAmTgU?Lf^ecahMJ zxoT=F7I>SoV=SeO=f<2oXcbJZ2o2nOv9Wg(c%ywfaWn5iP2lbV50AUDI ze1o?*=a4)PU+|Zl$0ZM@Jjf^1t^-s!vIn~6-qm+<1Dnc4NU{37YCq55+m#iHoi0rP zzuMek6)_Yy1_kUly=uA|PoYcB)mMeO$nbE!!7+&x-y{Ez&nG_-AX9&(Yj6|tty%!@V@taUGLXhDA?z> z_`;CP6skY-xvcnWSfF z0kQa<+oo>4Ufb(H^CX4(i#}S=^;|DwDwd_ddLQ^Q2x1Sh;Epethnyp@+mvD&i9ttS z;n2?ZtDJCL!Fpiz1K>p|)ES@~EB1|FH7@R16nLCla_n;bpONQ;_GgvnECZH@OcCe9fLEjVDjL;Vp;4_B z8r52%QLPmkS^PBATCp%IL^N1NbdMK^A;$>NTH+pkLn@T`5`BrdnJ7#FdPmWy8MQdw z8B9j3hu2RIC6a~kOnUwwi=#vPi~<^a=giggDAJIHo1DPP-sK!ZV8RF$=~EV5yp@uv z0@I}D|DmWa!&@I)CSPfLvy`gmfT9tEXape|L5M~Wq7j5>1R)w#qoGkX8k)_R#5Af# zL$i%D51I>bn@pREQ>UEQPMJEif=FzrgOfb~yQfcy3{G1j4wj^~gQV;T&-e9wkdqW| z2qAty5SfGraFKZH&JASFDk6Orc{fmhCWB_cHgbK4plrnv?AV#za5ZDP@pp`EG}buh z;KloLCONeEdQEA?zQi$w{i4b{9auw{Ok?;N;Z27Gr9N6uAbcD?;ip)Nbh7w&DT4)? z2djFEu&U=+1vxK=RR{-uC~*J@t6+6nFNT7!ijxsx70xzc6-REuD%55v@c12+Rf?>V z_X3}RvPwyIRaR+FmEX2S6y7cru9Mz7mm$q^h;i^^ktU5ulSYU~BgCT-;?W54XoPq) zAl`-0WcNvF5<>%;MDcZe0(#v=&?7jEiD|LRK@a;z(8H%C=pj7?JqqXvdemYQ^eEpi z=y6si=yeTx5j150%{}Q-t~JJ2n3UZ2=ixnRSZA?ifM=swQaW5x@l`K_|CI5pwx&2m zV?gZQXY!@_jUy4OmivbY@@=Ehw$W(YXrznL$Z1A%0bF2MH5%26=oCZxQ2m)i9mG?! zymnA8CIZFh_Iq=DP*QSMZ$r)I*<-H|RG<;3IZQ=cgez1VhPtR-L_O1@egj zVhZhx9?<5&4!#!8HGD?5EE^^gUaw`cWMQIRuRI>$+57BNwt8t*@pB_p#o0EICynTm z=1De~AXw3*?Q@AFXsfFD#rkp!0)a+V#c5PkoJLi}d1M!XX8d)X!f41Ppb!wvVMWuZ zF4<}|ucX!#%`L>%(0m_N%4jYClY%-zpc9zX$Kje6hv+e*_UZKfif?0K%JN&oh3y%~ zIq}%mgo+Cj69hn#Dmk)ay*`T5+KT!kV2EQuKuK)j_F!c|Ia09e2~7M>)QV>Iq;J@h zo~mZ{$uP(ap zjuYGu)O6}-8aoXriniHwTElJe8q%)?6{7(bFjvV(>MT*5cMX5c+*@_#sO^9+Mihip zJr3mM+nX--*hQAnA)y%WYC`p7CeZ=&-TnfARh<%sqHMXG8}isNGd|LtZbyKPTlwAA z!D9pL z@z<%DM)HF4-D*0a>M_fw{tKKL+_s;qed>NCzo7ezgHI5w&hiS%viVc4Ja>xUG7)93 zw)849gpY`Q^c(guS-)VPRUq>NA@l;Q5_eYeyK5z=ZuAjU5`F`K5C^G& z*beH&?TMABHNlt&Y7JfYjo+0MrVu}OEYIu)<9w0}JjQi2l*c$gLwStDG?d4VCe%WkzAp+0!+4jGgNohY!iwys4R2tjL$!&V+J&F#C~Jdw>Waq@+*umI|gi#j!FZPcyPY_N^2n z;?$%);pjp_M%4El#eYL`a|XL$Ox!A$5NyT5_^V$LCHLMJagJH$IJcNZR$oRIu6$qo z+$E+2w~UbVE%}cS7FB;f`H^E17+Jk(-XEhoKJj>oXY)n9KWvc=NoAR&-i?0>DKCGk zEDzi*eA2ypvqU^g9sBC*u-M=-#V>=C2#^hwOXeV?UB6US3ib3Bo-XX!&Rl)x>-BhH zkEi=}%BIw%K_22LlEf=w;FxO)N&9z`geSaozP{}sKk&}v@SVr59dvU+-hP%`jn$K9 zcb^e+4}J4j**g3F7$tJx>}mNjaRZ`M=h{x&N6Eo=8RY7=#U`5@znLCP7Xaey*-Qhh zUMS+{0v?ox$J3*_P>1!Qk4ZJOPupatV1en|E$=@~SUGbgEZ7FrVux}xWe1@~4Y-MH zlXkY-|7%aN{1?ry$kPOqnYDfnNA_PN0x`H<{|$e2k1@K0Z;R_5Xlvx49Hv>llMTTA z#wWjjND;yRUE3D+41n5HcWREi>Rm?=cqEN&0?Zvifc7CUB?F1J?mFo5W?n)fb+((4;{hded^jWFXO>D~`+8 ziVcEG8B)>jP^fzYn_MYC@!rlLAK~kH!%nPAb{imWrpK6m{EP}3GmY^p{1n@mLrA&; z!?!uF&!$`p&SAQ8ANlu23K$934l7ijU;n|BE+(4}cvY)Z&JD|z#zdCES#V(?-4CNo ziKnfvJ<3a+3tianEpQMmja%%=}jBm20^|`wQGD{kQNf;(7;fJ zgiekpOch>yuLQO%pt;^M>bwu6Wb~UwS4p?{Mn1$ZyFo}cIh)kR_y&>_l-SjLVJ|c- z#bmn*0P9d~ZWb}Y4B#WkI=PgkjG|D7r}O~c(ayYD8RPbhJ)}o$9B{-aL%z34 z9VB31R`)EVjt{NlWdb*`K>kVK0CZoPfM^i@*);w@s)+x9#NwUqZSj#$G>_POI?C~% z<-djZ^Ps;n)4X!dUcn{Cvcro0Kf6>u%Gh|_;8vVR<9xZRU?4CvZP;F}YPE9e_twE4 zir?rUb(A;?fU-IM>^;z0nvuLL0~}XTFMv`4Ubtw^;kG&Q6NmUtE52uXlDo`{2Regn zgrj9cj#vBn;%vsuf&z;MFq|1;=0)Oi;x%X^Qa9}_Ck4KqF*1`b=;|#z5-(4q+y>kk zTSw4fSx3-b-MSjC!#Ud6J5i052x%9;mPNyCXjtX7MBTH}@gm|`o^0>_$#h~d7as8l zA|#UmOi++n#;92X-{3cS1ZkcY8X-p&ILG>lIZ%V&0jVOdKtW6>dURv|cOZH67tp89 zU<2!A28;6`R50!NBXKDNOR0OL!pj3>|F!*t$B_1(WT+?{0L6N%Zdm2@Una$mL~M0C znZba+^Suf-C>A@05@3OwPim!P zhLHc?4uN1k;ZU$ThO;49KpR0CMZfV?2~C=}W0V*$4q;+GKVa+^gehY!FMdUgfq4jG z2uT^&+9M`%P{qMVaSsjGx6h-!^7;=V#6!eaGl0i-q3QT0hKkYS-QU2K+1{PUZH;VT zsQet@8P2Panr7*WQo^)D43}B2hFamsxm|l0mV+)tVL1w zVX+>0mDm5QoeRNNL#Cv-AV~RXm(g-vaFOlFmlj&Wi7u=>GOJj@;K3E?rp4^)^CJ#! zbZzk~8flHvykRah(i&-`HPVEd8**^-m$XJ2X^k|S(Y$E3=zcRl@uboH8#KCqgGTpn z(CGdR8r{D^a{x~(&0!p?G&keLqj@FnU7B0)P}6)LH*V0}Iv~#Hg1BW+O5E$M?B0$U zY2M6uL*T9$U>;&nV1fPprZ74SEJbG{!c526L?6vnU2dkp+Bf$@?3X>{e4A8HzO68I zwKaLPTB1(LBdB^@wTVcLBqKBtR@IkNp?jzvimMM8+PUg7t{p6=ZsOYnAG)qA<*AGH6h3O`soKET7c-&uLB7i&8tNl! z+4$l&m6w*hKS6#!>~|mkFw^4KCZ)@%pz;WK*!WAvLtC{EoF8ngB>Y^3%gYUPwN}HK z)01E1hV~y5jHo;!Nzn0{n+)Q;{UqVj{5MIsR36@H-K2x4MR+8hw5Pz93!N~wX5 z>5QKRXi#nmZEjN;Dh3QnZeZ-$2Ap6(I<_IX;YbOeB1KGs5J0w>m5)KTak>s6+h`PH zkmWi(rb%y`16;$wg;V?HU)*FPZQ;yq13Qxh&#gAL^>kX^@7ac62ULF|d63~*!^ zi{2SMuXt{2@StEI$Trc~d4y0#iUrkzXK#K#U(N`ajvBPI4px3sB~jiQ7;t7u1Tp)>kuLlFnx}q4I|i9;O815V98|7@H6;O*>k5%xjIVc;Bhjm40VHqepf(z%|I%qJ~&KWFT1<9^$EDYw?90!W9_No@Mmu~$nR9;6L z*bCW&Pm_7{et(%Gf#;|ix9y;UB;r=HSL`qwc7q6;rB&Hg=?Xq)#g{oHaH23T8FWy* zuUT0`i9@>BHiALA41=+D!%~CuAaaJZ_|B*hJIx8#lqa|AIVtY_Pm@cDWW<}O%^jdT z8nbcdS#Z=-5n(ZLjboVZnl$%tEQ8NsU;Um()Z<>XhHG!w!;X zS5IEFda5_k?XR9*-C41+wYpff+D^ETFt9Jh*7fVJKjaEfm8eK}&aH?K^Tid}j6T27 zKNtGE;Gem3HR-SJ={+r)xs_T+w2Z`u#r%thIcsqIzo-cWH@aztHcrAk=!sOztD!3! z+&*IzXmIYJqCMbEtD5r+r;)Nk|8 zIBiAq3093D_749R;Y^vWaZ;xHPfYzLJgftrpy$T7KU477ShR@RvS1 zgi`%MKHI7%mw&r{bYu$}duGwxJ~#4AbCVzmxf1Q5Mfea_RFg|^`_X!({c95%M!PNQ z_uW2GsS6m)foCmx<{!h@dZvkY^Jjb{5Z0Id3H2tVgdU=rz6i>`zc!w9cetN)_n@=s zXh+^B4~c!ox_cCK<`qXzemGlNYGXv@#D62+=WZM|i``8Za1)3anQAOsXbDTkQB{0! zYCI|yg%Ibn4B-Kb=J}`-qIeTAjwjmDn6vb@X%irL3Gc*tIdVriuSFBOH4-g9^x%0` z*s~4PiZC=43mBftIRRXfq(5@HAOc+^LF^R9u7}`a1I%_FnPIEXBTvTi@mpYn>WZuM zUA>uNBdD(+59zA+1yeiRr~;s{1A*lIDVIh@KnkH7I0N9~EWb8j4(N`FLoTiaiiwOe zfi-{y3d%vZv#RDX!!YHdO>U*<|I;Wsn?E#HYm_|A*jbgrO6sk`nk135jrZgp9CYlR4?+HPWms{M#6dQwY zLo;rvaXoV{7k(k>FcIF|(HVS%QAtR@A{=F2bT^6ws!?Ai8BQi4>reh=SGn$ChtQ>z z&WffKT_$YsjTKjnNlz1`4p&_wmUO6R~x; zodTlau1s|!Gr?ATqCbX#Q*`HxkK*5}2^4@v=wxCeu5F;e#B(jvVoGfxBwn!4`dj!$ zKV|V5ImiBJE%d?sYbf4ln;iYt-@kf}5agV1L z7-T6f2prKOo>l-Ep&yy|^1xc=ZXeZ(HeiWk04#9~n*SdF>&*>Uc$UDTy0oOT(9M7~ ze%}p}?qg||-mwI;M(oU}FI)j!@G3pEbrdxlaX$WkXyg53#-s4ySJNj;4m!V!txBD$ zU}RTkC`?9yrj#cvrd`65uIe!PtKntM*k;nzD2Q4Qv%b!YT;K=su_A-5?Q-EWB z<68S87)99go~Sm_{V@3}87lE4!Chzy_@s0#bYZzJ z{zjj`s=cnxNFDLphvg~W?f)J2%afTj1LXL$BJ$f^oQ_(Zqa6!3*$-?F6$B0%gK5U z)FkT(ZIG--7m5hm{;=9jr`v4l8+3 zI#`*|`O0=0&R2HQ;C1el9VMzVlRJvj@TOOe!ut#)6Bfdu?a-tDA(dgC}8pT7= zgbYbltKctb%QUkfGmYX4XcS*Sql{`A#TU>hzJO-e`423jdI$?vmJ{a4WCc&OLu>k} zrgSK|62z751V$S+XS=C7iV6;Dp%Lb4!JV~EaCgWar zOe<(2sir}$Qgl=m$0~ZET%s`TdJZUYXN8A32(1%(Z2p!tza2P$o2~ilvB<_tSXrsP z`Zs=8cpl_{A4E>a(9~QiQI7t4@E9Y>Ztfgh+D#ys_ghCpf&masN9ZX!xtx|3%t~nU zV}jenLGcYm8;!W*>|_1=)?Lv27tf10SazIlQudLCFaeM)oe%T@#aZ-V{cF}q(Dpr= z$s(4Jk?7{|k`kjsRv1*f;s(jQPUMe7B@5zM3;fp6M@_xzA0skBFi8)pcmqmm_a?iZ z5OSEOC&~?AGN{}a9`xWGWjb~~Q-8#!6AowmXvw(_j6s+I8cm=xOsa~_L89vvtUL-C ziz%!B#Ci!j|Ds-2GW;ZW`9QIbL5^(Y1ib}D!5}2-DS@L)&^WvRB-xtG)O`hDVF7Wl z956`LL-}Un25JU?(F(hA(@e{rI4C<&+dZ;%cJf^RrA;s#IX6(}9cmibtoASSsvR-c zpRrd%gj@5f(UegW&?yv#OoWI|zgL#r(#vW&AioI(sgQB9Zq?>0F+eJ@%8pBQcyLy2a_bTkPR4=tQB#XEP`BtC@535oLa3SG`Ba@D(G)i8^IU@#4e9F?iAa=-~-!!*;^N=H_}n}avbo!T(^=sS&946=`5)Sie2GXoBf2r9~z;`bO(h{ z%pVI$lq-H3iJlScb@t}~z{X=BsG})Je+yvthv^s{qd2QTpTO4bYN-aG1iol-4B43{ z*A|H%W`xIqIf%Byl#MRA8695<07G^SebkfBiH}++CN&5`R9#e~RRxxy29-2c!vp0R z{U<6n%7K$|^Eb=n1uSFAyH;a<53}JLiyjbNka|D#!xG+2tt}i)0Nez3xW*dxh1(0Q zzc`Z*3`)WcbBI7xM90a8R!NME>?O7ZE@9XI*>A_McJT-3E)lzMn&nucfFUE#aGyGn zM2ns9mVLC5e^xnHVY9(Xz2``Wny-RfS$*ogX`L5;l3A6ltp4&n@lWKmAvp@jh&%8h zbr|ING93;vq}KAkkWkZWqb934jLa~^e-&TSx`I5mb(yxu5Rf5V}P$VKJM<^8n!@|lk$x8oK`E;laf!m;SQ*UUostD;rH(SuekE~USr9Q zp#%N^xL8nja+dGT=)BIzX|wOs+ek;183-a%@hmmBHQLbsn{Mz_5qflLztYn}ngCM^R zT^KdCBARJwe5;Mv@lXi_VN#D`|es*O@Uqif&B z&OnSejzy2NnG!7#OUu9w|NBHXwNw$=K2$`^^#CepJIAwLU{J1s@Y^PoaQ-S0gZ#Cb z&869bB0{qbn~&xKJR-vyIlJ*u0Eo7uxWrur>Z3qZ{eLBt0i&as&e8GNq-{DBV2zw2 zRY)d)3N&XFw+)){J0+_6OoTK4E|cWD7D7`p+H3Hr*3lGEu3wsr$bsITgIYxDNqV*7 zaH=(khk}S?AVM$o&LgO+AhZx~JLWc@*Ho?hm~WeU(h0uD)VRtp&X$UDYX*(-#{F8e^#+?nGYSJj*3sf{krh zd?oV!R`HX#9wP6z;sEvtS{OiOO5I^_^h8YGft!9o%LzhZta?KV27z_#tkm2!B|Imx z5GpnYDTkUU9jU2)Fzg|OBvD+&A1&@B`q4LTD0|wLw)Pxkh#-P=&T0A&`mOXv;XsxvbPHd)f_3DN9KWcnk@GeLb9>Zq4v&>Z#hXflqp5yJ?q0HH3P zZ8-)}_JtS_u@J-ROpa^By|1QA>!2-j$RUOauq6gy{DQ^>opqqsxOu5a1fAHnC}>b6 zkkHR%0iGU5Y=kEU5M*;azu*PAO%?BWfuI2x0u8_rXrxX>q33CypPWjk7JD~$4h0^3 zU3f3{&UD4<<$jX>@>D?pR>(=G1U#uz0veqX(8#SxBey2a1<=H_D+41|`PQVr7q6Zd z@@ga>iq8bhRE}t_LErSLrm{D~*v7E~bQOQ~=eND<1^_XQdLN z===uj2t5zqxxm|^ssVmLx0&4nnT~oMIM&js2ez2AdXi&09In_1y3MivbDIq%H*r8# z6E|{|G!o)Am{~Y4Z3^NDNM0RC$Py<9^guA)LNNm-t9>r>`8p#upUM;*wh)l6 zkcT)em)!84;^QNc88#_Bf~hdUF*{=l#`?$Hj2I;Dj?_^I;R*g^OO6+2!nEZTrr2+D zY@)!4?ro}L;R^+6G_w`f3)G~e32msND+qVTMP0Y%#hXo4cnT~GI7pDMG<{hq+5!2e zg$KBh`O?aO!QtdK1Wa-p@?S%fIfd+llOP#-nFc1Uz|MCl6$9Uq=e8vFWB15Iau#n* za>I9b;NWjv#m(E;1mZ_vMU0>^bcOe$S_BPdST_|d8NT+P^P&0cNKj){X{)=Wa??|= zG&n#DIRSY08w(dIt$9n^i5E<5IqOSiC1O#mx>j!^CJrxnMI=ZbbbVON{#4v zVh+As&W|ETRb3k_nBGs_lD=>;Pkpz7*@HVXp7|RCRCJh_ss)L$Nbm;pf#ykaQGtn= zDo2xkRzxGFO7ky~i~8!pMs@uf@(5{;3@%ag+QFr2jt?$VbNirFb7C-1vycudwWrd- z3kXgBPkr+?>xAZXC8? z_G8I>RUlN0nv}XLM1998_&C&}RsdGQy}(j&yE?@v*gGv`4hqbQ;t?c76u0J)H02pg zOZS5NSjpJ^(JC%im=IEDQB6zb)j&krK=~1)e=*|p_+jVr*Ab=9l`R(a1wHbot8;6Z zJ>})LVnkOokEsh~7TbAXrWY|>7&#r&M{K;S#F69Lff zS4)c@js{f7%8yQBmEl7Q=pQgfyc(XLa-$Ak&WexQ*X*aIO9D2Yl9qu@xRc$k|9h%* zG2c|TxVRFtcqgg7E?pbLP%A@6L7~YSg~qpXr#glEOJ-zI!?7ElXKs^pQ35Z}raF;W z+Ue`z+c7ir3soMBI2&@|`cw|rjJoyKxaV{#+y*r5)IH@uLkCl= zm9YWNWtu;(|0Wa3V|e0WsJ zrJL!gsL$!+tfsLGE?MYivFkL1gy|T8H#ZT%q}#=3bPGzTWU+X5Vp)KCSqG#v-QueB z`<3F1){NdHB~gkPy3MM^yA1Wb8fpQJS{Uo&Ov{U9pji#sM5vk3^8K5Ch%A@QPDo}Ig^4H1bh|8Ah4)9)epyxa$GMm zm2?Ay_5%w4)8eB# zS_?HpltYh9LpX`s37OauBqIzh9WpdxCM@m+(9Fi+ot z4boKNxC>iZ3GcV7*`esOx+GAcKATuotn&F~C0pkCBP@b7YjNxs&2|cc2znJvM%E{r zJ5y)eUTT%+s18BZxs}v=099zYZEVuM0YQ4)Sf7<^<_9yq5<78ju!)108Hz6Clm})< zRiTj~1VPjenZyhyyIH6QZ5ZAmDKtDMU?P_kjO$gi#f{29VOzDQ*>1xhw$hH}M$fAl zKnE%e)~Oe=xgqcJ`=!=H2w9yJ+_m1^FEtfUueI|Q#SH*+tCbMME(7C6P=6IK+W=TI z0_HHr%+;o#=*cZ^96oOpy*k`X<-#D`NkvqiADk~4S}Nb-F~8(}cTOIz&oYQcS~9;6EI=eFtn3eA=9^z;vLjhY*ngIy9n^T5P1V=<(49~M5$h=7 zM{7R4Ff$!6_)JAF5TM`HH8Q<$Uzb5W*1^Vr#54j4*Lz%#LMmCejX6)f5oou`qqholLCDy$J{f}CUFxmIB;TPc?p#PsuuuqEGj-{gNxZL@px`RX8}fPgm;x2 zmqa3gNSClR>|4b>Cfc;sLK4W%YzTg`gS!2Y>|%w)E;y_I_b*8y2{)VdqG8YNhdY1< zqxXj4qlWIQrQL(}8z^T)DHyE?dK4Y7Nnl2wd#R6CtCU=&zp4!uAgc#9RjbP04NACC zx4B#ntKde>9~<`TH@bvfw&%*8+Kgq)R+PI)_#05^bVyWWi73V>%6=QoHoOz~S5-RO zD%T!WvC6@c*M;7!gI*H;8xX{9Y^&dA@CX;SO)UqH#(28SkWzjX(Ct#zAyMGF47Ruq7kzxp%;pW1F3N^!xlU@%`z zYRw92K2WyzA@C)7`y1iV+(uJgEDi%D?tsq)p z^VD4`<{X2$YgDaIdptsj^;u~tzyUA;2DArz1jzBE->?{nBrDq%^fRh`GX^2x(tA4A z5q${aYo#X{EVK~{juL`#6fGtzX3fPEb?e|j)rhHhv{9~b&+6x)w7m4NM7RvGsO2-x zMvF0kGIR-0)jPnLJ^teAgGo@{0m)bU@J+)UKmv0v3RHeWA8x|pVVT93NO z63o_sDXQ$F=_z15kK;LUG_vJl^HWCn+?mU0}hlxW|wL7`W=5OwsTorWMsG_Y{$~0LH3MF{L-P| z04i$3)(@3L12Q-;KPY{PmPG(COIzY9j1dE7>Eo;z#k#IQIT(p>bD+t?3(%hDRv}#t zLRS;s)xf)28KA}E0a_88yLjQ#a-fmyLua{nHtU@kd8`fCvr#hQ_}o<~vXf=D#RK7z zOh{_(8r*O=dQh2Fo@%0e-dwqM{*ax7hzXj2(Gn*3y2gBA7why8Qf?9u_s5BJc5%nH@+SX3R6%8zNF1c)%;7->{W9<6 zbZIFw=cI`lcgoOzQ04`9>}T;yqYwD@fd*dBGkE3ZIC-7}>muQ7fIR5NqS3M&u?m(5 zGq}qH%63Q3zGL`3qHXki!@f6sS#&GA1?;2ngfA_q3&TS zd1wo~z^1oeJOl~~uD};~x2rYJ2xPmiiFszzef8D#AHc57)5lv8KRYo9=^wYNzJmZCUWlTf#p%1WM8< zx&{6SvyS2gu2W@86h4MQxfL$}i3X_+4|nNnc%x;8MEYwgQZ^VDhHr9lRoM^U93*a4 zRN<-<>Ry@4109f)w@sljcHpp-8^ZfjI9&?@5oT2@Q3eN8xs&O=wtnox7F;2N7PsdC zQxrK%rKaE7AJ$l&RW((=(Dq;@SygY(>lZroi->`GlUjFccv0|W%U%>7@9XgwEqdIi zQLY+3z9l@)Rlj+?W%1)87J{F2_G7Ve0nHqzv=3pGtVB1Aj=Nze%UN^Mgwti<#1rOw zh4WJo48gVuC*m=Xhuxryov1pP`||P!tq`Q(p+j7u+hBJUKKKk%vquITHw$D{;D$JuOEXBF>Ov zFbUd#{_-L4lVPbTtxQg6QKg3v^$`{}maer`WVI>mc7BX;z^iAWOAuw>i2RlE?|mY0 zz{NOd#%xhyGS&zYdTd_3^0KT zCfYqXHWTX#jx*91w+sUcI2()U>IC(w;mC|8Fp1Z&O^u}*^k6Aw%@dn#i(wJQ8vq^3 z$a41MWLZfOz6@Pb8*PS2*q$m60<|LSETe8`BydEc<35pUwgDvQP{GdeP=aKmrnyq6 zjIzC1)+y*JF)aVYh`y{Y;b%?1sb0F-x*w4i+X8W7dE&9gF4@*V#FyLG(RPR6J_2d5 z$8g8s_B1Knm$u~(q0G3QGsO$$-9Cm(_RkQ zegr3iNFf}V1d(I`f@p&n%Vk2(Sx$Xv&ZbZlS`9HK*>00Lm`thQ9>FF z1OHK?u*9#yp+y8PE;IGSqsalEl4A~h((GhmBDz>K^I&)S=0=^*aO7Evbl5s=-$kX0 z5o=M>Fw1p(Ar*{HnSFg)KDNMq<^~tZJcb~|jl-8brQf}O)JeRqE;_4$(}mFl$qBn* zzXVE8Qtg?)c4ATTS0BDQVa{E!ak9MVkfyLGNrkV4tELIZUEFTF$TqW!dGVJz8QJbT zxGrjT*b%rx5a0)%-go zEpnDYf}v~=TqGBlsr(K?A|G8gEo<5((m80v48RVE$QGG26i=QdTps^K6tigDq&aoq`=wbm3XrN&ff2d=N9lov^0bVR503N|fSzkhi2(Co9 zYN2T(S|xyO9gF=Z7r~mf9hffE-^Su#%Ah#&TzR-!17}z&y0n(kmH;v_B(71AcMZl3 zl9|8feN}qX)@2t~!cnefK_^+pT9;E-`!Y7L3~)lvdXR9CYCA`kzouLZ!LRh??;O5o zu=3@1Wn#g8hPV{C#?aukc?;x@h8$I0#4?F94Y+Qpk+3nbY^M8?W&$ZYAjA(7c!^Ko z;s}3ZQ9=syZv)T1BA@VxaX_TpNwgN6%P&nVY7uV~OhyN6(&k0hF_NoFuNlqCoP@P; z_(BA(k<)(+PlOD@n!y^P8Ssv^0N41==bH}=d^fp zUcY?w$HtcLA#`5g+O&*bBHSX`=H(?aa-vlh<$@-^6KX+)6vSmSB3mVNqrrTwjk=!A zk6Qc0VwR~hzU8@B#}`LiAl13&c%1YU0QcT_}6n-|id77ixt6v9}G z2o&(4`x}r=Qd1v3MV)}^DNWBOPBnEnU}pB`5OEH9n2UpYdn1PUcRTA2i*@>Tzy3q~sc zyIxoQbn{=~Z}0A{6x7Uh#vmIepANU>er0){E?(!?gAtfa%j+gswZ~6St@ln1a;5vLX~?;L4GqVyM`$kHk-e7YG6Ah6PyFpP1BJe|%4$cppaMge?;vuO zc6JAmtF+HU+Ngd04kA}+U$BG7Rocxvh+L(;Vh53{v@hI|olavM@Vj;K5Zti$g?_qv zaUk$VM=qs-tdjv-AipNIpaOwgYE)K^MuEUI3IwK6iA9=Sel~2UJtmK{aIo{6h7pPh{EVkh!2W^ly{I=#Ur~cAG5b|4-T<`)C27+nnzOr+MwQo>S z(QB_4^Bpx38NiFiyvYX8PYmE(Z8|1JwgH8$0ymrn0C#|hoO1aw?(va-LZPil9ILqtkr)&UF56nw_&R7 zx5wK<1m{>2s@)!F%Vu~HAi@S>Sy6ptIdYe#C@fg{TnJ^x0meuOv@*ja1^1UnRIgC; zfPpvUXf6UT%GDf%&SVaQgT9k7Ig_e{vLu@1OiK!lClZRGo>!o*R|RU2`>x zd=VQfMJa;8d}R8vPqEF%z{l(C5SIX184lJJLAh#FDuY*+|5^X8tpUSwj1HJEwquG_ zBk73sMh*=G>EE%YHBQS+apioK%SnJeqSMW_zjB z8Hxlr$AXE;qss51f;msG<}L~%%-J&!GtWHaR7ByXmUccvW0{Be52a&T66!1sr@zWf zwYy%3ELKUf%iW^=2o|Magjp;?A!LL*$2XLmK4x494yh~5!)Z-=0Qkfi!?p_2* zNv#(BL;K|8QA}K;zT|qYM1tMG>aI$_1a_M-kyR69^KlqR4G9InD+_a}@Uim4^*xhw$0%G2XuywX19QQ7LPX98hw=G0Pv|UNt3_DSILFG%`l(CLSmJvqxf?2HT!0=EWFaBC;f8Jw zVpf-6W-4^tbv;Ic30z69MyBqPswdnX{p z&)dw#RTo}0KRfuGU_FS53v1(==uP*Ji_C{7@lEv`xH+t<_QTI(mZwSrX^K#PNvx%Y)tZESQY( zEPpZAtI~a@YVn|{T1aQd8p)fZ=C?B>2p4yOO`pyNSuKhI4KiK!YFI+~4EW>IPzNHP z(=8T~&i{Uyi_g##1`V+-Y9y9vlwnUJ8<0jeAkBE;&6I_M5;FlN#ThfuN-UM z^h`yKNj%!n77<+-y@aKVjTUdA{^_)yic}K~;t5W1pjWSc^=#BLU@rB{tP#`Fq@H1h zNIgSKDo7?zkw<20_x@A5^a`DklK3eXWx)|)lE^0{{7*t)L@NcA3D znf4bOV7un|ZE^Y13u5uus_y2anH_LC>TW)or>YHo0m2|y{xxOT&OoS&4KuUdyax#Z z!lD5$=+iI$H53qpA@FOfkSQvvHldpn`eM6)z~B|rXSs?+^IKsFYPd^oB_XZ0FX8HI zs!2{Vl%l3$WW8#5VxXva_yTcTc48n}HD;sl5CIx)A_L`Y7_0C?o?%(P0?Ya-kzn&&J9K*yXof^c*Ah+7NcQOuhkTG8o%-9T zSHcCsQFNf%wg){4Y>^i*S*+JH{oOW!&`%H}^`9Ai7T3~M5G1yCV|Kpk-GP5iMd4BZ z-#`>5rgwt)Sn>|mHGZ=g=IuIkr~WGqro1eHI0xP#Y8(IBu5`lZyuV)el`oO`* z-WZ=kHQ72@ziolQiKJe0grYb%plhQl&D#09x3jsn-x;+;lw; zvQ6YsE;?!(|Iq%SS@V>TN|H;PV;d@7lEIs{CJ9_bk`2WHB@+H%f5@;!7Yu|iBO&Y~ zMBb{)qhnjy?69w>%a44;c6vg+0P}9nv|~#Ba4UI43Gt+d)c-}m<-ZJhM{xrWhqQP- z%;I|9r<3*eW&lrL$J2>}D(+#(U#E~lyLryD)G2FI|J&lNY0Ob?lqQ2CgCDX3=^>En z)${nCs3K%%-{wZYl__vgPuj=35&zT9>;i-%#aIW^kOOpJG<~E(BWWmxjh-DCX{gfK zbFTcDE7o+N5*>(`?pYdh#gb^N^iAq=$Q6szS+_$_#spVvl=-_P^Lrm^J*CUlBHAHd zH|l84TQ1NgK2PdkkLCizc|f>26>jqen2J#lWhFKhMiADp5cpnHGmI)8BGQ0o*VN^) zqkO~1F4rw2hh%JmT2voKcH$AsgT&=j17ldv%~(2c?)Q*D2m6dZ9I}LI$ffTLcb!knoiR$4<2j@gc>m)=9oCZWNI(frV6!_0Q@x+fGWsdTf zD4a7tUbl`}%z({>r;~uWLEXbUlN7HQ=_M!ADQqO@C z$CPZ2bY$i<#Rkpg&xI1p_&`7P)SB>^r$i1DrN5l#*j5e`>1i%Qe1CxRtUIpIALO%3 zaCdyY6@eAad}+yM4PJP8!4Z#EBoI@Id!J0X_^NeMb74FtP#Op3!=~c(Y@)u}%qRR= z`nYZQakh9}{C10d%uWs1-9et=YsBQBOLLG=nu3jmI`g_iydC(rsrWMv%y}B@OSW=M zu+Tj!)+yG{&)ey3_%j}J-5?|RCdJrdW|-Rc;MdA}2jmX>`TNpACbcf( zW$@RX2a4fI>&KtS=T~G|lJ@E^-f8uzL2G;Fp}K#>@fX9j_o-!SM~_sQWUk4;rVJM_ zuPdll9r;D4Kla5xNmXYtTsz-?O4g@=<_FN2UMx zrIgUyMj3V;UUty8d4xJnX8FNbwx~b0gxvw~wMJ9QNsBGw_?Fkak4~I}`ZBEpKT>#m z8vSX69@)+?W1ck|wf=Nc@5ERUYiQRmK}v{Ii7}ubE65YwR)^-2r{=;c8MXLFE}fSm zWv;v+n3a$M1mj<$_VsyfKX|^|emJzfn5LihMWm0n!+vyQcFDwjML`Q zJOg9U?h8`PhZ%!r8tUFH{?ff$G|fdptMr#*K4=v4L33b0Xt0in*Q&Xhgmju$5}Mw= z0$XLEziu4>Pb#laeuU;V12lvyP`fMrb(~aEn%f6B4pi>#5;Y4cwcu#c&n{E@#&m#8 z6Jg?4<+BKJw zS}dAo9dN;mk+63Dx{|fiY+&s)TL2`@47Rzrn4Fqgu?LN>GzPmCW0_Kc44f7JL?yH# zGNN=kQgBd0S&Dnl11Rtd?mbpPi1GpUtAfSs zH+l}R${<~!1#wN)3n>tQ6Deqeq>tiPru3r!&C0sfpq#)>Bac5nq}1&x6sbVRyqg`h zhXtJ3`csK`0-OL=U3|8)*MCaz%n+lv1A0No`GZyBh4qyKN#PC!F4!s!hj}OoBoRW5xC6Uab14{SEX#y8c%r*(1?yCmH!_@5Lsx5a1Tv|_2%~iW_wQaYK zWuzq#bYa;92{v6hhlc);aEhyv_}_x#KT%hm%H8MujS*ysx+lE<#E&;B~VW2u@2 z@2^G~FFuxmyB|!nOXcb-sn7yg4>%6>tL~L)RrU_^XAk9taj?o-^w!pFLI3n9#-c30 zDeK+@@XFdf7wd>wUR8WtCT(z+QIM$Z98$~PtCGU%(D1bcMuaT5X)#%-vIPVsuGnFp zppI#~L1_^E2t_@Mwqlq`m-@|zb*K?>;qcp@RqM9UhP zt=M9>UOhHjP!EX)bJIZLAhzJ`b9GnRDgvd)ti2OoZ^3S zpaOAKqh>GJRp6jqov7E$BcG=23$!-fxA#yrQBNHPDNe$lx*N;s8r&)76(7^7x%3kz zr%LmjfY@hDD2Ie9ja41AF@~C;L%K;0F^2dMtj~}YCgIq{g4XeRZ{Es}86>HVB(~Kt z-e!k!h#^feo2Q*eeZ7WvB<>{B_3A3chTu~IE^3M{H(Gw^}~_cjWKzy|g(s{gQJ zV8(S|#++^fa{++~Tt2ho5diqaCEW*zZ-b`Nb4`lCd*R{p{lF&_%A4Fri4m{jyn`@Zi;t4Xi65uYY z7F3eMK|5#^2n~qn*eH?FFW2lBdMSHWs>e+dD+Y+O+-JUE{thJDcgaHG7YJ1pBrKZ~ zBEIl|J4sovyM9L$jNtku1R%IL0kK~{t6gA7SsjM9SK1$1gou<)G;RQ!;n*0Cz(&B- zWUOc{L9%8Ntp0{$J=@xdYsKmc;j4*xtrbtgT-}~~i10YyoN!=RYIAZnXT!+3VdN)d zzG+650Oy;;UsAIo%UO%Ut)s=sXC3*q?9t-5cTHXojJn`mv)b9_WRrIdCtLKc@s~yZ zQ|xC4JcN>Yst-!C_KxfT&DtH=VHyf~+)Q)vj_j2*gR8S!Xl7LPvaJ=qnr4GS{@Z1B zb#{aXtMNDuc>uT5kOy#rhCF};qL`Hka7t~dSpR6q-4$c^@9Ja|OD(x=!&5!>Ga0b4 zlIo}*GEgjFNC9g6H5yNO1(6RHPdO{hxB`;_HX~kgUL&aqUaNA2uZ0MX8TnE)1SfLR zBL;PHoaP$c;km1)oz!|{rIb2TNU-(oHuX>usU`sm(yGa>E(MFs>M zNuP1zZ5ib1l@4I2+od`VQ}$KH9sYzvT^hKQpO)CX0Lv61lzQ8dIVe`{H+`f31$?$3 zJMb8W6m0eAZw3Xz!ZhDkAW2k5qQ2JHwReK!1q(y2A9)f!Dk?{%(*&izF0@>KW%BD3 zPa~PcD9Z5W)mG(Tn7&Q5;ALc)oDcfYpDXUCj7q(xo~lXW zX3rI`ascD7zT@ylzRCePqD8`n0CZr0(*bh|b^4kVzb@P_$o)1-0=o!bA`I5F9N!8K z(Clr65~fITOLQ->6A^WOQJY-i&!*tLrR%_G6rGI9VgVoJ)YZfTAQVNdq*7cxyeV*- z`MZC_Gw%UC>EVD_M<7^ueVGEXQrL@VCu)1#PSlPh76~AH(;Fa!qlbOwG4KUC0DQQ| zwj}N1(GIv#=DlyXAOsvxmTi~n%~`QgwZpHVTu?gE{*=AmcQkWsK`rj2;`y?fa1KiE z^{LJr-Fs|+sLXoDcuU>(QHbT((`Tyrf+%Fd&P&cLAyh1+Okg;-gvZ$w79|*%Mh(1^ioASq)_o! zco`g)7Vs{U08AIBR+qZWC1U$Ty>&l4^*i=UL9{2Z4dYpvjp1e?4h;)F#3Cv_hUrj; zI1&`ZPNU8e;DU~5Y8sN$d{#ia_)y04!34JFBT8hDn#P2F_M6Tw^BXjfL z2;-?HdCJOMAiu{2y5W=ciAnC(Yqn>mAnTe#GY13lYaJ8~7cT_svgt7EAcCiY8AE=G z9iTOKjJ*{n3wVS)h{VmHA<|x6c>5AZJ`=Yua|vPDi(FRC1rB z0-q(9Foo8N_ewU}F`kLYAREg_Di$l(JCkSa|ChIS0k`Zd>pa(5`*JS(oKvf+PE{&( zD#_X_CrMROm6S=5swCA~E0ekqA_NCp9GT~#d(tgam6?Z%89VyWR3T}k1sxQx;G-Fp z7P%5GRzLG+UlDtM33N{= zs=go}lI@;cDz;^wLC`_Av~<7N?Js-zaCQNm`)Maa#$!kqW^S6kgJ=sdnY4SOOCCmN zSya&3cjQo*f0I+#W5VkYEo7tw%`vjF7fv`;s31F|JsT!kEt3bbe8n%4t?@F5N&?V` zG0=hXJ2*U9cLWw76^}tWl_Y@Ba%;xJ5iJ{$)=z+|dEVJi%$OR=;7c^`cR6b;a4-toACCwHLqiT%#`GyLqaa_iG! zr>kp!Hs`ptCtSD6g!m7Wo+35TF_1zP@!BXiHN&clEf4-}Pbe!FKdMZx__0jP!;pU3 zJRXwf+$hUwuo@F0t%nMI&ZH6xp5iB{fHs_6t%jxKLBz)RPMTzXo^W>_L8kL;Tf|_r zA4Omw55E8mwcL`EX7pzb)HP*>{Kp!4OuJwmAXlt|ANu#RltP_YC;|E$NLc1UgF{`DVz>KpEjkbr!&;GO>FVDz`eMxlP+#9APAlD=q!Z#0scXlBzqK!z<5|Kvk7 zM01m*-`z`+5CUcEaD>n+cGn;iOdA5DaeW>rnE;;+(Qfl^-y+K<0?r`8e+&KK)`2WL ziYO(R$HEoJ6McYt^szU|JnS+g?U{?WPD>aEU}Ydea|y5Wv)(1Uzt{pFvvym(TRV{*IalM6`bq#vivaVGHbeBs=6Hr>X85y{<+c>=) z;&(BID0P#_|76)xVJNHupkRg*4biJ< zA$^^)$I<7C;}SlyUWlrF$pL7b|FH?T>tNqxp~5~sar|o9WKy77@)*k1lfu3nuOabs z1jEgw1try&$rj}sb5Sv1#}mtX38y+d1?;n>L1PGnK80xl;?+tKj%h8nmJd?evBRW# zJkBGoeu!>C^f{V?b-~^ogue3yw6rF=PfEY2CgO_2Fw9auYP{5{$R_>)XE1`uh4nKi zF0a_TFrxTMl2Fd`^wpTsYkZq;Im(&un5tS)GvEP0&7Uv}T-z>OK*;Pi|_F zpivjP1a6X2hH0*@`gclvf!8|`^bIwM(nv=eYd0uQrQ=TqPL6?uNpV>Au3J)AgZXhH z!=w{0%Jb>C+bnKmo9j;U9#U}u=o+LslvlZOh6D%_AxG6&-D)y~Sk=f<=@V6ys8t*v+5DxjOn59B0XwEw zPxE6jZ%8Sn2^JJ~&ZjN}4V#0vW-o=2qTSrZc(>e|o!}ELl#3Q;A}G_>&At5yn47#c!0}HI_zOXeKuzu&zy{5YX4M<9Q2gkU#G!=wVy^&;t8zXK>quKe14XHc8q4Q6@fKP z%Ye`}#DI+R$RNO{U_i?9PAgv|A6MZCxH#?#6VVgl>e-42C=BGb^u2lZd2?!;>fCXuV zmJmG`ZvTGyTjKd*4e)#FJPVE7@Vx8JCs&fH+uD5sOo=5^TGj>$mn6dpFv-E_Q-i?dT101>VBn zE!%`ewRu5Qn?_Wd<}j&=Gzw~^IYtFDn&V@rn+LVh+%ZN{QBdnnH418_xtsV^niq_B zt9c<|tTZngL$wv#x~AqH0y}ARqcM$cG^Wvw#=`@IxK{e~GGbY2wt#raTHSA`eP;0? z2k$fi48Qe3(=Rh3zH;4HF9h)1%8cAfI7|y0Lk~aVJ>sIEbNBIdvU|*l6&pux9{e5t z6hhB6e~^{$S(HnM*szjNE51Hn{_}dD!p%m~!jla!(fekf_z>B3UpHfwOKPOXF>U2i znmL7|_6a;-AFM>yE*j*Ny&@>YssQr^u`zdYa>VE;)rY7ci)!GCGHWVnYWxjF69Oh zgebpd6X5TxcN#Q_-RL?;LQ~gRDuaS2vA=FJpJ!*O+_hZoBm0gbDZas^h7H>X6L}ex zztXLC;+p^M=m`%`a#4cm*k$!xRHF)uRXf*kcP+l-6UD(4UEG#CI#E>(Msx z&gJ$_#M@Zc$$rRu?ruh3uRvV;iXHUWm-*(8wa{&rXG%<3XQAmq&s)sctzFgLrr&(x z3mkm;lf6c;V7ZGi7tdRqZ`O%bB#gR~vp5`=@r>sfYQE~v=DVD_VRKbmokJ_0Jq=RA zWf2$4t~5RQm=2bpmSYu#0l94K?PG!FBn5CsRbjRnrVK#xPKV>&dV;QYD|tFOdHjCd z`DUT~mpneX8h7ZJ(~itI`RN%-qLbiT%g7oLTdRJP@5K`Z=bM{=!kxCxNE0N`T74`0 z0Gb8j^azJy)k~JKt-~`E4`kBfAP7h=Mu%2nk)B?dRV(HD9>|(u5TjLnBB0O_t=egz$+3wCiz=z@G%xqc7P*5 ztxV@sxl+m2?5!@Pz|_0bIaNM@XJa#iaiI7|vudsBai%~0R;&&(7msJ2tmDZqqBCJo zW_RkDC$5Yq(241ZXHM*GuIxS&s007bB$E;Dtc}r*33D4OqhFQgwr_Vh68g2+^sEx~ zwU6x{DYQQ!I-semnuvlwdEexo;q{mroQk+aO@7@c<^m5JaaBCAou37mSEb*fUy0CP z9nX9~oaZw2a&>wt@Z*|zV&isRGxOyBcyh9x`)8gw5KnZs^Fa5Rw4KaG+i8$(6l1cP ze76Dk3x^xDDs~X9<*E68WsNc4uk0I`mNxg!^P8#ZBwk4xB`-tfPjcUt%uQ;$!cED^ z5fdINr~5dKg_{l)XL<*pV9;l1EZlUc$Wj?nh&p`%4FRSvq#?lcMKnZ~zLG z(Dcv?O%J`$^suUq5_~#TnCZ)sK6TNeOGh6Y=A&6-!Lf<)@(FEVX8hVCrC!kk<}#{a z5qwhiI8B=(Xt{wZ3(c1*3r({HwI)hGV^28T#+;HnVPIz!naQx6tq+4Fga`hlB!nri zEw?O{L|)6wMg|fhdG7=dVh1wuL4oKU@d2LGjJfy+^+?6+l>A2=j>h=d>;6hZEC6NvI67a6Q)&CmTjVMFCNwPpq9 zN}?5#zVE4dWnK0@rV>=t=*aq6riEh^_PZ!E9Lh8TK-W~pV>S&;c=A=Ce0k+7n+!s} ziZPW;u}o$TWWt!!TYm%_pXL-glFuomv?%$E`0?$s1m*}y(?w$1t3R>yVbAZxm7))= zyWfEg2$Nd#Dd|HvRGMD-JS62AbjKQVFQr~c79j*gl0rgv<Q<b)1mvl$y@iO5pTe<1*Qt=!d^cUNAmXz z8!KIO44dZe0E~PW&F+Y)&^>E3ih`$+VUtFNO&S?CX|_O!+VJ=0p~5YjnAPyyuzlck zY@gt^vwZ_I-tz?hbp>qydrYeeDTVYYTKnB-fS{{h|9}6`oci^=71JZi3F1|E6&l>- z7OsO#^Ue=(a^>6Fvqh%SF_0&3Wp$16X%-3*o|b@h_T1Ok3tbG6Va`gsf{{xWYHm~s zCz_78dEX-oUWcMLbUFIW(wttUUfO~nt zm1kyQG^1AeQTjFmx^*?r%0VM8@9}j227H=u4w3=H3+3EyKKwy;QCH@<`i*@h4wx;% z$PAp#`NCQp*Sqc0Zh4^tJd0s+;XzsH#D9%ouoqy09UQN&@@m!HcKDi`V)F8h#kiPM zEVQ$V74YKcp=SZ0ZSqn1u5P_TO&HM9zzlGbj@_m?;z^J@m zzx*x;WwO5rUT}_3$ro4_Kn%csB`i^`I~$Fka%cn;*TSjDYZH&LlI*I?Zgy`g$v$oO z#>@OoxuORx03=(_fRT)q@(|ySM^0G5`RxaaMtVTN2wh?(+HEAbx<_>LBtR~hm8b)VoaVE*L_rb5h8U*(#D!+;)@RN32z z#Ih~?(1-mKY{v`mr27?9gQw-5-Hw^x|lfOYRiU@(OIzi9$VKk4h4QdW z9;=G&bC8L|%qmU5T;^kTJ*jP!f~3Ribk|Fl#o~!qeQtUQT!AyA;A0Yyez}N0_fY@3@!TsuCjY z`Ih+eJfuR?0+82Co*yJ{#6XZ>73u+qITwqyk=kS&CP%ax+E(NF>~5^oP1GAUc919> zL(0CG+5U)*AU~Z%#tu4PzNVMRe7iSJE{FOl2qiyhIA(}D(DEAzPljAPv(cAH!nD{k z2*ls_HaL1 z)X_!i$;PZx0w0o!q3IJvJt5pc6AkOhg>$GX*lI}KJrJV(SiSdiXN)p03F@`)8N>EI z!u-n5ij}h$&i4@~^mCQn$DRwVkx^XKf%5!z4{np5M1`(w3)}Rkr^xOTj;89ozrRVS z*rxeikH@99z@EY>=~fd(VGI;jf!?YHg;kAoT4V%ixF}vFQ1gmcR32IazgW^f!`TmI zUnABex%+EOxJuCw9za19<&V$C(I=#WL-P{yZK^#ByblHMy*Nz(Jgd;@)qnr~O4oO5 z-3*4*U z?j`6N-U~ox&25&HstxQhcm7lKxRaJX8qklP*!rXo> zmTUB%Fq_X06$wDyD|Wx`E3u83b7|qEO>Z1X!a_ZVc+)?}KQDWZ-k{n{3yB^tu`I$+ z;p-~D#fYp33r-SIj+1e18&g=28b=@=qJ+py%0!|DiI4?d)#;2C^bJ9>$!kJd)kQ)M z=VJ<);@a>&!A>$rPDR5;avuN&v>0*_4B=hl2pZTT$?^dY>X}^y@$T4c4`dgrs-YU> zMKv;VLnN?ZH@^c_z}PKIp__p`%a5ustm~eM^>2Z(ktGm!0{Ik-kW&?rJxOwrzQA*V zVla88^YelR!F8*rR3FKnVjpEAAXZUK5W@4e0fSD2MH^H?R!Clk@&8CQ>!)pj8w2v7 zsj>wo5^+REz$P2LVUx(bPL7_T2g;9=L7K-?Qe=rn@rvP29j z)4@J~o(y>gbHK6~0xI~T{4F0V7?1W7lvOeq_spsRWe0RNn7FIa_Qj6MVzQb^Da9#% z1P4w5mspwNw8Vlia0}J|KmyA`@L323@WJ;(3(HrE)dcp0+#@<_G6JO3`^v#UrncJj zxVB54fQgevY7da*ddGs(ndU8*rk(?NjI#_9WZL`AjTS<)$(rAOl}zJJQf*qxNY>zm z!KzO}k(E_qq5t}P5;qpY#+8-72qrtCc2xxf*rzY7nPH*tmn^uj28J5IQnXCl>vy0g z*i6}puN*uhNkirj+5#9(6lnZ9;u8pkQ@RC4)JLOnmuyFApbVidtAdwhCzXB=% zvll4_$_A~K8_&R3Nq-c)B#we6=OQ1y62seql3-Y3gCftoT1odUag`v3YG5O3GC&Kf z2!xVC^)jT>2mNa(3cb?5XkvgAzzTWFM-F=QXUywU*{RtH>L;OpQjMiU$SlS3l@Hju zSiHjm6I2jT6+J!7^@m0p?JtC8xK*ydB_%_0y*!5E=E$GR^dmk-r>zqOqbUE5f~AiE zp3iIs)dodk^e-|doi*>mvOHJ*Gv=tv^Tzs8vLb&s@BZCP_dKyrS@V(aGdmMYRw{Yc ze1PAuI{`S&U&l|9oZ^#=TPlo^jlN?ODZJy2kt{N1%S}sBBX11N7NFYiZxbbI03c3| z9M8-O*fx(4cy1=TJJ|h^ncab2s2*HUkYipOc)5-&D?f|#JwY|}s8fi6m9jt>xb6tY zu&nj!9mU5|dBkZT#8O^lbD~sjzMS6jMX{R+#zczcS)dnJa&78?O){2yj~EgeRs;8u zk1m!9r#CP9Q?`L70_5popU*cckWVK)3Fav+8Z=Hl&B{nf&Js2H`6KpH_ z9LlPOU`ufg!;L9rvU$_{*`j}>oUxyJZg1a({AKxUwcby5ZfHg;5LnVkNs^9$NAJFD5XTPxlZ(OQXPM8U;4fYyo`&d^xy_ z_}ElN0C?L|Q-MOsFVd{)qB(RHou? z&0_^QZUh#r^ye2B`|-_N`KGs03>Pqh6Et#)B23~!-%q$=woHhV=9D$pQ=O?;_Sh{i z{Z5uc^SPVAq`dr=e!|`*b9yZYzthWDLBZD_MWd$m6(arY_rIw$O#rbxNBbJ4VTlqs z#DgsFr8e*fg4Bb!H*?P+@d0Cp$l-kRaL(1DiUyD*NK6T|L;^IfCnI5Ih6nMJF%)WO zh!3SRRu#<9s$&}DW0gnVQeM!9P(z=?%Jp_#ln=7(3h2`u7#Uu+S69g_gEj`0J`$&8 z3w>i+Xmisk_w3RQM8rr4N|JTsOCg{`OCdCBvKY>O;!xK1Esd9K0L##D6dgH(hdzm` z2hUwh-bN#{OG|CNt2n>?=aFS&Kc*}FjzZ4Ud489it$v_kzN25KiE?DH(e)xLZEllm zVo~>-GdTrgl=|DLEuWUSTtXj+*R<^{o~?T{3GB=X`27j{1B1NWGJHx@+*Y`g&0q%} z=0SBpgne^CFe2kOCq#hB(i}{UwJaUV_B2DTOk5^<2mx4$Vs~-`G*yNryLUqP!Y1`k zc}}@y!0XYHfiWmjmQY@PsN5Ng%T*?(_IsCn)Rb0bysF1|#MjU?|M|c9quDaCe(Ho3 zY92Ja1GLJ(rj)`A<9A{sJSS~_QMf~;H?|IxehcBjxJJRT+fJX?4~D#c37*ki>)xpnNU#Q^c9IjMT5)LYEj{R|7u&)`7EK$-l{ zZCH=lH3U~5DJGXeFtp#vq;fPsX{kdMu_+)n48q|F23uiv6mAJ38Jge!QY~3@C*06+ zUwX^GnfX+xTOfpoGV53!oh@kafuAQ-5r~$|IG{zf;UOE5idu99MJ? z4rJus&>2k7EXaZp_d#<+z$tZN%RfN@OU`KBNuvWI{K-rq^3kLnWIV&MbZYK~7975O z(vPAr&@F6xT6-|*u29$P^kjXIzE#eP1!0sx(qML>kP6WGpAo%_evt@{gi|~*n=s4P z?4jd%E6oV zdF%g^Lvfqr?%!n2klxianY{Tdd^l_1ic771fEo5{mhq@nrf<*L(M2TiBCL^fGRV~o zs~HF^nro3HQdY&N@iY(N^sA1sP{ZlS^JwR%L77Bbx|yAaMAY~}$)9Imb+OwN*s;_1 zX=B?vCtwPv$BWEHCm`mXi8Jj`W2A8p6`u(!fIYKZHk+~R(TC6?yRdCSf(+Dptd$io zSh`j-ifg6B=z8Th%}tU@@UnW0NNchSLF3EK45gFYxK|YX#{_FqLi2}zB)c*@u}8ZH za1x0*ZNSo&*OW*neG2EK9@S#|?9&=o7wqOM`r8AhWc0B84q4~r2@i4Fxc`vQF(ZV~B!~PX5)6r(1bo526La?%pekTDxDpfXj zUYpi@ma6*S1ytg{Tc&i4KC{X~$EhWXT{*4XgnZc4OQw#EE0KE7rCDhH9PLHe8JRRs zJX=j&M2o<%#br10jT+CL;V{eZn@gE93rWsu7p`d4)d_~ggtY?e(EeCtV_IOeiC0V< zyI-2P=isRBy`~-MH!T9RW5p(O_)L>P9VZ(kX`ZAy)62gO`B+eZP@(u0iSvlLDbID( zcm_{KzQxx=OCog#eS5&|57rYI`NslK2$Xka6#|y0bgheZ|7|A#77!W6iGiLtuM(1#)Wyp0E{3}XRP!ITitE?f$`w-Rbr`;6J#B93{NK2YkR1j&*a)8 z^gJEHnV{A7e&pzEeBW*_*)#jTXY2U;vhqd7&c@f#nB?=H8Qv3mCa+)W=dtm1(r<-T z+f^6P{@S5RT|4~mQdHI4AVetCNRo+#u|b{{L|F!6xBqIciCmx-w{#wmB$*W{`c5tI z|B{^+^yMOLeryUbZ}LFb_}E1Gxt?>aaR3;V3pXsS1!W&@Hc;b~5b%^UOP&F{)p0B(>notC>e0Srh~ za`IFu@JP$-gwuxKie-8t(?avhN9`;kjmcF+&~}dK4+UZ#G{hi`5ZLP;>c zXE_DgIO8kW#9!zq9{Gfx#irtHaJ7{kJz+|kx{l|n$%Oq0PS;q40x0>dgCFR{lU|fk zMPcUXRoH+I%;V@xs~o)WPp+j-4n^oxJ&Gdc5}o#GVv_Dn5J@q80G zTDqmdXEuLB{-K<}Pj-hVpfvZHJpxh(B`vTgV2#+PGKjUo1;-}4jk|I+L85APpan1J zNnX%Q;gXYq>geZF0ifDDBiYgFZ@1B)^A)k_e zY4~q%wOi2*ld4vH0m_^)^<8}x(@H$xf(TJkL854`7D+?yRwzE(3b@p4!oKmP^t+A! zl&j$j=N5&w(lb^=2Gw22hHU5N{XS!+T< z7-GHdnI#eEkX>GSd)MNj)$PX=*7kp`5i{@qT8H)2zs|$=;$f=^?vu_{B6wTiOj7%= zvtB54Q%Mqh?V!2NyIM`qjuf~}>UCsWdRJ`IovgW)IdQhAs?D$(-jHo)9cX~J!JN=P zbeVSndFeI4r0speq7{826-&(kJ6<4H*v%&45gFo{8T&FG0%ag2`(*^YM1LXk0p|)p zURT{?D;N(Ny0)WRs9-?YTR5xZnB`g%n2nw2cY*OzI^eE~it@)PoD8Ym#plK5(?6Hv zaI=M~izVxR#cYIns5NH_WEUDT*)d>profx-OU56^tGWKh1fYHk{X!P{MTf$)q?wAprLnTRFooN3S4T{w}12)h29W}tT zJ>h3((V_v-ojWLjuPKPOD{Q7A?qCPv4my~Wj}Os=9H3t7?lnR5#>k`T{ttEfKQ!I{ z<3O~s7{#iRq;q{hG!94DI1qikceO1+w9G-kdruo)o#Of%Rb>%;JEDsQi8w3F<{g&C z<@-iyRe3RcdepPK7yx@a*5v@*IS!kzbY`TuplkQ|4JEGEEPOqn04iu1>C_7|BvBfJ z{`ShM@4XaANY&zfW`DpcE8*#7cui4|%}VjzC}sNgQ1(4JM^@_UHB4^HdUQol40t;1 z`QM0UK%4Yu^na|1GSTy>J^(_zqLF_6awHw64iD^4zl`{ko2f_R(B-kb- z=#!X^y&n5#OGgYB0-424dhinpC)T?ym{6!t&B=P5!2hIv(aO6g$4=9;Ab_zdA`vOb zSP$>igFDL4q3;4V{0v3DjEgE{e$_OgZQGu^9Mx=D2}G{YP(cHp$DfyIYY_h`ZjZu& z1xx%fUPri z(Ha|DpO&j9ZWfc4tEl4bj~xjL|KUgzJuPVoXP;5U@O zLdodScn_OkE<&y7Utx` zWaj|`i3GcA)I$ZEQW_~S`E8n#(Rb$mK&_7jVjcJMA-{01k3=6F>dZlAwpk;lrJKD& z67xGi%JtqN$#63dCYEj_{Jc%>@EYT-S&hc`yDp=W`5`|v?N?Cp-FN=arn`4a# z>{Kux+Iv>*2d}iI|9rC=Rag9I)mK85Y(Wy` zRFME=m~UR!+2NbC+Gbz#h7W=!<+ta}O}yUrLQjj2wDY4BFU0nIG6&1 zAXmAY6+G$oqvnVm-cF2+KU_3Nd?{ENWhwlv|C%-L{G7GeYDw)uG_+7?(CW@Tt z*J%%KvHo>{cQvjYZy0Oi`u<7h z`G2z6^LS6Iq#R5;g@AA=8qf_b9sEJ5TV$?~(gVH2Ecp^~n#J-pg9nfH4vSxA%~ck( zV7v`gx}1ASp|;$^ zCl@|u4EknbL@#)$ek~s&q`-R?kBHQMYX0UeCMoc=lEE(7SD<{C~QR8WLC2y6(DxjmLp_pBZeaM_?GNes-`=CNlf zW7FVKGup!3{+XZx_~8Y0MeHzIPumr6g@OMuyK;RULxxC2bY(Vcy5fjQWUWwMB*8P; z;@nD+{Z48%t_tSh9r(hkfbGBj-~+UvT_o1Mz47Mggf!WG0^8YM3cfL;9o>W zM#1{Wt*T!DSm5PVs8+yrm+uwAE+Wbu-cwEeSAWsRm|C~BH@N~YuVH{28Ov~v!PClP>1^_l7kqKAKT-7Xh+@&@@|E&p zn(_nK3X0+L^)fVtvPY)N&_H)yQ~V=Bp2sXFiNAM3WI_lh>>|3|SlfEs`eJZ61$oU6 zeE_IMQtO~0G(>2ayhoT=g@#XcPtw*UH2mSM=A8q5vPvj=*&)ULr$`o}&tsKW(cPG_?4a>81S`#39`r>wfllR`fEu>Cp}l zuYg(^J_gONURM4U7r32$m0u#R)=Qp-`DT;su$&MR8%o@Qm`P7!CH$U|r89`=i)=jfA+Y+IT zyw`R#oQ_IZ5jky;;x}GGH=r|*4JoACz~luff-aGkbgIN+KyxPWFoCgv2bo$3!?BEy z{YkNxIOdM;IoizEM8=tXKyA#Vc z7?kcIvvW(}5fl4*5K!4ip__~>UY*}>*934eE|MZ9S-$eC#hkuk_~03twc;6xC13uSr@XyHWI^?V3vY%RglBE*uRxdceQ<|j?n3=K%D5gGtCCi{7fCS$cT zXz*aanBRCCK_{b^UC73^_m0{)@))(My8_c=ju=q zeW6Y;ZApR=(aN8)t`f+s35CH8OU5=bgzdf!$9Uz z&>u(~CM=S_ge^|w2D0Ybiq`2eVT?_+Sn{+*VT3&C zS8YAz8b@hYEgg{VKb~{%`V9Gb@+`(dv40`;J|!j$(4zw_Sd}I7fnXm=TCwAlbjh1{UEy%4NXF(T$>06R2N6nO0;&P1KddTnl^@Ii zLW<2Gq0XI`fj<8_;TdZY4nh^Bd|8!MlYOx2Si!k}@Upw$q!&W>0%;l5Fn{nbc(D9W zt+YSkv5gJat+hPy0uBo;t!@0U66Mx9igXZhY*W-RmuOud}5u0BmIYEvdKeqyyYsEm5 zdl!;|)%<60wmjWl@;RxeppwRJY-NR1!oyp+rVEFbHMB82_w!IItamb%+ZuliU zMp9(d`OOwD*D}HhXYhT*hPAs~Dmu_DB5q5XV1ZH$Z)gKIMp*jY&MfnCB$<)i_zSdZxg{$#s*dxo& zu~mLzN!O3_dHROzZ-0Dk+8_!tCy0ajI#AO{ZKEllSdMJXAw&o1j#$bLLJHUvRA*NU z`sH`D=+63z6Jm7IEH)_}l|?K$d*{fH+ywhA-`Z~Gtc43-r^WA0@(Y-PTw0iW?{6Od zx5nIAhRrCEcHph&y~e(`VyPnvW1 z5mAIPEyZta{!g1MrQ=BIE`>RmApS(>q7?ziU=f&cCwK&!84(imn0Jk$HCO+j(Nrf~XryLzoxO?LjILWSN2C%LkmP+4>zX7u z#k;ZaOdiucI20A81YQxjMl^y#(x7H!xYd~R;5$+L-2XJ=A74^Roec$yA@HvOeUVkw z#ShPRj4MtYMo zsL%rqX;RUseseu?@lUBPwR3_g#}p|&8bO-c{cv}SRR8P^ITjGM97sSr z)kg`d(tN(~#oi_v_l=zWCe=Z4@ZSK3ssYUF`=RrW=^P6tE%3L=%qgQPq%D+C6`;qQ z1P-L^D#qAP(QGvP6gdDK(4GBxnwf~>Nskxrg5xqg<5o5p*r7+`L-~M(;VJ4V`sBg& zvEk7=1VjbK73UxxOh8P<4^{)Rmw=O46IGuYiHkcR16^3hytgMOTy{vzrf`<%X{v?# z=X;AwF7#%r89n&4uW4Nr$(X&S)h=c|OpXP=>0%)oRWqVFPPr7C6Mkvy9ex$-8FFp- z@-E%hdVp(M?bg*7`lYQe@*7!SOb!r_+@nid4-_x)8(CjEwyRhlAjOB@UN*KXTrcK? zY4ULk$S_rSaRnyFSp(`P&6+EtEly5_~_i%9TaEr!}r~t=K#uu*b=TdhKtn$UeInubY@h<*T)H>JXk+Rwg?#o(HB+fAIhB;POsQBqhb-9Y4 zuE^zwu=r4#HLS7 z!NTz++e+VeLfvkwC_(G5gaB=?xczJ)d77JVB{`V_u6NUOxDUHMm))M-!93M-xRGo27<(9Yj3aO5#BQeu-?;>Jpy5J%iTmgemBLbB#iyWLSOB&O_Ru82)k85cap zb}QOAc8rL<5%tt66P-MibAinupHGW?3D!aaX+ihfRe|y?6{*fdS*coE&hd+IU=b_GDZxtsuzh~K3^|E zn|K#PCss@L#ZG+DFja`4Mw*^>+C_ml z*P(ZThC zmVqUdr&2|Rwyu=OO064%>Q$-(i4IN}i;6ETTOz651x(7l$Ikfm*b9x9Ygp9%!f*Q) zOOJ1FRke#nH9N!{x4S?YDM=SQ;Ds76x>!`iuL+x@R)f8`L)Djdm^C3hg`o^Fy=}&F zT6*U-8|E-5|A2alk_}UYBd%f<5Gf5O{jYqhUWgJ5K|};8X^vhtVX<1p&p3VkYLZfS zNLDVbc3VwOrmH2)Fcz6A8f>!;x_7hM6Kw7dUGS&6-!qHy5(n*~qRN47O#*r^O(2Kr zj*W|IZ({}OmJ^Inw&Aw?ZTKfO;Wu+IC=qWaM7#Oj3`}_Y__CO`S14HI+Rm?J-BF;x zm?|zo=49gGToMmJl!}|mn-9?m=?91H!#Y8;3U}NAC%mM*y*(^1RItca<%Ua@la$HA z*b~MeC^+UaHcVNpcJTrQL59uvvEDcyZ`APyS+wQv=#BcZ-Z)ro2hS~jce{K(j%!}a zAZvD3$N@%6uIzNMJ)Tkx0HjlmcQnk`zayYYw9G;g>snVWvBlVuFlnqEBzwRLG`L2ITCqy z8BqTX6gE00foz*u|1x|ZSPmT z2Jx{T`ajj}|YX zx#DQ?QW~P+AE3eH{xTY(;V)w6vOw16LE(Hh`qSgZ!HrQUAL}SvTzs01p_Zo5s!{1! z-G++KmPU8~(C8Ld8eO47Qz7cotW$WEWQa zzn+h8RQqT?KBD$R`S@9Ce=i^3to9G`@lmxO$;ZdkZb5b2Axwd1S{%rAsE*h|YW5io zVxC=>BFUbBef#PaQ1m>KUS3|PFT-MjwSUC=_?pyBcv&L!%J1C%ULMcxq$8SYJKAPt zfi*juoI7ok%Cyp4_&U^2F78lx0MAyJo<^FfC6p!70!~XUq91vfSCwG4?R>rMq*dv4 zbluK?q!poIovQWs?rQah+{LxMC+qF^S>E9q9bF>f=MqS`$i!N;*K#ygP{gW{v?UqW z_agr_1y^lvLzZ5H{>;`$ZtW<+W?(;X)%cFyK_|{cdG`fA^x{^Yj z$pr?BkG-gNgeFRYk%FoaZMtq1JJ6qP5o*eIP z5sobU>I#{Aiu20I=ST)17VHB+b^u<3EE@jVY$o^@wO&xrW>D@@@J;F5RJfZrsIORa z3-4@^E6UtejUM&geRfFVH%g!Fkg1vA+s>2qPVh;3>MpxJUdXLdcnNXn$kk_M4(=|0 zr%0t$5jbL#&2V(AhH#v#FHiE`j=0wI3eZ%_)^fVplVY9dA@M4E@>M6tI~jg@NY|?~ zko@wdEI-~}^BIFODOaQE9nnb(XJJHy7AJV+5)RLYbbxGQwlu zD34E#gSmvB2B+$6IvRF)$?>0_lG6QpJp;&cZS|u?6N>j_iqg7IVAQ(2e158Y$rOdZ z(g%0N7Hj}fh#Y{CHrL{ww+p1^0aS6LrITZ&geO`)GO1V9m6RiBmvIvKuZ-{2dW703 zLlA14)nCF$SC5u+DEV$?=7l$u;lDcGE!m217VoV`Zy(>Hxv@~!^RK9GL48uAKBwDZooF1>}Yw@eg1$`OQLB-AL zOHQ(#=t5HM(JIdJ>?I0dT(P-rt1jiH^FvvtSAc!USyrw2klcW7^lL>jmA>WWHB6Ec za%^P`d_DiIF!(moL{){j-Ug$DoyknE5mQ&YmCxOWL($`;D?cTs#eB9c<>VVf1f*V0wJ(TDy}ngO$tuY0b+}_h2oPLtV=c z<>&5Jm{P`otg4N?h81S&@a^qmdOHxGRapS=+PI~B4xYNliTxi{ml^ScF&)!O$h^m@ zdE}6hDv9KWvTNyV1QQ4Qs8O;@In1DMZga@(pKyozW`P4q{# zZDp9}`JmU&kh3^~Sg~84Ks|WiLv15HCnpZeVCZA^@!bzq@HB^)ja@V%O&>yE?Us>J7U@ty zARBAdc4P!`6Nk@fK-($p0FU}U`Z-yzEcXH7B{3b+=n)S@BTmhA!tjNp$m=LP^64@J~M}O6AYQo8@%3oMa7PYo0GaYtBiN5rQv5j3H z)!E2G+)?$aZTR8q)o0^Btb|@2WM)w5cVtiDRj*g&P(R0GejpQP!5$LXd(h^XD(o0% zq-HF?p9Ol%k3F<*M^lH&v|8+(?uy*dTZo(XB3Se6d-o*i- zRA9{1fx5}BY(7dsJo;HNA{@3qBUpCw9O<^|vQsqNfNR+C5MD@64!^rWB=vVE!2NNs!_Ki7Z_O(GS0;u8Ru@{p@i1MHnvnv zeL7z6#AR(rnl=uYyRpRtw|SP$S~ae&V((VU=RxYj`e{3NAolwbOiQ+V*SHvSuzWD* z6w~5|wwr}S3JTGw(8@;Cbt7uod|S?F4l+^bbPDZolXEVCs%}CR%U)%I&a$Jl<0Xg56Hc}A<5jspwa~DUB(X1 zj(0Xk#?=(XfGSb}MKjz5w8~0T@6-G$nQC0Y0iwLXrYgC-Pa^GgTBkW{m&e!oX|kP_ zjfGqy3(>x{amDuTtoTEgjp-$Wu{UcgR;pu^$%@5$WyX?zcImz9+UDiumor*aX|%&h z8kZf;z9zd9fZZpaX0^89X*Jcfu;ad6yNr`%$T1r0 zr*vBq{JoNwA{R4p{7E6Nn9E{y1B#=JctGf$khDQ>|DR2+I8m*v46`ij_2W(s4&2Lm zWflCg{N%8SYF@EXX*azhmqZ(B6k~~@QIso04m$FhTS*L!id(iMv%0ig(BN}tRRd;S zAsNtD+4XfWU{I}(5ZRfoHl_poD!V1%{85Bwvyw*bEgczbVN@M_uMsuhYA?DaN!x{e zMY$mCSJ$urg#D<)NeEx<7}3a#${jeTP2SZ5nt)QjxwI>uBKKowhKvOX5?TnWs{_JmBTJ5M}WiBi1`Vcdhv_7%q1AoMWOj}X*^a_;#657&!}bO z?~Nr?*8i5k$Ms+C$l{^nNjQs0I9D^fzOItge^6jrX=;@{-}K#{PSk zNo{)}pgkYs$|Pvm5hkUn~Qt-4U_jvX>K`+8oFFvAy@5kRap(lDEo_S&0qQPN(2 zGcHP6c+R`k9=aJ9CGBCmG;moe<0JZflih=`T-|8bAS_o$ZpKB)_s_Z+7bWe@b`!#K zb@XOjlzcvRbMcYZ)%-DcHNRn#+}2Lu_#{)}vCAC@gz_g!pNLcfcX$qQc*33#p(0k6 zy!jIjW-2X?fPbAD-R}j$c^W)nt^l;3TP0O73om37(OC2T0L*Bv{4P~I zRPW3VNR^ zic_Q)C>^0Q#|^7lpr&~>xQnSY1fpm~Yjp%C@h8~2LeH3xm#2&olWWNbzN&B;Pp!%w z!Ai97RcR(^<(sU^c~_%l;igyR^8^IR$7^Od4p|Ym5tWR$g%n1A)re7>8st7!j@Kg= z!^0ZSTdh1PW6DIb?W_hW>B!q*+f@1$hIbFLSRm!1Z=wOWQ8Lb3H-2zu z0MMtx4e5qM0ujZS7ghF|=t*&Ml>}Iza14zuK^GiDzhKTw#HB+@UE)^IhQ~}mPs{Hi zt%}L%y;FJuamIwVt6Gzb&xG|YZK4RVaazYr}B zCjxlHqOcwwxqd_!11Nqbzytp)iRA@J(y>%Zc^4pq={j3Mw$m?w z*9a6zNc@kZvlcK>h%*2MmGDjgOLYPiy50pyiKPZeP$&AY<%5g=LZo(q8Sr}v2o5pN$h=duS!)J3ed6Gs(~+gok%#o z;2l$Kg6=`0CYrE8caV~RZtmTUxfVcokc}3)hb?qJo$3`x%*ymZVqT>|Vx}arB<6iI zg6;&t>juG>P;jSrqRMIxt1PT7yH+oM_GBolPOQTAX>JANf%xZ;Y&t*qoWmaJg zGA1T1=gUBKW65h`y8vixFtWc`6g~_JS#CcvnIy{n>1WLmu(2NEafl#>e7@fgaAEoE zGbq@QDM>V^8zd@FL{2+QXw4BG@QQ5%-6_&m0TaplH9&0^H6O_)xJmXvHfD6kO&Z}Q zjYJa~i6%4(kEBs}B#p}1&?py;WCF$M+nWMIfkG@a~ws9<^-uqG+V&w zxPemJHD6OC{a$*t%?o$CVop137lV+fym$?y@+8;!h_)_ZJse=40k|FifMsqW4@QO{ zQ8Hy3B3rN;BIqQXhqfL=R6SZIEqATkC~$o&H-^2kHpBQD3N=G9^}cObE)%%+BF zy18vJ=)3>_CJUJp+Mv2BTB{?|hCk(kS87DN;~W}TM{Nh45sUXcsRdA>EdN6r zch+Ve_YPrxyMuK|eluc2*Pz7t{waZM%$7T! zXcDF^SXMxcn1B10OD7B5lEXVg+lUZQ9{U}aRu=HcXq?#P5Lu?)(qYy`VgL7>90{A&IklwUo$YS!0j2W)o$t;RXGhwO5XEmY7nV7WsB=8$)YjEjTj9Bi?% zVc3v`EFRLo7?R5Z(el;{zv8Dtpm8{`UecEN6x%pWp>sL~tKXp__ttkp6qkB5Ig0F+ zKif;9Pn0`M{W3chR?mZxtXQP?t~PJGD{UyL}IR8LIde{OBL)(oYv|U?xBHq?W2L=Ry2^p zbsEG;aXphG=VhBZ%qPz32n|vt!B8?$9j77x=0xJqkED|KZ^;oe3!@RMDrFBJ<(}@I z#3Hu5>fMPpqfhv47F1z{J;rpwwxP;k$b)6>!_a^&vVSN$)aZ_HvC*=&+u!(Wk6g6o zx5c`6oJt9j=sA?~0X->bgL}F3MZP}Nnxs3QgQ27bF$n?AH2TCszHOH89-pvX03;h5 zSO16aCA~tyjU6-fok$lrIXd={L9W=YR%uKJ*0U?{ZDeo-W|A|&6ZH;Rrs+yY3L>l_RSbvs0~@8tnwB(@MT z@1v1IL}O%{fM${D!pStD7b4TRl|-h=On^)$!hGCRr(f8f@0g`@k9IT+7M+bvKa%#( zCoxDGX&5vr;z=V?MGeQb!|FMH} z1T2~@P{T!2@I~mMP3v}3oyic8SP!^{sFEAj(#IX5ve3s(C;^L>*>}}0_(H#MPO-_8 zJhWd+G+B!~&`~_O>W=z{VKYl6^F$Dlz~V(QK~a3oaRUWp-A>lU zZV?$o?$4UrQ2{~vyt<}xni7=~_?H08c(#_GR44>lfiC>S~2 zw^PLoC9R)k95fLhtop51X8R=_VF59PHTu3Ns)s$|zdP#%V*9X_F14_>RIQ%kaR`02 zi)bVt+%5R7mYqO7{VAe8EFlQ%WG|H*^-*2j*EmkDeg34XgL7JsBE@G{mCiF z_gb%rkEioV6)aFm(`tk6%E8Kt#Eg;!mhK5GN06$q<(?s+m*U-0dpca2{N;rN(Z_07 zbHHRAoYPmy&vPi^Y;pOS1r9H0EEaJcp0hBMN86~}$AeYuni>bwj)ylaMyk(p^HG66 z5ub3jL9#m|5DeUu$UGgmVsft5ElVF-K#br`^r1mY__6nFa;=iU+en~7XMvocq_Y!N z+?stFE16y{HV}n6C(osx9jfwL&7j@K{Va{M`4)h}t%1AzN$S`(q23WZG1(Ck!BS?}FNe-uVrP$YhYyBug^~0Z$oFX$KhYKkAfQiB0HQ6#c;1o- zomI7TC-&q@QfvpP5OJhx+Z)KiZZTeLQr3-p5dSLal@pQ7U?fqCNw9CxWJ*37$`pw^ zviv?+3bM)5tqqPQZgr*2?zx9gCYxZTkZdyWV26RrCZuf374a0WU`yf)H#N#a_wl)W zaaMlm)U1|XJcjZ}Ip4HWpp^(zaU>p*^MXd28jUnHnk@((p=jXq$A=L$tJhuZ#^gIL zTJBS@=iuMEH}ec<()m(NWlrfRhC{_(hgrL3?wmo z0E_4UHfOfM>=EL73>UBI2;4MCy(SxCq4`@ROCvXhSyX$8p-;aliv^xUt&9IBIt49W z&~05agJ9lt^qTjutnwREelEx`8Qr8F_`W9BK`v-H5{PXYr4}XM!h@vko{-on{gxO^ zh7#9U_1|_wQPG9{R|@zQ1REBJ_kMiIH6ynSld%nH^(8hWJYEIT7ehm&4I>#vDyG>C*hdx{R#j~sYhj2%Y~4h2nrwQzXS$Ho?P0?(nQ~aopZx-X z8EjW@;?8!765?qQC0y)?8gs34=NTyTh!V33X*K6g&z(Cx*JX&x$K;eS-EONGeW3Ta z7x#dv+1L;rgcaV-;ya-?vvgv*Vr`rYVz-n=IRLppT>%dX!7x@nhQ7e}6)Nu@ubalv z3Cna`?zR+6J_P#`FOk`B0+UMutQmkbwh*reE=C8f+oFZ)&`UOU!W{NXFL9ERT%72) zzNr*l8;urtbdF{Yc5WwQGy!emEJDg- zV{wt4lMcXwG+B>R8A>UYv6grCCJiOIbD|*aT+pXsv(V7J4BkPPa1cLLFtV6Rq)!q4 zR?HCDNI>N`wSCX-eETelpOBDX)^T0)q~oW752+#0Obym37sX76mnguO5(Q`;!)R;P zTGj33k!ho?EE#;cRpfT~3)nDM>|c~q2EpSi{f}@c{{zJ(=ZFzP>EUolln%**=9|HOv?rMzTatwt z%*0Om>b@}nV}#v{ZM+2}jxNw#*2Z~n!z#doBh+AW&~oWv;Q52gHfWG1w1vVS6XHuA z>)wdMEVM^m3>Y+*z!D`5%Mu)DU>3YIbx{A_c4U_tY`Jo!X}N(0Q|~a)i`s!45eCi8 zERVR*{0ss>WI~`oLrhz^GDe!DLP%a zV|H%rwAnRT%q}dR)*-oI0INJ(NwDIj6y1d^BhUy>sYitKv#YrSQMNwmAW$|AAe3D* z->1X%P%E6sPTsU)xM&+$t}_*ROOLw(I)J?8?4-j&=%15rL)M*(Y8a^dtZT_&pw&HX z*9BmJU(Xagv5tG)V%arB%hpX`EkDW-oy*ADS}?%p)plyGe9A9{g@&np5F+fWahZT! zape(33H`KH95o4kbA4~nTmzIlrnJ7q1R+e-=175i{b92_!L{yiPw1dBDr5xEOwsjG zp}Dzy>0Hh6^DENcD&hG2iQ|t${%ZbR;a{g8ctkL(^OcSY`?^so6eS~HY46>Y3Fc$- zd&eMoGktMvd50$Ww&p6p0cv9fh1S;d&Fel}oF1zX!+i4w{;Y>2KYG28O6Q)S%L&49 z^l+zqkTS(ATT{U;_#vxI3#a}CZOR@Au<8WGiDv;c(=(&PW@b} znrpm{!T_uRhLL0qhNGMU1{(!g`_Xx|1c+}_lY4+O&X~8EM)3o4 z`?RKCCUc_g*$W#Cnm@xj%OrdXyS;x~U`Ja#p(Ug#c@+bZGDTAQdr`Vz@*Ys<EOPE^iprSwvT4pOS(|VE-QRKOI{mluhblE2 zcpQh9(eD{oxQvU5-_4vlbvN!}0>++(Izw@QX^5FXg_lH_f{G}>X?tx@(awvpkHIRn zG{SpY$nug2u{z8%cKT5{!Bz)Z^yBwZ3C3#R$9A$&F(JsOqk~|Oad4E~#TIUWLKT?6 zp2HrI-|D8^xu~TuP<08s_ty2KN@w^A+l5FhFpGl&bIi_5Dzxix7iCmdn4A)ZuRqJ0 zKZi`t%)qM%AeRaJ0zj_l0AN^0K-J`(1ga_%e+5-5E%a6Xl5I(P$+q67+%9<>?}Bx1 zuNCJQPrV!~tNlq#fzNMhf1tIGNfK(Er3@qS0=J>w1ezghC3+;yQY$!L8RKGTK?Fv! zz0$jM$@a-P_XxK@&Xh>2OKYVd(U<|vyn1r(S+wJ0IQQ`C9pn-0Xfw_|zEliG5{yrn zp7gn*7;Y@HSn0QoqOl3Xt!Rv(e89{eCKH>4ymi^ulVE!5=q{dJ(o=Q`ii$2{b5l@g zPwePGK`ukx##SV;6FsW%-RDG5>2(y9MA8mcXXOiLb*l3JMz-~%K|2vt{%B(fhEA8% zmnW6Jeq9u-i3|9)gAk!nDlrHI_b1~)%>dKa9>{E z!f^ypyM0n=B*jUPDT$@J7ZLa;GX7yIE%KpHC=4p~q3j?E-+9ZY=Jz9*s*4j4B^ir4 z2asD@66I_C$3t0$0&#AopJ!Q~;b-7<js9#98 z6WjQlg+`u{QZ1>tGyDR?B#Lu5Nlf=*4&8kc8jQJ55>Xif0%*lc$mfU{%SuxbXPh&W zzvDl4wVh z8C5|Xgm@|l;>YJOBn0?E3J3lmGsame_a84~HA+)OlC+M2K3+!b`n@5qhX#d8GI^c5 z#tH`Ula_Hyg~Dvz$PIqt;76K#E+R-a2N|9&;(4sZC@i-S39J@h!BC-QVX&R}*A^Nw zzRLdyFIJ8u-Al*hlZe17UmCfy2K`erqBg8WX_P-?foHh#5|k`5GB=f@G;^AgL&_XA^LyKl+Oughl6eG3xIqowqj?rwa7R7?xq>FF_Gbxm+b%L;@pMWCz^pbH-PcAuhVS{@*c^P7OiN(1o_qzuh zQxpzvQM8b999Fjom3(Zg+ZNy`a&LY67qsZZ^&*B2RDw(aUw}=k0D0adGAWemZN-et z0Y`u~%H^w^5XVAA?jXkKzdMzAH)?4mu4cunlJF@`gr9o;ECbd+1eEwZf(}em5|N+`~ite6Oft&tMx>{jReZrB&y_@ zLz7fW85#asD{tY8(UTK|;I57pgUnW?wt$DwDiVmq0ZXoEmj|oVMe7+4u(iVu!}Qz0 zo}5%n?;WW)gsYH>BjoKdrQ!sY2Sf0B|6H+fp?JCN`-E z3^<2m$a}4*x`YFZ!hu8Cc8V;C==#6`%n&P(=|bl&&0v+-eNc|?7BclxN22U(fl+BA z->e#E6%(YsXis$=tL*xGUyTI)Ts)-x>+>r9Za)4>>1oDU*bUWiQsr(oV#H3&>iqB@ z!f+6sO!BaTMd3S+T?^{GV1=SH3PrcrWSVb!%4xEeNbMIbF>uDMkO+OoR6)Tnv2B)tk5F&_^yotB>89-z6_RcD|qoYLy8%FBbPqTEiIGE7bQ&V4)RV-}+^x=Kg1B;3o>hvxKCE&%9ml0V z_tm|VJZ5Bi{=EJ)ps&iG)SWwY$8K2Vga#1-fE)e8;Bh_B25X$I@b{_8LBfv)T^Q*@ zFfvGWuv}irZvR+DG2?!cS1h|TQEa;<(rB9ViHXqCvxL-EBS!8>g0sdlJs! zZv|_yk*3}<*V+EyNhzR%4K%f2I{kI(z5QAo7GE=9Xsgm}Qv{}Zc$I{*R)(3KusP@u zG6U&a(LTKxXtHt6#3Aci_)-+q{@QVCM#Qnc+kR_C2(tcKRRJmf!saK7vi(KDkt6=s z-Kw)<-yN3i#ol=Ft=Wt9{GN77DZVo8MtE{I&Imh?=z3a88z>pO7$|D*8Cd|5!C+m> z0i{>)w@qN@tr-#1^r9W%k)GK#o>4Im>FF=}#r#GqQpc9TQnIl@6Q`<$b*)I#qTT@( z9qBM8@oj;HqDHfHp~X~10wWGYUSL_O2XBX4i4v#MC5vDSG{dDUc5x!#_?@awS+M0~ z9brz?M&Z%g;>JRag^CgJ%Aa_}x%O|GdSm@$4hlwvjuVR@f5vJYYe(ASSbryHMuCgy zffIp^Ks3o#yqIMAiKN$a&~ACt#uo{y)qXo5O=LVFam%bWzGXpGhce2j-I`TNgj1*> zA|AUIR%Re-_)J;KriHo1qn5vbOgA0u1GN3sCb1mPu+k|O;s_&aN5h@<4FDpTNE;bs z7diXuCsY@!%7lXUWK`*rv591_SK^>Idu2j9-GBq_Ebrl!iS1^?C=&wH>WKDA2qT+~ zvM=nc6a8>tuLNVAeg{cnYSK@iNmY(gwc){h^}1A#cWWR>Hlx;VtP!hw_5Cod8u z(Pk+$l-K86at)24`jh$1j*W{RGL6WaNjJzSXpx93#R8<%7;~?gZ(YQFbsoF4wW7 zCE4I?KAJ^BkSbR_10`i*{NNuLxgI{K-kW^%#$1=rLpLd#f+IX{2G1h`L{H4u(qz?d zjWB;T(%c_scd_mL=D%_o+|~SxWk%eLjBqBzgX?Pqbt6v@8v6&IS6})44&p~T2NA`xr8@t8K@RF)48ma`koOGgTJ#^3^wwwCoFVw0D6p>KvMjViBbf7aMpi0+x$w#O?YSD<{1ku zJ6q@qe?V^^>D~!g<`8^aeuSgR>~+qz(m7!{xGletzewv~qoiT;Z8fmJiT~p70)X7d zZe?WKh!<9nLe#0JgWe0OsAEP174CrQt8fQUS0yB{!X420n=(Or0Rl=L{8V;sWsns` zkpm3|E%x=NGiB_uu-h;-a503|`2BwcxQlL6(C1>##Q<6Jr+=%jn#=AVUCR@CAE(AE zE>?P^(#QGQx~osEne{s>f3g^TRxs@Wc;is<%e$+aG)RNJ0`c z7f1xYbU~YGt6*8y+rjw=oKf?}fg_)Io>)-(J3tn!SfdZ`wo>C?^I+QAs98 z11=h!gg)^}Jp2hFej_vjs|*>Bb+OL4Dvfgo!y{bZ<)4o8X(h`h>DixD`l}8pdQ@SOF=oj3Yo#CBC<5Mt@b0oMM6k))nJ<0LeL$R!j}HknbiW!I{`u{BRlNOG zRsTUpH6WvZ`-OjVw0C0ktvwshwr67A>qv+bxR5&DI{-l7hcPJG3S2mr<*cSE&ajz& z3Se~6EZqAxlZ_$0!f(U1A*2})@qYSJTYv!a3u0N1V6WD&oTUp3+aov7zNXeao zm_Qci7O@x-GpmM!iD(Mg#qh+(PcJ{uN0m`bFV@8w6EfKjboKPpy85i=^b^4h_LC1~ zf!WLuOD_T&VM25NA8qdfZC75`dG5zK=bn4dO|nxY#kCS;-!qw+)RTx*J|@E9nOZqaTZ2t9+N0xeYvD&V7Blud~Uw3eW) z(%2#*qM|~JBi(8-pYQMY`|rKaIXB5oC0LSu&pCVl_y7O<|K6`Zr^`VR^69cEcF@3F zy(z0D$|}$GhSM1dnxaFj*6M6Rfi}};EN;G$IHG+zQlkMecpFL+TRfkin?g1}Xn8;& z%rhbmMpYLZG#;Ff(s<@dToUS8e#qnq2SG!laCoJ9)9cfN?V=@wQ4!^gE5V~9J(Xws1pQ!)m8D7TGa8`bv~3>3yO zx-U2w&+vqVE-JuHq_t`zcfFXd#$rM!u@|NKDf9ytfD8-)Ts4IFt!4Mn9|_4~~5%uU@oXB+!S!TF)s3dGnbJBM1DIeqxIN7)ZKl!KekC zcnqJz(Bmgs;rU8gu<}jdhFUjJSOs)^^7@oy0P`pVb7&RE?Iqck_6nUF_+Ggg{D;M6 zc3F?p&Pj5o0lrj%0T+dk5${pMxdj%R@+w4I(_wWRx~X(|wPU82nmYesxSXzT!(Niq zk|&T?3?8G3>o)Gh&G=ws@1*QCC3S-6WpATg0RYi6tFkl@!@$w-r58#a%O$Q?n)3q~ z`HBS8GvYUfs-y}yzcKe38B~Y6+8Adve>Pfdaols=UJ}Gtw@kJ=GaX9<-Cul;zF)_k z@euS2@l-3;j!p8La1P~T&vK-2$~CY42YrDbk+{T`lo(eJ>D+6_`qKOB%=$_}K)e~8 z(IHR+S!wFVQR=1UM`=bh6W|D_yqGkvd<2dFb~K~vn`wIcM1~M+KJq6#qc4}LZ&q#y zrVHI-g+smC%J3UCzd>X2G3rQAO_wJk*=de?6wCtOnuBz(H?hevk{9;;3nQBi*%X87=i79zov{n$&X#^CHG*_gD)o*@Wt<(W0_<7o6wId2O>9M?%~YzBtXxxZ^Z$8$+^jOhp& z--q79D+shW%1~(%p4y4Dd?=MPnS*b92_t3EYdSquB1d&fXF+CB%QcN^Dkfy?0135hzRjv1dLpMX(fhbZ@9nuE zG*A?`2~CN@0@6{P{fNmdoTW9f(3w0*oFb|W;lv@7Bg`SCgXSf&JaEPVFlZbWZd|%} zuKq-Euic0RP}NUD*|4gcv;T$5@-2DI#ZZSj5DqPf{RV)j9m*o&&W{-PW=$!)L24F$ zr5>Ld!nHsei{P8_80;zaK+T%JeWSQjlcL9t36Y?YI_+R7>c1K$Z`T3;7S)qw;vwLt z>{m=lyw?FcQ_eg!BXu@qfa;&5WQ&&X(D(!I%GIrPHFy0mwbY1I&561)Uc9A-8bfgl z1!+gQT(i)Xaq^)}QagJU()GF2O!wV2Xq;}lr0jjaAz@U zlwnXc7b1!PU3|S4tg{8ni3%kE^uy4`qkJ%XNACIFa=stT*3?AOrp9DUh@{vrLWq+B z5J#=;G4wk`f?i9^+wYlivVjru1zM*kSP9h7vKNL!5B_K|%VHd{1{)I~ww$K0gT_TV-^ETt?_P!JP+en9QR4z=L5B(kdu~T2?1U6c*W;W5;GtK{a`myzE z*mxT=vk|qZ+lY^Gsh3D10Q<3!v?`QhNz)Q(x@yMMWA!x;s;{`HW^AE_n2C!uL^6)m zR*%K8iYcZ$M8r4{7#A%J4rOJ3vSrm4th`^Q+di`KMOPuBo`+&PQ@cVTTaq*6pj3aB zcajE2#gNt07@ded9>X2j+muQynEpSEtL>DaH=asicM; zmF@#J9W+2ravZD zf#R#J6bx3`O^l%GHkME7iGVN1*M2x!dOyYvr~s6I64jr%<16Hd^y*l>gQ+?YeI3p} zm(tY8OW|;F-LS^$$gFt_^%hN4Ts;wTQYloJiIBu2g`iUVyK|%l}F0XxIMcb@nt3=eH=b?RJaqx6F^%7%l*h zXphE9IoA*hS^$Kh)at@1dWyoL+-Y$y>7S@Dt45EmG_>rGpG&LxxqL0s9GH05rA9zx z3)LFGcx}EqZ<_XU;+avlJ{#2N*YaHKtQWOQ<8fK0TqJ$DsM{--ElAidLte4i6*fn@ z;S@_tXAsB^X>i%k<-=CLr$o`v@DL6d3&FFcJSvlkW7H33{|r`kbN0`q)1z3~Eijd2 zI2O3${uPer291v|x7j$z3JGP=CoUpK5RGRiovBk&J2EOAW7p6)Z*MbY=R~YohetX72APF2#k>?Mm&3)zWkQUSQf8N`@6!A`cITO60IcU_ zhm#NPpDx$fsFfHteeB=)TUqlY9Un>E;ixu*lgZxJtB0Hv=nY0XYWujMt{DS-J&Ey4Y)5 zcFEqR(3pw`>_PXHr_}b0`IhZ``>C_@4^D^8&-_qsemo@!`1TeXtVLT)nV!P^Z#mcu z0lzhM~OT!!; z>ypsIIeFIn^mn?RHq$uT^)R6saI~q-c=z}LRMM$>sy1TmLyS#kK^i+ct~77`0BjOj z6VhN#2V@8@nX@5WPK{F6(dN}p(g=iSqZ3OXEy1`r_KId#gN9ve$)$y`wZ)A6^iC`p zXoznnPfb8!kcps*`Hl28phCzG{z-;F`$HPE_*;A)0Km8cU48vPMXMbVu=Gc~HoC0X z9NYFPJ=P%9(H80yM4H(mzM-tS0OOJ+Y?Q!TObFFht$Q)u*1XZJ$pBFFU^Zmiha?^X~`mNZAC{Axc=Z<-9Qi_bBbf1D89`+fv-BP~R2uah8W+|F( zdzbe;$(nzIyBXif!%)goMH7urKsW7#kk!hiV_Uoh3K1K6F+~3pHZ|__U6n^6(X=;1 zQCqb^6J1b@_oStJ-;)-(qT@-DzKIdR(q>EVMveD9S#EwjufCPBqvc5?!p3yODwU38 z@ptA%2j#u+viB@8Jt4&`8}<$_5z_U?0bFMKs%Tmm zDt*dIq-$urPUX;}##^dn&BuRK`1FdriFPU-EN6z%sVZH`wamo?VDEsEHIIET28#YC zGa%${_#zE>#fLcduMzxSVXJ`yyx_tK@)vk41erq(cS*y zJCu__hgGZ_sCsw8^O-Tf(v0op<_G4-j0P@-@4YdFh}b+_lFc(}ymyP}P`co!9^R@e-?0U5fw2f>n$b=JdeUkZ80Fj#~}cu_}aQ}zLI2A3yxa) z>E?&Yfom8p`?%QI31FV8lR#D^Y_d_j9_=;7V%E~8(SP|%%|yARQ34;3;+fPsK*y8H zSCNkAX)PEk)!PP*w#M|+Kw1Lu@mFk~J;5#J31WA?(CV};L_KJK`H|)XhLpSho`T#_ zn|7Cccg28^USMHScMvNflhA;Qs99$Vp#+rX^D_b9zNP{Y3yWx~6$yUV;!cL;a)0yj z*UR_Bm>+m+&YrvW18)ky*Uym3iSpB00tvuH>p;Ci&`ti|VzI`dm(41kxDJJw&Eyzl z88Nae763kz3umm_`7M!|T()ODl>sUTqkY_$n1@@hj$4dgJqTPn{6|@VxRJ+>|FqZn88Q2*n7dR*{`c@n+BqtVyl5Ui;WyrZ7osK^bf;L2 ze+O}#qbzbV`H^xlzo`fN3nz+fHMv$sCbSHDl}h1WIMJ&RzwcII?%Jg4?G!e4=vku* z#{l>PWuLbrX#GeqF~O9A#-b%wf}C3$qGOx`l}Z2^YKAodDu}CN>$!ol9jY_rZ%=l- z$yc!yJS~bzAuJAN_YoOA3lRA*X~Txkl;27Lk`Ko-3Fo){v-u(u8J~fjc{{IelVmhs zf^8VgEwn+{Kb&H-jS0j=3?%!D^SOA5(X2x{@}HYm|1v5UoU`L2+6eZwY&mCsvHaUE z6A#-7S#S4R-dZ;K^I<-oX9vC9CAPBgm3Jsn#%V_7hJ#$gk}WM#SZ^|XU#lW{;!y3Bdll49bDNv?sZuCA7Q@dl z=9ARUgzVPlzR7TqsW&>n1g8dqvl&Y;CHRz@u!y?V(my&s(9irXhOOBTyT2vs(P5leB&kxUr%r8 zvm6+N(;}CxSK*lG_6z_=V-Ze|rzcMHdCj-19+~(28m$OwQhvZvaZh7g)POyik#2$_ z(<;nYxVdS|Qtiv*Usm8qTB3$@!mh14QQlj}aV7a6=TQIEv#ir&4W#Yzt;W|#1|*P! z*088~!g(7BC&C(rkl|k>0E3(OE;5YgBmtW-o`IR=&GqMb`paDx%R1&e0 z-^B^2Opx3XC6FKL?l?cjA#468DCS*xr;orhOV<+y8!d1#S(b1D&xe)(^M3N2nzyLZ zYfekat2gk7^P#@C7WU}c$Ef)pv^iW3pnWfz(7jz~Z>F`}J$VXKii1%6XubY|rTR1( z*h3IVtLjIJ9)rBXJY<+%n=)@o>g2!Xit<_sEI0?U;ZdRFL*@o^*Uby-_S}dFD}y3S~Y59ihrn4SE*}dqOw$s z^V=nL$VT^_7pj-O*eNBl3``p_N!KqNk!64vVoU62W(NkdJ3yeK>|tryrYXTx?%)k} zzWZz^SfH5vPH!L_*~_;Q|FPX|+5hVyeUyNrcm7KYX%PH7Q0Fodn$6iPjOYJpOze)| zjKxz7A%(~;>Jx8uKj@9g#z0377ud(Y8xg3$LS*-MuR-tsryx^GCA@r380Z*At$Ae4 zwoT=6X>0u`myd0-vAv2Q31@@`m#v$8TcEJc$lJh3!N^O1#7MAmL}KPSWL0iJGBmf? zEL$8!4H1ZZ#k-CXrO=JHgEcFz!BlB}#~Ql*N>72c=t0VB(@PnDT)m#w%CiO>JdpsJ zHqvrCIH*WgBAY6+B80$r)x>*K^V)%uyu*@ybpsUgtP z5*cv15kpd08LdJA#SW_1Vtl0?V4K~2WeO%YLQR~gN`pr%UcIFem3!;AJQ?0?MNb=c zdT+^)!ESBHRv>DEn&JUASjmqEe2s~=F`Sk;DKZEz>Rt{#F`uJcM_cFhY4r>$^RY60K zh37n?yeTurePxh(mX@Z%O+El{%yRRcl+MM?8#hk3r2x(2!;7Aa*{PtL`q109yw+=P z)5EZ~Kyx$lG7A1Ms-*1iBDKjJ?)HhUM%BNThaKq62F080oTDmt?v!dBYw2rlHldxl zDfDCTX7|r0g=m@RIr7cnZi`-Pu3TO*ev`T?O4`XvcESD6WIbAvsk@ z@6Ztm<^`K?|4G(p&2I}{u*oNv7G=bt&cSVAbPN4U{_{yXH5cjBT-2C_3k4~<$mPqW z24T49)C4X{Q{<7fv&%|+Z%W>S9%Ko-NhA?HQ>Zi(-gU2v@n{%3y zGzBn3Q}ZLxR&WVn9-O=`<=kEd%)TPB*!Rl#n*t|iPaHUl1*5{c=Z7=hAPC4T(`aY{N;PF8aEiEiZLMs;kX zEEb(HJYyz|f}2vY=M` z#AZGPFiAC1n8Ba*99X@>01+v$mP%!}060^{xWgQ9urF0ILYl5dh>uNk*pFKI&mlxF9B7$#$UYb|0D_DZh)`{332_hD!=s7thh%q)< zqB2(h1+(%eBUKi5Qz*H1CQX*Pq@xCj|5xwgV}Gix``Hg0B$x12?tO>@2ZR6c;!Xp& z61z}7VJr){gVL{5K9U%L8~fk4bWuidVS^C3N!a%d!pmg@Z4v4MBY-3lS2e3Gk*~@` zqHd(?O9A?DH`T&runTYsKfEgYu$oS8f=jKHSiQDo8}zWy?gDrol7+6MNB_cn#r+V) zHr^+kbUz#zQoS3wniNnAOhjbgj7(`AfjQymk!{*WMuSl87G5ul7GFo3kP)218PnKp z+Ky9{j?Ol1BS=lw5<5j%1SS)05o3|I#YrSF73U|KJjB{7zXsrGDwfN{9ZVOx!CSsD zLzTRgw~+u8BX)X0QGF-Js`?hT{r4Sap%Oql8upd4(1RTr+(csZ*uaYO+Y>ty*)wLa zB0v`JOe`md@ddwu?)4+HgW=xWf<73Cc^iUzz?n+39qX)nW2D)m7*yYSUBgIjRHQMl zjxlXyIn$zQmMlLwSj+^vIuT#84Di|tI`YI%i{=`oL$k9z+YiKsSxAjKKbG@)%5SM= zFNy1q_grX}h9C|PLoZh#2UJ6nLzkOXbBP1|eX ziB}BHHq>b-AK8ZqvaLR`)X8_#3hag!#Zpa>IQlE_HqA(M%WX~o(%Kym^m71IDDhqY znZn!<&zS2cOiBUrpDz}1sppaDSUmjO%n9Mcyk~zl-7)kzrFl{wbu!|&LMr3XC|J`0 zC8@+Vz$5G9BP*0ViGx|Drmoto=I;t?SaFEEs~^l&tIoH2RR1)kvGKKASEiyRX0L@^^X zCq$#@Xrcno!b8-gh{m5kWf+Jco9A9#M%dLsugRlZM=lHhn4{_9$klp_`A_!)WzzH1lR^M ziE}99z>H{J;E_jM;!uYz#%%GuFbng~de z4&%u4mJcnJfks#WEMDn36~o*~?*81A6nJ2mgSOnnn{8G2;;W)wUPxUpDc=cM>ntQUZof zAtbqkjiAswtqd}{>+_e84T)nFjr{$>Yi+OcH(k z@s&+=*8kQ$m|k3P6n*n_!tXF8QUDLS6tr(N3En7=x}fE{bSm~FNzsKIP!;D#=RlDO z5D(Ntk5@`&@1-F2oKSbK7i;D9Hu4O`$)E&*(v97`20-f1K%3bl8W<7M62Y|A_NZ|S zcbUEnGsbNT>`a9Ixz-u5)W$Hc#9NJZDsQ#fs)g`X$0QI*Q*ZB{x0+Ap*Rms++cT@& zul1wFX8kOC86ny@P*S@Fi{&B~dzn356ArO&=Zh&Fv5Y;!H3vzBVQ3n@zABCYPkmgO z_^A4DPAkrbX(NLdA9 z>>c^KX;;C>u#fbdvlP5tE=h;S_R(~x^`#(?bRRd$Bpj-#|2OfWV^!l2u&6}U-;#Om zR1+eKCOPJ1)sMG###r}S&roQb)LF5oP|pKhXU(2&k#BzslDEjIIgcEr`Uc zcYR1Qx=CEu@u!t`#sbqLj;B&Z?X0{ORa<9LFfj|nO1_X}pk=kvHKA;8h!$d3p{Q}$i=D+SHG-bYeh`n#Ay*ZTpnh`8QQGft*-&FH9sW`2 zmQ(md_;fdY%(&d65cT|=W<4!4X&l=X_!cUE3QRta+N!<&6xXlGpUN3h0N~}^aDdrz z+0V;qTt(5S7zjVVh-q-SkLhohpBd4rMnM)}Z}V9v)%#o14qrnOJ#gThrWtg^+I3%? zqO^R5vy>QX$8i*N+KH_+*==X*6=LU_C+9ipnSwxnmDQPMVjVt@Cq3S~WL+7l$I$>^F1b zKxA~=M{(w@H2d#+Y&v?`w0x_&eUF|$UB>Qzf!&9zk1lWAw9{@XUp5`Q6%om8<@2Z2 zo+-i8Z;2ZRHJ^)mI|R&>9y_-5;IS`$=}TXF&MT*bmraN9)ZqEkRR(`yJVVnRJ+p%c zrsMu2!;72d2m{A6z`0fTMABvSx-}X zKDnI3mATaQFp;kOVKjf$Z573aHu?n^GFg*>(179|m?f?5YJgL`RVJ)93E23p--0=! zTj8C6BW?vmy44!22s(c23wxsu(yhRyKk5tp)_Z%m4%4l`qkH|mT~A!i9GfaJFJ>cu zab^v{RG8-CG^=;o*Yyrr2oo9tZX*l&7ly0`D`A%{8?4y|f7X}S^q|O?_WbPt)t`<* z|HK(DGZcRq#gwMH62%s0mtO$T$V-4(BA-F2gLP5Blx2e5eOT@a#o&){p{>DDE=-+B zkD9~Y$^{Mm6c^gE-OUC2=bpr0f5*GC{n#d6wq9Ydl)-fugfJvNNk>I{*@DatZ$a}r z?=yW@YJ5KufDc{Xp5}2hf*E&f>se`F-zfVa6Xw)g&3DE&g&Q9n#J>N9(K>wCG1lC) zt$4b;!tBFHZ*bF7o1_aRD5Z+*&*x+=@k(kQb9Fdxp8EY<#dS@2pX3DAc>7Ip|4Zxq zrOlVJZ*Si5UG(5Vj3bC(KX4jy9Gc&!zxz_LQ34HnkQIs#^2<9uYh%_r)sNjmnBCu; z|I_?5-Qt^1d(#jitnxw@OjCq`g|WLL@YhQ~qa5 zlsUyryvF5;a#|wQ`+N#%&V7%E?uPB6^bFox4|ZlSp`Ln|x9S~uE8QMXUx~0DHV;Eg zPqdDFH}@{j`~@{g@iRn87?NTk46^S$_59$`&HT+PK*Y!D!S!W*?8qx$_15awhLg!>i!X!a z9c=MnW{oOXhks!qvHito273gaAbV?LIB9Jtk2ER&qxZi*6 zVjk|kGrY`Gc{{e*y4%gOZrsz88@NR!DqLpW?OWiiooAi4#Zl1knH;B~dDdO20_CLo zC(}UWLzhYbp*?KiN6C$nA{Ke|XY_AMbTpPbumdr|j<8~r-)RFdws>xTY>5dNj=@_9 zdMjVZ)en9z-ugJ{l;Rk*zX2bj8%r3T4aO3u=Z!L^5`2Aib}GDuvDH_(rDV2T;&IsQ z6~p808-|3+3Uy;JCEL@bwq6pyVDf^(iEWeq;0(MMEs&uL23zY~@hP_=uYO%H3Y)5Z zHoyr}PXwZx0!CYtv$y%;mrMZ8fr3@Lv6b(fWXaar9@z)U4G*iYewO@*1A5;_gO`OZ=R2*3OeMg-!N4F-j<(U`MtpfbmlRFPMIqE zKLUM~(wep9cyEASyw$z^Fb3=OqbTjn7oX1;StON(rcm}C$>xl?ed98No+m|kHZT7o9F00!Cl@ct6L zGB618jm3D92T_eCKZb+wVcTFGqLOPWf9WLQF&Kt%WrDUGbd0SKFA9}|%@kBqpT&D~BYBE31a zavV64h2wsuPZRkz3towyJ;-6Y%Iuzj05-JZr;H9iMpBE$xdQ1vp}Y5gj?g0zFtc9* zSuf36m~M2htCPFGM3@2D&tZn=$pIr=8n5VKMkLG$>A|A3MIury0buU6EDyqxvFnyg z*L>uU%j%PPYVlY_OtRUoWeZmf^~ZA2&upwWdt|XD=XCN1949>usapobHn?3tSwBId0 z^@9xBk4BKjj}uy-PZ9AZk|8nfj_ka@q&B@e zhELMTE*ecP&mgL)4zC@k2`cSFuyXlp!pmPff%DYpU=M;P^GSvpDt2U%9WNi z#H>3TaewhyxQOF6E{@ur&5Yu`E8)l{#0DA;o$SnV%oNVs*!+!`S%go_B zZJ@WbM3Ho<6D=)m(cMUe$YSsDnV}pbz$o}JKZa_}S*yH{Z#DhE5$|#7Qy#cnh)$Qr z1l*0D*m>$vnN|ON351FcmEC-tXr#qs2>><{i%%d+l-Nx3F!MfNNdBf#vgO)d(Ra#5eyOW2NvjE)NfQX0yzNF3RP-K)26 zMhi$#3q$H~K3UJ?uA<)QetPlPu6u6+rU46k3Jh}|+X6h0MKTC5gE@5(T5C=yJ5<%S z8Uy5$ANlf{O#on?>eX1W6|;_r$uE_gg%&q0v&D`ONX;tODalq1uM#T0R0$QAy_W{J z2MBxSdS)=5=4YDKZ(}e3h;hnsw0xYFiqd^xnUh0QP_1Z}+SQ!^TCJ_%o?wV`T>XDy zA^~R0K1doU$q#ITy$3G1%7MwSu8@RiUnbU&v_3#U-ke4npd%n5iJXwDy1*wmV*~rl zK4_w+o5z>=!qcH+cQ4Orq>ztMh_;L%UX;a&P^@ysXlZYv5UY~LP5pg4a7yG48B7Kn z>DL3D?I_s~jc|!D0Ui~7lI_SvTgXLQ$Yn2@k3|bCcCa6PnJ>3sLbi2p&6_!qP}x~Z z4sWvN2ko@crRFI-U0L(tOlOapB6ps+`IGDlH_~Pbcj$T8f@<2xhXd4BJM=lFI+25d z8@_me6A^CC{xj?i_V`T@SpmCFn81c;7~^`PB`>tgn;*v=&_#)z_z);y3djT#+URtZ z5=~9-74NJ0b<@}k)1i(3x^U^=mh*f8t097P)l>M|m>cRD??fm=+}SA;#mSmZx}x%8 zqKi_v0+lO+yMtFeSQn@GfS>d+{MxpzknO_2i4rsjM*Dk~uB#!nYo%{%t>G=>fKHss9L|fq;0Wcx?P}pv_w0Q?4@UIItJZxm`>>t>!(WVWYQWJGYz^M5ZnTyC&8W_bQ!q3pSYIAL2?=Nf<@`i`0r*J)F^ zW!7BN{McUz@Q=0!8n{1_eMu!**Hqsp`VC_hi4|nn5tMke)VbMxbz3yA-l#nd1Js^w z*C%{r@?4}@&OEPe6Iy$Uz_Oh?umKY;n&1B@tXT7n@~+l@8pAjbaT65wLp(nWP`@!O z+~s6h68)oDO<0yK&vnKIE2T;G%%`6GXUY`U!;M#ih4oP5yuVfJFjYPeb-4hR&Cbf%; z31XsZ@(+&diNa?b&&6>@Y1{)+3J}Y;(^~?k6r{cZ%wguc6qi7EfZADfbA-Gd>sikn zG5SD8{j{H?fbnTcQJ@n(+PsR%zbx{HN(%-Y%rgA;{BpliGvy~g_OKOz)!Bgzzd?g8 zOki8h^9Ns_V-%OL!MY?apaI!s`Z|)$%uf%k!>vUJ(NH3v{Lq*~_lkK%qJJQ*fVghj zHmE9vuT`^63!KfuQ9V7k)Cw70kLPrUJ}KDGr$fZ{`E+ERR3W7w(9K`z2OLhdC1oRI zh1ck=$S%zAAM!~{C2w6N4!qq2h=AeR5Hhe!=x1#(K3N(-{ ziZUIqC#EYsjJr>#6OAd=Cmg`0HWF!MfS8c&Z_a2 z^*{&lRtK|Z^F%zd;yHKEG+R_5ORbYQ#%4Kp@Vvcp?)o9rI}USxfgMSGfD0*uhq#an zaD)qC|D#+8`)?#>_N2x1;buQkE_RZ>Km|)I2uLv@Lz$OrLdQ9LTzZ|EFXI!tI#G}<(v?IkTTfA z{SpI~!-wRzzg;BAz-QY`X&E=m@JuOs;^LrnE^foKFrfj#2kikI8oI9YM<0aTQuvTL zxL+=>zON;?B(IvKt6NC-J;P$WXcYG9cf`}y;gD_=a*4}n8|7qCmtTk0gu?loY?M0?C8tART zMo~ExyhruED|ghxa~AiJ3g6@GQd^+J6>*5@+tb=-Jjuyy)u)#`R4`=nzSd$TLvU&A zKHo7CIk<9anxdxIf24kwb@8cp(hzofUv(*l;kPnaYg`~!wm%?~Ih#`c8nuL%h351Y*5<+rO zdv-3;Ex1Ux;G$kVTy&r>mn}Fex?_6J~5}Yo~^)< zlsT#g!C+)RSG3XnY<||9FREL?XPSRQhLXE|vu~i&>BO0)^lolonDxNg#e<)GNgj_R zuKpyxrQ zSHaJGu0g9fN(xpSP2gdGYB{zHL4ow|77%bdarI4Qe`o1Yod3=uBIqt?drj znf^J_#-IY(J&1rK_n{bxD9BQ>z1nWMSEZO@OHfDvVU!TqnEMqQw@H_5smEe@tsaA;a4PA86YNe=|2g!U zR#y}h>EVjtxu3(6WBq5EBi|+mY9`&f$zN(JC}tk@E=SCA0Kc6XKPKLgPx49CaYH<)m&BMD*9q$oRC9KJrkcf%uzn` zXGB>%hXQL70 z3)Xk*^1^kb2=s>k=Mn)h>m5hnAZs?ftQr@$EJoo0FVB<_T1T7u;$2wb`E(!41o^V9Bi(LkPZYpl9ad9i3#0J81fx}jR8#`EWf@xm)xj}V2Nto7k z555GChenwk8MDu0@GcY}?!S__fAwz7BRD@Q-r_u(Z$C?ATA#pPlInow%g}Zl%qF}P zn6PvzG0X9E4Hw^UP_SlD;>bK^(ua}XBWs}kMqld<`PW&3gM{>69j*Z~$WUa+1IjdT zp0N_X`V2qYXO~%l*q=EY(+XPCT0G$gX%RU!-d|6 z=D7%vZ92AiQeVq9!XeMXfW$6QuJ=r@O(Gk6O)Qew=bCZHd2Puy8GoA4A6-Ej&(tqp z1=m9HQSP}>Ys^`Wy>`NF`!J^aT1{8Hn$_d`i0L|}Xa>IWv}C;tE5X2;wd18`KV>b2 zbyWSCAQ}#T?0Ajo%nFOXMNjisA42Z)Qv(Z2w&+UAV5>gaX0IjWw2hvw*{r_NSSt|7 z*5w6<3oFBZ?H?l1%>k?JV$BKVQ}dwM@3uyLVZ|T{B^v-1Il<)SA#W5>Ja7IND8k(5 z&C^CykV$d{mq*1He~8yihJX!kPvF`#LZ-z zm7Ma7z66FsUC6p!o=Il!z}Hc4Kiv$@RCn2kH!96j@+s^@{6R)DQjy7lmy@h@wcgi~m4TqE=a>E?)8R z(dxSkotVmJSOXDn<1~E9Ea|*_n$6-~L#=Bxu>Jg2Lgu|O*N)DNx%T9Atv4#G#uV}Q zAz1`uj{Gj~no^x8P@Yb^gO7-?t>(uDP3o$?2KqUs{x}1(E=FfCM(mt(z<1+xr(0o+ zSFO`HRak$t*49#r#ki|y@T?8ayo9Guv6k&@1O5foIZd=s1Q?O7)9aMO;2S8N$pA~W z!;>aBIfau^fjv!QP#wEYU>Kp##aGPiI@V>-;lu`Rxz*YRa;Q|vT~r^JaAkj(+ z5>+owv7w0kCXdHpn`y(mJkh}}45hUPrU1MdKhT_ix}=B><+xe9pMUhR8Q*_ST_EUd z?V#|$(zAF+gq7MXElp+mEd2w|;{m~UKWGFn?OVecpdIcKAI|d|HC%+C;B`TxnL_(t zrxhMDNv}G;6HtRN4PM_f3czE8Cdc=(JH20krUj~+w|!n3N+d$2`5H6r>`Q5Dp&muN zYEa$BE=TfX$RFn(17Zcx5hRF%9K4ctGrk{6;>#nV((6PoaF%mtVFKbYiU2`JgZ-Hx zBkY1Z8ZW!MLKD+p*(hVv^S9c-Kjuf^v2X5__gPP+Q=@&=j^RtMOsH z;p+bW;Sp{&CjT}kk%Qttap&u%qmzcr zej_KOJI{{k=*V=F3(AOFX00X>s=N3eN56q!nE<)qbGlhM{ajGC#+T4;BD1zE%I1Bx zRgpaD$2>#Nl6!4W0M7GOX(nSGy?v8$EPJwfzl{^AlNTBX#s({biw#ym1g5#v+;|#* zdLrfu-F;PTq>3tdPxU$4A28)Mmh6;hvIWJolP!Z#l7$EyFmI}}FopBiZsCl80PcSy zc0Lez5ivSQxlN_r){vY5uSXQ#CN-6KqW>4TXEOq&R$=WbQdZof1h7p&DN%kg`q@tjh{g+|qfLN2Jb>g+X(I&zcE$ zj&PPRlWk00`!ET<{QxJzQrFBP@QMX}6E4@xDjS8&vt2y5dRhWrBAMS>mIg>gw#HZ$ z2CUv7Uw=Ij#J+JD7bta?+~JjdBfTDBOI49=I3vDBKY1&r3MshEVHxV~0>6LYA20J9fU zq!aI=VqH>unufI*@Z&Q*3l7&Ub_hMbJmNkRl`>B3Vhda=GTF z;uM!>-Bb{Rs;^Z^^swGVNi>(;D&!y5&!*%)1yetff~mipFP=Mc(R0yUo+5_5GX}a3 z4m3+?K^rAJ(jGWceXnY&Bmj{n=0Y`;f|R=TcXXK&~&Qtc#SenxkVYLTohyEvJdTr%NG1rp?u=E;+zG}Idf95mEI$N8y-~1 znt;iErJQEX7c)N-^|*u|`a3{Ms$O)xLS`!0q6Hu%SD1m`KpNQpEi9Y;I4c;EL!rZf zkN9$}AznptOcQ|-!aqKQxl151_Tf83eHh6cy`v~79%N%b`iY5mU5{;cP`0uZSE|n- zC0ZhJ7Q<iQ#jKI^Qkl!=X3{0*8^27LoqySIDiHe^6#xDJzEgO2}xo2^b(tej`SX zb>$$w?$h%Muha{kZUP#&bt8#o=s6ijq~T~iRy2k?-kmvQ-=OKdpE5+BO7c8t1qYCd zo<5hF!{^mEB>#-x2PAnuI)Yismq&3MbJ+q>g_jnhq7pcc;u%kI)l1z% zc_(TC@tA8z*x17vTyW2ArBAejt$w^*$MW_qZ*z-;DP%<NwlN&pMVae&&VF( zH_Wo>>Yb9ENY3_Mvblxa%}@MQ&p(`u8C3e7%ADa^1}-?lH%L7teu-5@r|nF>b!-p! z$qPu_VGgyOYQ&xEl`RtEr~QN;dqyH`>M5yEANA6u<-D7&=^ z5_8RKe{ly;*J^`tVLbcF&?5^~GNWkue$8Z>g}sCxUNbrQL_qBYx91j1pUDhl4fu6V<>c zMJrg`%qYAQ%-U$z?5WY**@rKW zW$;s+de4H)Z7k7u1R6nm;V)>+fIJAVTMoViafQ#VMKnPkqPi9K%7drYUCs`|<+fxP z6bae(OiGH16yznfT&yMW60c%Btim%=qvT6X#BUJKvk{cAZHMQK8SKPK%qfTa)jZy)K@Z z=5#`v6+s%^@XPKN4;Fq%vvcAaG*M-YWfRV}daDWRIqLOH_5O3syg{WLwEX1Qp6Woxs)?|}+<%?$Dj3tND@e;9mLodheeW)=o zk2bs18yIEP|2^)S7r_T}26g^U7n^JXvquqRS4;u5zu^)|8?~g@G;RBuX`f%sm**AO zo{>i^FI&d};R-C5`9xAe7c$4t|7Gjp+;at%ixgNcTTn}bHMv?E4Qd8c3aWOR-`@05 zsY(e+0TBsmB>&(aQ{xpCAR(aF2y)5oe>={gG6i$SrNS%A(^7`iGNBxc+aQOzlQ0gd zwuNzq!UcQ>BvUGfqs#B{em6w5d4vR0#c-f37m(0vm!XVaZ@7gY)UrRS>G-6F9p683uDC#?#trbxnU+RG3U!0r3Upw91KDi7HwgNE79e@(_QVP-DD1|T1zA4>iFv1e z>_Z=%X_XBBb4rj7#dBtOe-5FdHtUn_@kmJ3clOciISzm}Zf2u=D3QM$xy*xtR4>x_|9#uq1jF#=Xe z#M#Z3dlSIp8P^FV8`*N@O;w*JGay-$-AZJ88oVZeHsbUb2CXZ0;8zFQQ0=-A!BzvU zBqm~0VSTA+si}O45`bd2*?tE`$&Y9cx<#B?vS*TYf-b6>&v09c*ipIwu1w_zvrKt) z!x2|y+x24C#F%v>7EWf~V)&cqcc~h2QT;HDD9t1lyD4V$lrW>!wEB3P)NEz(t@W0A; z;VGxj_%IYaNs+*9A`U0K_!;{m5oej(H5ZAvBmt5OypRlflBX^@~XW0u2|C z09#=Fq42``qjUiDQj-TRW=pI!Ph{utQsu%SQfP_tG+42%U)$O^>+W6fck$m`)#ET! z?wR!~q$7a~5a%aggibiV)vfOj-{k6ac|QM`Z>`k?gxq6hqHClyQ59MwHt)+$!kd#t zzJlq@kJfCl`ADYJuUu23^SG)S=sWigSq*vfXnwl-iIr|aFifR7v!FFUdgRgkd4L1q zg7;ry?GJv*UdnjrT=B`WR1C%Ir4S`jU|;hkTWKpw5--KdyQ%mY=A#+?RNg$TfbCD^ zDVfw(ixXWkaM^$@uCWvnhsie&OHRQ(vg&C<14#g3%XL)}m=3l^te%bO&|-5NPAl3m ze=qSJ+dg1k4^=xxnkCAbMB|c7kpLzj8Er4Kq72n>DFm7tX@ndL{-5-xp^2c;2_@PZ zuT4iI=hbHJeR+PXm!b7+Gx@de|G6O@mEJOkGS%E zLbEXUczMcaYmqD@Wt)bf;iT)s?4Y!eJWFxdijdP#Gh}5K7m6g|tHukXm}QX{CMK8~ z(R^aC*r2}G*S2GV@HFu|RmgIYJC_T|z?ahPI~~{0k`mQ!QE^v=f-h2e{lB=+2Q6(q~G}cw`7M&p;Bnl!k`uu zY+uP^mSW%h^iRVNIO)`+J=;b`aZsu{&%tcInhOC)q?^%FY5@5IJU8HoBimr1Js$be zJtLZrjF+W#^-Ra4Bw*l#m^58sz)o;7s~(p@8Z632NH@BI%Z+rT=t3h-PYZCO>FHr5 zCNkBc`ne@rHXRR6Pzf?yUzN1stYaP>_Qe@n9z}RYZR*3=B$zPUiKodXs}LT5kV`V3 z{L1oTeaF!@?5AAIY<&wd*NiVEo%4W_&bfrurLX~?6gJ?ZumKl^4YZngzYaiKYW3m`(7|@=nw9megD6Fk{LygZfMhmoR z-cmEMAI7)i(+akU(y%RDr-MWV;+F7yLL`w@Qwv>tuOS)lG^wVxhHQ!tc_;aeWHI97 z+%uI6F5OG)-)%8~(uf8A=ORfkvw;XSEW7G6!J+9g0;^MgHTvTeXKq(sltBSV+%_HV z0aRpaoL*mT@ciJ`LQlY7XXRBAVClU;nlc|%d@xOafhM_q&h^vfl9N;KvkOVN>SB=j zCowtnO${+gYtv5jv(128%pVP`9-m9QIu$kx%5i~^=V>r=iFLi)(jgDD_~x>0RH5gG zR14&Y74f8Hd=Mo(u0M;G3czNo9@wR0C6}7N`&`!i{%0Y39ruS50`&p61Dt#WrMu-H zdE0n0erp|{2Kcxj5|#44FH>)@t6&?1JhVIsGZADPU?L>jfKQeuL9(3OU*s>#{Y9?< zE9x-!SCX7Z#1Fo0lwHN#QjZ1GbKZ zV>!GKzv4LFlZ~$s8NqH^Q;zo=O8T~=?r2ZE9nAUjPjHeBEo3PO=JeC8Crz-Sps6Yy zRGx&>Z8ZVMx_nQ*t61!@-2;w$n(HCvG$qumQ8gp`pGQhl!?aIsLFfi8U; zM4&m0A>o)9Wx|EQYt`x~OY#!x{GSShio#xJHFdX$IIKo~th{Tc#lvx36->4&57isr z#+d`gJBq~~1HGfZY#XzPW9!1&E~QhoD1t{k5Xw|_Rwj=)7$+r5Dv0AsA4!gVaf$OQ zfDy2E<)vT<%Z$s3qDg(hrHYLt{4-oJuWIuTg~#w*vf~f~dL5HiDjOh0hZ9?RrdbFH zdD0o3-zw5F!#Kx3z&u1eLeg^FlnU4CC!Whw~9&8z!1M7DzcB=dwuPvp}+{yPb?nsj1OUKAuTC`_WY62;(4__g;`b; z=pma4an9v(sx&QeLhS{3P6g3iR1nQY3Nx2TA=!e$j7qf)IIW(LVz8|Q^_)jY(Y2%k zI={)R+BV}65w9`7(DF%ZhhAG{rtCvvz3S*RPzyL4nCmB$g(HmL9*9kwE%PeLL(d&xEyau@ zl2ZfIZ3gBoOuh{b^Ms9VZ((@7#YX2X){m+87T5cE3k=HN!5!UOS~GxkTE{yH0I73J z`1ghsm+cY!^#r;f@PiRSvRVO*1V1{ivYvXuBT{`iR%wrs!IwG1b;UDWaqcR^)ykbM z(N!6)rny;a>yboLrnx~=U(6SEx1L1aM0X=QY@QX)hBy;j$vFNYSXw$e+?vMs*jk-q zvdkw(Ig>-8a(uvbY3n-!{j$zrG3^Z52scVAPm=Y`OU24!FSK5Rg>LPrA+E5R-l}#b z{HDA;E(&{cV(VT|n@`GZ<&!LLK9Q@bi~0{;0%kLwAv3bcgV$q7D3d#0AAq%?vJ%_} zy$~=ttO8@I#V?d`t}J>y&IO5F*bIT9WRK!|UX>O>KW{U^Hdu?48yF_!eiO{X*30iFl1tf+pMJh{X@j*|3o9$Ej+by}m=y*h=52Bvj$AykHMB$s4 z7q{e!s#D4G)m%z@r>W6P&8yGXro#xlD_BwTLdR5`hOvMVK->mLUC{{+tr3s^$dC#F zY}`oJYtIHIpiGXSy1Xf z)`Ho*D~n|yn!@a6qOE0arw0suqgwOFb~sMS8HLxn?DB9s5|d3WJ?+xz1k>CS3Q!E# zbEv~qLoSv{n|m}0GuYG%k4EL{sE9%#i*p|rdJOI70{dEM%y3gy5M>ZDZ`;P9Ke?f` z{^C1A3X*REN>iNTOMP{t9c%IRk!_C!`53@bl{A z$%1m2g$~O-=P&nW>se5pVA4v3*y) zp!d}^r1(i^*AD*ub51|Ty|b$NjKU2yXL>p%+dNQ|XRQp+ZX3l742?p(( z;$+srZ8W4%JO=jMcSv9|iai%fif(tx*o1Zp&)$F-o<`E1tf@du!?g?=j=%=mZ`N0; zWfWuOZauS0$DptLyLv0@noR{?CgpK3& zWhsN|`tpd9-^JIl-6S^MRdG-%|+b_VC)IrQ4AY?1Oq$i{`C7rV9(9niY&B>lOzm%O}l|ozpFFYM!alU<+4U2L> zs05?^>~YYw2UAx%n*RX(RR5(#Z1=|so%KQl@Y&-!_y_ua;!{+ASLd(;jLxwlkaCZziL;HShZy zdoR2rS0y3eit|5oR-8XZart%;r1B!(Mzxow?`Hr4onA{*B zD`8FzdAWod;xh;pvRxq5uVmT)<)8lpcqRX7T?Xf|!QlDmOz%9X zdSeM1NE8H>!511Tf09yTYM0{i~qA$cEm=Xx!XpCXYwnRSKp1zI2z z53SSbTZ4xvMlUwBizuK8i3yF|YJ$loM9-J|G@`!QMxDgAX(c<&4kmS*%A8|82Bb3#$n zj#5?a%TxTRvnkOQo2Q=6)o4v0Z{Q5*I=>Uy1Ge0++#IPgpc)_1McXqgW=yt_X%&Y_ zfSk@Q&XQplC4Pl)nP)PChWxdV z$;?V-zn*+_lbK(XOfI7JDPX{6CB;G*BAM)ZN(7nIpEY*WZ8b@lNCx_bw2LyUwjNGe zB%aLzNY8vx!NinFJG+!`NGoagf%PW6EG zN)g?VRAoC~7pVAP3ArHr!Q9Bg*>)}ad~`A92cd*ocS zoHEtV)1zC?MZV-{T3zzPV_&`NhiZjV%{!^Ey9~-*3}oG6iHkII#V>@SM#p-$)D%gf;EL~V6#pq z2jSsd;|FfeKz9DB_)C3h3fha^oT0O!5$IR!Y3T<1h4RK<`qg;wi=1<2*BAF3&S1v} zvj)E_T#mmvj*Q+3NTi=rLw{5A_pvJb%plU+80mh7J0C5}>}~eR-f`~SO_>_Mfh2cN zGu@hXx58(=^%-BTJ)m26p(hUTwJ{I7RFgm6BkCm!b-UWuV)Ae~f4I$u zdwqOimx47HMToh~7qUeegC$Y6DV4BUKiq}~4mc-1v<~@RPiPp-xZZj%@SEBYa5?39 zmY20-8=Q`ZK2du4G$L44#&mr$N@|98nI~talmQib2OPC*{xG}Ud2FTx#iJ^F;M*~W zyw}6~n*W)AOEbPRoD!ygsJ)wbb~eYeW50@x?mza`gD8E2MttF5_H_$BY_xzBxy!5f zVZtRvg4R^xn)3oif#+>2&BLq$tg6`>ot);SZAqcP0IU9;N{WI3TaF z`s=fMraScBdRl#>FAYtHg3f92==#p!G@g#RlSWlA^&Wr{d!bH{R&ULc*qLtw$8|paD4}Ph0f%5)H@&K7XjfPTiZ5+sVhO_c8#f# zgLLs7N%@JC&A@dZZfNe%6?vaXtEKW(lvll%^W4>*4LygH4k3}iN_5^1i6T4~_?0PR znc8=!4W!g3XhnqX)Eb-3f zh_?0-nmwVx>LCk=nHehLcRRG%IoX76!$n()CZpp+@*LaJ+e`~q7Sz*ujVEewU>kR< z<-UNE>m@KKO6(71t^h!`VU-UA_Mo%r2rz?xw}b2B+s{o$dQlaWy3cfMhz^-$5ij-Llj=CtO+5KGv>`%dT!MkzatkLpJ-KCgaWg+)>Q7}!pS zIi<1>&1M5h_DuVg_Dp`b%^K%gu3N4UX)<%Xn=71wf&aYis>Kwp=rxZyk*6R;iFq@XLdvQ^bso5`ovXg zM_#PjG+#xozAhl*?I<#xfgb%R+VlZup!Il4-m71S#= zwX?{q;`9J_0#@abb0pb~Ty`E-<7nlW-^zs?^HWKoLuHrX$tFLyyqWpjt4r;oWkwEC z=*)Ah6diuk!3#y_zogSl0u0lhcLav(>L;@voxggI^!L4}UHvO)@YBb;luUQns*hm6TE@WeZYO zVUE3_$){2o&JPHl$0w@qteEzp#2kDE zuGn;|aV=4|nRQU6!khNBv6>_a;Lg{VcONca0R58rpluSTIuzRz#W>XmL@uEN68I3g zH~}z|)HDXtX-7*43Y0#T_iG$;?m~ILA>Z5l4SkPw!~_8t`4lD4v3DSD#n6b(-AtHK zF4K6^*v-!?=pe(uC>fs6gfbxqpe3|XI9o5{xJkS#dHz1Sr`Y-MVBQ%0Y|j`ab2VE> zyt^^VMaC!>8U9@40py}XWw^)~9bI44oczKk9nZ%_#wZsVqg-x8S>%=@92LW5gTrC? zQpPBkJIGFR8eTFhU|DDqnL@+3{qGS-h<3MEFP^-6N1bK_V z1x}a0iGS=VIIo7OK80BcyPdEgP?3z^-MW*cWOd_Kcb6IADEJ^pG4HT>59%Az>`YDfxgoLd|PUMGc#oucB-?bjo;xU zv|S8~7+@uyQ7_?8oL+mltXY_VBk_n?AaKc@s9m%9K#gh_l!T zt8~X<0W0lK{K*2aIn(3krq^(ef(q}Jl()T4d!X*a*yd7Bm!$JGTyUJ;AdoPH5R2|Q zNr%EiQD%d$NGQ_!#&Hnmd~fsM*yO_=I&O%#v+-a#2kl8l+R(`tpRmI1aQWf~@*~hD zXKvUz6d-jTll$b%MmX&KsG2YRkXitR?cB@K>Ye{&UGR?Bbl_KG!Q>7ubl*DVr+04f zi8jqg!J7KjcC`EX^1);EYo=@Uw#Oct^6i7`*CGr^#bzF5FVF#BnMeUq;sCw!TaAn5 z8xtenP#lBHHmTm6S)!CZCmyF3s}oskiN=j zm|xW7XX=4^x$)#p#fvN@c>t?MpXR5>9y)g9K^U8D2QOO{u=-~ihrC%nADX+^bnri~a3&Rg=4%rTY7*}6 zkbF1C^!hOIlA$TaOmKao@;>16qIpCUOhG_VDQ<+Aqg(8&)o)UMlB{*~lF@p4>jbqO zU(x{h6c5?B3}6yx_0jcbA6t`HTYYrO>1$1)?K$+|B<&9qW`A&g#=G2zw_f_){zS7Q zduNgdl%rI4Ii1VrF|G6oa<@f^>OqWpqGdcwI81ZfdfV+fCWeifcPSXAxT-ov{%f9w zMi9d8n3vo6;6FRHn{%&?M|9S{u$6cCxr}oT3!7=p{OV^J5lpueT+l>0SSGM@SG+~$ zKS{6D_pI@jUH+DE1fZVl^Z}4cH?vVpvUiv$?AdMn38rxv_$J7L!z3MYCy_<%n8w-47niU&g-gemVO+ z2C%#NbeQe9c73}Q_Cfm@jK&md`x2P zF1~I^ga*<`LkPYMM>(D_S}dclkR8nS(gfoWl`~;b0cQ|3m?&?ir0v!SRc%AKJ(%QUXrd~Jn*G1dRj>vJr2Bw>M zb;k!Xo`@zpx5G37njzehA0yU2`(A5xaEiqMu%nQP+O`~x9rc4|ma5Og;FqInP1KpcIjoq|v^aT<6kuQpz4yzv@H_@cC-Oo;4k9Ur- z29!MQr#g&0feUjfO9oOeRE!ImA8;^Os2Eq5j5jGRNrOLg8sVvQI zRPR1q)LhVr_H)5&cYuqzmuTLrHU*>l+QW3|9M#W0j3~F$ZBB79I;qMMtX$%&@z30N-$ecx=jqYh%dJc(}188o~O4O|(g= zTw%8wP3FzYUF=XFnKP-7GL}&&S3KsY+s;h$?M$zr;DFzN_uX7@?%lzKlC4Z9@bIT8 zqa4P^4+~%LbHN90T|LMB+roC}fcEyaUwtdhrrx%n|tvtOse0R>ddv1mY40 z(Qd)MZ=IlWfm%KRxgfMoElx<-ZX_)XW)^K$g>m~{41401^MgTF`r#>J&a`krZ|~0b23I!H@X2g zx86Rc0Y6$9Vh(fbuIb>peADMbGjEHIatsi5W%xa!XB>FeGZ+0g&a~Pb<5y`A|u9-pViLUU6xn-bR-x$9gdY*f`>!`wB`aA-^T^E zxo`;mzm&*h{!B8r86(9`i_-TuLk@_5)?a*@t{(F&0P&bVm#50-o@L2^ps?2KtUku! zG&}J5#5t`$pS)(cSQOPOzLZt9Zfp;}B`(%-Ka5CI-!7E`neY{TCFL)fWMUh-9PTz% z8J`|nN9!NMQ+Y7^hJ|xHz_uaU&V8J=q|n3*Ldh;&*s#z+bs{mJR$=1Cd)ph0$uzq0 z4=^QrxFtJ=J2^%OrqLr9(A(L|pn4;J`V*bYibo#7?Yi)cdj;*8&L;>8+iP^h5ost- zWi(__BmrfN)2(KVF=hkc4lJbn`1kumSyX&n!d|$|dVeXLciZd#U@_qK(U{xo@Q*Rgjo6n6=S%Y^jsOOF({!1~^if zd;$dMpZ?*oG8`le#w}XrsJF_wTvEaj8=dfup~d#=?3{!(1jktZqzgj@sXHW<7)POt za|xL`a#Y&9S3X@)ik}pJOY!5hdsqBnSewLHK9(=4(O01|;s8oO(r%PBk->8S>1R?B zjTe6qWUBsbxLybdk_ouX3LXrqy6oD~goaiyg(CQtVv!^EN~RzbHpneDGu&`x=+l;Z zs+Cv?B7L(5*G_>T^9CmgcPejU)%Tv(o6uc^Cdm{gD^Sq^-e3K0nE>Ewj=tupDa>6b zI?BLHFhOfU%`%V0)=NO5HV%T_yuI2NFAgU-qTs|ul7oxj#AOR*-$`V!905R-;36Zh z-qX*Bc32vUAY5OBSmTKs)#}3jLa4sL|2pDT1N@5pd9QzWK;l@Ni3@-TR(-gHGwQEX z`pdo}z{;S_rvRSQV;Phz#gyc{>gU@`%Z@#24*PE+ekwCa?3T}mtW50kvbPQHXfBxK z2}4ui_^*|VEyH_x%@>9|0cP<_?0pGid>dj{9IcFNX6tdcci+uWk|H#xuBtZK}A5Gt%KN3^>~v? z<{nf(&>YJ)Z*D1MNtCdZe0Q*BXRsN0+P5bb+h*_B!oJ8mE<5!;HZS_o z!kv4EpRl8|3DlFn8Z34{t~=9HzFjCu07Hx8a)I1wD^ZEu=`9GpE{Ytz-z~hds;KVH z<7{&$;Ao!}S|&Jy>%J5N8p$)ysZ*$?5H|MJ36yKHV`YibazfgrB`R_rNE^cCpu%Pe zSF>%aSF$jWM2#P85nGD|rnF_liUL)SfoZXY&8Gfb{0$)L{3OE`GHemi>}aX{Oq})7 z0=g0|>!J?2AD7vd9ENSKv|jB8as-+nN!k}%%#igCO(KsZ-SGh)p&AP5%UFSUmXW~G zGBEZA^!3({5}j)E#|m)dIf^Y|#Dom*6tif!%@WZ2{wO=?{i?n!okkNAQ4={3d-8^2 zv9P(P_;*Mr_Pq)2x!a$`UC1w{(k6DV?@)~fdwz^{Y_{3LiR05^U$PCw^H@6j7p?&- zwQoo@DMkMCh5lEn@+8otW-7leRa6D^Gpp+XM_g*1Ib9D$22X`kZ%N%uF&C)p_=0dx zwfMhCkLJYZz{yb}2H-#m{E_4sQ;<@6KPh2IfVYP6P#`5#3TK*-iB#gW|D5dz#C%)W|D53r z83C(Rg|O!ixwQQp78We5HFrrg?;RGFiLK|&=XKUZt13U!E>nqKQa`uf-K5T{r!jY| zWLAD{K}LC>b72#H93%W>9^mk)bD=)Tn-T_i6M-cVHh;X~K0lN?xdMN>VSVcE`HN_x z3A$(zv?kWiLRw|T#a1BPg0wo=cIG~BU8CPBkldUjJ!1}@K$}#(mtl*rj*MCj>YcLj zHzNNA6I$v!jPJGiUD8+?)h_;@!Tcg06iA!I%( zXH=ckB_7lsvK~$Tf9Bo>-j1re`=6O}Z*p_*Imz4*B#@|cj!`dpk)RO}(weyv5?%xp zP_(}AD77>}OCq&ufrJ-%6M0b)R8)KoBB^hvpjd-Ojfxl*D=I1~Dz&y!Yb`3u|NC2O z@0mI0ULg4N`F#EfVa}N|v-jF-ueZI{+H1ePHFYV}5QB9Nuyh39Wa4wFPT3{H|G`a5 zGpixyq`ZerHf`)4BBz020Ae8{Q2FPRwvQ;Te3a21SfdgXAOJ@YQ?Y!VJrDdXu!d;1 z{4?Q`}p2d7e^L!yC)Z_syil%_7`E3`{{eFCF#p>am8Eml=@^4v`tDBPyyd zO~ZJNWq4FmQcMqNVtpic)$v@kxa<+odbVzn zOLbuKEc>MGqQ}`MZ5KV(SkRYoi9)7>bC}73KYI&A|V{VD2rZ_)Xel7f`oC}mrh9KifrAQPmkC>Vx zdv7C0w&raKZDZzp#SutEz>J$qkH%Uxf z4kjyu%UZI`xEw(`ESIB6hvjlC`5s)3C%2ZSpVwWWZzqys%eRxdd+KsZm!;q?8DC)~ z8xm)A)S;a?7@TeHSt*f(`OPSWnnDXLG@1LbSKbbM(RM%?t2!2R2^SdPi9tG8w9n3@ zF@nif^*fT|`ji>Tw<$q8Xl|0mTJE1l6%8pBuv*=s*Pdt~xSq8x5r14?Bzp=-s*tP5H71amu8oG zFOzOo+KD)fWEp`ISSc^b5m--_thW>obt0$F2NI%bp)FRqzA3jE7@&1&3H^qI&ZuyT>@`t!n&2cnU^qbcEUs z1Mm%!6e_U<)UYcfBzd;Ilh_cx^JPg-2d5LOUY2yxU%D0~$!^@(1M+3bV+eP0I@!kZ ztk>Q5sg`!XB14uXi}eyjzAV{0yfmSg{GBDd3~KF&M!3*DFn zB6$?g8gyY1(ektB4&^^455(>MPAEZJ&SsZ|8>J%T z^2*KZOPjH^J3mahhe+qMl552vsm*k7?|`4MLD$YE#)(1J(?(?LEK&h_yX#c#aba`q zWN|vJbMFybdkZ%8=5OhB%I>wx-LnDD{9?~%SvB@P4rvz)cs(X#xo z-h|XdF5Eny-4htjaG9r0Y!3@(H_mNUnNSSG^c-H2WmU(NQ zFAK#SYoTv^*BD#HJaW>6l4>V4X8HWd^fU(V7K7#@dNU!9h(FSE5^_J2@_fhEI@o7s zF}|)hSDW6c1tZ&aG$Nh}_TYen?HQ`GSdNFZRNu%i>ht6Cl%}V}SoDDQ^WE>QnD=Rb+^?t;b?R~S?(N| zEDi03!_grh8&xB=ZCKMjqr!F2temH%QJM%!NG2wOmMm zJc0`ekVkXbUD*Jw;t^V9wTcDGk!%%vC`YnY?72T{qgJuk{@E#UO?YoimAp2c8k_Ae zBDhN@p$9x`Cm?CaM>8#=7cu^7Z8@|eMfrD{;W(ls54!xaoYM%dC8LhrG@Q+vTKs#W zj(yZiSh?i*rftStw9Odz>pWCE-&9YIOW`4{MXaazHiX;qA>0prA&^kGN5z#qmp!9~lR2|auE8n)LFH0CzTF1+B#Gc+1pK7XU{Rq?Y&)LaZc zxEG78M977GIMQ&uy2&!4l^<5o5}>s;9`{k1xU?=!5S)(1#v8( z^j6FJfEyK@Czhk(12P^>{#`hj%qlu|Y2Fw{%fn7n_& z5AuW+`zNnN@3G={q$;xy4u9BzfAl_175R#hzA74xr$tG_qdJYuaw-;bfzb;t1eg~^ z+KopyPv;(M_&uS)q>JQnjB$})Y}W|W?fF=NKFzOYc_7vkMuV%J`Ls$rT|8YiUBauy zWcrN3!~#^R69V;t_!y@~2n<2i7!pYH&$HlhIUY6f#8YA3SWakZ%# zdhjJBBs)HY^SSCH{OXIuRHvo~FMk~dqn#7-*Psml40nH+LV3yJ{6y#J?`LFlrp9r0 zG`t+O#~%-wvH|45}(8!7|Brf+xTbGsE zS|RtwY+Vk<*}=umuzqlNXziaM@mKB%(h+hx2S2I=$Yq2MxTpXCmxO*WAogxe?B7yu zA)m-&Pzn#9*y3q2WhGGXtN`V*0_eFM0K6zlA{OMHLFAHS>;n#YOP+)3X;8SjAb*}^ zkK0VRu0e*H`hKxEOTx38$aN-aH9O6TQ_P@IQ0S+~Pu~J3b1jChJM9=Y0n$8Mm7R{F zdj#g>Axs;I6YLnLC;at+;2=Lm3#|>NiN;~JXbNL|yNx&_|J{`QK4ga-Mpy#|#DnnC z-VnD%+0j`77VL13e$obxjEWjy-9(1u2#Q})g-lO$mGnPCKr1U-w%X2H`;^-RY4J5e zU2C4iYG26(^Wgw42%Z&ONEBTjCEc)Rrar852;}NS`kFHt?IcMDi%Qa^st2NKn$!bP z8BMJBMO^4tnJ_@Vl#9CO0!%BoFftMcHKdhXfOi!aOqzou>*4KSxEP$*&CEuo@?ImM z9*-RpCdb_aI~ezdDybZz-S_AfrO=avy-S)sq|l2jPSQf-ur4SlQ4(k#-Mosmg_wkm z>&6y$lEl!`U@~(s<6>mWmUCE!X6I<;*jS2$AnJ@Eg=6IdIFxD}y;-WnfOmHPmNvJH zZs`plDt%7Q0$NHOk_8bhozHD@&ApftkgT%e8dw>=8z>g^^}Kv!QeV;w8oO1g&Q$e9 zWJgqf!XXwX3Gtx1h6lk{@r0AQl|_V)v2GITs{2g`XAP|u;xT6%pv0$TdRiR7TGPyT z2ua)S125L{+qCow{66?VvdRa-$G9sb8p8ahoRbToa;2$YrlIa^vJF~#3#Yw@?Grl?p38JsGX zfn8H@!IGJhYko&IbYU z);!_7Gf^{}LUbrZc8E!-n*D>ckXIJr;>#d=#DB1bi-Z`t3}F$I025>pE1UaSX=(nB zhS^##Hbe%R98`!F|H?AqUFV`H76lNRwAA4}L>J{}rVK_X~YW7#K0^pX0=9DWFAI{P?t5uP6kaJy^R!IkI#Z`SF@OO zsXLV4(XhR#WMoZaZJO;}IlijtIT(VVxtmf3?Cr<|SCvs)AmTOplG+RQ3Xv3cC#EdY zdALkbg|#C`ngRI(100wjOtt)7jvC?S@uB6ok%5vzSv24=#sp!Yiq)2b5xxP|%3wa> zxHHrx`I~URIohgx%(`Qvhl+byO;AWE@-m0jz@&1}hsC&eX*nPwT@Y*ryql&o;>m3VuIT*j zBJL1uGUApo+yKl@+w}K!pfCNjVbb>G&}pF_0;NF=F^FWA&h28%7tSH(WXO#{c^j#L z+ve?lm^`S2yNUTWn5rFI%uZhedT%+#i<@*ld?Dnt$&u4E{lX+z;Hj0t7@tvkL1PQ^6Kq+V+Y|o9dD=NUu@(F%I7|bM6w2tC*^e7~_ zup$P(J7kl@gr9`)X1d{GG_!mh;$-y;Q}Iy--)LY(Pn)7lMAu<9!TT$~&n6@h*= zChT>ZU#LSzFh$t56(RUv^E7Y*pF9m%-10P_mjB5el zNR^5Buy-7w8b;!fEyZl?+8I_XQF^b^EGIi;P6(md#Epsz-$!tM``Vi z2E{7f8%a-8Per^4G@>C;t9;Yaoo~CKR{LCuGqrSwf_M`}?deQvMs=bW^@i304PdD- zD&)Gg2j^bbn|%hwcxRuEh~Od9r`L6odzC_#J_olU(q zYmdf`Ky^x&FC*w^O%0~*ljTM_Huk-hOr~Q_fpT5q+1c_N@+NaS!vcR%dKZR~#-auX zg4C|G5OEu0uQWfISYgnU2mrkjR0SNR7XS{Z+ePP$)3>mlk%i^1GToNSg1*LJi}oGayatM4(X&;=l)X2#cY*U zu%iiNLs8?iT6kBLJAX8d`~T0)35ydZPM0-k!J5s5YiZ09%RP=~vj&#OJ()&xoCPZJ zMuaDVf$NbAxE5|n_PF4M#epgHL9 zA*5l$M#gp=Oy$)IeggWu#RZ`)Qx}nX7;YQF^TsoqcNg zBl58~k{lE5GL?S;bGW{quAC1;bz^Z!xbqfBCMqv1f@VUN-qk9y5+KGBmIVB;_Xk1M zc(QD@9#LgZ>#?P_>3d7J)mp_McBJcjfOCX}H4%`lb;}YWnF00)utq7b> zleaqel`DW5LoWmtpPm9Bg);aMW)416pBH&&-im3LE3mioK?OzWUiFD zWppSqVX%10OSS9YG z*!1?pUQk7$8TV|zRAQ5{wKXQ}1zfXqgrs!q)fA_VPR;LuJbTcFsBr-s!S=z zX;8`!YB5bsuE0>bB+o{t24Pm#=@k#8cn7PvlWw486DizE@3s_f9fHQ|%aP7p6#wL+ z_$QZLAkj*B;DAScjQWacX}_{&(#*O#i6vB~jCW>;gC|H@?9F5|q8zc`6S9g2B}nvgn!=e-O!e#M{W~d~!DbjBY20HLapl^Q@EKtK7lB zI*I^+46>afzgg$DXL>#kZ$Vz!Lw7r?qT7rKAl{j-cPq^+qej6l4S-!7<#IH+S71*S z7co;hs>Ptv6$2l9Tvs&KEi zk?aQZ>hBa}SuzeKa_ItwC96vgJGt{Zc#qTozCSfZUNZGk8rB74#GsM0bQndg&jr0| z|4ujj(wEN4<4P3Nrj|ps)a3lOtn9H3sJ#EtPp5BIh^In>p_z5%Iq5nj2;%E{MS0)- zoXpWPv@f$0;2DEC+yi~M0w2zQ zTUD;&7>;`G?~=yAFS;EcS7jp;RiIitK#3*L+p+;;wrVU`6+jBA-16_6AZepbAh5nk z5dQB@Eg(SMN>x8a>+Rjbg{(a8*~RRmdjwx+*Py5jEx#ADpTkS;V6AnzZB>yyu8kN$ zpId2v1BK1y0fu4usQD(JHB!LD2h_8v1qB(D5YmtYEr}9zcAOOzp-hh*17v9ry=<$< z$Qbbq0UO4#x?`TuQ{#WCXqeD=7Cbf#jTTnT@xFexlJqr z(Wp&LR7%*rIuhxsRDwVhtxbNQ?DPQF$Z4Cl&@At4?Y^g?k`J}RlC{U9TbHON>&5K#&vuAS9k-De|q2;F5o zOPWL2#bI2n#kH!WCNQ+4fk(<5^{h0nBKGh~e>7HyEE4-;xhNyWa`6W(q(M+`5T9z1G6`xD@plOk7g!|CA95fHzw=BQ_ zEN+%)Hd)Y_hY})Hb_KH;XSB$io#_g)!UGj&la5dHpLjbe!ly-_O2eMzr2~otsg#}g zFg)KlVi3*Ebi_Dw?iScF%|_g5=M9YXIldlp+h+{SGeDgCQ(axcwZsl|g|L{C0f@0T zfz`x?VmePJ6UFdrR#q$jpURSTZWcTBSsqF(HgVzGvIIg_-tIoE7R=B> zw&1cjWvua}-<&!~s#Ty&RNUirQAy=?v44A=fiw4=7NRXk+bseO@9 z<`E%=Nl>KEj>So1d&(R!C<0Fj_e0|ywO3&up7dP-P|AHih`~C0>;rLz)+j1pi8kj) zo#zCC!N_I{v9)*VCRD5Z%2#ocX^X{_%v9|UU8H;;RHaa$8BHQ@HVP`Ek>sz=ij+JA z=VWC9;sj7$AR;`(`35Tg{9zitZbb4#$=x82jSO}{5XZnO;&B|h#~9+T4IjfJojr3X zOZbD$6e*&X(@qh10F>OHHYmc`w`j%1e11Lz;KUO3beI~1EpzPFTq_DnwG^f^2!hD5 zlHul!(|okTEJBEE`}koCA_#K{mj}U&2(ht9`eXMhZ=5Oh<&Aw@iU8zwDMTKbEAr*2 zse{NR@GgAH6IA|LGxloCcWAZX{313{$uqvxWIs^F^o3hFIi})}hd~i8+aZO4sOHVt z)anWkF!?45c46|Pq0Z35N^cq+9389k;42};)67}cAX^i$UXTM7)=O--MzV+y9#Y=s zOAnW~%O~wk1qxvfVq^WfHO$__cKA3;^&=3A^NyKQrRkqhGIE-t&AWi?x=b@7c9t9% ztGgqWf*XM}mF;F6=+vdSCCKCKQ4^+=>N2Exs^^T7lgEYshSKbFHzQ(};k>hRH=*CS z#|cB+tr>_`jDy}|B4xh7MCVaDsOHpx=4NRtTiYSB#iH~lLN@J=%4s}HiyI?6G`s^E z8M?&vL)Z^RTqRfI2pD#K?JX3u@NCIjLxva{U{q_FTt^x3Jv8Pr8(T@o6$DO4K4@DX z6d1}|GQ7aDM1|Q3R!iu>u~JTg9vEezIEelm;xiZrv{L!1W%5-uQq4ykr4fLd$yeZ& zXYD}dNW)s0DlR>nWM=R`o4gDwRgIzoFA;bPrvXp8D6pVca8|kBmgdhf8`h4(Y?ZgA z)s-tjnY9s_8Bqa5`25czpHwD!NSy6Y=Q|oXRET@THp)6vqi;ADSWe4p(@uJ zIMGv=lc?8(9nxy9JfB2y<(RYyj_W|wfOJ*s0U+NI^Prwz+>d5^0E{#ZQb$N7hf|&1ejBabZ=8*ND*fM!szfot z?5_$O<#|tO!=GFk&xl{PM?4(Mk=ctJU~!GHM=?-@`a%ls;PtdDbWt9Z$P$0~*juux zV{0r5g{UrS*w($eC^L$SQTBsRuFMDoDNM@24o4vgA!*UJSqkNwKb7X^HK^Jtw%ol6 z0YQ-RktXF;_qAB)BLKI`v4#RGw{xe5v&-Cq%IRf*lDQ$o@$eQ|5D*z$BKs*@zkWAO ziPT0(%^EiqQfNm$351oWi*eCvi;GHXa@hroU=|4(cvz)6hO<>I;Y>peF#%PnLP*5h zFo)blb#a)=P^W?=T)Zq{mAb(WMB{VP%cy0>UlS0x+9hR%a%!2OF68X-NU915Nfw)pM-8fkM z*R~Su0%bScM0ctz!vlB|@a1XkIITAUxpgVKtmI3Q5ogrow2Jmq9=>oHeLX`MB4OoF zdjsn#72+x>8|ZYk7=UJ@sfGtg-*s?6w;b6Zk5FjY={M<1vbVstm=KC3Mbv1vv4|Q& z0suF=#B3|&-Dw4;8?W+LP}CMi{2qcN8nI!At`E-iz}*psV9Vw|tCHwzg|RG|V+-~| z1CQtdBU9I(juIc3P~j_JULJfk9wPExL06|mAPT@q&?uOLceZ?2fbbvB4rXhAFhDCy zFuGr+_A}K0tzI(d%zZQnACO}Ti1>WwW2$*@%7#EdU+Mu$#QpZ zW#LLDs&gP|vY}y-MywFt4I{mE>F^ZB))BM4@a=nbT23ER?%{?6P#%(iA*Q!lsvyX4z-xY2^_t z+U=Z^^M6_I;lgaH;rZYui>c*ZFjZmWU~3+6c=|1q!`LQ) zEK6H3O3^~C_@ksRa;P|l)er~PV?IlKa#dSex1;6pZMPE?E_ni9n?@V2B{`@>CNuE08={`^xLGBac)Z`#uZbZ|Hl#%}dOuOY3g#);M>W1>3AEnCEwDCO* z{*LSybDBPuPG#Q*9q2>waTfSkl$F0n3L#96jkJGS{x85j$Y@2$>rD88$rTWdV)PSy zJ?l@cgVHzZ#+jRK#~yhf`V9tuj;^$5 zeZM#oQM7Z&pHVn0u!&+Ytnf+x80ux^-Kh$9X(6Rg0GiOOeGI0oR#}p8?g9X*!N3dm z5r#l6zA|fYM+yVm3p=p)cSvmVlU-Sz+`+v&bT1QD4&)!5y+?=4>Hnl!FA^}^oXBpF z(AiIy1O{)d3i`Roo{;8i`xZIjmvVxdS9(g%Q_T>_igMn`JszJ?G30WU4qUE-9K|dV;Q!~>Gyb3V5K#aBzkZAu z`oSUydt-W4`quQ#>EVYR`j-dp`-wDd4K3_Feq!$>kA1>LssBAcJvTki{+^wlmA>Nd zU;gq_Uv~0KU-FWdJmxVkdCu|AK6df4N86v`nMWVBcI6ZIXMfo6jFDOGPG|O(jB+e|_SMU-W-Yc;O44Kl;4C zdhWB1JLVZre|mDn5o-=vePep?(6MQ< zB>3iCAvvC1ALYVY-m|O%rY(xMvo)( z+Q1$(C`N!8Z1%pAaNo$V27+lb_DQp8?V4Hilbu@L@q0VANwo`SSz>6^#$h2aZP+au)+(i~*%s9BQZ)_>g zK+;>mC0l3&%pxV%w%h+yO{pjW_-v{p5bh0v)N^z*JLP;HZs>2in887a#sKXPKWJ<2 zD5_cu&Z18Ywq}z`>a92Vp$Ba;xRD}&A(r{^{w7N*;j4I+lgpA;@|0H6{@{bQ8`4W- zyTP;cF>5z^HfMN)X?~ajQ$xjkg4ejO3jt9%<6@i?cA8}Ij_JQum<$f38qg9_Cu8DW zkh*5n-ATj6{2U`@sD$g}C9WTr11jx&Sk^OfQW*$}j1IHtEH`gUD0IMa>4kFgaSEAKE!>|H!tehE)& zl?gc=VRg(`QjtRNa9wZsjZw3#JZpP6m0bX9Wx`dKZ&u7#(oH5-YPYvO=uCP^<*KLI zj>(VqQHVikryk3awoYhUSZ#AT6Wmh>zh_j$j;!_FMo5OemWZFN%${}x8EG(mUJ!X0 z|9&Wl%*cY|v}RQqjpiuYhNOk*NQAKSC`|eHX(-L;w)o0f#i-2Of09UP!qb zaVVzz;eOf`li>*uD3vd4kZ!#;GSR90&fzlDMFwrIU_u?^;rtGfXQ*P_k5uxys0CyK zrdZ5&D9NkEPTf|i7#X^_{LDMD4dpgCO@&7C_WLXFYU_gO0-QF>uNp3x&X&4>;U$wbORQK!!Q>CsR3iAd zCDXxgb&=uL3oLS;Z3#kqxN1za=B_m6E5p}A{KSo46Y`e21KD5g~dyQo^w|O%K zbh21y`GYm!V29cY{JdcrSvcR>-eI5b=x5Lc+u4B^6J!`62Jk9rn^Wt^2LWx;VvhNw zlT?sv$k*_N(U$lBsvh0VRE-?VB5?&OM`Sii6zK0p03@ z?7Vj>+Ikse(_P#@)85)%p|!>N#c9d;6O!ZCg_hof(bSfKR%!AD_B0E>{M*vyM3?mZ z2Mk3qrpTf4Y3Ds@gXj`z?S+VlGQ*vqy;1cT_sd>cut0q_@4Oe&aar;LjAZC=(Ak9i zzD@QCS1PpH5TVkAz_Y0|4^WBC=S4jhHlTuugP%)QWwd5+xJXqLi`8cm-=kF=XiRO9F*?2eI8{LTMJPjj1(s0#*kss**T^rE)E?=o4U`ETi8*p+i z=wU52b@HR^)!k6pNq&|P{U~pNiGda?1*Ek^)`m?2<&2UT3gKaH>IUd}w726@@X-yl zSR1A`R@d~R(UhleKq6?YJYoxKz|0;1%)*-Avj(%+B{1R6elWYK;wFUyo0ZA4&?G0{f24V zxd`EOpl4b(y6AP(|F*l(dD%vsP@N)|Ib$0WJIMC}Fh+X0F74j99Ey9IR;1`k__e(* zLa7@9lyZ$cw_7o)mgbaaY$)c)Tsxf5guO+PI1CnVfMcTg!u`Sk**wJYBzmpmMhA6z zWpqGeO>xq8g6$LbHjs*<4TCvD>kV&!1AB8iS0bqjj{ai*U)p&~MA%~tVR`;8t=%5u z$hyXm6`xq-DD@{6HJ^xtOT+3za^lUHW9GbRUs*vc14n7sS?6kD-6pr1u*X{KoVzG_ z^;mCxOJFP*nOSANYVp#Oq~>^&T8{RlAdO{%<^%i2@0i9idmEfKd;WVuG*jVIb~tA1*NB4@`Us4weKJ|WHDInuuB0iGLo zfcrcLfIH#fy1bfjSl?agK!(=B#JM^Uqb-4;aTc#Z=IrgSYnhN=EjHTQn|N2%gvIa0 z9&b(Cw9};Oc5l>XYM$tNKpoA|z3~muGl=SdwmG&;E#~R6dwzq{C%_80r+xjfh8DA8p8X`2^cOJ`%FiZiFqa{(aoR%O zgyzN7g`D3M`Yyl8QU_rx4jwO;3OYVztd3k6K^u#0a!q`@>Sj$L8wnXz)c!5aRJrZM z4Ycx^1sgW@=yD^NqyWqzy`0M499a@Kx zFXP^pLI4DAa6n2`f!<;_-lI5ylomUc`B@P9QHi3m*-T@;&Y2WrW4HL@JVI0YZO*!& zila1GW_TUvr@4;TWscXY`({Z;^cjqyyy36`Mck{olq`4WWl<9A%(@0 z*)wdEgLS`bBD)X-P znXW6~S?&*Evn=-~-Wq^;Lmx0^B!hjyRoPbiR`2fX@4lr{z|qDI;KSQ*fP_N4K?cy| zrq{SblzzgfS@fOMO`%sl>`bLyP>q~8VZjoT2R7(@S=$9l&Hl3W3Mx_NB1|D@%5?py44Q97EEcN~{nkl2dct*a5B-pKUYoYz!3ThTb*Y!$MOw`ebH*m zKgf42_qZIv#XQ-gM2p&|*`jd~Y(k4II-AmwhESO*Hm95bs<9|`1zj?oD8#l<$t*tE zaMH=&A*=Jrj+QG;&s5GE7Rq!RP!DOY2SXhT{IqAp+Z3cpg!orOwc$yIx5!mAn1SHC zBkg~TzfCha`&E;(pF`0givgF@{sHE<3+Da(={NMlELb2HfdY>Qh^$v%sx$(k5+#y9 z46Ij&MH`XDhAz9HB0+OYVVyQn-AR>Pb$QBxqE^Jl_!Zh@-sxmV>SPKx;eptWg>Yn- z&jTSy3$~p=VC_zlAtKitU;`d2KW33Ng#!=pQD0`Gj^m?Q9Ad-4Ar`HPr|4zGg(Xr^ z+I@yf3p}Oyethyk?*`d@NO@rOfZ_1LyEtgNE)Mb*E)5`tIj|6vq~l$mW4{R|p?s(^ z5z8A4X%|3XUGPX+4%S+Fg!Xp2VKUr;sfuBaXmxy^1iNTzq#+1jXhnhgAp%0GyPGeF zN#vm2DidrPgeK0$p(0W9Y}#^{-%V-zHPy6AsL;LBr_bMT{rn9!CGN zB@&>cWryQbRTaY>gwAZA+w4PQXz)X&#DN%_v|jnkRjmd+j6)OE&lXkKoNt8SvSL_< zIgi=ua%Hkx1Eu}FjI&>XH|%DxIHnpp`zE_pCeBJD%3$KGbeg&-$nA3?gZza*gf99E zf8w>_iL)c&HldKZ>>n48Ir=jVA0p6FLEaBrH{_~mooM|yvMkxFI}Tm3E+fh_p9}F8 z78A-TY}?Ph@op+gm0Txop{XF^BQ-xFC!aKoOjtF}5km_-hq({s=16Q9ttysnxnHaX z*(g^@g}<~xkH}GppPOaMU;5ZD@UaVAGVEOFoFzb5`=o{P%=>f(O5my1(r|t#lHsY| z$c259#iY`QNChZAgu^sqeOqGhC3RxKHoP}l+VVE|gtMvRCLq`r)g*5Q(p*R0?Cp#d zkJm`@PY#tghjyx=NMkX2u*_jE67FXW@XVA%fX{lPYS1zPJ{y`m-v$&LfmuDn?nP@5f_^bSf&k<$GqN zE1P%th=z`@@b|d^5I+|{Jg*P;ZrB1J#3*p3#rdz7J(>Qsf@yEAdYPqEuQ9RDwLwo8|y=zz~~$ylJyZhkMYyP z^SUmQF=yroO@YP&8Aa_D)od#Hf}E$wX3(ssv1UN|~K+-7^g z$hn4*NJ9t=+7UrPyPx+LlOoUGknzn4kQV~MSw&VbfX)F(w*2o6g2>e-CCQSKNEZ|q zC)&@%y;E=~5B}8MWS}L6H>_Y`Cn+;q4!5&aq7L$e5D?^74$sccO4GzVK5EhOiX{B% z*3~wGDu83zPX!8t?C|289EUkF5k$7Wj!e|{m1@HKrXX?4zq!_D-w zWG|(`8oI#H7rh0jl3gIEhav7bmipUpn9lAkriz`Riaf1i^8WkpepUx&Kw11^Sns@P)`t_oA z+F8cHKi1Z9&>dzez$9?{32~sXt&ecf=mXMQyfcLrZmIhbn4QxCu!1on1H?QUMn`hl zWyCKD8CvM1ozzIvMyVUPipWOx&u&u=m$BP^*-eN8(2Q}y5&%+G{!Amj@zolVuLejU zk^n5p)MH}lNGJqjF1)LjNs%{Ax=)6a4!KD?!-s(U| zsPc=~!n!p;b9Ubpf6bpnPKgx1RzDLUra;FnEz^5bbl%Q5QYpQiHP#!mYg+GWNvf+G zlIrWB&syt!y?&d1UF%uTLG3Za-w3_M^r&ytpw=DMjB;AL(j453_NW;RtXw8~_^}Uz z3b+thfY40NvIiFP3sZF}*@>S_>f5@fqbHu%9c>}Bi;*?G@hH7V*O}nPT$wnzU=urM zHhUd*M7ECPTD%2Vq)n=+`lgRdxoUtT;jIHShstk;@txH-UAG0)`E=b@KNF^_)!FPE zNq;pfeyi%kS@B!-do}Lx=@A2ki94^Xmzh&#OvT^-VvSCYER196{p zImnYr3)0yfE?Pwxyt5| zBl<=i8`eggu)>orvdkbdQwO<&l|vhC{M)X!?X=euDr|n&J4YZx0v!k;bu##F4GB{f z^|t`2Uj1Gee|}9?ey@H!QUsaCDzmc_^*gvuFm^!#4|iT2aCt|-LE)K;sb?XC>9x-uNtV#9_l%C1m&XM7#zfr9Q(n$?|EBXP`Pa{cqBlnc2C z0n1zrG4(QChuW{gj?p$8L|#C-)98-^mRM$_;_e?!X}qFQb8hT_!l5QEQvFzdBC0{k zl6N)j4dX%Ksk#u2!fhA=OF~^G0l31~FsbB~MgZ*!>Vzy-JR4ZJ?IAPA=VPH;w1O^& z^KGND959vfw`v_ku9Y3IC-F7P18SK#7;w(ls7ESv{y2_y)JOZ{=4iEe!kAHp&VYw6 z6L%_*$z?^D|DSkMnTY!*p&8Lv`1vmXSdFe4Y^d6yZlSt=sH_b`u8|!A zJ1Hl0zUM4eM!l;cB5DEg(>Saw|9Xo_{AuX!^d=?#EIedO!Jjps@O6y_uI;?g1v8<@ z`{O`%y+pA+KU$&?sz|kLUT#K9ex=Ve7Kgow;gMosGXse>w_}^HX0ePi(?qr8aJFpo zOQm}+ZRp;g2ZWUu?M!e}$rJYT0HiTgl(3!{Ut&VmVc5GPvTgBJEXcn<% z^4X=&>CxD-$$mwjE>qAg^R}rIqv^#FM}=x@r3!TaTOV@%tvNAK z^s80DfQS)D70>-Lpdw0`UrztBCHvje;%$KWO-n$*JC0%yoZ$@=k8nIS8vsRAZ9e0l zvho2qVq&*Z@cz4Zi{*sIvZc|#Pw5yxveB%gG6vxL!T%3$M>L55|Breu{Z-HuRzQE> zesyH-K`Tu*8g96>{0z1^@DwbT)Ap$k`8X-P_2Vy(k0Wxyu4!`OSkN>Cn7=t|zuZ=) z)%r|f0cN*sk#T@gLLSG)(1O7%H6zc1;k)uY-~}5OnqTIo!*U!GvLKk&a*^sdW%)-* z#wmuMPDC2?ABvY8fjf{%^(#YJdHolM^3~<90>)kysK3N=ZvR6Z3v-%vUKV8LJ&tO) zig4(aQg!!)mtW~D9EFoeZ6yCiOmP3t@E(XoMCTt7|NdvyZB)k2{9!n2EAsrczwF1o z{d&5$B`7^Ueh+`T$5{sZ{_nc)D}Hao`0vp9tKDvnrtxq6!QD-%{k8&- zIiDL?+Z64}@|7FP8Jd)AWh6b2_yTNS1l@tj3nbRD8OYX{u~Ak7U-6KTjrXVT{ptRf zojrNx&^fqC7=z`QlJ6;}qU*Q4q9vm9TP*Tx9`|HTmvV6mgb+p4wz%#RT~1;VM^Ezz zw2c=m!d8(K)Yu*NKR%wZVnO*qrJ&@0l0N^RFfe0-dSJ-Dl~L^$bKwcL9G(hy(th5X zOA<4Xb@$+jGA()qY5fa&N_dq|fC6gL@_RV!3U#)Mad{Yzc8~|ifk($}R~#}$MsU=b z_d2)@A$xBC^)zv;9%Ics7X~2=I?mYuy=9ZhanQaS6Js_@JVB7{E;Zy=-P%tKSoqjS0=Xl$I$9OM!JD!wFfP(*x^>~8bBa+=fX5& zOOxlyG**yt6?nn5i&&%kNCs%JOs-uuLm}k_P?`b3^j^hjo@5sun0$!rzhXD-sT^$Eno>?Jlvu{9^ zM7Wln{GqAM64v+;UM+M*XaWoUBbgz_L=iYIZalL*vu^6s?EiQpd0N4H!~;M-pNWyc0f=p65rkOhBc=0BPRTFwc*)~lgnX8D@%V1B0_ zc}???3UiQwbHzUC{PK^MYRXthyPR)e(#pBs${zXGwQf2$v|{U~s+HAD=GpG<(;PbrkG{1JVJTEluOQDVmrXc-O$}pFy^C_pW@C*XIOzBW? zLl##J)0$8NukT(^q)C#%#ahQ@GjaA0Ln7;K$Jtz@v&`S@a9cW9UFp9PF9VC)( zphy6dSUW#}R&$iE4nWTZ{a(E3^+RdiOz#>H0Xn*G81T zB`aTB!|D+3DVg6c?BZKy8RA9$##m1J&sm#V>_{*?CL$6stMG7$TG zUFbcAXI~fEdxf|qR@9V@(r`u+^K`Q5jiQ`PS@D5HX&qTbC!FeCZaT!~m&!FLeH}t{ zFzlpiX`?bM7EdP6X2uGLV66NFrLbD43EG&0n&a7|yzXahYjhK-i#gtKbIBFO@Kic@t)5gZ z@}GP!DZlwEmew@6V809tcoy05wG_PAaYixvA0`ky8~HB|SPKU4@z|1jdyNFKHu*Q^ zp5bv+nn5slWJK^Q2eERA_rfN`{07ndC7}JZhpR`Y+z(4WRNE4 zlDH$#lKd|}jHf6GqAmA!FJ?Qw#rq?9$Ajr_Y4#U|r-`q>t35AvhQRGGqr$11PuX7~ zm>|;RAE~7CTfK4F0Gz&8?44gBDtT+@;_oZ`NP6g>L_^v+6+Qy$ogmGl$DU`QfmUgz zq(ZX^q;oX$NG507IgjL|6<7)}>-?%PFP;m2RW-1{B$;ogc2}MfGOQw^bfxubS&<-3 zQdDy_AUwFuh8g;WxPK{35PinWY}Y&FZEhLVku2Zlu(XIpy=@Q>3#tm6Di;YR&CzQS zY8D;ys7rNVayRL9T0rt+UyjJzy;;z!VwP_oY`K9x3v%3L#hP88`2Ye5zeDZlAc8Ev zc_vfzj>Z&0pja1LtGbiFnVt#3UL8RQ1ax)dRVRebk)fA&hDXio@XqkusiJ~NXoiY= z}vHqxJ(H;s^Moja@GfXZRCbUotN+a2_+KQQxesw&l_G9<;2keo=fH0VVLd3DW$MA z&>4{2=%Myos{~*;DmCQRWe=8H7g~n2<;X@L$kJ+;3rjaH7W78d>Cig#7{6xC9J}{8 zA{mh0Qj*Nd+72!VgPgZSo;q#s z{b5*mmo2mK{b6W-*U#Hwn~`P2T2dY%Fz-7ZI%9H^a$ph4C$F;yaCk*=r)OA)lX`dKh@#M@XK+EaYpOuZ#d&x^sd z^6pl}U;kPU$6sI6{_6-V_Hs|P&E*pZFyB*bk6OOo<{=)n+xSW~XW>Ebc}XZPc5h2h zCEj7YxvItpFHT7uy*5s7NF2R3Oz*m;@Jwv~5*Tb-=cfI%bBQ}6a_Zk?2~sp8LJyI4z;O|#F%*qm`8OpCXs1NNa(=Kq#&C7 zC`21LqHv9hj*PWm%)nI{!+pJ1%iG6H_e+7e6%HYxt+guamaU>Y+@(!nL9avQ%ys3+ zO9en1J;Clqn1u0?BCC5Ojgr;8t~ajX>aeU{T5pKE&POe6bR62~x-jII3ZbK6z*Y(6 zBz-|VZVhP45gc2qr^Az3d1+zU<|PKiB3BLw5FHSz?2~c)-CR&$hOIUdo!pgJvTQkD z5dJLsEOAF`T>CUnM_Ssa6Qrc<6Gu%i^-m{x)1Z@s^;U3C)1bxrs1FtQj3vj4u?k|R z+RtOkQ@hx#AQTx@Xn0HZj>9md?USxz-dJs{WM`;w%PyHJ#284^ikpPD5*k#>0yXsv z#+_)!AwEL(6LKPO(>|^BpZRi<10GxfT}e3i1li?3lcv-iu6=gVv# zl)Qu|@RfQ3IE6IkL@1s|gCk1#_0$m?r{E7{LI@B~mQ6s?dxZR0_8BJKFFUz-gzp)B zk+C|{{ZBsKYytT(z-V3jPhryk)-9ejVf1iCPE5o_Uo;ph(hV}3#YcmBY5s%WJSW)5 z9{*s~G}I@)EK~C#zc}>aQkl%Eo(@x1K?IefYAAB`Z$eQMIEQo@ZTYH|C=`su;y$xC zh2Q3s^VShgnu8^ypcXQVgSYd`M^M^hJYKmNAS7raBxzIF!xGdI1&o~B)L*c(<#8)70|dF5 zNR17vX6bEW&b6boo}(4P2#H^8V`pgi-VO?BE<#2@DYS)plv=Y(hDlol3#phzW0Y?` zvqPri9f|xUg)98ydZQY*MrQ}8Qk8%@7@Ze$i{q%Q1{rVLugWsd*`SP;d6AujJ;v<$ zbks9uQ!W|v;XoC|lKip}zKIYH>73*QcS7}^REwCqSBc2R-a0UY3?AtXGiV7#+wg-> zWNyu4iGWm=0~0I(qNm2n7Nzd+2#!!>Z-~lN0G0{lzaE?P;dhM9u%!q78e&HT#Kk9k1#9H2Ftr=3J^~TM6anhdI9qon zRd&@mL#$Z|2r0o@`|e>slB)TzoWT4nIUW9})a$!sq;C7jR}b31b&sBGlftDddSkn; zwzOq6P3Tc`9lcmk? ziX_-&r&E>E{0EAn+|Zn!zNN=zTgV+sxP+N|=5??d6YgMyF&PP0lKfqx2;N0`0TvPde3Z*+*Y50KyT zOGe5Y1Jur})+m#3d$sd4gJGriWfYAT`4oKMGp6-E?y`g^_NkWWsZyCxvuE{bg#>tt|*eg*aELkSZ3OmtEwt##b4EeT{D>4(!%iQyZ+#5=Q zkH+CA!_<_Y{}gg1e`i{LG7L1R!8k#&i&g9MBYlqg8~Rji=x!X!i5mJ;jj_NtBgJf4 za5RNd4*NXLIJ=A3RcxZr=xg^=(K)g=BHgm1MS>O8f7>`h;pK)_w4F!i4@robEhMYU z%)}npP>^skDIO#9b3sofqV(n&E}JEH361BgH+IJ>HW-KSc4MAa_w>n!=f~U5EN}AR zF##p~oPRIljs(jgo%JRgn5@ue7^|WE4pH0=yy@eix#$!8v^OUca$LJz{0|3q$|L&e z&~jz`y9Q$u(fLE<88~}Bh5(~RM4rJCm#P2kZBj}}i{^jsn?|E0BNz<50HLNqE2*MP zyJTp1!M2tM9E5iyMtUgAM@6-=P77ABVhK>9sw9wI#53Dk>tMxT!}m#LdZg$`ek*Uu zu_C<6L{*X{bh%CV-3CC+u(PCqLgswN2Qgg!R|Zx}6h#a2IX9e@mja zQnrr8)%Z=FrVwMQ~d?+ovy6pZ%CZ~LItfuQQ_i?q2K66 z|6&7Nf2d=&1Eb&JkLozq9W{s=dKu;noh#q+K&%f#rk0Ff3XK4Ll7CtV`ci1?MA@ts zU11U|*Y)`sAIv4E%X|@EqE8ADUu-6qZlvV_=mreVQ6-0462C05O!*mj13kMHS;&ip zQsv!U$#}l(prGCITQk1-e4ZF-CS+I00A{V!etu-|2O11K0yx75QsceuQz z9$uKNf$=@>p~fe}JkZ!zr;P8bq4^h83l9){YlI+GPW-LaBhv%$R{;R@m3v~U?!H#H z^E$0^z7|^gKk6(xM=jLz-1ZBb!%z+b(Eyxw9N@^&k+Yg+&mSkap8 zP8lD>l0CqJk)-d&Y8nUD8w0ifmJ_vvTBNHbp+&DEjB6yOw||S4-V+4()w*-F^j8@8 zH^Kp~ zO^TX+v)R0X0rS%o$N4Y>BH#LWSB9N3VC6wxw^@tjCoi5s+VO1_qKSBwj7M=wWE0PQ ztLmAv(Y{r6s9)*Kaa7zl2wnCh;%f%@ZOev~)sJ+Ic}cQZCL-T%9Li zLLQi??gwaK^0@T^v=uXT7qnvZ*hB4ah<%fb>WDM4xVy!qwOD`ZXFbe%^KR*P3!hoV z?0U=Ix8ulKN})!v8&1C+0DWPTJ@8-Hqv{=1%zth#=sA$4DCA^G200G@QRyvgLctW-Hm!d7g;!$&AWf_s@<} z20!8nHl=c-O8dZeizKU;B?)HiG*o+scgcL@*N>EURNV=6oo6`$O$6Ek8a+l{TP0$? zUm*bo`os|Mem^wu{N`jE5kIS@%UDamWMQqJaW&hTT4KV;E28BGRW~HZST{ci-8`?+ z4FXko_8nbGk$8Ngx7hrar)fX@gc$t@Q`^;sVg(-LzGpQ~cmp34)Q`Y7kdLd#z$hO) zg5R11eprF!B=Exk)L#jx%5tzsl&0RcuK9k4n^Ig!&_`0T6XT6mN`bB_`e;+)GN8gX zM^Zr$pn@dBIe-@#$tn-w^23=@2Ckmtk_kC+r$JW!@weImac4CpVK%h`!eu&-{>TTx zVm40UkEX$`_AN0f%{AqZ{Y5-*CO$bTXQ=$~bgzbR{FKN)TzLc1ML+?^PXaRYm+_I& zu;zNcNw#W}46e;-7S~#f0~yONC4c6U&pWc-h)5kHMlD6Wh#$Sn0rI*lbPaJ`+~SBR z@BM|=JCOafhU}+(zj=f3V5>7k5@M|;`v&&2`t_fM*I$5_PUzg8t!sosf9?;?QC+s^+wS!Er5bib%x2fC;&Z4D+P!66*L^}mJA9oPR>H4v!amo;p^Z2l%^cG#^8w(&%< zZeb;Y!i+8?m;o0O0JmDJ5T7Cd<>{=K0|~1ftZJ1yLJA)Hh1>>n!u$8oC1f<>3Bdmz zdah+yMT655(0}v|>OaEk&x-`~t9nqs>iaDc5T-%EKdaqvd=h1K6^d$gp5xM2-k4+Y zAYmf9B9VzmphBtICh@zr>E2{M?IQPa9%F+S6rr61^OBE7Y(?ogphcp2zhqHV0vxS17NKPbhL)q1AiKKylnMcwAFlSlK{O?YZme7wyMgmHUT zc^u56#b)Vf!T*;xmVsAxm*p3!x&LZ57a#nMKbYpPZI!>N9tgyNP+SLI*F*yk2=db&lIEq)&Ctkvg&;Q9lCl>L!G(`d}h0{Eu^h6E9hK3 zn1P>kW37STdV6_(p{$nQhW3u{Yp?UHB43tF^<+S6p)vbI+4IG`FmE zTZc-|xGzL%7)isgcc6fZ>`;Ayd^+n8L%rd;VHgqd3Nfo;IjNAdv0;R|HZ+!_>&t(T zTW(Y*iqnu1sYc7Iy<{gL#G{x`An2#r-^EFVdVUv1`rIgmIQ>Y~`fmNqFkJHczF)a5 zo8b6JK^>`}_3QAnn#w2S`d!##?-uHM@j#bU;?^&jus3SBU+HT0z~@nqc>Z?xPicUj;%#Be`AIeo`D>oqSShw?D>V zY%Kp6nmFDN*V#9WB@RF=V3sw)RhIQEc{-4OXgmOKBaD$L2PQw$FGMP}{&cBlfn8rN zd+MPhw-SC-c2xL;@uC|ql!W+GfaKZzTy&gB?1r$bq|d@Z7TzCPDTne4#EJJe5z-*| z+FG&v4-3Z-=`ZYT;gqUOlj$>bvwST@5Q5CuY?c&v${iQZC_ni9B>(CV)AtxN)&jbY z3+NhFJa>M3-+r9?;RijWfET;3$Rc8u3F-4NGNLoBS88zC=}KpY?kb#=po^%V?OXwU zw%(Zo&XFjTAz7M`q!PKADGE&2LXtWmN4{fys31A?IP(zxm#!~I4p+^1IX9Oj2eUpt zFge&V1{GcBiLtfKpR@S$98LbgbtPy_4Xk-|dVWC*NkAFU?h=crE2na)g82kVIC=^O zs0&q~fdPfzmRgm#IV*@^k>WIh;j_3{N|I8MUe{ZueT=C}`Qm-0Tw8SyV~6bB-m+rx zb9h2~q!eS5{ZJYGXE{#i zVuhS(A(%}f_R*ytP#li9iedo-^T|r-Wk;~`8zz?;rmtd$Y zZ zb&dnw_%YXWD76*DPu5!QfCHylr|e9@Nzx3G>TYw2#eYdA5GJM4cr-G?OM&hwB+vBD zS;vN7a%m1=tm6vDng3X&Juv{tD^*35YBJ7oFqc}rpmUmY(e!V1j^S+qWN*jrGV&9g z)KL|XnxAj2PfD?vBPYv*$yQs>9#va$E(75WWf!%k@*$yYuS92#p~TkEv7Q|(xxm28 z_`m^wukpdOoLgTLM)RyF!Q75-Vacj_C8l76Gv|_#AzZKgLe}BtPLy40qP1x`x>L{8 z#6c;xoC#tXohtgLB-;zwjESe6tTVdf*M&q}$0|{OZh(-fA&!`zD-Jj}z{Vbgl(M66vJ|Zi0?}AYfVExB8WW-3Jz3$H`gtU(?;$%+k;7(;z!05vz^^Gel~R5l+orM z3R>x6dqe}Vz1Hz4>-HQ?*=qwPkFMz?64XWh=pHWdFA5JHRXu2P`*a4s7ysmKYK^s4 zW%d`mO$Pk!itrWfiB~lHptzX{QQV%saT9I@>R?|8Yi#w0rD1dvX!4Le7r6UvyZLadhc*v zIFekU(gj`4rIZWmVr!zz^M8@=Xn_5BNK4f2V^LS5oJXQHH@R2~dXJ41%nuw>N-hgeDX2Mq zRMFZqlEt59B*AKRUJ{TP~Ato@!>J(u)gfIZg{H0xl0>A~ih9wB8 zN&bWznB67;&2uTM1(L`Xn7Xi$`Y?OLWc6v`vK-^ViR%px9eXQB$~OeKo`b{#Ik>6J z4`?Py@z|L10jn?*3K}b*)@>e&I!A7wIkatHG4?ll>v?{8i_e1UkPh;cu5n#KDke8H zVJrtk>X!#-FssiLC0rifd1g}}?4jgJc23wCIu%NcoNqGOAI4wF2g5_Bs}qa7n>Tqk z9f9?x(8V(!3P@;Hd6TX zlbbN~qpGC;G~Yaue->%DL>8>=qF8(kvh%V2E$=PXwukxc$3|cVfsi-P7Mwwer`i`z z!<=BHV=hS|H5;F`hYuqH{ALFja?EcN9^V`QKCB6_0g5;ZHV>Br6Jk(?GqAZ9p0FS| z@=o!Sr-8RU+E1GTYEN3%R>!PqNP0wQR2q*deT##VU>}fN29+LPEjc;e)c)`}s?KQ{V*2Hd91aFViU?s)gUOf^p z5U1P9S=Y;ycZ9~>!}pE~d!WD?2Fg}vjmD6LtVY})d3%w^)6CBsr{QWfbp{0a>7njE z<<)gl`wSP0VcEq#qkK^f@-oiwbW`(AhYBI=F}Qbz#@1+R9^BTB=y;bm5!{XMYBmt( zmgwCpElsWy%P+n=yd*vDuElpZU#u~*IGUl~$@h3$nV$swo@P4{ z085x%1qn@|(i0@kqWc6YagxaIp9wdIZD4XsTLe5BgYWeY2{z=LwZ3?7=<*ODty&nv zJUpQt09f}`-R0cQQ%4pNUa-MW%3?I(Am3i}4jY-e@&42X&^a_ag;AjC2`6o6d?G7k z9(3HBh78eh=mxK=h4)2deM}3i_cbAp8-CcpBF`cFemabS-6RL4^CAqv;&S{rR-#LM zOK7Lq9*Me)c(sjBHQyep(V5Gec;18 z#p2nzaZ1>T)BcP2@F4EZ@noJ$fKX5&E&o8idhLp0J2_AfBL;L)g!&$6QPE&aW*EW2 z=Ar7C{mzhRhAD%@^%xcXhQcT5ugG-o_mQ?-1iU|tlAS&Kxcdg2QWSds)&UW6HHs<3 zKD4@#YeOR-%bcCphGw4DRBa>Xi9|M)#UnL6kF;4}ri=$y7D=CPqhMv*@nPbZ+sJ;9 zmEzfj@Kb+2;JpOF|+)D!!ugq6vm>#B{xop{{t0Nn&r+xfrT{{ z1*Hjo1241p$=Wq0=&`A@c8`#+fNvEU>3)yhTr~j3Jek%9SB31ab69rEf1H)q z1qdbs9TOO5g|bwh(L@DK&`3J@Om-;Nn7(f9Ey*v*aCwb&DR?uHogxjpJB~DN?!K_dv)w?=f4|Dfg z>;lj)#hgQXEi&QOA`RvoYO7~3Q0?uac@|MTd#Kh&1OBpqa>RVz5c5v~F$YI^BgB}@ z$E;;1*S!45u}VH`A`nFsY1cxut@RqdYNCTO^XJ6XsJ4L#VF()jW*qW7nor{JV_~P9 zWtK|JCcloZmn`Cf>4(h>8}thS*C5p2VRZ<>%UVHtvI>d}{XwU5$-$3P1h{IsC)Caj11oQUBs{F$a;5FaOkwH| zSCcjkjKD`WN=wB%TXpeH$N`dQRYf}q^IOr*{a`|BIC3O9R)RJ|Of>}Ae!$LF0F&Dw zWV=*z@R15Yk{QV8$v>Z#AE{7ik`yWRQGcpUrp-qy*bz!l3S0bvc)J^Lbag-v+7eVE zU+83xh+lZ^wGM|~ zZ*WDn%Dv(&%k3Q0T6I`**=SkVZFVD*YX*Zv15721@MGU8i1>(a{+9w{oPXL&#KFTl z)Z+UnO8f7)rNH5qnzsw)ggAFU%(YSej;`&8w&fKbqE^p6ZJF( z<>#8Xy&%qE^Z-U7A+5*+GPQNO-3@^-qN#sFXmwT7Y7GjsX@+u|A*D?0JiWoFRM;OP z)YmKg8|!{-!F=O%Xai9d-NxXRGWupsrgCLUKK3>G$o zh{1|7bRr{TAoZUGugPAX^3#Q2J9bRDAJZ&Zo(Bme?(?CqEJI7SCecR4&_sn+mLanp zs3|oV$_{FQ{aUa|9{?F64JgEpWz;(5sJFDhU!g95T98m@PIZP-6`Z5}@B)S{JfjeF z7{0@qwpMXlE+0r%>I!toE{6f5OhPfTXAm>B{=9pnK}s6%J@hu1>s?#tfn| z+Plen1*I_faDJW)>YJ)o5!Z3WfIyWZ=?%+ci=w2W{-KaxFy}J`P6OeN5>VB0#{+ut zZa)*TEH@l6ok{z^_{?ZYJu@7|wdFn?k$*ZMDiZmp1GrBWk;nCHByu|<IEDSp^}3Jzr{K4bj_FDNX%bnX1-g-(?0_-0VYBGzggon;B{ZfEM z-MS0$OHFv@DM`o+Jq^dbC7=p84R#4E<|dM3-z9BuepVn>#~a7)!y zFF{|2KT$&c@1z49YQ1qO+7v4>HR)}S{cOMxf^h9!p2 zKnKID5EKC{A8|NFTW4R!6Zb#^m=SZ3d0!2vLWY>N`PG1|K26r@JVo(p?-#I^w8*_{ zv93%sW%6aIvvryYD`mnDYl?6a!uA(|A=*cQkfI#B)nRZuDQMJN0~}9jYSfOo76bc_(t{GDDsXo|0E3AQ$xJ1Z_kP0GZ{jAV-!Zzp#&Ho_O?VkE1k2=F?z4 zn{FCVY)l}}ujX|AnvERML>cP7iQE|`GB=vvIW07z`5_~AmFgaD?-%Ek_K)br_IIcK zX%a*FyZd_V&JvBj{t(@XxAv<^NPr`3p^{*rS=4j{1Q`N6Y8o_k)c6Pn>W=ALxEbx) zHA%JGd&faYm$*lh!nBo7vwuBVaA2WBE{ps-Exy5;M5~`9Y3k8iaW>?m=2&zGs#k+X z5LRB0)NZf#v5U^(Z1DeHZFW{KPaL~s3h$y(OMoisBk}uSijPf zo(Q~}9)@h^ts}n>F=GBN+qXLmZ;a}Q?zc;Q@~%W1h0lb}r|}D}4t?X;nuC&3tx{v2 z3&lS<<78R#EQBs|RxO~BsJv6Y#}05m*|v{QZhmFaz7Bt^1J_Ka{2$*d-r&|%Ie;G zUe;QB?Y;I+WwqAQ`jn#UqZF#NM8&*`Ts8my>Ev-o2?{AFfnQN}KH_1-0=k$*Q zADDa1%X1mexR3FS=WiTT>;1^a0H{r_75I{qgh8@rrEDJrV@!rXN1Hk$-ABQwi^$O@ z>~kPBQOQ`lLe}ldzToz43P;0+^iq{8LD&SG$-vp^jSak#J!VY3ww82)jn!=u+EX2+ z*4SA1VX)ohoQ;)1WpqTBl1^}H{(f9~CgD0^ASYI64pyihqv=q%MBq^%0(g>-ID_&%+ z4+CCz48hR?qPe$sM`-T}KC-~1z-nJ+3MkLs_mn{4a0?Xgzdq98=5lSCRih6l)k^AZc}`C zx<0@nB6|#x4ccHbP!R{Nnf+J18_*oi9nkkHp`(opnCL7zo-un8uLK1Z)DRw1Ma`@Y zp6iszmNHN59`y@0@mE^?zq|B+jd`4Crpyz4AaQ|uNHU7IVWi3vBR;<;^dOWb>y%!c zL2}_sO&Vc!XMi=$sLIi_uj-x68JK5p<|hJ_B2;47e}FEdXo!fK#f1-V($N5bL%qdr zz8aU5KQ_o^4FtR{3s>h4h6#z0N8!R3EAH0Ui$$eu}cI~PxW2VLp668e=Xt&LB)t8 zUkgB3FC4KK83Ul4nRyH^8IG`S9F-^16%yb*vh}xhHQ2`7fvk~Z+rxP)JCb`W_S zByB0u9)HmI>8YkuwW=p*EwFA}^2}x0jipnkXCpOh4V>Y6ooQPQC=l^0>CNMAO@w#( z&=d)1`~KFu!mv(jax#4*`(aFwEX$G%bBMM*#lseR(B{-oF?2ZoY6wWuobN}^^OGba zOL3|f4RPdPqN7q}JMuTqgpJ91q)`g8z>1Y|YTQ|!A*0R4(BB*y8y4{!J{2^L;w79i z8m6%^;xHItd19oH)Svv_$R~fd=qDuuAiU)XmVv}HVb^8xq@SBy+<<%wvH(%QGEO}N zhlll2bjo2vvJa*o8$Xls5<#>BNa^oTY@b8A*tl*>W;*XM;PFi#JLu=RP2UWopVhh< zRWl5XnKQAW6x&Ls`>{XsLfoD~h-w&MLT%dKHITM+XuiC5uwE6bld4ydW}$ltd%nol zCc=Z6V3bbGU5m<|t(w-SBuncIU+7`ngMYUV8DYwxOZOih53MPOe zn&LVxu>w3aQcgb_ZD(Wh+Ej5h(8dwl|3Z0GE;(@hD}$PILYO>%31?2$EoD_{vMB`rQH_2gTl!xl|jdUMm+Nk4F6F?Y}z(u3;+ zME$nf!=?fVf32L$Z->@SXXRk<919ZA%vR;TT*p7zpQ=_(OwiD&`_FTJX?ojcX6sboNJaPH&ki+S zS@snmW8{qDgCInNh7gm=Az%U3H4VuDzN%Kyvh_7q{DCoiH_mWxtN12IsfIzEM!_^z zH5N>3&1EJ8Qc(<%0+&EQ#%pHF+q#jZteWxSE@`3b;}w{vph<_a^D-W?}xZ`CX)5 zay7)2rr~9!F&dy}+Mu`$rZV%6d`jxX&q-!zxtO#usKYr7ida6ZYg$vdD;KxY>7Q`J zyExuPJX_p>im3Y2xkFJaYWbYYN^)A{S7LV{NnFJRV9N4J<=@2Qw0!{&Ak2ZhzEM-V zf!+~d{}h4$u>kyks^{&CEHWUcH~dKKXjt3Nx!M}fpdMdgaVjSNbFyc*V;-r0GFy~W zC%><+&p*fR0uB9h=*=Wt4P__@WFIA)`@)w_Hup8Zv&Mme$fij&g00BLmVjh2qXaX- z!5_c-n8;rM&EcH<8hnR~Ky5XX!n?{@vv{1F8jcommEwAc1ekFMW8w`_G7--TP*kaX zL)+zFd>$z}b~#ggReLf1B}`^SJ+pDTCpVe_>Y9Q#S+(c+^2+J3LQB zt7iVbK0jBb_`~XHE-yP%w5hvP!9YW3r#^W9kE}s{8m+>|;3r!5@uJRn-z}x)1#@B}G|kV6d0Fdp0!B zi~Na8@ocC*J{A>a+jj}S>=qpEf!L##$~2b;LbpE=IUI6ACU)S`V9m6&s^4Y@2Byc% zBM}M+gGa%xXnp_y~Y}FXg;^<2<_rMa*@t!;}{A=Kh9AaQeG8O zdxmyIJ_EVWX8VX`wdT~G!dckt3}j;xYFRh?&N!eFlHws=Jl1M`Idza^lN`;Mvz$&+c)6p4OY-XHP0(TIbf4hXcc zw2sKcqjyM2M}&B!BU~4UqodnMYq_qTQkX-#-vyXzqxv)RY2aljWEEMmpV-5fq_vjX z7=bop)n(;lQaTbIrqt6QLt`^4j=daY+$e;kQrGOx!HjuL+BHT^$&XPC5F5MTcM(Io zOa%9Mb@G+fqkpZM+BJYQ*NQjMk8pE}=%nWA9fw4&^Iy_8H~DoOC4MA%jw!cf2|b%y z5~zam!&I#c?FX4#`#~jZ6}~IvQTyvHrAUNB14q*5SePG+%b#VUi}3779v_maq7U=t z!y^;%DOjh@nZdxD+W5P6>+}buWzH+KD~s2;lMbs`&#^BwYna zz+fu&b`K0Tl&BXIKgzK_@>=uglAg{{ihbt!~yTv&Qg) zehPQ&vWMYf8y22Az2JKoKxge$NZG(3xUf!aRfdc$X-FA36WaIyPtZp}LBqbT&&*h# z@pk+d9V=E|g06Qi>$F>WmZS*+VLwg5T$!YDp+k!I3wEEEbU>EkhQ4-tKIl8G`W@=M zKRL5VXJ*cS{Fp)+LH&VBKr8uvwG5R%*w zxi2UBiTmCVkmS(;D_F8AiEHD%WGAx1HTTunWafL$s-l4N^CcK;Q9!x0F2m@BHE(8P91aMFqnaw;b5L;tLX6Q0iY4kD$hPubp zg0zpMqUdXK$=Il`nbq%GIc|kHX9W zds!7rSq|7BhSRV2=7Z6{>CLr0#q2jjQ)`>b4G5v#LMV1}9!eS1DP0hf{+^Z9vIWeX z!bGSNacChBC_)hi>2GCr0k+6l*~PM80??j-76 z@dc=A$2*;uo<-w)wn2Ml66|v_LoU8Z`f_Q>R2TbYi$6}QYv(%`;WxJTsF75rR{moe z1B?&1^j8f9S-}D*JM}`T#(KJe*S!<_#y%LVvf2XC6V5P6Ic5`}@>3YLUa#XAFO7Jg zvq(2dpu9A|_LN#pW!U))AkcS=@r?8==82<}4(G`mkXtJ^2N*(agLw<)A}X9e!TG`u!e)RFxy->he9DHefQ02Lf=U}=@3J|Y zy}zu{`^!S_4~v?EFLdm%iFtU-(ZH!kxeag{bl4cTPnpY@6{uXO@K*Z;r#-UELhsIN4zmD#nCP!7J0JwEO#JIJ4L&4VoeCUA|)2 z(kq571sI+bAV}Dlvd@Ci#ZMb=gE?sB6k&$B$yLyMn(fe#giER5IK5nD>3kqFIzM-% z7*1svsAZYvM~354&8&W^NvM*_IQ1au0Bib%W%~l~tp!iPOpWC~e`^S^q_{@J`CDNU z4;OJ7T=_nmp-*XU5^G^@Y;Mt>Z@&FNoHhd87hNsSA7+y+U&jH_uU9W-WwPUrv}60=R) zLQD`HNiOm~qCP0?pt}8QrdA2YoOC(^s&&OeHaLTxs#ao}9);vtQAlHzjx&1UQ)TfX zU!&C_g>-p!%cC!(iF9MK(hS1*aE6CKVwQ+Ce<(Cv?CQ^$W`S-!W93+Qerf+C)E`H) zSNcLtZ!RqUGeuL^^3z(>^|Nuj2gyB)>s(ftHKD2?@sp5s9qHYi2NMx3|Hqc zbm~bxgJyKh8JF56_G)inRq>UqdUg1GO>|5F%$#G!hUZzo#@{}@_;d%XeN7V{s{%Yu z(#dM4OwJ79UQ z^Da1)4Y+ozHN`=dOnlw2D>U2y4`>b*vzl)~79ule^|bN&MjMFo(8lXS8;=ktur{C> z#|>aP?XZlT_YGmD6BbK@gc+U=P-2B9Q1*z|23(e-Z-%=o&C^&;55j>FD`Bo-t={M} zNUHn4n|J{0jbZ#J1$hNO$fxUykq?uhh34~A<3taGuX4ICH&*Q=(biAF1hl_ntyb?j ztm?hL6B=9@8`M5=#%+TH5^GV&0)z{201870o1(5=dLmf=m%bE(|8}x-S*w+#O7w`v z6AJyFX8`8YHz%qh+M$K0VEeK7ZYQSRgmJp+_x9c6@ zo%sRoD3v|xY)*pFpyqgRwVtR1QaX(d!l&vsQU7XVu0Y!~kT7@wCU4n}i(}WxfXo5*jl<9#{6BnB7a_%~gH=Bwm=gn!_C59GO_U zB28dmZw?ck6a$OAk7kChI;w>|4x$M}+ac2$;zy?sJY}CZ*eiaq+85et+Z^fa7Jrsh z?;tf>*6S_9Hv&gcwLHXQnOBoCT|pW6jq$ZK53B$@gAXp2;zAJjXZrZd7uHx;pEk;tgug`EaBaUB$f{S8t=l!I<%b{*| z@m|zHm53mLEJ}vA#Cd+@uM>P%O!O_oE@I0vtk;F%yfpxg=KiWxy*0c%5pjc2d^`n} zCT%?OXPWCkN3g~uBnFX$#{RoE#`)2oApNCyMOyv$1r1tIEyL0f^NZ@ePVoaaZ`1dC z%EaT zBwY(jOdlB3V(xGa}z zrzH*V0xr~XxR{G++pTh?JOeH1n$O{~;q2^Zxtx4f_Dfvspz~JwaGi19Dmgy>3NDY3 zqpMY(BDYsdN3mVSWvvBlTjj>Hv%M+5A9r^4Qe9CoU#07#&dOe^>!Z)g-l*%Qv$K7= z;?ciN*S^Z!avhwNagb)KJk@~PD%WAv>-SHv%Tm|J*zumN^0Cx5)$dtqzv_D0Ss7>h z1t4=4El{qK-ZxWx^%(j(kE9p z&cghlO4ypvGz(N-r4bv1E$YQS;uSuF8ox;pK{7+%kVKsN3wpG?2i`Cd;SG4P2;Lah z)RPGly(h&zno`?uWF|#DRpm@G4E&~8!JwMwf*b=j9$L;d)soQ^_rtg1Oc`}nbJi3| zZwZ5CUQh9djR|V@w9(pcv&(#T;&LO?u-m9lIC2=MQ$<#`IE6jFR)pCe%&0FkHdncE zd|6fYM04eW*waN*=AztXE;=~w7&8x!gHw~L*g0rH-7UG7AWH@5+#}AxwGNhQf=JUV zJ7b`+6}Px&f;vf-=JY_AP~G-@cISYa0F>X{Khp$b3z0)N`H28XY$J2FL9iXR5y7=8 zfNQU)AY%=s(Ve@qdVx;6PKw__bC8~vkje%VV(VW%#{zOzQOe6eth(k$b_gy5=EuL> zZ$GL#xib1z@mxfAUUe?qy;UcL(MRQ|>x7t8HM+IU%xM@CY|orNb|)?ojrYA45_MQU@VqDiDIB z0$~VnV<3&Qirz;$X?GlQ<#CW`N0VOdl)AQWMW>cPuwkz$1Y0`6!l#M>8y+tnBQYT! zi!@PXml%oF$}Yqp!jc->&zjakYx4u7v7$$beZ#ZDscn_~%?ISSl34DBWoZ@P%AlJd z%G)EfW^@B#+;*Rq6{M?fT#2bvr^vA-$~xGbd3T3DnsXRR-9wa$a82tYEH8!jN9h?) z(z%IeRf9oDpB(@b&b-iCv0Y%RDjj{zXfQzGvRDWL$(jM?mN1b&fk!!s-qJ+OmMT*M z6J1a^ZR8FJf6JJ=4KuKi8WdO(8AKw3Vh9P`U$_(3RyP*?PC22N(%KzF`s6Urwh~UF zX@#74pfDr*b~uzu+H89(PwH{uK65oaDZbC2Jb`y%Y-(U)c3TGtsczvHFroP>VFiYI z`EW!wl=yCo9BDXC=f}lyOd&VM!xkVpPg2L5yRBHBrViU2~=CzxQYTNf28;IaxK z%w;uDh$>#F8NCVQ^uA|7=Gf`F@b&+p-jF(h5eB3yc zD|wLyNCYTzi8>b5*8m)CdoWZyjiMYgSY<{9gNbSlDsNq*3Lyy%M7X;u({^2t1z(KC zQ$s^kL!9Vr_!F3A(I7W{5V|sb$ksGuQQK?BA^qz1LVmS&$ghT+o^5I3?bELM3Q_qb zm4eG^f>vCXz^H}-KZw9Vj`b^^w-%xL&QBOTO*nwu(hk!V%afsAh$PIS$_%}x)$$kc zzxjFM>irJLJj~+A&q!C5=|zZ*Qc`qOsNlVSI!`iGv<1%!miM(j4rC>BqXXZp9Yhce z#$*g@<+Zw@Ghb({VRA4~zCJ<9KgNUn6;8SS{L!{8hK4}<( zQ@Bn*4g_xY65OFZ6hLaSccZaopNy!GQW;GMK zY}X>S?enBd3C`m)LXe-*u}$}YM5KFUrh9OaX&w=Ctyn;B11gk`pkX+OvX#Ec)b4Gn z=1aCMvJVVRsU+^)>;3*B+DgN2LrW94;393s^gSfG1mQ8&6thz>R})fyOt6AuC{=tb zff88+`k?NW{k(dYYrw9EItHU}m6>X~H%#0zHKxw=s#J6(<@dDwIo2|PwV#Gt1U}uO z=b>41RI7G@t^zNRt|E{}=tlGJZCRR+t0@fy5AG?Dagq7QMFs^I)q3HgOxLdq<^-hEk??n$pQE;00fG(^!5xx^qNa;+DL%5=SnB5p2$Gg9VD3~j-F z1ydL{zvHvvU(^TIW|015THLTXy>|ZysZY2XRuErzN{tj=yHZkO6kQ1)*XGzKdTZH! zOR&c$Y8|Ux?2J$yg+BR@F;0gAg5dVz0Ic+@hHH$!~A-X4=hPjA_xrm0jh=#co2y!l~5Zzp`IF?G$?fpto z*<9YRpKl}~oOF$BAxf2Am?%sf`_ut#XUsX*ag_!ku$W5Iah0ayRx5gj*cdvMXtX14 z#?AqWj8$AvX+|YSmGriyX`m9Y`~ubnf7lr*r^xJLKO0?=Op}{n3AfpWwd=feCASeU z_9FWMR`&iqgLkd8o&QbXeQTZ*ZKBKkR?&d;#|L<%A-`?KQV-nfTdNKlzxqUGroyyw{T)dCR_jQU^fMbo9FZy>-yK zb&zlQ#b@cC&z^rPxF!73P5!Wdw>kkwwR;>8Y`TMNN*w$x${exFtarzJc z!>wDswg2!FmcMVMUj60brc?g;F`M+~$=BZbz{kJzGy3zDdw=CyUw_Pt_2&cCAFlbM zTYi^6_uX2i_TRoizORoS2Mj7%mFbl`-#Z{y!I+scZd$_@wm#1Mn5sevlu0J^Y!L$t|}CB?I1jX^3JpnYhb!b38l$#>HU*Y+g*FgIiPO^nC6A}7FaZ{kX7Ouf zvO|CLRzu%tWVn^-<4M@x>3aT`+}fLk2L)Ih+H-4}Z28SEpK|hlD_?VHUvX_GLWw86 z@1_g2pN7IH39Au1uf*TKB-xVBnIxz_k`JF&drb>$bA1d6}zu!Kyx{wr7%6y1GEtX32?y2VrQ^ z7L?S`SjBtsyp_DY+#LVBF4vTO zBgIgeMSO;0l8J2eDiq9@TcKZUIu0$TG4v3c65+PS2v_h&c#3`@NIJF3Df&{qG|%O|>h6!rA{QqeIs!bRNRNug1AU0wVy9*9o&s9H+(h|_j;6HQ zfTO8o`cMhpJ#kWb7>BuMC+OW9(Mi$1_6q$2dtR4h%*1d2=bGGWpu!J7{MIA6a@{i= zH}l`mwa;lN{)q)YfFiA+nw}pzGGUQ6gq`1H0>x{H6pHEdw>Upj-(?>u4Z>o8N$)c$ z9A0ibW}NSUNFaRr$=K^z8KJ7x+;CdSIwg;a>nG(AP5W6s$FL!Zr-Cid>pb#g>4~X)@g2w8MP0YR{;_0(Z1qi6cW{7q96jHkQneoZ_Qu)9?!$0h6(`Xz`}B zdj0!E*?xrHYu=a6COXTb_dl~NUl^ipaB@QwhV05d7rE>5(@^#;uCN3-rrfDg=+y9- zNf~H3(u8gJg|_Zq0{|2g$%>awMih(|r;cV)uY4P0H$%r6Iz5iPKEQUo9e#w$fR|dn zFASuI65Q&XJv8Mls@400RGeND8yfOUp=5Xc6D*JEC$$j@SYXz@Xitv7!JQGuKZDqd zn|M!?DU(Ezl@#B~2ZWkYgoI8YDG)>~2sK?0aOE+G#O?T^V;Aw7-dh*pWewzsYJeMz z{2F)qm~(xV`F;$oQP3=0GzQes>=3sRgJ(j>A~8g`|2x^34dZ6^L~UlL#j8_Z2`KV! zV?{2eGJG#jr^fMQUA^W53D`bxcIDR0e)A@p!$0$hnF_6(E{c}W?Xd}*ACR|s-&?=WcH3h z3&z6E!7nA-@$Eit`z{SCyrjZ|EsHyuVb57hP&k$*8CpqkI30R0iD;yJ=S{Pk;$?Yt z^(A}{qbVoI@hCVqX@`;jpiKxpsV$-tS}~XC~5zi~J~D#N@aT zdOFtH4xPzlRhY85FE7J4XhLMKpWIOP)3>|YRm?>3fL16gW+}H zF*%r{9W#=rI+n*3&a%bwil{+1um`Lo<*xZ=$Bar5zE&iY2EzJ8?UVQ{Gi*#KFaQQr zec-QIR846_P7J4{7T0-;B`s>p8*?fbwCMggwfONvOhYXW{c<&YlvW|Jv($i_aIfv& zDa3$G5sS1@dPoR4YKrt;u?X*7iu4%~SEHOY(jN;KGgw?L%r@VdvPY=K1bAm&lbIPn z6H@>5SpvM~@b#K9qG&e7NjBfb)koOL6kb)yd%Vh~FjY%K{aj=VU8gy7?DKHI@M50hq{2d%E(vCrl(4mEJIZYul zNO4*7ONJ&KS1aW;cZzG(K)_T>*$GxL3D{sn^dpmc5yNrffKbdg04e{b#hW`cP$MR5 z)<`Qiy|#UVkQa3dKQZS;d(^BP$4{2y_H?0BWEA0$KjVUN^aUj%Lx*SDHtRG1Er++k z5|DqUgi9ax3TNCXRh0!(RxF3qSchsr;^H<~mb0=Da7^573@-AQ{S6bbA8JatIdZ%A z&WVKx)(CPff?&|GbM&QQ78s%tHrO`O__Q3?bROLbzfsKD}?tA!~oh&j^^~W>_JBI9g z>LmoSYpb^q0dIM4Xd^x%4|ONS?X7AU>-I;T5YxG3@o6@{FeK!2%t*|;8HnkE?kQllVw7sl5d!lIOOm_XM$WkFZ8C>`bf zg%ltFK50*tJfQR@90nuv2V0YBKce8dp|Pnj<^Qi$sYshS7{a=oun=$_BvzypfJm<~ z&Gwdbp^Y}mVm#UW7&ciNY%;+9>dB$j3Rh2EZPHYYmmXEmv^Z28qH!A7lpGZzRjer~Kf-D1al(b)zkebSjb0P!ESKo@AEkU$R1}cHBi+4;^$;D`) zl}cHI-yGt}qKUh}v@s!NDZEqpDdR~mViqB9g+wi!37)H7ysH9F)m0d6fbt$kE`|1^$DTSgg;7{(rC zQ!XDHTrX0S67llh0og9G&}CN5n+KA5qQGcA-*Irye$sxj=N-6u^L)C8h^aD_d6LQR z6y8b~e~T9QT8UMS+`NiJJ^r&~Nd}c*_o1zE-fM|vau(~ywR2wjKf?6@TNz6HQ+y(8 zEYW`)dv4y^9HCV9bM*JqeTrW zvlct!Eq-dW#cE!bL2yRE&~DRE)2-)%lRknwh)z>IgEu6m{JswUJHT`0o9hGFFuZ4D z85vUx%4F;Yj5~Ej8+cd7O#o#GH03N~HwU4D*+ve=03M364`8J1o1sZ<=(ClPDSNZz zLVS81mnjvD=X?#c=*UPm1+(*6=Ap#9gJlH?CW9QP@*hye9K+S$Pjf9*PC!T#vRdA) zY6bqrGpI!YzV9ki%2nx+7S1*b^q%Ie;_c)OeE2{r0eZ_T@I) zzb*Z-@cZb4t5%cKfiCZqI?C?lknFOjUJ1n*dB@54dk6oQjI?5FUi7{NA1a<4{GdL(~KIo)nu0t>Q<)C8hm&a=svb zTEAM|z8tiZ*Qcenkf=MWdnnI{%%RE6cTenrjc|t>J$}viHXr)*O@H=^&eeENs(mkR zZA@S(yTtt8`r=k~8~+`6ajWR-k=epXCL7v*K36R8UDvdVhgEl6)2iO-?^d6=hQTDN z(k>RN*$rC#$?A>|n-Ec&D+GdUmmHSf7qxu4ywlzps;2H{6Vq)gO)!i2i<6ByUT`n4 zqD{3uX2duoy=A<5o3Jze24a&C)&^Bxk>q6%7rS6!2xmz*YEdu}qzbJT_n)&1$NbCV6asqK@7odWYU@85F&+yCLyPx~*I zlAV#hci)q!e2uEE5mNuiwax17KT4`S#T8X;8mmGWKd9pw#Bd&x9J|JnA4*=S*|(Nn zDo>O7{w%$8Ex#7?{rx&qDN}|WC#sW?HVh+z$$#7GKg!?Sb6NF^oa_#$!5sq)80?|L zD_-}i>edjNyz~5hgYn0P@YbV1F_+RlGlPYFdGZ0ESH%X zV)FX(OZo3yWR@LcDFR?{>>u__V$sz~l%j?HcZ}#xbtrD7`{c(GIY`xWGpks;3?>%K zDvtVgMn3(k|AKFg6Tz%j4>I=ArAe=P^X=T0BK|L*;tyNq7@JFqewdT)^7bIl;jHf<+(V*^6K1k6OPanGsXp9OJ&2#xEy;6K=Cb%vkqeLbto|wk+(7>S@nYG*IDbHX%sD=$7Bmc}FPR!y7Z+(kyL1 z`qx;D_VY`!JQ&2UXb@Lao1juT`qS#J9beOd&09g^WcWT0buE z1yK#hy$Ew_$`A^0dv=Tkh$u&BT{JjC>(Jo(e3M}&T<%t@UO_G`zMevCS zCn@og47N~{l(^CeNy+=+B!vWpq~uGABxNaq1X&ozQF>47BAwrnI3wln@s#*-*G3&yGj9wCa9LxMat}K&#%O3>5w-wkeYY-pY=KA>*v3 z9*lAR+hEV1WeYtbKc+Y_dUthBu|;YYK`v=i%DNVRwmWCK?!~hWs9(~?p)e~Pfb`(S z>T%nun_rsCd!-LHCXYQgd8~iR2iQz%mPXDrwb1Pbx`Z+`CfrDtW+$a}TG=n~uxcO={7GC*lU6=f?*b%;v9d_#l!fRvZFcLtrEe2ocCeg+!0 zAZRz_Q?sPT#@knD_|?A_}I-AloD zoq!waK38*%x4rxLHm+gq1DeJ&$faw5BIl!5rMce!PxZA?gCKJJAYUvYdg5>EisFXpm*6IKp5iw~nfHDIkV(N779?j2m0#tzz(r#=- zcyL+a7K=N9j-HxGumI!zo<RH^pCX8@h;2tg&HSny`6vy)Z-$S1&c*amsD z=C+7!@|%UNpVL_D1=UShptL7rWaJTuRzGTQ#yPEt+pJFq&ojp>`c(NItzU7VBj+~f zWHX;iwlSgeA1;!|($G4QdI{^!MP?@#%gL?tSeD>Tt@qMaFZ=3$E$-p?#H~bv7@a~= z4aedHoP+5RbeCtsJPu)VUVHQEW^A983)tee+F@W#du)sGoR$$!QObhmf~=}?_)yT?;5_H0 zj{#e8y-*AT+`=wkqkTy(HUi5N9dsKh<{>k&?bZqSkIVz%s0>ESxfn4zMy%i0KHeM? zIPUS}nD{dKR`LW<`m_CfOp<1EphDA~hf(R;FGnsX#jnP-^I$)afLQf1_Ec-EQ?xw8!dTh>agAV1 zv5#@r%d(D>1qyh2R};Gp?}sE1y>Dt^$OIWeR$~)24aXM!;q59WgzSGr1$60cm=6+$ zZ^WBapM+7JRKjtrR&!yeQ$6H-_;K9reemBQ=GMp=;2qKU%ZsA%|H0pouk^nbf8Y29 zc=o>o1pdoxp`qQ_|4uAga+iy|zFfxBajZy?Jor3YjksK(iH&9+g+vof2E{bVBCT#* zMy;4o@x$44-0n%!^35ZEoS~p{1s(^62a}8X#_T7`cNr^IwPUJ}q9*7sj5D||+w0Nt z@3itCB@t7V*8+1EWc78dT*$VH|IEulz}m}!02#kbi%@f$)}vfKd@eHi ziYQh6a5_JPotHc@vSn)!@*=0}5%AnoBfZm*9BI#EhFwQTNI+Feb)4OjaBHoRd-j8qzmOf1h9x zCsE-9nR?k)gdu{w)q8#~)gV`R7Xi!SRt#ECLldk@vx${;6P@ba-o#38q6RKNkLv*j zigBD|A5D_ciNdK~Pl^*0K7~B$iE34tx(H^KzcJMW&B@`pK%>*10i8V`0Zo{);X7SF zEOd=L@~$5iKa9FI2c)jw3c`B;d7^r_eIcIpaDSCr{utEtoB}hXbi8C>v5##4{vLJa zeY%gZN5>uDZyWh33G} z5J?20WN?H@J<=NC(6Qq8JJln-8Mol+;ZZ&+Ns>o3AJu5}=-~^G_7|)c6!e04#Qxa^ z=kO2~t(D$Y&8f;oo9u@H^@{uRs$Vx6#^3$1MP$l4D^sQA_+=c~(lM2sNjl~_E+||| z&ZOM?1}@Zj-xRI;GtFQ1+u6b$F^l@*Lkisz6q!JB?svAlIC(6RG6^QBDUj6%H<3Mg zZQ9Qo`ePOtJYik~Vv5V7kyXWhVfld64^G(*X&A?!VHE-6+mi2Yr<3Du z%cJKOnweiGF0ubx5-a2uT2i6(MDqlof{iyls)vW9F+ezvC$)_-NR$CTV)e!ca#gXK z%TZsPAn;@-gNd!9J6xm2t^ldF3L4zJc&Ft^jO5^vVvgrD;HS37qOY#2=I_iYVKdKR zMck_1*ev)0i?ZcGQzLOaNm#?6@{KmNl}|lWj+N=4^Wgcv@d^FO=@zJqYFXXMshL2C zKql!xcpz|I`!FyJ*x)0VJ4&mnCd1);F0~}@x=gE-9{Kg!!B%@Ia)TGshhr&$8Jj=} zyKPRK7?#_0MN`22F2&y3#m9t>LFKf}#3(%oD8n?Xsf%_GVSy5E<966aRT1VoZ zoso7B(5)F&^p;vIpshif_I1<=Y@lvAdE)tj7(67_i#eW#<|2e%Q(e4;JZ92t+7A zGP=HnOSyyDi?&L?Nz@>=rtRbNr(hE@2sEuXeYb)YdwlhbWX0kzcZaT2{>X%45zFVw z{?s!RYJZWjl6+W-Q#5_pYV~ z-b|{WDvopqD$Js|D3H_F%Hva10Z_lwvVlV-1_2oDEHTPVgmlGUn0)3hie~dg^;6{Z z%5()U3b|`;{RNs9BGX~&(doK>D7Lu`ui2* z|5I2d_fMtmE2Y-<&+>Y4S}@L*+C%y+%mW`yn$iBE<}+ z%NfnOw3{5hi9%a!mgC`o0WBI03t(sOn>;dEF&SiqaC^D}ti`Q$B*3&!kk`HaOgiq? zygd38yy(h9O=Lq9ntV9+mLA@mIeVxzo?}|$TNiOlHe$Nwxq>Um6d`R%k|M-Fj;Z;W z#0~q36D*1G`lVjT1CG@ue@t<1ieT%QSH})l4;>-l+KnQnm;`zYZW4V~QH{)XWN;&C z@Pw+C!T}|HN4R%yr*T$H{s}nGM_$k7*y6cs$f@HX6$rQ=m}hmycBTWfmPWMi<#vv^ zxO?$jW`_}Cl_+9GijO9{kd`TG4Z)Jg&k_`;pG>m3>hmsJVb-6qza+?}^}p_p3%Gf& z-K5&q4L_2E?0tWcyzoZZU%k_J+1CfoTFemJ1@v`zFPyj{k0>|S!qtzV+XkH~gF%x^ zql0{u1lTUqofi!z;51;$6*PvhxPnd5FcDTw$H3#Z!y3+m+RI1h@GYUdD`8aiZE3@( z79*iT+7u>o8aTW_&S$Yoae#(XB+)1~(T7gQGM!!iX??eP&|!J9;@eVMdx4w8eeZwJ ziPnpU)51pV9Dk=;r{p1{Cv&pqq|C0nUALK!4l@=Ae3}Y=osjR_w7zlQx0!^nt?_F3 zy$@##voRWh{6$nfB)SOLG(N1GV=b>VJ^L9qf8q-<*PR> zoty5?HxEe5R4=}>^d`PxIUwo(nMIICUMV7BoxHMGWWp`fI+;zTO+Qp_8Ob^Z#P45( z{dI@R0XmNe$5fwVGQ8+;6#hwN)3+dfz)#I}Ye^=M>X3;a{_$j-er@x@C8VD6VMRgOO#I;wdZ`^iOwAF(zl1xW$oT_mC3qnNVxH& z71ohmak;JgIp83QlQufTDaBolqw+B07W`1hkiZh0rM9oo8w1>fM!;mHh->C-)J4bU zbCk&DL7|Q#I=Cp{NKL}n=5i?}GG5QI!gx#EMni|fce9`{e`Eo}4rBq_ZW>j`nq<>* z#2~M`{)MT0>P41EZ>N9tU=%(0g~`+R4wi3u{pu>dARo^ z?acW2)Bmr_KlHm#@uve0F)o1)r&`W}X8#;<3r zG1Iqfwn|I!4f=S7HQEYy%Ds~J=4>s~OGmo7Y~+`JmNh=Za1i=5n!axDr5u#(gSnHg zz#vxbI-$~a;WiKV@Y*1uq{3#fh;725^O4?oMQUH!QHwOv-U|?jW^nIXpiP67Ylez0hjUTcw@ePDVtl&tajsTq?oA!EV=MGXK;Kdm~s| zdqK*MZnt%tcL|YShowXoB6kNVWY^m^lPD>&w{y^=0O&|vPu5~Ca2{WXi*OCMWtatzUuRg11Qm>5WbwU-y~eZIh$-mrHs14+cmM7HS-(k>%a31hEi>WQ%9 z>0+6oC6OY4*6ir9O8VwcK@H*^emGQNCYk{sCp!#F^s}O~odK#g_Cga_?cii2{6G!Y zGXIpum*22gw!;33va|R-E;<-z1{&N@qgB~ExOvm{d&_+9Rs9Uu^CoT{VHZ;+M>y42 z`DF)rs-ekq2K%1jyrn$h!eM1yAZ|Mx?WA`7uS@WEviQ3ku*`rCFtvn)ODdTq*6>?zg28)Qr5~xflIYsII~*x}DiCXGF17#vsPe;-1EWl^syF{e z1K&G7aP+hv^T6LTx$wZuqub&pyjw7fV_0gzd0X9PoB6lGvxGZ9d}ugT@BDDCfMrs> ztA1(xmHR#)&!xb{NMQz`Q`{ExS+ zpF4TW5dIFDB2doeMbLoj7pZEauko_Tj!mk2;vY#r$&n3kT(B%W@sKD0Bff=1N(Tx4 zahPwfx+`?h6WuvL695XtY7ahPog7~rW?bs#tD8>^Due&y!oP&g)x@lC(-pxn7EpK7PZn9^z^zw$P-<;k518V%R; zES`Z}L!hM;1Xdl_w0bPLV{oH>s{Z+H(w$vesTcO)0jfb;Rs4EYhVnqUpQ-6d|2t9s z%jw%^u&*oSB6t%U8G6EP33!4Wc!||qbq0yn>X;5vD>r1#SrZ$#&rE<8KHpTxQB7@A zt9(cQu5t(?aF(RomgC~GM+(5GYYo{NORFzig~{nouSyv!+nq!CTAYQVFebn=KFB9*?O()v{#9yy}^6WFocK&~FvV9jL$~j|UStsju z(=MSHes-82%u*i0bygx9Y!M$O}aMqeW6A8Uj{KsSm}8AAvSc9+QcO$wq>@MdZ->0wVul zzA(L{;ciqfW3Zzgci3>j*KjNl${#7W3%s!{mm?};8#v<9cxjF&L{chhD;`y-{@~-2 zDm@xBN7p%`48!oip)fs01L@9Xtt8EIFpmrZMhB%!X=GoyphRCV)dG~W-wO1sGy|CX zRi+>4)Ou4JEmmL+DE=>j7t&m+kNb$ivUsGTk>*mJTo5}L`fo52$Z%VuRkDyP7Nyj0 zFDm{}T*xfog1tYVO&9LfJv#D-1@x73NBD#8-fJ}u7J$Z+;ys-QODKP6$>9-;V_5y& zKQ=R^dhG*RTPLK_tP@oHr$qdUKGo_~()%R*dEaI72~=o{1|xl}lZPEVx@Te`9yL7d;7Y(FDmFO+p)YCu43Cud#xIrBTiW5&AprsY z&9MO!&cBNRboCq+&9{hQ*yV|;T)eF2-jTY*UdyWeAO{{-2&mGQ0*|yg*7M>Xj);#4 zV5@1J)N(+$75jBWCd1_e4GbU`$+KF?KdbIagfaata>IlXI9YZ@muIBifyG6C0f1?r z!daJ?YD@EgN)ki)>E>j=Y>-zy9U0`$6x`0M*L|CvIG+dU*#NM{)SR;Qxb#d)i1HDk z;o0mmiD11j&qjUh1L?}?3kc9w`+jI@Oi!X3#X><=@N}BLP5msWMPM}4l~|IG3bw?U zq<@L9bbO?4awC8)dhfq0G!0m62^a=CV?!bY#B3iuL^DJa*L#r>@CvlSUPdTe+xZEM zy7JNqM37Y9c`+(faoLa#tp2UN6_T*2%xg=S6nASm+D^kZj$jDU36iX&gF5w5$%mGb zZDs7e1Fadk7+tf0!mk2kuq#Exk*n{i7U^9*7>l%7O#ZA7up(wwmVaF}WN*6Rv_`d|?W}k;;H^QwD`Nd}@Bez0w>M0+b&~EQ1p{twAMD@ss zmyH&h16W5=3M(&22VHd2;UY@JX~4{wzv~O4p98`K2;~@<(5W#2Av^(BO^VxcD0~RI zw!=lB`mu!dS%C@C58^V~sq6sYpK|3~ifs*-xPdE{RF>Gzv%aO62@2d)iUb#74i{9Z zW0@|Eureh{s=F{kk#16bytJy!8kRX{p-p;d#iiER*?Dbk)Z(@=Yq*#UT==OMpSB^o z)buTbt<9^bjZnjKglltZhp}rN?nL8~CkSy#4V%ba+|gmg$k4k|W9!6cNXrLvhAIyu z!6;HX7Jqe3nbHOi7q)z*O8ukejV5CjBNuJrB;jpDR`9in4XK0rdT9PAQD&*^P?Ir} z4n@R!V~(1St3q+*{qVFu=`1XB&{+4#BV2dp*JzCk>CS;wEZ{Vw0g&NFPm~=QtE{;R z=|%SU_?FM=`cJkSy0dR@K|G(#dPlX>WGa$r-Jdv{9vC|3hV)7RsmOn|i70KjdY;aKt z1E;&B_@c}*8eO$9xeU8siq?wiP%?Uo3C+O_>-~sPoB0h*Zm7-pDjr+1Lf7<8MVsAxBpi4!h$;}YX2hwCgjd~nIG0^pZbFN$aF9Ya(! z-3Ap5qWC_`7A5QnC((Y2{wqATt&3A|5#=O zyz!yxjy*(S=>6TIqI8k%RqIW~5Z^e)%wrY!0u#BOup@N(0WuZjF65uF{i@HXQw)ww zT&rI~re2dJ|6e&v_f~5o|2}&7F zWtT`5l87P;a#Z$?a!+g~c(^d0@@tkA$1$4-h!Jq0$Ghywia$rouOY=Gk01F*=laHM zVSu|KB_xykh)$nt>oij+`K7ceE=xK>Pa@G)viqL^%D~|f{1Lu4M&XI1`0Qkyb@Zl4 zit_RPn!m)rC#x)t%1LDe9>*z4Rj|lJsbnakwAP+nhCW*q<3s^#gkJt5%#`1OiUu+& zpqny%)|xW8l>bW7Kc2N_AaYU=3aotN{rMBK0@#&gK7uYdpz?f3Xe9kK$a@$1V|COM~4B9ZQL+$f_uF)Kp)DmCLbCX<|%xubZx94%#fM!I@HwXkib$Hnq2dGUp;pGEvbkINh_ z)QD}&R1_i@lHLY3JB`4AE!Zq@5+6S9U=UKY8zB}eRo>i9mybj2BS~#F4?yz3G-XTi zt4=qE$Cxdpi@b_lRlt?|J%bC<(;c`xYxh_xcgThK| zUZKkp_`phs4o=BCN!yfH5xkrgFBwMOh};5x-O z(wS$7!HRR}U$KXBxx9u0QSi`12Kcci;ne)cDLFc*-qC{owy~c!M@<4hz)Unc<>q2J z9-+dH92Mn+Zj_y!e#d=lD~%hWEW-Og*odxlRjwzxtdNn!g%xZL7(u-lYz7#OCjbw! zix}~WODJ_QkmX6bp?5N%DlW?<8GhxCGg6Wms1YzSgO)Ix4=7y86f}0MZjF7=(_p7C zvP(9@!s`f9^MVDaDXYU|2B_GSs^}4!=J%9d!OmqH?$b?AP#`zLE}wIdl~miIvyMTQ zr(}2fEBr}aoN}4#SGCW@1|(l(0A|}kCn@T{2FVd- zA=50vQ=6QX;l0DAVf_IIern=uUn?#qO&n^~78hUd39wGA%q-&$pQk2afDxH@;YU1M zL>iQ5k3g;`6akd(%bYR$ArcQ000E0Z`?10;jkM$$%dn0MZsl1nlo!~*h4KQMxKLi; zOfJjG;pV~)nkREvaTX?5P!~UZ4K`v(wwEt)} zyECOp{+u1){&Mz^8$X!Zm|(PBS#s^{9&|5(Ppx1zNugXb!2F$IZKrn(PQv}w-Kiai zPz;-U`NsPPCp zb%I)v;5_$rk_GjN&P^!j#SFSHP__K2lKZX32{K{{zP;ihQoZRqM()~*6}FB+?(EO9 zf&pA0cTv4n6ESiZ)vKBa7sy>y54nr#A$L*zN~oU8NoQqSxWHE~h&i7sePD z^%sctC1vmwaan@omjBd2&W05w3!*l)&>l=w1nfqOT%pB|sa6mnqwVZ4X)d*7 z7HKL%>=NUHOl1MAA=yunJ={AeUXpuk0!B9&Ztx8@TJf5O=ij_fa={^vQp+_>7$JIY z@R1fDmj5Rpy49|&gTIWQnoBE`_866D!&S8I+fXs12@pOCxQ6isr!}+wgw^1-R*lQJTO7};RJmh%$0gg)^(QPC6^Wd}{W!doo{K+5UMuM%IT`&Q{RyU%%pK6##eu7hcNKn%k zYq18tk!;r}D%gfL0C5)|;?~}9YkF`KuvBD>1gxylSg(gA4Ppyxngfi3)Eap&`0bHz z!5J{J`Ob$PqVFBG5uD|9VuhQ4C&WU)_h?B+bch>huX$Lud{1koKDhiB)Yv3Sw zY<4N?Aipl_bC!`W>@fm4!>kpu4rL$O>b9!RMPM(Sz2snkuabj{wuG%RYUdg5IL@J1 z@u8t7wJbGn%ttO;6$eBG1*4Ir;GV?5D#dhK_?grGvPx%$tJ-sS&;sjqM^$NTQ5Ao- zQw6}smr1k)jFgnX@W5rlcxYKYac-UtKMP^Up;1-8u-XQ?&I34RJma4U7#LG(V7i9< z?`X&|b8JP*BY% zhC<-!LckAmNvp#j1@jD#0?2;_9gibDqP>f~BAZsV9}OJdt`5ckw8%;YvKI|_&sGHx&+N+r3@l1HZN{nN?ld|V75_fTtHv+OuEd9p@`v%63|dHH2d*XG^J1!I6HPuZ;H)_zGDjkf20*)C2C{NDZKp1T z%U(Y%btr>796+6bL2*|R;pNX8Am`Q!2|yLEk1JG3992S*+(5(uRRRNvN^7U`vbk`# z;%~%sLgic&sqmN#S@n$s9aYXIW}KS;bj@Il^u<TZ7*#^9|k(k19O(&ECCp@nsJ?8WDNDnv7`;mJs)!e-w zdAZ_j1Wj%y+;hPRvWW{m&ojBKJR7%1E?>wT7knXGxSVu$b^#Y$BA0Smb#``H)PV1Z z-j7SL`1mB*ia2Ahpzm!YwQG<5MoB<%hhj-ck$#p65@l)|(!w9WWO|3`GK>d9|D#8b zN=dKin?5ZQl3z=xdlK=U^}1LBb6;i)f@er)(ZDT~J;1|N@Cj^N@MAW+CnIwhRu=iO zX>)pMEiXyn%BjSA_hwhXXZhoB7Es4`FflgYY+BpyWq5(U1r&OI&;cAz5`%ADS`e-3 z{q?fNPL-b>2CGmU1xYUQaBz`j!bK5&F7+OY2lq*f{ElH-40FUVEp!+FPGXr;$oxwT zx`J;7zp{!QfOk`wU1GYY*nuVeRe%4bhU2x)86yKiEU~7<>0vp4HuDO|IKKyEwUk!l z5A>ZrJ1>PX)4I!PG^!71cMAeW)?IL=AXba7Od^oQACQs|eVeIteNPW&=p0{cKDT=GI7pw+h$wkcAgu zG3n}I5&~#FW7nlyHshfZ?K5`W7}g}*RH%Ug*3F$D*mjgi#s%>=X;f2K+q8gR88EU$)-$fXN>`zY5PS+5r)I>B6@fgA8$gnr%sD2&_T%MNkegfl9(wja*T~bCinrbd3Ee z4P~~rycuw9VqX`fVR{GqFD?9FFSRk3@}qWGH0jyXAE!+I0Cu%)eWHJs#7yjf}3 zK~*+f4~`GGKhDg#k`HkQ*!mhU!5Z_b!YD7Qoz@dUk0!6Oc$Ic;KpkQdLtvVM14{r$ zj2PvtTtJ2KdZrVVSA^nsg7=zH=s7gLr-_K|T@p`xhm z%!Y99H*y_cKkn~aQu3Dhflnm4n&N|P_sMNQKy&D!g6l&$0(S$^y89KAPm9;)@N7tn zx5`v!LfXlu=2@5>WCu90n_W%fefXz#R+AU(rmUMa00UZglqOi#mMpIftJB$@+-@$Q z(PUDH;ZUa!i+5tEO>PNdnH$>MOKhseaiIt^R$CIDvkS=RI(Ps&2Qb>TPKL26UZ^g?Rd3o*XMxae~FM-@Qp?-oL8`3XZ5#s15Y#TLR zRCb!F);N$^1LzVTku0BF3BRlt*56=K1(Eoh*~sCvnqI+!Y2~Y|J~O)w1%)(Wd(0bE zPPv-UkiCYV75Hf}2NYb+ui1|p3IAYw-c~|TY)qxV6zEVpcj`zLWmH&o#}pg4*cnO# zrEr;+5;9Wxvesb)5|CmKTb++WppnY;>V-qVN`|Jg`>9Pumt>G%y&nPqy{Wi#pvxP+8EsqFmHmX}OBmMC8!v}6A0Lrd1qwVE*hT7XJ5u8yE!C!0RZ40&o^l77ZC6 zdw?(Sk0DK=t2fI=X`S#2KlABm(I$eDu0oyxhw31Y&4X`29NT?yqIrMfj%KBJA`u#! zs=E?jU1ZVzBwK8oS!2W_^T7cMPwxxi}Gq+;fB{hLT9t0{G{%mq@=wzEtB+w1a2x$w#7FI=LY*StVBtV??O6H*$#38uIEvGTZf7eKO@} zK$vWeu`nw%J}|c8NrTC@kcmoRwXqs&iP0obk)?W5Nz&rGF|#Aaj-Wm&wUA9z*YXNQ z@V8{3)+myrebz8jJ0hI>vth+!94V<*LR{&JJUL}S+!V|c9R>=Ny;RQ!7y-2i>oncuTn59 zrb9+5+80@0%5>_jm|~?Oe;bP$QsE5_BIf}p!SwAY2}{=@EQ8Gumr3NPE%o6yyj))x zLx+p{6fz)1zB|(>IbnMEu_tcCPbHfB2t8kT&;R%_X-u#R%c?X-<63@MR;4)_*YOM8 zc{ZZRhM+tDc57j}d4o+#G;6TF(}Z8OABtH^-VaMLEC~%rFqL?S+6PRK6}*BZ!kWI> z`u=Vtd|a*(hmBPY;2=--pwyu<&t)K`QOr?kIYInjo`mqWiukXR*aeYb5$=bYpm+i` z+ii`lZy!^2|3Uc|LhzR$mkdedt>yS&uPMzz=b0dFiyLLQhK&z$MxiGS_X=oQw$MJa zSb~5dUKGQdwVj1P3~$vw73<(7>HzgphO7yWI%(@fHYhLHTLa@aY%xn~l>d`M`?86n zo=^qV3o*DXiFXV$D3*jKG4&WIlGaQTEj|yCI;jMt#cdi)>`=A+u%IZ`;E}0Z@{MF9 z&+WLxQYE#pu9^SA_Zr^H2>3>tC?qO1$!d15B{f_-afZ6SwG%WPln{w|612ao2to9<)-38##%k5*ER2>2r+}~`PxAgXhnAJcoxb9!I43pvt@cDilGKKV)R~H z;NJ%`Xgw9*67)>307~>T!6bD2Mf9XWNz*>w%%jsAJ8XPcM?s+F;Z}eOC17I)*N` z@7`rOzeYE?EJ19?V}V$hInbVT)B*d05^|qqWRT+|tb_MiJ;L3)cq+#Mc*{%VNrMo* zr-67wjZR4C2L+L<$m-?jNJD!WZr@r+MrB8SiH>R)bgQq+gpJs*Bnoz@q`O#`i7Tu5 zBMCz=Vp?_)k5ZLTbg$fGAYUF1dmR$*kIAN#J_9yNK{uOHrls*%OMG6yWB({!SpIA@ z&yt*8xo%wb9(iQj7NwWowM`6 zRVGW0v!3zhr1#mQ*RePzKH6@pC17Cm2E%H#p%}Yp$3cyM)u8=E;!^x?-HV>R0L9!? z_|nbo;pTu5t`Ei{RxMIs{+nnS;5jMg^PwXI+!ksW{9)T|R$^FE#e|>Pe;}bdEl?t* zix+>7l^3-LLu$Q-n?zjFRBat5Ek_%!Y%?>eg4rpxR0QIB#vIB5yY1_e1hoSB5S$(( z2nuE{aI*cBQibD*aMgKowO8lqD`-hI$Zdj1km8^5)gzf@%J7OCF}+tWVm7WD8XU+X zDGgj$_@iWT!y3e^I8RUVlAR%vp2+)gTV{j~Y?%aK@Y>Sxg(VvlJHe5>K|geIEf3eB z3yy1{+)kWr2_>}#ZoG?Gz|D$(A@{)*G0;fQ=?BtQwy!qE1tt^o?I)|RCI+c)F?UK- z5o&)3d#;ibHQTikX0OXnuJz+G>L)>ViSYW%Pjw?fn!5{{Otadz_rtS?Bp)s;jEIs=HrFEvfC6 z?YG{@8JVvN03KK3!Gs<(%g{ z_uE0#6DP#bccJWZ3)~6H-u%zhMu)&Fa0-Igs+3aj%&eeU| zB>QW*!OG>^Aa|(tpS<$=Pd=yp} zDCYU;!#S=@&2S-c7L-~gpU&|L6|ffJCuyQ*#R0v;`L*e)S>w8L0seQ>LkB-A24AE9 zsh410{Vk?zaUqbFR;;my&{U{iO2hLSX?@1}fUt*bJ|MKU-UC|!wlAjA0T6^WPNTRJ z3*jA4l;HqdNP;=(%{+tO2B*Wl=QO@p&x3@KIe$yS5*bYhp3sN&vKzqfOieIav#~ev zQ-{!;cC)JofTPM8Wk<6!6zZK(dtp8R;WJ_JrJR=sRq*8*5EH5E4-%e&aUyTbDYmK* zzmP@3cS2+K_1yVTocG^3k`yPdeQV#KS_mhYTD-^~vGF1vTK%Pn&7Oza%)7y%oH;Ya zlC6CyAAuELrRQieB`UTw2+raPWt@POjms4ka{ES(5T4CK`=aa<~+8JP5!>*YNHL22$wao(#ZK9}0GFI(n^_6%YU-Sn|OPi!! z*B^&qsf`ul=SoUl4pxsuzY0^G-M-h^K60ikR&OX0Vxt4|%}`cU+jvO!Ew7uaDFWwE zAic%QJltfzz(hVTzB^yNXk0@Hg;2ZM8R%cBULiZRW!gF3e+gondwQx{YA__-Sp6c& zT~nGpB!-H~ep2y-J|HG7BP=bw*hSKMec_u0Gr*1 zi7Tf7elguQz6B!n4U0~(K8)LUty<%Ct$U2yVl_>8>pC|n0Sed7E3|L?dAAn16qe2^ z1|wMOH&isLwh>g~9WYmGxQvA>Z+w>!sZ9e=dWK#T*UDx~RcEeen*n&;-tYN${lMLtnk_r# z;ca-p80&e^Ayfi;o_%X3CaQvJeHhZY)t=tg4%KUfHvWJ~;|(c=o`ajS>XpXhYI2CX&DI zl!9PB^6?uzIjtXVV_6-8Vk`zRm?Z2~frl7YtzERMVvgGQDt_NyFPwoF%+(9RQ(uu6 zc=W?Q+kbSx>Q3MuYd!34^FOh6)o=*F-@YTQWA8MwUg_mlW5;$fSv0TGm z(WbK)Hi)AzL-PAI-%j|BJiIYaJe_ozIP)F8X83V|4?yv#JFiY<9m&;2#2j^lr|uzS z?X-GU&X2A3hawN{J))o8!KQd_OVVXYN<$NHp4z- zGsCJkG&vvvDuKPI;Tg#0C^=2TB+!KHl=`?9^+TjfzEG4I5e~EqvCmaf{tO_nB&=N; zHK8}?t~sn5n3v@$!^q@#LPYVfa*aFldj7Zs>tuSD*n~6ySzFl4>gnERQK+I=<&H@) zUOudTZo;!dl)Q_mU~Y?CJZB|&qNxcP=z-UMIB3kb2kXR%>NJ6CuyE@8UQfqZ}#A_F=k_W?ZzvMv_t8EWDaf(J@X$FqccMB52-k{zrVI4m)wlZL* z{xQ{OF$2$y?}ra#sY`6z6rx0h47*NQJdz|v&4s_R>R$s~=M+h(UL)&^C-g*bQLs9_ z@eYqI^}`?O9qfqQe^H9I*Cc@lQ5V`Ae^QisE#=xO;buD1k-zVTKluvfC}w%ElZslq z(OjDAoOuRmW^PW9CjO1Go4ixeC*Yy)y zAjcPM`+pfor0^`;u-7Qp^q1(r;X6qimVgXELsOQWLz_W-TompFV!q7ig7jrR1K&eh zpPwZDH(Nw(Cz8^~8@@%_sO-sSnlCC5uLzPa&ULorIfs)}ug^yigmY-(T1Bf78Wdb3 zLd?YN?r_IfazkY4c0)7*^a2hzF|eg7D;QpS#W+#H)AF<*+%d%8FF=oLoiMWO6_LZ+ zD^j?R8>+Z7*gY)@{v#({Co{;d_s#3I)kr8puvCR?9xb^vGHAQhG$-crY+XvQYw7n4 z7T~qS(@pWSckj%%O%v^8>$xj&Gr3a2m5O~aNGV~EQox+Abh_JF~#f~+y5n5#*wax@zh#}__$U!~b2%bXzq(m8&b2Mj9# zMN!UziC%Olv}A_p1d#?2C6gIda^2AYmxW=$L(p$pbo!2&MS^w(3yDXD%x>K3VDWuc#oECla6eW@)Y&qjVRyRL0vLNi{Ai4 zG`>HMzY@ovXOv6p2bB^}L$kMP1f?F)_uxHFu^+TQX}xl5_H+7`B#XDA);wZ=)6h*t z8ebYG;tJDD^{;^5*agvX?M+5t(%D$No{m_VE-ts}5Q0(EA|=>3&CQ1I{WZymm-Fzb zE1|BX<{h4fvxcUoW-#9>Z7mXoX7bK_*1zs%n&}z4ll_w zM_-@)Sw6Tm`+4+25&Y&By%u|P8xY@uV|)08-v&8tkD`xZ+V^$o0z1F+DUOnt`^*2aRTOJ=xlm%R$nU1byPToy(&mC@T>UkE zgVdg4puJcSB()dD*dkbC_lX)!UXrPkdT>w>hAg{iOX++!Ko@#5O)K;!S)+$B>g(+*! zJ36$hjlO_6t#-$Fwd#)P*SinE=l)w-ZM6UGjtTfsoD}bH`<^?hH{*Rvmc3n{pyP|3 z7hLQ1zSydP`;e8L5F0hved*EOmVrJ32{6_BW>Ry8xdayPw9tYjc3QCKI9QGN$W_wjcEH6-L&>;^=lSKaiP6-Rd+o|x zz2W!zb;xxz1KvuQZ44nhrs(#xYh9EjRdRSw!)I+{N`2LGaYYIaZTg^PhNA7r4*voT zQ}LInVJaHMK?X#f8m3~Lt6?g}`5MELH%z5(>gI;2H)GFA(HMqxC4C?x(BxKRPDuS* zR@(3I1PG=NcvlXbJ&nfC3D(>eas}i4AEJ7kl--fZtQY2mL1knly07^Am!7!? zEtH3-`SswJyLoR~Wu8bHLubuKL^5P^Y?;|=nS^a|rv)2SrE+DuZc+=2{TT_X;b(LD zFxF+b`AjHZ;@NueD=CS(0458oBJabb;)b9Q3$V}S4n%wauUmak%rk26c5gBb zX$S!7+%KL&Evy_(IVXQdx@6jbO?F27!r_?wfNT@`&uOJ518X{wz$My^UF+FP@rzuZnPnLR{B>i#he?3^eiSQrcAv}COz0IJpt4kR!g-JMy{1xBO{+(stbWV%?S%5`8Z}mQrXPv$0 z$iX)}6z0x`Pygra%;3`Ckh{6OlhBQvIEu!8iu+i<{Hw-l^RRSAx!y7i&#f3~UmE;= zUgQ_b`^z;rkCBE_claAZA|B0ulrzPLZThf{5B}Q?;UY~fxoq;ojp*OFC!s>+a|tjIuAg=ov+lhZ_J5>^PiLcVM!mB;)h-Ou!|26faM)RYVjt& zPG!|R!LOsh7NaQ~I&C>dKxy#DIf+nO8ISbm3YO{mlU!fe!bxV)N|x{BaX_KgdTK2M zPHW3!z!ZfU@`wD08ahf|=dV>Q<&1tJc3c-{m_~^j4U6Gr7-4$iK|W*I(BUSgd+;!^^WWFS!YorwBho3v1XG6B{O2?avBy1>NTVaMcfSUs-hI$S%TXc{J1IFE}f& zdNez6Ua@KbuqQ0OS`vudmy;7?dDOl-c8>4Lql3W@b~iVVo=EK>lOh|zkKMJ(AVI?L z1rj(cb3=;wW!xlG2+1TyJrnyNYdfA86+ZI&*umA;C&uSV4_tT$Or}kHShHK4-@$+$ ze~f?y_e6$A93XNWhm3+i*e}E_*;_v1)0ctvkTBTMyd zpe$>Rz5;&? zKm-xfal=0g-^J-enr@pH5J5Nr6N3UTjbK59`CQ#V&sumy^IW@&1O2%R)*v93p>-T$ z8*5Ak-&*AN7Z;Am?zjJCqa0-Wqt2-gLLtymv$zDc7U9)rl}lSZ{AiOODPB|OBx)ZK zMM^27YoKhe?svT7aq zcJdcodA=PW2ku#T1YTF7iNk}Gu!M*?=qW%-=_yf259jaH>@i2)!Fc48>-_KH&;91% zTZ*@fEYQDk&B?Y!PeWHw7O>QAWwjpQuea&uACw1_kwc&zF=HlQ_|3<1oX=l1LHsr^ z=?y1TJ9Pt@S&Gf@Ml98mu_s&$i+d1;XAutYaz${NxSUMwd0A*FX0ptL2U(b2 z9=Qm(%*&CHJ_U&wUR??~wS$sP#Y?>tSdAeFGeBN&QC+-vgQE)L$5w0x5I3VkIfI#L zd0k{ML}}y8fS=SPhtx*Tf7j+&GSBF*^m#I+Li(1U6l4enl=V)Qqjx%Y$-{quAT#cc z+(p#1#nsMh@|O16P=F@L)12Gn)qj?r8CeZ+f{yPelTirPW$fem$X#w!nHi+};a4Db z>5T{?9BEf4-(wp>D?vldL6P}$XA6qVlLBbX{Rh`Tq_8@nEB~HYsn+v`IYEwU(en4X zHAa#oB^?@kRYq__ew_p{T++`Y65Mt0d%x*PvFliuq6g~yW%7I>C`Il1vcWcgpq_i# zM0USakLcB>0*VUGK!>%O7w~XB5i^Wn%rRk`D*Q1QdZ(H0Y>hNNePdoB)s+1&S~87< ze!UzCXL=~)r_^}Jn7=rQjb)XGQRuV;rJ11*9nK{QIr2Tz%VKW1DiIfNUcRT+DF3sEkkA%K?S!i*0DmIUuqDS5l`5># zaTs62gj5A|%Kml71JMv=I%$UsJgsk<8=F@sOcP#jnT+r&1<|Y_qZ1|QN|z~KyFY8B zsyDF!q&{bsss$X?Yc+8Q`(mg=`rtfRrb=Xnd!ZRQ3n{Rsm=1M z>AC_MHJ7aE4V3D~Sf?nnA;w5gH*gLRDdA@i+Xe$o7a;{Go8JSq>5C8L`jc|L_}b7 z!=reD+^5S*UrvJ*p}7(fPYSw58dS zJe?Ll(t{`@Fu~%Lg>i&uQEZ{KUYI4+Jxsgec~bAq@gPmH%70Rt z&qS)u4|ANEvou${YO%K{A**u<49>cqbso=0pFWSre61kAqZI?{PZZg{L3YT{l5k`i z3>$fUQqv(ZdUA*Cq^UUuIX5Vs{ERu7`hq?ui-Db#H=bJ#kl)-2ZV>W(! zu4=4q_ymPpxVywT<;$F+D!DK@^^CG8D9w*kE?1V~8UZlz}B8-iV_f?N1s7 z`#UDTa?BxblVZZOg(uNP#si&yYQ6M$AuMHlYpiR`RBvg~#a%+$f4bvsL^K%i8Vno2 z`%GKXFb?b4IVCG_E>OS)B9Cj0OtwPNFeGP+3ZU_{!jBtTxo6n-tcq)+$|L!e0BKFx z2H#)&Ggf0Bh}D?tS4WMVhS~@D3qFP-Lsp731gT?efs`{^NrP>we`x&)@w72C_N~h^ z_d=X(O=ZojO;;wjXdP^iaDR`|=OEnC%Hk-C@gR4#1UTe2lL zqL>&kUxTo*Q>F~;qWZoT+grCNS5_82NE{3#T;|sF4rv#4cPl-;BU^_)@f*{doUQwt zor?w-hFDDXzlxhjK0uZz48md35q+M_X zG#18y)KcK3jiv3gQ_Bbc3cU*s!ZeXunDh`QH_7aW&cK!Gv4Thj`-YHO&9dr)1@Q#& zMp&6Xzh2pRa`RtuHpfa+5by1Co2xQ!8`pTiOtKLmx}0q=*``kEl-#ga&Iz=+5j@w^ zDH&Ab!LacN-zz|?wEu9Y6V0Nut@(OU?luCA5+AF?N%_3YQM3R-iV>OfTIEo`_L&hw zhK?Ylb0fc`;_)BIpbagHg=Kk&H5t}aT2=p^D0w}X#XTS+*&&0p3XS&~xlW9rX&{Qb2;6AxTKz+Nf zt$CH*M6QVZbh8>Hq*KuuAMXalDry4uGO${z1U|>2ch!1M`g`3UIES>xR|S?E1lkZp zS`bJ(ft}pR7t}B5-BzZ*1UpdFcF6pom8l5Yw%LQwK3^w9I)Cs#3widU1~LtTxHmBA4&a zcs11-t@R{xs9QZ)M8imYHi97Gp$A>&0(l7FlqMR(F0lcB5EN&3Q0BL<+)Rm+}e$(oLKpadp z130>u!HR2UytsxEWF_^?SaA)5O5zghy$vP;u?{}k-R$T*a5)ZnL-L*|Zw7`Z4<`d@ zgc@4bXpC~zIpmdd!RJZ&#hWt30nkc9Agc(*{%rLG$hD!jBIs3wk7s8UY?%!|ri2jM z2r3DMhA$Vp4NVJf#JLDP$Ti)0fZjp&5kk1Rco2_fjH-}v5}u&gP5#Nc4UIaDqPQOv zhwY-({OiO_$`P~CFi*T{~Rqb6N7&H4xCctm8q=3PotuvuFM z9(3lSC9z{jMojw;@vS>&ZPjCL$~;?sf*JQQ*CGpUFZ2bPw~PzK4`=Rb@!Q=&kI} zewzku$5B0#NYK$(sGlbq5*_H98rF$Iz@_VRYSpipXfyQqrs65Ki7Lv-M+LNl=6H^> z4LOG8-U1D2m%A(#t)x#4N0efKIbM@|4C6nXe_Hk}yZ9-_$$;wPd=_K-xJH2eN-lfb zPv+t8A7TcBXwBEE`2nLJS(RKrX7e+;X_mSkT-}*)3WNU9CuX`OzQA**~7ea)~`$Y(M7u z_@NJG;bR{ZG=L#$6_$B;=xw?KK}K6t+2xvWDxGi_R1tohJdoZvr=uktAOZTAYg0y- zTNqp_4>5zQYwby@M1` z-tnXUj+msP;5e^tK?v7B%Hmx)E80MHtC?x}tsu}LEvQXGQu2afU8bhc}J85Pq^%6Mc{q}bF-iUh+B$ULNFfVkQCzf9$k@jAVNcvfool}kjp zc{;baJv;>|F)cM<*H&^0CpajwarFwf2mBvD`lhFQ1xpeB`jXE*HqaRR#>GdZ!<CIhKY29?)W68y6a9=ke=o~XITqO z|M5IV68ga_T;?~WBgFm}<1{juY|2M??$VA-jWy%yX=}tcO4i4A7uRiWM){_Etg>F2 zv*!xVC6MOI!wz7KGaSUWXE;PvB*Seg)RHgJj&r|##L4YCt9_&|@A4zt?X312imw?p z`ts{XyEMFVv|Gd7BOGknk*hSkYJ^LM4!ffj4fl>{g|@G_Z*+}@^?Y=##s~A!bsFE0 zk7|uqAo6!QO(62orm6L>3l7R4w=f{D!NFz#Lt24Aix;nqDg+%TSejOVGh2U|lCofu zI%B#8W-4_QSf5QF{HI?+eot6D9bR?L1D{2!)6}B}WZH;v z4Q0}xZ7{`o@?-!+i6(~-(r?OZ9&)Au8Q7O9G%K!HVg#?}SF>H1P}vD26IbjqeQ?8h zPk?aF_mh~;KDkY#|HbZJZl&yuW)Vg;qO!&Xv#t89dfi9WiyE*JwSd{T!ik1JtN<)Y zTpTfvKE!@&GCXDB4lAbE&S&)y-=>5lJNE{5R$+buxp4S&xb~ahNgg^J795Z(W1*fs z6F!M$xZpo@PKWnVlZeZ98+N}|K+VRwX>_52DrQ&w6eJR{zX;7ZKLL|xpqr0g|ksQp@Ku~x2`CM6uzUbCAo)8G5EUG?m@TvXdnglHkk0618~-WU`RL19e+7DBPT zOZARRC&7SDeKnW$3>oVkHYl*Pc&Xlf=?*1ekw5~m+OtHEN}sZXck;x0m((A%8J+3uT+0gViGi8$y8IOGQLbW-jStl; zEFVrOk6i-`T4_{kIH5^q=Cr`sX;3KY!SO~OH-IXqh#k-;=yH!|_~V8@!Tu9udCUM+f7^q~w zDRB*i*Z%AP&ZB=&2E+j~F`MG(^la;n*c>f!_d5%~1jS>i;}?Br)x8je#0%xGQKF_^ zBR?fpoN=lXEG0X|P1BB|Onuq+tz@g9VkJjh-)eJ+lS zHNq>x&$BLe`iAp*QRce(*t3HUC}9zlnica%lu$2pqV_O`~?<2NUGvq)wU);sd&+BK`$e!kL+eShMTo&iE6 z=aklo3NprrXns!PgM7*p_+S_i`kNN%nvk{+4stku;jm+is8_K41zXwlB!O->vVk!+ zGb;R%fd*fp5^s_q^ej-<(}|bEkNg39UWMcc8|%z-trzN9#eg?Q%@7c#GC$4vOk5&o z6a(Fr4lv*V)?^0Acl zZn<8{n##4i8LqmyILmPL&Bd!2aKqfgKrP$74Av83_qM70QoQ`4?3oZ$oz)9`mQ$9!1IPc9@v3=feeT9Ri$k|vzRuUtqeY1HZLiR#2`<@k0|; zO8br%Z}t-L6HQF!3G{idi8*K2y{;rtNaGpTnP7_0r+3&3>O{9B(DGn@(U@M;RaJW4!Iv;bj| z*zh0c#>zc?FG>O^Tp~?s(_N8ex5cfO>z zxH)-rZz+DcQ(<4$RI73sosQqT{Ggm^={hggljV%&zlTmsTp~xLF4Rl>=fQdj{aHe$ zlF`KnUe15`P<;oUeQAlH6LXF&|A7upCePBclXPKcnjMG4X$yE6{fb~V3acKJa~v_m z6Ho-DU!!4MG>*jQTPc$5%WA_c)gTMol(TWB33Uo}_oe62htW{uDtrMrDlyh6rC8zz zK5TDh4^!64-=+v5qiyDbIVx}x-~H;_Wb#F!ZMunLg*x|>I3U9}1;=LPtJ8^HNw1jG z7jqL|;MngdU5K;$GCI-vksI*JEJ>7!BR5Lxm&b19x1h%2Mb%NI_&q&&3EdXQi*iu# zu_&ffGe8u38K5EZm;_15Pbfz66KN{>i5QjqM2t#)B1VM|h|${_5Thp;ke{d0eDI&z zehj{6cd=u0-}sMDFmTJ+K`(LDnL$S+GHiM3wD>r`#S#)7UCF0axDmqv7&ya0Y!C+V zaT?CwHrlCAx5FG6PI#NIQ!qq6$xX!|Hx*Z2fj_Bo!V){r&NO{Cq%S2e1{c{sZhWbBjKsLj-0+xcq`BgAovFHnT`*7G;z&sS-Yh(pLr zqSKPkf)EYs&^&M?fDoLgEi+@ni><5!JP!N9+wnEq2Nui!_h+M^#A^F);il|*s;J9z z5YJ;7r7_BIz_)@3)*9PfM1UciSkDb*{Xnx*t|1zwOt^=JOoB9kBU$x(-J@KO;UK_J?kO3eEF!o> zEonw2I5>;QVIy7;3guU!Mefh8ks}Fqjxh}D;eFu+f?;uq`DG_TI{6Z^dblDy=*pcU zI+ES@0(e_Pbk9z=VS;u3V6zj)fbohdMbE`4I!OZ~!rNi?iGzy~SZP=MVtXxoYH+Z~ z`rjTUDD%XtKu|*xR4ix0I>vLqm!23C5GjCxvI{pchb%IUM5)?udY)TNv|bF`B@uWdN*MX&XyAyFr=He4y+YgX@dyH6W!bKM|hn0)M;1VT$fr9JNv?KR>? zz8Pbfj%I=O1crq5ix_phQMmXc=y#ikF2NvUHHmLCdvGE-qq0H#$knjR56c;9*rx0G*fRmTo7?k8G3$@(q=!k-nRdsXRjG z$Hj_b;#@#Pvo6C$_Jz(eV2Kny>)yBTNXD)thB%smiqWWJan?E(39zA$xR|_zyg9NFRQsVgO=ye~(l4$On^Kdq$po z6JG2CuIo$24;&RdOy81l49}+^wFwvHI088fA=7|Ke>s9d7G?Vw(8*UB(8AT53{_6O$xIpV)H`oUy~%FpOO){w3@GEL z7|fYv4a;7hbn=fUo&5WD7fTmr?uUXW3ss)nLML~p3OX|7S5lSbRAG=)g+bYl40~NC zms5pLa;h-MslqU+j7!lqEnH3&ev?y$K~5D0IaL_$8UYyTzI~fYrUs)xC&gvs> zg9>Eek*~)-$_C=Yu!)MAzQi#l5Xv#-ACZV;6G_<|D{XokH};!dvN0qlrM1xqN{w*_DsqT#+6rjA)pS?rcc&9@AETv!pr1-i=Z#x|%-y8L%m(&Z`M4*nDKs{c! zgNQuF-u~=HSqy~YfMu9{HR<4-b*F`tp{q~G!z9o!x!h-Ar*{p)GFb)ix2E@S)R%@) zEtj^W{?1V&XBM2%$_~L*-D4y%kko!M_FN&X!cXDE!8ae(!Blt?dJ}m>=t0Ii*n7FY z@sP?9-jk7kih&l=3R(qf=o`2S?23gB1W2_5roI5k$l|O-3z3xMAp&A67XO!>Rn0+kO=pG96M)(p`sc~7*s0;bLEQpq&K7Kih@aXl*wk7Lp2;5 zo!gvTFnGh3&LwH_Gm`w|Cy{>UnCzR)yvqr0ShI?>VZ^);oH0vYXxOX78|V zVnt`(xui$-W8lFMvu#GW;FcC@owB%R8PG@56kHL?>imcr_?ZtF-Snq5nWz%Q$@qfJ zr81Q`51pivk%^~3F!q$F*2G@WtzsU%8bju@s6>TAGk9II`+;WpE@P`W(uA{x@ZA~d zv;ntqU1>o{AJSCNo5Y9GRHAOw>Ui*_nVEWboWKLkRd)^8WnXAQ!iGZ)NgQzyg3U(> z*0%h7zBqDWR4~C3{A9vTF}saA;h1Jkl%jF)QaY%4S7>APawI5^HA@p3*>cCU-dHnv-~niHS#62tvD*{;=z{PB?XQzZCi!AaYJIl<+z73 z6p*$+!m|*%OPw3K1e2v`ve0Za%%()4li(N3Sz!4%QV@~Zt zdS}zePDz^p%TP=kM~lOM>Ls3t=`Yb%PrQU_NO~r$i_|KeE5k9jaRqD>M}5YLd-`Qo zeMRaW4oyXr*g$@sR>{&tele#qTHnU>5EU-`q$t2(osHaPoRD}R%m6F4`qSK$59Oc1 zPl41RR3}!>tNbr?6926vFmZ4PRh1r+NzslX$6v#+`I)Chx5gnZ6_$ZyEf9SG0a&mN<7*{T< z?`P$X|C3kZsWcoPx85k}vM{C6=#l%{3sV?I?~d|w@`z2)l?bAxh7_-GXKb3eXf`l&qeFCgyUYj|7|>V zI+QqsK>;BKRopSCcz{9091J?!g+ay03_9C|L1()#C~uiT zdCLqsA(lZW#4=og^%%XU&&#k?aMsCwgacyc84TlDt(+c$+;!ANH}8+ONu5NaJ|R+( z;7GbT8$#_maeu$vkpDuxEqpP|QD-j_w(-YMs@q4i9^mE2o6*5DCjwk3*IXoEBrny& zlRT%MdOY3=6dSrvTb{OcpSDJIgG=p8-8#UDf^IrjeUdV}F*z~$)YO}IuvE34FYduj z#587BvEpeQXJ1p7ezwj0J}LZyNj!$%7|YkzLDhCL}e_h z`iLGC{fu@|A_x{oDuWAmtTOV@j5Q_CDK?s12&_*29Zuy{5~&5D#Okm#rV^Q<2{~hx zrtF|4T#8HnPAa(IkRX-;({kUE+v>bJ*sK!{SrBhb9V#%!c{ z0d2;C)_T#nHC+^GJnR?f4QNplv=^kS5*0(?4zx(hl zx7_0txQ_&)1F>>)){a71t1E1EaMiY&hqbrBqu^2&gwodu8QNuLGU#_C~7cx8`6VZ`pgEe2+0D8C-J4@vrlzx ze599v$Z{$idTs3oPi$S+<}zBX=kcE_nyO)s4@; ztQ3cqaR?7>iQ1u8%BG;Sy@M4T*#HBO`3Wgf5wRoEKh^6Bp0drKA_n2wU*aig<$hYq zw(uWOV$t(nbagr|#qzuAEcGm#4Sq^WR{dXjIw2*d?=b^E35ALW1X(-=rOo!*&MUWZ zjK&Y48_c7*?X^ywbR`kpp;Tpw^G_ru;Bb>mv@dAE(7k~Qny;J)MD+zi;<)mRQm-pz zji8PNvgH!3`Gj7!mjPesJ_dZDq<%;tQ;mbA`C-p0O`$J;#%&DvC)UzL-fwEw;C+jm zWzb_2o=*&M$sn`Gt$tcEh)9^ zWRah_j4E%LMFV8f5FY&^)w8y!HcQNCzytgpM4isC2uppT3}>6?V+IFhPzq^A$%mQ{0l??_y~XUf90BRr2cD$#*L|Mz&pI`LeW#o^6qhOtHFo zuCoT*;+^r0&N>&|)dGcm1O*v}q9u=o*KFj&3vHDqbx^PpT{RY7x(ZzD;cb!_>QBxo ziXmBo#%&f-6b&(`z>yBjM(8<^VPUgvP7sN0XXT|jWmY7g?q&hjjzg!kcEel9VIayU zUa`;$B8~#UB=}5L{d&Gp_2e4YF$du~bd4;&IEoyE>ul877h+U~EW7I8F|{ae##gY5 zn%amiOcrWa$B?z~wsnjah+F-@t7T#rm-DL ze4I+u%_`i`fUG#;h$G*Px+GZ#99dbLOLhC;kC3cH){*wQ$nvlAl=db~r zBnaX%dVpx%Q6tQB^lmGp<2no}k%T9k9gYWg6CatkO$I5k)U65#-Y~IRo-CmawnUVQ z0$V6Wdh);#PYg|ak;o)gbAlnX@IjQP{hZivm)ir}cd46;$A)6DnC+Y<6|HbRM?e3wSq^xfusxe!Ipwu^W_qk=mPf3 zl1O){&2KKz2jTA_rt0|B6H=Xg?O7MzxI(rP-m@;eXI*%c=^_dy+eE^fxSxbK1>+Ll zmP_*QODGW;=@ z;jgfESqNjC{qSw0>6sGoLX=7#SUE<(hK^k0h-J8?m!2R2*8(2|9;q z@b~@avR9UM$C7!9lSSq!gUnL~nWqfTwpUhcWFgI5g5BuGa`s3WWZ7l)y&PT%Fy@ZI zVrVspOi8$_*jX}$j`IC<8yWR>aX*H)jp&8%RChFQ(h|*E2zRFKx!|swUbq%k=~4xE zs1xh>I-{y7UeB!6)2pa1H1zd)VKYwzN!ekr4#kR;8_wo)Mz(Q0G5iTVf-|#Wj93Qr zgTkXHZ<$2<6L}0sV$GUMsTXKQh292hUc(h1l?mkRj9f6rwk7%=X|ETG0ZG zPz`3HQUIq=wNY}J0Ohzw({i$(MXOYJ z1u05A$J%LHn!(+Gru5!hmbshiLIoM^d)-c=&B{S9c|Be2k}`pbp_wMF3`pOYHz!p2 zsku$S(yUW@Gs~+u6Mi*2w#7B}&b?Gz#+A$Py@1B^F&1Ne%c9vU$dVvHZbW3B8=(sj z@L~2NlkX>$M2>bHVc9n7vbmci@H;5%h%a_~Sbk5Pd`xZptwX=X~BVP$5@W&2PKete7G%M+)4kRp|hGG$6(xq9iv7w(sH z1(t-j8*(C-C4r{dg0kxc1Yme_%)&I-=+C2_CgKL-q}GVfs=p{fpu}M$1VPXY{19VO zig0}no-iN-72FruL*osW;Hu1lF)}2IRn9raFi3Hq&V`6Hn>0BinkI883FX{PX`*z@ z?PqkH0SYnO``q?tNV3Pzi}=pmj&v&4yjOr$+H_bee{>K;#P#98$VSv*6Ere-Nyd_= z4N++WSL%1EWlhfX`=>c3Q1@^phdfJt22y}VUCe<4G~kakwAZb=hY$QZ_|q*)$cAV5 z#e{joON2Ih*T`ZweR#rUz5TBEP!(Aq zsy2!1W1>mH?8{(1zHL$D2k->gC{+r~?KGmgBv?HvLT0~2RVB9gM&1AOo_=%OM4}YN zJODVAF1h2_P;eh-R1heN%!e0v-??X2iN-!{>aI$M{Y~9f>oJ%S<^nT=sFOiX1BR#T zuzv+a8tZsS5~Y2GstwGWA1-L)>kg3Z#J@=gzSE@q26?WGaMYn6eaoQwc35nJp+hI^ zq{^nXy>c>7gASN4))FBr|1{rE{v#t;Sp88hb5xm$=D^899>oEMuL(lF3BUaz)aOd) zJ^9PSxQ~j^hCARA@nUGGkktF&) z$&fD~df#noyWaoycGdXflu6imj++yr@Ft;9-BD;Z>KpKxhEX z%GXH->QO!k2ZWhNVW;O;G|lS&Y02G%HAS;fmw6D{*J?`swLFR&z8-uT5Do_@)|{}XO%Wt5qb4$r1l+39dE_t+bhGRj5o#A9()^UOutJ?dzk2y~{&LIj5yezJ-Qrkxg+fxPf0DX|$BKbn!^&Y}uQA5znbGkmXu zDbb0@)H<(M4ZeZnGxPgvuvTwn1N87b+TkiT>++$%wjbro?D)BcqoKgNIve~+2O%^?6kCd4$px3fmm`v-I)iPicoq{o zR!|G@?6f2_m03yjDy#)+g1t;;ABC?>+3H_m_p-?O?o+vWC<e{4yJXIA7n@cDsYv2iFgSLui3(pv&e=t0K;2hVC2Q3&Bv|v!sff7DQlbI3Y3{`4keVCwbK?v=kzjI80Kfzkc~@)9d1skAL$>k z&-l9xat?XcwgI z@{AgOBo+{!f9&CU={^<{jZ=I-np(Zh!YWJED~PbMuTpDCAjGEqB(f# zZqCS}LS@GZ1Dei+n~tMJ%~)ElO`emya{bcf7gcV%Y#8_9M7VI>WBYW-2gFY?0B9Y!61F#pZ*?c zLo*}Qw&wR-482!}S>*2Gxq8TRC%)<2LtdfHW|qA(Q1|SC-J^i!dB>We3cN}1;?s-p zysNG%yoi28;v(O(=CBO%wqJ_BH0& zrB<=XX9nRzx3X!aP(D{~Gb%u55Z?Fsj7)3(%Wp;w`8)>L`Z9rpr=I$EIM*KkM>`-e z-v`+L@)O_v)7|6TPJs`{t(@bcC+_E(zxWcKvHtl2?|iT=ca+ecYgTrwCuGkK9&NU( zk`gb=Nls^P6c?s-8l?cjPl_xBYOUI|6LAW?Oh}9CggCmKCAE;1Faq79JeP4>FlRvc zKB97&<7|`?+r~IcbdfH1Eb^)Q&sma`)O!F%M?boN9)qLmwEO1^>y9=9FfAVqlvlpP zw!90ZW=Fl!z8=#TodR<{QA{SyM}RS^lj z-U@AWfM-h27P0oii;lr?As<8Srn0A;SIq*94`W)}X2K00F)?n$9EDF4YyspP_`M8*MrW$3eWu=Vs*bQdJO3@R=O4SDuYCwfOf{dk4Nu;3J@ZJmO##?~o ztUlB=ABim-G-tD=_C$25#+z;8JG}Nc+Rcs;SCoUq0;2*W7Co*+#1{)MjZ5)tpSkKE z+x&9r062-I1Eh>8=t%P1Qc2Mp9b)seV8PDx!|ngMawLe`)Nsf-&yj$vlp{f^gmNS- z%rc!Lv83uT%b&QNfmDeT49a9pYD(L~;cxQIR_lb8D-k|I!FDGT14_u{v|PMUQOe+E zN})187Ab=hj?c|$9e=vcd=aWxaP%r$-L%jhZLY$zJa#Cp+m6&3yua9-RXefhvC9YD z$2~un&7)07FP@K#e~c*cTyFA@AZcuCjoN7v3m88`VGh zlES7vXrW%@?w6KwsrirXFGeJW#T>CNrx_2QseU*g6+&JqIy_KTIfTy_lKs!vUBE0= zP_hArAshT%{~@guCu>Z-V#zIuzPTM0#G#k>Qh~P&R#`blZtkdw>J~tgPqB%>!f6ETZ{qj z!@({VRIVXo)vr7}xZXj~gCcq~4?Q7=1e9<_kFeWK)MkSpnkjml&4$&n*V2+7;8kul zFvx0PAR}DE64Hc0ZGsuvBYes4xxwO@e0c?Gf15okA0~zFnxooWv2Sv#n6f<8V3q9! zxBCq(R&sC^?&`bcskVIzu=rLX$&NN!=!>@ypa{cTL)4x?4Glo8J}cK{aZL7_w73$@ z&$2EO3zBsJ!q7s5))JHD{j|rD2>-Kd=>Pt2wu+a6e^R_>!f*Xj9-jCEXqIMhakhy$ zg};Bh$Ss78KGBpRXetYwSLfA~)n72tw5AQ~5iZP3%3i99vP_SX*d<6JIJr ztWSL!c$bB5ss5Y`6Qw7q#4$86ZSP7enYC1_WF}kBBmY)ap@L>Y{;ILCco?~TUeJsz zs`+w2#$@6Ps~9TT;H%}MBUQ*9Y#{B#xkKOwK^;P)7S~xiGZ2A)I8#RseTxSt!#k$G z??(Ca*pC{zz`P#mZaxQh;tVtpHXB_Q->(3tlSL?z1Qi#@CGQ~6q^N^U%n%I6d4gSI zMYhKC3le8tqo24K!tO52cRHP3FYonwUH&fzVK}VlN&&VDao>!Oohry8ybW~k40{;7 z(xnSDdrarB^lDf@`I7T;P|<^-kG_h|IRg@uVdnU}e2VtNdgnZwsM~>G#zM9tcuGjPbhGYbl zl!;nnvRyCI4f4d?d3c2JaVFxKto;IT=8c70E{O+u%q1a0E|O@#iiFKfPW)V1E^NX zF%4}sGVBxzn+rU`L>9l{9ukYs!t@v> znJgdg#`4qQZZetrW0NNVOnidL07i?~qlB!&L^Nm_2t~K-X2Y+s*f{5C;317E!cD7X z18`_?qo?rWu`}V603R(eyQifG7CLN(6-UI#SA-J09AD}-*lhSaEn4TWl_}3vA!Sd? z6uS{~OIzZJua+iMy|dtsnDuIRqzp~%r#2;Sx%q=MwF!rUDM1UEru@OiE2k2PA3nyp zJG9eB`As{MiZ=4_e}DsX;6O}M@n|UXBY%k*rs7C8U~fI=6$KO_D0(;-2DfHz zCVBPCb4)*`ve+(L8Z!^HI{1BnTAS(1_Y99-tY<}HIV*A(kT>;xRM zorHY}89ecnKpcyS>86nt@D$Gsov(hj`~vBq#00@0oNKQ|g#{zn8U@u(sg(~Ka|t=J zBwL_M;+A?HWPJIkz9eKdl_e~if=l`)dLAiYtbR^gxP5}zBqJ4PGAmC^OKlBd<;oAl zh~dA0R?8IZ5!4{pNf}^MB%@yCz?)eMNfIrw@K|;NR6eNp@9_6;fV>)l<5fH3Tfse^ zyh_lb`W^JXbVpp!PG>6As_^5^$sYlfDK6^x`PBc&v0RX@3XsL}WA!l)-(~l+O@QQo z4!isTY!qKi;s5T)zWzu^NPRb&cTUb<8Fr_e5*_f^<#_QM;bL6M4P+CRVR`yeCOMQC z0duuv%gl%vs7?A>IPpUDwNsnQ^RJ4_CSN<;Tm4=huJR|N?{IrPNQFMVaCMx?8<+_x zdu6!VuQV>0)HD+oR`v3QgazCQ+f4$!(6Dc0elupW5}*I5I5TlbrH`vmzd0AuQpBEg z*a#T9BViUrmC+1&=2kZfB7y}CL%6DZP)k6@Z7Lp01Wa$Uex@}88^4#qs)ukDN}yR= zQze{P0qudYh8+sndJ2!4vuBe3JecvLKfr%Wws-6#nAsad(h(Ha@rPMhw8T zH64-?@inzR7ovU|8L|;kUH1ky3GDx;@~6fYyeFnS+gzH#>&l|L*)cPb>^X^5rf&~j z(KfaF1{4)jv^%morA zfgD00T+VA|{1O#9zMqm4wXu_N zkHu%!X~PXp->_KA5rJKb1EbxWRUdLG#W2jEz<{(IZs3@LBu^ zK~12?r1UR5{T5BqiKW+UG*7R9act06-C%Hz3?^BMc{zdkr7;iCxQoIgU3rqrNDYVp z1{Fh9y&05l*@`HJE1X61Y$|HUtofh9Q;}T~eH)-X*b9J75yjt0G$7;efR{sX55Mup zOs{%ZIk=mQRz4rZ4{dxAG(b9MqF~Z4EJ(ojjXDHEf9aYa|69@YS>#(wdgz<; zMu!CQ2lqSaaoSF#=FZ?F&mp6Ce^ZPTk+xn;Y)^sCU5ih(dM1b+<>vS25}eZ^qG!#) zKl{(MBxd;}40gk+QfgJMd~CdU`1{1Vf&WwQ<@B8O^_P%nlHaFRzG4DVP^Ub#_Y|9;0toW($;|45 zL}_W;#b72L5OE-{{$ByMB}ou8I{c)MirW}#jU<{?f73eRi9kky=bZ5w01#Dpt8DVm zb&8qI3c$Xx@-q%DO0DG67tSZY0l!-;F|&fRD}XuPUyARK%KYgk0i*(IC7|@fRTjVZ z@>@$F$Aj?-@~T@Msh%-25=f~)OOGMgAmH^9xmDkg;Ea6X7jcl}&%_2=KF!vV$#a@x zCzK=#^wmlh!Cf%`Fp_Vqx`DyME0|5vJz+iU)svp31pCw*oud{!uv@(c0Xt@^OcQ1` zff$;wU3hGA${s4om~!-<`ILEd$`I^wJWlJ`+PEC9a&J}!@V=v)YOg$I&5!P`(vSav z!^OZ+w}v7*c|O2%SBw<%&gaybf-VJ^J4r0;lg14J-EtlP%#sB@A`HZxYI(tu@ z|KfYTvd&Y0>AtTz&oAT8ov#`UempPp`||s9b-u(guG$bJK0N1|D<7Kk#25k$(A#SK14HC{E?^ulNQrwMP&z6HlX5eB$Q&j=bip+34aI z|E-ST#==o2ea13e{3M+{JI)4wqTF1nu_cp&QpBXLAX!0&g7c3D>V55b__p_}t>|@ z6){g+G=B3nf+==OeXz+Nj=UG|UJ(}Gm2q&fcb0XP7Q1%mW zQ4D<}S;hWyhK8P1=vc#VV3Of;^Xk)=gtqpUw%&Al{rq+gW6n#D?j7JCS`Qy`T&{GcI!0e z2Cl!sZo2@9Wx5oOEPABr`}gM9=EeP@cYngf(Ga4O2Crww0;?vY)s+qY$-lIf=$5(* zMOg3Du}9795h5=~vVTb7a6AzB9YD`HT;B8Ds2?ifDtfNfWYZjWNd z0&(zj77~ac^o>_zXzjmZ$HX^?+)vwbUaCyU7j^V^kxi~lwfZIWp%~|0Jo;_iT_~^q z^NM}49H>db3aNP$rUHdftO(^njttX9_tssH#o2&ns!vi$K^h%!f?_31vhen85CF{= zPcvQCBc(R_0A|$hi%I!3iPgzE^(AMBTEdnRCeD7CKrP1@qn$mALs~lV0g_8WT@uIn z5%R~G4T1BRQrflZ2o0I?9sSM9blm+OrGU@5 z^y?3v!0sOjT0Q%zJ-_ouf8&j&Z}YuHzT7r99Xe%0DKqVVSRx61@S zuQOI5UxMTWmhL}ik|}(izsRBV_fxi^%k%T9$f)^1c9dm2tfG%la6ue;rBUc@5*@WI z6hpAhwQxNB1Zt&#`zO4kdo)QrGO7xW%rH?_9XARWlWEd(TvTih`-7Zk$3-?h14l@6 z(Mp+h#7~Z@c zx*+L(@r%vK-6N%1WUbN|$j`0!)KNn6!1g#s`iUzRb_qL0rhRLm=A@e5#Q06TeE=qUe+ zNvyaZ7jLbum4jLPvkZzV~10DAR{f2nVK$EY)Ihg7!RxVK#i{XMr1mpx79zZJRByY{M0z zd!$kJ6wDPC8#9Y(1KI~fDwwlb04g@s08qAwzceuqtkT~ya$B-DdMO>kQw>_sQt@Ez za3t>h3=0zwCUobOL4Y7U&@AdN8s>nyCK9E}uIHzaityNtQV~FDYoSiyNO6MzSFXWf z=EzxL8H@a&vpol4+v$366P1|%Aih30oavUdX70#&7h>~JZ4XpRR*r7V#OML5EveWJ zM7mxzr<15x8cECqc=J4GKIfd7FewI|Pl9nW(yf_#P>5l5?y(u`)nMf!!gZUZTgltR zh0&!VZF<(nZ1{l};4um*=Oc2_gsU0SJ>$?pfCX)%`T~H2J*^vnHS}z5Ck%x*uxnsM zQ&kHw@6Tp6lS~RG&r=L!UKC9Cd#+hMT|F$eS+JH3D;M)zRkG_z;G=AzMp+*mZy}5o zh!cKzCd#bnP>`g^?~OC51=_$5RZGb%YG(8#B{LhPi(o3+mfa6+d%_CEgckq6o?==6 znRHIg(-6y|A5%C?=DMr_hCS`nJiSFa8_cfy2Qi7*x^$?gjU5wOTFZRTTY9NIkLn~7 zg9Ju}w0t9Z z(O{5f9Dk!~cQ_PBA;5oF+Zb6rtA)L&KG|lq*a3Coc@V?le3({%dUBI64Q1nSHapgV z0pKC@DW$wXW9)NV;!%o6wKZkpQ4!3Z3o{!&{kPC1G!nC6ELJ#>x;Jjx&&kdtZ`7m( zWX~wF;1-Y!A=BH;5W>>1lp_X9BPS0<`5PP`AVGnKqWlfoIY|qLctl*})JT?D(bYi) z(((>5SOd9Yi|(%>8~jDF**!RsBaV5K!9v{1(SUs?9*qEYm z%8RYOt99Iukv-Rm;JmSA)XzMt!-DLVZZna5L)dpInXi^$Jb2CEhOgtGF@~=nk&3gA)5lgc+&wZ&?d<4UeR|dC8V&c1uG5L|_l_EU zTF*zd#s~A!NaHgym_I|`UPW+)5RG&bOmN%e4ySUPR!$ltOXr;OR|pN)oFx}z4M?o& znsZ=rnu%&^+M5blTvjS`Gt*3u=+#$O{~Kp&KuFDXRG*h?2`JtAY5;g5u0l>d|7WV| zLFy2pRX8|*^!>2hsY`6;{3^<~6}Ogt!Eu;nh=%^WlD69Xn0XGz(gw!P(dkZ8Z|cqw z$W!2o_OsoZ9M`iR4TGvJBT(5AynKjJZV$ASO6j0UQ$kL;d5id{{yh(k!K_8i$IP9! zFpB2XV*%qfB`4eeCz6<}mvdt@D;NC6C>|}dBP-Vsc;@gs2(ToxM3V4s)vsxuO-im! zwkMuL3AE}v+Veu^V?dCri(9i7Fj%wqnm-;xoIM}>LM^3P|AR7N_80=_^vK?@m2`%p z=uoz+E%H06Km`I6g)#bLfA)NxHOJpAPet`Aqeg?xash(~(3nr4P z(QK|#=ds)@{)!xUCzp)lJeO;aoIH z?P6;x4v8)Z*;vFLgo$Y)8}Z96)8fdIA#F5F4NVf#a+;%jGL!5AP=cCnF80EWSj4}O zGuLP;RtYkOu1Qfb}nL%0)pW&Tn>7adF~U7yn~_h&f2Zq2qQE?`coN=5IY79BQ1LnR$a<2V*$!(Wf9U4o>%k&U1Z=U$4VYf|@PEw> zk7CyPf&(b^XEz3N8=ku&SU;reovpQObtJFJ&&f;y+EBX=S44&R{Z)6G&?N3`((Y1sC`U`Y3Q9s|Hk z)a~PtPJ|sNG3~=4DishnsuQk-+lI=&BWw+O(E5Er2OGYIO?xMgZQ)}d!C+h#M|o2L zpn6g^-^51yy~ZV`!~-*8XV)ZT*CKkjT?T70`4DRaj2|cYFq8`hz#B`7{0(d!R}4t7 zMDxoCO*cX+>dln+MLV}qp$%X+QC1^+79-^gkQU)aGY()x&Zvt2I%>^f)xB~$a0hIR zX2E=Abdx#%I>7)%-_BqY9Y}9X%*<`OUU>A&3=5-O=j?snj|J_=cGdF2%vNtEB$Ema zFxSdfOj<8#4h2Pdp?;U$5+Ah#Ywq0OhJxyhEHqs?Qt6B{rV2Otdg1RLajJ-BUn_2A z1?y@oL`1eC1;Q@-vlkG(pMDh^;g(;^V58aBGFZ)~15xV%;`;5Wg&EDiTQ1=y98ACZ z4gnyRCKvz`-|T47HVZQUVV_ZZ0W~@cMUfF>MAv(s42UVspJUzl{~l~-U~=0rQH(&DU_4c?ndpUo{4YM$SS-O-rm5bPH$rq* z9U2)jI&R*yGe1d!ET$NTaq5dz5eD_dA*uDyT?qNZc{A+BhbJ++7Y~h9`PJ}ed4Kgj z47FV$qhWp-m2Qie@%l5I(8do-^;IGz++`<67~7zI<_8fPZPqi#mHo=LUd6M#EXiB| zC?apxNu|Q4@bmly{DzctV*#-78DD8@AzSBTuup#JoFA$3C#v%E>MOI0>!;nR#&&7a zBR4jX-wR>kPnW-mc}P)D8l+w>eJQ%CxNlWXDpm#Qknok3Jfw|uJ)|=J4C_9bAo2*&3hlNF?qSKB}N^av$ zwQYwkTXkUsZtp`FT~9**870|#icke225^&_CK7g@^(s1Y1ZDK|>CrowIHH6p0F?wx zgfL&+!NWLX3+-UL`a;MAAvJ!c0q}P)!3080D1s1z`E-uwHGB$LM?oTLL>L-%MvV5n)O;>B_#0` zHcN4h9REFD;|gn>DpPbGHt}j5*nOjrS(*V(?}IG&CxPA_%_44d2hLjroVQE>=h_II z54}G(=v?c|TWUEEr|uHH6~+L{>-=gwEpyd30*veY>M^o%O&zbv!n>c~?bV;>Tv$(B zXi#Ij{E?%nM~?i;?ZW?r#l9(v4lVCH#ETlc(>G_)H>a7ndF#yqyo+p)*hrkf^V-L7 zB#}SndHxvN<1`28ocrQEdwtS&uv?cSxyrD2;uiP>p?$gbN3+RwPS-Vg7xqGJ?DRHg zXANelDvt4cFH3ysf)@9#=N&Yhmn&aqbd}+He+AvTteH#e)MVr2CX^C5+MX81>xi7w z`BxkM_K6LDew_O6eimMURD8ZaHR{sIZSFh@@`Newko*yM1)!X95KWhreG3AOe`P*;9#_}&{NT3*%yR%W%rqs zlcnyIa6<&+4YJ61Q^CQUim=1*d+9{Np#s z^8i<`@GCM5n_YU!PVxO+rpUcQ{s^)RX2SC=1w;)cbmdZm%Cu*+JE*x2@ZSM%#EjZS zgCFjIEU>7BxP`v z^Dr4Q-vn;-iiee>cb@_Q9Wj9}B+oQt^=M)nu!x#Df7^jN3 zE*v`AEHib~fsVGq{;uheQzw4&f_9rT+vXQcJZAIpVe;CbSdkZVbMax(@`s^}Wr+(% zND!c%;cA@W?>w5-%jVfy^=BJ@wtfP@eXfSrFhOApIP!VYh`)_|jk&`aJTdO4$j@>$ z`69Seg>&fndqQ=hso%}TCup!$U{i^5~ zLa$?Q#6Gvj3GI{yh8(4yZPGZh7sAJMHG1?upfDztsCA!#%zb<^s z=o&UTq3UeCd<+!8Q&#Jt$3~zMnnL`U{iDLKT;q|Ys?U_^Qrr_RK2ca)R6*f_UkTG3 zL*t;#RtPCI*$=v`?lq0pbyjgNZWnCa$hJ$PvZ!61<88Zz@w-tW4TTj|W;=Mb9==1( zS6LZMiUp!f0jdXSpo*&u6D8btjCgBzGl7Lc!F~Shar2xoA#OpbYA3N zXZ1CJqMot#*R16f-y&6@Wn=k33QJpRlhLUbZiTx75bBrB?*zBd^Qb0A#&T9{X>qy- z+Uf3c@;u?Jt~oY?78=via>_GI3eb%Xz&iUCb~t5$zji&`&UtgZ?P^K-ZYaL4S^PgZ2bA zh1{{x*kjOko^~fLHvqGEq9J{v3K4`aIe&>(#dF0~8zimaj%?ux(vJu$e`8wPmpT9t z!g9rbsZVETYs5I9z$as5kHIx`RyaDRd5tfMi(H)GA~#2He)s!eQ^v_|_9rg+6C+!I z^i?^7gcar72jyUvM8aM%{bC!yj2O?$H=sHeCwzu)x3}1@uZ$-A8FxT`Zr+LQK_i6 z#>0~vjo-9zfTM*=&Ns#3Y+IZKh<+$;$DD1)A%BFC!et%-bx}4e-kV%C6ILQfh|`O3 zI*xpa_!*JzOj6T$?U%*ZUiJU8_bzaH)#bhKy1ciUcV@BzQ6m%Wn%CG9O3>_@O`@bS zYs>`!m5OflbKKU`+Mb>XZA}{4d_IjZm`EvAYqwX>T_!;dws5M|UE3;xmntf!hgP(- z+Fi8TYD*RG6qTIs@A?1#YpwTvCz(qU+}j=z*1YTTzdrZp`9Du~V^TcX_38pLcpIp~ zR$isuS(E1|^hj1rf1Q~TsBr1!aL!=On+(<+1V^r}<;#%S!W~I49Z1rMD%yoJ)QVkjQoF9Q@qD?SGAPFGSssG~@PQ z*m^C)fdo`BI61j|)Vc*$D9)doN-W03N3Ac*eNL9iHk$)fZ{A^{ZEkN<=s5Q_kzQGU zO{M8{PV%@!a=S9eMP$F;J<*8b7|BmQdqvVoXlda`=L;8QD&;hC-@>!SvGcURUys{V zb{phe4j?K69eBx4cd{DMBv^yZP2QThQ;y$6Qk`5|%Dw7X2XrCQ@Y;4-fiN#LvVeRp zusk)pSwz1QfW8;giuXKQD}hW|+8`F8pr;wu8L3tL(#bN0o=oVyF-;)6gRr%M1dkX? zz)bxo&bJJ}X1}NRy>r>R3^awtqqV3jnc!Z3)EvM=$6a8c5We%ped+4$V5^f!cx+V(~Cqbe}QRK@b_! z*P~49I7^UEnilDi=9~v_74ww;hyh{Na2-c#2x^OfYzrhsy;k)c7Rm_Gk`9D8PAlNDC~Zy4Rtsk z&a!>ngg7uY6VtkYTk(){STY6(Z{v?n+F&ewEQ&7RIH+W87Q< zD){_093z6PbBt)_s=0%ND&20J1J~t~;_R9umgrLvF+z|6MkjxBKoaQGhu^KXD?LjzBYVj{mj?oksSeDWEJsPM(%RA~^eIVDfx!RDn~X zy_}VCP*>cujzXa?4TQJs8T^18qVocR1Ch{7Pxg)9Om`mDmt1i(n zyzjw|Ma=$F;pwhh5Gad>F3@&o0Iy}UI;eq{5JAxLEWOKCw+oD9@3AySJ-~F{|8vS2R>Y`MdDMMXW4ZdLDV`Ek0Q&w@(@TK%!Sl{;t{Zm(yMfk9ewK;Z z;0ED&gF}kQgSR{146jBQ{?5o$685rB$zmD(bgx1TvgA)(cDkGExzM=&AKLUNlj`uw zP4A7JwpWQP6`onc49d=W=4r7BwUGdPHb8&bsPxwv)`6!{9glS4qp7^INx(cCa}Y(^ zIux@$XS)fv(Fz0x@6V37>Z{8D)(TBc-bkDo#nieWVF!2)irg!b;arm^$WUt(D#V0` z@-+!GsKUgOkmcU4nU;i1FZL6%v_{A-49n>V+42odVHI4yl{aMZ=%C`cxl}x*xPhZ-$#Lmr!q{8A11TkkywsPM9OqJj|Ie% zNMadhINZ1)`6zZs$g~U$cc=}1epCSo8Gu>r?cuw@jO^U|U2mD*bs562!dGmrn^#M9d z@YX(#>GDE`>f2c0jhGE0ID!8&)icwZAQw-HUmx#3QhZcFY{lI!y%5BEL-Hm5-R#pV zj~X}bPy=o z(-+;4x50}{gk{=NYpLjOv-+YIp8D#~2tL@C(*)UN*OxyCVtq;TWg8dlt2wLO_lh;3 zK%)@@{zUVgaPw1mdQdl6MGrbol^*pe3WyVNeR|cdKEGy|UocGS_$Q#GKGolL%};vT za3^6A!?_DTF|QI@Cwhg6Ezk+R;IL^5POTz8L<;y>g|;{X&uxwhY7Yqf3`%4p`->zf zk^U^MY|2ecSlO&JG3ZPAIRwTX9_ee!7ZV_87x~T~+wc)Rcz@l;2o@Y6tUMM1Vn<*C zj@)ZF0%JF_gkKPl0nLaS^-UOVK{mlH34!6ed!U5EE?UDMG_VMR#)MIyy&%s1Bn?#x z%B&y^z7NrtG)6={cXTz@kr9q4mlJO9hOnwo>y)9a$h2s|8j^J-CXZ%DEJYrBFovk|c|&Kgm*<++w`%flIsRiBh9CUy_& zzBFUxGDP`LoH)CDVGUV9EFx@=X`O5j8IaRKsjYTg*@#hO&Q(C!2uGqznJ-k9ISFrz zIUPLrC@rmd%lV+}0w5apYKk(QN#g_GfXD1!h+fzSGU+wYz8p=8q%YzJAPL!1fn-F= zGt-E_WDPV2jiSKlt^;bwgC;r=Eyu_bh^9{lw<=;j z+Ur6mle6yX>Ni+IMb+;2;^A$m+2$)d2?uNzTWYU4xTQ|kGZx?#y;w(30&;*0g5RLh zO=$u7EqZ91;8l&{BOhiW#Ef}Ns0@{fEwXG(*okn@8o67T*2Iq1&=C4_SV*%3F!A4S z3?G-T8u&8dF7I+?et>l=EnL2LQ0+ zhEw;*mKfOAmx9U^j-|?Dv-j%5R`>GicOjb8&-E89u|P4O4)-^jL>SWgUp@DntMW z10@nIf0@FH1ne2L6~Q#NtNYVYGOeBsayeoz8iaJNOLhx1dRi(cuX{9Cm`h41!ohYj zHk?6WQ>C{Hvso%G{S120bqQ2A05*B<=VYdafR0W!zosZd& zeIdpUzzlP#SmOJREr=0!#7vZ&Ng+l&N&Pc~7aBO9w+F+-2*+EmRtE1&)8%NR*qd*o z3D?n45h8YZoevmDK2ALPkiahgH4E216N|-!4$4Zz;t;Wt3JV{dMjRC%`WQlSMPfTH zlqx7NPL5DN7Y3S8io7sJNC2q*c+?elfQ9%51*erFA%nG zu}&c}w3=|?>k9b0`HBEimVypO7 z9sk0yC|K3vDP=Ipyf2jz$QmFXv;$2G=CIL{NVyaVbw6dmS&PO(*jAt&W330;nUHXT z(iB1!(t%>Eysym?%anzI5SeqHnXH^jNZ!CNMCOeFk2iTC`L+ezB*(BHS~L@=xER&y z6Sz{O08ynLF3|N(a1!lte0@m} zfcayHQ2s#&)J}Lyia&TNvRhH3cqn+b{(*TYIgkdm9Qgt51h6qg3JVw+ZPw>X@ek%%GpdGhbd|J9T9}tJoE}&DG1(`K))cVrBW;|G zo?Y@nB4G~8+5wT3Q$riYL!{X}xjB#bU&7f7-Bo~hLO=~Ra=pTb08eh)n#V_G0W$bv zw;2^zZR}o~Ch2hc-J0XAqUzA&KH?5@JN{Y?0ajeBhyK~H1vqkJ$<9)2&2bNNf=IHN5FJH_oE*fmJX(qt`)QZ=b>6A+o&n!a%T<1Db44?umJTijdwbyyB z{+@}iCLX?X3CF{@`x`5J*XggNBYuPyM z4T{n81d|4LZqVFfS`7PI23vpN=F;tcDIG5KeRBA*8#CmW=;4aXDozIYEnelKTG+@7 zppsnjSS3hb>q2Of6yl)@q%xOcon%HZfhnO>GAp*nh7l(Krs5t0S#`KXP0HxF+jz9z zv~Q&vLPvAnsAw+>_p|^)uEYp%L*Hi94cki|K!rKeGki;FUgL|HNG@7kQG7)_ug7)2 z&=Uc#C-_0>rQ1^9wSFY6nX;Pls8mz^5SC|jIF8WpSrJVeccmoOc6k9FxhQiCawm|v zMkM2W?rWjJ^JOO;FJ#26J>xP5b5r0b^@=)>NJ`HW>{FF=)?>LCV0|pmk-1KZTs=wzpX#g z{rmF;;IxK+(l~%qE`n1oOVD}-0W|2XH2__Wh+G2a@-tIPjqgLa?!$*}n|`F*^_c~> zt43B9AeTNwdr_+CRSNM&qnaB%)&*C9$V$3e`b{7z+P9M!tIN67G1=#tc{od9|DtXt=n=2@J7m{BjI&&n&2kDCV9tz%#6fWJr<#6!AvrNTjM>1r8KH5cC zgQ9hwxJx;_Ow`p zQVcjNr4rSc8sddHYfG;n%rVD$DZdcg7gh3|I}w1y*$$=r)Nc@p+cpO#i&W~)^t^hQP0;c{766gSGU+t|8A_i!E4jYL&EOf3{@4HY9T@*QeNVVRlP zn54Mro3eZejKc}vlU=XRjFHrrKX$#otq8yc#+7tBnPxU96H*Vl7dl4)k<^k-^K@gx zII&S+GO?s+d%Cz{Vt@gS;ms*;Bt>M!v7Ap=Z8TG9EQjA^*)XSiOW`vVf795pFbHjdO zJRx20S#*Z#zZ;cEiy!Y+7Pmc$=FNIB@7pusi0mkh-7f_la)jXvCn=sb+qIXwABwGZ zt%l%-?1w7_(+ZL?C^u?k`D)aP=+Q^5fpNDq?k3}Ig>g4*&{AQ`VNVx~-VIzsDjLt2 zlo@D+Q}~k@4VLL*HXOw}pi$YunW>biG+242LY+-#XbMwlFcs8qZ2%EaEq&DKn@Xdw zskE_M5E|pQ0Ftk$5iYl2AmA!`%;NmM$N?3ebcpEJXpA0X&A1$Vka^YF=gxYvHZ=-RWjVvir`|ZF{CN07B z#wabHH|@6;O*S?1j@oZv(Eo1RZ}!&zCMy}=M)O#y*6;t%J4Ap52pw&zOt*9O zK?a_oV}v1ZI@}?Vq^#CP9RT%X zMa&v}yv12eUqB{!Iam8U2Dv}Bn|-_%`~wGWl(x!_OkfB*GFmuK zDJ!z~=}y$)YqX@o{iHVP>%&^OO)e?Ek%fZ-uR2p8jkZn}G!9n@+O_ASS^e zWqt|k-5JpufcZ@HY`$X;7#XPm>~D<5!A>d}13PX+e6gI7qv^Dh2%$Zy7s8~l{OaRI zuY2=VMt^XGdoe z&*QBe9got41khDmWF65UT@kZ8m{F*d;h;LWRS;@l5N|%|H=!C=Q^Bpb1{;poY2O+sZH2_3UV!O6}%;@nITrneMD2!06wN^I84jvr_;w;4*EFP_bkS*_vY#H>CC&XC9_~3nt5pvuhWH+KGS6BhbAbYUMYgNg= zW{5-#r>O}@WX!&GS5zU^0Evy)f-_Y=Kw!O5zyNgECfkmor$TJqywh#!ouMgLZ-E-i z3|wNdicnRe)nn_H(~j7y@@KKk`>mf)hZ-mJeIbSvk-afbX0Almlwm149~vUi_Zte!;qL(PylQ*})}^n+ zi4_1KU5>2nG4~h?<$1+!^~@#KgGxHFZX9DwzcgpVT%#Fd zv+PNBPy=9-bj4WKGXqR?5GpruH`L;DkH?vQKw?zscVzCh-eQ4fki2SvvV~HvM%m$% zPpfcQzicA+CPc;NMvFVWn2E#QZu`idJBc8cIY<7mE8hEvWhQ7yTpBC zCAqe(D;#ywC|=(p6Sk*N(Ct-ap2Crv$xS|fMQJOT1=I;4#>8`(eoUO3`Y&cqWS zKG94#ZbsT(qCsdsAiV+Acm+{aQ;zsJ0OD=Y9@8aCbzledJ@o5nj{5zYz~7g0vG+?5 zfbcQ%3npP)Ag91d5*7`!p73+Ygp@qqsl5RXCVO4DLLCpV14sa{C{^kp(DFo1(2f3`kF9P=qw(a9DyWUX;o+-fU6N`*yar;P09;iiX3mhLn)2-k zL>lc=BA|K5*b-OfCCxq-hZ>cEpK2fy;^FS5tZ1DrB$uyT(UE5MHLUx-BKn?MG)N`RYV$+5KS#zPVR`FDWJ$m3DLiz)vyhP`%>do^3}L5TM7Q<<~9|? z(P=_bwVp{>!0GyR@e~YZNp!pliM~JD-5bY=@~%&q2giwRE|$2xdX;2A5Kll3&2CZ( zz~h(boyc=VpxH1**&;hR;P>ZjXEL*USBf*$dwe5fX7|Qu2#p?djt;w6L{g_m7W@sK z1xUnKQEmuw4(H-BhCnqAd~l@h_K(}hM~Z7Fkjz9N{1I3LSpub;AnS=Q7%xFKNK|UG zo4u?zQhYL+?R9RMTJ67g`tRzx$sP=;$-rUgh*UzR4$gv(9a+xkld_H-ND68ssDgRV zj?jjoIl4`1?c(--QuWi1E6~c5aO)!oMI9An9n)kxJy?qXlXGf7?2)EH1 zSCLk^H{y&KdGVfq5*7Vk>IBt3$(L`)#JQ%xgk7$cE4$q-K0JpOk-eSzYk@~d^mDJN zFG((A6)Q9jL)u#?4Jyd_qD-R1H3mJ@ljA28c&K_RrQV^QtW}cB<@Hv>S=HiOcO}^u z%Y;YD=m`lDWuZXTiAff$!{u)H~k z6|O!|I4?Tl@WS&Q+cOOlGt=-Q6yLtXL8k{SF(UjpWLV}4rw*0Uu;lC(-W&g_V>E)T zZ`9;m>&}Z|N;RyBUqh=sY*;o2ChxdTlzj)u!XYokG~K#5L3a$P!4rP>q+ARN_6cgO zHkFdQ$~*$E5RtT6etAz2$8&Dwc}->G$it%;I=n+$8lZr|IL1JeZW_M)mmy;Ca?1P$ z7Cj|;l-~u+7HI2ab6s^A|CyUh&gbAc$6tF4<<~GUM0ty%lX;t5mluJ;a6QS^ke@M( znFx*=N5JtGTGO>ZS)&tL`V0L$=N(PbYM8{LFL%dFhk9ducDaxp&$N zP*`#Qh!8MZva(|Enah8LA+Da8%dhOMKGI7su(9G)q$t77Q0&zog~9|Q-Rk_bpG8EW z{OgfoY+rHoC-&Y986TH0NRCyJI44PtmKC;6FCO?im?`nh-xfspQd=CBXjaBZ7pF&h z)tPwz)M{vP0PL>3yVh`smm4iyQ7km;?EP2)L$PDqn{w)!;I*W{^M)(TW}0u#0ebyQ zwQUvg7`wEW-VC2gG)rv@0}Auh!pLWK5ew!fCcEu3L2ZDgj@)#F=Q9VA9!c>HQaeXD z29Bl&uAmsrs~jSR6|u_7jDUz%)}y7Y>8l?jX65TE_fanL$V(PXifez0fwQuma%HUy z7x#;IelB8|zxP*0Cwwt3PbZwNKI+SBIiBEaYuVCQ$jAiREEFeRm>`R~oqmLO1|m^9 z4ct!b>ZzItgFwA7&$Cv`xuEmpQjB&&zep03>MF=q2;T7uuundk+J5%U!>V=x=Eb$& z($@#vJbdvk6+*UAAku&=GIT^um67ACKKDJbetbq&Y)~It!pE0;L1E|6_D5P`G(ZYRaftT6y4(0^H-|9%sFA zf!k?8#l}1lUugun%@n;5M=E8Rv%3$dVeAmawbVnErL2iNyGVAq@q|qWu>_1wS2H_V zx#it_Qf6|O7>+w?==}3douoZ{Y;b)gO>4kY;8bmcXvvv8xYX+|E8ND;3ogm(Y>2_G z<-29q8iAMnD)RDO7d<@#ZBpAyL^gw#&1DL__%>iqC!C8;4Rzu>tsCR_nW2LAWo zpw|ZFGO+a$$D%(Nh>Wd7YbWQ%82SZ8oAEyoZEx&0cZs`rl6^IqN&}RTT_kmeK!(Xs zH9rq0I2u0FAPHb|Cl%%Z2Msa?Y(_O@>l`32Qk#e_>jKTw61j<8Kyo6?EexnKthzA* z_Klf`Qn`F=r~>$8_GTL{_<>a5MujpM9CCi(UZYU*btf`ueHpj|?p~Wg^Qm7q8b8)@ z6eg=MG2gD&6zc7=d#xRLvR8!MHP67VCDVeoBiS(y%4u~}0?(48S83_pq-U^h70QAS zxy5l{J)CiJBcI(31u^^uQWN8&({M4I2ll7Dz2mq){N~>peaH zd^()}qZWo(9o$h|55GFHN)1Nk_eY@zw~Q#Yhc+K6n$3>{1abCYL9uh*qG5dt>qk*J zkWzYbyNC^DExlWN&L+m*0z^iA<@>Rb<L136auajATQDw!b_j>HVs7xM6l zCkA7BIL#1c-z4zuai*S^)<3@3D4&5o-PB6~DngxuEcSaBZm zVZ0kAi=$ETqZIXoGPz;{PlV-R`FjGX^3BA~+s242b-rYcDJPi+`#O9D1i_X7Yz9!t z6GIRPUyPf=Ealql^BI(*!EB|tsqm{fdWY%veZb8_gHF`?*Ff^@9kluiPMLt&0D|t) zWVJ+|R(cQy)WB(@STvERa%(*$x=i3{ju0J(b{OS;D@jU{5H)2Llt}I^sGgfUXbCV6 zCakPgAW3oAs`>Okf{Kc;c`F_ido$Tf?AlLeza6t1iL-)+1J2zBE87>Ud}IL$_f&wN z=-GPJS|_f1+7Y@`>>HL%WMxjQX9_XtNm3*73vV>5hpc1=$jrSYier0hKA{FA#^Ym2 zyO^4j{Sh1Rm3qRrPJ|DNC`#@-#=WF< zkRZQ6Ca6F%+C$nW-|gOfgu}r~O$Na)u-T*&&6Gr#iA=EEq0#~le8g?3p$>A`4TZAc zd0_WN;fPm2$-nZ~3H}`=w<7O8AfJYDS1iOeJBf2O77A=jvVV~s)5Dip0|J+CP&M55 zSO~k4eK<4dMSb+>j?t?t?q~*i#1Fu%bV$eO$NY=k1IU_cq)a1kh&sZQN$@5CL8R2B zmWWtI)$8$thQb1={ev#$2{0)P+mlSQE>y$DI4E1ImX#sVG5RV|3*}@G9Yj6M*P=)d zPwefJ(H^xkG%B~!=>Fm*1e7|PAq1EDB+5SmV;}Y~xh0Pm8od{uSxG>}ExN}hvm$Bq z5PZrbDX+h}Wo@*?Bm?*3L&45Rm=UfoTRc&T3Jv{BCvpf_B$ob7rylUW58E9Akq;+> z$KW2>cg-WQ3DWzxxLdokvHJ)p)_O-L6a(3~urbZ(9~~9RdgQ>4@@tN)2fmJU z*Qh=G;Vn!>A?AJtQGQc2O1Qvo))>Ed23=# zghZVpR*yBu+O4s%4u6fHys|+k`^-n0tV!!spNhsX<+GqbDh?N4)qDftl%&8_N(j_7 z+)RLzF}&b=!Xhm?b7>I&ObIS$U{(I?LxHCgJCI52GhxmjY3`NNEp@N3FNw*ezJCVooMU*? zBw+Z^2`F3r0~>IlqX6axa<t~S{+79X>}-f%ECgj1&~`*SEb?*pUIS<)C=pl zU{zetg>yt3xOC-fPxG-Ym9KqTj2|i2@*2j3b{q9$kxKftp-!r z^7~zi!oVkdGR}y@@hsfc`3Y*5z=j0yUfrq$XRlkPAi+*ymtK>892a*?5*i-c@060*7Ir~(%qRp6os zIxdRJ;G&}nTojeTMQP)?C~Z8K&BS4F*-8Kgmu+~$I%g)+xbygRJ}xmXO8~DxVjH*Q zO~>$02e|H{1Pf{A5l|r~cbcbEWTjO^yJ#7K%7DQqlbXpX)kj2-gEV3`I>c-Q&gfKr z8ro{d1++0Z#{*wzWLHCc+=tHf1)NWaZjpWYP9j2GKMuB`Oih5n14{Y2AESTMk!b;2 z0$d$P7?_71B=XMGDk%YSw+3v%NOooMXB3|%p5ZJ!xv-&e4gwWl`%5%T-CPG@+GF=} zL@YV=(&Dq9in_ffdul216rBfsWXw#`lgVy~l>@w$eAGiIMMgDFFf3-fV?dYgmTOG&{dH%BnLbi6Y}Wy^J#$|A>!6ro$0QB96n6HOV+! zqd4@}G5Gi#7Toi!aV>aYvSDH+)3TE#3B&I&Ow2!1X1G8NTV=V#QwAxGVN^9(@SJ7WI6AfMD`$dd|y7wgx2TLPGuRw%&dgk@@bCBI?!~5wO3iD-q6Ds z>oNAk_@_A%Oh4A-=&s&4jsDFmWBp6ZV=Rh7c?NOCU?*e6n$Taz5~E7C z((&98%_%IH55O+|VtX@N;q16-UWH-tT8Jdf<3!FNOBC_c3dTo!M$hEgO8Eys)xY4S)EHU$3z$O z1Y7+2WhBRDvF6g*;xsIW=7h0%FkBZ#IaaiacYQI={#y9ygIcV~U@I6?GjByI%*Xfb zJ%_&pBF__XaQuBD$3tZi5TnKW@e@FscsN>ogNTkb1SdJNNl(0_x_H$3-IBc6mb#=tE}j#;F8fY9gp-r7-r=(i4=C*$UfvWT zEAC9Hy>|gN6AB&>_v{pW4$T?29m{-MtBXw+LVU7f^)9MK)5dDS@oG1m07W6-=D(8| zJhb6y%j&7Dlx71CfOi@y3z`uq>wPHzJT!%cr5A;?;OVa9VCb+q4-=%QIij_Ql@kQJ zWdQqIw23~n2Pr@}uYs`HE)Iv-M##1g!l^G}W_q<-4=Q7JNUif8q)8Xs?xu};*Y)>@ZMSVRYikV%T@gg6dkU?tgt6;|e4 zd~`i>=}=O$cWGZ%Entz4{-aYsQ2)BK|J^7&yrcZMK@zf3qhHYB0e!VnP7 zqA3&;CzeQ5LmnZ+T!sX~uO-M1!haa4qOZ*0Qk+H$mF2*aLTF)<&B^7@=iN!gB@8C#ZnRF@p(^|TENpdD+NXjz_HNszMPz5D8Luoi`LjM9wip5Tn9zw1Y`j@t{;lycrOU_AU%rL$7%oQA021j-5Du(f( z+{#{voZ&06h9jpS3~LOdNVA(1$Y052NcCDmHo>jWNr-P|nT90dd*UP>UZz@_ov=)2 zA`k;|ONKR#yaF#LgH{mK$o{M~mDHx23`}=_U$Vn3^0l#8L69j?Kv@Rg4d}IU*u&-)cFt-X zbWb;PfA;*kwd|8E1cYSJTDG+cwZm2++QDV1CXzETkswydzVD49W+~Z>nSW`9k0BOI zbIn`G>R?_Ev}nTm&C^a`rRXh4R$yzwCoKL6PuGx%nt{r2l(2_Q<02rxD)#H++vDS45w%BD0c z=~>2&G-SdW;~wV(Q0?(LjO*X$l2CxcGsuO$KWB+(ak7ivyb+?5=8+^L9G7^J39H+& zcL(2;Mj&(sr<5yutXIY>MMd#0zRs-%iPUyKncXayR_5op2$7n6^Ir#iX?5y>c$(|%kM&;&2kNf3^b1%#usAm7DD zf1voFDKHaa#E;^wKahqiLYCK@xKu2_vl~X3eR`xs26##iH>v!zWM9E zZ{ED1&RS!N@{zKJiPjKR)0xt_r~=s{5@+0<0f%!~o}Fnm+=nBH-1>rxa(GB7jS;mK z6_qHPM!C$8tys>5n`uDEqBm2AQhWD6^{pv9YQgWlc$i-$rJ`%V;+>@c?F~yoz|l}Q z=%dMSajhE8hjlSzcX?+0@+`V8C8Ws(fjI^Lv=Mg2;3_%{UIVxJ2?E0`M?&%WI|K@j zBCr6`O32EF6RywkY}&XN@)Nyb&cG(>sE?J7Ioks1j}_;gD3V!B2v$jXVwXvc?%5Ap z#pQW!Fto@U$SRhSNzmVZp71&IrX8OWCPoRfkBkhZ|MX%j!YXTEI!4$i6I&tAJBB0l zq){<5@wODpbHPSqHp+V0*Hd7bmN2z&%kqj^zPm}%<5*xG3!k&_-A^S+>$tX@YX9*W zJG`*{@2}Op1d~n`^>8nTbcuQh;Ra@e!Et49?@xY6g&CIgJwUPR3Iy&u`N3gX1sW4) zu(sEkiJ#5%W6KQ`!OEd6jpE+gk)P!&2dE0>uuG&9SwbfOD(q0O;`p`2YaV59YIR50 z$Lw)h<%^^(h2Tmb7|Fh@A`>7LfjEsI!%D(AipdP;dck+ZXiN%hbBr)9aEKqLvG)GcCt;~n^}?!8Kk#g2Ax*dO;pI?XVlUffmSf8Jyla6%dJ z=H_}1Y+#@TRC|a)_*=LK@gZhXE~c?wO1PaG&C^LeTF-a7W<1DUnKI_fja)d!2MSSH z+iM-68X}}Gdqj@_O&rol^7PAvfN_h)<84R_ZKzA#V=hjv(%QcxVevVQbo2&n?{oVP zD6y4DMX^p&&y^~1z=1xhiz?fo?r#eBqsEoROPcoa+=~w=RiGe`et29VlF(<#!BG)|T1MJ1PFL+l3*- zMNwQVVz6hjC~O*&y0;536NClA0NwoG^mA1ez?%q|UmfeD0?IBlqP*LGneGZ#j) zxjh7bI>-)=Oo7Q#nxgKz8^dY6YSuDiBz)tvJ}y#mxs)g1mKr1B8BHxJLTx#T$yt<= z?C`Km%bcVlRjyz#+OsG2kCSS+xTKuq%t-7WSG9C2?iZhZL#&rSVP`kJ7Un`1oc6;~ z!AVcE+*#UH5VKX>TyB&JRh>PZnU>Ap1?&^ERXI{-F&gd2|(eSNRnw;i+Mqfas7R4y-PHeLV58^ zIp=Dq5&D4zR-wj6f@bab2nx0Wthniuz%D`TmBo~$X&SjFwU(Bq(Z4j#c-kz!_Ubq{ zxCX_3h-o(1NszP}^%>g=g%ctDpM77SRSVVk84I;Cw_KHJG^}0_cz-0T*I9V=Ui&Qo zOH^Tbt5^T*VP3s^li`zgHQ1Ac3sy@K2I#mbs*j6c&&(8y2AT(Jy;(sG@-n5I%*DoQ zqDg#&_GNtO@s~3{1dx2wx3#E%e0IiEQiI225FSPECF(LnH8%jFRWpyKnF>DpnpuX^ zMn(%88!h^bOJToUYDeO z5Jz$CSn+BBZ}FKvNjd~6^L$xu!XbzYq%fG#-t_Q*+U?Q8u=d7p81>6^Qr`RCU>kk- zWh?9z4PY&NfywwJVC1o3?O|FNLTQ;`N!G}FEc;I+4cvcu#(1Q88RKO` z3$!>G<4>(>^CC-210YwK>(RkS)9lx7@zGRdDa0vQ@Zq0j#MB z*&(#dVU2|`pq@Kfn~OiDz62bSdjlM5c^o3I{)-0XLg(9P75`n?*_@_=V7;w6*)5a$ z5FWKX9u0o?6uzr)sqZ^*=_IB04ww}bKFSZJgNIvdV&j0i?4(C-S}JezMlI$`9afiL zq|+OH_!g9ts~xE}jqk}zR+sBvQQ@<;h9^f`mQsT0AEhKLUJw!Qi-&{ej$v_GRLYi# z7jTO`xWxjuK@rGB&BetRJ}ZpGE{J?Yka`H(@un8tlc*HlBh#&W4^eq}af4yLW?Sh# zEaJ`29ZS5q!Qt34bg%HmsTOYzU^gB_p_M{`^lYF&aqQAV2Shzz*0uP-yPY1om~Ie^ zZd4xgUz{|NrVliVNWd|)2n#CaP+r+Ql*wx7gT5%E5YsQk{Ost3L&)IdyQp~OXFTy; zRDcPpQvI8gEx?3z2?50L?4fC%6ySK_5ETv3@%4YR1zA*cte_)&amt|Ml%dEA2U&7h zgx_5vxu_N)d~wpqMF53hnSR{@pm1_gWI%um81nZ|a?;5%5TyL%RO82y1r}vN9Y}Pe zt_m%BY(Qo!uLFsE42bytEJ*PKhb$&?V2-U=>H-$}pa4NmYhSH8H6llVo}dD~{oz`u z0bfQ~sBd~8!Wh5wb*g>zFfG#?7Fec}i)0I$8KUC-!CR4SnL556U9q9+n{)W4l+yAO z*P{dU1U7V_In0I@6!V2<$oH~1aPiJDHheK=UDlkEUrhKmAiDVT1jTp1?76l1AXZnZ z5~o3%&S>nSA_#u*VeA9n{7j`LnR>;EZ3SGkoTYH)&d91F_`nD(%}wXLFxw#}hKPc4O3T{7^SG+l{W>ct|&t zCWNpmyFtZK<+Rj|al3&iucMl}F=02Z(hcPqX%wsM#w&Cqw;P$=IG`I!NYW@)+l_;| zp+qH(;xxPQO5IQblSXm6-MCse6fV&y*4T~T)D6pYQar+LT%#LiW+@(NH-1Yu zx5y{dPu_!H13y2x-*s-|BBjvf1qYQLR;@S!cl(M5Sn1z`EY($-jd zr8UKqT;jw?VRvhaadfSd;GjkGB|2?q6;eu>=j8{w_F&qBQYX+ulcJaezmt~{m!+I6U7!X~huZ8>0mTR=>Lod^jN0F%rL0zx>)HzGGgPB*NzyNT|8 z)7@Ri-F0@ip}XI5cXbjXx4RwP{kFTip1bSqZl=56ad)?JcdOkc2Jp(_yYB8b?ryWY z7%I5^J$HMW+suZcfy~@~z}?=??d`?CMFN>(F0t?*mh*hzl$UX7zEIzslRTdbQ$9cE zWQoX-lHz>5VS&=X$;mq_LgP9v4%C#%iIt)Wue`!KZs1!9ZPJr!g& z6^FA+%617!RW?B*#r|*~yLtK|Q6a%p0Z+(ITX{stg3;BRX%riX{d)n4#?DE;4Ur>C zid)H~?sMxtZsn=}aevZ%ARfl6m8xqNv}zOKL8 z$`kOf`l}gIZ-rd^Vur{RP%ipl9d2k1koxk7p7FesN6WAzFqoF~qGFbOT7D z#qh7STfiGYe#YbTytYEL9l>h_g4Y@#ctOyBri7Ksp31tG_Sw93OfP^@sq(9H`KrN>U4ZtX<{_Am% zqY?Z}^ykP9K$$}@If;>&t!|$k#oS{76s}4>Z)$hU;SsQqQUX$WMmZl|gw@2P1c8W2 zw52Fr`67tTmpMt?;_Nqx(b3K!i&@_}gTuXApKg$!8Yqhq3DLUu4Z3`2IQ1~Fca;!}S85{8}EaS#x2pdJ->-pvu4 z?4^YV_kR3A*lA|hwR$lHQu59VWa0-#`-bU{A2hSilKCSbL75yikM~kPT*%d^vZ3}v zlq=im@Y(u%8M<4CLjb!uEf;W&GP2GEmKm;jkh8?7hKzhj1q(7O<|8kkiJ=kur$%RD z^dR6Jz;EZH&*qh+$Q7*J)??F1Kr(~;QR;pjJ-X_E?lR+lMz`V-A1dk2$o>}`@7u&- zjlnimwQZOXUO!2HpxmPkCJH}|r-gKF?#TjZbAPKi@a76_FlM->K^vck?F7)qpT!_+ zs?df!sj@!o3I=UU{E8p_>JlV}F8M=HJ{iewnW9u%fih&CKOJBf%BAW19% z#Ayj}bOxs%-j|9vu@EP@xrZ+P0tN}<^y9ZjoOofxk)Cbk%w4qaQn4qdxF|y15y-z` zPdI1fuqPSDo}kkt!XAV{ut&H-{4yb)|D5#1hd`tjxWLmI61DUqXWfib84{f;MEKKI z@&DHN$H_$m66eU8CMk*w8LdjojOp0j`o5#>cvy!(e?^R=1bqR! z=NgLwys-+G1rq*t@<{)IR&nr6r;7A12J!D-;N0ed4m>Gf5O;-;FO9~RNj9nkMqcJ+u(g7MN`sAsGAP_(-^%zBBWDHO_ z;k!K5*(aQB+@OT4oRwa(;I z4^sApXe!dS1j`-h!US?j9Bz5`uZ`&2-D(e+XmeI4umvsjh4TVXq%r}jW2FNEK@6jp z0+{WZLMKS&Z9FBrkw6+xXUGhGjMy6#QlQzlDdiDBr)hvN;-BDq3+i9fL!gH<7n#QB zoj}p7)W80iHBjXbQ2k8(8!hf|#B4>TL8jn!yrF=-?iU)v){G66YKL_wn!@_!ZAH%i z#4lA0;UWVY7bRWik}GAjlCF>FvIIphWGj{$o|xStotEuFk{cFcq>Aj7BQwzpnJcRnR(MJ+4@{H*3@@3aPEUwX@e2iD6HnFby16`W;TN zw~NW0)bW7G$a6&z5qoKz*BA}|!FrUBSZa%%)bZvQr+l%gU^}BRopvPj(gx z8R8RqKQP z6YB9?C;4wElkS525SS4WE7{@_0$NzPArqNkNG3xIbr~>#)lFsH;~B_~WgZ)#b9M6= z1_gC&X+s45ZpEE0REk70TUCZC*^op6*{iz!N%tI6L!~&vneHOGKtci_LJ#Z4YOrT=ckzq;2zM-`kGHRoC2jxX(d-W5PSoSv;P!Nc z(&J3KeB_8A;ROp4!HSobHn1Tg7;IpF(0xx`ytp4mkMt73na=t{^YM7(&h{ga#r%}Ru|z_g@e>#{Q>(HC z7zC#^2rglc7J2A2@WA04!yH~Oh{Ho&mdWA497sTdofbvA5&&DrvXu?6UsX-@Qrs~i z@73NW{m!@I(Lraz@hz*SDR^N|2R9&>3Rd8G133cde3PD^K z^=+ucL2o*xGD?z<)sQJ*p~m4~0WbSsNvRh=R!-)suhYD%d@WQ5G){Bu8Bo-LS&kaI zk~Y%}UM(lUjs${_5_V&~Wb4ZO)BQpyzmOlyUL-LBtFsI18XdBqUelte-H`pXCZYoC z(NrXmFU1Dagv{Zlr19p2D2v(|sw_b^t`PNf1K#ifgDH{gQO|jqz|~M1LTX zi&SFU0ElDesSVL5+t;4G{W;&C8kx>^7al5|9pku(W`@Ixx^GES)hmeiyMCvG{9lvs zLo#kvEI^-L5_clG6m%Nc7gMTx-aNMS;wQ#gao(Qd{x4XnB2&SQqZvVlttAu9C{5Eu z$?CG_yO7u56hyTwQ<3*O?7$EoWDBSA*f)r-Diodl+*^Ci>$XSszk8qd3nIPm0>)+( zyJ!Eqk~kg@a1KGCQuJC%+YU8?W>y4y(<__B;ZodKW)jE26v6*~H|H&@oJ@Gb$?Bz{m6Py)jzcyj zennFgVIR+%Y9;$+pOz+lYwvVr2f5uqeM4Lpw3TcFq5jz zy^1fQ;&s;kDz(3AU#{f0p@XS$<-M{dq`Rl~<#_vya=r8PMrt|oAU#ZxKZ#n6o#T|G zw!e?2yEN}hl$trcfr{68dL5S2)5c@Ahskj|g^ODMjh*(#+}!1u%5`g6wsK2tyu-hO z=3$#-gCT2aw;Ds^#=N1CT|%(1TWA$}tk!{U@K+uZ)4WlmXkE|maYV~WvY1w@(!Aa; zj0L^94Kqj@pGczEjIpV2r2Opu+vF?R&mvtlH}^XYQaan8x8I;Y!w9de`mj+lw4+CF zJDNU&m0I8(3V~cOY2)1f)|W-sZ2QudD-KtGF^ksr7kul15C6okzCAu%{nev}o|b^d zA99V$`hpf_&2jfC!TGbsxf>|j{kP5c((T*-{y#s^{lA~{)Wf!memwV{r(gcZUAG~HeCY7@hhA~kFYbE8_ij5pk2el2Uhln_8|NMFHRf+Msr#h|Zeyg4Lx&K< z%MPcXc33yv)p=N z+{VJi#rvQuR3r)_VbLI@9yi-6W`zZ9i=v6N@jKW$^QJ z$*fwxtv7P`knO@q-ad4QwWBwtJb#$~HnbSv4gYcfZ2$T*cU-XHicg+*c>6DY?h~)O z;OhT}<=!3_k9p^d_x+{*e8x}y&d)ygx!Q#7NB`j0KKIAJ@;UvPK1u)k2mWL`>dSvv zVUFs7K>TtuJGam0U4}B>zg6466aVjP?tS7@Kd86Sd=DMk{=@VspC9@7*UmdUuWgQt z*V+Oy0pHlY_K;@g^YQof_snGT&LM3-{sGJ$r-=6mcXWmy*F)}*EkQoghM?>CW^TSNU2VE@tZ$#5Yj2YnET2HzMsze z@9gbgg!J>aU~?Y*LwRD8Is zIJ%1Oc3CJCdIHLM#sgaOzx&Ulf6q(-^ELbYf?UMz0QcDk{yxTFp@iknLziv(Q=KdL?&JcvgR z+(Cpfm&6{fu7e0;dHcz@RN=6)g^sCKX&F0b_0hYZZKb38Ej_oCf$E58%}F)xL@q88 zxyGfLP}EsRVa68|vL=q9AudNVnOK?#RhOK`gSZ4uWsg@O7_h6Wyl4c}Ux;`X;NUhv z*y2)YUVOvFr*HrC zd51ykRRI(wYJs=E_o3^Lrbdqs20>q}&*5Mc-OEP=O9K7CKLq+vMeW55@<;r}r#@$# zjj)s^bOiEuXnqRl1%4fdMAPtzl%BOd4p$r7Z}`~dca2>C5s3L8UjCZL{P~_c&zncM zYvww3DJIa!#}03AJou*TuDkAUz(>B-y~g(K&wlFPpZ1Lp^WFbQKlR3!?EJV;_yw=) zy?*`E|4M(p&QSQv{5j88El4$_R*bwHYCgLCoU^{M`dbgZ;AhnA$o%%t+;aUVx4!=U zKf@>U^Jr3eO2#fzWhOk9jT8O1xK8>vY4HXZ#l38uw24m2zJXr-d8)d9k^I;w`q@9H zD^m6ENsITc)P6Fo>i-z6=K=D&7?_rZ;3b(({x&V{DVf1C?NLMPdC!l_dU|4YKcanh z&B%=_TG>0&;?@5@q{6cXOnfZpiq`XEY4HaqZ9VT!lXS@@Q$jVCJ$y0K?H{Mb zp%v~bhVU|by5&~teu1JeCw*6s<≈t_}sRFJ=g5SEZ@+?;~cA%2IM(wSDC1(B_&n zRo^4sn7^^4W%Jsu3Lwh+e0-qQOK+5cA#cq4`-pnBz2$3cF&e5j>iQ_@C2jEs)8b7h zZHs>_S~Yau8hUJJuSX<(uASw8xW%*e?d(JCfZ!q6)ti& zH05r9n4S=)84kPjfx`B2)V8` z_ba{^6e~-lg}EdcS1f~8_l-Zs zun_?pur8B70&K)3Y?SPT4Z+wT=|k+x-;N@-%SjdKA#eC-KT8fDSM)Bxmz^I41J}CiBg-oPz@+W|f`n$$U3naylsvydK|6?DX`I-!{sA zYoto91v11ggir#yoX#$u5I{B)uVVPTOikRIJnX59w*Wt`Csf@Dlt%5a$>zbV%km)oR4naAhTrw*ThsI#;6gq94p=sr z5bCLuEgf6|*>8_v*K6p)Cg)hb(`n*d8#3)$Xtj7Cq17YYw$N(KfC`vR`trQ+Fji3Y z!bxCYZUlhK@=9_U&Y42*oL*KQg~3TsMMk5D2#OehE6iKQ)&y_CYsZVPl+yc&93$}Y zqB@usfXsz2eT-;Fw6^1&wF>cM%L!omQEB67-zK)~$A8*u&uk{Yk^Em#@x!*%@TmCv zwlr=8AGEU`VPrCthlm4NoDSV+np)tA?w09t-R#Z5j&7ECB%$kRrfvRwM^%DsgM(oS zvd#5r@%!cGo~ZTjJImWgj&Cf9GW>}5ac~!}>zLSz{krr);wJD?t$W74R$`9%Dh`*w z=Wm$5ao&vI?vpPA3{md9C5^-8nuz!xwwD{KZ_F`FLwxyWnR)Bm?tBx~wlBpu@n6$o zeudjE-$X!PXLPw^IYt)<+>$o^M`?7qwT81t4QESKR1^q)D`zP&1ZF?k6StRd?wFme zw*Afx7&h{@`5Sm<+piDOJ{Ss7*Cp#&5&~aKvA7lPtN~meTz)rpi=m{#oavwSw+*bHqqQ&+!p-3Tmmp!BhQ@ zH=b`fV!=$K*wFhCv$`hEfxDXnFTJ)MZ%VVb7?32zV=trpE|DR)kVj_DyXMH=sR&it zzALpQzSCEdc;FYwZUt4P-BQX$wF!UUj%MTk{x?|1JMuOXgT|^z4Z_-Dg6p_r>bAnt zoG-bp@HZ6deZ~BBsiJwR7F{dhHT!ffpUvZE5viA)!HSU#!^3kFAmu{bz)@Gx;-Hp;H zU%-<<@vuxEhtUNo=Fb|%t4eR|%91ZC=3#-Xi$7LQ*|)6BiTH!0_-3gJpQspdu$eZN zAr3CpIYa1W473g%%vp{Z-)9G1dOUmN%=ovGi;tL$fS5i^)Z~Z~d4q`X(yjAKg6H2+ zXlfiHA3->o%Wi~u7-0a-ACgPJUY=Gk-JID|^cGwyyWfJ7L?I&kpCrla4*4Glki911 z_5?HB&lx>1J1XAuj~`HESFj0)7UV7BB8=s5QRe zyYT+DToP`>qWc<({^0Q;LZ(6k^WC0_vC3Dd*mXr*I6p(%E4}DX$HDP%0_ponaqkMD zaM+dfU;|#bbfsjeQ1~O2Ye;OjAQYDLJdj?LQiVM$r`BR{D6k1|Si&;*u9}g9Q9I^M+_oS_qSuh ze>lX)G1G07IFNvlCugN=892t9Gt;~m@9#B^yic*4`knQff67XLe(}q>3!zAKd&5k; ze@nVSe{Q-s+@$@@NyPm~T$i9RqyjbGnSXMsGpI-cq`cpzM~y8U)b3I-Z>ZehG4iV~ z+aUJBA$wR~F2*qCY$m878r)#}I%%2^~-inam3}T#w)p^&I8p66?{hwgA z{|=`L_MXaJy#|E30+cdD^4Q=pDgD{Tv;xw2Kd$mX1|3{Kz2wz)mjANIJH{(_2701ZDs+1(RSRfgi9 zkYLU%O-1RI#X8vGIucu8+2^mZON+UWr?Xn2cap}3JJ@TZvA79=?{@iM+Fp0IdwYuM zkdF?!k7!p)QPm3ImR#Y6#0qLix}=x*Aw7Gt`-w)XOjbj%RXZShEHgez{$l#P6murF zfMjieq5K#d^anhyat{z>Tkwq);@n9qYBdS zwcXb+FFC}A3Ohz%1aBQ5M8go#x&(Pk#OM1MmC z^5#tZ@;@bh$vHY$Uzaeut~D$nNkqRRj0GOn3XcBIJpUUWh6VVeB$0A%q`NxTQIq=| zu9@Ks_t+wiP-RGh*0a=}eE1xhUe5-@YLGy(m)Ip}15?xubfsv@br$7OKeF2aeX-wO z%Gn)z3V5`55q);PmxA2dM+F~rJSizQSQZla;bc!KYmD3S5D~s;?b2O2D{DNM zd^!7iXwk1X{v>&)_=^9#$=~<+za141C1pT2{=rwwf+pFaRwcW0elm7GQZ@=KJqz>+OA0v2-vwv#!BEjF4a1ea|jVH!y@n;V{6@SrFp}>6{ zuO;zt5lL`JK!xHlyXYY154Vt|s39>f2odU2jX2Rm>A-%9(eXKJcs@i`$w2e?BKH^5 z11u!4u$Ot#J%i`jYew8iZ7kUZc|^L5Su|Ga>o9(I_p535|FlW(uy*%SXe|O6v#+MT z$Uf1SZ4kA#&W?~_>;qTA&%H_GdGtWzwpi?!pT zSUWDNyu`(jOf^4X;Y;*SIRFCq_W`fb1yC0*D#AoaQO0q`>}AU1^s?DvboQ31PC5-j zws-Yfz<9ez_K`PL+oz&3x8xntJPCmNy!CcKtz#81y?}%O*>nOgjkNqav-2FsA{0EL zb0h~!XhhjP4O?3E$g3oSt$Ng>T3=d0Wds%|Fy?!Z+4)ZqovY?fO6f?bf*}XVRtIzJ z1BDN*NyitGO}ACae2*oY*0Tv}>sCokQ8HgHO6JRDgG(y7aSEH_hGdhn6KqH}lL>&! z)~N|ymLTE!JbsUhdQHVXCfH&UD|yJ;3(+VpNeU~lZ>j$n=u|J`BzY|UoyMcrKI)N= zm^^)Q^=T8?f z3P~9pM{G4CwOAep*u5Bd5ZHqNz@H=@Dn&7TO{KW+Bfzf0e$$~QI_A4Ege_qrp8)X^&r=+2`SZV}c|wy372CWB+|NGAbvHsv#9y;g-wTDjz5waFP)M^z@;w9m!$r z4Qc+-*l9y=IO4|}`hPDX*&eos2F~l%%&Ad)?r6G)q73K8+1ToVZ+XoTG(I$tSInL* zmB68qeIbVaBObA)dGjgJyJ9t{^^W)S`2BAEj?RuqsQN=d0ASe%g#S^@3MsO#Y-mgw z)o(_*#167|Jo7{(R7QI+4#_1~TXg66D!qV6b<;<*NITg5prs4|(C~)XuG85~@z}(` zTs_bgUlPTqUG2sAG2ZzCpr&^OXb=oXF8YDD_=xy7%hI@k4&qjjZ+$d3fPK!-D5qZ3H@{oYh>Z(j=eY+liSBH@qhhjo8@gEuZ5Ug zGhqePq0tpY2$JK3+kIG4-2X9c+Z3?D1u>UQ{M<4wTP4b0V4>=mRs6u=geF@&z~46O z^cX$f6BbUJia73VZf#e9tl-w_ST?A(qo|eD&4<2X0yFE$D1pZP2}avK!RQE2`V)+{ z3zuNDk-ae~Y8gg7tXPD-uSC9LLlp9}=~`&;E(Px@SG&wo_!H~uO0bW*((GMVvK=0& zQtlk2-^_(P6xk4#F`Tcof2GUSK2mma@!vhP;(Az?;)})$BNo`fQf1*RPqSDApcXCmN~lRK zF>^?#8N*}90L%qVG%l`jnrJU!_^~OXW-IN}LJPFA>O+u5pEm0Da<%GMDb^c!r&_g2 zj?`p!>k@QaNhxM3m*E`B!NA#J*+~n)UqJ@%=?rHvpB7wL1blDA?KBr1&*CDLk&9GD zE-G}#MYTk@sFny9sUKX{qjzxGfZoAnqvRr~ALF`gM(^OV72eEc+tg}ZmY{`rMnHgk zzPmSy4l*hNw2sTVS)@k6#wwT8B=2VLY)*{?$UtozA*qV(J0*(7S*L_$)RJVcjVVQn znm=-ObQS=DoDolD#eaKSJaw9?8SyGNRu^U;A9+ID>rEgGO_8S#s6=ltwIQWB8bkz? zvZ=|izhjpop|XJZ>dzksxfo&I%_l^}>1$mv7w;kETADqGK^Ly7HF-ju112z7TWmFQ z6lUG)s;#N9Za${b@TO#4MCk1Hbn3KxEc?xbkH?-Ek4gYtosXRzHHuYxBq;F`eX3n* zm#_%z5|SFPnO{#}WJUxxL%rR#nce8|jI#ccLDKgmUsc@~!jyg5xG=r`t^C3-% z{VmnLWr=i1Tf*P%e6`&tU{0c_{hg7dE84Yp2Ou;mph2t;s6TBxSX#8=Y-iyWmXP5; zCquqS->48LW87RzmXiuF0zN$>4KF-dLW;d6q)Wgw|FabC0P&G)y_UeXvk(_)kzjl<5XK&zWL#SI| zVCfYk=8|(bFLzXF#PClP9ZYnmQ6!lKv~;IcI6)z*#CZx)CA5905*KI`c;%}4p^GR> zJ4v5}C*=21v6qn?7O|cSo3?=qEMg-USi~kSu!zlEGI^Uuw13;e2&PesSfOs4QJx(= zxBHKcq&a+Kp;iPzD#VnN5FsD@68YdFvjrDfoVdv1)HoAJVCYLC1EHt@zEZaPRk(_< zJz%=iKZfEdU?5XB-6L;MTdozz$Q#%@t zAuX7)2OeS)n)DqQR0{&IUO5P?jwku@uHg(!vICu2G>0m$#cIrXw@jH5F5{GaI)cuP zoacJOHHM*z4tWUnSk>-eBre)L=!%p-cV>qcTyl6kuo|$}z+L~)jCLt8!%tWUY0R@& zQJ{f@GrvmG6i5s)eN|byi1wYp4s>yom1Y$t@y`0CGRxSCtGP(i5}cx*3!l-p1*ZV> zmZ~`VdM}`C1m4^>Yh&G}iVm9jRv&ms@p|@Li1AwOy(X3bx%G#-sfT*W z9zK)|NAoNg_H9R%9Wb+a;)PrU%v_eh#SDDCNr$0QfcSka6l)J-X5j=fu@4}zkfJh} zNT99%A9ZgZZ`obf_pXP%_u1#{b0#avgbqw>*V#^Aom?i8*S(QILd#iWW)hMBQLv?b z-Bw!t!`BSlG9&eJU#~nINyL;=jT$RxxDGxrph=CDD?w=)N~~yUo2qTS5)?HERn$=N z78S^Sf4<-EZ>_Z-X6DR8VoONY*?X_`Tfg7;_kDi)!GNt31?kN&dJjRgSjVQa`Ire= z_4|bkb;lx@->^+33>FE*ZcSLGtRTnUI3D&~pxB&G<#@^s+qX~K!>vD(6wNhM6tHx)sBg9H!bc8hYY`bcSE?~r;=9}PuyQ4Vi zAZQ5V)KfW)GA$4#Bv5ui=++JQSJXxY8igcFX(@bPy{}-*;8kEr0k0CSHn@zOS*ek4 zvtm9UA3R|g20nwobHww3WnihE=QeGQTG?)9a`NE}g2LG3>G10873eKeq?+RT?A3S| zxV+qvHyv_OR^QdS`dT4Pa%O(axYaqPWsCh4Vp9vc{(EyZS-HzAH8V-=;;w3ATHKiF ze_P+RMTYO}0R!dy0RvM~2=(0EykcGbRniT*{mK%m>e+H;n#1Z1!E_N-ae=CK zLQaDja?+L#dT8e2%eM5wq(!2kWNYmLIqK}I3&D^zzMtHX#pc#$K4}K4^D20^9WgU| z&iy`xS$9NmZNV-E8c~rEy%nT`%>QFpU9gM0Rn6 zN}Lw%k4nix)%~>eNZ?)XyZ_D2RZR=dMWll*2*sI}2vf#6fR-Vr>BqCf%U*;QfGR*; zE(SbqZvx+W^$3($kFFxKY-~IPQDRI1e>JIS!4EdvH7D{zt6q^JhG%)8S4|J|r7JW} z&rrGMlQo4jHNF$=#*m0#1mNFIe54%~?xYE|oC$dpPp~X|A~*+eAV%Csu?ZHtyIEhp z*7soUFb&~&nuhD_(gN`0S5Lx6oJY=$S~PoJM_L(=)`VG(PDOJqbmHtBgU-+&pZKIw zgoT47c{LNSK39g=9>$5u@*c;lm7ai-xn|Fb==DAx6il(^CNJAS;WzE4`6WD&mosVk zcAM?We7UXL&)+itIMMb~Z}W_Tw0J+A2SUR8ld%Wk4qNrfw^}xn_O*9&S-W*Q*jV8~ ztt$=ZJ~Q?$Eht=PV;|4b6ouSh4g3>kt@bc0{AnwGd(f6(AS%IbV{5NC#CsJ&>TSm! zw&SZ&4bqVAhI3>MKb#*|wvpr`yZ55$7;{5ovmY~w)!^pDCY4p+z1j$qUGWFc@2Xds z1rJYLZFfpN(C+AZEC%Bpi00J~lgZ)FCq0}k8(&wxDBPaBY9n4{l&uI6FSC@m)?^@X zu6Z74!MrQp!cgfgyV8S33h7aM%8-aChkoIGm$XxaZ?ff=_>-PkYTi$%dB7_77w^jf zyVh@{>Xgja??IE$&kyD8pjB_syQ_B>O|>wp-hFAhjcJSIFZH`Z0R@<&kXa@xF2qSn zl)XX~#+J|lWf&MWmxW`Qnr!0P9R}d_S5BT@DJF~d>@~7_-5u6bPm=w;<@OgE3oZ!-5E{Q-C6u-y@rr1L2S$wGQf0|keN4M z(W<0n8v{Vq)iycJZbA-x9%1`U2h|&yU@n%jakRPXWq7|%GaQfanZh1e%d~tM;v<o61+q*IRZ)YbSh^XCzZsaFB!SPu`H-5Mn12*5*UD zSTxOgS&EqV*`_&6q$Kl6rYD!y17K%q%bm3|M?gqKcW0AQqirCm$?VhWzmJJr1Yv&_$<6 zK?@XR)Dqo^?}G=ft(Dc^n|+dp+_DQCFYB{gjZ`qOUj9DZGE7NQG+-G7>{+e(+?@8}1P_LNl^A*yB$4 znX1@CU_PKLM`X8`Db|?IyK9(9dOwF^XeDe~4%wBK?kcvGw$JxfekmU{^dkdu=tncV zLbVH3idSb@vyViJWiHa0RlBmJ0~Z;;)s@6pjVLJ#=zR3ZAA`h`?`EnFiBOO@17_$m zTndS#CIN|1lF|vZ^N?tR(4b^>i=0g?1)lE$69_OqY!-$IMkw!Zw_+(J?8sjaHn@T% z7O(w!O8XTGmK{W|cm==Q`ATe)sj##MXb$5=pfk9P6b+tGjWnQnbO}`qz=aal3K;`j zaD&E_t40tj9AcqdAv@0mF;}(>cS6rf!_Pyk4fZp^U(2JmWZmX&;ZBf?#Yk)E2&1H@m;SFyQJ|HBeMb9%Rc_kVK*4OUFp6csChuuB}VUjn)T7Bt}D?(#c`yS04-&$>53I9zOE1s z-y?y<2<5+((VJ|Q!lOb1lZ+R^@rp>?jUpm%dy;-u)rIt1MVfp8$455#PYPulW_Q|Y zuf9P>D0Al`uCj3FtRCxL>SCExb7}+<`(n4nKP3Gi%`Wtp{CLsF?Hqh~X@RMa+eh+6 z2lE-1brxT8(K^4X?^)d}I(c0eZX1c08N&f!4OwbR^*UD-XMPbsd$IRMlawms^1(OC zHvmKwL%(<%@Uum}a<^MF1Jrb>lt5+*tAy^!Fhqwjq{_-INMhwMutTgdyNr0*_-2LX z;m>H5<2Ne2cXc)tbW!&>ze#z5e1n5p>ZtP8u#ZV8m1d&Y7WbeOEBXcMmg4tnSY=`p zQlyler+E3g(zBQh`Gz)}z7=O8OY?FbEU;tAr*yW%PbxdGSj3d=XM$8(c3xdG&cZq4bct1Vt2lf{F`0SUN1EFVh#YsAw56A+5SbyrNT;>JzNAP_`^j$ zoM(MKce(HtFmtg2WYG=EfEZzMHbyv{lm-PM->t`CEeqO1$^L^Q+g=pIz(sR!{Ow#c zoo11tD?; zBQ86DN+<&jDSP&qOj!0>&=De_TWN`hFn^BkrFiD^NJ{1IwF@Wk1a`Qx6tTbaP4NOh z7g~S5p4l|{(ao$BCsKY@!^@4=pi4-TAh8B~&^?w(0};2kn=X(UpQ$0u?)Fmm82ga| zzx__piTxT0CSi zALe@M&kw$inJH@yHKVz5vtZt2KyouUJ1v{1zxVf_C~wtg)ku>=tP0XW^i@#osV?7t zW5)ls@BOOgM^0=GtM$!MxmD5l>0R~k8;P?6fx@=wX!TD3zek$teDePMnG&yExUdyT zbx*`zs7O^lOZEO@wsdQMaogmdFUf;k+KM?lNZ9!5I3}gXXm`4D0N#p_6NpotR{_aWj9bls~;M6amxuQ$|xH_|54*QEO zl-uAB=i_$~e@KjBJ^Uv>u_UzJgI6b`U<@v*&Z<5pJs4OO%?bL#b`UEP#GE-g#0o*I z>_M!PKxQnQ`lDQFBS3-Z8W7)KyuC;uPugeoK*|HZOx@QGiY>qpp8N%)IwK== zXSc7UP9fSaEwc{K@kN#4t{TmTfy&icw)chE zm=tNBj_A)~Mi)UDR5n`TXDL zz#2}Nr2uX4sm)rl6v*8QuFR{QvvzbZ9{Pox8n?QwX19$N5`R9A4Rk$`)Vf~oVi#sZ z6?tLtg+O-_eOb&4i!ZWFV=NcqV~|2!W5-~!Bv7X0u0(F1;eGpyC*k9~7jk>jWO68A{keG|&A6!%oz(v&nT&M;(8%lfb z>uO5KWA!9LVv0LMLA6Z2_0`~8g0U&fAQ>+aM}#N-bjd>@t?eO~#H4?lGl_?ACe6T( z_XzsJ`YvaMcngQec(QO`l(_f3rz2^QF-;F8Zf<=1%6OtzAInc+F8y{ z(%9MaR`b{yeBj^Lv-?5Vd~P4kXy)54BrqBtGsVXTi`3uqdGytGj8VrvE@0o;C_GYf zQI@mj1T{NmvyR}sxC#C_lb0iX#C4gzx}P=MwO4_) z3DoA5*TeXldTxYSJLz4YEUMpb?W73Qh3?+$YQE#mIe4I(9&hz`Zc-dbEub|x8R_*A z#@~dqNbPrq!uQqxJxc5Zm4Df-Dd{ZNtr6#BP+5ZFV=@QOB8A!y)>FlI(FK`K@d`WC zL*KuxPT2}-DkceY(ib#rl`)^I$qEL z$wTydbRsfarTZ~+l?~_3U!ft$5j-bNwrP@bcatBb(Ws1tatp>jxWy&}J7cZZY-K>O zmZ@KzjoDlpo6e>o-q+c|a$W;x0hZPp?_3y-S|;F*f z#~G#C6ow)-3<{AN#tNl|x$~NfOgk=?6tuiQm2;5w$>+*NWA2O*!Wj-TE7na+Nopm} zcAXhV3Xh!y+NzJPCXEUKVDQ)dl8`Ns9$or81Ap{i!$~rv|IEPraLRu$XNt(()ZiS) zIfY@JXE0vJ@H4M_-|1d=|LI=$!0hW>>yFoT&VhK{eP1fAZAG)4{`kTd+3bn?E#;wH4s=5 z>9yR;PNR7AqLUaVL9_iy8hUJR7dMHQ?m3u!{c(bZ9sg_|oEbmiLj$i?`8@WgzXA91 z%o`4MNC@BlWM=gwrs|(})!)3HFhU}b_h!1gwQTV}$I4fn{EM|>*J3(uj~q7){cA3R zvm2XT?Kl#91&OVmP@7}46x>u)lS}y+SD&}o&bZm)1OWNJnri@p)qXcsJ#HpPXe*=Z z%gE56VppXAynVXL*A{8Pu#DiaMEQ2X$&QlRNG_dpV7!vzjOJ}$6zP&M`*H-gSg7PD zI}X1Sdej5m%>~_}sWb*2B#hSl*zu+~E*8gU!pU{nl=cznAVkRR17BBvVCPZ~o5w7n z1ATxwJZgXQl4P+PRs=t6PW488UpFdAsy=(0wk>$s zwACffXQ~xz6%5RK6)I>vhg8gnb=UZAE`q5#^w1_Iqg(-Cve8s^f?Qu{LEoEe}u z(ysA1*);+tm!q4zm?{mOa-AKaR8G`OE@NtF*!hRpdH&TN-NjwyxBj0@E4sonTY9Jo zEY=gAhxTl)Gnnnc`m{jDYCdSslA)y$?Or9PN-D85-Ae}|Erz@X;T^YC{KeGhu14q< zd0UsXN*J*b?Tu(ph5af(al0yBsigN!0TAex>%{reOi0-#{h@i{&q$Oedp8pfK=B4@ zbcjb-A^-Xc%XWF|P1Ptrh`t5Y;l1>Xu={0fFn(8^07UcLl0vHP0EUfCnr{JFgJOE^rZ?Qw=1lmL%wqIP4x;CVP!y(Z|JlQ2PGTdYQa`=6*r9e`SNees zlx@Ow-TT2szBevyD}xn%vQ`H2eOfC6RYmZngzAEKbyipGfRosWWfw^xZ;M#pLmF}1Gedq z@}%TPa79ja1}`y32U*Qbq5WEPg7#W{p0H7JubK*B3FMe3=6z`gaxBTE{9Pj>Qtc(| zQrGq+sZ#s~gUL}f#6R-pNv=}db8v1y5 zVtY~oJ5A*704U+wAyYTDC|T+L5bqcMq-W*Fxm%N}zLjUgkweBY)mUniBv(^eZUqDo34W-TrZGgP~n7v$sWhw>I1BE_AVeG{WcsiDm*1(p!XECddm>}lXk zDX94AER5}CHu?SS`S-e9BkQ)<0jP>*OvkrCfLB9WtoIqu0_1@3u9 zd|7=Qqcr8jlRDnLr9`peO_Zh+Kkx61XT7uO)sKx*doH!}uy^b?{El}-^&dZg-Jrpb zj(8X7f!@4<5vz9vx$&a?Er7lF4`+Y%>-cc|_LQy<)fGVV+ zBBXB7s{vfL?6KssEvezwG0&{arBc7reie1P(-!;|7%cqUtu8U3?9X97ris=PHF7LByH9)m-d=xYZKA7@?4cvN{h40}DpAA~FbyX4~`JOmR)jl&j` zwmQqmoA-Pe3ZNNOnRq!ONIZG*M+MiXs;JZxT)SUlpKlMNE(2IK4~GH*^KN<8Y=5T>?XlWYb5UDrnm!$%aT%9u z)w1|1I>Es&_7^uoVq9*9YPjrxXroje_4L#n(UR#RuHiD)TRJVOPpM4b$U1HfFNxpW z(c8eg3rp99o+0dA^-xaoOZ0hndQa#`{%{+4Ms%bu1>C%chjH4P5{6s|7BHe)6`B}I z*rMFE7j4wlN!~uJH>{)d|D}e~P(uR=jq6<}+ZlK`im|vAgWI*VP-j9*b8<#!kOO|h z($+`!+&kT1#6}q=(y#m;D&M@Pb$!ot14l1!>Hh>#KUm22GdDB(myT97ZEl}muJj8! zom4zDI8iOciK9yCW%JL6B|zJg>T)7#21)e^K^&)3MD_7bxJnAGL`T z^~UYSg4v0hNIWEp+m%5DDAS}wuPf1(E%b>X@sRNrha+qj8pV$m#LPnOo4DCi{R2R| zs@PU}6S;)WQdWWmWW;GXU_O{YUsyAZ(V=?nkhq#4--`XO#dyM5O=|nm*Q^X zem|F8*U@Q?Zs^z1Vs21Z*A*|}!d!0Tf_LHOq!D~9GnHVA(0MZAPUd06tzf#l2}fTD zAS6uKuiwn5lk&3vNHXevWl1)F&w^$UxNdomr zfX#=oyw7?6e(`>ZhfDRF`h{|N5iT(iEpOvYm5t*xBKO0)H5_?x}d^vgipE^91^3(K$myz z)qMZke0wd|-{Fe+&R-uDiQZ^`K9L=n!q5-Ym!51_(eZJbK427?m!MUz5QVcM1Q%L8 zz4YX?RFkXv7&-zJ^RXhN(0s1r2rHjkm)iMidjPR0u(<;fgpLXEyGuZdq&+Fq5y_N9 zk}HAgpHWIAwU&A8G!xxM2ACCYimbmqcGERNJt~ht$b+7h8^{HhyA%nW-*daH&YOkYML0)tj`(c?0-;KX7&$hbRd*V9A@FOrEGcSiK3wACROC zW&0p1dl*4kUsBV3XYcfqL(au4S;huWD@uNf=%H=Eke_1S)K|g=8VB#}&HCk z^_l=`k1uyFw9COn(W31^x>>mJmR+w$J5NFqb%JrvlhC;ZlGjC&WPkCih4?F}B?6!s zLwv;Rw7+;YtmP*ArUz3^!e*d`8WJu{uf>dI?ub@>(B`yQk#H%wAx1qnM62A4)W*2o zYg9oVXVT1%=!D#snlnX)GkdPt$$_~Uw^sCX(IP+@QUiJBHa_L(ftVyZ!KgX|>gZJ! z4nkpHi$No+$Tn>1F#emFoBSEt6i`X>1zshUs&k*L6Q0Ot+$W@Fnfs*GELmL{c`@Pu ztuFL+HfJ`u(|_E*B0C8u$c%r*ogl*2{l#lxK%Mi_xgf*H=H%kKm3A;`Rnb_W`NAjA z#-v$EuWI`+X}#fMS&6m)0Cbs)g)vRWIt-TjSbQ?f@n#prz{(pZt&uZ^&nW8pk=TCc znp*H;FeackPhEUn4ed-#S7F}CC&MT7F{y0mV^Y~Jb(PJ!0uR(9m@_ErOXv#Bg$ZsY zmF+QC*-i}>Tc|9}yqfpnm>sYKVIJ;E4@J-ysd?<9;u5f;EZ~|V=mT%^ADWOkOXL+{ z-XxtJ7Q2%?N~Sof*;~JAGfPDe2h@G9Xx_Rz4eAn~FPiuMo+$9Y{e~q6=B{VCtE9!m zf>14((>xw?gN?5zr0aU$5o%Qc9zo`Vbgl`IS>7B`exPdVe^*pLtg75l4C0Adp8|1P57<`Y(Rk{5xVfZYS0GSLIjggEVA?;qNem$-cotvcQf! zOrra^mo;6Th5aDrB91X*Is`ABP#d)nu{mG60p~q)Y~Wl=?FQ{VILL0uZb&7podE7@ z_+B@~DxP5t|I}_Y{Bqv&^Q%1#UnUFF?0`j_KAJY8?|0F()?9)~4BM{o!jKU4 zDVipaPTM-kZnj=MB3G^5rF;sJ`OTfaKio{boSS!>3eO)Hf+9jVge(63RHyh4H+Kb* za`Tlub(!8(^T*}r{ecmxf%;wxX^hQ4edXK(8~L>B!c>eu`hlVC3LAUwvq`R36AlcVNOyqe>gwL-@a6z205 zfB(upSFZ;c3ms@o<0y+^hMs^Cd0@(ax{x5Tvo<7%nbWYSv^#DED67XJgL76uW0ApY z>a{j9IAcU4&oGZ;2ecigumb`P8}=HYVY7naRd13Fq?NLGX`aNF*)F*WG%bgQR?zL7 zn3p)3L4q4(!szp<0yLP8(aiNE>YqW9h1BLJ@kj8#PmFv68QtBa`F<<&4K3fgG^Lr^ zo7_$+w_Ig0LA>a=$y`8K0ei0IKj(8I+~CQ6+wm*ueVPFL5{JEPs`Y2Vq|LQKUxD5&PXPFwm^`=Riwq5w)IlVYL$=!aj^ za$WD|7EF|3ia*Z1x(&Yuz4I1olNZ71aP$=>>~yW0cN;hv0Ck1q3KDt=YcyJCHAO2f z<}9m;P|o}#sQ0Gb@9UKN6p1u{DZNYm5e%M=n9bmkJJ?Ja@|ezs7-Yg9Qu1EhxB@#e zvh!{vDX{tRPP;I+}mY^~M^^nEeBpf>5y=hg#BZ7y+zoRYoCs`1Rn3kv9CB^G?k|Yp&W zlw)1$VyBtUX)HfwsDr3k8>EX?W^VaKGqX95IxyZ3`=4k141>LC`_63ngtDUfvj^Ux zjI+cr{Nzv{$nc9kW&Odq)jN=}E*XB&eXRAlJ9)q!G^lq8GoO332y3l5X833kw#2Bp z!i3|R8-7y=#ABvvgbu#bxwegv50 z(HrVGm}|IT@mf%oSZx9Y8`{){{&2Ndp( zvmHggSmri)WJ#U&(md~3!*mDgraNwZap%59EFxJH}G7IN@ z+ho0ZZ!f}c_FYQ)hTbe{79NRYM`qRQI|Fhe(44nLmNwDKxF#2S53>v2!(T5;6?QE& zX7~%)M=_V`5A7(HhIT%^gbTU1RPUALD!|fhuOUha8r&iZOlHip)fjnOq3u##nD<;G?f3fZQQc zy5|R@o3lm2-P7`F?0V&#i0aNaqBi+Ne#S&y5GdQkGay-Z)`==SS9Ehld2b8Om)Ue#*Qz7lY5SY^_BYo6!Exok z73i?2(khh%<$=<2c9qVf9o(iRw7q<^^R16A6d*7v?fee&wUxY7du>``wBCK;^UsoK z5+Rg5K#3{T+U1_zWZU8JO(JQq4Dk(2vn-@=(bWP9rlT7oR-Q@;_@;ed$6JtL!Bu9t zj|>;#2AhWMPYz`s8lq+j`}(>F};QCB*8LgY{c1wWzw|VErA_mAj@W;@mwQe?8C94dd?iIjrM5 z8S)OkAn(*DF!5fjzwYQ6`JvAS#f6H{0o_Iu)wz1}GlD8-I0+qbx4P0qIX6`Ol^BC? z4ChQ-E>I;DaL-D267FPHwQ7W&OW?e#dd+l1zjA2;U*9T!!Ni(h385U^T82p|n@M3% zH>Hb6H=oZ1w>wS`w}g$)KW}W5+?pk&xx7h7x$y@Kl|JwzOR(kWocKB;%`IZfi|4WB zpB1Q{`5g;g1$y{$;p<*Tg$f(A3{&gYnju9gfksH9gT>z-+))od0Dk0me&9!jH)ip_ zWmI&r;qs@34QHUD1eJ@+n--v=609@xj1cegX*)ffBT6hVke|P-GKN7;OECmKh-ugle6fRNEs-v7JsTfrb2=XD z)k$y0+3qqbuiAnBEj6;Ax#)90*4-wkzHr`UGl6|Yp{KA~` zc)7QZn!zPcbkYvZx$OhA=DZEy(ol~Nt1mGI|53xHtI9VhKzLQT^|#?qaQ>S~faCHe zlHB!$dQp8dCK*oUn|bJMG9bykAezGEHZ>0TEB{C?Dbih}sStRik9Yq;{Li=9RP9+} zAocJlVZM^Fc`1PtvkT1TBXOg7GyyZMjyKv8&tr9jedbp8Dy_qSrPX26YIW#f;P$;g_h(OhdJ}&32EGT^wD0_LRdFv; zh=_ZgKfk;`e{rc2-0X(@CH^!?z-GUlqE3jAxblMcb1xM|85a+i%eDt=w5)CXM(o)- z5ARPIPbndyXx{Y{4^^*fS|5Q~c`5Y)g|_;3+>OrSWac@RQUsM>q;kY$=2?f=$y=XW zjxhljjF|(S5lGpdD4mNaor@@4wR~VX7wdU>6-gWueX0opb5V&C7nL}1IVWcDNJ;Mu zF@s(OpIL(DZ*c|JnS)9W35zCJ)hlgbw@!eojVVB0&34H)up79j-OJZ92Q~~!6?0hW zj3vfN@rL9FWtA|1O*UI-@kKRE0IR+rN&{o*kZ7Nu;wt3$3}g@G@SiV%Mw`$j1D4^A z%j;Ej!JiJAzj_m_t{{lS0($NzHJ0MpThZm`gL!518Tz9zW5y7Q*G0D?8-dmEb@keW zT~^+!S@WEf9vEPkW+Oc8a4n**#Mv_l`F1Tz2b_sD<&Jes!K1s;_@rn|2^k9 zS$V}3qrq^j->+D|;*u*a;SiDX`Q?dnx_;wV{GD&Q;WwXt`4-vIb=iKZskqqtVi-ZG zE+cR*hj&n@r@suE4?@91C^+(8p67?PJ||Xc>Gb!(6l#!z^4qtSQ>qO2F;=}eWE4v_ z@A^&&p;x8k_~-hNSEL~=TCeGV$;~zD%K^S!pZ%8bue_>!v}o+QT^`(i;$yox1^dx= zTy^)!X5}9qZS?2srsIe1U>4lSTmCksC8VZE?sgMnEXfj}W;p&3!RKWWVh3h3`%aS4zSI!18uR5$bE0$59c+dUf*% z4-d$_J{)I7A@n`Jg_V&h@v2lF|CfB!%V$SL_^eZ+E7^0)bZxIb)v3(*OrgYp^SPuuHqa zt}3^|CqJs<4exlM`H>fw+oJDn@)YJ_?CIiz=DmO9_!{{wyM55A8&A&Bmdkvcl;USQjykX;i#>3l`TqCh z&C|b&?g=b=d+#ad!fLUgNGh2h-O;Ey!4UU;W?=}=-$+A5;>M*u!Bl)CQUfVPPmgG+ zk1ScL=W7g_?~nbAl#R+qN(EAo?skdTEU(TUqG09NGLBzQ(wX*mrhT^t@-HqQ*UKMY z^71%&uK7stsYvOVe>o$62G{ecU;d{*|J@@7C(ltMo?0@Zr+*BZKYO#YsmK7i#FvwJ zJZG~c{@TWNn{Py|TmNy?O;t5*ziINq;*)yICzrg%Q%5@di2RXV{+3iX+yg(o(s%ey zTD?PfOWx^OD1+vEVxuAvCC*?^Rnd-kl$~nB4sJj2yMH}+>~tb73+uRsq{8Mpc*)cG zF<1$D_MrI_kn>b{EcB(LBc~JPuh;DYPsu*v0AIb+n;L+{)`;SZqt_ z*bbg(YJmtE7WkJu>$GLgf63nz=dq_F%}bLh1ApK7$dp#13{0Z1DtO$=>rJ7*Uvs;E z$=vqL&25j*&Ch$^2!l|pWDW|QRC9>8P&lDC(H~%e**tgdP0#f=#lh}TLE%hG!uk=7 z^T?8Mo)_aJLG?Tz$J^nw$El;t>4XTfyXuUALfb+!)rRb~A+qZJqS@S~I25Xn?p`jIXu8=ht9ly-}A%{?g4~e=;wW1r3x-G1z&B7io z)Y#NqtR8wr8CUz$xCb!xvdO!Z+p@$K>9yepP}wG6ih$Hr*dkUn!|4(59*hvnV%&kf z(bdpgb96eO(Tm_U+h!Q605!`YHlM|Wc`=ZRKakU%77tfv2gJZ-Rr5ekn;&)Td*ou< z*f;r}_QK?)pgCF_mhkYeN4emhqduGV-V5*e?8~`x@Y&WW> zHnng}j`UFn|BD7k04O+)Uffmq*jXTxw=ct!x$P?r4*Obe- zo$n-a&%ixz4MyJpy31WcAYyLFai}Slg^TUrlNQs0NSo)uO$N=M6Sb6ncmN)O1GG9= zyjpd&efB73`wtVM^~3whKeF7WwnQ=bBA%hLv;mvymQcx3QXkV~_}>}yoNoSZ zcWLC!^}IVA8n6bZ27FP2_MPq+V4UjDY31$YASQD05_SGbNeXeIOkP1!BTR$KO<$%uyKn_00{Zq?btc*|G*4g#?hAZgtp@7Az6a8sQh zhX>2EgS>holky2X@bE(XgmC8K({ym>@pNBX)EI4Mz$E8qc14v=D_up?Su6 z)Ia|pjz?YSjJ~i$!u`+5o<9Bzu%}=ZT?pVJvWlM^5x85(={mD=hUZA`{LrL#szRId z3MDIRwxD{-&~vOXvP2I{TY>7GQ$pFsHpt*2Yvay?yZ$Er?XkL~7~`JOL8xk8daQZs zxBM_!`ckVFDjtV-tdK=M41ti21pTv848b`q#aE^4Gm<%nrugi|O5h@cW7Cz5LX3kC z<73u<5-uU0fW>>`^K1g43c*3lRLZLl=8PRm&CJ*%FFvp^gzHZ!J2tQW9?!&fETJllIE)5yB;{KEr;^2`fZ^oif*LIEYR}sI0pvz$Tu-XWPw8Ri@ zt;OlDa4)usFuG=6CckkA#2Ty>Sl6tJ=OT-bwx@ne^Uj~5xR%4;7FuUm zT6ow0FKN)OjQ{kr)ULrd*FC<;&>WD_U|SowY-VOZ?o&%oDsHmajfkS9Dn}L>y4nNc zs0PK{^qytNONKl8_SIR|?7K+;CP`jLv}8*%7f>y$o)Z4|aXGnVM$MhHj)x)%Rvw{c z$sn?kk|ITQ#7W=6K-54Jdkv^%oe(oS0{W6;YRrD>ZKai4r!@qsGC7Wvul{aA*qK_i z=*>_=Ow|`#Z7Xy_;E>u+f~urem{2+il6XP!4q66v_L_WokA z#O;Ei06v>g*>00U&S*cdw$2I&`_#I?v1aMxEoB*@B#;1SP;46o*8xI)mc2JRX*9n? zcwSfoSElb?A#iK(}9F49W6k;+j)^&dXZ=Y?HDhD z4J43|B@=!aDdn)yUSA=(BP1_S`YqHc>yBulS$F&SwrsA)y4%N<-FuOJA?J~xnBQd8 zN44J5^OPB}xF4>K&%@3T%swCFYM5NsBRG&+&}V3{hJ#UyUHX7qTjlr%Tg_7s%6&S-3{5vse?u%uMv5*vhRoCHBz+xc}J!=R#W8M@o0z_sq+v4+mcr!8OHO%6gF`1 z-tGGpi^K{+2~qcM1|+QTzvb0^I1i3tevqfaHtn6NKSnou|C0=gPq%!+aRlyT96L2^ zaBN#KU944wK+ga5$1<-O!v=fp+brIO*j$ zt5e7%jpq6|0VIjWK*jcc;6b{>x}sRC=onQ!G&_MZW-oX^v2nN$ut3cR=g;T$x@#o|`; zUBazJ0FBrYbcyV|U;n9{dO4t?HfCk{b7xZqu>nxmLm3nfB{T#WNYG=PP+}FkXqJjQ zk+mhnu$%b(@#i;RMD!AEjFhjgFYZ!h5itjkj0bp|IBsIls8IwP7gWdd7F!8|&bYp_ z%6H8l`u>tG_3$i;kQf)YEIo3j-$mDZY;mW0Y;mz(>uRRE)AqT`SR75cX1h%x-?G#R zBqSqBm!#Vu=~Of`=uV%pBt=DQWFC-vv;)RRLkiglx}`Rhr;*@#+5+=G7C~oYVd*7-XUV66}(5bJ~>#(#10XxO*PAaI`pND5A&)ZfoMun<|c}dB_r~xg_90fO>A8cq`E6vzQifN_3Fegm=i(*B%y@;iB+W`(UK8d)XAiw9eXD0s@@=@`Qt7^r&^%CZ_(akfrII>~Qlhbe0s zH;@0ed&Wle{N|*srg*tL?gHh2~3%>ENSX73p&{J5Oi z`_G1|<6|3CcAb{zuaDE>JjHF;JpQvWxyW%Np(K{?$!qQEB6p26koet`(uUO|(*C=) zN`Yp~#`^7fIZ$d_G=rLvXGSZgc!mW=8kwYF`62P0NIYBZ&(8D1T3H+EVV)VoAXcasx{sKWasJ6HR3l?{dzrg!Bri5 zV6Bv_d9Iy)Kr7v(54;5LKsNc1q8AH+&i$Q6u*8(XhPjI91?*F*fSEE^Dwc6oQB#Gm zGaDwviN`W>GhxOwNJAfekpcy|AtsiRngyGjcZJ&hxPz)6k1!u@@|niH2v!c!>`R&C zu^r6B8_cyI@`0D4joRTr*_^Ak=*Jr(9N^pqZOsy}5T1nv8>Yp>5o|z3cEiL^Y6_8R z=JU)OIjBmflH1JPI3|)}y1TzNj1+s&ei!S~YiVGqrf}(*2phlxJ_Tn?p@a4@3MW^w z?&{(YU54}L9i;N=YFgUsZ-jE8v==3HaoM*yl9GZRI+8%7*vtwj&@1>LvcQrjHSH^b1kD2KubNvJdPPleq^aBUs4XX#USD}%33K4*dFa{Bh zke+>`mEXfWBI*3D#rTB^sm|AJ2)~OgqVaW5oLMG1xCoE54lY`~t}{t=Kwvg`YOpN) zclr#v$jzD!|EZeC$Y}@Ge^SI2sDfkw*M8CB9KZ|F4cnT=k6kEkB98j%i~f6PCDsmSz*o&fos|Z4IR_!KmiO!7sp+(4$ zir@qro!v4W31iAFVpW7h%>~ zet6fg73s-KS)#!+#lR#FOfZz=P?y;TdGY=8Ns*vawew!i5KaCvjz(p3<>d7w)!tl(IE3FmJfKhDYU+uLi$H?4pRJaNgQ zb8yzHA1hf;h!^Y7Eg__Bx>;VKK1&4Nm&bt-xGajp97e~jGaJ%8_zR}BkDB||9WcDj z)h|SBJ<RV__AR{Bk(aV*W@-h?lK%9QJX?IYXso7zisW9Tve=4ce`^$ zKLyOfIby4DFNGyGZW!z|*|aCS4{>gl4!~ot);HIi?O${l>GQaSlDknxmtGq41(YX;U>92$`Hry#-=W=mq(B zocC=|XbfKZQTCiareg*`^0^*W%pa zT(fsH4F{5K0v-oRgvXxB4~s0slsjlidzFr3++{OwPB{^zf!*&UPiqX^`JRUUc4nPv z=83uh-|l7&Mh$^spHO|Mqb*mjD!(w8UO{cIeWDrnU}_w*x%X+334QyzSgNsVxE8DldVV_F>N%!Me(|3%r`udI&zoIAN*d%8JNF7@?-M0*`s!&_D>7hqnEQAL4P*GOhR9K zikyl;-7{BICstD*?tY~hZ#Cas^XX3%)o}o#usSL@Yn;y@T?=7Nn z$zCtOpTerF8Psba6%IZ5>vq^pILkcmDmFRHowe|s>F!_tf9>w@oV9ALuc}?D6uJbo zaHqjs!;#kcrB>0mP*UraOE}ti^CEQlMqNec6SpCXoVt9YjMRKG*VLK2eACcdUB0i- z`JD9p);WLl{8q~sdVX8Wk{V~wT+i<&n|x}JkLCkfSDwv%B{RqZ^1HEyKYpk8D_u(PR7kLOF>snZu?C^T5%0}&XYu&`S zVUoK$snaY=e=n$yABpoIAb8~*mimhx(`3+ ztg(*fTKa8_KWgqe%zy5D8FJL{O&<;)+h8t-a0rEA-df$EpY=(ByTUfdVNPmDXjC&9 zhby5OAsUxt9H!H5hw`>c@A0tp1toOD*UZ0aZXPqbLE>a{UFmL~yvP?jP+m~8Xz?mo zu=;tIN1MA|i6LBTS38l$**A8_H%tdNX7Rsos=L3xF}Yj1Lz*}MIBXS>It4N3-6Hxs z28#tx7np0`a=;o+-i-Ua|)rmXEc`QIvZfaD<-}9T9bcXyp-vDCxChuY)P- zp(^>d9`; ztlK==RXD}v@b{oKbE!)Ivb*c^EQv~}?@6ckE%7(?5Fx1%?r7rE4t$t>4-qr%Z?gF; z`;;JU5w*7f)>mh{r`XOnfg(LBL9Acaoraw}Mp^Z5;SJ6ol3ahNwwxb>n%#;2o-dN*X;=^_ zH!l_E>sQ6J`(4{x&cPPs;OtDlQ!qRws93|SfNYCzP+}cw2ee>Liwv}E(>o0l&)Cm! zwh$~Wd~DqJfiWnsP-C+rF>i6HNVwYpW-74}z>u}JghkPL8aIjrw=t0#A;2x9A zLVuxXm^PFo5Mv1Np7^1SKwvQFH18&ys&Q7TAIq6QI7Vg)mTbe($?jm_~$ zGdMa0RA##k%(Rca2F&g}A>Fn5UOaow>|kYDfF|TqQpdjtqPkr$3^z(<36tSLnGvo% zxr!Uau+Y(!YA-G=K@FV!EjKcHdd`Q3u#F-zQKpX~C;tH;l z{ZW2?)ezt;Eb6o+x@~v;#j^`y>kBpq4v}=2|Ab`;X-AUN?Qn-)=Vbcr-f4Y=&#O2& zE!ZXTv)F-mu{=4UefF$&;QgOvkF90z`CxE z7s*gS+!qjY$UT^-wA-u7JySmgh%;_cylOF|=a;7PKA&FjgMVoqI!WvP!qeG3y}!S9 zlR#dwR<_|m`Q8(zJJD(212}GX)H(kgj286d!9wT!536BHG2bwy2SU@{VN?>$1q(xD zVw|95N*JG8uj@ zoLXN4JGRJ@SP~w3qVO*k%R0@UQQJHVUu|0->_2^X??cHX#u-g~L{bdkfsDpQ_ZS5A zrAUAiu5eoFS3)iD*h)AH|p%{ zicltrE4z_G(#Ks%K@DZ)9Ly9*X9)M){z;C^x@+hP*G4Ba;&2=*o&Ho*l$(!GpkaP zug_|}F#7ujC<9%T<%$Lsdr-nx&}Q}Mz^NBeGKM&HqdmTP+VNfk4N6pqtJ!Ov%HvzK z;_EX#+`gMP69zfoOs@n}SFJuVE>;%LJG!=`&;>V#wb&A&TG`ef`IE1LP?^4E(CMPn zfcf$ObpSi_i$rR{ob5T74y0R7*JOPvZ)Ypf@KB-})L$@H$K3 z-{$z>w{71G`JKw@HHIcTf4Yk%5q6_w;Z|4RBD8X+wpUFdBBk1!8I$6o8b5^6N(iOd zOiR1F^L}sGDa$r;khiTn&IrD#$RYJ_tGDQfls$mUAYO?Wg^W2rdXJ|DBG;5Dd*Y6}#Vx1FZ*NjJv@40Bn1K=eSO0$f-pw`P z_n2EJ2sF}*b8glR_VdGcZmubDW9`oA26t~#6jJjC8WdfUNoZh1{^grj*%xc|uG?+F zLqUT*TEG3cdHaC~g~WByLPVboCd2}`cLpZwn#j7rg!xZ7jX2(3*t?6pnq0kpM?Lxa zDI9sNCX91Z33|SFox^JlN${UnlgF#ILX$@=cFxYObdM%~AS;MaaGyRIt^B=&NxIk3J=_+ateo+S#YPEH|6 zEm@CBer6Y5@-jJ_MAI>x;R41)Zbqs@E2|HVHj6opesI+Jpqcv^=JcMiUDj3S^z zmkS4}yl1W0b@yQY$fhTs6||AF;>r2 zBlBlJNopiL?Ju^R1>Z<17N2e=$A~+XtH$Nkn}mFJ1n|U=f(J0Bu|1~+_Xc|SAvmP@ zvO!J=S$?w3Jn?O{x$i$39MgR)E#zT=ArN%45JK3UQfvK9t%H@DQ}DeklbpQR)0`zwr(|hiNOdgHY-*cXzVx%W=Gj^*843F zvE^%gd}vc?00o(+5~i>pCCXH{$(gD3B~4e|)c9cnLj|0~W&~B~COU|HtYi*3dr?PRfrC+bhJ6+V5KE~@VzvGTgYm3hK;lryhb4O&C*@Wl>s~Qy7y@*rC zFL&fAI$}RrB9s5(6hA5nj!X;Ot;`fH&NbCxB>TW{ zkX1R+lF0RGb1+yC*c;8}4eAVzSoR?=QJic<9iE))V4u%KLwWe^VmTf;e_SzPx<>AWqfAnX)ZaZI=I@q>Mko1qS7#gW(VgG#R=c{)m=%mf}aKgl@^1#P=S8arEojX*)Sqc6iLakY@Z4)0Du zT^LUDYnhUh#gRUwNa*v+*VL+(zC4n5+%H4>qv#Q zlT&u=uie1SgXY)%eRczqS3;yj%7AH+4$oR$Qz$IZ716i0AWrTH9#ZmSu0vPmAnzi% zX#V)!2uC2_h1US1#6I#Y02^}Claq_)Q|drO2&|2)p#m=4>=L=C{zDExLmr#Hm@-g= zrD0JIqkS+Es_YqVeq$fXc*c`|fd)Gd#RHoy5R87;5AJ5QXT-4J|o0l;&MWh|Ob-IoLv#wRM`*jM7>lNX!a?{8=t3j@Kfxnw%?A~UU zY~740Bu=CO;>p-icDnlGb~i6V@LG9=32@#q?EOViEatMD9&|c#VW%*g^9T$N=6`E5 zKZw^%9s!qM$s;gy+o{C?ghd}haGK#s2@T_I3E|;l)$jDd1KPonT+#tMap~&aAO(nV zfx-VFXCll3?kApkz_qS)SbJMpZ4hgy3)j+HcqL95XVlvni+Em!y^zv9ck0OO=$(;3 zs3=DNl-k5_6T3Js*VH1gKK3k$OdnTDJ%tQ-(O>708cP>2H2q$a4 z@QGXtX+d`}(h1(OLR@1Znc%Gb9m4Nsb;9D_ZJUSAP}q^jEF45mSG25lp6fU;HZ|Sd z{_UDUm&C-d>f3e<&b#pE7}g9eC##P&W)jeilAC+9a(7rbrYB>{KUpc?ucip za?T1o4gXqp#oLn;ZRTcqxycB%*S49qb&2qy;ej|LXu3*AX%ha9^M<~g4|ko;Xp;NN zz0>p$vsV)ma2DKmsL=|KP~x1k&~ockw+vI}97TnPz9C|Ey$v25pB24 zYn7iOV8XP3BCiLKa-6FzcJ*_)IQ>W^8tV*$^BU1QEndz*BtZBt(+szDY)`If>$JX%)Qo|} zy+LC$zUUdlq>z1hFuykno|8X1!y#(!*q|nRrms>snV@0A(Ze*{EF1yNE_8%mnX&ue zruc39=AjHrFod#2T}F(he0hrjF|05MQGtKg8)GE{TDl3`!$UzW1)sl%kgg1b7sQ~n z`M5Ra%0)h+^FtQc?&-ICRzJSV9Wy)Pust=oRc5_*-B??Hx0hf>lEaI;&CV5^&t)oL z;%CK1Ugzxo9g#$l4p~+wrvBEOCqA)pwJ#2^1nYrJNg zsNJ<~HGZ9%)Uo@FAz$%D*u9mOMj&-@UP7Wt)Imo{nOZ&n zO|<=+uCzS=?r-5pnd5LU92T4rQ;(1R#cV45dghXb-#jEWaN+drUjGzam)RzGX4I#P z4A{Z*;m620DMU&X#J)LwUQW;%N>6P^-GQ;i;l5h1kghS9=1SN&Nqz^>8`9QJPV?q3 zzXCn_FT=P>GVGxn`O+YvQnB5+3=#Bz_Ia7Vq^(UyI#qoX8Ew~m%{LK$X+M4B8|T#& z%8PUK2AXEY6QBH0`s1bTcUkt0drwS9?O~%|qr*l=kHCCWG8aj9lMj$$fkps_elaOQ z#KjaHkZd+F)I829se|esxxIopnMY322QYy!y~E_B4Y;yIFe>!Ds1*i>nOBH$%&r1!>jkW?JEy2n-&)0g&(hP1ec7zvR81x(8=l=2l+FB9TL-jA4Jn>_hFC>3(K}7lG(z z*cYZR0t=g6J!tjCqz_5YX!XTlJhQ0R$xT>OtMZ{%6vF4s(U>4bU4DCV@nKl~T?S z7K{0<4I-XZIqYldraLDVJ`@lKUcOI|5)}5Xo&b*+?>^bzZvv-juQIqHul>#|L0!TX zd$?eiV7n{MszzdiW*=?{1u_QeujG5O5_?j}Kqt!8ZA$E>a<1GmOl<-pX4NueoF-|k z#BQNK3sWtTsMlPGL=BCdb&A`7nw(tQxnfdN*QS&E=Dt^&?{xjXd!+}`aK6`LUgVRaR6X~qAxn}B zJ&#p#HqV%KcC$N}Ku<~Hyj28hls_41C~jR|@Z{i2@6jaNMB#OPv3}n@C#Q5d)8Wf{ zzWb-{s|3(<&#RDP1aaD1;0|re6?Je-v*|k`4I-OA0@{H^cDGRmexLT4Y%@Rj<){A~ zVf7(;BdN>y?cL{f`+VF|pbdoKd-LS9aJ)@UJBt)4SG8<7p6uq-xvd`3dMz5Yr1MDf z>b;6Qh0}??RN+#D=sXy`YSbRVX#3q%UzjBsSg|nM3NI|>IgdoIn)flH&{2omLP3=w zzQ71V`z#^?ZFi>|Qs7yO>gR!VJjZ%s`)HmD=D7mA0A@i~E0$y&FU^*AnJxBc=1RV6 zD_WIsYzF_RULi-C-^Y~9qIe?0`3W~7q8vShWV(%vUnF+vPl9qH4Fl$eNIr_`C5(d^ z>KW9El+)eja*L<6mO=!(XS#|E+K~5H!Y4xBD4YQ|?+>+FeOI2klDoWTU~A2U%;Kl$ z%yc1vL1eqEg5Y6fmC1u-U31!O;`Qq+n;2)}0e)K}Lm|mE&nEuG!Lt)WJiYbMw;z~H znI&Wm*He#2b?sgOWzzZWc*2l1v!y)njS!Wd(%^WQ%sGu4%%im$O?7w(>6qV2?e$wy zoHKZc$J>I1%-9!gQ;Ex({N+OK)|yGpKb?IBo9N!hI-E0ry27OypL8-!xGANz{>u@w zZoSZn<#9vGW3^F&Bg|=;iTahp5ww2+DeQ}J!bi)+bM;PB{_m5ZiGo=eR`} zkA4Xr(;nTJ3%}%%%+w%2UW%jb%#zk)+qewV4l%O``ml{{yvN+n=U|8?Cg43WK9Voy zg>@t)3@u_VpAeJz!MF6!zHFC5d5BKF zY>gWkaOb@x7ysz`56p#wbIZ83bfg4GOULoA7qfIO_KdRXLTB`YgJ&;q2wlVwH%?q! zQWJ?=0c**k90Mt`u29k7rPeXYn}ZnzT`pGi%ahX~oJ2kQm1o#5mz5+!c$v@m^chP& zrQm1qm6WX1ibEuXlrb;9h5lZF(;~Y~8Tx$NNvY(xXNc-QO6LrQXO(tQ?CFj)v@u^; zo@A@~H+nn56j^CUX&D&P@LniMq-k|30DUf(yY>8ewX{H^=>=XA7JF_KJ;%oL279kc z`t%078F6hhKQrR4^!Vw{kEB>j_WI1GBg;D1y0}H!VR_Nm>}5%5sIVxt=&!d?I7s$E z4g*E5fNAxrG8E=&O#1JWd(V5Cd(o#%L0b8BzBzBk7yYS;NDy`Hr@GB#@{;z&4J+S5 zb)qK1M^mX~vIIhae7vxCC~&l|t}|4di=GI_)}!|J!sV#FcB;a{L2qv!7pse*w*xy# zY(En!Sblrh^E+^jt)31erbFSxbX~hc8o7(dRnvVJojIvUYAk1t*~I12M^*iUbN3w2SFW}7SEl|@>5mh)<8K<=^&hA@K@@GS_i(|}f>YN<99 z(JIv5715f$L*8|#4AEj8e&=y_bD(le0zsvR50-DC_ca`bB_&;G-D8QtOl$_JmW^{n zh_=dq`o<$HCDUmm7W-!=`f^InI(?bkQ56$YuFDSQMun`R$(9})6GekmQ91MOjM8EY z`!g8zl(ODq7Mt40O7nq81JubU%B!J(6zHgRvS?&lQejMC7c`}hL@u_y0?c3)NeK1m zmFzPn9ab!hBNw$UIi(ZW$%#$F*zIxp(-A-BZOw18d6O_W zfSWU${QLZwQE(MqEt;=-xfEQswmI=#rWr0%bT6uQ_?c&DJu}+*vLyC-zg%AZ>}q-_ zc#zortV{kv^xy}Utn@-s)=xZl*+!hJF8l}iVhE*|#F-+l^6lcAQr!Qn7H`t4;3d0> zYtEby38&y|c!oKP>r!5PXZ(c;imZAc&2~}fJW<*eG+u0-;CBvvqU)+%<*{)hAFs#5 zv|0!-pRawWbwVyAJhG&Hb^b~|cZz7N2Ne2XYpx_WMh#}+z_V`QJ71K5kXGZ??zgaa zdijf3E0=4hgEyG`FrGQ(sF9506;uI+$}_UuM62zh+>!}ce{wGNJkrk|ok|odkYK=r zncLdbf`GqmzTaOgGN2y9m?+O8t5lbi^$TR^$`Zwqvv{xm@PH0IpjN@gURo-I(Le_W zl5TCZmj|VDFlFw_L*1F(Wa7x8f9tKXS7=v#s3o7|sMHg?4;dqp(&9`)-2>n%*T~1Vi!&|^9M?#PvqL3az0s3n@O*$+p?G#Ri~wZ{``fKkXRRr5by$a|n1YvLfO+*V zP}PLVhc|dqzd65q$&$Hh)in1kn#b+T0dkf(Gtz)|r4BLW@8%1B8o?Y3MIUv2vb=PX zHK9w|;h3y1=M++VD%NG$O9WnTu@e`vYw6y*R_71jC9O-JHrEcq3LZMR_Le&*Q(75) zHT1D|*L00^7mE406-zDF=)SsDQY!ES`y#vJMiYbBYQE@`?zR)E*LH>?m21+WL+Sj} zIqA^c`>)v;A(%hp-eL&%(j2WZ`HKkSYjbV_urQbUdlnOjlEqq!h#gQi2T$41L&eg6EMgr@s(9vnGcj@YrBVyj_(9Y2dmP zPcb%7`7OJ3-0|+C-3WyHIdfI-;2-F~n6NRBYfV-W4MN?n3u9(Bxfhu=&i3ft>Ltcy zHy8LiTgohKP8tkZNaCBucDan);4O^E$sBwIVMoyyC_A)c9xlQOq-Ma|(KX62Air|9 z&l%q06<_J(+l$5Qi&<&tg^Onpm(rJP3$5EUV za0ngnLJzo=EH!#iSU+~Ko~;)08$%o)ZPwV9bpVz(tFLR;{tuZUe1Lv8~Y;99JSE`@NAuj}vcsEJ< z>LM}EntTKxPl#BR`<%Ix9T_$cJY7zv!x!XJF?&)oZ^)ilKK6e{(s&Xab{x zoS-g63_?kCDmX@Vle>R_^ATf4mBAV=WD=>A1Z*84`ib|Hs!GvSQ_;~P66w>-wojzP zM|`bln4IV??gTq7oBc;7w%LeXJsSCh$zxhp{|ZNmLqOK8y+|4Wp^l3{A`6-15XG)c z&}*{h$&B-DCx>S~HXqeNb>cK9_=9C;+Qa7lk4QjFvqSm5OCu*^6<* z14Q#lc{NJ{sI7|`=haiI%?&pRbl;m#UV^6I7@KdtCzoe{0q9fEy!rR?BQMCa=95oK zc}Cgi>!13pRVmmGKm?Ouc(+e}vRn*pEKN50%cF@$N*pfhOU~v)? zuaF@zY7L1x=UB~6XnE{o|U<@thrLXhUOS4v!Tu;6O*|C?;QS zMr(F`Th7V#*CD6I%{97kTeXSgQN-RQa*FixAoqSaqYeCbQpKIngH$B39Vc)JRrL4x zR0OwZ#6O0|_ntpd!gbUV$r3Fr3%#ubuq`)0$^}vjhgKdG)bFXz;Gn z>ho*(@$PTokha$}`6cQDXw2+3Y5DQg<1S{sXjiH9esoU!pH8O>vzkpR*E7N^N54_m(WA+$y$ev7(+fVb(m` zDzY5$Gmc$2tovj!G!a+;duj(dKzMRAfLg$r^X{ZRBSZBm7-O6aA&IAds-GEg#2ut=H}Nu)nBk~iB|3!@)8vLS|Dz+UK4V`&-|F=UaSJ6Au~S=Lk7dJgWv`eXar zWgxv`qjbJu^VCPIL9|2{Ik>}S`+?toqC|YbC}??vzAh~teO+=0Gee*7LnsxOTa19t zH_Lz}|NE6?g=zb{=$Nron65AqA>ljAMQ#`_swLsF8~+Oz)pn2MhFQ}m4u3zJZa`QJ zwrLWGA`vWHpfDVEHQqpEj4Oh*^F~O<6u)C{q&%80b{}~eaEz1Qg%qj|L)4lIY5of` z1WCqG%;n)InfAyU4fWK$uEj0l+=`~y>j$Wwa=X9-J#wU1>qyLk;0ixULdufw5j^|g zMzZZ0MG+RQfj0zy)j4b{M5?T^`HdKHqJPr$yp}0~ch&%Aq-rKK0ml{cBYS7_>io6L z);;A8bco&hfUK1FQa$CEuh@yjr~<*b0n9lp6IwU3h5CWunk!RkzZZIx7uck*Tl3Fe z3a_!bgwA9jN_dMxBL&*l%{#k;OA35pusVs11d9?luz`@X#jCZn9_W-T#q{MM%CN(+ zFOpOun#f2wHZnrx7W@%7rB>Q)jNsE6q(#rF9=OsJVY&FN+l=?cI)=Ude6Jj0P{VpUQUdG=zFhpeiQXx7hdBMgb80Lo5C_7x~&rt z^+GQ6J-U($>d3yt!uCt2gr0w9yo{cEZQP*C4Bo;;ESk$aAv10evhwwftZUJ;XRq_y zfz1$5XN_q@0|c*LT-k>j zoM7(=EJ1Pb@r>=qv+CQAfEcBNhQ$eFwT%x!_s(Es0Iop>(56U*QgEWGK@Dzu2xEVP z+H;(_A1oL*sE};UQOmJ8rJIl~0MZz_dKrL;j8iM4vWM5YPj8r~x8DcdeYz=ERii0B zBqvK6fh%2AVTT=a!#0H)V!m$D^bTulU9KxOoYiK;z2<>5=CUG!9wlnQ9p=lDiGu8P z+}C8n3kokt{a3#xIUnH?8WvCjK{-v}16$D}jW2B}rXumMdm)Fgm`GT~TIerQqws)% zDRII`W32#FIQT-zN#QXb*n?utW&M>Pr=IT|_Vt+kmGwdLZktBnDettJ7RRS+MS?!7 zPs*I^lQfeA;&20MCgBF0RkzSkU_55Y`H{>Fz^S4c$6_NVOT`38O@RIK-5k%@YF60E zfa8i4hK3*?dGZ~Eoh8EVa`NQ#7uI2@3AJ$tN)fz4-KxTjdu?|KHOVIQJK;Lgo$0`uULmdqdB^6jR@nY7YR-Y2+4^1-Fy)U�Mj7-mExvehp zEa%_n)-{u=?2vdto}4zG-ssMvx3zJ2;LVkZ22Li4-!)Gzq($f zp&Am{do7Ok=Ivj$a8lVkV1G=Z`C_X?iz9awR;hpju^utnBNi{OReLkh-O@lgV@_;} z{37}CEF+N5O^!iJlcQfLmie%IRA#RRUnCXrwVX@Ox)2g+{)3qRW~sS*%TRQ}m{YCp z+jwdbeA1ew#wjPQX%mM zq5`vMe%@~J#IBQ1;=waJNjsm!yfXp|Pr}MF2V@eR#eto21#mGbHKcr{X&h3|lD=kv zcPT~Hk1OC9ID+CR<;1MY5gL|EN`{zt-Yv+-uOtHGqRK6g!%Bi8FVRk2CDr*wS@m`j z50f@({?1Tb8lCXOkRUK#M%P?YSUrpV$g7WQN}+Vd)1iA@)JR_1og_@Z;{tbw#sa2o zoNaef&8k4VSm_%1`T>m0ff4&-!06#-Kt%%qev)EcwXD%Z4;|a!p+gFCTbLp?IxK{C zPa1S1N-yJ9x3SYk#Jiu_jX>>Na7{m}(7IZ6wzwf0~~$E6?1r*r39y z@Xnq!c4agr!tTF_r+MG*aM0%FvxKy(TNB}Xd`WU8Vv&EC6R-+oL2~4qJ*@Wa@ zqL278wLcMCa)AHgCB}E?n{&0tv+35Kk~ONT1PnUh$6dAjVDkB z3haIev**}xj`z`gx^if`$_Iq%3yZfK8_cE???b?MH{=h*Z}&^IVD!8#KHtYx?t$&R z=Jv;s=&ukLN606Z449x=%F@d%$X13XL_HlHnr0g)1G>{>KJ>gsD!P>dTc8UK1)cne z?+@MsHLS^+Q=i~uEV^(9-@pha&4)J})hnF~)m4Z+j4i$IIRh zR--ksHvQiY{l_OsF@=g4_|8+Xh zV?P;0z(&qKole$?SX(F?V|(fV4gqu{8eXN>ui1 z`P=I&#^Il_Q@Egmta>=#ER(CIZ6+YpcBc&GJk=@P5{{Yf7U3Z`39_POQD?JqefEIi z0>?tW_F(;w1?_A2Uc@Ds&?G;>#2qw)=6n8aZZHWC4S8<1>ztv`+x6s@c_*nh4m(TY z!`Yj#n00E!yu_A{kCeaAo$KD)IUFIq-Fp~xZ;w6(-HtG+X506=WiJ75c}iI@skZI9 zNa9K($063ufBsj#E+#m;*Mie5PRF4*&1ZiRo(73V_ksVPxHAEat11`&nVGCj3lWMI zi*OssYYR=Au9P-qxJf5%AWO+oiily7Oxnu2=cduJv|p&MR^lvin;I1QkG_sofNjCH26lLLik+6^LiX}oZudNh z_~(5O+@<9Q*v{IPhl>XF6FbC5%GVlX`vv{Xdq@`TC_Jx+X$mPe^khZ-t}ELxJCNC$jOCjdI&8DF7-pIpM2ZLj91!t87w8U5sH3>hs?h zVb>XFu6yZ@YcYd}xlRL_WaAl)fx}QJ=DO^jui14hJeq>NHEtS2hxdpsG5$^JOs7`pas*aQ-kZYN zl9c`jxxnA9rb{vW7@FCZ%U>X(ZKV96;;?wl zwK!5t$W`)64qyL(nn#M3e3Yy&r}TXJ+u^n@UJ$?11;gFO_-t zvX2gA!T!_PiXQJ39Z+DR`b{O6zHy=pZL=pp!H={}PY zEx%jZ7`o`7{ka8NxKvyPN`xo{MObN6=93pJdHjyF%Za4A-OIjiXl zvh$|>s7B5PmUxKFJar<8L5{mz?~#p8=Ang47=Fxu%Z}Sc^b`Awh4y^~4&`}}&^-{I z7_fh*O9ky>y4c+3BhziC^e>FT%N>Boe`o;yFEZ5z^REOB!zH5FI1_MN;-u?!z3Np3_;`YW54f|9N_z#uUQ{|R)Gf_| z(bqjpp*BC87Ss0ON1|_&{7B$$RB;P3`69$6$H7sU$HHDI(mI_-=aZ4CzRP{!k@a7^ zNGEJ4qDpI#@|&Q)0lKIoD~FlDAO3}K!Y3kAwU8HV_6q=c&bk3Js@!n}&fdY1Y4zT`@PB9;s`TyVJ!}ERUyVQri1Wl6h#)+P1agoPm|5g(H-BO0YNi?r4 ziT*b>+m!$NnvK;(v}QC>|E(oEIO@x0*hk1x?h@-}N!i_zXyh$ZJo-5cXT%1I8p3t~ zx*T|Ngizj^gm7gM;w7>f8{Xd$$d*?0L^T^L3Rh&j$P``Z=5=tJlLq zY=De&<%y*Rk{v~365$ah_afpzj!c6Yg}r~C%z-vpn)=f0CWyykH<3uhKu%MZQFfS} zq6!9YjX4-Lt`oSYd}J-AjA#Cp?!KUW95@36Vw|8GSR8R2glOfsqmkvOcKIm2wyZ6H zVabZac4}XtVR=wsbV_Vm&Qz<@hCy4XRzdFeLud#)Ey4M-5pTuJH)Q~@P{28`P}~uj z1hy|tJec}**~_Py&U|FrudmBSTr{Zck(`~Wm$6z}>}x_Utocorh~*NGV(u}ylnGst z=UL-c+52DFj^H}h1*>6a&`-NH=HGJ!G;y|UflaRt z_Mgz*ux0iU5oKAKKmt-f-r2I(kXKTFX6C^=TViw~hp&6WJV;tnP9|V9ev|}pqqO#Xtp3mDE;*qKR zr;opyx0s*4E2l4uMhRBY03>O zq_C{=ha^JKSx1p>vI}?#M!^&2S`t`61%@?;vwvz1iT7|`DbeNa`WU=F5_rm_5U(k| zpaq<`D;FEf90Ff4hvb`(M2D&}?5AiAxkZ5$m7)6Z(^xfStS}KUDzlu|ks+G0vSD&} zDHU$a6at1?`^)e}mw3a_w3fzA46;yKUaJuch%J;J9W|HDf-2&1ALNdBy$BWRA`mClSV#t2t zq)d1~BJCz$Kb~gsbdGUO9QX5#`0quO;v^PnPJ()z!c~p<*u_ToqU#tX+zwX!>45(LZ zOOzTE&Wi0S5@5vygOam~1W&qPNwLKe91kM9VQm+mEtE#!3=9{1Vl5}g7!(m0-mZJ$ zjdd9>H?l80q!gaBzN}R4_JhRDlF@+h7{7dbMG3xL*;ACrr~*07#N5e8XNfD5by?aU zwyR}W0I)L{LOvjLFJheRx+$qjC6z40EFt_#(+Srg9UrzOoh%(J!HE@4TPb5dL-y$5 z#mow#u{O?QAsn+e^9=TUD)!3e`m?t4iC%W{te7cJwtF+@65}?n3{vIMaI3Iu2YlRP zUg?qu+la`fUNXhAoI-&UN-VL&n?F*TT`r)D(A4Z}<9x*-D>YCG07vg}lLWkuhzD_d zi(?wV3l*UuTg{hc~K&3DR*VNXLl~ zXgSGJVot0;d@*st!Gyv9J6AC&0u*d$1VC`bM9Zs4#SB7vm1zJ#Oo;4OTk3!LS#@Yi zn7HlCD2pAuneugG;tzS0{(|_`#XEk)DBn{f z)DL-veZcUMQqK&(_(Y(k)Guivh}b6*5Z-dGRK^Q7+wf-01r*H*%;>q~l5&AYJOJYR zEVFkKa#q9=V)3_IBBG$vLWckY&{sIVTY)HaM4@Re1PMkkEjZyMAtF5>L>4r6%$+A$ zEg7+RM&Sx$u2KhS|30`104i`P{-z*OG+96YcSugzh*ijnEL4R$3W-pn2pzVY0*b)F z@Bk?>zpRm+@#MlZv$&ej2b?07zUbP-3R0XfE26u)Ba-STm|S*GRvQuyv)zyEM8cIY zsEWcfJR@KE@~qp(idGa)IJp3yND>u@MjOEpy_3y~pb>M0)D!_b0<{1Q?Vu&~(-edU zf3_cOnJj3BOb93;Z0oXEHco@J=T0n}6@~%Gj_t%1E;6rXyO(gA6{>8U6%$!o0MBtM z|E~WnEKdZ?JY4G<^~=_n*FgPZ*+rw2cWCbRG2G9gp%wxeRwZUHCz@lwC8*C8!n~(! zLiwVAW+N*0Pc{$6km(jNO(X;+9<7sTJUSbNA}MgmMfM*d6{RI65{(rUl@-q` zp$P=a=yqH)S$fP%5TOUwcbS+K=laNjV+|E;@Z_0$=cl7 z1#hdR!t=RW{k9AEE#ZF8o@Wk}Cv)Wb+2ZpluGn5lWpXJAq#mJbn!k1dl}ZH#WwjDW z?Y{DojVy_ZL{tz6P`d0UN5OW06stB8lfoTzk?m)RQIV}BiaWqF0Xf2Q;5hE?Q0^Sg zkRfE;qD^G&LjlG(B?+2ZkSmF~dZSsaQNsDMO-RTD5`7WS$Y7mK%tXq@W0B&?bTUWU zg?^ZMa6}PkT#T89uZV`pLs<#MNjNU2{gA>OxfEVBhcN9ZB+)VsmLF5qbo#sms}{&w zKw2OJV=0d>{3(VpYWKWoFnvVvu-wVU?nIh|u}uoyp;ji+XX`mzked=j*z%jAl;fs@ z03&uHa+AO}iHq3}LgEPhFB#bn!+vFoxwi~H$5a4fvisW(UcrdjfW;?Lz}4hbUG&jU z&!DEz@vSX(RoOisUV`Ex3|fRxwJ9L7SX~c_u2wu1yMj3nWblu`S|-nT^@|07iG&4O z+xg}s^UW#$;}%CEKJjn?vJsYp2Nl?;fHsyu2{?(otCZ3b zzKW=S3sg{GC;QJ4K(FwCShNt$2cGnC_AW8-O9Z&r%0Bnp@M!_|reZG`xyF(duvL9P zz!%LWF4Q!uu`366nNMwpm9}Syw5{MLD|dF!iv{2}BQIXcRuast3|+2K2}miHAVeAh zOEaRwu=g_jSn!I%iOr7203%E?EXlwcE0P4B2Wg^eJk_#PgN~vt9;u}OztX)UXCZz1 zjAi+H`f?j=mjRW0B^9EQ*=zR0SsSrCOcI-~WC;RBZ=Na*a3BmEcV&urEhe|aDHUua z$`*`)I|}ene0sK><$bD#LsNA_*sC5ec^v`2_U|Di}}%^q6|t zw+4`+%k*=OiYK!~(wSQ!pUzX95{fXxUJ4Zk!RUlTFT1ye4e&=xvRN#8va*7zWmI!E zy`dSPk_8x`g{s*C2NtOx;F7UL>EQdNx~4`o4ll30b`qN%Y${Bu$R=b5Aq;?I&63iC z8NS-I=sk~>h{Xb<7Mp7jjNsrVD&m=-fNT^4Fn9$g(D`{LfLsA^CW!HrUGG%;@oZ+s zBrt+Sec8`pX8Ds6+vf~nT1&A0k*y$5$rKK;GO)iG0%1jzqGfr&oPM{xD>E>=LiWIf z(i{4%6|)+L=OtF1m9$~)Hm0!DlXf$|<-d(kyR(OB?SWjQREwZ(QH@Kj${TdAj5e^J zA8QnL0PPaWPiGhC9!3?!wl4@M9@w#g770DDqb}ouc00R5hMt$2TRI?ZRZB|==`HA} zNsgJY%@lkVQ5vgVK0Z@oRKRwP0S^Q!2o;p*+={|A<`5^s%HRmko*jswZU8HoIxv_2 z{%p+?U1MIIn}-h>mAgFtxiY=Bf&$$E&=pc;4#7I-hJa3?IWJHvf(*NCK?^4c>b3X? zT7u_?XXRzXN9yP0fxWa>ASwX3nJlk?1ltI=emtM-CzcfH2xDaR@Re*q93n~{^)jW|u-%Tk$@i(NiUMCQp1FyGhY_8w9(+X9Ph z1_mU}kv%EP6AEbxXUvmfP72{jkO)N}QWR7uO2&l5(H@`SRBA4%y{PO046rowK#uZakUfCI(R}^ZpH>0I0>oX#0_&bRpol#Y3JQ?pq_s#k01Sh!yhG5G zZCizo3C&`nDV>_ZAG_;@k&Wfwp54FbSMRRMTCT?%BDgTXOsv9 zgjy={=xgq(JBNm_3Tlh0@MgKE?xH3`;^(P0&3-Muka3W9GxmODyBK8P=v2ZpAhlXpJ(n{XJ?NId zrvRg-EQ}GyMnEJaZ75b(_p^>YXE#%`UZ%fv*D?D9RM8=UpDGSSPeJo4h%I< zMW%-R<~R#2vvJymoMdYcPW!ReC6M41b0NNLUjh#nDFhXb!4R4&EFk<0WBEC`er*fF zR7N`4a20raX#`Ps-9TxY#?RO0oUj6nLOTrL8Ce`*CvjLWEsU~c3GZTL9y2DiBI-Y{ z>sWM46fxI;@BlET8BaWsvmqU2?<)9@X>z)i%RFG$_Gc2If=tCsL}`@tMPimkpo%St ztU!HKB_SrXQ{)Buvx`p}AHW@P)W;U0kNa5<=tMVNIuu&(#FD$~7Z>mDVRXt@4%gXBP zEZiA_K0R#%cCSVR6g}b+igKVajYF zWic9r!%o#eGQL$r)IRkzX8m)qz zb{FQ5PC6{mT4mTY6AwuU))pogLs2Z#HU1t?MQQ1|MFNopB4n_vSmb_KolYsT%-`$M)$g&BZP?}se+Yb{6&?=L%|$yR?QVNSoCxk(={i(eo8iAsC zLPIzel<$q`J4wtfrVpr)GEv#)St9==Z9(}ic^)Z0R~$#0UG?sQ^2?$KSuTTEAeQKzu~1mR?=E!1Sm(L;$OEfe)_E@CM*icnw;vLn zId$iin*A}xDcclxCv+oJY_dDAFy!;57~>X3tLGgk8CK6bKu-H%nseeHKzBTQa9GnE zBQ$#+a;C({)Y#K%dt#FYpvl=*i!CiFZJZ9elYz6)^KZA15#Y`xW>Bu(J zM8$9WZ24jc60;`Ws zX1E;5fA~50Bdvl|M9c4s(P}67>t+=}?a^5pe85+8Ty`6p1X(EmCqA!0Zr40h)ggeM z?t9G6u&tGJ9%GPzK_L>p~{v} zAEXcZ$N_y+6A%XC7^DS1c*P7fHz*`aZ113Ng3>}NXC!zb%9bbtY&VK?E*wQ06&3L> zdm3U>4vPv*Fl8agSnLCEbe~d>{OrUL%!1u!B;x=2N|_1C?{*qd6HdsGFr@H-7-_w1 zJ1sO(Se^gn*clr4maDL#5ZTQ|BE++8qd>Q{h!z-FuK2baJJQI|p;|1A>bB~1d|`AB zn+?kl;O3K^i1n(3eTYL%k&!FNFaj0PJLVneK*{Y-Lh1v{?}|`mxJwCWldTfPILFMR zW)^M2>e6{WXNdsDEzky|U zHi>$(h$tzkK)SbizVZQc@Stav5)%nryqBA8Bh?QYY$MKJx8 z@00}}R;$~?{41_>=4pBNIk#?4*)#?VANPQO$WMWmX!A~ByL*~%@p{y zRNaLGD?&nY*byGE^bek*YS1ma!AQh^@-mVu@Y~KTt2Qd3w4RXj9A0sV)>bHl{*a)i z0DM7eB{gieD*ReLPQ}R*M26tiwxQ*JkNB?+haiA_XeCPl{NfG#Tsmh1fhhJv2KlwW z#ud@+zs8new?7Jd;;?3p8;Z(sM)m*#b>&0$ zYF?YX2hddWIw=o4hA*VWyaQH6R|hg`jfCKp-B~!*dNi%69pk1*k26s^IZgHp>;53} zE!CGQVD2RVStLvqA>Gud2r1u^&KDsAUI@z)VYEUWJs_w!6gi1d2~ksN1ve@XuawQv zHWg9|>QR4>_b>Pk(kc=Yl7NIl5>kb@1q%hm3o1$gVTqY7M2Z1ccqL*C+De%}@m2Ei zfB?*h|IJH9|1KdC94e1VwVabHi02H$VR(&%I7rR3IB=oy^*GTSA#*dWdrB3z*%eIb z9I3^DoRx=51iSNW6~depmw{WsY?s_xuS?4>3qOn+nl>Ex3Cw^dB7OxJV11E$B2YI8 zDE^uVAI<`e+8+zk1r9~=SPln*X)a{%l^w4BRnVq=Ion(1fOY_|YB?^usc`Ct9dj&B zjH{UkEHIS_8k_`fWw3>cy|Dks!51t~8IaiQ*;7z9t#L!B>^!P|9JST4QT0S87R#YII0vEt%F{S!IZf46LL>CZlK7FIYfn(^Pd=RvarUJ~_Z zY?!4oU0_&XCto!qsIe31#Q3f3!Oct%&cws=|6vn9OLBq_JBaPt(VnQ-L6FWxs9}73 z)2MD1Eztr)PLxu44`7h>q{OVC2HIrHvrSRZ%Wj1e)r?Mi(v5WjrYCBHR4tHS!mJ1a zIPtI0I>f;@9!n=Cc|h_jcm^NpoeGE0O7LU9Y`;R0+>2Xny6P#N7awW&P#YtI2 zA&38Dg(t(|V=>sN7jxcpB0&HKlp!|!s*RjO5iqi2V$55}wY5mzl~wS93551kM6FC~ z$vRwKR=yHoA>{l>RP);BBj=OjEnd+Zc*k1`TVt482#r)^T7#YifCK^lAVIozI-ObY zWzA;Ec-?QI9c!(1!r8#ws8MNr!GfQ+g~hn(Loshh|7xvqM6lk?Dl*tV4pmd z!L*~SdBQ%0_ARoKilT;WPpKcElW$5F_`f#&9N>*0Org*66HzjcoO=ettFt5lD^d*7 zia7OL?QXaW{4X7WGp;QdaPTMQcyv_MMUSZW$?l@sXe~7XT@@v@Gu|Sp9PG$eaiz?5 z#f;jrw``t^jRXtZIo^ytB#fRUjldK_K;m2htBAHs8DH=@-va-OM=;3o*@s zAiM@4QgaHw0p%0O0O8Wc@(W>s7H;TFys_Yv-U)}C;F_q3x>{>?9Giw-+Vfu9zak@3RCt7k~ z53=TKQ~vuXB|4)uib$a)0RSZp%36=qMy+5Jv7fD^eWE<%<-oOx{Uz&NvBqjse(wyb zaC>cM8*S|cvb4@lk5p;>l`gXKmEGXZE0k^Y<-3kErde9~iHP`(1u3)gLcV|0Zm#hH z39N!)KUV?0okS(*TOdc*1qdDRFh@)y)-^iC2f7cBDctA}k*Ug3&Q3fkR>B{Y_NjEv zNb8=%wx|2r?lYGCt}gV;PIR7sQOy3n?8qAxL7y6|ysszZeFYp#58#??}*|Ts{R9KcQnU=5-Sz#rA&%}>G8aQ6m=-C=aA+rD? zi{}aVCR9nx&G2aP4vJe4a~y&?Ib_=8V}v3B6ieU(t859elyC^H3T5mMmUu3l|FD!| z;ofIJ9K`>E$t21;N$SZ)?W=-_UM{IQ*%G%uW-H#LTuX#eC zbD6*Bo=hzhihb(~mq;Kmb&Ks(>QmnxD=IAYDE1$Fkd|b{`H*`#cFj^1mR0+USjVTr zbPS&|B(_4t=DbP;0)?+eg|8A(o!dE^k_J6VWuiMcp#kxaB@+=L*=|9SFVWcat*|17 zyrbSjGNT00NsWUR0fKHw7MdXIR|6^F=eOia0cuk~`i&v(xFRwBOVmqDzXJOO(~{Q> zUQ8}H5DFf%1v{BQ+Kjr&ut*zZz2=mRb`=KF#MdFxdl$ zEKP)$6%kz`I9DyDSH$MQ<)n}9JFBGsvwUeY%k+x`0A_lnQ|5$B%Io!O<}C8DHNaj4 zh$s{ciz(HeR|6`<$_Lb@R9rs2fmUf{h7vyJBdfZ8{vdL({no9M8)P8DjHoYy_R>c1f@ycn*T`nz z+}|5TVe?9rFTCR0Cn%2(zsM@?oq&<3RR=;;L}>dnjKftwi9HxK{+^Pu;eVcYbZWyP zTaP#Tx4O=lzyGs#@y>hJtbNbe^?#lD`OiNmbo1x&n)VLpmit#O<0>$MZdO1|I5kNom^&wu`&`{SSd^UNQWY`;Bz-=_NSedJ^3$1hmZe8Vq( z)DbuSKTFE4Dt{tAc+cBj+p_kCnw87{aof75C*r3){No!BK7Gena?hE^UH|w*{JXsu zm!I{fy<-=iJNWxUel-z4`01@HTfcW%P3FQw9=z+JiTK|y|J&>L-2e8mN1p!K!tD=C z#FJnDZL;~Vr`LS_hS52RuT8|SdvN)wzy9Ffn)9Ff>Nk)3---CZ+2@~j^Y!nlIq;Id z^>6v)MEu!_=dOC~Coix0>xPk|uezQ3Zd@|F?thP~`M`G{T=w_}C*oy;doNiLJ7a9_ zga5p<_lAl10iR!TRO{yd9y{sOgC2-nJrVEtL-S=5dp3>Tx3vEYpTBe>{^~#f;O^Id z(85r-`VlT|NGU0dumR){6k;A_N89V!=H`jb-WFo$9 z*&`iK9C5|iAKr1<>c5>a5x=MH;P_>iyuD`hTSJeX+C35fug6}s^TvnXIrjZG7F_U) zQzzo5FIjWkUmw4|=EHYyTY7Q(MEu>WFZ$Mbzq?}Wbq_sTv8iby{*HTZUhfZGTJyup zy56?7ej@(nf?wZNc-EepcRu{)D;wey@oR3q^;geb{?3}!U893%t>*p4%#(B8ba74m z=8v`9zjPx0{P~d+@ueRr9r)#6 z&#U?6BS-w@-G?*&_YA%EhI#A8_CEBJ2hN={5&y)DnIq>N^Y)su*spKC@SutK72mr5 zlB;G9)@)vK+--NxoQQwwBX>28Hl1H{$fuXi_-D~XyfJh8qmkN+YL@=E@!8?XMErzj z9z5;XpIuS&{HuFDR`Tq4yx`Q!*Y5e?MPq+@?^T^&d3rp)ZPSVO{qcmW#=dpinqzMH z(|G*ys*~nEQ+(Z6?~e-yKKl50{ClgeIqvu0-7)sp_x@(ZPk%QaKV&AX_ z>%sR{{c1cu(0J4>8{d0jO~s0X8gG7NJbr24g0oIP=<2b<_S{~O_{n(u)JtBo@rqlv zj2*T3uk&X7a6CTu`i8AHEIMcGUAJy}=r7+LkH6~nFP;9!?z)<)OOmIT+&>qr1 z^Q_O^zjtTN{G(R=;3xNt$Itvl`(vMf-PJX-e)imT9~+}TAKYP9Tyw?PEsNg0^J909 z#~VI)^~3i)a`9Mg?{_}%lTVGuJ69k0`L8~*YwWz1cW*xW6XWrx-+1=p^#@%vcHmW~ zeeYAU-|KzF-caFykZ@6^Hr>{M`=DDxE>-z`YF&-~%KkU(8cJHlO z*uL>+#UB}u|KY2LZo2SmD{4Mnf6Ar*b=!D+`tZ)XfBB*D_^nM7YrnGmvat(0*4*`$o5tfG{lB9x+0}Nzn0N1eE9yTu9^bNM z^RA!WfAv^pMaOxoKQJEeIrJ@iK3slsP5QRR?{~a^JiegfP4`TE{OYl9uRXW-J?|Tj zpLh3)i|;t-jIn!uQZ{-J_v5z>d}d;6_t=uxrfNR+-tqWJZ~I02x`+3SU2x4we|t0c z-#P9LZ|ON=*I1_W@!yYff7hGe{)H39FB;3d^+Ox4=l;^)b{xL!(2K^tv9)&dW86RZ z{n9sm>&Cq`@zWk@>7)GDeW>Z~hnJl_c5&pf^laL*{R>;$pL_h8nq^brXE;QJe|yM*yL{P{!I zT=1qnV|RS*_4Ti1yarDm`SGUjUo-Z{tJdG}(5>TfbLj!6ZoOk~&2_z(KJ>K@kH*;lukRl_u=VTT zTL0Pc_=o@Y=Zdmy+ z-X}hI-j!b-kAE&byDPdX3chmjSn4;Yo!xuic>D)TAN|!u zhrPXKdDRJz-|ztV^trJIzx%l>$4;v}?qjhZfNx93Z(Mrc-kL2RuRi!a4~@q^{)Y76 z1$`IP-1FS-j_u&rC*FPeyT1MN^Ty74>cM-qgMSw<|JGG!zV@=3J05()b?^QCc>M1V zefNYb&fYuL`>A&7KE_-+Nj|8T57N@6X3iyW@(nb1o@9p=!fKyy3Rd)gPU;ckIba zW|dsrG7-O}c-_qxelSyW@lF4Dc+QrI_<M~|Hi9-bvpH5^~E1-dc);4 z7cTp0?6-Xr@e{X4Za-zs1vRICBJ$L{^hErK<33S5?+53Nb>49H@^_sx5&y=l4QuZ{ z>XNaA@Bho}`imyw558^9=>?z4)I1%3`|lR-orv!kdG|?=f93p|^BceRkCU#Sh(B@V zgI65%*DJ<;viGJB+<6o9KlA!Wul?vd#{RVR@~Vw@PQ**R5Bp>HUS2c*4axDjpPh&= zd+fG*uQ~dHnsz9JvHG3g(uwk8Fx0O=z;Il zJ@#DVamK&l(6Sr98aY1pnMdQx7q3{gxZ0fkW>cA7TzQr`BRw?OIXsfeWOkdr!QQ^X zJ}#2I?xHo7?DvD4uF>>vlSvH>ccwE#BdN}wzL8WnSG&#NP{vDoXO8q`l3o2NFZ*I> zI5oIFOqSj@(l@xhb09S!nTAF)-cYaS?s}7b{iz-=Gvp=v`-i%dnUq&K>UHhTq|!O5 zHu{?znm2ge{mIdE${QM_*1@5{s^r$KBdM*DXUAxYqNR~TBT23r1~YX-!@EtJ{%&5M zN@qrfcAKWr{!HI+|8Aq{JBJ3j93AZM+n(aWcA}y(UEys@rac;)@-o|!gVdMuhDZ7a zDA?Pc+HHDy)3x1q76)*DV{GO3Y4Mr+9H9vT?#PwgV}Hh#Oe zB^l!$u38v+e>5{>?~+^%Br|>8o!R>;dpR^RESqmx$8#I4k&o0xNk_l|!Y9P7G zG^GZbI8|0J+hwYEnYz}5-=6T={o2Nax66#2X@=87XPQ2m)0awjGB1Op{r#OIJR6kf zgPGLU)QC5s9vmkDAKv%287v!sJLQ+2ajoMh23@GTZBTS-JSAv(|8K>FrIYG6Jj)phuE} zTLpL*FXnCE;Lc=!A9<5J8yp?zVgz`ch4!uF)t5Y7HrV5hq>9iQDYSs z+5@5$=d`Teuq;NJ;gw3k+4Q!d(f%HWo(DjkVmxgXgzOz1?A9hq1_pgwivECNX=!2i z5D>5{W7?#_Bh7NTS%3QmEewOceS^cJ86$+IGt)PaVnmG)gZ^zp=}a*DJ%DI1t%9U$ zAOYSGb&a^EX)m>lj+^1sNLtPgO*@&mP8ks<1q88|L5uAjz|yZ{Y;Sv#kb-17W$%Ex z(SCQmsny@m1_*CUW!mMkO$LcM*PGrX zPa5T?PJYrmMuIVukuw!T*eg5K?q-CVlBDe(%9z@| zOfx4?jo(ecrox8_V5ZaFg7lpNo9@u(sXZ2b#EVr z^w>u^w{_V!ZONSgucS$ObsH0PCkli>o|E#ZGTqYb)wML&H#XF@2lT#Y2oO~Qkjy|5 zl7qXwO|1=0e(NdTiHTE$I(9TSoYaxXEvRmEBt0~;QOX=nf>;@|zM-wXp_x)ct^ti7 z1yQ!qAV4SCo$24Lv_3hqbyU!fAsf)Mzp23k8ii4v*_YYo!6m`&v$%zWO7T4&V+{9^ zOp_BgcQiImmkye`X=^tbdQ!bfXrKqh7=^hB(kksbwK9F0;GgtdhbT$nCR$vZYT#-* za;L2m&KRWkT;XP8vLBeDkw8ly5FkIoChF)Smq|Lb8>|74>OUJT9@|L#9!)eIt%cQ-LzOCDU^KE^-nO42r z7T!0edMQH5tO1Bq4)lYIu1>iURyZIKVFyj=4~b(m#F10)+Z&OoO#fQ6Dl1uF<;4msXW0U=TT?Qbyx09CzNyqpmiC8ySC9T`?z14Z+i7N)78HS#=b~z zMhDZQ!;XFQ(jTGz$Oy*DEI*{t?A|sqG&sby(qv)j$$nwByDbe*ia^Q%B4Iq?^8%m+Rm+=wgn576Cw)J!$B{#Gc_2910Z@pXk3=cG|2~3sUA%`gdF1} zhrFa&*4vZnXXuwWu?R*yQWfwuuLn{h!Vi2I>LvrP)G3|Ax%0D!JP^FGTxs8BAT=@L zsm@Wxvj?%I2UP3_h8g0%wEh{+0pk`~(n|+a->dT4PHN0)kpK!qj3l4UGD2}M;Fp+7 z$Tbon;6Ip_jw2QAPi33^x{i*f7f!mXmAM`o7?d_9ySwGI%eUt&3P7d0VLJ?Xrvt~d z5m~6Ad3|C_V!hBHM-ClT4^V}Mc5GTNQZ>A6eWEeJRd&jh=LmJOAa2WSZfOt8eMJi0 zF$zoT?E}cI9wchWRHUY*4b37!FLEtjq{Q#V+g!J;58+WI-k#JjJQPtLi8mJ>yZeWj zatFAhqLVr%n==%QkG|(OpQPlL_oJs?7Tx=Mf;zC^ha%Sqqh)|@mt+98eXhWVif1t>0>npKe9 zR0gzknsoVdjs)$sCfYk%o5f%f(3zbKh$?K9J1M;z!!wY`fpKZ0?WOSKs^D7qx-dlK zTOrq7s9izB{Eqe(#Ol^WQ=+*&PXM5eq6S)jD;+VX(P^eCAA4$PsJmvFa!S zoS3r08b!ZBVi4V4T9`rT4eokU@GPEYhg;}{43#vnLJcH~kE)=l{XN|X&_cLH#({OL zPwnjMPSqh+!>8z*kP1+$D{U5IUqB$SHWo%I=axI=B=%WgVHh3h^U%G3SS)yJ?7Pvy z?U-KR7PAyqx?4mhynsuf)ttE!zymtx50d>S&>Ih17aoxM642I z%MiMn|6WRNPi$$=%_GlL+p?OJmSdkaC0ZNmCMOMBX#!)D9WPt6>w&?XLx&bGU7e-{ z#_MPkylQA}Pi%lsp$c>e;R1l_92BVk)2u;h)s#261VMxPx zNiibxVIZ_zM=WL`E0KaiT(OPCRw{!w^|6kDVd(OOSdvbbc|AuoZH}po%(Y2nRGS8L z6QiCb%fi{=6(d6f(vGQp$TCe{2k;rvNuJS0WOqjxLUqxzVzjDtxv5<`cx@7kK<=BQ zcLMY%;NTEIu|y$%i{(l*7-^o%t#muox)nCFFI92!db%tP=XqXtdqwSW{XH2RP(6i2 zxw9GoK2u`>i}xXbSo3KXLc$cVP#Q_Q0|h6r(R#v&V1dlCqIG4PGHPJgp-T4slpZip?N?l)X8ETX^B;T3UdS=;^D4=bD5H>Py#~mqNZF7M znybn6o%lBfw*xtoUgpjyMo4VygIhJ18x^$#c>>%bKIxmL6C6R)JFJRg#kLr_M2Quq z7|Q{Z!^5ehcCNm)rO9EV=Ca8Zm>C*$)}1s>L?ldg_%@Kp0545BnM$~a3j83BVsC)? z`YxE^yob}^lQkM!P|}Jq3p48?(`*xo2|UyCdPZ?+s7opb!zR5E2`2};^4ei7$NDIQ z2AK<$_+@VNRRDw*#&YEMyt1^l`9+0@qUB}5ESoeK5a61&gmXx5@J-m;Ac;J)#;ZX6 zw~gx?=^pK8Cd106wAqfM44*hc;Bb8q5VpK7M@)%LoE#NWQg_-Lj%Te_e#1XmLnk+MkM3@p{?kZE@fYOyVtO!#og}O zkjjV$A)$%!wvlCI0Jp3e*e<`r80Kia{yJ$-l$Oo`^6pe{iF%3 z+ZJD#;{e&m1)@d1k zV5&{h=yabN%Y+bNN;F{xc*0;t2X7vgW;2LDH7LGnF~G_AnA@VpV6I$|o=&lXujqsy~j4RSf~wlYOYeq`Rv zZUEfWVZ0j=UsDSpklKMQxxXJ*mr3-eQ;8i0mp${Zj_UQJ!x+VfhRq411H)#?XnJHx zMlR6)^g^K1z&^!+qn<&!!;@WYnbffHw{F$5kT$(goe_7M-t21YPmyR~bP(sQLQjWY z4an`l2*YHbHgR@4W_TNa#%%;HJpVYnGHkyFl+LI3a&ocejuoObacSOV~@%h z7>8hiyP$$Y8MSo*I%lOuhOEc!4RW8BkPPeNT zcS(bEm+|TktkyEvqR292d5)UOFU1eX<=jfEZy;>l5{UM`ODv=Sgo$LJ3rH<=5qguH@>F)4dNp zPGX)6ssdCs#+&KvHzjA4;s)9 zB4RcxEiuAOM6l_XbHbg)7;Au(L9qorc(&2I%i*rMrk-1DK0byWm7-c);XLpJJC;LRim| zQ2-u!%J@A!4Fdya1mGGl{rW4mII-?`rne11ld9y@>Nm6{9IcsR`OlRws?=qb959>2 zbtPx zxEmOVec32U>?^$#AyF^dg(cfZbrO0a!mMbT`bfnuF_&6buyJfk1BDnWio{~nz1_X- zX1r{mgMEiAtZCY@W!kIF_N1bj6kE65h|M$I$4P#N`wZuFpWMp>Zso3z>B(#}13<_& z>oeBCz|Q{E;8vahLs+eY8_1nR&uM%S6i8E?*+VioS*CM%G`&r|VElsQ{DNYxP=W@# z?PV8HJ#sC;rPeMiR5<>5lI-fjr`xCQAS)>(`?rckdD{T);N%EN1VD(};mQ$UVi5tX z;Lcj&Y&TN!Jh^kL8AOB*5}>wdTUB^M1|LF^8QdC>uOZQX;jRFzgzbqvK*CDF7^hvy zRU2q4S%6(R2Sy8uRo@DEy84H@v}~f?+~ZCxkHDY$lUq|;#gw~>-+9%Gm#&nvo`~)o z%=8)=l%ZZ`q(@FRt`A5RgMe$9Feq@L*Hks|GYF3LanAt{G!nWdZcS6YblLJ1D_0$} z`q*SwH-ZloQX&hhSM*d7MQMLLxmx3XRxMsm3i(-C-D_5G(6FO=anh+6DFzrLf~&$| zfY9<#EI*E^HBpZvuDK4cq5}ny zk*H*_N-g^?oXMK8Z&E#1#am1$$AndWUq+WvBr4O2S+80S)(TmQFH6< z6+o~P3@`wUjVd zKrw4fGF=i=8pO?r`^nm)M6O7zf8q^4*2c~%)#yD9IX0{8V1k4O#6H#MA zHa;KiI6Rktx6|E z%oUEJEITL^@~Wy#Xrho@!V3x3f&xl}CnhS9>_k=zUDpzt!p*>N?abw!9kg=Yc^Im+Z%`;qwR<;F@O_{`CPxeOO7g2G5 zHetHa3p$?CivZU3W*1CXAirJG?y83lZc1jh387>W0Z_|q=#3z*4yc$r^~vT|drl5O zqelq=3lLr3W>qI>x(0OR!CN*+MN_LKi&%LPHTvnI*o$&*MWpE&%1G4#;Zi=M4<@4&X0!`$elKiya?^KPTUtk6b)7;(PIdLzyOm3o+Xr8Je1j| zG)$L4@Dw}_6K{4tduwLX(HYJ3E?vcVb+p$9=PJGE2F(Z$Lm3s*7r~<26^!eKhPL;m zV9ZItPcKzW1!q+NP>V-k*+PWhnldyn)IM1~l1`&oBdDsuCcF>4;(-AM6vK+#BW$}D zq{digquWiBzom1Nzai0C*V574zOH&#ul;kpB!lV0Sh8QM*FnUq$OeHh->El4!;lKa zFFl`NLt~rd+4{bnsNnP|*`G>x3!>{9kHEqXI>QSwSQ#4(rI&#b%e2S~^mTq6^F|AE zH^RN`osN5#8+UtV+_`8@nZ}gakTT1vm#wI(URkwlxwmxrnq@23EIYSVI3w>#OB>{_*I_43s6m0ew3$0E#h z^)5YD3hiFAtXj@pdKP&~?h#nJ&+IWx$?d6D%&sFn*uc}7!5%Jjl}+Eap`jizS21*W z!$${uM5C$K3y7RG)dCe_)7=hF%H9JVO zbBCnEqu%ZObaUVxQ&|9WMklucSZFY@JW$>en8JD>-GXAm>wqRK(X4?H)OMaU9%J=k zMUq(4Qaz9sf^KsSLfIEN&ZTKnDE$#JJRrIh9OM@Eihsn4h=h%qtivf3n1Zkw<#D0; z2yIGikLqcbd_qewP7!3no#?!p(UleZ`-`imja2 zT7i}Bda_||wq7g0=?KI0wJ|O%#EM?wWC$OIZ@5@*O}j}fd6lEAI}y1=goYk5ZA&y= zhg@qIi;VxihFMt$3ANSvqa3`NZU%yP1cad+Gh$*jB_wXB+bV1-Av>cGqFBE9C2P7IcH0$Dxsc*wF$xB)AE1cKanx=VVJCc17Sdpzi6OX&=jxnT918w08b}<0T ztccN*mc67gy{o~M`b5bR8j$-e949&+h}eOEn;kCe1=UCqXL?4?L^123)DWPZzm9nu z&Jh^gN+m3321^!bDp&aJl09aZ@NM^AFGbJN3sG`eD!5#Jvij{Zxy{vnO(l=ebE}pu zO>*>z-dnY-n(J!!++7E>5sO776hhIBi@*kfu~6}WV6{#jEAtdu>Exln|JG#-Mh(g`gL& zqi2))hi(XPJi|We=P*a!n<*_7CgKT6vB~_(F(ulGv zigliNN#n8$90PE%&_X^$lPbH!AuO0#4w_yi{_LPbrlEPk;>C*>dKeYNPZ&f~OO4c> zpSCjH$f`82t)rIZYb5Fa*5{0|e}I_4M0IJj!~($m&_lntCD52m1sQr(TFXP%p%gZJ(ga*fdn` zuEZ>ApNVNyuP{mKnUMBn1oPT!Yje=+O_+)F!Yb%`nU&P-ZEEW>vgfcUyQv9}3t3f^M-LeXVO5aQfG5|V9= zFzyyNNjlYLU%8^;DY}MMqFWl;6P>10!^JyAco26RRtlh1G`CY3nCkRtrV9|XPBmFF zjO;gg5vGk~G^a{@#A)VK{+q@`eS1|?OAfXX<=C_d?QgxO$Y=cKQ?lY>h}>DZNjw_T z3X#2Yge;RE0S`A;D^$+f9;{^31PtejLHh`y3^bH!UpM;ng>hlMN>iKHQXlFwCNSyA zYOE~=hrH(4O$u3(yB!RWW!jT)<%Z^}mQ9IPAOAVXCXowv$x2(oZ-q`Go!fwInmjpq z6CVDCDq9-49T979+O)o*)%f+aM4^u`XruUS++sOp%*d1!X$8m1G;$q2vjHSe=rVN4 zih7eXII#3F*zggeJXK!>x2>5MyMtu_tWLfk$WkNY}RkK zV18xg;>sQ*i}{OqzR)}894U}rVQra_1w34|^l0m~T#%o~=2*DURWIm9x$~{8s)LYi zkvL9t-4|}mZA|n@LNYowS$YSqJ5coij!mYmIoWJZlAll;)y$^3#q;aL!C{F^V~fAO z6B3nZZj)!|(foSKEhJdo)Fw9Yy9iA8Ha4tZpWxcEvfx&h&@e^y66v8N%SP@Pueqbi zY-%#CU`~_qoAMo9vVK!NS`O1yiO=(H>1$eR(uq0}rl*xVpuY zt;FBd`gJE_cQQ*A<2dZAEuOxGvs8rx6VB=4IOO5_tpEM$!dqiAH7uHsT@ zeA`B!h?UMdq!CTI!KUN{URX@bSz2JIuFhYdpnzIhA*;$viyXo()+Zza3DjQ?1K_H? zQ&ut56Nv;F^VgfUQvi%6=oP_9bw&u5sjaOQ-rA{;d~-aNuCex{P#w^aaM&2}sn8lU z^?=smuR^9IVzo*gkLfs>*Tu!mghm!OHAt=_$C;|*R zPi03MI8+NDJxRs1D=ZhxR}wmZ5vn2oQTI44TpOV1lw86|0}WD<+iI3v%5({;HG5X; zba>V-Pb>{+wj@FK9hz?`#unY&Lz_@pIp1?Jyz{rr_w-LFl`YM-($msh-fY&+`BUhE zp!TB5o}-tpUg#wnX_?}Bg7Pde3i=@Qunw4(71D$FFL2jMr3>=<02R+`MR?D&i6?13 z1GdI430L^R<7jnt^|3DOU^S{z?`rXH=ug#Z zbs^Muu%ieRqtkEQux{zHV?sh8vPMg5XB#YN-HPgCSA{Rs>5zRaeu&LJ%u0|EicyaYP}PY%5KDqrago$L9>o zSC@jCr6tuGwg&AHEc7kQniB51H`m$~Xp4qH3kRX^QNR{Dbn7t=jcrf1h!a{^hAYJY1g_UrOI?%Z=c0Y6fGwVX&N)g=76>LR zJm;MG-eku`ehTeNHha(|)vp31QuC5Ubitay8?_)XD=k{O@VM$=q$t4-P@cr_Lgh(I zYmN)hJ&;P~D~9f)u3)m75=|^CZD(4m&H9t%SJ2_)mevy!t)1-~g=*_7$6TkpkkpAS zn_7kRw{LXWo0@#4MDUJ6UC!KRu3W!f5*)j1+4AMbEUR9=YW2z$#~ibAbvDl?0l z%?<5sZ&8i)5kYVL1 zx{Ik^5BeXT!y!;W5CJ}4n3^m@g`$i%56#EPP$IoJAAm}5li+060^oU(`lc3%)U$}? zWdpFdMG`y&c!}XwQi!IsNO--|Ru%~mx@+)76bc5rJH9Ya4BZz)$>Bvv$!rI=FMfkG zyI}rK6#Ds#=7-`J2C6)XP5K?+#JXxgAiMBAh`>Y1!*P)F2Bjb{RERBucW1JZ)Yib? zgLMujtedx~AT%j0OI}$tq2>-!+WZ0BKq~CgRb+i}?OKGF_@%6S+vae4#O!zaz!nrV zhE8eAr|+-6$_7V;f}PlD=sjA8YDM(isrF)-4JKk=xcV}{cxiyh0$$9gw;-HJ^n9J$ zun7(fa%{wiE$w2y0CwHW+#sn1f-4HPD)9%j!y(hsg<1bszRHqyicO~uc$2Fl&`@il z1^Lx2r3blTYBbg!$r4yM9f1-TBzJ0D^`iL! zVGfqb@0h>P%vdP8DT}5ZoMC&aZ1WbpQ~}M>5rhrhO=^l$XYEFn{Y#VJ>VGWueE zwOY*LZ>g+X}|JEVD2$@?_iP$;8kmEjj-9|2fo75kjE3wGDw`6@>qHQxd_ z`)sCD3;fy^_VBWAtjMPOZ@LJL`HK6^g!6>UAY4&G507#YGkt^8mMH@+fy}zHK*Sa& z?^38@R$c=F^VYO&5Y)5Ei1QHTv`5Ar8;H|!a$Zd8GkkRFOJRGoecE@Edl-<}Tz>Z= zfDvro91x#{Sv>PzY(5o0g>YsQI%~O$D?)k*n)DJVf7qn?k_mc86|Z=+ETw;AXQesP zfn^wPH~D_C3}*nlxey_9s>DjiTT}Vy(5GO@&pyfZq=b-Gr3vuQ+wDWdRHxZ{hDPyD zS|eT0BqN>}`)CKPVOyjM*_bk1lkWnyoq1M8IhU%kTkI=lf&M!8Ae@>1`egDtKO&ge zxEMUhP4BdSG=U*+N(N160~cWT)4z80I;u5&8Y?bnX^#GB8$wA(jWi-xmWI4<#$Vb85lu1mFShC+9CrdkS4M=**vG3 zQWwSX^OP;<%md+&yv*R@rqfPWNOMZD*ad`g(EfiCW4YWg^kJmqDzVjWMuGgo9Ur zxmcU?A5w~YuU2OUQg^u^ZnkQuw@O+%V&{z4o&>)Tqv)L2!A@5B-d-<2$)!0+Xwlkj z65$B${;4*?$6kb%1@taw?|a!LJ0P9;a+|1`R?S+tPMs%{nmY|ae1%ExOKL7+W`1j( zLqq-G;6Q7WcrXJ)LU6VQ1*0`#FloitB0dd|y`^;Xabm(#1VoHt&((NTPZlU@T`uqqsw&Sc@{Eu}&m8Z0Mojx=(F}fGRnFNQb<|M;s-dX? z{Nm9J`?V@#dS*n*jY*q=LSwd?NbGQPmMJJQW``*#HRdE!K*}>s!2!l}8&hJ;5QmA5 z&M@TK#ZeyF!mlalHIaxhDHDkvZW8<+U^Y$*bB`ZMIY!{|i5llQ zqT-U$8D%qP9dKazs}4GN_93r+&74DDJNK~H9e#v2uj2JbR{q!g1q+WldQsKlCE4QF ztgTshT>N-j%hqjuXKe2uAY69GNIEmR^UPhl&pP#ur@g83^nJfS`)PwCzv0GrzvsR0d;bSMc+-b&zU9{2KKzl} z@A&AQcm2=DKK_YMe(KYox%;!98~gnK-t&boe(ByXf90!R`}#M&`K|lDegAhJ`0n=} z{QeJq_@f^`^pl@H{If@X{)=Be`m106=C{B5{r~;pvB&>7KJmn#o_y-he|h?^&;0H0 z|9JMfe?HF~$UH>kpZv)G|7L98$?-0kr@~lagnv=~$$9d1~B_h5$pMW^|bJjd?= zUiqt-=1&Va{y+Q|DTqZ2jsJ^ZN6M}*BtqKm8f?97;vTJIvwQ1lC3qTt>jq5UjXsiu z#6qxpuwRRFPuv~iOR5(q9B`j#ZIxS`Yg_6XJFMD9)Kjb9dP+l^(9kx2b3$#*Ha@0- zn2wfqd4VZeBX!v5q0KtX?J_{|zI?<5x2t&6c^)qHv>xf!Q`~N$yixD6wX)YH+D}d-XwybA%UVSo!0H25hr6gf z&NFCrX<`6aKZ-M$T0>{6IP%5Gs_t;c%nFp2p3)r~DPji;@2veyfR(JQ>h5B0PWDe} zgP$}jPjSHpsz_;+2M+b71RRg;AAPrkGA}ZWrnb{m+yK_|8-#n;wYIdi1$7c5~=!qd?PQ?cv><6pyQbBM4 z-t)GO=2{7WORU$h2j;VRgNcB^!~wzxHJ;*P-i&|2A0lNpMWZGPAulxt zK*DF6*O){3_c}8V*?*x~Y^u#lv&yVBe1*u=LCJ~5Fq_RA`1d9_K+5!)A^5@B`tL2~ zt>yxAiMiZdWv({Ynj6jg%&q35=9A_#{QI2wyt&tW)!c6$G(R>!HIJA_&Esam{F#5x zm}gBaQW`lhatQzCMh=U3k@=CMBg-PIBkLngk(NkD8z*i(VSNB6>An zg#4e!BV|`dii-;iilBi-#j&EI;^J6Iw5YJ4AU30*xTv&%>(bJK;#jnxps1`UT3lFI zS~R1eC>kr~f?S0&iVBMh3X93eMXZ=iGfN97fO82Y6%~`Hw6L%!R!}-C8Z9U)Dk*%` z%;HjtqlAJ22yaPIL1|%0K}=Fna6&w#yloxxbt82Z1y~^=i|*E^&Bzda)#+o==~n^gq}_0Pxc&r z(w@to;tVq=`Ln$*c-o%5zu5Ef&v1@X)ZaMo;rw@bj!^IqIU_<0nNgE59_L^yY0z@mw1JY@$=di=J`pKf_|5Cr z8jc5$MC9+!5t{R{-yU!-*CG^cy4RS0a`XF`@xM&^|Bg!guI0Fn<9d!8IBw*4H^+N8 z-plbmj`wqXfa8N4H*tK3<7SRqIBw+-)+uFufn&O|zR2@0anOLgvbdeLEE;aU%rRYA zU*Y*zIljh`+b(XWElb+aJ~QhA)B{e~y%0RCM5GWBzoqF^fBZDvqNLHs%wvnTTrS7OqQ=H>RITk2u>IO{$~^!?gdl+SSm z#~)T2vzm4vMqTft{QGAb(?}aX&e(3I+?f zFJAo2wtEp31f*EOf})~gS1erYz4wZOiV7%*yM5O(TG@LiyC9> zy=yEO8%lehv%442Z!qtDfA9U?KX2#G-7|B}oH=u*?#%3tTmv+aS0KKtpuYs1fGo`+ zTMT$4b|;Dje*yaHkYhaV{WvV_sVYR5f%^pU6+jx&;Ag{qDg6EFLC27-iW|`cgc|`n z5cVqK>WXy6yFyOnVI9PA8}#SvVLSy+{P~@noSh34aB*>U zb#p6N(B0j`!_(8tt5BiBg^Ls^TC`ZP;>EqaeSAukC|R;psnVr=ean<7Th`C7T)Fb) zD^&3JuUN5CrOK590(e75wQAL?*QimmX02MaYdZ%?L1f#WCLF6*LB)uL{DpA;rZb*0 z0dv(?G($RPC})2F(uaimkT(^hB2)-X4Z`|-3x&=_B_I^!{B@u#DECA)PLND0Y3SK( z3F*R7;Av$a?$d>u*U6=zXW^2*{!l;Zoeti(0ThL0OQcHkA4u96K&&4BVy&F=ZNZP?m*@ID$(w$91InK4G)5 z#pUa3E9p1|6ps1@Ko&NEE?Tk@mjf7QFoT7cgo;|sJBYbEQ;=`g6+|vULC)+SL;#qW z!FCj+C=}E#h&kwf_}83CL8fetlN|E|IkyV}E6K%$Y=`0DcL!8=VejeG=zVd20Q(U3 zFW5)0k71vnL`;z!wY_f0L8LSh4tM`x$OsR!s8Vy}hP({rA4uO7sDKKP6bFl|5z2z< zTni~Ru3;z_8i?bkg6(SP(6W?lYuVui#amGuw!=~5B63w{gW|>4z7~etNFLE1uyt_u zm2@QjW}_X>0|Ao}xXZcX_P~%D$gwCok|z<`9sN3vz1Nf#vR6au?%@G!+PQ{5SQcg3(NnK}2aNaPk$Fe^&b zv>is|Mz)_YWsaLAIX1b0QfNx1i>4Mb-QGr$A0xwcyjf&s1{kH*F4Pt@R6eX)FmwOS z%$Fb|EEPe_B~TWVfz(bwAtgZ>Hye%$$b?c{e&MJw7)mW2V$I5~$4G#$k5iT#8?+d2 zvByd1LCSDJVouldqFYl?ZP-y7Qu`r}WH?IaX>EueXG+uC6y44@9U3f$S~Ev-oFzG< zJ;H-rR>r?YZ^`LKoO-F^Hp|l=!({ZF3s7S20KSd1uY=u%-qR2G;mGBAkPRD9sS^B4 zLeZr`>jOdTxB%d8`XL`tz8fH2_HesVgqH*NBA-FKri#Ix6SUeUPG)YjemmR(Xw9W`;hT&Vr1{N9yU_F7!B z_?S;d6bQ90oLo^U)+EF-&wt9?cKtqG)~s;R0TpI+o#Yfys&1arqe4SFcPrOvWAlz( z7K~czvZzJxFP4wW+p1-cnelDfZm3rxXx2Eg{W)K9tfmkKOhclP9ti^=+>m1!fnmNG z*)s>~txq4(3>0rvKDE8@ut{A}%t5zBDq6(6ES4hp{l{f-vZ{)^ zr?r4fK{pS_LeA(j%}aI7n?IjsOnVx`sht1lK^?$MvgY*60RvwoPZ6&oh5!G(ioG8l z>n+eUcF2B53D+;<9!RzgizLVLcIw>k_D~3MA0gW3PWj(rY{^R`$8UOOre~&8W@cta zMn-z-+e}K&q|^+;lz0ZEz0JTweR^72T6%hFMp{}XV9F#Arl)6QAV_)!9F&>yCN=dH zQ98jdErVXCWv1honUVSWRa$0hYGx*8E5HD}GAQ+J%GVVrW~M?Q{X!BTT-w`IPEBS; zDt_syscHCuF()nk1%yFdh=HX?ic{ZaWTd`CYQYbQMevN*DR0385v0B4G$FdTZ{B96 zWTvGMCyRf;LMN$j(^yw7I#(xoC)+h!vNVA4{ezc z3(~UEjLT9@JF5nZV6hO>d}Y)?b-7x~!lse55PpVX(zDc9F)+FP4^f6F5h6m=BzLhx z9Fbr!b-|`A2Gx=X7k^@Utf>?!eJ@>>O3E$dMRI`B_{4 z-{(IE)1^60KTMP^q$@~Ogz`e+w6&$SbOeuI9WkGrDs#^^tCblr_k(V)>D^>6N-#E*lpT2t+b^y?%!)WwK^6* zOC!^4(^^@M!*8c{T=ze&`N7S;ziU-N-^$Wg|2H593!4U(VK99Gsk)2(ZfIjHzA#MP z#L~pl5yr*hVOa{d6QH7&;^4c=vIXV`-DKcF zyJfGXn&pV)s3pmA(9*%u)Y9AXE6g!VC(Cb^&XzNlJC^R2f$$k**=jk2dl$=2%a4|y zEI(VKER!s!ErTt8Tb@~NSY}wdS$0`&T6SBuS^l&Px6HFVuspFOTc%iMTb^6?TV7aR zT3%UFEC(!SEw3#JmN%BSmXnrymNZMMWwM2=n4`C5U{+nV?y)T7Sq1CYmP|`N>oQAT zt76rx7Hb~sAC}9Oa~4PIHOqNReyfMo%Ua0lX)SCmVBKu_%2M2#*IL3_%39i5#_DVJ zvzE1%xB6SFS}R&BSu0xutkta5tu?GCEQywVmQ$9R)+*L|*2dO$7>Op48A_g4%&$g)kUxs{ezl;%01-t-J5d)RV z7_L>p#6UHDL8T_A9|u}qePx%aOQlj(gGKC_1Af~TaT29Ag zJ>MqlF-N0R8*;XSlw)-o3rd7lWFmd8qAMio4wFQ^V1Cu{xtEAlSb|xN<(E$&xxsac z9?Nxbxk+_Ipx_0~3L+5tdWfqffHEwqdm&2r@XYD zx2}4B5{Ohen>D#G*7A)qpM*Nb?R*kqPQq9t6ggGygX1r5PgtvCLE8ZEON<(l(4WMD ze+;1J&`A=eD%a^T*lAnCudN==@QFnz?u9Zieq(O&xu)hm%8fzGG6y3TH}pd8NMS9# ztZAaI_?=Eu9*oRbL&MOMcc#KRodbH-oscjdQ-@v{O>#`7krU;>lSC=q%{9dfJyMb` z{W|nW%*6>kc@ko1pwrYvm_W2U{-UC;(ayRrbL#;*zPsxGFR_V76QMes2c^BUu6aVc z*#pb{r%_U(F3r?LUQWp(>JKam2ZUcNcrc$``sFom8c2CZj z<>rWbflkLhWgs=*v+0(BN=1xKb-m<43zQdAhWYi_3ZRbOLe6!Di*wQgsq+He04xTE zkT;~_auN#5Jj-Gnz*2kYF79>QAho+GwSaVEv*bv^6l8Ts?g7JFrJCq1dp(R|xjv4? z1}Wy)9@tyJGCU2EXG_g9-x7TKL-wX7RkrLMsS~Dp?YucZd7NT*7lX@Nmo8M7pJgel zOFm5RBaPHVLpnp>9J`S(tbtg_!*@gO&jB}qT?AP?AfFdXa2vQ|Av=dlGD}0Yz$`XvLtjk4IMlvs#bCu2&vmv0gc!nf5X6(e&JuZU$V2UU?+NDNUjh!Ur|p;A`if zWR_zt#V>TK&$B49r8B~0|BI}?K%f*Sk>M7CO{Ig3Z=gU~Sf_z~v1;jyY z0J4`U-ADIli0joW*aFz3_8R}i=r!^spU7v{ZXS=81qI{p(#@=Jm(hM-rb4i+vlqz2 zwmvTboy}j!LuYU~j8?gns81zz*d1Z7!tW~XhfzB&!34qHhCGvy{u$U3 zbQN{uhF+#_0K+=-)G3&@Dr)`+GYP8X>G3@?{!L#FJe^>IWJ&r4fU>-i`&r*8^HE0=E|+Htq;r0xb%|CBWYuJ+l{} zmazQa4gXzqx)SjBgv*P1!(9OqdgzvUIO_bErxB+BWN>#!I_JZ1OCyM9OM}HM^KQ6; z#r*f&cK`o(|39gLASn(d^= zi;In-kWxq~tCUxKL0;GD*ZmQGqT*qb_4A+~f z=shP79xu3NNh@rVoGlO zJ}eEVX@~N?vO~$#)0ZJq#al6lenra8P=K^o{36}}Zl?uEc8yG?c=6nn{y*g}B+iNM zA~$L3ORFhCPLL0YTjU^}QPzkvik)w6VRCBc!>KWJn}iav1{;-cC_C_U**jNBCyHrE z`((_owEvep%T2QP^R9xlL#Zelh?>$^swG_)SY4GSDr2=?+E~pWBV#VRhPH1ifzqN} z^K6mA`Lak!m4l>>B2``^_KRT6C=vCf3donfX!Rq}idRRBoO^ksJSY*I5)0b74{NE6 zn5c}?oMCq;;}w>6G-e;VV*7SW(G~F)7h|Y`v|rd@7b%MrMW^`zrQkGT4pg_OB_vl! zzeuUC@&8&q#krRVFiVm{}c@=FEe~GWfHhG6~U({1K zt8P*{^v1gTu(ldVx#d1<%30!nPJ_YA_^&73MSD5&BpQCB| z>;H$P0XJP!QF6}u%JF+^Rn@9!568+}U%8A_l6L+}+PJ)IgqFwVT3`M2oH}l%VTa-_ zv4#@`n|erFfOMC3i1mtx#F`!|wu_z0>i;@zf6({xBBg-R1?Gt;DU~!!w}lEzB~aGJ zK-NWyic)kJTL(X^sUU2tWLdZ5nzjI>>Kl~29m*8U!nPG;73aRg#37vy{w|D^nNYjhxF=dg6Z}YP-<~ME*8` zAr>bAI%4Gj1fNCZ}>l~924y@`@pe16QeMy&AsQ% zO`09b4U}_3lU>xh;;!(5c_y|Af5}^T;{}zvD)&L<@PbM`j1vO%wAGVFp|l>8r{-E7 z?&;5A?e%`}p8g*s-9t>Z%v_sGs8@P#&*lC{aTw|QlPZGdftp`CA}_=^bP-H9wT`%o zmtu~h-R>ZFlsm~E)?XOP+I%rVsr)Y^kuq9Cp-~^aeliPdI=Sm@6<*M}hY?Y3`dckV zq0EoOlU6^>F$~C6A3;(h%<=_ERm4r@Pw{E4{7#}I4ODnl{HzGZ49gn9qlReNRced% zGl9X(Amw+nt!*m)P=?5#p=>(Sbx}`oR!%E}l@E=VRFo_(EedEqMh!VB&cNr4a#(pK zhSF+vwXA{L$Ks+IEvw3PQ4lj~iqcAis%@~ryE;l4haQ4`)7%T~!OREOhJv}a>SZK< zVbBgGH_1ou$u}qp4OGf%`=E^z7zs-1=i-FugVG)(X?UHT{0+(}QBYc= z{Hi$M*`*=fLzuxzCGoKclxk27+7I`5+K!a01JoKl(g1LIgq}P|^3|$I_y8+ekfQx! zh*&Rvz}j77Dk?R>^J!CI(oHs^~k$e0g>|J2GHSodbJt+`! z6~n0ZW6{pk3-{!_QRosz)OGO`eHn9h&8Y>JqBIe{cpgJJfh=x#N^Fc*(^%>a zSW#$2Z&a3i3?w&FcMOz@!cT1rV1lGzfw?QGvq+aCu?q2&X2{d!FU8+9Po6JFi>;U` zZH-ynYoeHH#WQ++8i5g3w$wH)K{+TIDNi7Kb!j~nRU;`|_KWf*xu<*sFUMIi2D2&; zkeUt3YZ0XIOu}Qt-bB|c^i4fQKlKyQSeJZ<%zb2E(FSu1m^Fp2S>L>~L{a*SP;eQH zI3p4Mg#5K^731lM7zo*eBn#-a$nBKz)K1w7w^b>Rxzh$zL9H$&;KinF$%CX#c*&`V zI#_;!`H<>bkkkdw!V#i7v^5%~v#qjKZVNuF*9bKTa}XPpk5$$y=W_?@Kvi)cgV_i} zx=%z0ylfYb=X-r5CG}CONPi0tXbYbzr_WGwH)7p4NODliAsj)TASo~0*fk>-WA@=W zaxYuDd6>m{seFmov6^dZF=O3UU5=TSWiT~SI?>XKC783Qt!wKlW>Q$M^PrdP(#iRv zC~2akSc(~s`D!aIJ6}3u-nOUQmAYa+uM_z}5?_Q}tacC`#Uk}F*4dhf+3FOe$37ly zEV_v$;+D8ch1F`Z=Z-iLx`w z)Gb;8o%PT-U%G1r^gP@tqC{!cN$sZPht75(MlNA>wCd1V4G}By2uHl8SwSnW{VYDB zXtk^~LUp8LYMh9{PJ||E1bIs3sG&3o^FWQ&>Edf;hH%w)Xk_cGk@QUYR6J5P(`RBQ zWvH2Iy1E5(@l{2d+D5*Hy&K)=fH+5AVYc!iwNX~0gtbzdiy!e)>aWTt^3Pa}X)j(- zFC~$-(RNA@n?(rb_4*S|?VxX{FLv3y!aUVF%-p04K!gnD_Uh?s@t9Fsp%lf;^lD{^Qk<44vlTzgC!U~Ek`MN7e5?d2R_x!XsEnWrN@b-41t^uJ zFeRS|Rq~5cnEl(VI4I%r3al@dra4$2au#)^?`e~AUpHUM#@+tkUf-uZS!45udROTR zYnVS&Hg*@^W7Syf6|%hJmlJD zsvoIy)K_Y_I!&FR#;GUOQ|bvdT>Dc!1Io$jHg&K1bq)^MvHYKacB;Rqd(_?PLG@>K zm->ymUHw-5PR)QWQk8%lQtVJIYJ&Qux)FX!>i6nCHBoia+G=gIJ2|NCDmk_C@A3{+ z4Lw@)`!IDFzPBK&QL4MvMm0=V+&|1Gua+lAPJEd5U2Ml(I5z{oXKDkrqiH&;L27-q zwQ5x#E2FiA>U6ae>_}~@x)6r{JHh3Ny=JZ`KWv7YCJJf!9oW{0X|y(4>#g=yM`@#Q zzoQP+R;tz1I;QEZrYKY4HxOLef2wZT_oX@l^eM_EgiTQlsEW#_j4uBrK%Tmb{pv#Y zYw9(XsjF$#v@z-!bt0rV3-?`RqB>q33*P0_mRd`#sct4{6Et_ND@wg#x@v{gLP)C> z?ym1>wgX%Ru$wL<7rkX`x5zu;vi(0n$Onq+e_&^-v(*0Yab0G*2xguwf3M(LD_FE6hQd<1i;+PGUil&1ozToWme5H**6^8dqR= zLE)xpZef|uFxSyt+}6!8ynA*p%RI#3@)8CBe_<2MBS^vvE`~h6VLJeC3wW-ZXXs4Q zVR^eVf79RvR{CCI!S*GVo`iUXMIIRge#``zhPNj_g~6^z-6+B^#v)K2Ec9#QEtX5} z!(7&lBf3mSk%F%1jlPJIiiMO^$ihoKy!gasFP4K1!!i~S*~SGO19uJ1c+heX7cop= zb3r$DSN5Hkx!yN!S)ty?@K+lyV)M28I~4pVTnNS!T^)9aV=>4B^6|#vt5{%q08<2y z=7uhdqC+$w{^xBEd-2%oqni?#3@IT>!SExsFBa9xh|;EENgnIQ2<<2Qa`0ila;Cci zmXs>NR2F$*s_KTfkMJfI-lS49%hbXmcP%W%*N15UQxAq0wrsjd!v-rhfiQK%1$|2; zZ>nU&3t0Pzm$mkyY#xQ-MNKZ5f54oAG0NsKY<{?dQuYufinoMt5y^vvyNl$eYpa;B zn==^pm(GWr_FGvb6Z90S`I=adcQ!^(yd4(A+z&!QPV1MnH&zWDz3NWzh~I9Yla zzP*hTeg_dn{*0H!5pNIJ&ah+Q?w-Rv{XO>_xO%c=Jc_9E!@nHd9iz=>1LSi zmK<)T!3iXd8VBQTq9Eg4v{rblXe1Eh7>O$-5<0*;#x6*A0PZ7kXIRG8aXe2^o;(f? zR;vY{^Uy!0!Q)cn{U5v`%U9&c!F}~lJL8xNd^XC2YvUy`f+XI_zq^F|`=?LlyAG-&^?O zWi>n}<4rm9UK{V7!QUq`WMnK3mcn6vI4&Ni*9{sxl0PjS9vO+OijInjA=?emm9k)7 zqHG@3JHJ}lRjK8niXy5ER)ZiG-&^4oRT)vGBC4t=Nt59hf_oh9c#Ug2{Cy>qxB(;- zXThI>k}#0A&_ty0FSo^rfzz%4{kVN}ASMUI5i_4H4i`K;pip=;8UOHsScHkvN zu2uXtdK}(B2aT#nOtxKsMKV%@d+9eO=kHKWK6S^dF=ldWz|EHe3u#g~%rmmh&XgSU zec`5~^mu?<3qQ1Zw(X1?Yw|PWI?TA|WIK=hWy_g@M!+94ldvMwP;QmkHnWLbKeJJ0 z)6C|X9kBMkH**HMw;o~z=62g;wxq`yX_+<9bUqLbq)wO}`&!yB{VC;@TPWS+JaS1T zSUDh#mb+li{){|IN{}{5Ur9w|ADL}x#{VueON^4o$S>s-xwg_knXJrGRw?V04a!Dk zv$9qBPPwK$Qj(SD%1h;qQW7J-nrdyemD&MMA&b2=BLsZFfTJFXYQi=;<{8&E-kl`mxuyVLurlVBsZ65D%})c zxwqU@X(Km9E7UNvx>8H&rPNiXD>2GJr6RRd@+p1r9Qlj#lk!lhm>HbeE^~fnENPhW zekk}eNJH>(qkGZ}d9M76{7NpabW%1cmz7h}btPS?pf<#_*b0oe*J5q$D|M%ONY&IP zm}NMvUR1BBs(c4C%qePKwJV;sNjr$|Ka3HMT7Jz{^T4`6No}3FUQJT(sgKmB>ffMG zg6o=ET&trUS6{1cS_!S7_ChU$NYmPqYMWi?&JoR{K)>LHkuN_ELMJrD;#Jr`lUBRZGWbF}PA)Ko?@~O1W$0F1AHAyqU`<+#7uZcCF>d{6cZe zVvf-p3C%d20}cNlXl&vdXc6I&Xte1<)f?!1h6gKyalkxyZ?B!)9?frK86PX5wNMx{>R%WXG>DCC)<+5t z(Qq#^+_qI8$^11#y_MY#7@#eFp6n<&=0&p&K7g5N06yh2B|w=z*%r0AP^ zMBcdbwGdtQ1ZcMw!hD79q7Gu}*Ep&Lkc$+;F`BENZ!n^1Q z^J0wW-xI?^SRc5L;(ik2UMt{Epl<}aBe?g1{{js0Y`A~Z2}4`Z6o>xIUy0)AfHpq~Z!K@kI<4S13%!yLe0m@<3> z*x!_4F5u5y4ElM1r~!i9A&#D((7JXZsr ztPj5gRtXJQhCjnk@Er-J`2_GC6aEx1PWgkcz-%*GTMWG!UJLkV#LM*S0H;?l;LiaE zqqS%M^?(b4p5YBl@5Et|KKyNjZI1k~yT1hRlIscZ3HaLt8=&jlaBqe?7WL1L-vVHI z4)<56LsOT_j~XpGtGZ{{abTyJS1iR z8_!PsRVm|QG2_tU#Chk3J>9^0b$tA?B z01A%g56pWH4no}`Dd!wC<57;*gOU$ zBHP&s52%JBbfxoo^Y+gr8fD9_P5ZG)WHZlCf;N#nJ;!mt5_KFK(LZWf_yAqW`jG~D z`Ov=upGDLOZQRX0PR<`nqZSSGET$m8Ll=>d5ec;b0pb7J(Q;sgYi7jL-PE)CKZ=WE}3Q}Gst7W z%cx~B)C!959vl+m-9HSu5fg?qA&z#@Q6r;prh!@fSfi$dMupGL9sb;Vf1vq*OnX}s z1D%GAgrG4a!!b9+?Twiq*(J2Knc(ca$%@lBtSjs629sMBnzff*BHrmbc!_t6-j-%7!b~xm8XT_3O;)xRSgLH#h9Qx9DscdW zw{gCepZ+g7W_oe%Q)_f+;e&B5N(ee7w8jY3 z!EE99q(-9(WVH<~;ll+PU+LG|K)YKn*r=gsS3`+CM}sIjY>2KR&c&FpXuTt{-Av%8 zsxPFTlq|l-+Hq+yO)Dxd#g6e`OlvI7psCU@IZAm(&t*>)3m|eUt&=ofd?N3` zyjpwg)B2gdlOrfo%up(+Z?MxT47)f!qn%oUh><#C+?B9dcFgO;lW_V~36qA0;iXkq znqn6z*{;GNtp)HmfD%pAerlu|f_cA_Jebq3BiaMZBNVgLwluf&v0%1ti|lw#|7sp{ zWy{lq)82eejoL&~nqNWsy=xh|Qtc)6zm!OISMitM8q$FF8T9kjEwnS_Ak~R1MW-uP$qy0(QDcld}>hd!j@-}EJG@A*_2bAaR1no#nVq2#^$B-MEFG2Pl! zl=_4$B5UEhG-Fj5zDC=Z<_8U?xbvA*CZ;uMS^ypGQjm@$#L)Pg{b=aCMDjY&lztnu zpB(OArtZ_q(cDo7Xk(G()M(ok^6L6KeNkT})sjh7C*keRD)(t++pF~R#46-lZ$A|q z`jkFP=|k0v*P+ROAEjrriqeF59~x3>0{t2JmMZ&?rh3g?BwBPF!+Ik>~Dzvs? zwx&1DoY;hJjqs<{hp^YAKc4hXPoN!NuArKo|D<#EU(tGJPij3XjY2;uN5ju;p#c+8 zXx#R$_?-iN2ii_1pSeoFC$7=W>Fd71G$iB%u(p~ zgO1PXOvA0@*ZdBp|LIKhOBxkhdYp!zctWoAU(%yzarE82{q$=}Sz4klrF|pnQ$>gG z$g%Nrn(eZNws?=Hir;@mO&8-`-zt?TZ|4Y#{xY71-YZT4$ClGr_ZDOudy`&Vn?v`P zuArNDr_-u{6*T+tQ0m*a2K}6#pPGHVg9dFFMkAtwX@2i2^jX1OwEK<&%?~I|uSeF# z8vsQpUtU2it%Iq;lWx>>b3Bc_C()j>rRep6tSNA#9y#+=F2xq~0o3{9kn^UhSISrzKpDwf)eI75v)MUtb# zJ}UPzoZJTfNo6dbP;aFj?FhU?4@VuOS#Lb3`Ot|}w9HSmJlu~C9si29x^<%Xn?q>! z1$^-&x*aJSexcEprS!b=aC|Db3_To?Km(JSQ|R@2wBpJ%THjy=HC&ob`DV_e0NYhs zT>BHcGJGC+?7T_ zkRGc$$uF!jb?vg3nr7CaA#Z-9*k7Jg*(KL#3mz*6&U;15v4Zrrghm%`7o~dNZJ@4& z7gCMi9H>q319JUk163{gJtc20L~X+o==8oX$gzPF^&ImXm3%Xb#?Mt~jz=^d+Sn0` zNjK@~Us#T7f&FF|chcs8Khda@*p?s_rEi}3)4Ww!6y7?TW;VM>uY0ehLvb(YtK>>_ z<gwWI;-wl}TmmTPS2uRVwE>lUnb2 zi2AgR7DhzUvO%>eU~f;Fey$l+zUEH9`ZuJ~A=T-~@Do(|*e=>TEFF7WKPPqAZR&Al zE%`(>rT#9b>BnBvX?RF;8rtPLt?D4CUFVuq?9ZK4_1OV(jqFRkE8oUf!#7dUZ}-!> zDmBQua|1p625r=9A6giGo62O4ro3_-+I4?w``cRb{$dq<_xT@GsdpaQ@g|rGTs%e- ze>p{~FYTi(9((BM=Tpc!q!+&2?tz8t&NSIAnQmBSlAB{FEw|05S-)JRi|OTPXz3ql z{G4i}KF^>Z_kK!)hqR>@68;Yy7 zjE;K?8gXSN9l81g?d|uHT89-NVHryEwtq$6CZ3}9_)cfB)cmw8dOxk#0x2=5I%${3 z)Ah#3sg2)TI(zgm-G6SQ387bMb?AAz@Jj$~Sh1f*cRNGjw+>SBMOXT%PF-r^*@QaB z_NCK%UQ*=ZL-bX}-ju)5V=7WVm_iQBBER$pbnonQDly?GMJ=jM*6Rl;^W1!j9CDMk zryrsv)_pXg_edJL^;`Na@)N2bJ)RB~7(%a4ZX&;!YxMn*pRgj=o^F1dk4FAfitbG8 zMddzvvH&Ft-)WYOXH_>0e$zQ3$8TxryuFSiZlvHC_~R8 z_tVmYHRyao7uu2VJ)JzBpIqknQ&iV#RH4fpT6N+Uo%Q~ahW6P^^~Bv z@gkKL1V+%!nHA{4ndy|aV-r1n@;g@_UK0qIy|At1)S)`_XQ~J*h{Lm+aLA` z-S2&zuJq|ggBGl&#Z{lu5szII(rq=}=(?NQPdh~C>pRnx5zWZI$Q9b=xsH4)G@;`rpjul?(4Zxksq_8KG}X5j9lf`j+UMIqtEzrO zo6h0jDzzDfeVa^^XMahvTdklszt(HRTf+^#Z zYt-jVUm8DX1O4>XIO_cBb1FZ(B-t&d`(Rc&ZHR)`;*ViK&miyDLIGCqH?XqQ(T2Y)Nrp0 z&GwC_F?Huq!hzd#=hApOP$!9eUp%DOgHQ$*@1?Ny<*DA1Z)nd1N7~T-GL^Y9fWmKF zp^uk(QG(wx8hoNGIXvD$jXv|HHY<vE5Lo>}R8jA^1K zwWcq;+SB)Mw$RjTXKDGB5OS{}A^#`{82E#>@dCgLVfl)O#jpn((J?s{#mG(uib2qjA5=j*-tWhrbzazIq{Rw-_M(<%P8)6SmlJ zx`qjFbVrwN!Ycu9GvR#bBDdS=A=)=4`~YiF->O;2Sp!cgKd=dm^+&urOsrf7>v!<%?^m7Zd($&N7Q}uq;m@$Ru+xNB0p4Z8lPco4 z2orV)#&VAdZ^B~7&nCPQ@NN_S+MjG+9g!Vos0t#%u;GRJc83EtV!^7(YRr2BTkus zy#jj`_8RPU*c-4nVfnfRdmCRxMmz)2$*rX$Bs1KYrl>nS1GzffUh2G9+1?WUZH}cl8+353(R)N0H=xR0tot3V*KTUKzfGl(t^8`j~ z2)&EZoyxz*{1l@tKwoF{mYmg_)sn(!E6}sg0zE!Qp6lse3t!0r=%8pwq1-al%vk*=u?a?0Q7YRFe7Mt1i(m63VXQ#H~SKR88)&l1z_OTvX?7x+Zp() zIN5e*;SRHx8*t|VINd33NW@K&9%VA43j!T?8R+3b20BaYE8#1-1D(L=k8)^951q(p z51>ymI?b$$S0H+?NHnKwRvZD{@L}z8-b@&$dgwxBkg>aAg zk8HkbQt`-?EmK{@Acil1u$E2wDXmP-p=SUKqoTV!^~VGaxg#7=(0fHXY?|Yxly2j zj=K%CAJFj(*wEW<0Dw9=1v&@hQVu#OZ`z)S7hCde$FoSzGf4%Y{Y}dx*rjiKkwp@B z2P74Nu4Gy!!Nz^t8X$~_5}2ei&;h2cf;;x|+YV%roB~w5D!i+iwmR;-y`L|Du#h-~ zscOK9R~~fB$2Re%f4;J)*4_nGZ8+<|2Ex{bt+wBwGRiS{9cHR}z|@Cr0Lya6o8xjg zjTn=eDhN(n4yuper&@UrR2-i9*m-R<<;sdN@k3O4hH@J3e~2neuK4@^5F@|dz*km` zyFNsf72|bKxx6nuc-i6}0HIfcvT=0&y3U(|1qL!e6slr&$?p?11i@h@xM2>H-X~}T zf@CJh!1EYi?-Miz!ODjqcxVpN-X~}Rf!koA5vfxVgow~K+Bbx}mKaHrU-1#s6H=!plnM_ITO_G$^->_>?7m6gc~EoWSIx1&>XqO(HBKSAiW2)!0SA*>?mmo8q81hxagVJ3*o zIl2OSyLe2H%mm|eb}QguPazYmdPgauX7_YOfbZ3 zDouhc8JHkG83dzp668=a=Cy6Rn4ojcROC=H6I^G4koQtyh=^0{K`{Fn2$t0_yzHs4 z>wyWjgTQI6Nsy)J!|=sNrce$Ty*=-{;cdxwbll%yZ%6B)bEKd%!Y44nq?|P@M@Df$ zJH-TRc|Hx7nUh&cVuBPV`05>kY&CZQ!P@5_=pCdpFge6$abSYOOfckK0-+f6dPXHP zL74e)ZqFz)%{sx#7tjJ0GxRGa(GQ;#o4p7jQgKCpdF zewA~UtsI5#eY#*g+uVO8JC+-XfU&TnVEG!2`xw}} + */ + jOpen(filename, pFile, flags, pOutFlags) { + return VFS.SQLITE_CANTOPEN; + } + + /** + * @param {string} filename + * @param {number} syncDir + * @returns {number|Promise} + */ + jDelete(filename, syncDir) { + return VFS.SQLITE_OK; + } + + /** + * @param {string} filename + * @param {number} flags + * @param {DataView} pResOut + * @returns {number|Promise} + */ + jAccess(filename, flags, pResOut) { + return VFS.SQLITE_OK; + } + + /** + * @param {string} filename + * @param {Uint8Array} zOut + * @returns {number|Promise} + */ + jFullPathname(filename, zOut) { + // Copy the filename to the output buffer. + const { read, written } = new TextEncoder().encodeInto(filename, zOut); + if (read < filename.length) return VFS.SQLITE_IOERR; + if (written >= zOut.length) return VFS.SQLITE_IOERR; + zOut[written] = 0; + return VFS.SQLITE_OK; + } + + /** + * @param {Uint8Array} zBuf + * @returns {number|Promise} + */ + jGetLastError(zBuf) { + return VFS.SQLITE_OK; + } + + /** + * @param {number} pFile + * @returns {number|Promise} + */ + jClose(pFile) { + return VFS.SQLITE_OK; + } + + /** + * @param {number} pFile + * @param {Uint8Array} pData + * @param {number} iOffset + * @returns {number|Promise} + */ + jRead(pFile, pData, iOffset) { + pData.fill(0); + return VFS.SQLITE_IOERR_SHORT_READ; + } + + /** + * @param {number} pFile + * @param {Uint8Array} pData + * @param {number} iOffset + * @returns {number|Promise} + */ + jWrite(pFile, pData, iOffset) { + return VFS.SQLITE_IOERR_WRITE; + } + + /** + * @param {number} pFile + * @param {number} size + * @returns {number|Promise} + */ + jTruncate(pFile, size) { + return VFS.SQLITE_OK; + } + + /** + * @param {number} pFile + * @param {number} flags + * @returns {number|Promise} + */ + jSync(pFile, flags) { + return VFS.SQLITE_OK; + } + + /** + * @param {number} pFile + * @param {DataView} pSize + * @returns {number|Promise} + */ + jFileSize(pFile, pSize) { + return VFS.SQLITE_OK; + } + + /** + * @param {number} pFile + * @param {number} lockType + * @returns {number|Promise} + */ + jLock(pFile, lockType) { + return VFS.SQLITE_OK; + } + + /** + * @param {number} pFile + * @param {number} lockType + * @returns {number|Promise} + */ + jUnlock(pFile, lockType) { + return VFS.SQLITE_OK; + } + + /** + * @param {number} pFile + * @param {DataView} pResOut + * @returns {number|Promise} + */ + jCheckReservedLock(pFile, pResOut) { + pResOut.setInt32(0, 0, true); + return VFS.SQLITE_OK; + } + + /** + * @param {number} pFile + * @param {number} op + * @param {DataView} pArg + * @returns {number|Promise} + */ + jFileControl(pFile, op, pArg) { + return VFS.SQLITE_NOTFOUND; + } + + /** + * @param {number} pFile + * @returns {number|Promise} + */ + jSectorSize(pFile) { + return super.xSectorSize(pFile); + } + + /** + * @param {number} pFile + * @returns {number|Promise} + */ + jDeviceCharacteristics(pFile) { + return 0; + } + + /** + * @param {number} pVfs + * @param {number} zName + * @param {number} pFile + * @param {number} flags + * @param {number} pOutFlags + * @returns {number|Promise} + */ + xOpen(pVfs, zName, pFile, flags, pOutFlags) { + const filename = this.#decodeFilename(zName, flags); + const pOutFlagsView = this.#makeTypedDataView('Int32', pOutFlags); + this['log']?.('jOpen', filename, pFile, '0x' + flags.toString(16)); + return this.jOpen(filename, pFile, flags, pOutFlagsView); + } + + /** + * @param {number} pVfs + * @param {number} zName + * @param {number} syncDir + * @returns {number|Promise} + */ + xDelete(pVfs, zName, syncDir) { + const filename = this._module.UTF8ToString(zName); + this['log']?.('jDelete', filename, syncDir); + return this.jDelete(filename, syncDir); + } + + /** + * @param {number} pVfs + * @param {number} zName + * @param {number} flags + * @param {number} pResOut + * @returns {number|Promise} + */ + xAccess(pVfs, zName, flags, pResOut) { + const filename = this._module.UTF8ToString(zName); + const pResOutView = this.#makeTypedDataView('Int32', pResOut); + this['log']?.('jAccess', filename, flags); + return this.jAccess(filename, flags, pResOutView); + } + + /** + * @param {number} pVfs + * @param {number} zName + * @param {number} nOut + * @param {number} zOut + * @returns {number|Promise} + */ + xFullPathname(pVfs, zName, nOut, zOut) { + const filename = this._module.UTF8ToString(zName); + const zOutArray = this._module.HEAPU8.subarray(zOut, zOut + nOut); + this['log']?.('jFullPathname', filename, nOut); + return this.jFullPathname(filename, zOutArray); + } + + /** + * @param {number} pVfs + * @param {number} nBuf + * @param {number} zBuf + * @returns {number|Promise} + */ + xGetLastError(pVfs, nBuf, zBuf) { + const zBufArray = this._module.HEAPU8.subarray(zBuf, zBuf + nBuf); + this['log']?.('jGetLastError', nBuf); + return this.jGetLastError(zBufArray); + } + + /** + * @param {number} pFile + * @returns {number|Promise} + */ + xClose(pFile) { + this['log']?.('jClose', pFile); + return this.jClose(pFile); + } + + /** + * @param {number} pFile + * @param {number} pData + * @param {number} iAmt + * @param {number} iOffsetLo + * @param {number} iOffsetHi + * @returns {number|Promise} + */ + xRead(pFile, pData, iAmt, iOffsetLo, iOffsetHi) { + const pDataArray = this.#makeDataArray(pData, iAmt); + const iOffset = delegalize(iOffsetLo, iOffsetHi); + this['log']?.('jRead', pFile, iAmt, iOffset); + return this.jRead(pFile, pDataArray, iOffset); + } + + /** + * @param {number} pFile + * @param {number} pData + * @param {number} iAmt + * @param {number} iOffsetLo + * @param {number} iOffsetHi + * @returns {number|Promise} + */ + xWrite(pFile, pData, iAmt, iOffsetLo, iOffsetHi) { + const pDataArray = this.#makeDataArray(pData, iAmt); + const iOffset = delegalize(iOffsetLo, iOffsetHi); + this['log']?.('jWrite', pFile, pDataArray, iOffset); + return this.jWrite(pFile, pDataArray, iOffset); + } + + /** + * @param {number} pFile + * @param {number} sizeLo + * @param {number} sizeHi + * @returns {number|Promise} + */ + xTruncate(pFile, sizeLo, sizeHi) { + const size = delegalize(sizeLo, sizeHi); + this['log']?.('jTruncate', pFile, size); + return this.jTruncate(pFile, size); + } + + /** + * @param {number} pFile + * @param {number} flags + * @returns {number|Promise} + */ + xSync(pFile, flags) { + this['log']?.('jSync', pFile, flags); + return this.jSync(pFile, flags); + } + + /** + * + * @param {number} pFile + * @param {number} pSize + * @returns {number|Promise} + */ + xFileSize(pFile, pSize) { + const pSizeView = this.#makeTypedDataView('BigInt64', pSize); + this['log']?.('jFileSize', pFile); + return this.jFileSize(pFile, pSizeView); + } + + /** + * @param {number} pFile + * @param {number} lockType + * @returns {number|Promise} + */ + xLock(pFile, lockType) { + this['log']?.('jLock', pFile, lockType); + return this.jLock(pFile, lockType); + } + + /** + * @param {number} pFile + * @param {number} lockType + * @returns {number|Promise} + */ + xUnlock(pFile, lockType) { + this['log']?.('jUnlock', pFile, lockType); + return this.jUnlock(pFile, lockType); + } + + /** + * @param {number} pFile + * @param {number} pResOut + * @returns {number|Promise} + */ + xCheckReservedLock(pFile, pResOut) { + const pResOutView = this.#makeTypedDataView('Int32', pResOut); + this['log']?.('jCheckReservedLock', pFile); + return this.jCheckReservedLock(pFile, pResOutView); + } + + /** + * @param {number} pFile + * @param {number} op + * @param {number} pArg + * @returns {number|Promise} + */ + xFileControl(pFile, op, pArg) { + const pArgView = new DataView( + this._module.HEAPU8.buffer, + this._module.HEAPU8.byteOffset + pArg); + this['log']?.('jFileControl', pFile, op, pArgView); + return this.jFileControl(pFile, op, pArgView); + } + + /** + * @param {number} pFile + * @returns {number|Promise} + */ + xSectorSize(pFile) { + this['log']?.('jSectorSize', pFile); + return this.jSectorSize(pFile); + } + + /** + * @param {number} pFile + * @returns {number|Promise} + */ + xDeviceCharacteristics(pFile) { + this['log']?.('jDeviceCharacteristics', pFile); + return this.jDeviceCharacteristics(pFile); + } + + /** + * Wrapped DataView for pointer arguments. + * Pointers to a single value are passed using DataView. A Proxy + * wrapper prevents use of incorrect type or endianness. + * @param {'Int32'|'BigInt64'} type + * @param {number} byteOffset + * @returns {DataView} + */ + #makeTypedDataView(type, byteOffset) { + const byteLength = type === 'Int32' ? 4 : 8; + const getter = `get${type}`; + const setter = `set${type}`; + const makeDataView = () => new DataView( + this._module.HEAPU8.buffer, + this._module.HEAPU8.byteOffset + byteOffset, + byteLength); + let dataView = makeDataView(); + return new Proxy(dataView, { + get(_, prop) { + if (dataView.buffer.byteLength === 0) { + // WebAssembly memory resize detached the buffer. + dataView = makeDataView(); + } + if (prop === getter) { + return function(byteOffset, littleEndian) { + if (!littleEndian) throw new Error('must be little endian'); + return dataView[prop](byteOffset, littleEndian); + } + } + if (prop === setter) { + return function(byteOffset, value, littleEndian) { + if (!littleEndian) throw new Error('must be little endian'); + return dataView[prop](byteOffset, value, littleEndian); + } + } + if (typeof prop === 'string' && (prop.match(/^(get)|(set)/))) { + throw new Error('invalid type'); + } + const result = dataView[prop]; + return typeof result === 'function' ? result.bind(dataView) : result; + } + }); + } + + /** + * @param {number} byteOffset + * @param {number} byteLength + */ + #makeDataArray(byteOffset, byteLength) { + let target = this._module.HEAPU8.subarray(byteOffset, byteOffset + byteLength); + return new Proxy(target, { + get: (_, prop, receiver) => { + if (target.buffer.byteLength === 0) { + // WebAssembly memory resize detached the buffer. + target = this._module.HEAPU8.subarray(byteOffset, byteOffset + byteLength); + } + const result = target[prop]; + return typeof result === 'function' ? result.bind(target) : result; + } + }); + } + + #decodeFilename(zName, flags) { + if (flags & VFS.SQLITE_OPEN_URI) { + // The first null-terminated string is the URI path. Subsequent + // strings are query parameter keys and values. + // https://www.sqlite.org/c3ref/open.html#urifilenamesinsqlite3open + let pName = zName; + let state = 1; + const charCodes = []; + while (state) { + const charCode = this._module.HEAPU8[pName++]; + if (charCode) { + charCodes.push(charCode); + } else { + if (!this._module.HEAPU8[pName]) state = null; + switch (state) { + case 1: // path + charCodes.push('?'.charCodeAt(0)); + state = 2; + break; + case 2: // key + charCodes.push('='.charCodeAt(0)); + state = 3; + break; + case 3: // value + charCodes.push('&'.charCodeAt(0)); + state = 2; + break; + } + } + } + return new TextDecoder().decode(new Uint8Array(charCodes)); + } + return zName ? this._module.UTF8ToString(zName) : null; + } +} + +// Emscripten "legalizes" 64-bit integer arguments by passing them as +// two 32-bit signed integers. +function delegalize(lo32, hi32) { + return (hi32 * 0x100000000) + lo32 + (lo32 < 0 ? 2**32 : 0); +} diff --git a/packages/replicate/assets/wa-sqlite/src/VFS.js b/packages/replicate/assets/wa-sqlite/src/VFS.js new file mode 100644 index 0000000..12966b9 --- /dev/null +++ b/packages/replicate/assets/wa-sqlite/src/VFS.js @@ -0,0 +1,222 @@ +// Copyright 2024 Roy T. Hashimoto. All Rights Reserved. +import * as VFS from './sqlite-constants.js'; +export * from './sqlite-constants.js'; + +const DEFAULT_SECTOR_SIZE = 512; + +// Base class for a VFS. +export class Base { + name; + mxPathname = 64; + _module; + + /** + * @param {string} name + * @param {object} module + */ + constructor(name, module) { + this.name = name; + this._module = module; + } + + /** + * @returns {void|Promise} + */ + close() { + } + + /** + * @returns {boolean|Promise} + */ + isReady() { + return true; + } + + /** + * Overload in subclasses to indicate which methods are asynchronous. + * @param {string} methodName + * @returns {boolean} + */ + hasAsyncMethod(methodName) { + return false; + } + + /** + * @param {number} pVfs + * @param {number} zName + * @param {number} pFile + * @param {number} flags + * @param {number} pOutFlags + * @returns {number|Promise} + */ + xOpen(pVfs, zName, pFile, flags, pOutFlags) { + return VFS.SQLITE_CANTOPEN; + } + + /** + * @param {number} pVfs + * @param {number} zName + * @param {number} syncDir + * @returns {number|Promise} + */ + xDelete(pVfs, zName, syncDir) { + return VFS.SQLITE_OK; + } + + /** + * @param {number} pVfs + * @param {number} zName + * @param {number} flags + * @param {number} pResOut + * @returns {number|Promise} + */ + xAccess(pVfs, zName, flags, pResOut) { + return VFS.SQLITE_OK; + } + + /** + * @param {number} pVfs + * @param {number} zName + * @param {number} nOut + * @param {number} zOut + * @returns {number|Promise} + */ + xFullPathname(pVfs, zName, nOut, zOut) { + return VFS.SQLITE_OK; + } + + /** + * @param {number} pVfs + * @param {number} nBuf + * @param {number} zBuf + * @returns {number|Promise} + */ + xGetLastError(pVfs, nBuf, zBuf) { + return VFS.SQLITE_OK; + } + + /** + * @param {number} pFile + * @returns {number|Promise} + */ + xClose(pFile) { + return VFS.SQLITE_OK; + } + + /** + * @param {number} pFile + * @param {number} pData + * @param {number} iAmt + * @param {number} iOffsetLo + * @param {number} iOffsetHi + * @returns {number|Promise} + */ + xRead(pFile, pData, iAmt, iOffsetLo, iOffsetHi) { + return VFS.SQLITE_OK; + } + + /** + * @param {number} pFile + * @param {number} pData + * @param {number} iAmt + * @param {number} iOffsetLo + * @param {number} iOffsetHi + * @returns {number|Promise} + */ + xWrite(pFile, pData, iAmt, iOffsetLo, iOffsetHi) { + return VFS.SQLITE_OK; + } + + /** + * @param {number} pFile + * @param {number} sizeLo + * @param {number} sizeHi + * @returns {number|Promise} + */ + xTruncate(pFile, sizeLo, sizeHi) { + return VFS.SQLITE_OK; + } + + /** + * @param {number} pFile + * @param {number} flags + * @returns {number|Promise} + */ + xSync(pFile, flags) { + return VFS.SQLITE_OK; + } + + /** + * + * @param {number} pFile + * @param {number} pSize + * @returns {number|Promise} + */ + xFileSize(pFile, pSize) { + return VFS.SQLITE_OK; + } + + /** + * @param {number} pFile + * @param {number} lockType + * @returns {number|Promise} + */ + xLock(pFile, lockType) { + return VFS.SQLITE_OK; + } + + /** + * @param {number} pFile + * @param {number} lockType + * @returns {number|Promise} + */ + xUnlock(pFile, lockType) { + return VFS.SQLITE_OK; + } + + /** + * @param {number} pFile + * @param {number} pResOut + * @returns {number|Promise} + */ + xCheckReservedLock(pFile, pResOut) { + return VFS.SQLITE_OK; + } + + /** + * @param {number} pFile + * @param {number} op + * @param {number} pArg + * @returns {number|Promise} + */ + xFileControl(pFile, op, pArg) { + return VFS.SQLITE_NOTFOUND; + } + + /** + * @param {number} pFile + * @returns {number|Promise} + */ + xSectorSize(pFile) { + return DEFAULT_SECTOR_SIZE; + } + + /** + * @param {number} pFile + * @returns {number|Promise} + */ + xDeviceCharacteristics(pFile) { + return 0; + } +} + +export const FILE_TYPE_MASK = [ + VFS.SQLITE_OPEN_MAIN_DB, + VFS.SQLITE_OPEN_MAIN_JOURNAL, + VFS.SQLITE_OPEN_TEMP_DB, + VFS.SQLITE_OPEN_TEMP_JOURNAL, + VFS.SQLITE_OPEN_TRANSIENT_DB, + VFS.SQLITE_OPEN_SUBJOURNAL, + VFS.SQLITE_OPEN_SUPER_JOURNAL, + VFS.SQLITE_OPEN_WAL +].reduce((mask, element) => mask | element); \ No newline at end of file diff --git a/packages/replicate/assets/wa-sqlite/src/WebLocksMixin.js b/packages/replicate/assets/wa-sqlite/src/WebLocksMixin.js new file mode 100644 index 0000000..e23c841 --- /dev/null +++ b/packages/replicate/assets/wa-sqlite/src/WebLocksMixin.js @@ -0,0 +1,412 @@ +import * as VFS from './VFS.js'; + +// Options for navigator.locks.request(). +/** @type {LockOptions} */ const SHARED = { mode: 'shared' }; +/** @type {LockOptions} */ const POLL_SHARED = { ifAvailable: true, mode: 'shared' }; +/** @type {LockOptions} */ const POLL_EXCLUSIVE = { ifAvailable: true, mode: 'exclusive' }; + +const POLICIES = ['exclusive', 'shared', 'shared+hint']; + +/** + * @typedef LockState + * @property {string} baseName + * @property {number} type + * @property {boolean} writeHint + * + * These properties are functions that release a specific lock. + * @property {(() => void)?} [gate] + * @property {(() => void)?} [access] + * @property {(() => void)?} [reserved] + * @property {(() => void)?} [hint] + */ + +/** + * Mix-in for FacadeVFS that implements the SQLite VFS locking protocol. + * @param {*} superclass FacadeVFS (or subclass) + * @returns + */ +export const WebLocksMixin = superclass => class extends superclass { + #options = { + lockPolicy: 'exclusive', + lockTimeout: Infinity + }; + + /** @type {Map} */ #mapIdToState = new Map(); + + constructor(name, module, options) { + super(name, module, options); + Object.assign(this.#options, options); + if (POLICIES.indexOf(this.#options.lockPolicy) === -1) { + throw new Error(`WebLocksMixin: invalid lock mode: ${options.lockPolicy}`); + } + } + + /** + * @param {number} fileId + * @param {number} lockType + * @returns {Promise} + */ + async jLock(fileId, lockType) { + try { + // Create state on first lock. + if (!this.#mapIdToState.has(fileId)) { + const name = this.getFilename(fileId); + const state = { + baseName: name, + type: VFS.SQLITE_LOCK_NONE, + writeHint: false + }; + this.#mapIdToState.set(fileId, state); + } + + const lockState = this.#mapIdToState.get(fileId); + if (lockType <= lockState.type) return VFS.SQLITE_OK; + + switch (this.#options.lockPolicy) { + case 'exclusive': + return await this.#lockExclusive(lockState, lockType); + case 'shared': + case 'shared+hint': + return await this.#lockShared(lockState, lockType); + } + } catch (e) { + console.error('WebLocksMixin: lock error', e); + return VFS.SQLITE_IOERR_LOCK; + } + } + + /** + * @param {number} fileId + * @param {number} lockType + * @returns {Promise} + */ + async jUnlock(fileId, lockType) { + try { + const lockState = this.#mapIdToState.get(fileId); + if (lockType >= lockState.type) return VFS.SQLITE_OK; + + switch (this.#options.lockPolicy) { + case 'exclusive': + return await this.#unlockExclusive(lockState, lockType); + case 'shared': + case 'shared+hint': + return await this.#unlockShared(lockState, lockType); + } + } catch (e) { + console.error('WebLocksMixin: unlock error', e); + return VFS.SQLITE_IOERR_UNLOCK; + } + } + + /** + * @param {number} fileId + * @param {DataView} pResOut + * @returns {Promise} + */ + async jCheckReservedLock(fileId, pResOut) { + try { + const lockState = this.#mapIdToState.get(fileId); + switch (this.#options.lockPolicy) { + case 'exclusive': + return this.#checkReservedExclusive(lockState, pResOut); + case 'shared': + case 'shared+hint': + return await this.#checkReservedShared(lockState, pResOut); + } + } catch (e) { + console.error('WebLocksMixin: check reserved lock error', e); + return VFS.SQLITE_IOERR_CHECKRESERVEDLOCK; + } + pResOut.setInt32(0, 0, true); + return VFS.SQLITE_OK; + } + + /** + * @param {number} pFile + * @param {number} op + * @param {DataView} pArg + * @returns {number|Promise} + */ + jFileControl(pFile, op, pArg) { + const lockState = this.#mapIdToState.get(pFile) ?? + (() => { + // Call jLock() to create the lock state. + this.jLock(pFile, VFS.SQLITE_LOCK_NONE); + return this.#mapIdToState.get(pFile); + })(); + if (op === WebLocksMixin.WRITE_HINT_OP_CODE && + this.#options.lockPolicy === 'shared+hint'){ + lockState.writeHint = true; + } + return VFS.SQLITE_NOTFOUND; + } + + /** + * @param {LockState} lockState + * @param {number} lockType + * @returns + */ + async #lockExclusive(lockState, lockType) { + if (!lockState.access) { + if (!await this.#acquire(lockState, 'access')) { + return VFS.SQLITE_BUSY; + } + console.assert(!!lockState.access); + } + lockState.type = lockType; + return VFS.SQLITE_OK; + } + + /** + * @param {LockState} lockState + * @param {number} lockType + * @returns {number} + */ + #unlockExclusive(lockState, lockType) { + if (lockType === VFS.SQLITE_LOCK_NONE) { + lockState.access?.(); + console.assert(!lockState.access); + } + lockState.type = lockType; + return VFS.SQLITE_OK; + } + + /** + * @param {LockState} lockState + * @param {DataView} pResOut + * @returns {number} + */ + #checkReservedExclusive(lockState, pResOut) { + pResOut.setInt32(0, 0, true); + return VFS.SQLITE_OK; + } + + /** + * @param {LockState} lockState + * @param {number} lockType + * @returns + */ + async #lockShared(lockState, lockType) { + switch (lockState.type) { + case VFS.SQLITE_LOCK_NONE: + switch (lockType) { + case VFS.SQLITE_LOCK_SHARED: + if (lockState.writeHint) { + // xFileControl() has hinted that this transaction will + // write. Acquire the hint lock, which is required to reach + // the RESERVED state. + if (!await this.#acquire(lockState, 'hint')) { + // Timeout before lock acquired. + return VFS.SQLITE_BUSY; + } + } + + // Must have the gate lock to request the access lock. + if (!await this.#acquire(lockState, 'gate', SHARED)) { + // Timeout before lock acquired. + lockState.hint?.(); + return VFS.SQLITE_BUSY; + } + await this.#acquire(lockState, 'access', SHARED); + lockState.gate(); + console.assert(!lockState.gate); + console.assert(!!lockState.access); + console.assert(!lockState.reserved); + break; + + default: + throw new Error('unsupported lock transition'); + } + break; + case VFS.SQLITE_LOCK_SHARED: + switch (lockType) { + case VFS.SQLITE_LOCK_RESERVED: + if (this.#options.lockPolicy === 'shared+hint') { + // Ideally we should already have the hint lock, but if not + // poll for it here. + if (!lockState.hint && + !await this.#acquire(lockState, 'hint', POLL_EXCLUSIVE)) { + // Another connection has the hint lock so this is a + // deadlock. This connection must retry. + return VFS.SQLITE_BUSY; + } + } + + // Poll for the reserved lock. This should always succeed + // if all clients use the 'shared+hint' policy. + if (!await this.#acquire(lockState, 'reserved', POLL_EXCLUSIVE)) { + // This is a deadlock. The connection holding the reserved + // lock blocks us, and it can't acquire an exclusive access + // lock because we hold a shared access lock. This connection + // must retry. + lockState.hint?.(); + return VFS.SQLITE_BUSY; + } + lockState.access(); + console.assert(!lockState.gate); + console.assert(!lockState.access); + console.assert(!!lockState.reserved); + break; + + case VFS.SQLITE_LOCK_EXCLUSIVE: + // Jumping directly from SHARED to EXCLUSIVE without passing + // through RESERVED is only done with a hot journal. + if (!await this.#acquire(lockState, 'gate')) { + // Timeout before lock acquired. + return VFS.SQLITE_BUSY; + } + lockState.access(); + if (!await this.#acquire(lockState, 'access')) { + // Timeout before lock acquired. + lockState.gate(); + return VFS.SQLITE_BUSY; + } + console.assert(!!lockState.gate); + console.assert(!!lockState.access); + console.assert(!lockState.reserved); + break; + + default: + throw new Error('unsupported lock transition'); + } + break; + case VFS.SQLITE_LOCK_RESERVED: + switch (lockType) { + case VFS.SQLITE_LOCK_EXCLUSIVE: + // Prevent other connections from entering the SHARED state. + if (!await this.#acquire(lockState, 'gate')) { + // Timeout before lock acquired. + return VFS.SQLITE_BUSY; + } + + // Block until all other connections exit the SHARED state. + if (!await this.#acquire(lockState, 'access')) { + // Timeout before lock acquired. + lockState.gate(); + return VFS.SQLITE_BUSY; + } + console.assert(!!lockState.gate); + console.assert(!!lockState.access); + console.assert(!!lockState.reserved); + break; + + default: + throw new Error('unsupported lock transition'); + } + break; + } + lockState.type = lockType; + return VFS.SQLITE_OK; + } + + /** + * @param {LockState} lockState + * @param {number} lockType + * @returns + */ + async #unlockShared(lockState, lockType) { + // lockType can only be SQLITE_LOCK_SHARED or SQLITE_LOCK_NONE. + if (lockType === VFS.SQLITE_LOCK_NONE) { + lockState.access?.(); + lockState.gate?.(); + lockState.reserved?.(); + lockState.hint?.(); + lockState.writeHint = false; + console.assert(!lockState.access); + console.assert(!lockState.gate); + console.assert(!lockState.reserved); + console.assert(!lockState.hint); + } else { // lockType === VFS.SQLITE_LOCK_SHARED + switch (lockState.type) { + case VFS.SQLITE_LOCK_EXCLUSIVE: + // Release our exclusive access lock and reacquire it with a + // shared lock. This should always succeed because we hold + // the gate lock. + lockState.access(); + await this.#acquire(lockState, 'access', SHARED); + + // Release our gate and reserved locks. We might not have a + // reserved lock if we were handling a hot journal. + lockState.gate(); + lockState.reserved?.(); + lockState.hint?.(); + console.assert(!!lockState.access); + console.assert(!lockState.gate); + console.assert(!lockState.reserved); + break; + + case VFS.SQLITE_LOCK_RESERVED: + // This transition is rare, probably only on an I/O error + // while writing to a journal file. + await this.#acquire(lockState, 'access', SHARED); + lockState.reserved(); + lockState.hint?.(); + console.assert(!!lockState.access); + console.assert(!lockState.gate); + console.assert(!lockState.reserved); + break; + } + } + lockState.type = lockType; + return VFS.SQLITE_OK; + } + + /** + * @param {LockState} lockState + * @param {DataView} pResOut + * @returns {Promise} + */ + async #checkReservedShared(lockState, pResOut) { + if (await this.#acquire(lockState, 'reserved', POLL_SHARED)) { + // We were able to get the lock so it was not reserved. + lockState.reserved(); + pResOut.setInt32(0, 0, true); + } else { + pResOut.setInt32(0, 1, true); + } + return VFS.SQLITE_OK; + } + + /** + * @param {LockState} lockState + * @param {'gate'|'access'|'reserved'|'hint'} name + * @param {LockOptions} options + * @returns {Promise} + */ + #acquire(lockState, name, options = {}) { + console.assert(!lockState[name]); + return new Promise(resolve => { + if (!options.ifAvailable && this.#options.lockTimeout < Infinity) { + // Add a timeout to the lock request. + const controller = new AbortController(); + options = Object.assign({}, options, { signal: controller.signal }); + setTimeout(() => { + controller.abort(); + resolve?.(false); + }, this.#options.lockTimeout); + } + + const lockName = `lock##${lockState.baseName}##${name}`; + navigator.locks.request(lockName, options, lock => { + if (lock) { + return new Promise(release => { + lockState[name] = () => { + release(); + lockState[name] = null; + }; + resolve(true); + resolve = null; + }); + } else { + lockState[name] = null; + resolve(false); + resolve = null; + } + }).catch(e => { + if (e.name !== 'AbortError') throw e; + }); + }); + } +} + +WebLocksMixin.WRITE_HINT_OP_CODE = -9999; \ No newline at end of file diff --git a/packages/replicate/assets/wa-sqlite/src/examples/IDBBatchAtomicVFS.js b/packages/replicate/assets/wa-sqlite/src/examples/IDBBatchAtomicVFS.js new file mode 100644 index 0000000..7e921d2 --- /dev/null +++ b/packages/replicate/assets/wa-sqlite/src/examples/IDBBatchAtomicVFS.js @@ -0,0 +1,820 @@ +// Copyright 2024 Roy T. Hashimoto. All Rights Reserved. +import { FacadeVFS } from '../FacadeVFS.js'; +import * as VFS from '../VFS.js'; +import { WebLocksMixin } from '../WebLocksMixin.js'; + +/** + * @typedef Metadata + * @property {string} name + * @property {number} fileSize + * @property {number} version + * @property {number} [pendingVersion] + */ + +class File { + /** @type {string} */ path; + /** @type {number} */ flags; + + /** @type {Metadata} */ metadata; + /** @type {number} */ fileSize = 0; + + /** @type {boolean} */ needsMetadataSync = false; + /** @type {Metadata} */ rollback = null; + /** @type {Set} */ changedPages = new Set(); + + /** @type {string} */ synchronous = 'full'; + /** @type {IDBTransactionOptions} */ txOptions = { durability: 'strict' }; + + constructor(path, flags, metadata) { + this.path = path; + this.flags = flags; + this.metadata = metadata; + } +} + +export class IDBBatchAtomicVFS extends WebLocksMixin(FacadeVFS) { + /** @type {Map} */ mapIdToFile = new Map(); + lastError = null; + + log = null; // console.log + + /** @type {Promise} */ #isReady; + /** @type {IDBContext} */ #idb; + + static async create(name, module, options) { + const vfs = new IDBBatchAtomicVFS(name, module, options); + await vfs.isReady(); + return vfs; + } + + constructor(name, module, options = {}) { + super(name, module, options); + this.#isReady = this.#initialize(options.idbName ?? name); + } + + async #initialize(name) { + this.#idb = await IDBContext.create(name); + } + + close() { + this.#idb.close(); + } + + async isReady() { + await super.isReady(); + await this.#isReady; + } + + getFilename(fileId) { + const pathname = this.mapIdToFile.get(fileId).path; + return `IDB(${this.name}):${pathname}` + } + + /** + * @param {string?} zName + * @param {number} fileId + * @param {number} flags + * @param {DataView} pOutFlags + * @returns {Promise} + */ + async jOpen(zName, fileId, flags, pOutFlags) { + try { + const url = new URL(zName || Math.random().toString(36).slice(2), 'file://'); + const path = url.pathname; + + let meta = await this.#idb.q(({ metadata }) => metadata.get(path)); + if (!meta && (flags & VFS.SQLITE_OPEN_CREATE)) { + meta = { + name: path, + fileSize: 0, + version: 0 + }; + await this.#idb.q(({ metadata }) => metadata.put(meta), 'rw'); + } + + if (!meta) { + throw new Error(`File ${path} not found`); + } + + const file = new File(path, flags, meta); + this.mapIdToFile.set(fileId, file); + pOutFlags.setInt32(0, flags, true); + return VFS.SQLITE_OK; + } catch (e) { + this.lastError = e; + return VFS.SQLITE_CANTOPEN; + } + } + + /** + * @param {string} zName + * @param {number} syncDir + * @returns {Promise} + */ + async jDelete(zName, syncDir) { + try { + const url = new URL(zName, 'file://'); + const path = url.pathname; + + this.#idb.q(({ metadata, blocks }) => { + const range = IDBKeyRange.bound([path, -Infinity], [path, Infinity]); + blocks.delete(range); + metadata.delete(path); + }, 'rw'); + + if (syncDir) { + await this.#idb.sync(false); + } + return VFS.SQLITE_OK; + } catch (e) { + this.lastError = e; + return VFS.SQLITE_IOERR_DELETE; + } + } + + /** + * @param {string} zName + * @param {number} flags + * @param {DataView} pResOut + * @returns {Promise} + */ + async jAccess(zName, flags, pResOut) { + try { + const url = new URL(zName, 'file://'); + const path = url.pathname; + + const meta = await this.#idb.q(({ metadata }) => metadata.get(path)); + pResOut.setInt32(0, meta ? 1 : 0, true); + return VFS.SQLITE_OK; + } catch (e) { + this.lastError = e; + return VFS.SQLITE_IOERR_ACCESS; + } + } + + /** + * @param {number} fileId + * @returns {Promise} + */ + async jClose(fileId) { + try { + const file = this.mapIdToFile.get(fileId); + this.mapIdToFile.delete(fileId); + + if (file.flags & VFS.SQLITE_OPEN_DELETEONCLOSE) { + await this.#idb.q(({ metadata, blocks }) => { + metadata.delete(file.path); + blocks.delete(IDBKeyRange.bound([file.path, 0], [file.path, Infinity])); + }, 'rw'); + } + + if (file.needsMetadataSync) { + this.#idb.q(({ metadata }) => metadata.put(file.metadata), 'rw'); + } + await this.#idb.sync(file.synchronous === 'full'); + return VFS.SQLITE_OK; + } catch (e) { + this.lastError = e; + return VFS.SQLITE_IOERR_CLOSE; + } + } + + /** + * @param {number} fileId + * @param {Uint8Array} pData + * @param {number} iOffset + * @returns {Promise} + */ + async jRead(fileId, pData, iOffset) { + try { + const file = this.mapIdToFile.get(fileId); + + let pDataOffset = 0; + while (pDataOffset < pData.byteLength) { + // Fetch the IndexedDB block for this file location. + const fileOffset = iOffset + pDataOffset; + const block = await this.#idb.q(({ blocks }) => { + const range = IDBKeyRange.bound([file.path, -fileOffset], [file.path, Infinity]); + return blocks.get(range); + }); + + if (!block || block.data.byteLength - block.offset <= fileOffset) { + pData.fill(0, pDataOffset); + return VFS.SQLITE_IOERR_SHORT_READ; + } + + // Copy block data. + const dst = pData.subarray(pDataOffset); + const srcOffset = fileOffset + block.offset; + const nBytesToCopy = Math.min( + Math.max(block.data.byteLength - srcOffset, 0), + dst.byteLength); + dst.set(block.data.subarray(srcOffset, srcOffset + nBytesToCopy)); + pDataOffset += nBytesToCopy; + } + return VFS.SQLITE_OK; + } catch (e) { + this.lastError = e; + return VFS.SQLITE_IOERR_READ; + } + } + + /** + * @param {number} fileId + * @param {Uint8Array} pData + * @param {number} iOffset + * @returns {number} + */ + jWrite(fileId, pData, iOffset) { + try { + const file = this.mapIdToFile.get(fileId); + if (file.flags & VFS.SQLITE_OPEN_MAIN_DB) { + if (!file.rollback) { + // Begin a new write transaction. + // Add pendingVersion to the metadata in IndexedDB. If we crash + // during the transaction, this lets subsequent connections + // know to remove blocks from the failed transaction. + const pending = Object.assign( + { pendingVersion: file.metadata.version - 1 }, + file.metadata); + this.#idb.q(({ metadata }) => metadata.put(pending), 'rw', file.txOptions); + + file.rollback = Object.assign({}, file.metadata); + file.metadata.version--; + } + } + + if (file.flags & VFS.SQLITE_OPEN_MAIN_DB) { + file.changedPages.add(iOffset); + } + + const data = pData.slice(); + const version = file.metadata.version; + const isOverwrite = iOffset < file.metadata.fileSize; + if (!isOverwrite || + file.flags & VFS.SQLITE_OPEN_MAIN_DB || + file.flags & VFS.SQLITE_OPEN_TEMP_DB) { + const block = { + path: file.path, + offset: -iOffset, + version: version, + data: pData.slice() + }; + this.#idb.q(({ blocks }) => { + blocks.put(block); + file.changedPages.add(iOffset); + }, 'rw', file.txOptions); + } else { + this.#idb.q(async ({ blocks }) => { + // Read the existing block. + const range = IDBKeyRange.bound( + [file.path, -iOffset], + [file.path, Infinity]); + const block = await blocks.get(range); + + // Modify the block data. + // @ts-ignore + block.data.subarray(iOffset + block.offset).set(data); + + // Write back. + blocks.put(block); + }, 'rw', file.txOptions); + + } + + if (file.metadata.fileSize < iOffset + pData.length) { + file.metadata.fileSize = iOffset + pData.length; + file.needsMetadataSync = true; + } + return VFS.SQLITE_OK; + } catch (e) { + this.lastError = e; + return VFS.SQLITE_IOERR_WRITE; + } + } + + /** + * @param {number} fileId + * @param {number} iSize + * @returns {number} + */ + jTruncate(fileId, iSize) { + try { + const file = this.mapIdToFile.get(fileId); + if (iSize < file.metadata.fileSize) { + this.#idb.q(({ blocks }) => { + const range = IDBKeyRange.bound( + [file.path, -Infinity], + [file.path, -iSize, Infinity]); + blocks.delete(range); + }, 'rw', file.txOptions); + file.metadata.fileSize = iSize; + file.needsMetadataSync = true; + } + return VFS.SQLITE_OK; + } catch (e) { + this.lastError = e; + return VFS.SQLITE_IOERR_TRUNCATE; + } + } + + /** + * @param {number} fileId + * @param {number} flags + * @returns {Promise} + */ + async jSync(fileId, flags) { + try { + const file = this.mapIdToFile.get(fileId); + if (file.needsMetadataSync) { + this.#idb.q(({ metadata }) => metadata.put(file.metadata), 'rw', file.txOptions); + file.needsMetadataSync = false; + } + + if (file.flags & VFS.SQLITE_OPEN_MAIN_DB) { + // Sync is only needed here for durability. Visibility for other + // connections is ensured in jUnlock(). + if (file.synchronous === 'full') { + await this.#idb.sync(true); + } + } else { + await this.#idb.sync(file.synchronous === 'full'); + } + return VFS.SQLITE_OK; + } catch (e) { + this.lastError = e; + return VFS.SQLITE_IOERR_FSYNC; + } + } + + /** + * @param {number} fileId + * @param {DataView} pSize64 + * @returns {number} + */ + jFileSize(fileId, pSize64) { + try { + const file = this.mapIdToFile.get(fileId); + pSize64.setBigInt64(0, BigInt(file.metadata.fileSize), true); + return VFS.SQLITE_OK; + } catch (e) { + this.lastError = e; + return VFS.SQLITE_IOERR_FSTAT; + } + } + + /** + * @param {number} fileId + * @param {number} lockType + * @returns {Promise} + */ + async jLock(fileId, lockType) { + // Call the actual lock implementation. + const file = this.mapIdToFile.get(fileId); + const result = await super.jLock(fileId, lockType); + + if (lockType === VFS.SQLITE_LOCK_SHARED) { + // Update metadata. + file.metadata = await this.#idb.q(async ({ metadata, blocks }) => { + // @ts-ignore + /** @type {Metadata} */ const m = await metadata.get(file.path); + if (m.pendingVersion) { + console.warn(`removing failed transaction ${m.pendingVersion}`); + await new Promise((resolve, reject) => { + const range = IDBKeyRange.bound([m.name, -Infinity], [m.name, Infinity]); + const request = blocks.openCursor(range); + request.onsuccess = () => { + const cursor = request.result; + if (cursor) { + const block = cursor.value; + if (block.version < m.version) { + cursor.delete(); + } + cursor.continue(); + } else { + resolve(); + } + }; + request.onerror = () => reject(request.error); + }) + + delete m.pendingVersion; + metadata.put(m); + } + return m; + }, 'rw', file.txOptions); + } + return result; + } + + /** + * @param {number} fileId + * @param {number} lockType + * @returns {Promise} + */ + async jUnlock(fileId, lockType) { + if (lockType === VFS.SQLITE_LOCK_NONE) { + const file = this.mapIdToFile.get(fileId); + await this.#idb.sync(file.synchronous === 'full'); + } + + // Call the actual unlock implementation. + return super.jUnlock(fileId, lockType); + } + + /** + * @param {number} fileId + * @param {number} op + * @param {DataView} pArg + * @returns {number|Promise} + */ + jFileControl(fileId, op, pArg) { + try { + const file = this.mapIdToFile.get(fileId); + switch (op) { + case VFS.SQLITE_FCNTL_PRAGMA: + const key = extractString(pArg, 4); + const value = extractString(pArg, 8); + this.log?.('xFileControl', file.path, 'PRAGMA', key, value); + const setPragmaResponse = response => { + const encoded = new TextEncoder().encode(response); + const out = this._module._sqlite3_malloc(encoded.byteLength); + const outArray = this._module.HEAPU8.subarray(out, out + encoded.byteLength); + outArray.set(encoded); + pArg.setUint32(0, out, true); + return VFS.SQLITE_ERROR; + }; + switch (key.toLowerCase()) { + case 'page_size': + if (file.flags & VFS.SQLITE_OPEN_MAIN_DB) { + // Don't allow changing the page size. + if (value && file.metadata.fileSize) { + return VFS.SQLITE_ERROR; + } + } + break; + case 'synchronous': + if (value) { + switch (value.toLowerCase()) { + case '0': + case 'off': + file.synchronous = 'off'; + file.txOptions = { durability: 'relaxed' }; + break; + case '1': + case 'normal': + file.synchronous = 'normal'; + file.txOptions = { durability: 'relaxed' }; + break; + case '2': + case '3': + case 'full': + case 'extra': + file.synchronous = 'full'; + file.txOptions = { durability: 'strict' }; + break; + } + } + break; + case 'write_hint': + return super.jFileControl(fileId, WebLocksMixin.WRITE_HINT_OP_CODE, null); + } + break; + case VFS.SQLITE_FCNTL_SYNC: + this.log?.('xFileControl', file.path, 'SYNC'); + const commitMetadata = Object.assign({}, file.metadata); + const prevFileSize = file.rollback.fileSize + this.#idb.q(({ metadata, blocks }) => { + metadata.put(commitMetadata); + + // Remove old page versions. + for (const offset of file.changedPages) { + if (offset < prevFileSize) { + const range = IDBKeyRange.bound( + [file.path, -offset, commitMetadata.version], + [file.path, -offset, Infinity], + true); + blocks.delete(range); + } + } + file.changedPages.clear(); + }, 'rw', file.txOptions); + file.needsMetadataSync = false; + file.rollback = null; + break; + case VFS.SQLITE_FCNTL_BEGIN_ATOMIC_WRITE: + // Every write transaction is atomic, so this is a no-op. + this.log?.('xFileControl', file.path, 'BEGIN_ATOMIC_WRITE'); + return VFS.SQLITE_OK; + case VFS.SQLITE_FCNTL_COMMIT_ATOMIC_WRITE: + // Every write transaction is atomic, so this is a no-op. + this.log?.('xFileControl', file.path, 'COMMIT_ATOMIC_WRITE'); + return VFS.SQLITE_OK; + case VFS.SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE: + this.log?.('xFileControl', file.path, 'ROLLBACK_ATOMIC_WRITE'); + file.metadata = file.rollback; + const rollbackMetadata = Object.assign({}, file.metadata); + this.#idb.q(({ metadata, blocks }) => { + metadata.put(rollbackMetadata); + + // Remove pages. + for (const offset of file.changedPages) { + blocks.delete([file.path, -offset, rollbackMetadata.version - 1]); + } + file.changedPages.clear(); + }, 'rw', file.txOptions); + file.needsMetadataSync = false; + file.rollback = null; + return VFS.SQLITE_OK; + } + } catch (e) { + this.lastError = e; + return VFS.SQLITE_IOERR; + } + return super.jFileControl(fileId, op, pArg); + } + + /** + * @param {number} pFile + * @returns {number|Promise} + */ + jDeviceCharacteristics(pFile) { + return 0 + | VFS.SQLITE_IOCAP_BATCH_ATOMIC + | VFS.SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN; + } + + /** + * @param {Uint8Array} zBuf + * @returns {number|Promise} + */ + jGetLastError(zBuf) { + if (this.lastError) { + console.error(this.lastError); + const outputArray = zBuf.subarray(0, zBuf.byteLength - 1); + const { written } = new TextEncoder().encodeInto(this.lastError.message, outputArray); + zBuf[written] = 0; + } + return VFS.SQLITE_OK + } +} + +function extractString(dataView, offset) { + const p = dataView.getUint32(offset, true); + if (p) { + const chars = new Uint8Array(dataView.buffer, p); + return new TextDecoder().decode(chars.subarray(0, chars.indexOf(0))); + } + return null; +} + +export class IDBContext { + /** @type {IDBDatabase} */ #database; + + /** @type {Promise} */ #chain = null; + /** @type {Promise} */ #txComplete = Promise.resolve(); + /** @type {IDBRequest?} */ #request = null; + /** @type {WeakSet} */ #txPending = new WeakSet(); + + log = null; + + static async create(name) { + const database = await new Promise((resolve, reject) => { + const request = indexedDB.open(name, 6); + request.onupgradeneeded = async event => { + const db = request.result; + if (event.oldVersion) { + console.log(`Upgrading IndexedDB from version ${event.oldVersion}`); + } + switch (event.oldVersion) { + case 0: + // Start with the original schema. + db.createObjectStore('blocks', { keyPath: ['path', 'offset', 'version']}) + .createIndex('version', ['path', 'version']); + // fall through intentionally + case 5: + const tx = request.transaction; + const blocks = tx.objectStore('blocks'); + blocks.deleteIndex('version'); + const metadata = db.createObjectStore('metadata', { keyPath: 'name' }); + + await new Promise((resolve, reject) => { + // Iterate over all the blocks. + let lastBlock = {}; + const request = tx.objectStore('blocks').openCursor(); + request.onsuccess = () => { + const cursor = request.result; + if (cursor) { + const block = cursor.value; + if (typeof block.offset !== 'number' || + (block.path === lastBlock.path && block.offset === lastBlock.offset)) { + // Remove superceded block (or the "purge" info). + cursor.delete(); + } else if (block.offset === 0) { + // Move metadata to its own store. + metadata.put({ + name: block.path, + fileSize: block.fileSize, + version: block.version + }); + + delete block.fileSize; + cursor.update(block); + } + lastBlock = block; + cursor.continue(); + } else { + resolve(); + } + }; + request.onerror = () => reject(request.error); + }); + break; + } + }; + request.onsuccess = () => resolve(request.result); + request.onerror = () => reject(request.error); + }); + return new IDBContext(database); + } + + constructor(database) { + this.#database = database; + } + + close() { + this.#database.close(); + } + + /** + * @param {(stores: Object.) => any} f + * @param {'ro'|'rw'} mode + * @returns {Promise} + */ + q(f, mode = 'ro', options = {}) { + /** @type {IDBTransactionMode} */ + const txMode = mode === 'ro' ? 'readonly' : 'readwrite'; + const txOptions = Object.assign({ + /** @type {IDBTransactionDurability} */ durability: 'default' + }, options); + + // Ensure that queries run sequentially. If any function rejects, + // or any request has an error, or the transaction does not commit, + // then no subsequent functions will run until sync() or reset(). + this.#chain = (this.#chain || Promise.resolve()) + .then(() => this.#q(f, txMode, txOptions)); + return this.#chain; + } + + /** + * @param {(stores: Object.) => any} f + * @param {IDBTransactionMode} mode + * @param {IDBTransactionOptions} options + * @returns {Promise} + */ + async #q(f, mode, options) { + /** @type {IDBTransaction} */ let tx; + if (this.#request && + this.#txPending.has(this.#request.transaction) && + this.#request.transaction.mode >= mode && + this.#request.transaction.durability === options.durability) { + // The previous request transaction is compatible and has + // not yet completed. + tx = this.#request.transaction; + + // If the previous request is pending, wait for it to complete. + // This ensures that the transaction will be active. + if (this.#request.readyState === 'pending') { + await new Promise(resolve => { + this.#request.addEventListener('success', resolve, { once: true }); + this.#request.addEventListener('error', resolve, { once: true }); + }); + } + } + + for (let i = 0; i < 2; ++i) { + if (!tx) { + // The current transaction is missing or doesn't match so + // replace it with a new one. wait for the previous + // transaction to complete so the lifetimes do not overlap. + await this.#txComplete; + + // Create the new transaction. + // @ts-ignore + tx = this.#database.transaction(this.#database.objectStoreNames, mode, options); + this.log?.('IDBTransaction open', mode); + this.#txPending.add(tx); + this.#txComplete = new Promise((resolve, reject) => { + tx.addEventListener('complete', () => { + this.log?.('IDBTransaction complete'); + this.#txPending.delete(tx); + resolve(); + }); + tx.addEventListener('abort', () => { + this.#txPending.delete(tx); + reject(new Error('transaction aborted')); + }); + }); + } + + // @ts-ignore + // Create object store proxies. + const objectStores = [...tx.objectStoreNames].map(name => { + return [name, this.proxyStoreOrIndex(tx.objectStore(name))]; + }); + + try { + // Execute the function. + return await f(Object.fromEntries(objectStores)); + } catch (e) { + // Use a new transaction if this one was inactive. This will + // happen if the last request in the transaction completed + // in a previous task but the transaction has not yet committed. + if (!i && e.name === 'TransactionInactiveError') { + this.log?.('TransactionInactiveError, retrying'); + tx = null; + continue; + } + throw e; + } + } + } + + /** + * Object store methods that return an IDBRequest, except for cursor + * creation, are wrapped to return a Promise. In addition, the + * request is used internally for chaining. + * @param {IDBObjectStore} objectStore + * @returns + */ + proxyStoreOrIndex(objectStore) { + return new Proxy(objectStore, { + get: (target, property, receiver) => { + const result = Reflect.get(target, property, receiver); + if (typeof result === 'function') { + return (...args) => { + const maybeRequest = Reflect.apply(result, target, args); + // @ts-ignore + if (maybeRequest instanceof IDBRequest && !property.endsWith('Cursor')) { + // // Debug logging. + // this.log?.(`${target.name}.${String(property)}`, args); + // maybeRequest.addEventListener('success', () => { + // this.log?.(`${target.name}.${String(property)} success`, maybeRequest.result); + // }); + // maybeRequest.addEventListener('error', () => { + // this.log?.(`${target.name}.${String(property)} error`, maybeRequest.error); + // }); + + // Save the request. + this.#request = maybeRequest; + + // Abort the transaction on error. + maybeRequest.addEventListener('error', () => { + console.error(maybeRequest.error); + maybeRequest.transaction.abort(); + }, { once: true }); + + // Return a Promise. + return wrap(maybeRequest); + } + return maybeRequest; + } + } + return result; + } + }); + } + + /** + * @param {boolean} durable + */ + async sync(durable) { + if (this.#chain) { + // This waits for all IndexedDB calls to be made. + await this.#chain; + if (durable) { + // This waits for the final transaction to commit. + await this.#txComplete; + } + this.reset(); + } + } + + reset() { + this.#chain = null; + this.#txComplete = Promise.resolve(); + this.#request = null; + } +} + +/** + * @param {IDBRequest} request + * @returns {Promise} + */ +function wrap(request) { + return new Promise((resolve, reject) => { + request.onsuccess = () => resolve(request.result); + request.onerror = () => reject(request.error); + }); +} + diff --git a/packages/replicate/assets/wa-sqlite/src/sqlite-api.js b/packages/replicate/assets/wa-sqlite/src/sqlite-api.js new file mode 100644 index 0000000..37cf8d0 --- /dev/null +++ b/packages/replicate/assets/wa-sqlite/src/sqlite-api.js @@ -0,0 +1,870 @@ +// Copyright 2021 Roy T. Hashimoto. All Rights Reserved. + +import * as SQLite from './sqlite-constants.js'; +export * from './sqlite-constants.js'; + +const MAX_INT64 = 0x7fffffffffffffffn; +const MIN_INT64 = -0x8000000000000000n; + +const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor; + +export class SQLiteError extends Error { + constructor(message, code) { + super(message); + this.code = code; + } +} + +const async = true; + +/** + * Builds a Javascript API from the Emscripten module. This API is still + * low-level and closely corresponds to the C API exported by the module, + * but differs in some specifics like throwing exceptions on errors. + * @param {*} Module SQLite Emscripten module + * @returns {SQLiteAPI} + */ +export function Factory(Module) { + /** @type {SQLiteAPI} */ const sqlite3 = {}; + + Module.retryOps = []; + const sqliteFreeAddress = Module._getSqliteFree(); + + // Allocate some space for 32-bit returned values. + const tmp = Module._malloc(8); + const tmpPtr = [tmp, tmp + 4]; + + // Convert a JS string to a C string. sqlite3_malloc is used to allocate + // memory (use sqlite3_free to deallocate). + function createUTF8(s) { + if (typeof s !== 'string') return 0; + const utf8 = new TextEncoder().encode(s); + const zts = Module._sqlite3_malloc(utf8.byteLength + 1); + Module.HEAPU8.set(utf8, zts); + Module.HEAPU8[zts + utf8.byteLength] = 0; + return zts; + } + + /** + * Concatenate 32-bit numbers into a 64-bit (signed) BigInt. + * @param {number} lo32 + * @param {number} hi32 + * @returns {bigint} + */ + function cvt32x2ToBigInt(lo32, hi32) { + return (BigInt(hi32) << 32n) | (BigInt(lo32) & 0xffffffffn); + } + + /** + * Concatenate 32-bit numbers and return as number or BigInt, depending + * on the value. + * @param {number} lo32 + * @param {number} hi32 + * @returns {number|bigint} + */ + const cvt32x2AsSafe = (function() { + const hiMax = BigInt(Number.MAX_SAFE_INTEGER) >> 32n; + const hiMin = BigInt(Number.MIN_SAFE_INTEGER) >> 32n; + + return function(lo32, hi32) { + if (hi32 > hiMax || hi32 < hiMin) { + // Can't be expressed as a Number so use BigInt. + return cvt32x2ToBigInt(lo32, hi32); + } else { + // Combine the upper and lower 32-bit numbers. The complication is + // that lo32 is a signed integer which makes manipulating its bits + // a little tricky - the sign bit gets handled separately. + return (hi32 * 0x100000000) + (lo32 & 0x7fffffff) - (lo32 & 0x80000000); + } + } + })(); + + const databases = new Set(); + function verifyDatabase(db) { + if (!databases.has(db)) { + throw new SQLiteError('not a database', SQLite.SQLITE_MISUSE); + } + } + + const mapStmtToDB = new Map(); + function verifyStatement(stmt) { + if (!mapStmtToDB.has(stmt)) { + throw new SQLiteError('not a statement', SQLite.SQLITE_MISUSE); + } + } + + sqlite3.bind_collection = function(stmt, bindings) { + verifyStatement(stmt); + const isArray = Array.isArray(bindings); + const nBindings = sqlite3.bind_parameter_count(stmt); + for (let i = 1; i <= nBindings; ++i) { + const key = isArray ? i - 1 : sqlite3.bind_parameter_name(stmt, i); + const value = bindings[key]; + if (value !== undefined) { + sqlite3.bind(stmt, i, value); + } + } + return SQLite.SQLITE_OK; + }; + + sqlite3.bind = function(stmt, i, value) { + verifyStatement(stmt); + switch (typeof value) { + case 'number': + if (value === (value | 0)) { + return sqlite3.bind_int(stmt, i, value); + } else { + return sqlite3.bind_double(stmt, i, value); + } + case 'string': + return sqlite3.bind_text(stmt, i, value); + default: + if (value instanceof Uint8Array || Array.isArray(value)) { + return sqlite3.bind_blob(stmt, i, value); + } else if (value === null) { + return sqlite3.bind_null(stmt, i); + } else if (typeof value === 'bigint') { + return sqlite3.bind_int64(stmt, i, value); + } else if (value === undefined) { + // Existing binding (or NULL) will be used. + return SQLite.SQLITE_NOTICE; + } else { + console.warn('unknown binding converted to null', value); + return sqlite3.bind_null(stmt, i); + } + } + }; + + sqlite3.bind_blob = (function() { + const fname = 'sqlite3_bind_blob'; + const f = Module.cwrap(fname, ...decl('nnnnn:n')); + return function(stmt, i, value) { + verifyStatement(stmt); + // @ts-ignore + const byteLength = value.byteLength ?? value.length; + const ptr = Module._sqlite3_malloc(byteLength); + Module.HEAPU8.subarray(ptr).set(value); + const result = f(stmt, i, ptr, byteLength, sqliteFreeAddress); + return check(fname, result, mapStmtToDB.get(stmt)); + }; + })(); + + sqlite3.bind_parameter_count = (function() { + const fname = 'sqlite3_bind_parameter_count'; + const f = Module.cwrap(fname, ...decl('n:n')); + return function(stmt) { + verifyStatement(stmt); + const result = f(stmt); + return result; + }; + })(); + + sqlite3.bind_double = (function() { + const fname = 'sqlite3_bind_double'; + const f = Module.cwrap(fname, ...decl('nnn:n')); + return function(stmt, i, value) { + verifyStatement(stmt); + const result = f(stmt, i, value); + return check(fname, result, mapStmtToDB.get(stmt)); + }; + })(); + + sqlite3.bind_int = (function() { + const fname = 'sqlite3_bind_int'; + const f = Module.cwrap(fname, ...decl('nnn:n')); + return function(stmt, i, value) { + verifyStatement(stmt); + if (value > 0x7fffffff || value < -0x80000000) return SQLite.SQLITE_RANGE; + + const result = f(stmt, i, value); + return check(fname, result, mapStmtToDB.get(stmt)); + }; + })(); + + sqlite3.bind_int64 = (function() { + const fname = 'sqlite3_bind_int64'; + const f = Module.cwrap(fname, ...decl('nnnn:n')); + return function(stmt, i, value) { + verifyStatement(stmt); + if (value > MAX_INT64 || value < MIN_INT64) return SQLite.SQLITE_RANGE; + + const lo32 = value & 0xffffffffn; + const hi32 = value >> 32n; + const result = f(stmt, i, Number(lo32), Number(hi32)); + return check(fname, result, mapStmtToDB.get(stmt)); + }; + })(); + + sqlite3.bind_null = (function() { + const fname = 'sqlite3_bind_null'; + const f = Module.cwrap(fname, ...decl('nn:n')); + return function(stmt, i) { + verifyStatement(stmt); + const result = f(stmt, i); + return check(fname, result, mapStmtToDB.get(stmt)); + }; + })(); + + sqlite3.bind_parameter_name = (function() { + const fname = 'sqlite3_bind_parameter_name'; + const f = Module.cwrap(fname, ...decl('n:s')); + return function(stmt, i) { + verifyStatement(stmt); + const result = f(stmt, i); + return result; + }; + })(); + + sqlite3.bind_text = (function() { + const fname = 'sqlite3_bind_text'; + const f = Module.cwrap(fname, ...decl('nnnnn:n')); + return function(stmt, i, value) { + verifyStatement(stmt); + const ptr = createUTF8(value); + const result = f(stmt, i, ptr, -1, sqliteFreeAddress); + return check(fname, result, mapStmtToDB.get(stmt)); + }; + })(); + + sqlite3.changes = (function() { + const fname = 'sqlite3_changes'; + const f = Module.cwrap(fname, ...decl('n:n')); + return function(db) { + verifyDatabase(db); + const result = f(db); + return result; + }; + })(); + + sqlite3.close = (function() { + const fname = 'sqlite3_close'; + const f = Module.cwrap(fname, ...decl('n:n'), { async }); + return async function(db) { + verifyDatabase(db); + const result = await f(db); + databases.delete(db); + return check(fname, result, db); + }; + })(); + + sqlite3.column = function(stmt, iCol) { + verifyStatement(stmt); + const type = sqlite3.column_type(stmt, iCol); + switch (type) { + case SQLite.SQLITE_BLOB: + return sqlite3.column_blob(stmt, iCol); + case SQLite.SQLITE_FLOAT: + return sqlite3.column_double(stmt, iCol); + case SQLite.SQLITE_INTEGER: + const lo32 = sqlite3.column_int(stmt, iCol); + const hi32 = Module.getTempRet0(); + return cvt32x2AsSafe(lo32, hi32); + case SQLite.SQLITE_NULL: + return null; + case SQLite.SQLITE_TEXT: + return sqlite3.column_text(stmt, iCol); + default: + throw new SQLiteError('unknown type', type); + } + }; + + sqlite3.column_blob = (function() { + const fname = 'sqlite3_column_blob'; + const f = Module.cwrap(fname, ...decl('nn:n')); + return function(stmt, iCol) { + verifyStatement(stmt); + const nBytes = sqlite3.column_bytes(stmt, iCol); + const address = f(stmt, iCol); + const result = Module.HEAPU8.subarray(address, address + nBytes); + return result; + }; + })(); + + sqlite3.column_bytes = (function() { + const fname = 'sqlite3_column_bytes'; + const f = Module.cwrap(fname, ...decl('nn:n')); + return function(stmt, iCol) { + verifyStatement(stmt); + const result = f(stmt, iCol); + return result; + }; + })(); + + sqlite3.column_count = (function() { + const fname = 'sqlite3_column_count'; + const f = Module.cwrap(fname, ...decl('n:n')); + return function(stmt) { + verifyStatement(stmt); + const result = f(stmt); + return result; + }; + })(); + + sqlite3.column_double = (function() { + const fname = 'sqlite3_column_double'; + const f = Module.cwrap(fname, ...decl('nn:n')); + return function(stmt, iCol) { + verifyStatement(stmt); + const result = f(stmt, iCol); + return result; + }; + })(); + + sqlite3.column_int = (function() { + // Retrieve int64 but use only the lower 32 bits. The upper 32-bits are + // accessible with Module.getTempRet0(). + const fname = 'sqlite3_column_int64'; + const f = Module.cwrap(fname, ...decl('nn:n')); + return function(stmt, iCol) { + verifyStatement(stmt); + const result = f(stmt, iCol); + return result; + }; + })(); + + sqlite3.column_int64 = (function() { + const fname = 'sqlite3_column_int64'; + const f = Module.cwrap(fname, ...decl('nn:n')); + return function(stmt, iCol) { + verifyStatement(stmt); + const lo32 = f(stmt, iCol); + const hi32 = Module.getTempRet0(); + const result = cvt32x2ToBigInt(lo32, hi32); + return result; + }; + })(); + + sqlite3.column_name = (function() { + const fname = 'sqlite3_column_name'; + const f = Module.cwrap(fname, ...decl('nn:s')); + return function(stmt, iCol) { + verifyStatement(stmt); + const result = f(stmt, iCol); + return result; + }; + })(); + + sqlite3.column_names = function(stmt) { + const columns = []; + const nColumns = sqlite3.column_count(stmt); + for (let i = 0; i < nColumns; ++i) { + columns.push(sqlite3.column_name(stmt, i)); + } + return columns; + }; + + sqlite3.column_text = (function() { + const fname = 'sqlite3_column_text'; + const f = Module.cwrap(fname, ...decl('nn:s')); + return function(stmt, iCol) { + verifyStatement(stmt); + const result = f(stmt, iCol); + return result; + }; + })(); + + sqlite3.column_type = (function() { + const fname = 'sqlite3_column_type'; + const f = Module.cwrap(fname, ...decl('nn:n')); + return function(stmt, iCol) { + verifyStatement(stmt); + const result = f(stmt, iCol); + return result; + }; + })(); + + sqlite3.create_function = function(db, zFunctionName, nArg, eTextRep, pApp, xFunc, xStep, xFinal) { + verifyDatabase(db); + + // Convert SQLite callback arguments to JavaScript-friendly arguments. + function adapt(f) { + return f instanceof AsyncFunction ? + (async (ctx, n, values) => f(ctx, Module.HEAP32.subarray(values / 4, values / 4 + n))) : + ((ctx, n, values) => f(ctx, Module.HEAP32.subarray(values / 4, values / 4 + n))); + } + + const result = Module.create_function( + db, + zFunctionName, + nArg, + eTextRep, + pApp, + xFunc && adapt(xFunc), + xStep && adapt(xStep), + xFinal); + return check('sqlite3_create_function', result, db); + }; + + sqlite3.data_count = (function() { + const fname = 'sqlite3_data_count'; + const f = Module.cwrap(fname, ...decl('n:n')); + return function(stmt) { + verifyStatement(stmt); + const result = f(stmt); + return result; + }; + })(); + + sqlite3.exec = async function(db, sql, callback) { + for await (const stmt of sqlite3.statements(db, sql)) { + let columns; + while (await sqlite3.step(stmt) === SQLite.SQLITE_ROW) { + if (callback) { + columns = columns ?? sqlite3.column_names(stmt); + const row = sqlite3.row(stmt); + await callback(row, columns); + } + } + } + return SQLite.SQLITE_OK; + }; + + sqlite3.finalize = (function() { + const fname = 'sqlite3_finalize'; + const f = Module.cwrap(fname, ...decl('n:n'), { async }); + return async function(stmt) { + const result = await f(stmt); + mapStmtToDB.delete(stmt) + + // Don't throw on error here. Typically the error has already been + // thrown and finalize() is part of the cleanup. + return result; + }; + })(); + + sqlite3.get_autocommit = (function() { + const fname = 'sqlite3_get_autocommit'; + const f = Module.cwrap(fname, ...decl('n:n')); + return function(db) { + const result = f(db); + return result; + }; + })(); + + sqlite3.libversion = (function() { + const fname = 'sqlite3_libversion'; + const f = Module.cwrap(fname, ...decl(':s')); + return function() { + const result = f(); + return result; + }; + })(); + + sqlite3.libversion_number = (function() { + const fname = 'sqlite3_libversion_number'; + const f = Module.cwrap(fname, ...decl(':n')); + return function() { + const result = f(); + return result; + }; + })(); + + sqlite3.limit = (function() { + const fname = 'sqlite3_limit'; + const f = Module.cwrap(fname, ...decl('nnn:n')); + return function(db, id, newVal) { + const result = f(db, id, newVal); + return result; + }; + })(); + + sqlite3.open_v2 = (function() { + const fname = 'sqlite3_open_v2'; + const f = Module.cwrap(fname, ...decl('snnn:n'), { async }); + return async function(zFilename, flags, zVfs) { + flags = flags || SQLite.SQLITE_OPEN_CREATE | SQLite.SQLITE_OPEN_READWRITE; + zVfs = createUTF8(zVfs); + try { + // Allow retry operations. + const rc = await retry(() => f(zFilename, tmpPtr[0], flags, zVfs)); + + const db = Module.getValue(tmpPtr[0], '*'); + databases.add(db); + + Module.ccall('RegisterExtensionFunctions', 'void', ['number'], [db]); + check(fname, rc); + return db; + } finally { + Module._sqlite3_free(zVfs); + } + }; + })(); + + sqlite3.progress_handler = function(db, nProgressOps, handler, userData) { + verifyDatabase(db); + Module.progress_handler(db, nProgressOps, handler, userData); + };; + + sqlite3.reset = (function() { + const fname = 'sqlite3_reset'; + const f = Module.cwrap(fname, ...decl('n:n'), { async }); + return async function(stmt) { + verifyStatement(stmt); + const result = await f(stmt); + return check(fname, result, mapStmtToDB.get(stmt)); + }; + })(); + + sqlite3.result = function(context, value) { + switch (typeof value) { + case 'number': + if (value === (value | 0)) { + sqlite3.result_int(context, value); + } else { + sqlite3.result_double(context, value); + } + break; + case 'string': + sqlite3.result_text(context, value); + break; + default: + if (value instanceof Uint8Array || Array.isArray(value)) { + sqlite3.result_blob(context, value); + } else if (value === null) { + sqlite3.result_null(context); + } else if (typeof value === 'bigint') { + return sqlite3.result_int64(context, value); + } else { + console.warn('unknown result converted to null', value); + sqlite3.result_null(context); + } + break; + } + + }; + + sqlite3.result_blob = (function() { + const fname = 'sqlite3_result_blob'; + const f = Module.cwrap(fname, ...decl('nnnn:n')); + return function(context, value) { + // @ts-ignore + const byteLength = value.byteLength ?? value.length; + const ptr = Module._sqlite3_malloc(byteLength); + Module.HEAPU8.subarray(ptr).set(value); + f(context, ptr, byteLength, sqliteFreeAddress); // void return + }; + })(); + + sqlite3.result_double = (function() { + const fname = 'sqlite3_result_double'; + const f = Module.cwrap(fname, ...decl('nn:n')); + return function(context, value) { + f(context, value); // void return + }; + })(); + + sqlite3.result_int = (function() { + const fname = 'sqlite3_result_int'; + const f = Module.cwrap(fname, ...decl('nn:n')); + return function(context, value) { + f(context, value); // void return + }; + })(); + + sqlite3.result_int64 = (function() { + const fname = 'sqlite3_result_int64'; + const f = Module.cwrap(fname, ...decl('nnn:n')); + return function(context, value) { + if (value > MAX_INT64 || value < MIN_INT64) return SQLite.SQLITE_RANGE; + + const lo32 = value & 0xffffffffn; + const hi32 = value >> 32n; + f(context, Number(lo32), Number(hi32)); // void return + }; + })(); + + sqlite3.result_null = (function() { + const fname = 'sqlite3_result_null'; + const f = Module.cwrap(fname, ...decl('n:n')); + return function(context) { + f(context); // void return + }; + })(); + + sqlite3.result_text = (function() { + const fname = 'sqlite3_result_text'; + const f = Module.cwrap(fname, ...decl('nnnn:n')); + return function(context, value) { + const ptr = createUTF8(value); + f(context, ptr, -1, sqliteFreeAddress); // void return + }; + })(); + + sqlite3.row = function(stmt) { + const row = []; + const nColumns = sqlite3.data_count(stmt); + for (let i = 0; i < nColumns; ++i) { + const value = sqlite3.column(stmt, i); + + // Copy blob if aliasing volatile WebAssembly memory. This avoids an + // unnecessary copy if users monkey patch column_blob to copy. + // @ts-ignore + row.push(value?.buffer === Module.HEAPU8.buffer ? value.slice() : value); + } + return row; + }; + + sqlite3.set_authorizer = function(db, xAuth, pApp) { + verifyDatabase(db); + + // Convert SQLite callback arguments to JavaScript-friendly arguments. + function cvtArgs(_, iAction, p3, p4, p5, p6) { + return [ + _, + iAction, + Module.UTF8ToString(p3), + Module.UTF8ToString(p4), + Module.UTF8ToString(p5), + Module.UTF8ToString(p6) + ]; + }; + function adapt(f) { + return f instanceof AsyncFunction ? + (async (_, iAction, p3, p4, p5, p6) => f(cvtArgs(_, iAction, p3, p4, p5, p6))) : + ((_, iAction, p3, p4, p5, p6) => f(cvtArgs(_, iAction, p3, p4, p5, p6))); + } + + const result = Module.set_authorizer(db, adapt(xAuth), pApp); + return check('sqlite3_set_authorizer', result, db); + };; + + sqlite3.sql = (function() { + const fname = 'sqlite3_sql'; + const f = Module.cwrap(fname, ...decl('n:s')); + return function(stmt) { + verifyStatement(stmt); + const result = f(stmt); + return result; + }; + })(); + + sqlite3.statements = function(db, sql, options = {}) { + const prepare = Module.cwrap( + 'sqlite3_prepare_v3', + 'number', + ['number', 'number', 'number', 'number', 'number', 'number'], + { async: true }); + + return (async function*() { + const onFinally = []; + try { + // Encode SQL string to UTF-8. + const utf8 = new TextEncoder().encode(sql); + + // Copy encoded string to WebAssembly memory. The SQLite docs say + // zero-termination is a minor optimization so add room for that. + // Also add space for the statement handle and SQL tail pointer. + const allocSize = utf8.byteLength - (utf8.byteLength % 4) + 12; + const pzHead = Module._sqlite3_malloc(allocSize); + const pzEnd = pzHead + utf8.byteLength + 1; + onFinally.push(() => Module._sqlite3_free(pzHead)); + Module.HEAPU8.set(utf8, pzHead); + Module.HEAPU8[pzEnd - 1] = 0; + + // Use extra space for the statement handle and SQL tail pointer. + const pStmt = pzHead + allocSize - 8; + const pzTail = pzHead + allocSize - 4; + + // Ensure that statement handles are not leaked. + let stmt; + function maybeFinalize() { + if (stmt && !options.unscoped) { + sqlite3.finalize(stmt); + } + stmt = 0; + } + onFinally.push(maybeFinalize); + + // Loop over statements. + Module.setValue(pzTail, pzHead, '*'); + do { + // Reclaim resources for the previous iteration. + maybeFinalize(); + + // Call sqlite3_prepare_v3() for the next statement. + // Allow retry operations. + const zTail = Module.getValue(pzTail, '*'); + const rc = await retry(() => { + return prepare( + db, + zTail, + pzEnd - pzTail, + options.flags || 0, + pStmt, + pzTail); + }); + + if (rc !== SQLite.SQLITE_OK) { + check('sqlite3_prepare_v3', rc, db); + } + + stmt = Module.getValue(pStmt, '*'); + if (stmt) { + mapStmtToDB.set(stmt, db); + yield stmt; + } + } while (stmt); + } finally { + while (onFinally.length) { + onFinally.pop()(); + } + } + })(); + }; + + sqlite3.step = (function() { + const fname = 'sqlite3_step'; + const f = Module.cwrap(fname, ...decl('n:n'), { async }); + return async function(stmt) { + verifyStatement(stmt); + + // Allow retry operations. + const rc = await retry(() => f(stmt)); + + return check(fname, rc, mapStmtToDB.get(stmt), [SQLite.SQLITE_ROW, SQLite.SQLITE_DONE]); + }; + })(); + + sqlite3.value = function(pValue) { + const type = sqlite3.value_type(pValue); + switch (type) { + case SQLite.SQLITE_BLOB: + return sqlite3.value_blob(pValue); + case SQLite.SQLITE_FLOAT: + return sqlite3.value_double(pValue); + case SQLite.SQLITE_INTEGER: + const lo32 = sqlite3.value_int(pValue); + const hi32 = Module.getTempRet0(); + return cvt32x2AsSafe(lo32, hi32); + case SQLite.SQLITE_NULL: + return null; + case SQLite.SQLITE_TEXT: + return sqlite3.value_text(pValue); + default: + throw new SQLiteError('unknown type', type); + } + }; + + sqlite3.value_blob = (function() { + const fname = 'sqlite3_value_blob'; + const f = Module.cwrap(fname, ...decl('n:n')); + return function(pValue) { + const nBytes = sqlite3.value_bytes(pValue); + const address = f(pValue); + const result = Module.HEAPU8.subarray(address, address + nBytes); + return result; + }; + })(); + + sqlite3.value_bytes = (function() { + const fname = 'sqlite3_value_bytes'; + const f = Module.cwrap(fname, ...decl('n:n')); + return function(pValue) { + const result = f(pValue); + return result; + }; + })(); + + sqlite3.value_double = (function() { + const fname = 'sqlite3_value_double'; + const f = Module.cwrap(fname, ...decl('n:n')); + return function(pValue) { + const result = f(pValue); + return result; + }; + })(); + + sqlite3.value_int = (function() { + const fname = 'sqlite3_value_int64'; + const f = Module.cwrap(fname, ...decl('n:n')); + return function(pValue) { + const result = f(pValue); + return result; + }; + })(); + + sqlite3.value_int64 = (function() { + const fname = 'sqlite3_value_int64'; + const f = Module.cwrap(fname, ...decl('n:n')); + return function(pValue) { + const lo32 = f(pValue); + const hi32 = Module.getTempRet0(); + const result = cvt32x2ToBigInt(lo32, hi32); + return result; + }; + })(); + + sqlite3.value_text = (function() { + const fname = 'sqlite3_value_text'; + const f = Module.cwrap(fname, ...decl('n:s')); + return function(pValue) { + const result = f(pValue); + return result; + }; + })(); + + sqlite3.value_type = (function() { + const fname = 'sqlite3_value_type'; + const f = Module.cwrap(fname, ...decl('n:n')); + return function(pValue) { + const result = f(pValue); + return result; + }; + })(); + + sqlite3.vfs_register = function(vfs, makeDefault) { + const result = Module.vfs_register(vfs, makeDefault); + return check('sqlite3_vfs_register', result); + }; + + function check(fname, result, db = null, allowed = [SQLite.SQLITE_OK]) { + if (allowed.includes(result)) return result; + const message = db ? + Module.ccall('sqlite3_errmsg', 'string', ['number'], [db]) : + fname; + throw new SQLiteError(message, result); + } + + // This function is used to automatically retry failed calls that + // have pending retry operations that should allow the retry to + // succeed. + async function retry(f) { + let rc; + do { + // Wait for all pending retry operations to complete. This is + // normally empty on the first loop iteration. + if (Module.retryOps.length) { + await Promise.all(Module.retryOps); + Module.retryOps = []; + } + + rc = await f(); + + // Retry on failure with new pending retry operations. + } while (rc && Module.retryOps.length); + return rc; + } + + return sqlite3; +} + +// Helper function to use a more compact signature specification. +function decl(s) { + const result = []; + const m = s.match(/([ns@]*):([nsv@])/); + switch (m[2]) { + case 'n': result.push('number'); break; + case 's': result.push('string'); break; + case 'v': result.push(null); break; + } + + const args = []; + for (let c of m[1]) { + switch (c) { + case 'n': args.push('number'); break; + case 's': args.push('string'); break; + } + } + result.push(args); + return result; +} diff --git a/packages/replicate/assets/wa-sqlite/src/sqlite-constants.js b/packages/replicate/assets/wa-sqlite/src/sqlite-constants.js new file mode 100644 index 0000000..3878b16 --- /dev/null +++ b/packages/replicate/assets/wa-sqlite/src/sqlite-constants.js @@ -0,0 +1,275 @@ +// Primary result codes. +// https://www.sqlite.org/rescode.html +export const SQLITE_OK = 0; +export const SQLITE_ERROR = 1; +export const SQLITE_INTERNAL = 2; +export const SQLITE_PERM = 3; +export const SQLITE_ABORT = 4; +export const SQLITE_BUSY = 5; +export const SQLITE_LOCKED = 6; +export const SQLITE_NOMEM = 7; +export const SQLITE_READONLY = 8; +export const SQLITE_INTERRUPT = 9; +export const SQLITE_IOERR = 10; +export const SQLITE_CORRUPT = 11; +export const SQLITE_NOTFOUND = 12; +export const SQLITE_FULL = 13; +export const SQLITE_CANTOPEN = 14; +export const SQLITE_PROTOCOL = 15; +export const SQLITE_EMPTY = 16; +export const SQLITE_SCHEMA = 17; +export const SQLITE_TOOBIG = 18; +export const SQLITE_CONSTRAINT = 19; +export const SQLITE_MISMATCH = 20; +export const SQLITE_MISUSE = 21; +export const SQLITE_NOLFS = 22; +export const SQLITE_AUTH = 23; +export const SQLITE_FORMAT = 24; +export const SQLITE_RANGE = 25; +export const SQLITE_NOTADB = 26; +export const SQLITE_NOTICE = 27; +export const SQLITE_WARNING = 28; +export const SQLITE_ROW = 100; +export const SQLITE_DONE = 101; + +// Extended error codes. +export const SQLITE_IOERR_ACCESS = 3338; +export const SQLITE_IOERR_CHECKRESERVEDLOCK = 3594; +export const SQLITE_IOERR_CLOSE = 4106; +export const SQLITE_IOERR_DATA = 8202; +export const SQLITE_IOERR_DELETE = 2570; +export const SQLITE_IOERR_DELETE_NOENT = 5898; +export const SQLITE_IOERR_DIR_FSYNC = 1290; +export const SQLITE_IOERR_FSTAT = 1802; +export const SQLITE_IOERR_FSYNC = 1034; +export const SQLITE_IOERR_GETTEMPPATH = 6410; +export const SQLITE_IOERR_LOCK = 3850; +export const SQLITE_IOERR_NOMEM = 3082; +export const SQLITE_IOERR_READ = 266; +export const SQLITE_IOERR_RDLOCK = 2314; +export const SQLITE_IOERR_SEEK = 5642; +export const SQLITE_IOERR_SHORT_READ = 522; +export const SQLITE_IOERR_TRUNCATE = 1546; +export const SQLITE_IOERR_UNLOCK = 2058; +export const SQLITE_IOERR_VNODE = 6922; +export const SQLITE_IOERR_WRITE = 778; +export const SQLITE_IOERR_BEGIN_ATOMIC = 7434; +export const SQLITE_IOERR_COMMIT_ATOMIC = 7690; +export const SQLITE_IOERR_ROLLBACK_ATOMIC = 7946; + +// Other extended result codes. +export const SQLITE_CONSTRAINT_CHECK = 275; +export const SQLITE_CONSTRAINT_COMMITHOOK = 531; +export const SQLITE_CONSTRAINT_FOREIGNKEY = 787; +export const SQLITE_CONSTRAINT_FUNCTION = 1043; +export const SQLITE_CONSTRAINT_NOTNULL = 1299; +export const SQLITE_CONSTRAINT_PINNED = 2835; +export const SQLITE_CONSTRAINT_PRIMARYKEY = 1555; +export const SQLITE_CONSTRAINT_ROWID = 2579; +export const SQLITE_CONSTRAINT_TRIGGER = 1811; +export const SQLITE_CONSTRAINT_UNIQUE = 2067; +export const SQLITE_CONSTRAINT_VTAB = 2323; + +// Open flags. +// https://www.sqlite.org/c3ref/c_open_autoproxy.html +export const SQLITE_OPEN_READONLY = 0x00000001; +export const SQLITE_OPEN_READWRITE = 0x00000002; +export const SQLITE_OPEN_CREATE = 0x00000004; +export const SQLITE_OPEN_DELETEONCLOSE = 0x00000008; +export const SQLITE_OPEN_EXCLUSIVE = 0x00000010; +export const SQLITE_OPEN_AUTOPROXY = 0x00000020; +export const SQLITE_OPEN_URI = 0x00000040; +export const SQLITE_OPEN_MEMORY = 0x00000080; +export const SQLITE_OPEN_MAIN_DB = 0x00000100; +export const SQLITE_OPEN_TEMP_DB = 0x00000200; +export const SQLITE_OPEN_TRANSIENT_DB = 0x00000400; +export const SQLITE_OPEN_MAIN_JOURNAL = 0x00000800; +export const SQLITE_OPEN_TEMP_JOURNAL = 0x00001000; +export const SQLITE_OPEN_SUBJOURNAL = 0x00002000; +export const SQLITE_OPEN_SUPER_JOURNAL = 0x00004000; +export const SQLITE_OPEN_NOMUTEX = 0x00008000; +export const SQLITE_OPEN_FULLMUTEX = 0x00010000; +export const SQLITE_OPEN_SHAREDCACHE = 0x00020000; +export const SQLITE_OPEN_PRIVATECACHE = 0x00040000; +export const SQLITE_OPEN_WAL = 0x00080000; +export const SQLITE_OPEN_NOFOLLOW = 0x01000000; + +// Locking levels. +// https://www.sqlite.org/c3ref/c_lock_exclusive.html +export const SQLITE_LOCK_NONE = 0; +export const SQLITE_LOCK_SHARED = 1; +export const SQLITE_LOCK_RESERVED = 2; +export const SQLITE_LOCK_PENDING = 3; +export const SQLITE_LOCK_EXCLUSIVE = 4; + +// Device characteristics. +// https://www.sqlite.org/c3ref/c_iocap_atomic.html +export const SQLITE_IOCAP_ATOMIC = 0x00000001; +export const SQLITE_IOCAP_ATOMIC512 = 0x00000002; +export const SQLITE_IOCAP_ATOMIC1K = 0x00000004; +export const SQLITE_IOCAP_ATOMIC2K = 0x00000008; +export const SQLITE_IOCAP_ATOMIC4K = 0x00000010; +export const SQLITE_IOCAP_ATOMIC8K = 0x00000020; +export const SQLITE_IOCAP_ATOMIC16K = 0x00000040; +export const SQLITE_IOCAP_ATOMIC32K = 0x00000080; +export const SQLITE_IOCAP_ATOMIC64K = 0x00000100; +export const SQLITE_IOCAP_SAFE_APPEND = 0x00000200; +export const SQLITE_IOCAP_SEQUENTIAL = 0x00000400; +export const SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN = 0x00000800; +export const SQLITE_IOCAP_POWERSAFE_OVERWRITE = 0x00001000; +export const SQLITE_IOCAP_IMMUTABLE = 0x00002000; +export const SQLITE_IOCAP_BATCH_ATOMIC = 0x00004000; + +// xAccess flags. +// https://www.sqlite.org/c3ref/c_access_exists.html +export const SQLITE_ACCESS_EXISTS = 0; +export const SQLITE_ACCESS_READWRITE = 1; +export const SQLITE_ACCESS_READ = 2; + +// File control opcodes +// https://www.sqlite.org/c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlbeginatomicwrite +export const SQLITE_FCNTL_LOCKSTATE = 1; +export const SQLITE_FCNTL_GET_LOCKPROXYFILE = 2; +export const SQLITE_FCNTL_SET_LOCKPROXYFILE = 3; +export const SQLITE_FCNTL_LAST_ERRNO = 4; +export const SQLITE_FCNTL_SIZE_HINT = 5; +export const SQLITE_FCNTL_CHUNK_SIZE = 6; +export const SQLITE_FCNTL_FILE_POINTER = 7; +export const SQLITE_FCNTL_SYNC_OMITTED = 8; +export const SQLITE_FCNTL_WIN32_AV_RETRY = 9; +export const SQLITE_FCNTL_PERSIST_WAL = 10; +export const SQLITE_FCNTL_OVERWRITE = 11; +export const SQLITE_FCNTL_VFSNAME = 12; +export const SQLITE_FCNTL_POWERSAFE_OVERWRITE = 13; +export const SQLITE_FCNTL_PRAGMA = 14; +export const SQLITE_FCNTL_BUSYHANDLER = 15; +export const SQLITE_FCNTL_TEMPFILENAME = 16; +export const SQLITE_FCNTL_MMAP_SIZE = 18; +export const SQLITE_FCNTL_TRACE = 19; +export const SQLITE_FCNTL_HAS_MOVED = 20; +export const SQLITE_FCNTL_SYNC = 21; +export const SQLITE_FCNTL_COMMIT_PHASETWO = 22; +export const SQLITE_FCNTL_WIN32_SET_HANDLE = 23; +export const SQLITE_FCNTL_WAL_BLOCK = 24; +export const SQLITE_FCNTL_ZIPVFS = 25; +export const SQLITE_FCNTL_RBU = 26; +export const SQLITE_FCNTL_VFS_POINTER = 27; +export const SQLITE_FCNTL_JOURNAL_POINTER = 28; +export const SQLITE_FCNTL_WIN32_GET_HANDLE = 29; +export const SQLITE_FCNTL_PDB = 30; +export const SQLITE_FCNTL_BEGIN_ATOMIC_WRITE = 31; +export const SQLITE_FCNTL_COMMIT_ATOMIC_WRITE = 32; +export const SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE = 33; +export const SQLITE_FCNTL_LOCK_TIMEOUT = 34; +export const SQLITE_FCNTL_DATA_VERSION = 35; +export const SQLITE_FCNTL_SIZE_LIMIT = 36; +export const SQLITE_FCNTL_CKPT_DONE = 37; +export const SQLITE_FCNTL_RESERVE_BYTES = 38; +export const SQLITE_FCNTL_CKPT_START = 39; + +// Fundamental datatypes. +// https://www.sqlite.org/c3ref/c_blob.html +export const SQLITE_INTEGER = 1; +export const SQLITE_FLOAT = 2; +export const SQLITE_TEXT = 3; +export const SQLITE_BLOB = 4; +export const SQLITE_NULL = 5; + +// Special destructor behavior. +// https://www.sqlite.org/c3ref/c_static.html +export const SQLITE_STATIC = 0; +export const SQLITE_TRANSIENT = -1; + +// Text encodings. +// https://sqlite.org/c3ref/c_any.html +export const SQLITE_UTF8 = 1; /* IMP: R-37514-35566 */ +export const SQLITE_UTF16LE = 2; /* IMP: R-03371-37637 */ +export const SQLITE_UTF16BE = 3; /* IMP: R-51971-34154 */ +export const SQLITE_UTF16 = 4; /* Use native byte order */ + +// Module constraint ops. +export const SQLITE_INDEX_CONSTRAINT_EQ = 2; +export const SQLITE_INDEX_CONSTRAINT_GT = 4; +export const SQLITE_INDEX_CONSTRAINT_LE = 8; +export const SQLITE_INDEX_CONSTRAINT_LT = 16; +export const SQLITE_INDEX_CONSTRAINT_GE = 32; +export const SQLITE_INDEX_CONSTRAINT_MATCH = 64; +export const SQLITE_INDEX_CONSTRAINT_LIKE = 65; +export const SQLITE_INDEX_CONSTRAINT_GLOB = 66; +export const SQLITE_INDEX_CONSTRAINT_REGEXP = 67; +export const SQLITE_INDEX_CONSTRAINT_NE = 68; +export const SQLITE_INDEX_CONSTRAINT_ISNOT = 69; +export const SQLITE_INDEX_CONSTRAINT_ISNOTNULL = 70; +export const SQLITE_INDEX_CONSTRAINT_ISNULL = 71; +export const SQLITE_INDEX_CONSTRAINT_IS = 72; +export const SQLITE_INDEX_CONSTRAINT_FUNCTION = 150; +export const SQLITE_INDEX_SCAN_UNIQUE = 1; /* Scan visits at most = 1 row */ + +// Function flags +export const SQLITE_DETERMINISTIC = 0x000000800; +export const SQLITE_DIRECTONLY = 0x000080000; +export const SQLITE_SUBTYPE = 0x000100000; +export const SQLITE_INNOCUOUS = 0x000200000; + +// Sync flags +export const SQLITE_SYNC_NORMAL = 0x00002; +export const SQLITE_SYNC_FULL = 0x00003; +export const SQLITE_SYNC_DATAONLY = 0x00010; + +// Authorizer action codes +export const SQLITE_CREATE_INDEX = 1; +export const SQLITE_CREATE_TABLE = 2; +export const SQLITE_CREATE_TEMP_INDEX = 3; +export const SQLITE_CREATE_TEMP_TABLE = 4; +export const SQLITE_CREATE_TEMP_TRIGGER = 5; +export const SQLITE_CREATE_TEMP_VIEW = 6; +export const SQLITE_CREATE_TRIGGER = 7; +export const SQLITE_CREATE_VIEW = 8; +export const SQLITE_DELETE = 9; +export const SQLITE_DROP_INDEX = 10; +export const SQLITE_DROP_TABLE = 11; +export const SQLITE_DROP_TEMP_INDEX = 12; +export const SQLITE_DROP_TEMP_TABLE = 13; +export const SQLITE_DROP_TEMP_TRIGGER = 14; +export const SQLITE_DROP_TEMP_VIEW = 15; +export const SQLITE_DROP_TRIGGER = 16; +export const SQLITE_DROP_VIEW = 17; +export const SQLITE_INSERT = 18; +export const SQLITE_PRAGMA = 19; +export const SQLITE_READ = 20; +export const SQLITE_SELECT = 21; +export const SQLITE_TRANSACTION = 22; +export const SQLITE_UPDATE = 23; +export const SQLITE_ATTACH = 24; +export const SQLITE_DETACH = 25; +export const SQLITE_ALTER_TABLE = 26; +export const SQLITE_REINDEX = 27; +export const SQLITE_ANALYZE = 28; +export const SQLITE_CREATE_VTABLE = 29; +export const SQLITE_DROP_VTABLE = 30; +export const SQLITE_FUNCTION = 31; +export const SQLITE_SAVEPOINT = 32; +export const SQLITE_COPY = 0; +export const SQLITE_RECURSIVE = 33; + +// Authorizer return codes +export const SQLITE_DENY = 1; +export const SQLITE_IGNORE = 2; + +// Limit categories +export const SQLITE_LIMIT_LENGTH = 0; +export const SQLITE_LIMIT_SQL_LENGTH = 1; +export const SQLITE_LIMIT_COLUMN = 2; +export const SQLITE_LIMIT_EXPR_DEPTH = 3; +export const SQLITE_LIMIT_COMPOUND_SELECT = 4; +export const SQLITE_LIMIT_VDBE_OP = 5; +export const SQLITE_LIMIT_FUNCTION_ARG = 6; +export const SQLITE_LIMIT_ATTACHED = 7; +export const SQLITE_LIMIT_LIKE_PATTERN_LENGTH = 8; +export const SQLITE_LIMIT_VARIABLE_NUMBER = 9; +export const SQLITE_LIMIT_TRIGGER_DEPTH = 10; +export const SQLITE_LIMIT_WORKER_THREADS = 11; + +export const SQLITE_PREPARE_PERSISTENT = 0x01; +export const SQLITE_PREPARE_NORMALIZED = 0x02; +export const SQLITE_PREPARE_NO_VTAB = 0x04; \ No newline at end of file diff --git a/packages/replicate/package.json b/packages/replicate/package.json index 95e8590..8d04e6e 100644 --- a/packages/replicate/package.json +++ b/packages/replicate/package.json @@ -21,7 +21,9 @@ "dist", "LICENSE", "README.md", - "src" + "src", + "assets", + "scripts/copy-sqlite-assets.mjs" ], "type": "module", "main": "./dist/shared/index.js", @@ -57,7 +59,8 @@ }, "./worker": { "import": "./dist/client/persistence/sqlite/worker.js" - } + }, + "./sqlite-assets/*": "./assets/wa-sqlite/*" }, "publishConfig": { "access": "public" @@ -72,7 +75,9 @@ "lint": "eslint .", "lint:fix": "eslint . --fix", "format": "prettier --write .", - "format:check": "prettier --check ." + "format:check": "prettier --check .", + "test:browser": "node scripts/test-offline-browser.mjs", + "test:assets": "node scripts/copy-sqlite-assets.mjs --verify" }, "dependencies": { "@logtape/logtape": "catalog:", @@ -104,7 +109,8 @@ "tsdown": "0.20.0-beta.3", "typescript": "catalog:", "typescript-eslint": "catalog:", - "vitest": "catalog:" + "vitest": "catalog:", + "vite": "catalog:" }, "peerDependencies": { "@op-engineering/op-sqlite": "15.1.14", @@ -122,5 +128,8 @@ "@op-engineering/op-sqlite": { "optional": true } + }, + "bin": { + "replicate-sqlite-assets": "./scripts/copy-sqlite-assets.mjs" } } diff --git a/packages/replicate/scripts/copy-sqlite-assets.mjs b/packages/replicate/scripts/copy-sqlite-assets.mjs new file mode 100755 index 0000000..9af260b --- /dev/null +++ b/packages/replicate/scripts/copy-sqlite-assets.mjs @@ -0,0 +1,20 @@ +#!/usr/bin/env node +import { cp, readFile } from 'node:fs/promises'; +import { createHash } from 'node:crypto'; +import { fileURLToPath } from 'node:url'; +import { resolve } from 'node:path'; + +const source = fileURLToPath(new URL('../assets/wa-sqlite/', import.meta.url)); +const manifest = JSON.parse(await readFile(resolve(source, 'manifest.json'), 'utf8')); +for (const [file, expected] of Object.entries(manifest.sha256)) { + const actual = createHash('sha256') + .update(await readFile(resolve(source, file))) + .digest('hex'); + if (actual !== expected) throw new Error(`SQLite asset checksum mismatch: ${file}`); +} +if (process.argv[2] !== '--verify') { + if (!process.argv[2]) + throw new Error('Usage: replicate-sqlite-assets | --verify'); + const destination = resolve(process.argv[2]); + await cp(source, destination, { recursive: true }); +} diff --git a/packages/replicate/scripts/test-native-bundle.cjs b/packages/replicate/scripts/test-native-bundle.cjs new file mode 100644 index 0000000..54ceeca --- /dev/null +++ b/packages/replicate/scripts/test-native-bundle.cjs @@ -0,0 +1,55 @@ +const { createRequire } = require('node:module'); +const { mkdtemp, rm, readFile } = require('node:fs/promises'); +const { tmpdir } = require('node:os'); +const path = require('node:path'); +const assert = require('node:assert/strict'); + +(async () => { + const packageRoot = path.resolve(__dirname, '..'); + const repo = path.resolve(packageRoot, '../..'); + const expoRequire = createRequire(path.join(repo, 'apps/expo/package.json')); + const { getDefaultConfig } = expoRequire('expo/metro-config'); + const metro = createRequire(expoRequire.resolve('expo/package.json'))('metro'); + const fixture = path.join(packageRoot, 'test/native'); + const config = getDefaultConfig(path.join(repo, 'apps/expo')); + config.projectRoot = fixture; + config.watchFolders = [repo]; + config.resolver.nodeModulesPaths = [ + path.join(packageRoot, 'node_modules'), + path.join(repo, 'apps/expo/node_modules'), + path.join(repo, 'node_modules'), + path.join(repo, 'node_modules/.bun/node_modules'), + ]; + config.resolver.extraNodeModules = { '@trestleinc/replicate': packageRoot }; + const lib0Root = path.dirname(require.resolve('lib0/package.json', { paths: [packageRoot] })); + // lib0's RN conditional export requires obsolete isomorphic-webcrypto. + // Use its browser entry with the application's native CSPRNG installed first. + config.resolver.resolveRequest = (context, name, platform) => { + if (name === 'lib0/webcrypto') + return { type: 'sourceFile', filePath: path.join(lib0Root, 'webcrypto.js') }; + return context.resolveRequest(context, name, platform); + }; + config.maxWorkers = 2; + const directory = await mkdtemp(path.join(tmpdir(), 'replicate-native-')); + try { + const output = path.join(directory, 'android.js'); + await metro.runBuild(config, { + entry: path.join(fixture, 'index.js'), + platform: 'android', + dev: false, + minify: false, + out: output, + }); + const bundle = await readFile(output, 'utf8'); + assert.ok(bundle.includes('replicateNativeGraph')); + assert.ok(bundle.includes('PersistenceProvider.storeUpdate')); + process.stdout.write( + 'Full built client graph bundled for Android with Expo Metro (no device execution)\n' + ); + } finally { + await rm(directory, { recursive: true, force: true }); + } +})().catch((error) => { + process.stderr.write(String(error) + '\n'); + process.exitCode = 1; +}); diff --git a/packages/replicate/scripts/test-offline-browser.mjs b/packages/replicate/scripts/test-offline-browser.mjs new file mode 100644 index 0000000..0b73575 --- /dev/null +++ b/packages/replicate/scripts/test-offline-browser.mjs @@ -0,0 +1,161 @@ +import { build } from 'vite'; +import { chromium } from 'playwright'; +import { createServer } from 'node:http'; +import { mkdtemp, cp, readdir, readFile, writeFile, rm } from 'node:fs/promises'; +import { tmpdir } from 'node:os'; +import { join, resolve, extname } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import assert from 'node:assert/strict'; +import * as Y from 'yjs'; + +const root = fileURLToPath(new URL('../', import.meta.url)); +const temp = await mkdtemp(join(tmpdir(), 'replicate-browser-')); +const site = join(temp, 'site'); +const profile = join(temp, 'profile'); +let context; +let server; +let checks = 0; +async function waitForCursor(page, expected) { + const deadline = Date.now() + 30000; + while ((await page.evaluate(() => window.replica.cursor())) !== expected) { + if (Date.now() > deadline) throw new Error(`Cursor did not reach ${expected}`); + await new Promise((resolve) => setTimeout(resolve, 20)); + } +} +try { + await build({ + configFile: false, + root: resolve(root, 'test/browser'), + logLevel: 'warn', + build: { outDir: site, emptyOutDir: true }, + }); + await cp(resolve(root, 'assets/wa-sqlite'), join(site, 'sqlite'), { recursive: true }); + const paths = (await readdir(site, { recursive: true, withFileTypes: true })) + .filter((entry) => entry.isFile()) + .map( + (entry) => + '/' + + join(entry.parentPath, entry.name) + .slice(site.length + 1) + .replaceAll('\\', '/') + ); + await writeFile( + join(site, 'sw.js'), + `self.addEventListener('install', event => event.waitUntil(caches.open('replica-v1').then(cache => cache.addAll(${JSON.stringify(['/', ...paths])})).then(() => self.skipWaiting()))); self.addEventListener('activate', event => event.waitUntil(self.clients.claim())); self.addEventListener('fetch', event => event.respondWith(caches.match(event.request).then(hit => hit || fetch(event.request))));` + ); + let requests = 0; + server = createServer(async (req, res) => { + requests++; + try { + const name = req.url === '/' ? '/index.html' : new URL(req.url, 'http://local').pathname; + const path = resolve(site, '.' + name); + if (!path.startsWith(site)) throw new Error('Invalid path'); + const data = await readFile(path); + res.setHeader( + 'Content-Type', + { + '.wasm': 'application/wasm', + '.js': 'application/javascript', + '.mjs': 'application/javascript', + '.html': 'text/html', + }[extname(path)] ?? 'application/octet-stream' + ); + res.end(data); + } catch { + res.writeHead(404); + res.end(); + } + }); + await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)); + const url = `http://127.0.0.1:${server.address().port}/`; + const errors = []; + async function launch(offline = false) { + context = await chromium.launchPersistentContext(profile, { headless: true, offline }); + const page = await context.newPage(); + page.on('pageerror', (error) => errors.push(error.message)); + await page.goto(url); + await page.waitForFunction(() => !!window.replica); + await page.waitForFunction(() => !!navigator.serviceWorker.controller); + return page; + } + async function restart(page, { closeApplication = false } = {}) { + if (closeApplication) await page.evaluate(() => window.replica.close()); + await context.close(); + return launch(true); + } + let page = await launch(); + assert.equal(await page.evaluate(() => window.replica.calls()), 0); + checks++; + await page.evaluate(async () => { + await window.replica.connect(); + window.replica.emit('a', 1); + }); + await waitForCursor(page, 1); + checks++; + page = await restart(page, { closeApplication: true }); + assert.equal(await page.evaluate(() => window.replica.get('a').title), 'persisted in browser'); + checks++; + assert.equal(await page.evaluate(() => window.replica.calls()), 0); + checks++; + const requestCount = requests; + await page.evaluate(async () => { + await window.replica.connect(); + window.replica.emit('a', 2, false); + }); + await page.waitForFunction(() => !window.replica.get('a')); + page = await restart(page); + assert.equal(await page.evaluate(() => window.replica.get('a')), undefined); + checks++; + await page.evaluate(async () => { + await window.replica.connect(); + window.replica.emit('b', 3); + }); + await page.waitForFunction(() => !!window.replica.get('b')); + page = await restart(page); + await page.evaluate(async () => { + window.replica.absent(); + await window.replica.connect(); + }); + await page.waitForFunction(() => !window.replica.get('b')); + page = await restart(page); + assert.equal(await page.evaluate(() => window.replica.get('b')), undefined); + checks++; + const doc = new Y.Doc(); + doc.getMap('fields').set('title', 'base'); + const base = Y.encodeStateAsUpdateV2(doc); + const vector = Y.encodeStateVector(doc); + doc.getMap('fields').set('title', 'after restart'); + const delta = Y.encodeStateAsUpdateV2(doc, vector); + doc.destroy(); + await page.evaluate( + async (raw) => { + await window.replica.connect(); + window.replica.emit('pending', 4, true, raw); + }, + [...delta] + ); + await waitForCursor(page, 4); + page = await restart(page); + await page.evaluate( + async (raw) => { + await window.replica.connect(); + window.replica.emit('pending', 5, true, raw); + }, + [...base] + ); + await page.waitForFunction(() => window.replica.get('pending')?.title === 'after restart'); + checks++; + await page.evaluate(() => window.replica.reset()); + page = await restart(page); + assert.equal(await page.evaluate(() => window.replica.get('pending')), undefined); + checks++; + assert.equal(requests, requestCount); + assert.deepEqual(errors, []); + checks++; + await page.evaluate(() => window.replica.close()); + process.stdout.write(`${checks} real Chromium offline/process-restart checks passed\n`); +} finally { + await context?.close(); + await new Promise((resolve) => (server ? server.close(resolve) : resolve())); + await rm(temp, { recursive: true, force: true }); +} diff --git a/packages/replicate/scripts/verify-sqlite-provenance.mjs b/packages/replicate/scripts/verify-sqlite-provenance.mjs new file mode 100644 index 0000000..10f759b --- /dev/null +++ b/packages/replicate/scripts/verify-sqlite-provenance.mjs @@ -0,0 +1,19 @@ +// Read-only comparison with pinned official distribution; does not regenerate compiler output. +import { readFile } from 'node:fs/promises'; +import { createHash } from 'node:crypto'; +const manifest = JSON.parse( + await readFile(new URL('../assets/wa-sqlite/manifest.json', import.meta.url), 'utf8') +); +for (const [file, hash] of Object.entries(manifest.sha256)) { + const response = await fetch( + `https://raw.githubusercontent.com/rhashimoto/wa-sqlite/${manifest.revision}/${file}` + ); + if (!response.ok) throw new Error(`${file}: HTTP ${response.status}`); + if ( + createHash('sha256') + .update(new Uint8Array(await response.arrayBuffer())) + .digest('hex') !== hash + ) { + throw new Error(`Upstream checksum mismatch: ${file}`); + } +} diff --git a/packages/replicate/src/client/bindings/counter.ts b/packages/replicate/src/client/bindings/counter.ts index d7a484d..7e65a9f 100644 --- a/packages/replicate/src/client/bindings/counter.ts +++ b/packages/replicate/src/client/bindings/counter.ts @@ -66,7 +66,6 @@ export interface CounterBindingConfig { getMaterial: () => Record | null; } - /** * Compute counter value by summing all deltas. */ @@ -101,7 +100,17 @@ function createSyncFn( * Create a counter binding. */ export function createCounterBinding(config: CounterBindingConfig): CounterBinding { - const { collection, document, field, array, ydoc, collectionRef, clientId, debounceMs, getMaterial } = config; + const { + collection, + document, + field, + array, + ydoc, + collectionRef, + clientId, + debounceMs, + getMaterial, + } = config; if (!hasContext(collection)) { logger.warn('Cannot create counter binding - collection not initialized', { @@ -138,7 +147,7 @@ export function createCounterBinding(config: CounterBindingConfig): CounterBindi * Observer handler for Y.Array changes. */ const observerHandler = (_event: Y.YArrayEvent, transaction: Y.Transaction) => { - if (transaction.origin === SERVER_ORIGIN) { + if (transaction.origin === SERVER_ORIGIN || transaction.origin === 'replicate-persisted') { notifySubscribers(); return; } diff --git a/packages/replicate/src/client/bindings/set.ts b/packages/replicate/src/client/bindings/set.ts index 0318d72..22758ad 100644 --- a/packages/replicate/src/client/bindings/set.ts +++ b/packages/replicate/src/client/bindings/set.ts @@ -64,7 +64,6 @@ export interface SetBindingConfig { getMaterial: () => Record | null; } - /** * Create sync function for set. */ @@ -168,7 +167,7 @@ export function createSetBinding(config: SetBindingConfig): SetBinding transaction: Y.Transaction ) => { notifySubscribers(); - if (transaction.origin !== SERVER_ORIGIN) { + if (transaction.origin !== SERVER_ORIGIN && transaction.origin !== 'replicate-persisted') { sync.onLocalChange(); } }; diff --git a/packages/replicate/src/client/collection.ts b/packages/replicate/src/client/collection.ts index e5c66dc..b9460cf 100644 --- a/packages/replicate/src/client/collection.ts +++ b/packages/replicate/src/client/collection.ts @@ -1,3 +1,5 @@ +import { cleanupSyncManager } from './bindings/sync-registry'; +import { createConnection, type ConnectionOptions } from './services/connection'; import * as Y from 'yjs'; import type { Persistence, PersistenceProvider } from '$/client/persistence/types'; import type { ConvexClient } from 'convex/browser'; @@ -26,6 +28,7 @@ import { createDocumentManager, serializeDocument, extractAllDocuments, + isDocumentDeleted, } from '$/client/documents'; import { createDeleteDelta, applyDeleteMarkerToDoc } from '$/client/deltas'; import * as prose from '$/client/prose'; @@ -67,23 +70,6 @@ const logger = getLogger(['replicate', 'collection']); // Helper Functions // ============================================================================ -/** - * Higher-order function for error isolation in handlers. - * Catches errors and calls errorHandler, returning its result. - */ -const withErrorIsolation = ( - fn: (...args: T) => R, - errorHandler: (error: unknown, ...args: T) => R -) => { - return (...args: T): R => { - try { - return fn(...args); - } catch (error) { - return errorHandler(error, ...args); - } - }; -}; - import type { ProseFields } from '$/shared'; interface HttpError extends Error { @@ -164,10 +150,8 @@ interface ConvexCollectionApi { session: FunctionReference<'query'>; } -export interface ConvexCollectionConfig extends Omit< - BaseCollectionConfig, - 'schema' -> { +export interface ConvexCollectionConfig + extends Omit, 'schema'>, ConnectionOptions { validator?: GenericValidator; convexClient: ConvexClient; api: ConvexCollectionApi; @@ -274,6 +258,9 @@ export interface DocumentHandle { } interface ConvexCollectionExtensions { + connect(): Promise; + disconnect(): Promise; + reset(): Promise; doc(id: string): DocumentHandle; readonly session: SessionAPI; } @@ -289,13 +276,70 @@ export function convexCollectionOptions( validator, getKey, material, - convexClient, + convexClient: rawClient, api, persistence, user: userGetter, anonymousPresence, } = config; + const connection = createConnection(rawClient, config); + const convexClient = connection.client; + const ensureGeneration = (token: number) => { + if (stopped || token !== connection.generation) + throw new Error('Operation belongs to a disconnected generation'); + }; + const bindings = new Set<{ destroy(): void }>(); + const trackBinding = (binding: T): T => { + const token = connection.generation; + let destroyed = false; + const wrapped = new Proxy(binding, { + get(target, property) { + if (property === 'destroy') + return () => { + if (destroyed) return; + destroyed = true; + target.destroy(); + bindings.delete(wrapped); + }; + const value = Reflect.get(target, property); + if (typeof value !== 'function') return value; + return (...args: unknown[]) => { + ensureGeneration(token); + if (destroyed) throw new Error('Binding has been destroyed'); + return value.apply(target, args); + }; + }, + }); + bindings.add(wrapped); + return wrapped; + }; + const assertWritable = () => { + if (config.readOnly) throw new Error('Collection is read-only'); + }; + let startNetwork: (() => Promise) | undefined; + let work: Promise = Promise.resolve(); + let stopped = false; + let desiredConnection = config.networkMode !== 'manual'; + let disconnecting: Promise = Promise.resolve(); + const revisions = new Map(); + const durableVectors = new Map(); + const pendingCreates = new Set(); + const pendingCreateKey = (id: string) => `pending-create:${collection}:${id}`; + let retryTimer: ReturnType | undefined; + let localReady: Promise = Promise.resolve(); + const serialize = (operation: () => Promise) => { + const next = work.then(operation); + work = next.catch(() => {}); + return next; + }; + const acknowledgeCreate = (id: string, token: number) => + serialize(async () => { + ensureGeneration(token); + await persistence.kv.del(pendingCreateKey(id)); + ensureGeneration(token); + pendingCreates.delete(id); + }); const functionPath = getFunctionName(api.delta); const collection = functionPath.split(':')[0]; if (!collection) { @@ -322,6 +366,7 @@ export function convexCollectionOptions( field: ProseFields, options?: ProseOptions ): Promise { + assertWritable(); const fieldStr = field; if (!proseFieldSet.has(fieldStr)) { @@ -414,12 +459,18 @@ export function convexCollectionOptions( client: storedClientId, ydoc: subdoc, syncReady: ctx.synced, + durableVector: () => durableVectors.get(document), user: options?.user ?? ctx.userGetter, throttleMs: options?.throttleMs, anonymousPresence: ctx.anonymousPresence, }); } + if (presenceProvider) { + const providers = editorPresenceProviders.get(document) ?? new Set(); + providers.add(presenceProvider); + editorPresenceProviders.set(document, providers); + } const binding: EditorBinding = { fragment, provider: presenceProvider @@ -436,10 +487,11 @@ export function convexCollectionOptions( destroy() { presenceProvider?.destroy(); + if (presenceProvider) editorPresenceProviders.get(document)?.delete(presenceProvider); }, }; - return binding; + return trackBinding(binding); }, /** @@ -450,6 +502,7 @@ export function convexCollectionOptions( field: string, options?: { debounceMs?: number } ): Promise { + assertWritable(); const fieldStr = String(field); const crdtInfo = crdtFields.get(fieldStr); @@ -490,18 +543,20 @@ export function convexCollectionOptions( throw new Error(`Client ID not available`); } - return createCounterBinding({ - collection, - document, - field: fieldStr, - array, - ydoc: subdoc, - ymap: fieldsMap, - collectionRef, - clientId: ctx.clientId, - debounceMs: options?.debounceMs, - getMaterial: () => serializeDocument(ctx.docManager, document), - }); + return trackBinding( + createCounterBinding({ + collection, + document, + field: fieldStr, + array, + ydoc: subdoc, + ymap: fieldsMap, + collectionRef, + clientId: ctx.clientId, + debounceMs: options?.debounceMs, + getMaterial: () => serializeDocument(ctx.docManager, document), + }) + ); }, /** @@ -512,6 +567,7 @@ export function convexCollectionOptions( field: string, options?: { resolve?: (conflict: unknown) => T } ): Promise> { + assertWritable(); const fieldStr = String(field); const crdtInfo = crdtFields.get(fieldStr); @@ -549,11 +605,13 @@ export function convexCollectionOptions( (ctx.crdtResolvers?.get(fieldStr) as ((conflict: unknown) => T) | undefined) ?? ((c: { latest: () => T }) => c.latest()); - return createRegisterBinding({ - ymap: map, - clientId: ctx.clientId, - resolve, - }); + return trackBinding( + createRegisterBinding({ + ymap: map, + clientId: ctx.clientId, + resolve, + }) + ); }, /** @@ -568,6 +626,7 @@ export function convexCollectionOptions( debounceMs?: number; } ): Promise> { + assertWritable(); const fieldStr = String(field); const crdtInfo = crdtFields.get(fieldStr); @@ -604,25 +663,37 @@ export function convexCollectionOptions( throw new Error(`Client ID not available`); } - return createSetBinding({ - collection, - document, - field: fieldStr, - ymap: map, - ydoc: subdoc, - fieldsMap, - collectionRef, - clientId: ctx.clientId, - serialize: options.serialize, - deserialize: options.deserialize, - debounceMs: options.debounceMs, - getMaterial: () => serializeDocument(ctx.docManager, document), - }); + return trackBinding( + createSetBinding({ + collection, + document, + field: fieldStr, + ymap: map, + ydoc: subdoc, + fieldsMap, + collectionRef, + clientId: ctx.clientId, + serialize: options.serialize, + deserialize: options.deserialize, + debounceMs: options.debounceMs, + getMaterial: () => serializeDocument(ctx.docManager, document), + }) + ); }, }; const documentHandles = new Map>(); const presenceProviders = new Map(); + const editorPresenceProviders = new Map>(); + const removeDocument = async (id: string) => { + await docManager.remove(id); + presenceProviders.get(id)?.destroy(); + presenceProviders.delete(id); + for (const provider of editorPresenceProviders.get(id) ?? []) provider.destroy(); + editorPresenceProviders.delete(id); + documentHandles.delete(id); + durableVectors.delete(id); + }; const getOrCreateDocumentHandle = (documentId: string): DocumentHandle => { let handle = documentHandles.get(documentId); @@ -649,6 +720,7 @@ export function convexCollectionOptions( client: ctx.clientId, ydoc: subdoc, syncReady: ctx.synced, + durableVector: () => durableVectors.get(documentId), user: ctx.userGetter, anonymousPresence: ctx.anonymousPresence, }); @@ -683,7 +755,7 @@ export function convexCollectionOptions( let sessionUnsubscribe: (() => void) | null = null; const initSessionSubscription = (): void => { - if (sessionUnsubscribe) return; + if (sessionUnsubscribe || !connection.active) return; const ctx = hasContext(collection) ? getContext(collection) : null; if (!ctx?.client || !ctx?.api?.session) return; @@ -721,6 +793,58 @@ export function convexCollectionOptions( }; const extensions: ConvexCollectionExtensions = { + async connect() { + const requestedGeneration = connection.generation; + desiredConnection = true; + await disconnecting; + await localReady; + if (stopped) throw new Error('Collection has been cleaned up'); + if (!desiredConnection || requestedGeneration !== connection.generation) return; + if (connection.active) return; + connection.connect(); + await startNetwork?.(); + }, + async disconnect() { + desiredConnection = false; + for (const binding of bindings) binding.destroy(); + prose.cleanup(collection); + cleanupSyncManager(collection); + clearTimeout(retryTimer); + connection.disconnect(); + sessionUnsubscribe?.(); + sessionUnsubscribe = null; + sessionCache = []; + for (const provider of presenceProviders.values()) provider.destroy(); + presenceProviders.clear(); + for (const providers of editorPresenceProviders.values()) + for (const provider of providers) provider.destroy(); + editorPresenceProviders.clear(); + documentHandles.clear(); + disconnecting = (async () => { + await localReady; + await work; + await docManager.flush(); + })(); + await disconnecting; + }, + async reset() { + const drained = extensions.disconnect(); + disconnecting = drained.then(() => + serialize(async () => { + for (const id of await persistence.listDocuments(collection)) docManager.getOrCreate(id); + for (const id of docManager.documents()) { + await removeDocument(id); + await persistence.kv.del(pendingCreateKey(id)); + } + for (const id of pendingCreates) await persistence.kv.del(pendingCreateKey(id)); + pendingCreates.clear(); + revisions.clear(); + await seqService.clear(collection); + ops.replace([]); + }) + ); + await disconnecting; + }, doc(id: string): DocumentHandle { return getOrCreateDocumentHandle(id); }, @@ -745,6 +869,19 @@ export function convexCollectionOptions( // Bound replicate operations - set during sync initialization // Used by onDelete and other handlers that need to sync with TanStack DB let ops: BoundReplicateOps = null as any; + const publishDocuments = (ids: Iterable) => { + const upserts: DataType[] = []; + const removals: DataType[] = []; + for (const id of ids) { + const item = isDocumentDeleted(docManager, id) + ? null + : serializeDocument(docManager, id, crdtFields); + if (item) upserts.push(item as DataType); + else removals.push({ id } as DataType); + } + if (removals.length) ops.delete(removals); + if (upserts.length) ops.upsert(upserts); + }; // Transaction coordinator for atomic client-side mutations with rollback // Ensures delete operations are atomic: if server call fails, local state is rolled back @@ -771,55 +908,61 @@ export function convexCollectionOptions( }); const recover = async (pushLocal = false): Promise => { + const token = connection.generation; const docIds = docManager.documents(); - if (docIds.length === 0) return; - - logger.debug('Starting recovery for documents', { collection, count: docIds.length }); - - const recoveryPromises = docIds.map(async (docId) => { - try { - const vector = docManager.encodeStateVector(docId); - const result = await convexClient.query(api.delta, { - document: docId, - vector: vector.buffer as ArrayBuffer, - }); - - if (result.mode === 'recovery' && result.diff) { - const update = new Uint8Array(result.diff); - docManager.applyUpdate(docId, update, YjsOrigin.Server); - logger.debug('Applied server diff during recovery', { document: docId, collection }); - } - - // Only push local state when explicitly requested (reconnection scenario) - // On init, we only pull server diff - pushing would flood the mutation queue - if (pushLocal) { - const ydoc = docManager.get(docId); - if (ydoc) { - const localState = Y.encodeStateAsUpdateV2(ydoc); + await Promise.all( + docIds.map(async (docId) => { + try { + const original = docManager.get(docId); + const revision = revisions.get(docId); + const vector = docManager.encodeStateVector(docId); + const result = await convexClient.query(api.delta, { + document: docId, + vector: vector.buffer as ArrayBuffer, + }); + let validRecovery = false; + await serialize(async () => { + if ( + !connection.active || + token !== connection.generation || + docManager.get(docId) !== original || + revisions.get(docId) !== revision + ) + return; + if (result.mode !== 'recovery') return; + validRecovery = true; + if (result.exists === false) { + if (!config.readOnly && (pendingCreates.has(docId) || result.known === false)) return; + await removeDocument(docId); + } else if (result.diff) { + await docManager.applyRemote(docId, new Uint8Array(result.diff)); + } else return; + publishDocuments([docId]); + }); + if ( + validRecovery && + revisions.get(docId) === revision && + (pushLocal || pendingCreates.has(docId)) && + !config.readOnly && + connection.active && + token === connection.generation + ) { + const ydoc = docManager.get(docId); const material = serializeDocument(docManager, docId); - - if (material && localState.length > 0) { + if (ydoc && material) await convexClient.mutation(api.replicate, { document: docId, - bytes: localState.buffer as ArrayBuffer, + bytes: Y.encodeStateAsUpdateV2(ydoc).buffer as ArrayBuffer, material, - type: 'update', + type: result.exists === false ? 'insert' : 'update', }); - logger.debug('Pushed local changes during recovery', { document: docId, collection }); - } + await acknowledgeCreate(docId, token); } + } catch (error) { + logger.warn('Recovery failed', { collection, document: docId, error }); } - } catch (error) { - logger.warn('Recovery failed for document', { - document: docId, - collection, - error: error instanceof Error ? error.message : String(error), - }); - } - }); - - await Promise.all(recoveryPromises); - logger.debug('Recovery completed', { collection, count: docIds.length }); + }) + ); }; const applyYjsInsert = (mutations: CollectionMutation[]): Uint8Array[] => { @@ -827,6 +970,7 @@ export function convexCollectionOptions( for (const mut of mutations) { const document = String(mut.key); + revisions.set(document, (revisions.get(document) ?? 0) + 1); const delta = docManager.transactWithDelta( document, (fieldsMap) => { @@ -868,6 +1012,7 @@ export function convexCollectionOptions( for (const mut of mutations) { const document = String(mut.key); + revisions.set(document, (revisions.get(document) ?? 0) + 1); const fieldsMap = docManager.getFields(document); if (!fieldsMap) { @@ -929,6 +1074,7 @@ export function convexCollectionOptions( for (const mut of mutations) { const document = String(mut.key); + revisions.set(document, (revisions.get(document) ?? 0) + 1); const ydoc = docManager.get(document); if (ydoc) { @@ -950,10 +1096,24 @@ export function convexCollectionOptions( extensions, onInsert: async ({ transaction }: CollectionTransaction) => { + assertWritable(); + const mutationGeneration = connection.generation; + await persistenceReadyPromise; + ensureGeneration(mutationGeneration); + await serialize(async () => { + ensureGeneration(mutationGeneration); + for (const mutation of transaction.mutations) { + const id = String(mutation.key); + pendingCreates.add(id); + await persistence.kv.set(pendingCreateKey(id), true); + } + }); + ensureGeneration(mutationGeneration); const deltas = applyYjsInsert(transaction.mutations); try { await Promise.all([persistenceReadyPromise, optimisticReadyPromise]); + ensureGeneration(mutationGeneration); // Process mutations in parallel for better performance await Promise.all( @@ -962,17 +1122,20 @@ export function convexCollectionOptions( if (!delta || delta.length === 0) return; const document = String(mut.key); + revisions.set(document, (revisions.get(document) ?? 0) + 1); const materializedDoc = serializeDocument(docManager, document); if (!materializedDoc) { throw new Error(`Cannot serialize document ${document} for insert`); } + ensureGeneration(mutationGeneration); await convexClient.mutation(api.replicate, { document: document, bytes: delta.buffer, material: materializedDoc, type: 'insert', }); + await acknowledgeCreate(document, mutationGeneration); }) ); } catch (error) { @@ -981,6 +1144,8 @@ export function convexCollectionOptions( }, onUpdate: async ({ transaction }: CollectionTransaction) => { + assertWritable(); + const mutationGeneration = connection.generation; const mutation = transaction.mutations[0]; const documentKey = String(mutation.key); @@ -991,9 +1156,11 @@ export function convexCollectionOptions( try { await Promise.all([persistenceReadyPromise, optimisticReadyPromise]); + ensureGeneration(mutationGeneration); if (isContentSync && metadata?.contentSync) { const { bytes, material } = metadata.contentSync; + ensureGeneration(mutationGeneration); await convexClient.mutation(api.replicate, { document: documentKey, bytes, @@ -1016,6 +1183,7 @@ export function convexCollectionOptions( throw new Error(`Cannot serialize document ${docId} for update`); } + ensureGeneration(mutationGeneration); await convexClient.mutation(api.replicate, { document: docId, bytes: delta.buffer, @@ -1031,8 +1199,11 @@ export function convexCollectionOptions( }, onDelete: async ({ transaction }: CollectionTransaction) => { + assertWritable(); + const mutationGeneration = connection.generation; try { await Promise.all([persistenceReadyPromise, optimisticReadyPromise]); + ensureGeneration(mutationGeneration); if (!txCoordinator) { // Fallback to non-transactional delete if coordinator not ready @@ -1048,6 +1219,7 @@ export function convexCollectionOptions( const delta = deltas[i]; if (!delta || delta.length === 0) return; + ensureGeneration(mutationGeneration); await convexClient.mutation(api.replicate, { document: String(mut.key), bytes: delta.buffer, @@ -1095,6 +1267,7 @@ export function convexCollectionOptions( } // Call server mutation - if this fails, transaction will rollback + ensureGeneration(mutationGeneration); await convexClient.mutation(api.replicate, { document: documentId, bytes: delta.buffer, @@ -1109,7 +1282,7 @@ export function convexCollectionOptions( }, sync: { - rowUpdateMode: 'partial', + rowUpdateMode: 'full', sync: (params: any) => { const { markReady, collection: collectionInstance } = params; @@ -1125,13 +1298,15 @@ export function convexCollectionOptions( const ssrDocuments = material?.documents; type CrdtRecord = Record; const ssrCrdt = material?.crdt as CrdtRecord | undefined; - const ssrCursor = material?.cursor; const docs: DataType[] = ssrDocuments ? [...ssrDocuments] : []; - (async () => { + localReady = (async () => { try { const existingDocIds = await persistence.listDocuments(collection); + if (stopped) return; for (const docId of existingDocIds) { + if (await persistence.kv.get(pendingCreateKey(docId))) pendingCreates.add(docId); + if (stopped) return; docManager.getOrCreate(docId); } @@ -1139,10 +1314,12 @@ export function convexCollectionOptions( return persistence.createDocPersistence(`${collection}:${document}`, ydoc); }); await Promise.all(docPromises); + if (stopped) return; resolvePersistenceReady?.(); const clientId = await getClientId(persistence.kv); + if (stopped) return; updateContext(collection, { clientId }); ops = createReplicateOps(params); @@ -1196,12 +1373,10 @@ export function convexCollectionOptions( if (ssrCrdt) { for (const [docId, state] of Object.entries(ssrCrdt)) { const update = new Uint8Array(state.bytes); - docManager.applyUpdate(docId, update, YjsOrigin.Server); + await docManager.applyRemote(docId, update); } } - await recover(); - const docIds = docManager.documents(); if (docIds.length > 0) { const items = extractAllDocuments(docManager, crdtFields) as DataType[]; @@ -1213,215 +1388,87 @@ export function convexCollectionOptions( markReady(); getContext(collection).resolve?.(); - const persistedCursor = await seqService.load(collection); - let cursor = ssrCursor ?? persistedCursor; - - if (cursor > 0 && docManager.documents().length === 0) { - cursor = 0; - persistence.kv.set(`cursor:${collection}`, 0); - } - - // Signal that sync is ready (no actor system needed - sync manager is self-contained) getContext(collection).resolveActorReady?.(); - - // Returns { item, isNew, isDelete } for batching, null if no action needed - type ChangeResult = { - item: DataType; - isNew: boolean; - isDelete: boolean; - } | null; - - // Clean up presence provider when a document is deleted - const cleanupDocumentPresence = (documentId: string) => { - const provider = presenceProviders.get(documentId); - if (provider) { - provider.destroy(); - presenceProviders.delete(documentId); - } - documentHandles.delete(documentId); - }; - - const handleSnapshotChange = withErrorIsolation( - (bytes: ArrayBuffer, document: string, exists: boolean): ChangeResult => { - const hadLocally = docManager.has(document); - - if (!exists && hadLocally) { - const itemBefore = serializeDocument(docManager, document, crdtFields); - docManager.delete(document); - cleanupDocumentPresence(document); - if (itemBefore) { - return { item: itemBefore as DataType, isNew: false, isDelete: true }; - } - return null; - } - - if (!exists && !hadLocally) { - return null; - } - - // Apply update - use hadLocally for existence check (avoid double serialization) - const update = new Uint8Array(bytes); - docManager.applyUpdate(document, update, YjsOrigin.Server); - const itemAfter = serializeDocument(docManager, document, crdtFields); - - if (itemAfter) { - return { item: itemAfter as DataType, isNew: !hadLocally, isDelete: false }; - } else if (hadLocally) { - // Serialization failed - log warning but don't return item - logger.warn('Document serialization returned null after snapshot update', { - document, - collection, - hadFieldsAfter: !!docManager.getFields(document), - }); - } - return null; - }, - (error, _bytes, document) => { - logger.error('Error processing snapshot change', { document, collection, error }); - return null; - } - ); - - const handleDeltaChange = withErrorIsolation( - (bytes: ArrayBuffer, document: string | undefined, exists: boolean): ChangeResult => { - if (!document) { - return null; - } - - const hadLocally = docManager.has(document); - - if (!exists && hadLocally) { - const itemBefore = serializeDocument(docManager, document, crdtFields); - docManager.delete(document); - cleanupDocumentPresence(document); - if (itemBefore) { - return { item: itemBefore as DataType, isNew: false, isDelete: true }; - } - return null; - } - - if (!exists && !hadLocally) { - return null; - } - - // Apply update - use hadLocally for existence check (avoid double serialization) - const update = new Uint8Array(bytes); - docManager.applyUpdate(document, update, YjsOrigin.Server); - const itemAfter = serializeDocument(docManager, document, crdtFields); - - if (itemAfter) { - return { item: itemAfter as DataType, isNew: !hadLocally, isDelete: false }; - } else if (hadLocally) { - // Serialization failed - log warning but don't return item - logger.warn('Document serialization returned null after delta update', { - document, - collection, - hadFieldsAfter: !!docManager.getFields(document), - }); - } - return null; - }, - (error, _bytes, document) => { - logger.error('Error processing delta change', { document, collection, error }); - return null; - } - ); - - let lastProcessedSeq = cursor; - - const handleSubscriptionUpdate = async (response: any) => { - if (!response || !Array.isArray(response.changes)) { - return; - } - - const { changes, seq: newSeq } = response; - - // Skip if we've already processed up to this seq — prevents - // re-enqueuing presence marks on subscription re-fires (e.g. reconnect) - if (newSeq !== undefined && newSeq <= lastProcessedSeq) { - return; - } - - const syncedDocuments = new Set(); - - // Process all changes and collect results for batching - const toInsert: DataType[] = []; - const toUpsert: DataType[] = []; - const toDelete: DataType[] = []; - - for (const change of changes) { - const { type, bytes, document, exists } = change; - if (!bytes || !document) { - continue; - } - - syncedDocuments.add(document); - - const result = - type === 'snapshot' - ? handleSnapshotChange(bytes, document, exists ?? true) - : handleDeltaChange(bytes, document, exists ?? true); - - if (result) { - if (result.isDelete) { - toDelete.push(result.item); - } else if (result.isNew) { - toInsert.push(result.item); - } else { - toUpsert.push(result.item); - } - } - } - - // Batch ops calls - single transaction instead of N separate calls - if (toDelete.length > 0) ops.delete(toDelete); - if (toInsert.length > 0) ops.insert(toInsert); - if (toUpsert.length > 0) ops.upsert(toUpsert); - - if (newSeq !== undefined) { - lastProcessedSeq = newSeq; - persistence.kv.set(`cursor:${collection}`, newSeq); - - // Mark presence for synced documents using background sync queue - // The queue provides retry with exponential backoff on transient failures - for (const document of syncedDocuments) { - syncQueue.enqueue(`presence:${document}`, async () => { - const vector = docManager.encodeStateVector(document); - await convexClient.mutation(api.presence, { - document, - client: clientId, - action: 'mark', - seq: newSeq, - vector: vector.buffer as ArrayBuffer, - }); - }); - } - - // Resubscribe with the advanced cursor so the reactive query - // only returns genuinely new deltas, not ones we've already processed. - // Without this, reconnection or any table change causes the query - // to re-fire with ALL deltas since the original cursor. + startNetwork = async () => { + const token = connection.generation; + let cursor = await seqService.load(collection); + if (stopped || !connection.active || token !== connection.generation) return; + // Recovery never delays publishing persisted local rows or starting discovery. + void recover(); + const subscribe = () => { + if (!connection.active || token !== connection.generation) return; subscription?.(); subscription = convexClient.onUpdate( api.delta, - { seq: newSeq, limit: 1000 }, + { seq: cursor, limit: 1000 }, (response: any) => { - handleSubscriptionUpdate(response); + void serialize(async () => { + if (!connection.active || token !== connection.generation) return; + if (!response || !Array.isArray(response.changes) || response.seq <= cursor) + return; + const documents = new Set(); + for (const change of response.changes) { + if (change.seq <= cursor) continue; + if (!change.document) + throw new Error('Stream change is missing its document'); + documents.add(change.document); + revisions.set(change.document, (revisions.get(change.document) ?? 0) + 1); + if (change.exists === false) { + await removeDocument(change.document); + } else { + if (!change.bytes) throw new Error('Stream change is missing its update'); + await docManager.applyRemote( + change.document, + new Uint8Array(change.bytes) + ); + } + } + const acknowledgements = [...documents].map((document) => ({ + document, + vector: docManager.encodeStateVector(document), + })); + await docManager.flush(documents); + // Disconnect drains this accepted local work. Publish its durable + // rows even if it cancels the subsequent checkpoint/acknowledgement. + publishDocuments(documents); + if (!connection.active || token !== connection.generation) return; + await seqService.save(collection, response.seq); + if (!connection.active || token !== connection.generation) return; + cursor = response.seq; + for (const { document, vector } of acknowledgements) { + durableVectors.set(document, vector.buffer as ArrayBuffer); + syncQueue.enqueue(`presence:${document}`, async () => { + if (!connection.active || token !== connection.generation) return; + await convexClient.mutation(api.presence, { + document, + client: clientId, + action: 'mark', + seq: response.seq, + vector: vector.buffer as ArrayBuffer, + }); + }); + } + subscribe(); + }).catch((error) => { + logger.error('Stream persistence failed; retrying from durable cursor', { + collection, + error, + }); + if (connection.active && token === connection.generation) { + clearTimeout(retryTimer); + retryTimer = setTimeout(subscribe, 1000); + } + }); } ); - } + }; + subscribe(); + if (sessionSubscribers.size) initSessionSubscription(); }; - - // Subscribe to the delta stream. Convex handles reactivity — - // when new deltas are written to the server, the query re-evaluates - // and the callback fires with the updated result automatically. - subscription = convexClient.onUpdate( - api.delta, - { seq: cursor, limit: 1000 }, - (response: any) => { - handleSubscriptionUpdate(response); - } - ); + if (desiredConnection && !stopped) { + connection.connect(); + void startNetwork(); + } // Reconnection handling: when browser comes back online, resync local state if (typeof globalThis.window !== 'undefined') { @@ -1431,7 +1478,7 @@ export function convexCollectionOptions( logger.debug('Network offline detected', { collection }); }; const handleOnline = () => { - if (wasOffline) { + if (wasOffline && connection.active) { logger.info('Network online restored, running recovery sync', { collection }); wasOffline = false; recover(true).catch((error: Error) => { @@ -1470,6 +1517,9 @@ export function convexCollectionOptions( return { material: docs, cleanup: () => { + stopped = true; + clearTimeout(retryTimer); + connection.disconnect(); // Clean up reconnection listeners if stored in context if (hasContext(collection)) { const ctx = getContext(collection); @@ -1483,6 +1533,9 @@ export function convexCollectionOptions( provider.destroy(); } presenceProviders.clear(); + for (const providers of editorPresenceProviders.values()) + for (const provider of providers) provider.destroy(); + editorPresenceProviders.clear(); documentHandles.clear(); deleteContext(collection); docPersistence?.destroy(); @@ -1525,7 +1578,7 @@ export type ConvexCollection = Collection< ConvexCollectionExtensions; /** Options for collection.create() */ -export interface CreateCollectionOptions { +export interface CreateCollectionOptions extends ConnectionOptions { schema: VersionedSchema; persistence: () => Promise; config: () => { @@ -1592,6 +1645,9 @@ function createVersionedCollection( api: userConfig.api, getKey: userConfig.getKey, user: userConfig.user, + networkMode: options.networkMode, + readOnly: options.readOnly, + requestArgs: options.requestArgs, } as LazyCollectionConfig; if (isPaginatedMaterial(mat)) { diff --git a/packages/replicate/src/client/documents.ts b/packages/replicate/src/client/documents.ts index 19b6855..acb74ad 100644 --- a/packages/replicate/src/client/documents.ts +++ b/packages/replicate/src/client/documents.ts @@ -12,10 +12,13 @@ export interface DocumentManager { getOrCreate(id: string): Y.Doc; has(id: string): boolean; delete(id: string): void; + remove(id: string): Promise; + flush(ids?: Iterable): Promise; getFields(id: string): Y.Map | null; getFragment(id: string, field: string): Y.XmlFragment | null; + applyRemote(id: string, update: Uint8Array): Promise; applyUpdate(id: string, update: Uint8Array, origin?: string): void; encodeState(id: string): Uint8Array; encodeStateVector(id: string): Uint8Array; @@ -72,6 +75,26 @@ export function createDocumentManager(collection: string): DocumentManager { } }, + async remove(id: string): Promise { + const provider = persistence.get(id); + if (provider && !provider.clear) { + throw new Error('PersistenceProvider.clear() is required for durable removal'); + } + await provider?.clear?.(); + this.delete(id); + }, + + async flush(ids: Iterable = persistence.keys()): Promise { + for (const id of ids) { + const provider = persistence.get(id); + if (!provider) continue; + await provider.whenSynced; + if (!provider.flush) + throw new Error('PersistenceProvider.flush() is required for durable progress'); + await provider.flush(); + } + }, + getFields(id: string): Y.Map | null { const doc = docs.get(id); return doc ? doc.getMap('fields') : null; @@ -89,6 +112,20 @@ export function createDocumentManager(collection: string): DocumentManager { return null; }, + async applyRemote(id: string, update: Uint8Array): Promise { + const doc = this.getOrCreate(id); + const provider = persistence.get(id); + if (provider) { + if (!provider.storeUpdate) + throw new Error( + 'PersistenceProvider.storeUpdate() is required for durable remote updates' + ); + await provider.whenSynced; + await provider.storeUpdate(update); + } + Y.applyUpdateV2(doc, update, 'replicate-persisted'); + }, + applyUpdate(id: string, update: Uint8Array, origin?: string): void { const doc = this.getOrCreate(id); Y.applyUpdateV2(doc, update, origin); diff --git a/packages/replicate/src/client/persistence/custom.ts b/packages/replicate/src/client/persistence/custom.ts index 5fbc7fd..13c58ec 100644 --- a/packages/replicate/src/client/persistence/custom.ts +++ b/packages/replicate/src/client/persistence/custom.ts @@ -1,3 +1,4 @@ +import { PersistenceWrites } from './writes.js'; import * as Y from 'yjs'; import type { StorageAdapter, Persistence, PersistenceProvider, KeyValueStore } from './types.js'; @@ -26,6 +27,7 @@ class AdapterKeyValueStore implements KeyValueStore { class AdapterPersistenceProvider implements PersistenceProvider { private updateHandler: (update: Uint8Array, origin: unknown) => void; private updateCounter = 0; + private writes = new PersistenceWrites(); readonly whenSynced: Promise; constructor( @@ -36,8 +38,11 @@ class AdapterPersistenceProvider implements PersistenceProvider { this.whenSynced = this.loadState(); this.updateHandler = (update: Uint8Array, origin: unknown) => { - if (origin !== 'custom') { - void this.saveUpdate(update); + if (origin !== 'custom' && origin !== 'replicate-persisted') { + this.writes.add(async () => { + await this.whenSynced; + await this.saveUpdate(update); + }); } }; this.ydoc.on('update', this.updateHandler); @@ -70,6 +75,29 @@ class AdapterPersistenceProvider implements PersistenceProvider { await this.adapter.set(`${UPDATE_PREFIX}${this.collection}:${paddedCounter}`, update); } + async storeUpdate(update: Uint8Array): Promise { + const bytes = Y.convertUpdateFormatV2ToV1(update); + this.writes.add(async () => { + await this.whenSynced; + await this.saveUpdate(bytes); + }); + await this.flush(); + } + + async flush(): Promise { + await this.whenSynced; + await this.writes.flush(); + } + + async clear(): Promise { + this.destroy(); + await this.flush(); + await this.adapter.delete(`${SNAPSHOT_PREFIX}${this.collection}`); + for (const key of await this.adapter.keys(`${UPDATE_PREFIX}${this.collection}:`)) { + await this.adapter.delete(key); + } + } + destroy(): void { this.ydoc.off('update', this.updateHandler); } diff --git a/packages/replicate/src/client/persistence/encrypted/web.ts b/packages/replicate/src/client/persistence/encrypted/web.ts index c880e4a..7858db7 100644 --- a/packages/replicate/src/client/persistence/encrypted/web.ts +++ b/packages/replicate/src/client/persistence/encrypted/web.ts @@ -1,3 +1,4 @@ +import { PersistenceWrites } from '../writes.js'; import * as Y from 'yjs'; import type { Persistence, PersistenceProvider, KeyValueStore } from '../types.js'; import type { WebEncryptionConfig, EncryptionPersistence, EncryptionState } from './types.js'; @@ -80,25 +81,23 @@ class EncryptedKeyValueStore implements KeyValueStore { class EncryptedPersistenceProvider implements PersistenceProvider { private updateHandler: (update: Uint8Array, origin: unknown) => void; - private pendingWrites: Promise[] = []; + private writes = new PersistenceWrites(); readonly whenSynced: Promise; constructor( private innerStorage: Persistence, private collection: string, private ydoc: Y.Doc, - private encryptionKey: CryptoKey + private encryptionKey: CryptoKey, + private index: (name: string, remove?: boolean) => Promise ) { this.whenSynced = this.loadState(); this.updateHandler = (update: Uint8Array, origin: unknown) => { - if (origin !== 'encrypted-load') { - const writePromise = this.saveUpdate(update).catch((err: Error) => { - console.error('[EncryptedPersistence] Save failed:', err); - }); - this.pendingWrites.push(writePromise); - writePromise.finally(() => { - this.pendingWrites = this.pendingWrites.filter((p) => p !== writePromise); + if (origin !== 'encrypted-load' && origin !== 'replicate-persisted') { + this.writes.add(async () => { + await this.whenSynced; + await this.saveUpdate(update); }); } }; @@ -126,6 +125,7 @@ class EncryptedPersistenceProvider implements PersistenceProvider { private async saveUpdate(update: Uint8Array): Promise { const deltasKey = `${DOC_PREFIX}${this.collection}:deltas`; + await this.index(this.collection); const encrypted = await encrypt(this.encryptionKey, update); const existingDeltas = (await this.innerStorage.kv.get(deltasKey)) ?? []; @@ -133,15 +133,15 @@ class EncryptedPersistenceProvider implements PersistenceProvider { await this.innerStorage.kv.set(deltasKey, existingDeltas); if (existingDeltas.length >= 50) { - await this.compact(); + await this.compact(update); } } - private async compact(): Promise { + private async compact(update: Uint8Array): Promise { const snapshotKey = `${DOC_PREFIX}${this.collection}:snapshot`; const deltasKey = `${DOC_PREFIX}${this.collection}:deltas`; - const snapshot = Y.encodeStateAsUpdate(this.ydoc); + const snapshot = Y.mergeUpdates([Y.encodeStateAsUpdate(this.ydoc), update]); const encrypted = await encrypt(this.encryptionKey, snapshot); await this.innerStorage.kv.set(snapshotKey, Array.from(encrypted)); @@ -149,7 +149,24 @@ class EncryptedPersistenceProvider implements PersistenceProvider { } async flush(): Promise { - await Promise.all(this.pendingWrites); + await this.whenSynced; + await this.writes.flush(); + } + + async storeUpdate(update: Uint8Array): Promise { + this.writes.add(async () => { + await this.whenSynced; + await this.saveUpdate(Y.convertUpdateFormatV2ToV1(update)); + }); + await this.flush(); + } + + async clear(): Promise { + this.destroy(); + await this.flush(); + await this.innerStorage.kv.del(`${DOC_PREFIX}${this.collection}:snapshot`); + await this.innerStorage.kv.del(`${DOC_PREFIX}${this.collection}:deltas`); + await this.index(this.collection, true); } destroy(): void { @@ -280,6 +297,19 @@ export async function createWebEncryptionPersistence( throw new Error('No unlock method configured'); }; + const indexWrites = new PersistenceWrites(); + const index = async (name: string, remove = false) => { + indexWrites.add(async () => { + const separator = name.indexOf(':'); + const key = `enc:documents:${name.slice(0, separator)}`; + const id = name.slice(separator + 1); + const ids = new Set((await storage.kv.get(key)) ?? []); + if (remove) ids.delete(id); + else ids.add(id); + await storage.kv.set(key, [...ids]); + }); + await indexWrites.flush(); + }; const encryptedKv = new EncryptedKeyValueStore(storage.kv, () => encryptionKey); return { @@ -306,12 +336,13 @@ export async function createWebEncryptionPersistence( if (!encryptionKey) { throw new Error('Encryption locked - call unlock() first'); } - return new EncryptedPersistenceProvider(storage, collection, ydoc, encryptionKey); + return new EncryptedPersistenceProvider(storage, collection, ydoc, encryptionKey, index); }, async listDocuments(prefix: string): Promise { - const keys = await storage.listDocuments(prefix); - return keys; + const existing = await storage.listDocuments(prefix); + const indexed = (await storage.kv.get(`enc:documents:${prefix}`)) ?? []; + return [...new Set([...existing, ...indexed])]; }, kv: encryptedKv, diff --git a/packages/replicate/src/client/persistence/memory.ts b/packages/replicate/src/client/persistence/memory.ts index 2b02e94..089c9da 100644 --- a/packages/replicate/src/client/persistence/memory.ts +++ b/packages/replicate/src/client/persistence/memory.ts @@ -33,6 +33,10 @@ class MemoryKeyValueStore implements KeyValueStore { class MemoryPersistenceProvider implements PersistenceProvider { readonly whenSynced = Promise.resolve(); + async storeUpdate(_update: Uint8Array): Promise {} + async flush(): Promise {} + async clear(): Promise {} + destroy(): void { // No resources to clean up } diff --git a/packages/replicate/src/client/persistence/sqlite/preload.ts b/packages/replicate/src/client/persistence/sqlite/preload.ts index 7c38191..ec687fb 100644 --- a/packages/replicate/src/client/persistence/sqlite/preload.ts +++ b/packages/replicate/src/client/persistence/sqlite/preload.ts @@ -30,8 +30,8 @@ export const WASM_URL = `${CDN_BASE}/dist/wa-sqlite-async.wasm`; * * ``` */ -export function preloadLinks(): string { - return ``; +export function preloadLinks(assetBase = CDN_BASE): string { + return ``; } /** @@ -49,16 +49,17 @@ export function preloadLinks(): string { * * @returns A promise resolving to the compiled WebAssembly.Module */ -let _compiled: Promise | null = null; +const compiled = new Map>(); -export function compileWasmModule(): Promise { - if (typeof window === 'undefined') { - return Promise.reject(new Error('compileWasmModule is browser-only')); +export function compileWasmModule(assetBase = CDN_BASE): Promise { + const url = `${assetBase.replace(/\/$/, '')}/dist/wa-sqlite-async.wasm`; + let result = compiled.get(url); + if (!result) { + result = WebAssembly.compileStreaming(fetch(url)); + compiled.set(url, result); + void result.catch(() => compiled.delete(url)); } - if (!_compiled) { - _compiled = WebAssembly.compileStreaming(fetch(WASM_URL)); - } - return _compiled; + return result; } /** @@ -73,7 +74,7 @@ export function compileWasmModule(): Promise { * injectPreloadLinks(); * ``` */ -export function injectPreloadLinks(): void { +export function injectPreloadLinks(assetBase = CDN_BASE): void { if (typeof document === 'undefined') return; const link = document.createElement('link'); @@ -81,6 +82,6 @@ export function injectPreloadLinks(): void { link.as = 'fetch'; link.type = 'application/wasm'; link.crossOrigin = 'anonymous'; - link.href = WASM_URL; + link.href = `${assetBase.replace(/\/$/, '')}/dist/wa-sqlite-async.wasm`; document.head.appendChild(link); } diff --git a/packages/replicate/src/client/persistence/sqlite/schema.ts b/packages/replicate/src/client/persistence/sqlite/schema.ts index dc44a56..93275f5 100644 --- a/packages/replicate/src/client/persistence/sqlite/schema.ts +++ b/packages/replicate/src/client/persistence/sqlite/schema.ts @@ -1,3 +1,4 @@ +import { PersistenceWrites } from '../writes.js'; import * as Y from 'yjs'; import type { Persistence, @@ -8,7 +9,7 @@ import type { export interface Executor { execute(sql: string, params?: unknown[]): Promise<{ rows: Record[] }>; - close(): void; + close(): void | Promise; } export async function initSchema(executor: Executor): Promise { @@ -90,40 +91,46 @@ class SqliteMigrationDatabase implements MigrationDatabase { class SqlitePersistenceProvider implements PersistenceProvider { private updateHandler: (update: Uint8Array, origin: unknown) => void; - private pendingWrites: Promise[] = []; - private lastError: Error | null = null; + private writes = new PersistenceWrites(); readonly whenSynced: Promise; constructor( private executor: Executor, private collection: string, - private ydoc: Y.Doc, - private onError?: (error: Error) => void + private ydoc: Y.Doc ) { this.whenSynced = this.loadState(); this.updateHandler = (update: Uint8Array, origin: unknown) => { - if (origin !== 'sqlite') { - const writePromise = this.saveUpdate(update).catch((error: Error) => { - this.lastError = error; - this.onError?.(error); - }); - this.pendingWrites.push(writePromise); - writePromise.finally(() => { - this.pendingWrites = this.pendingWrites.filter((p) => p !== writePromise); + if (origin !== 'sqlite' && origin !== 'replicate-persisted') { + this.writes.add(async () => { + await this.whenSynced; + await this.saveUpdate(update); }); } }; this.ydoc.on('update', this.updateHandler); } + async storeUpdate(update: Uint8Array): Promise { + const bytes = Y.convertUpdateFormatV2ToV1(update); + this.writes.add(async () => { + await this.whenSynced; + await this.saveUpdate(bytes); + }); + await this.flush(); + } + async flush(): Promise { - await Promise.all(this.pendingWrites); - if (this.lastError) { - const error = this.lastError; - this.lastError = null; - throw error; - } + await this.whenSynced; + await this.writes.flush(); + } + + async clear(): Promise { + this.destroy(); + await this.flush(); + await this.executor.execute('DELETE FROM snapshots WHERE collection = ?', [this.collection]); + await this.executor.execute('DELETE FROM deltas WHERE collection = ?', [this.collection]); } private async loadState(): Promise { @@ -163,9 +170,27 @@ class SqlitePersistenceProvider implements PersistenceProvider { } export function createPersistenceFromExecutor(executor: Executor): Persistence { + const providers = new Set(); return { - createDocPersistence: (collection: string, ydoc: Y.Doc) => - new SqlitePersistenceProvider(executor, collection, ydoc), + async close() { + for (const provider of providers) provider.destroy(); + for (const provider of providers) await provider.flush?.(); + await executor.close(); + providers.clear(); + }, + createDocPersistence: (collection: string, ydoc: Y.Doc) => { + const provider = new SqlitePersistenceProvider(executor, collection, ydoc); + providers.add(provider); + const detach = provider.destroy.bind(provider); + provider.destroy = () => { + detach(); + void provider.flush().then( + () => providers.delete(provider), + () => {} + ); + }; + return provider; + }, async listDocuments(prefix: string): Promise { const result = await executor.execute( `SELECT DISTINCT collection FROM ( diff --git a/packages/replicate/src/client/persistence/sqlite/web.ts b/packages/replicate/src/client/persistence/sqlite/web.ts index 61d3cd4..0f79575 100644 --- a/packages/replicate/src/client/persistence/sqlite/web.ts +++ b/packages/replicate/src/client/persistence/sqlite/web.ts @@ -1,6 +1,6 @@ import { createPersistenceFromExecutor, type Executor } from './schema.js'; import type { Persistence } from '../types.js'; -import { compileWasmModule } from './preload.js'; +import { compileWasmModule, CDN_BASE } from './preload.js'; const INIT = 0; const EXECUTE = 1; @@ -11,6 +11,7 @@ interface Request { type: number; name?: string; wasmModule?: WebAssembly.Module; + assetBase?: string; sql?: string; params?: unknown[]; } @@ -81,8 +82,8 @@ class WorkerExecutor implements Executor { }); } - async init(name: string, wasmModule: WebAssembly.Module): Promise { - await this.send(INIT, { name, wasmModule }); + async init(name: string, wasmModule: WebAssembly.Module, assetBase: string): Promise { + await this.send(INIT, { name, wasmModule, assetBase }); } async execute(sql: string, params?: unknown[]): Promise<{ rows: Record[] }> { @@ -90,36 +91,40 @@ class WorkerExecutor implements Executor { return { rows }; } - close(): void { - for (const [, handler] of this.pending) { - handler.reject(new Error('Worker terminated')); - } - this.pending.clear(); - this.send(CLOSE).catch(() => {}); + async close(): Promise { + if (this.terminated) return; + await this.send(CLOSE); + this.terminated = true; this.worker.terminate(); } } export interface WebSqliteOptions { name: string; + /** Base URL of a compatible wa-sqlite runtime graph, including dist/ and src/. */ + assetBase?: string; worker: Worker | (() => Worker | Promise); } export async function createWebSqlitePersistence(options: WebSqliteOptions): Promise { const { name, worker } = options; + const assetBase = new URL(options.assetBase ?? CDN_BASE, document.baseURI).href.replace( + /\/$/, + '' + ); // Compile WASM in parallel with worker creation for maximum performance. // compileWasmModule() consumes the cache entry and // uses WebAssembly.compileStreaming for streaming compilation. const [resolvedWorker, wasmModule] = await Promise.all([ typeof worker === 'function' ? worker() : worker, - compileWasmModule(), + compileWasmModule(assetBase), ]); const executor = new WorkerExecutor(resolvedWorker); try { - await executor.init(name, wasmModule); + await executor.init(name, wasmModule, assetBase); } catch (error) { resolvedWorker.terminate(); throw new Error(`Failed to initialize: ${error}`); diff --git a/packages/replicate/src/client/persistence/sqlite/worker.ts b/packages/replicate/src/client/persistence/sqlite/worker.ts index 1eaaa23..04dcfaa 100644 --- a/packages/replicate/src/client/persistence/sqlite/worker.ts +++ b/packages/replicate/src/client/persistence/sqlite/worker.ts @@ -1,7 +1,5 @@ import { initSchema, type Executor } from './schema.js'; -const CDN_BASE = 'https://wa-sqlite.trestle.inc/v1.0.0'; - const INIT = 0; const EXECUTE = 1; const CLOSE = 2; @@ -12,6 +10,7 @@ interface Request { type: typeof INIT | typeof EXECUTE | typeof CLOSE | typeof FLUSH; name?: string; wasmModule?: WebAssembly.Module; + assetBase?: string; sql?: string; params?: unknown[]; } @@ -28,11 +27,15 @@ let db: number; let vfs: any; let mutex: Promise = Promise.resolve(); -async function init(name: string, wasmModule: WebAssembly.Module): Promise { +async function init( + name: string, + wasmModule: WebAssembly.Module, + assetBase: string +): Promise { const [{ default: SQLiteESMFactory }, { IDBBatchAtomicVFS }, SQLite] = await Promise.all([ - import(/* @vite-ignore */ `${CDN_BASE}/dist/wa-sqlite-async.mjs`), - import(/* @vite-ignore */ `${CDN_BASE}/src/examples/IDBBatchAtomicVFS.js`), - import(/* @vite-ignore */ `${CDN_BASE}/src/sqlite-api.js`), + import(/* @vite-ignore */ `${assetBase}/dist/wa-sqlite-async.mjs`), + import(/* @vite-ignore */ `${assetBase}/src/examples/IDBBatchAtomicVFS.js`), + import(/* @vite-ignore */ `${assetBase}/src/sqlite-api.js`), ]); const module = await SQLiteESMFactory({ @@ -52,7 +55,7 @@ async function init(name: string, wasmModule: WebAssembly.Module): Promise db = await sqlite3.open_v2(name); await sqlite3.exec(db, 'PRAGMA cache_size = -8000;'); - await sqlite3.exec(db, 'PRAGMA synchronous = NORMAL;'); + await sqlite3.exec(db, 'PRAGMA synchronous = FULL;'); await sqlite3.exec(db, 'PRAGMA temp_store = MEMORY;'); const executor: Executor = { @@ -103,7 +106,7 @@ self.onmessage = async (e: MessageEvent) => { try { switch (type) { case INIT: - await init(name!, e.data.wasmModule!); + await init(name!, e.data.wasmModule!, e.data.assetBase!); self.postMessage({ id, ok: true } satisfies Response); break; case EXECUTE: { @@ -115,8 +118,9 @@ self.onmessage = async (e: MessageEvent) => { self.postMessage({ id, ok: true } satisfies Response); break; case CLOSE: - sqlite3.close(db); - vfs.close(); + await mutex; + await sqlite3.close(db); + await vfs.close(); self.postMessage({ id, ok: true } satisfies Response); break; } diff --git a/packages/replicate/src/client/persistence/types.ts b/packages/replicate/src/client/persistence/types.ts index 6ee4f37..66bf535 100644 --- a/packages/replicate/src/client/persistence/types.ts +++ b/packages/replicate/src/client/persistence/types.ts @@ -36,6 +36,10 @@ export interface PersistenceProvider { readonly whenSynced: Promise; destroy(): void; flush?(): Promise; + /** Detach, drain pending writes, and delete this document's durable state. */ + clear?(): Promise; + /** Persist a raw Yjs V2 update, including unresolved dependencies, before applying it. */ + storeUpdate?(update: Uint8Array): Promise; } /** @@ -59,6 +63,8 @@ export interface Persistence { readonly kv: KeyValueStore; /** Direct SQL access for migrations (only available with SQLite persistence) */ readonly db?: MigrationDatabase; + /** Drain providers and release the database/worker. */ + close?(): Promise; } export interface KeyValueStore { diff --git a/packages/replicate/src/client/persistence/writes.ts b/packages/replicate/src/client/persistence/writes.ts new file mode 100644 index 0000000..961889a --- /dev/null +++ b/packages/replicate/src/client/persistence/writes.ts @@ -0,0 +1,28 @@ +/** Serializes durable work, retaining a failed operation for an explicit flush retry. */ +export class PersistenceWrites { + private pending: (() => Promise)[] = []; + private running: Promise | undefined; + + add(write: () => Promise): void { + this.pending.push(write); + void this.flush().catch(() => {}); + } + + flush(): Promise { + if (!this.running) { + this.running = Promise.resolve().then(async () => { + try { + while (this.pending.length) { + await this.pending[0](); + this.pending.shift(); + } + } finally { + // Clear before resolving the drain, so a new flush cannot reuse + // a completed promise while newly queued writes remain pending. + this.running = undefined; + } + }); + } + return this.running; + } +} diff --git a/packages/replicate/src/client/prose.ts b/packages/replicate/src/client/prose.ts index 819b95f..a45c067 100644 --- a/packages/replicate/src/client/prose.ts +++ b/packages/replicate/src/client/prose.ts @@ -92,7 +92,7 @@ export function observeFragment(config: ProseObserverConfig): () => void { logger.debug('Fragment observer registered', { collection, document, field }); const observerHandler = (_events: Y.YEvent[], transaction: Y.Transaction) => { - if (transaction.origin === SERVER_ORIGIN) { + if (transaction.origin === SERVER_ORIGIN || transaction.origin === 'replicate-persisted') { return; } diff --git a/packages/replicate/src/client/services/connection.ts b/packages/replicate/src/client/services/connection.ts new file mode 100644 index 0000000..71a3c77 --- /dev/null +++ b/packages/replicate/src/client/services/connection.ts @@ -0,0 +1,108 @@ +import type { ConvexClient } from 'convex/browser'; +import type { Value } from 'convex/values'; + +export interface ConnectionOptions { + /** Start synchronization only after connect() when set to manual. */ + networkMode?: 'auto' | 'manual'; + /** Reject local document mutations and mutable CRDT bindings. */ + readOnly?: boolean; + /** Captured at connect time; disconnect before changing account context. */ + requestArgs?: () => Record; +} + +const protocolKeys = new Set([ + 'seq', + 'limit', + 'document', + 'vector', + 'bytes', + 'material', + 'type', + 'client', + 'action', + 'connected', + 'cursor', + 'profile', + 'user', + 'paginationOpts', + 'threshold', + 'interval', + 'timeout', + 'retain', + 'exclude', + 'collection', +]); + +export function createConnection(client: ConvexClient, options: ConnectionOptions) { + let generation = 0; + let active = false; + let args: Record = {}; + const subscriptions = new Set<() => void>(); + const stale = () => new Error('Synchronization disconnected or superseded'); + const check = (token: number) => { + if (!active || token !== generation) throw stale(); + }; + const wrapped = new Proxy(client, { + get(target, property) { + if (property === 'query' || property === 'mutation') { + return async (reference: any, protocol: any) => { + const token = generation; + check(token); + const result = + property === 'query' + ? await target.query(reference, { ...args, ...protocol }) + : await target.mutation(reference, { ...args, ...protocol }); + check(token); + return result; + }; + } + if (property === 'onUpdate') { + return (reference: any, protocol: any, callback: any, onError?: any) => { + const token = generation; + if (!active) return () => {}; + const stop = target.onUpdate( + reference, + { ...args, ...protocol }, + (value: any) => { + if (active && token === generation) callback(value); + }, + (error: Error) => { + if (active && token === generation) onError?.(error); + } + ); + const unsubscribe = () => { + stop(); + subscriptions.delete(unsubscribe); + }; + subscriptions.add(unsubscribe); + return unsubscribe; + }; + } + return Reflect.get(target, property, target); + }, + }); + return { + client: wrapped, + get active() { + return active; + }, + get generation() { + return generation; + }, + connect() { + if (active) return; + const supplied = options.requestArgs?.() ?? {}; + for (const key of Object.keys(supplied)) { + if (protocolKeys.has(key)) + throw new Error(`requestArgs cannot override protocol argument: ${key}`); + } + args = structuredClone(supplied); + active = true; + }, + disconnect() { + active = false; + generation++; + for (const stop of subscriptions) stop(); + }, + }; +} diff --git a/packages/replicate/src/client/services/presence.ts b/packages/replicate/src/client/services/presence.ts index 699c22d..48dce0a 100644 --- a/packages/replicate/src/client/services/presence.ts +++ b/packages/replicate/src/client/services/presence.ts @@ -73,6 +73,8 @@ export interface PresenceConfig { heartbeatMs?: number; throttleMs?: number; syncReady?: Promise; + /** Collection integrations supply only vectors covered by durable checkpoints. */ + durableVector?: () => ArrayBuffer | undefined; user?: () => UserIdentity | undefined; anonymousPresence?: AnonymousPresenceConfig; } @@ -161,6 +163,7 @@ export function createPresence(config: PresenceConfig): PresenceProvider { const subscribers = new Set<(state: PresenceState) => void>(); const getVector = (): ArrayBuffer | undefined => { + if (config.durableVector) return config.durableVector(); return Y.encodeStateVector(ydoc).buffer as ArrayBuffer; }; @@ -329,11 +332,13 @@ export function createPresence(config: PresenceConfig): PresenceProvider { } const payload = buildJoinPayload(cursorOverride); - sendWithSingleFlight(payload).then(() => { - if (state === 'joining') { - transitionTo('active'); - } - }); + sendWithSingleFlight(payload) + .then(() => { + if (state === 'joining') { + transitionTo('active'); + } + }) + .catch(() => {}); }; const leavePresence = (): void => { @@ -342,11 +347,13 @@ export function createPresence(config: PresenceConfig): PresenceProvider { transitionTo('leaving'); - sendWithSingleFlight({ action: 'leave' }).then(() => { - if (state === 'leaving') { - transitionTo('idle'); - } - }); + sendWithSingleFlight({ action: 'leave' }) + .then(() => { + if (state === 'leaving') { + transitionTo('idle'); + } + }) + .catch(() => {}); }; const throttledJoin = (): void => { @@ -472,11 +479,13 @@ export function createPresence(config: PresenceConfig): PresenceProvider { if (e.persisted) return; if (state === 'destroyed') return; - convexClient.mutation(api.presence, { - document, - client, - action: 'leave' as const, - }); + convexClient + .mutation(api.presence, { + document, + client, + action: 'leave' as const, + }) + .catch(() => {}); }; globalThis.window.addEventListener('pagehide', handler); @@ -574,11 +583,13 @@ export function createPresence(config: PresenceConfig): PresenceProvider { remoteClientIds.clear(); awareness.emit('update', [{ added: [], updated: [], removed: [] }, 'remote']); - convexClient.mutation(api.presence, { - document, - client, - action: 'leave' as const, - }); + convexClient + .mutation(api.presence, { + document, + client, + action: 'leave' as const, + }) + .catch(() => {}); awareness.destroy(); }, diff --git a/packages/replicate/src/component/_generated/component.ts b/packages/replicate/src/component/_generated/component.ts index 74c6f8c..38a70a1 100644 --- a/packages/replicate/src/component/_generated/component.ts +++ b/packages/replicate/src/component/_generated/component.ts @@ -191,11 +191,16 @@ export type ComponentApi = null, Name >; + migrateSnapshots: FunctionReference< + "mutation", "internal", + { collection: string; limit?: number }, + { migrated: number; done: boolean }, Name + >; recovery: FunctionReference< "query", "internal", { collection: string; document: string; vector: ArrayBuffer }, - { diff?: ArrayBuffer; vector: ArrayBuffer }, + { diff?: ArrayBuffer; vector: ArrayBuffer; known?: boolean }, Name >; runCompaction: FunctionReference< diff --git a/packages/replicate/src/component/mutations.ts b/packages/replicate/src/component/mutations.ts index 139326e..c6377ec 100644 --- a/packages/replicate/src/component/mutations.ts +++ b/packages/replicate/src/component/mutations.ts @@ -39,26 +39,21 @@ async function getNextSeq(ctx: MutationCtx, collection: string): Promise .withIndex('by_collection', (q) => q.eq('collection', collection)) .unique(); - if (existing) { - const nextSeq = existing.seq + 1; - await ctx.db.patch(existing._id, { seq: nextSeq }); - return nextSeq; - } - - // Seed from existing deltas to handle migration from old getNextSeq. - // The previous implementation queried the deltas table directly for max seq. - // Without this seed, the counter would start at 1, creating duplicate seq - // numbers and breaking streaming (clients with cursor > 1 would never - // receive new changes because the stream query uses gt('seq', cursor)). - const latest = await ctx.db + // Include snapshots even when a legacy counter exists below their boundary. + const latestDelta = await ctx.db .query('deltas') .withIndex('by_seq', (q) => q.eq('collection', collection)) .order('desc') .first(); - const startSeq = (latest?.seq ?? 0) + 1; - - await ctx.db.insert('sequences', { collection, seq: startSeq }); - return startSeq; + const latestSnapshot = await ctx.db + .query('snapshots') + .withIndex('by_seq', (q) => q.eq('collection', collection)) + .order('desc') + .first(); + const seq = Math.max(existing?.seq ?? 0, latestDelta?.seq ?? 0, latestSnapshot?.seq ?? 0) + 1; + if (existing) await ctx.db.patch(existing._id, { seq }); + else await ctx.db.insert('sequences', { collection, seq }); + return seq; } // O(1) delta count increment - called when inserting a delta @@ -241,15 +236,6 @@ export const compact = mutation({ const logger = getLogger(['compaction']); const now = Date.now(); - // Get the current max seq at the START of compaction. - // This establishes our snapshot boundary - prevents TOCTOU race conditions - // where new deltas arrive during compaction and get incorrectly included. - const sequenceRecord = await ctx.db - .query('sequences') - .withIndex('by_collection', (q) => q.eq('collection', args.collection)) - .unique(); - const snapshotBoundarySeq = sequenceRecord?.seq ?? 0; - // Query all deltas for this document const allDeltas = await ctx.db .query('deltas') @@ -258,8 +244,8 @@ export const compact = mutation({ ) .collect(); - // Filter to only include deltas within our boundary - const deltas = allDeltas.filter((d) => d.seq <= snapshotBoundarySeq); + // Convex mutations read a consistent transactional snapshot. + const deltas = allDeltas; if (deltas.length === 0) { return { success: true, removed: 0, retained: 0, size: 0 }; @@ -312,15 +298,15 @@ export const compact = mutation({ } } - // Use the boundary seq for the snapshot - this ensures consistency - // with the deltas we included (all have seq <= snapshotBoundarySeq) - const seq = snapshotBoundarySeq; + // Publish a fresh position atomically with replacement and delta removal. + const seq = await getNextSeq(ctx, args.collection); if (existing) { await ctx.db.patch(existing._id, { bytes: merged.buffer as ArrayBuffer, vector: vector.buffer as ArrayBuffer, seq, + publication: 1, created: now, }); } else { @@ -330,6 +316,7 @@ export const compact = mutation({ bytes: merged.buffer as ArrayBuffer, vector: vector.buffer as ArrayBuffer, seq, + publication: 1, created: now, }); } @@ -478,14 +465,6 @@ export const runCompaction = mutation({ const retain = args.retain ?? 0; try { - // Get the current max seq at the START of compaction. - // This establishes our snapshot boundary - prevents TOCTOU race conditions. - const sequenceRecord = await ctx.db - .query('sequences') - .withIndex('by_collection', (q) => q.eq('collection', job.collection)) - .unique(); - const snapshotBoundarySeq = sequenceRecord?.seq ?? 0; - const allDeltas = await ctx.db .query('deltas') .withIndex('by_document', (q) => @@ -493,8 +472,8 @@ export const runCompaction = mutation({ ) .collect(); - // Filter to only include deltas within our boundary - const deltas = allDeltas.filter((d) => d.seq <= snapshotBoundarySeq); + // Convex mutations read a consistent transactional snapshot. + const deltas = allDeltas; if (deltas.length === 0) { await ctx.db.patch(args.id, { status: 'done', completed: now }); @@ -550,14 +529,15 @@ export const runCompaction = mutation({ } } - // Use the boundary seq for the snapshot - const seq = snapshotBoundarySeq; + // Publish a fresh position atomically with replacement and delta removal. + const seq = await getNextSeq(ctx, job.collection); if (snapshot) { await ctx.db.patch(snapshot._id, { bytes: merged.buffer as ArrayBuffer, vector: vector.buffer as ArrayBuffer, seq, + publication: 1, created: now, }); } else { @@ -567,6 +547,7 @@ export const runCompaction = mutation({ bytes: merged.buffer as ArrayBuffer, vector: vector.buffer as ArrayBuffer, seq, + publication: 1, created: now, }); } @@ -646,6 +627,31 @@ export const runCompaction = mutation({ }, }); +/** Republish legacy snapshots in bounded, atomic, restartable batches. + * Call from an application internal mutation until done before enabling streaming. + */ +export const migrateSnapshots = mutation({ + args: { collection: v.string(), limit: v.optional(v.number()) }, + returns: v.object({ migrated: v.number(), done: v.boolean() }), + handler: async (ctx, args) => { + const limit = args.limit ?? 50; + if (!Number.isSafeInteger(limit) || limit < 1 || limit > 100) { + throw new ConvexError('Migration limit must be an integer between 1 and 100'); + } + const legacy = await ctx.db + .query('snapshots') + .withIndex('by_publication', (q) => + q.eq('collection', args.collection).eq('publication', undefined) + ) + .take(limit + 1); + for (const snapshot of legacy.slice(0, limit)) { + const seq = await getNextSeq(ctx, args.collection); + await ctx.db.patch(snapshot._id, { seq, publication: 1 }); + } + return { migrated: Math.min(limit, legacy.length), done: legacy.length <= limit }; + }, +}); + export const stream = query({ args: { collection: v.string(), @@ -656,77 +662,46 @@ export const stream = query({ returns: streamResultValidator, handler: async (ctx, args) => { const limit = args.limit ?? 100; - // threshold arg kept for API compatibility but no longer used - // (compaction check moved to write mutations for O(1) performance) - - const documents = await ctx.db + if (!Number.isSafeInteger(limit) || limit < 1 || limit > 1000) { + throw new ConvexError('Stream limit must be an integer between 1 and 1000'); + } + const legacy = await ctx.db + .query('snapshots') + .withIndex('by_publication', (q) => + q.eq('collection', args.collection).eq('publication', undefined) + ) + .first(); + if (legacy) + throw new ConvexError('Snapshot migration required: run migrateSnapshots until done'); + const deltas = await ctx.db .query('deltas') .withIndex('by_seq', (q) => q.eq('collection', args.collection).gt('seq', args.seq)) .order('asc') - .take(limit); - - if (documents.length > 0) { - const changes = documents.map((doc) => ({ - document: doc.document, - bytes: doc.bytes, - seq: doc.seq, - type: OperationType.Delta, - })); - - const newSeq = documents[documents.length - 1]?.seq ?? args.seq; - - // Compaction eligibility is now checked only during write mutations - // (insertDocument, updateDocument, deleteDocument) via scheduleCompactionIfNeeded. - // This removes the O(n) full collection scan that was running on every subscription update. - - return { - changes, - seq: newSeq, - more: documents.length === limit, - compact: undefined, - }; - } - - const oldest = await ctx.db - .query('deltas') - .withIndex('by_seq', (q) => q.eq('collection', args.collection)) + .take(limit + 1); + const snapshots = await ctx.db + .query('snapshots') + .withIndex('by_seq', (q) => q.eq('collection', args.collection).gt('seq', args.seq)) .order('asc') - .first(); - - if (oldest && args.seq < oldest.seq) { - const snapshots = await ctx.db - .query('snapshots') - .withIndex('by_document', (q) => q.eq('collection', args.collection)) - .collect(); - - if (snapshots.length === 0) { - throw new ConvexError( - `Disparity detected but no snapshots available for collection: ${args.collection}. ` + - `Client seq: ${args.seq}, Oldest delta seq: ${oldest.seq}` - ); - } - - const changes = snapshots.map((s) => ({ - document: s.document, - bytes: s.bytes, - seq: s.seq, + .take(limit + 1); + const candidates = [ + ...deltas.map((d) => ({ + document: d.document, + bytes: d.bytes, + seq: d.seq, + type: OperationType.Delta, + })), + ...snapshots.map((d) => ({ + document: d.document, + bytes: d.bytes, + seq: d.seq, type: OperationType.Snapshot, - })); - - const latestSeq = Math.max(...snapshots.map((s) => s.seq)); - - return { - changes, - seq: latestSeq, - more: false, - compact: undefined, - }; - } - + })), + ].sort((a, b) => a.seq - b.seq); + const changes = candidates.slice(0, limit); return { - changes: [], - seq: args.seq, - more: false, + changes, + seq: changes.at(-1)?.seq ?? args.seq, + more: candidates.length > limit, compact: undefined, }; }, @@ -760,6 +735,7 @@ export const recovery = query({ emptyDoc.destroy(); return { vector: emptyVector.buffer as ArrayBuffer, + known: false, }; } @@ -781,6 +757,7 @@ export const recovery = query({ return { diff: diff.byteLength > 0 ? (diff.buffer as ArrayBuffer) : undefined, vector: serverVector.buffer as ArrayBuffer, + known: true, }; }, }); diff --git a/packages/replicate/src/component/schema.ts b/packages/replicate/src/component/schema.ts index b7ef499..56ebbcb 100644 --- a/packages/replicate/src/component/schema.ts +++ b/packages/replicate/src/component/schema.ts @@ -67,8 +67,12 @@ export default defineSchema({ bytes: v.bytes(), vector: v.bytes(), seq: v.number(), + publication: v.optional(v.literal(1)), created: v.number(), - }).index('by_document', ['collection', 'document']), + }) + .index('by_document', ['collection', 'document']) + .index('by_seq', ['collection', 'seq']) + .index('by_publication', ['collection', 'publication']), sessions: defineTable({ collection: v.string(), diff --git a/packages/replicate/src/server/index.ts b/packages/replicate/src/server/index.ts index 65a98e8..83d08fd 100644 --- a/packages/replicate/src/server/index.ts +++ b/packages/replicate/src/server/index.ts @@ -289,23 +289,34 @@ export class Replicate { // Insert operation if (type === 'insert') { - await ctx.db.insert(collection, { - id: document, - ...(doc as object), - timestamp: Date.now(), - }); + // A disconnected client may retry after the original insert committed. + // The index read and insert share this transaction, so concurrent retries + // cannot create duplicate logical IDs or repeat onInsert side effects. + const existing = await ctx.db + .query(collection) + .withIndex('by_doc_id', (q) => q.eq('id', document)) + .first(); + // Retry payloads can contain newer offline edits. Existing records use + // the normal update path below, including its hook and CRDT merge. + if (!existing) { + await ctx.db.insert(collection, { + id: document, + ...(doc as object), + timestamp: Date.now(), + }); - const result = await ctx.runMutation(component.mutations.insertDocument, { - collection, - document, - bytes, - threshold, - timeout, - retain, - }); + const result = await ctx.runMutation(component.mutations.insertDocument, { + collection, + document, + bytes, + threshold, + timeout, + retain, + }); - await safeHook('onInsert', opts?.onInsert, ctx, doc); - return { success: true, seq: result.seq }; + await safeHook('onInsert', opts?.onInsert, ctx, doc); + return { success: true, seq: result.seq }; + } } // Update operation (fallthrough) @@ -456,12 +467,31 @@ export class Replicate { } if (args.vector !== undefined && args.document !== undefined) { + const [state] = await enrichChangesWithExistence( + ctx, + collection, + [ + { + document: args.document, + bytes: new ArrayBuffer(0), + seq: 0, + type: 'snapshot', + }, + ], + opts?.view + ); + const recoveryResult = await ctx.runQuery(component.mutations.recovery, { collection, document: args.document, vector: args.vector, }); - return { mode: 'recovery' as const, ...recoveryResult }; + return { + mode: 'recovery' as const, + ...recoveryResult, + exists: state.exists, + diff: state.exists ? recoveryResult.diff : undefined, + }; } const result = await ctx.runQuery(component.mutations.stream, { diff --git a/packages/replicate/src/shared/index.ts b/packages/replicate/src/shared/index.ts index 3c2f35c..fcd71fa 100644 --- a/packages/replicate/src/shared/index.ts +++ b/packages/replicate/src/shared/index.ts @@ -245,6 +245,7 @@ export const compactResultValidator = v.object({ * Recovery query result with optional diff and state vector. */ export const recoveryResultValidator = v.object({ + known: v.optional(v.boolean()), diff: v.optional(v.bytes()), vector: v.bytes(), }); diff --git a/packages/replicate/src/test/assets.test.ts b/packages/replicate/src/test/assets.test.ts new file mode 100644 index 0000000..208adc0 --- /dev/null +++ b/packages/replicate/src/test/assets.test.ts @@ -0,0 +1,34 @@ +// @vitest-environment node +import { test, expect } from 'vitest'; +import { execFile } from 'node:child_process'; +import { promisify } from 'node:util'; +import { mkdtemp, readFile, writeFile, rm } from 'node:fs/promises'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { createHash } from 'node:crypto'; + +test('asset CLI installs into a new directory and refreshes assets on repeated builds', async () => { + const directory = await mkdtemp(join(tmpdir(), 'replicate-assets-')); + const destination = join(directory, 'public', 'sqlite'); + const script = fileURLToPath(new URL('../../scripts/copy-sqlite-assets.mjs', import.meta.url)); + const run = () => promisify(execFile)(process.execPath, [script, destination]); + try { + await run(); + const manifest = JSON.parse(await readFile(join(destination, 'manifest.json'), 'utf8')); + const verify = async () => { + for (const [file, expected] of Object.entries(manifest.sha256)) { + const bytes = await readFile(join(destination, file)); + expect(createHash('sha256').update(bytes).digest('hex'), file).toBe(expected); + } + }; + await verify(); + await writeFile(join(destination, 'dist', 'wa-sqlite-async.wasm'), 'previous build'); + await writeFile(join(destination, 'unrelated.txt'), 'preserve'); + await run(); + await verify(); + expect(await readFile(join(destination, 'unrelated.txt'), 'utf8')).toBe('preserve'); + } finally { + await rm(directory, { recursive: true, force: true }); + } +}); diff --git a/packages/replicate/src/test/component.test.ts b/packages/replicate/src/test/component.test.ts index 6974b9f..eac41f4 100644 --- a/packages/replicate/src/test/component.test.ts +++ b/packages/replicate/src/test/component.test.ts @@ -63,6 +63,13 @@ describe('Replicate Component Mutations', () => { }); describe('scheduleCompaction', () => { + const validUpdate = () => { + const doc = new Y.Doc(); + doc.getMap('fields').set('title', 'scheduled'); + const update = Y.encodeStateAsUpdateV2(doc); + doc.destroy(); + return update.buffer as ArrayBuffer; + }; it('should schedule compaction for a document', async () => { vi.useFakeTimers(); @@ -70,7 +77,7 @@ describe('Replicate Component Mutations', () => { await t.mutation(api.mutations.insertDocument, { collection: 'test-collection', document: 'test-doc', - bytes: new Uint8Array([1, 2, 3]).buffer as ArrayBuffer, + bytes: validUpdate(), }); const result = await t.mutation(api.mutations.scheduleCompaction, { @@ -94,7 +101,7 @@ describe('Replicate Component Mutations', () => { await t.mutation(api.mutations.insertDocument, { collection: 'test-collection', document: 'test-doc', - bytes: new Uint8Array([1, 2, 3]).buffer as ArrayBuffer, + bytes: validUpdate(), }); // Schedule first compaction diff --git a/packages/replicate/src/test/discovery.test.ts b/packages/replicate/src/test/discovery.test.ts new file mode 100644 index 0000000..b0bb694 --- /dev/null +++ b/packages/replicate/src/test/discovery.test.ts @@ -0,0 +1,312 @@ +import { afterEach, expect, test, vi } from 'vitest'; +import { convexTest } from 'convex-test'; +import * as Y from 'yjs'; +import { api } from '../component/_generated/api'; +import schema from '../component/schema'; +import { modules } from '../component/test.setup'; + +const collection = 'discovery'; +const make = () => convexTest(schema, modules); +type Backend = ReturnType; +function document(title: string) { + const doc = new Y.Doc(); + doc.getMap('fields').set('title', title); + return doc; +} +const bytes = (doc: Y.Doc) => Y.encodeStateAsUpdateV2(doc).buffer as ArrayBuffer; +async function insert(t: Backend, id: string, doc: Y.Doc) { + await t.mutation(api.mutations.insertDocument, { collection, document: id, bytes: bytes(doc) }); +} +async function compact(t: Backend, id: string) { + await t.mutation(api.mutations.compact, { collection, document: id }); +} +async function read( + t: Backend, + limit: number, + cursor = 0, + between?: (page: number) => Promise +) { + const docs = new Map(); + const sequences: number[] = []; + for (let page = 0; page < 30; page++) { + const result = await t.query(api.mutations.stream, { collection, seq: cursor, limit }); + expect(result.changes.length).toBeLessThanOrEqual(limit); + for (const change of result.changes) { + expect(change.seq).toBeGreaterThan(cursor); + sequences.push(change.seq); + const doc = docs.get(change.document) ?? new Y.Doc(); + docs.set(change.document, doc); + Y.applyUpdateV2(doc, new Uint8Array(change.bytes)); + } + if (!result.changes.length) break; + cursor = result.seq; + await between?.(page); + } + const titles = Object.fromEntries( + [...docs].map(([id, doc]) => [id, doc.getMap('fields').get('title')]) + ); + for (const doc of docs.values()) doc.destroy(); + expect(new Set(sequences).size).toBe(sequences.length); + return { titles, cursor }; +} +afterEach(() => vi.useRealTimers()); + +test.each([1, 2])( + 'fresh client discovers a fully compacted collection with page limit %s', + async (limit) => { + const t = make(); + for (const id of ['a', 'b', 'c']) { + const doc = document(id); + await insert(t, id, doc); + await compact(t, id); + doc.destroy(); + } + expect(await t.run((ctx) => ctx.db.query('deltas').collect())).toEqual([]); + expect((await read(t, limit)).titles).toEqual({ a: 'a', b: 'b', c: 'c' }); + } +); + +test.each([1, 2])( + 'mixed snapshots and incremental deltas converge with page limit %s', + async (limit) => { + const t = make(); + const a = document('base'); + await insert(t, 'a', a); + await compact(t, 'a'); + const vector = Y.encodeStateVector(a); + a.getMap('fields').set('title', 'latest'); + await t.mutation(api.mutations.updateDocument, { + collection, + document: 'a', + bytes: Y.encodeStateAsUpdateV2(a, vector).buffer as ArrayBuffer, + }); + const b = document('b'); + await insert(t, 'b', b); + expect((await read(t, limit)).titles).toEqual({ a: 'latest', b: 'b' }); + a.destroy(); + b.destroy(); + } +); + +test.each([1, 2])( + 'writes and compaction between pages remain discoverable at limit %s', + async (limit) => { + const t = make(); + const a = document('a'); + const b = document('b'); + await insert(t, 'a', a); + await insert(t, 'b', b); + const result = await read(t, limit, 0, async (page) => { + if (page !== 0) return; + a.getMap('fields').set('title', 'new-a'); + await insert(t, 'a', a); + await compact(t, 'a'); + await compact(t, 'b'); + const c = document('c'); + await insert(t, 'c', c); + await compact(t, 'c'); + c.destroy(); + }); + expect(result.titles).toEqual({ a: 'new-a', b: 'b', c: 'c' }); + a.destroy(); + b.destroy(); + } +); + +test.each([undefined, 2])( + 'legacy shared snapshot positions migrate above cursor with counter %s', + async (counter) => { + const t = make(); + await t.run(async (ctx) => { + if (counter !== undefined) await ctx.db.insert('sequences', { collection, seq: counter }); + for (const id of ['a', 'b', 'c']) { + const doc = document(id); + await ctx.db.insert('snapshots', { + collection, + document: id, + bytes: bytes(doc), + vector: Y.encodeStateVector(doc).buffer as ArrayBuffer, + seq: 10, + created: 0, + }); + doc.destroy(); + } + }); + await expect(t.query(api.mutations.stream, { collection, seq: 10, limit: 1 })).rejects.toThrow( + 'migration required' + ); + const first = await t.mutation(api.mutations.migrateSnapshots, { collection, limit: 1 }); + expect(first).toEqual({ migrated: 1, done: false }); + await expect(t.query(api.mutations.stream, { collection, seq: 10, limit: 1 })).rejects.toThrow( + 'migration required' + ); + // A write between restartable migration batches uses the same allocator. + const d = document('d'); + await insert(t, 'd', d); + d.destroy(); + const second = await t.mutation(api.mutations.migrateSnapshots, { collection, limit: 2 }); + expect(second).toEqual({ migrated: 2, done: true }); + expect(await t.mutation(api.mutations.migrateSnapshots, { collection, limit: 1 })).toEqual({ + migrated: 0, + done: true, + }); + expect((await read(t, 1, 10)).titles).toEqual({ a: 'a', b: 'b', c: 'c', d: 'd' }); + } +); + +test('legacy base republished after its incremental delta still supports discovery and recovery', async () => { + const t = make(); + const doc = document('old'); + const base = bytes(doc); + const vector = Y.encodeStateVector(doc); + doc.getMap('fields').set('title', 'new'); + await t.run(async (ctx) => { + await ctx.db.insert('snapshots', { + collection, + document: 'a', + bytes: base, + vector: vector.buffer as ArrayBuffer, + seq: 10, + created: 0, + }); + await ctx.db.insert('deltas', { + collection, + document: 'a', + bytes: Y.encodeStateAsUpdateV2(doc, vector).buffer as ArrayBuffer, + seq: 11, + }); + }); + await t.mutation(api.mutations.migrateSnapshots, { collection }); + expect((await read(t, 1)).titles).toEqual({ a: 'new' }); + const recovered = new Y.Doc(); + const result = await t.query(api.mutations.recovery, { + collection, + document: 'a', + vector: Y.encodeStateVector(recovered).buffer as ArrayBuffer, + }); + Y.applyUpdateV2(recovered, new Uint8Array(result.diff!)); + expect(recovered.getMap('fields').get('title')).toBe('new'); + doc.destroy(); + recovered.destroy(); +}); + +test('scheduled compaction publishes snapshots and preserves configured delta retention', async () => { + vi.useFakeTimers(); + const t = make(); + const doc = document('one'); + await insert(t, 'a', doc); + doc.getMap('fields').set('title', 'two'); + await insert(t, 'a', doc); + const scheduled = await t.mutation(api.mutations.scheduleCompaction, { + collection, + document: 'a', + retain: 1, + }); + expect(scheduled.status).toBe('scheduled'); + await t.finishAllScheduledFunctions(vi.runAllTimers); + const deltas = await t.run((ctx) => ctx.db.query('deltas').collect()); + expect(deltas).toHaveLength(1); + expect((await read(t, 1)).titles).toEqual({ a: 'two' }); + doc.destroy(); +}); + +test('snapshot publication does not acknowledge data for a connected old client', async () => { + const t = make(); + const doc = document('a'); + await insert(t, 'a', doc); + await t.mutation(api.mutations.mark, { + collection, + document: 'a', + client: 'old', + seq: 0, + vector: Y.encodeStateVector(new Y.Doc()).buffer as ArrayBuffer, + }); + await t.run(async (ctx) => { + const session = await ctx.db.query('sessions').first(); + await ctx.db.patch(session!._id, { connected: true }); + }); + await compact(t, 'a'); + expect((await t.run((ctx) => ctx.db.query('deltas').collect())).length).toBe(1); + expect((await read(t, 1)).titles).toEqual({ a: 'a' }); + doc.destroy(); +}); +test('seeded interleavings converge after legacy migration, writes, compaction, and paging', async () => { + for (let seed = 1; seed <= 24; seed++) { + let state = seed; + const nextRandom = (max: number) => { + state = (Math.imul(state, 1664525) + 1013904223) >>> 0; + return state % max; + }; + const t = convexTest(schema, modules), + collection = 'interleavings'; + const sourceDocuments = Array.from({ length: 7 }, (_, id) => { + const doc = new Y.Doc(); + doc.getMap('fields').set('title', String(id)); + return doc; + }); + const receivedDocuments = sourceDocuments.map(() => new Y.Doc()); + let cursor = 10; + await t.run(async (ctx) => { + for (let id = 0; id < 7; id++) { + const doc = sourceDocuments[id]; + await ctx.db.insert('snapshots', { + collection, + document: String(id), + bytes: Y.encodeStateAsUpdateV2(doc).buffer as ArrayBuffer, + vector: Y.encodeStateVector(doc).buffer as ArrayBuffer, + seq: 10, + created: 0, + }); + } + }); + const write = async (id: number, value: number) => { + const doc = sourceDocuments[id], + vector = Y.encodeStateVector(doc); + doc.getMap('fields').set('title', String(value)); + await t.mutation(api.mutations.updateDocument, { + collection, + document: String(id), + bytes: Y.encodeStateAsUpdateV2(doc, vector).buffer as ArrayBuffer, + }); + }; + for (let n = 0; n < 7; n++) { + await t.mutation(api.mutations.migrateSnapshots, { collection, limit: 1 }); + await write(nextRandom(7), n + 100); + if (nextRandom(2)) + await t.mutation(api.mutations.compact, { collection, document: String(nextRandom(7)) }); + } + const readPage = async () => { + const response = await t.query(api.mutations.stream, { + collection, + seq: cursor, + limit: nextRandom(2) + 1, + }); + for (const change of response.changes) { + expect(change.seq).toBeGreaterThan(cursor); + Y.applyUpdateV2(receivedDocuments[Number(change.document)], new Uint8Array(change.bytes)); + } + cursor = response.seq; + return response.changes.length; + }; + for (let n = 0; n < 80; n++) { + const action = nextRandom(3); + if (action === 0) await write(nextRandom(7), n + 200); + else if (action === 1) + await t.mutation(api.mutations.compact, { collection, document: String(nextRandom(7)) }); + else await readPage(); + } + let drained = false; + for (let remaining = 200; remaining > 0; remaining--) { + if ((await readPage()) === 0) { + drained = true; + break; + } + } + expect(drained, 'stream drains after writes stop').toBe(true); + expect( + receivedDocuments.map((doc) => doc.getMap('fields').toJSON()), + `seed ${seed}` + ).toEqual(sourceDocuments.map((doc) => doc.getMap('fields').toJSON())); + for (const doc of [...sourceDocuments, ...receivedDocuments]) doc.destroy(); + } +}, 30000); diff --git a/packages/replicate/src/test/offline.test.ts b/packages/replicate/src/test/offline.test.ts new file mode 100644 index 0000000..0bc6418 --- /dev/null +++ b/packages/replicate/src/test/offline.test.ts @@ -0,0 +1,786 @@ +// @vitest-environment node +import { afterEach, expect, test, vi } from 'vitest'; +import { DatabaseSync } from 'node:sqlite'; +import { mkdtemp, rm } from 'node:fs/promises'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +import * as Y from 'yjs'; +import { makeFunctionReference, getFunctionName } from 'convex/server'; +import { v } from 'convex/values'; +import { collection } from '../client/collection'; +import { schema } from '../server'; +import { createNativeSqlitePersistence } from '../client/persistence/sqlite/native'; +import { createCustomPersistence } from '../client/persistence/custom'; +import { createWebEncryptionPersistence } from '../client/persistence/encrypted/web'; +import { createConnection } from '../client/services/connection'; +import type { ConnectionOptions } from '../client/services/connection'; +import type { Persistence } from '../client/persistence/types'; + +const api = Object.fromEntries( + ['material', 'delta', 'replicate', 'presence', 'session'].map((name) => [ + name, + makeFunctionReference(`offline:${name}`), + ]) +) as any; +const definition = schema.define({ + shape: v.object({ id: v.string(), title: v.string(), note: v.optional(v.string()) }), + defaults: {}, + history: {}, +}); +const disposals: (() => Promise)[] = []; +afterEach(async () => { + for (const dispose of disposals.splice(0).reverse()) await dispose(); +}); +const deferred = () => { + let resolve!: (value: T) => void; + let reject!: (error: Error) => void; + const promise = new Promise((yes, no) => { + resolve = yes; + reject = no; + }); + return { promise, resolve, reject }; +}; +function transport() { + const subscriptions: { args: any; callback: (value: any) => void; stopped: boolean }[] = []; + const client = { + query: vi.fn(async () => ({ mode: 'recovery', exists: true, diff: null }) as any), + mutation: vi.fn(async () => ({ success: true, seq: 1 })), + onUpdate: vi.fn((_ref: any, args: any, callback: (value: any) => void) => { + const sub = { args, callback, stopped: false }; + subscriptions.push(sub); + return () => { + sub.stopped = true; + }; + }), + }; + return { + client, + subscriptions, + emit: (value: any) => + subscriptions.filter((s) => !s.stopped && 'seq' in s.args).forEach((s) => s.callback(value)), + }; +} +async function disk(path?: string, before?: (sql: string, params?: unknown[]) => Promise) { + if (!path) { + const directory = await mkdtemp(join(tmpdir(), 'replicate-contract-')); + disposals.push(() => rm(directory, { recursive: true, force: true })); + path = join(directory, 'replica.sqlite'); + } + const db = new DatabaseSync(path); + const persistence = await createNativeSqlitePersistence( + { + async execute(sql, params = []) { + await before?.(sql, params); + const statement = db.prepare(sql); + if (statement.columns().length) + return { rows: statement.all(...(params as any[])) as Record[] }; + statement.run(...(params as any[])); + return { rows: [] }; + }, + close() { + db.close(); + }, + }, + path + ); + return { persistence, path }; +} +async function seed(p: Persistence, id = 'a') { + const doc = new Y.Doc(); + doc.clientID = 1; + const provider = p.createDocPersistence(`offline:${id}`, doc); + await provider.whenSynced; + doc.getMap('fields').set('title', 'persisted'); + await provider.flush!(); + provider.destroy(); + doc.destroy(); +} +async function open(p: Persistence, network = transport(), options: ConnectionOptions = {}) { + const lazy = collection.create<{ id: string; title: string }>({ + schema: definition, + persistence: async () => p, + config: () => ({ convexClient: network.client as any, api, getKey: (row) => row.id }), + ...options, + }); + await lazy.init(); + const rows = lazy.get(); + await rows.preload(); + disposals.push(async () => { + await rows.disconnect(); + await rows.cleanup(); + }); + return { rows, network }; +} +function change(id: string, seq: number, title = 'remote') { + const doc = new Y.Doc(); + doc.clientID = 2; + doc.getMap('fields').set('title', title); + const bytes = Y.encodeStateAsUpdateV2(doc).buffer; + doc.destroy(); + return { document: id, seq, bytes, type: 'delta', exists: true }; +} +const page = (...changes: any[]) => ({ + mode: 'stream', + changes, + seq: changes.at(-1).seq, + more: false, +}); + +test('manual session subscribers start on connect and reject old callbacks after reconnect', async () => { + const first = await disk(); + disposals.push(() => first.persistence.close!()); + const net = transport(); + const { rows } = await open(first.persistence, net, { networkMode: 'manual' }); + const listener = vi.fn(); + const stop = rows.session.subscribe(listener); + expect(net.client.onUpdate).not.toHaveBeenCalled(); + await rows.connect(); + const original = net.subscriptions.find((sub) => sub.args.connected === true)!; + expect(original).toBeDefined(); + listener.mockClear(); + original.callback([]); + expect(listener).toHaveBeenCalledOnce(); + await rows.disconnect(); + await rows.connect(); + listener.mockClear(); + original.callback([]); + expect(listener).not.toHaveBeenCalled(); + const current = net.subscriptions.find((sub) => sub.args.connected === true && !sub.stopped)!; + expect(current).not.toBe(original); + current.callback([]); + expect(listener).toHaveBeenCalledOnce(); + stop(); +}); + +test.each(['insert', 'recovery'])( + 'reset drains accepted %s pending-marker deletion', + async (source) => { + const first = await disk(); + disposals.push(() => first.persistence.close!()); + if (source === 'recovery') { + await seed(first.persistence); + await first.persistence.kv.set('pending-create:offline:a', true); + } + const entered = deferred(); + const release = deferred(); + const del = first.persistence.kv.del.bind(first.persistence.kv); + let intercept = true; + first.persistence.kv.del = async (key) => { + if (intercept && key === 'pending-create:offline:a') { + intercept = false; + entered.resolve(); + await release.promise; + } + await del(key); + }; + const { rows } = await open(first.persistence); + if (source === 'insert') { + void rows.insert({ id: 'a', title: 'old' }).isPersisted.promise.catch(() => {}); + } + await entered.promise; + let resetDone = false; + const reset = rows.reset().then(() => { + resetDone = true; + }); + await new Promise((resolve) => setTimeout(resolve, 30)); + const completedBeforeRelease = resetDone; + release.resolve(); + await reset; + expect(completedBeforeRelease).toBe(false); + expect(await first.persistence.kv.get('pending-create:offline:a')).toBeUndefined(); + } +); + +test('recovery and single-document stream changes preserve untouched row identities', async () => { + const first = await disk(); + disposals.push(() => first.persistence.close!()); + await seed(first.persistence, 'a'); + await seed(first.persistence, 'b'); + const { rows, network } = await open(first.persistence, transport(), { networkMode: 'manual' }); + const originalA = rows.get('a'); + const originalB = rows.get('b'); + await rows.connect(); + await vi.waitFor(() => expect(network.client.query).toHaveBeenCalledTimes(2)); + await rows.disconnect(); + expect(rows.get('a')).toBe(originalA); + expect(rows.get('b')).toBe(originalB); + await rows.connect(); + network.emit(page(change('a', 1, 'changed'))); + await vi.waitFor(() => expect(rows.get('a')?.title).toBe('changed')); + expect(rows.get('b')).toBe(originalB); +}); + +test('targeted stream publication removes fields missing from the current document', async () => { + const first = await disk(); + disposals.push(() => first.persistence.close!()); + const { rows, network } = await open(first.persistence, transport(), { networkMode: 'manual' }); + await rows.connect(); + const remote = new Y.Doc(); + remote.getMap('fields').set('title', 'record'); + remote.getMap('fields').set('note', 'removed later'); + network.emit(page({ ...change('a', 1), bytes: Y.encodeStateAsUpdateV2(remote).buffer })); + await vi.waitFor(() => expect(rows.get('a')).toHaveProperty('note', 'removed later')); + const vector = Y.encodeStateVector(remote); + remote.getMap('fields').delete('note'); + network.emit(page({ ...change('a', 2), bytes: Y.encodeStateAsUpdateV2(remote, vector).buffer })); + await vi.waitFor(() => expect(rows.get('a')).not.toHaveProperty('note')); + expect(rows.get('a')?.title).toBe('record'); + remote.destroy(); +}); + +test('recovery and streaming flush only the documents whose data changed', async () => { + const first = await disk(); + disposals.push(() => first.persistence.close!()); + const count = 20; + for (let id = 0; id < count; id++) await seed(first.persistence, String(id)); + let flushes = 0; + const create = first.persistence.createDocPersistence.bind(first.persistence); + first.persistence.createDocPersistence = (key, doc) => { + const provider = create(key, doc); + const flush = provider.flush!.bind(provider); + provider.flush = async () => { + flushes++; + await flush(); + }; + return provider; + }; + const network = transport(); + network.client.query.mockResolvedValue({ + mode: 'recovery', + exists: true, + diff: change('unused', 1).bytes, + }); + const { rows } = await open(first.persistence, network, { + networkMode: 'manual', + readOnly: true, + }); + await rows.connect(); + await vi.waitFor(() => + expect([...rows.values()].filter((row) => row.title === 'remote')).toHaveLength(count) + ); + expect(flushes).toBeLessThanOrEqual(count * 2); + flushes = 0; + network.emit(page(change('new', 1))); + await vi.waitFor(() => expect(rows.get('new')?.title).toBe('remote')); + expect(flushes).toBeLessThanOrEqual(2); +}); + +test.each(['data', 'cursor'])( + 'disconnect during %s persistence keeps durable rows readable on offline reconnect', + async (phase) => { + const entered = deferred(); + const release = deferred(); + const first = await disk(undefined, async (sql, params) => { + const key = phase === 'data' ? 'offline:a' : 'cursor:offline'; + if (sql.startsWith('INSERT') && params?.[0] === key) { + entered.resolve(); + await release.promise; + } + }); + disposals.push(() => first.persistence.close!()); + const network = transport(); + network.client.query.mockImplementation(() => new Promise(() => {})); + const { rows } = await open(first.persistence, network, { + networkMode: 'manual', + readOnly: true, + }); + await rows.connect(); + network.emit(page(change('a', 1))); + await entered.promise; + const disconnect = rows.disconnect(); + release.resolve(); + await disconnect; + const expectedCursor = phase === 'cursor' ? 1 : 0; + expect((await first.persistence.kv.get('cursor:offline')) ?? 0).toBe(expectedCursor); + await rows.connect(); + expect(network.subscriptions.at(-1)?.args.seq).toBe(expectedCursor); + expect(rows.get('a')?.title).toBe('remote'); + } +); + +test('disk rows become ready while all backend promises remain unresolved', async () => { + const first = await disk(); + await seed(first.persistence); + await first.persistence.close!(); + const reopened = await disk(first.path); + disposals.push(() => reopened.persistence.close!()); + const net = transport(); + net.client.query.mockImplementation(() => new Promise(() => {})); + net.client.mutation.mockImplementation(() => new Promise(() => {})); + const { rows } = await open(reopened.persistence, net); + expect(rows.get('a')?.title).toBe('persisted'); + await rows.disconnect(); +}); + +test.each(['stream', 'recovery'])( + '%s absence survives actual SQLite close and reopen', + async (source) => { + const first = await disk(); + await seed(first.persistence); + const net = transport(); + if (source === 'recovery') + net.client.query.mockResolvedValue({ mode: 'recovery', exists: false }); + const { rows } = await open(first.persistence, net); + if (source === 'stream') { + await vi.waitFor(() => expect(net.subscriptions.length).toBeGreaterThan(0)); + net.emit(page({ ...change('a', 1), exists: false })); + } + await vi.waitFor(() => expect(rows.get('a')).toBeUndefined()); + await rows.disconnect(); + await rows.cleanup(); + disposals.pop(); + await first.persistence.close!(); + const reopened = await disk(first.path); + disposals.push(() => reopened.persistence.close!()); + const next = await open(reopened.persistence, transport(), { networkMode: 'manual' }); + expect(next.rows.get('a')).toBeUndefined(); + expect(await reopened.persistence.listDocuments('offline')).toEqual([]); + } +); + +test('manual read-only replica performs no transport before connect and never writes documents', async () => { + const db = await disk(); + disposals.push(() => db.persistence.close!()); + await seed(db.persistence); + const net = transport(); + const { rows } = await open(db.persistence, net, { + networkMode: 'manual', + readOnly: true, + requestArgs: () => ({ guest: 'credential' }), + }); + rows.session.subscribe(() => {}); + expect(net.client.query).not.toHaveBeenCalled(); + expect(net.client.onUpdate).not.toHaveBeenCalled(); + expect(net.client.mutation).not.toHaveBeenCalled(); + await rows.connect(); + net.emit(page(change('a', 1, 'server owned'))); + await vi.waitFor(() => expect(rows.get('a')?.title).toBe('server owned')); + const transaction = rows.update('a', (row) => { + row.title = 'forbidden'; + }); + await expect(transaction.isPersisted.promise).rejects.toThrow('read-only'); + expect( + net.client.mutation.mock.calls.every( + ([ref]: any) => getFunctionName(ref) !== 'offline:replicate' + ) + ).toBe(true); + for (const calls of [ + net.client.query.mock.calls, + net.client.mutation.mock.calls, + net.client.onUpdate.mock.calls, + ]) { + for (const call of calls as any[]) expect(call[1].guest).toBe('credential'); + } +}); + +test('writable default still inserts and sends document updates', async () => { + const db = await disk(); + disposals.push(() => db.persistence.close!()); + const { rows, network } = await open(db.persistence); + await vi.waitFor(() => expect(network.subscriptions.length).toBeGreaterThan(0)); + let seq = 0; + network.client.mutation.mockImplementation(async (ref: any, args: any) => { + if (getFunctionName(ref) === 'offline:replicate') + network.emit(page({ ...args, seq: ++seq, exists: true })); + return { success: true, seq }; + }); + await rows.insert({ id: 'new', title: 'write' }).isPersisted.promise; + await vi.waitFor(() => expect(rows.get('new')).toBeDefined()); + await rows.update('new', (row) => { + row.title = 'edited'; + }).isPersisted.promise; + expect( + network.client.mutation.mock.calls.filter( + ([ref]: any) => getFunctionName(ref) === 'offline:replicate' + ) + ).toHaveLength(2); + await vi.waitFor(() => expect(rows.get('new')?.title).toBe('edited')); +}); + +test('delayed data and cursor writes cannot be overtaken by marks or concurrent callbacks', async () => { + const dataGate = deferred(); + const cursorGate = deferred(); + let delayData = true; + let delayCursor = true; + const db = await disk(undefined, async (sql) => { + if (sql.startsWith('INSERT INTO deltas') && delayData) await dataGate.promise; + if (sql.startsWith('INSERT OR REPLACE INTO kv') && delayCursor) await cursorGate.promise; + }); + disposals.push(() => db.persistence.close!()); + // Client id is a kv write; allow initialization before delaying cursor specifically. + delayCursor = false; + const { rows, network } = await open(db.persistence); + await vi.waitFor(() => expect(network.subscriptions.length).toBeGreaterThan(0)); + delayCursor = true; + const callback = network.subscriptions[0].callback; + callback(page(change('a', 1))); + callback(page(change('a', 1), change('b', 2))); + await new Promise((resolve) => setTimeout(resolve, 20)); + expect(await db.persistence.kv.get('cursor:offline')).toBeUndefined(); + expect(network.client.mutation).not.toHaveBeenCalled(); + delayData = false; + dataGate.resolve(); + await new Promise((resolve) => setTimeout(resolve, 20)); + expect(network.client.mutation).not.toHaveBeenCalled(); + delayCursor = false; + cursorGate.resolve(); + await vi.waitFor(() => expect(rows.get('b')).toBeDefined()); + await vi.waitFor(async () => expect(await db.persistence.kv.get('cursor:offline')).toBe(2)); +}); + +test.each(['data', 'cursor'])( + 'failed %s writes retain progress and replay successfully', + async (failure) => { + let fail = false; + const db = await disk(undefined, async (sql, params) => { + if ( + fail && + ((failure === 'data' && sql.startsWith('INSERT INTO deltas')) || + (failure === 'cursor' && sql.startsWith('INSERT') && params?.[0] === 'cursor:offline')) + ) + throw new Error('disk unavailable'); + }); + disposals.push(() => db.persistence.close!()); + const { rows, network } = await open(db.persistence); + await vi.waitFor(() => expect(network.subscriptions.length).toBeGreaterThan(0)); + fail = true; + network.emit(page(change('a', 1))); + await new Promise((resolve) => setTimeout(resolve, 30)); + expect(await db.persistence.kv.get('cursor:offline')).toBeUndefined(); + expect(network.client.mutation).not.toHaveBeenCalled(); + fail = false; + await vi.waitFor(() => expect(network.subscriptions.length).toBeGreaterThan(1), { + timeout: 2000, + }); + network.emit(page(change('a', 1))); + await vi.waitFor(() => expect(rows.get('a')?.title).toBe('remote')); + await vi.waitFor(async () => expect(await db.persistence.kv.get('cursor:offline')).toBe(1)); + } +); + +test('reset drains a delayed write and stale callbacks cannot resurrect disk data', async () => { + const gate = deferred(); + let writing = false; + const db = await disk(undefined, async (sql) => { + if (sql.startsWith('INSERT INTO deltas')) { + writing = true; + await gate.promise; + } + }); + const { rows, network } = await open(db.persistence); + await vi.waitFor(() => expect(network.subscriptions.length).toBeGreaterThan(0)); + const callback = network.subscriptions[0].callback; + callback(page(change('a', 1))); + await vi.waitFor(() => expect(writing).toBe(true)); + let done = false; + const reset = rows.reset().then(() => { + done = true; + }); + await new Promise((resolve) => setTimeout(resolve, 20)); + expect(done).toBe(false); + gate.resolve(); + await reset; + callback(page(change('b', 2))); + expect(await db.persistence.listDocuments('offline')).toEqual([]); + expect(await db.persistence.kv.get('cursor:offline')).toBeUndefined(); + await rows.cleanup(); + disposals.pop(); + await db.persistence.close!(); + const reopened = await disk(db.path); + disposals.push(() => reopened.persistence.close!()); + expect(await reopened.persistence.listDocuments('offline')).toEqual([]); +}); + +test('old recovery absence cannot remove a more recent stream version', async () => { + const db = await disk(); + disposals.push(() => db.persistence.close!()); + await seed(db.persistence); + const recovery = deferred(); + const net = transport(); + net.client.query.mockImplementation(() => recovery.promise); + const { rows } = await open(db.persistence, net); + await vi.waitFor(() => expect(net.subscriptions.length).toBeGreaterThan(0)); + net.emit(page(change('a', 1, 'newer'))); + await vi.waitFor(() => expect(awaitableTitle(rows)).toBe('newer')); + recovery.resolve({ mode: 'recovery', exists: false }); + await new Promise((resolve) => setTimeout(resolve, 20)); + expect(rows.get('a')?.title).toBe('newer'); +}); +const awaitableTitle = (rows: any) => rows.get('a')?.title; + +test('account generation rejects stale recovery and uses newly captured request context', async () => { + const db = await disk(); + disposals.push(() => db.persistence.close!()); + await seed(db.persistence); + const recovery = deferred(); + const net = transport(); + net.client.query.mockImplementation(() => recovery.promise); + let guest = 'first'; + const { rows } = await open(db.persistence, net, { + networkMode: 'manual', + requestArgs: () => ({ guest }), + }); + await rows.connect(); + await rows.disconnect(); + guest = 'second'; + net.client.query.mockResolvedValue({ mode: 'recovery', exists: true }); + await rows.connect(); + recovery.resolve({ mode: 'recovery', exists: false }); + await new Promise((resolve) => setTimeout(resolve, 20)); + expect(rows.get('a')).toBeDefined(); + expect((net.client.query.mock.calls.at(-1) as any)[1].guest).toBe('second'); +}); + +test.each(['seq', 'document', 'interval', 'threshold', 'exclude'])( + 'request context rejects reserved %s', + (key) => { + const net = transport(); + const connection = createConnection(net.client as any, { requestArgs: () => ({ [key]: 1 }) }); + expect(() => connection.connect()).toThrow('protocol argument'); + expect(net.client.query).not.toHaveBeenCalled(); + } +); + +test('raw incremental update survives disk restart before its compacted base arrives', async () => { + const original = new Y.Doc(); + original.getMap('fields').set('title', 'base'); + const base = Y.encodeStateAsUpdateV2(original); + const vector = Y.encodeStateVector(original); + original.getMap('fields').set('title', 'latest'); + const delta = Y.encodeStateAsUpdateV2(original, vector); + original.destroy(); + const db = await disk(); + const { rows, network } = await open(db.persistence); + await vi.waitFor(() => expect(network.subscriptions.length).toBeGreaterThan(0)); + network.emit(page({ document: 'a', seq: 1, type: 'delta', exists: true, bytes: delta.buffer })); + await vi.waitFor(async () => expect(await db.persistence.kv.get('cursor:offline')).toBe(1)); + await rows.disconnect(); + await rows.cleanup(); + disposals.pop(); + await db.persistence.close!(); + const reopened = await disk(db.path); + disposals.push(() => reopened.persistence.close!()); + const next = await open(reopened.persistence); + await vi.waitFor(() => expect(next.network.subscriptions.length).toBeGreaterThan(0)); + next.network.emit( + page({ document: 'a', seq: 2, type: 'snapshot', exists: true, bytes: base.buffer }) + ); + await vi.waitFor(() => expect(next.rows.get('a')?.title).toBe('latest')); +}); + +test('custom adapter drains delayed updates before durable removal', async () => { + const values = new Map(); + const gate = deferred(); + const p = createCustomPersistence({ + async get(key) { + return values.get(key); + }, + async keys(prefix) { + return [...values.keys()].filter((k) => k.startsWith(prefix)); + }, + async set(key, value) { + await gate.promise; + values.set(key, value); + }, + async delete(key) { + values.delete(key); + }, + }); + const doc = new Y.Doc(); + const provider = p.createDocPersistence('offline:a', doc); + await provider.whenSynced; + doc.getMap('fields').set('title', 'delayed'); + const clear = provider.clear!(); + gate.resolve(); + await clear; + const next = p.createDocPersistence('offline:a', new Y.Doc()); + await next.whenSynced; + expect(await p.listDocuments('offline')).toEqual([]); + provider.destroy(); + next.destroy(); + doc.destroy(); +}); + +test('a later disconnect wins over connect waiting for initialization', async () => { + const db = await disk(); + disposals.push(() => db.persistence.close!()); + const net = transport(); + const gate = deferred(); + const original = db.persistence.listDocuments; + db.persistence.listDocuments = async (prefix) => { + await gate.promise; + return original(prefix); + }; + const lazy = collection.create<{ id: string; title: string }>({ + schema: definition, + persistence: async () => db.persistence, + config: () => ({ convexClient: net.client as any, api, getKey: (row) => row.id }), + }); + await lazy.init(); + const rows = lazy.get(); + const loading = rows.preload(); + const connecting = rows.connect(); + const closing = rows.disconnect(); + gate.resolve(); + await Promise.all([loading, connecting, closing]); + expect(net.client.query).not.toHaveBeenCalled(); + expect(net.client.onUpdate).not.toHaveBeenCalled(); + await rows.cleanup(); +}); + +test('connect waits for reset data removal before starting the next generation', async () => { + const gate = deferred(); + let deleting = false; + const db = await disk(undefined, async (sql) => { + if (sql.startsWith('DELETE FROM snapshots')) { + deleting = true; + await gate.promise; + } + }); + disposals.push(() => db.persistence.close!()); + await seed(db.persistence); + const { rows, network } = await open(db.persistence); + await vi.waitFor(() => expect(network.subscriptions.length).toBeGreaterThan(0)); + const reset = rows.reset(); + await vi.waitFor(() => expect(deleting).toBe(true)); + const previous = network.subscriptions.length; + const connecting = rows.connect(); + await new Promise((resolve) => setTimeout(resolve, 20)); + expect(network.subscriptions.length).toBe(previous); + gate.resolve(); + await Promise.all([reset, connecting]); + expect(network.subscriptions.at(-1)?.args.seq).toBe(0); + expect(rows.get('a')).toBeUndefined(); +}); + +test('writable offline creation survives restart and retries as insert after authorized connection', async () => { + const db = await disk(); + const { rows } = await open(db.persistence, transport(), { networkMode: 'manual' }); + await expect( + rows.insert({ id: 'offline-new', title: 'unsent' }).isPersisted.promise + ).rejects.toThrow('disconnected'); + await rows.disconnect(); + await rows.cleanup(); + disposals.pop(); + await db.persistence.close!(); + const reopened = await disk(db.path); + disposals.push(() => reopened.persistence.close!()); + const net = transport(); + net.client.query.mockResolvedValue({ mode: 'recovery', exists: false, known: false }); + const next = await open(reopened.persistence, net, { networkMode: 'manual' }); + expect(next.rows.get('offline-new')?.title).toBe('unsent'); + await next.rows.connect(); + await vi.waitFor(() => + expect(net.client.mutation.mock.calls.some((call: any) => call[1].type === 'insert')).toBe(true) + ); + expect(next.rows.get('offline-new')?.title).toBe('unsent'); +}); + +test('presence and marks exclude local edits whose writes are still delayed', async () => { + const cursorGate = deferred(); + const localGate = deferred(); + let blockCursor = false; + let blockLocal = false; + const db = await disk(undefined, async (sql, params) => { + if (blockCursor && sql.startsWith('INSERT') && params?.[0] === 'cursor:offline') + await cursorGate.promise; + if (blockLocal && sql.startsWith('INSERT INTO deltas')) await localGate.promise; + }); + disposals.push(() => db.persistence.close!()); + const { rows, network } = await open(db.persistence); + await vi.waitFor(() => expect(network.subscriptions.length).toBeGreaterThan(0)); + network.emit(page(change('a', 1))); + await vi.waitFor(() => expect(rows.get('a')).toBeDefined()); + const before = network.client.mutation.mock.calls.find( + (call: any) => call[1].action === 'mark' + ) as any; + const durable = new Uint8Array(before[1].vector); + blockCursor = true; + network.emit(page(change('b', 2))); + await new Promise((resolve) => setTimeout(resolve, 20)); + blockLocal = true; + const update = rows.update('a', (row) => { + row.title = 'not durable'; + }); + const handle = rows.doc('a'); + handle.presence.join(); + cursorGate.resolve(); + await vi.waitFor(() => + expect(network.client.mutation.mock.calls.some((call: any) => call[1].action === 'join')).toBe( + true + ) + ); + const join = network.client.mutation.mock.calls.find( + (call: any) => call[1].action === 'join' + ) as any; + expect(new Uint8Array(join[1].vector)).toEqual(durable); + localGate.resolve(); + await update.isPersisted.promise; + await rows.disconnect(); +}); + +test('encrypted raw updates survive compaction, disk reopen, and durable removal', async () => { + const db = await disk(); + const config = (storage: Persistence) => ({ + storage, + user: 'test', + unlock: { + passphrase: { + setup: async () => 'test-only-password', + get: async () => 'test-only-password', + }, + }, + }); + const encrypted = await createWebEncryptionPersistence(config(db.persistence)); + await encrypted.unlock(); + const local = new Y.Doc(); + const provider = encrypted.createDocPersistence('offline:a', local); + await provider.whenSynced; + const server = new Y.Doc(); + server.getMap('fields').set('title', 'base'); + const base = Y.encodeStateAsUpdateV2(server); + for (let index = 0; index < 50; index++) { + const vector = Y.encodeStateVector(server); + server.getMap('fields').set('title', `value-${index}`); + const update = Y.encodeStateAsUpdateV2(server, vector); + await provider.storeUpdate!(update); + Y.applyUpdateV2(local, update, 'replicate-persisted'); + } + provider.destroy(); + await db.persistence.close!(); + const reopened = await disk(db.path); + disposals.push(() => reopened.persistence.close!()); + const next = await createWebEncryptionPersistence(config(reopened.persistence)); + await next.unlock(); + expect(await next.listDocuments('offline')).toEqual(['a']); + const restored = new Y.Doc(); + const nextProvider = next.createDocPersistence('offline:a', restored); + await nextProvider.whenSynced; + await nextProvider.storeUpdate!(base); + Y.applyUpdateV2(restored, base, 'replicate-persisted'); + expect(restored.getMap('fields').get('title')).toBe('value-49'); + await nextProvider.clear!(); + expect(await next.listDocuments('offline')).toEqual([]); + server.destroy(); + local.destroy(); + restored.destroy(); +}); + +test('an insert before preload is not invalidated by initial automatic activation', async () => { + const db = await disk(); + disposals.push(() => db.persistence.close!()); + const net = transport(); + const lazy = collection.create<{ id: string; title: string }>({ + schema: definition, + persistence: async () => db.persistence, + config: () => ({ convexClient: net.client as any, api, getKey: (row) => row.id }), + }); + await lazy.init(); + const rows = lazy.get(); + const transaction = rows.insert({ id: 'early', title: 'accepted' }); + await rows.preload(); + await transaction.isPersisted.promise; + expect(net.client.mutation.mock.calls.some((call: any) => call[1].type === 'insert')).toBe(true); + await rows.disconnect(); + await rows.cleanup(); +}); diff --git a/packages/replicate/src/test/persistence-writes.test.ts b/packages/replicate/src/test/persistence-writes.test.ts new file mode 100644 index 0000000..de9552f --- /dev/null +++ b/packages/replicate/src/test/persistence-writes.test.ts @@ -0,0 +1,22 @@ +import { expect, test } from 'vitest'; +import { PersistenceWrites } from '../client/persistence/writes'; + +test('flush drains writes added at the previous drain completion boundary', async () => { + const writes = new PersistenceWrites(); + const events: string[] = []; + let capturedFlush: Promise | undefined; + writes.add(async () => { + events.push('first'); + queueMicrotask(() => + queueMicrotask(() => { + writes.add(async () => { + events.push('second'); + }); + capturedFlush = writes.flush(); + }) + ); + }); + await writes.flush(); + await capturedFlush; + expect(events).toEqual(['first', 'second']); +}); diff --git a/packages/replicate/src/test/recovery.test.ts b/packages/replicate/src/test/recovery.test.ts new file mode 100644 index 0000000..a5eac62 --- /dev/null +++ b/packages/replicate/src/test/recovery.test.ts @@ -0,0 +1,89 @@ +import { expect, test } from 'vitest'; +import { convexTest } from 'convex-test'; +import { defineSchema, defineTable, makeFunctionReference } from 'convex/server'; +import { v } from 'convex/values'; +import * as Y from 'yjs'; +import componentSchema from '../component/schema'; +import { modules } from '../component/test.setup'; +const appSchema = defineSchema({ + records: defineTable({ + id: v.string(), + title: v.string(), + timestamp: v.optional(v.number()), + }).index('by_doc_id', ['id']), +}); +const appModules = { + './_generated/server.ts': async () => ({}), + './functions.ts': () => import('./server-functions'), +}; + +test('actual server recovery distinguishes absent material from unknown component history', async () => { + const t = convexTest(appSchema, appModules); + t.registerComponent('replicate', componentSchema, modules); + const doc = new Y.Doc(); + doc.getMap('fields').set('title', 'record'); + const vector = Y.encodeStateVector(new Y.Doc()).buffer as ArrayBuffer; + const delta = makeFunctionReference<'query'>('functions:delta'); + const missing = await t.query(delta, { document: 'missing', vector }); + expect(missing).toMatchObject({ exists: false, known: false }); + const id = await t.run((ctx) => ctx.db.insert('records', { id: 'a', title: 'record' })); + // Access component through the same generated component reference as application functions. + await t.run(async (ctx) => { + const { componentsGeneric } = await import('convex/server'); + await ctx.runMutation((componentsGeneric() as any).replicate.mutations.insertDocument, { + collection: 'records', + document: 'a', + bytes: Y.encodeStateAsUpdateV2(doc).buffer as ArrayBuffer, + }); + }); + expect(await t.query(delta, { document: 'a', vector })).toMatchObject({ + exists: true, + known: true, + }); + await t.run((ctx) => ctx.db.delete(id)); + expect(await t.query(delta, { document: 'a', vector })).toMatchObject({ + exists: false, + known: true, + }); + doc.destroy(); +}); + +test('retried create after an earlier commit does not duplicate logical records', async () => { + const t = convexTest(appSchema, appModules); + t.registerComponent('replicate', componentSchema, modules); + const doc = new Y.Doc(); + doc.getMap('fields').set('title', 'once'); + const args = { + document: 'retry', + bytes: Y.encodeStateAsUpdateV2(doc).buffer as ArrayBuffer, + material: { id: 'retry', title: 'once' }, + type: 'insert', + }; + const mutation = makeFunctionReference<'mutation'>('functions:replicate'); + const absent = await t.query(makeFunctionReference<'query'>('functions:delta'), { + document: 'retry', + vector: Y.encodeStateVector(new Y.Doc()).buffer as ArrayBuffer, + }); + expect(absent.exists).toBe(false); + const original = await t.mutation(mutation, args); + doc.getMap('fields').set('title', 'newer offline edit'); + const retry = await t.mutation(mutation, { + ...args, + bytes: Y.encodeStateAsUpdateV2(doc).buffer as ArrayBuffer, + material: { id: 'retry', title: 'newer offline edit' }, + }); + expect(retry.seq).toBeGreaterThan(original.seq); + const recovered = await t.query(makeFunctionReference<'query'>('functions:delta'), { + document: 'retry', + vector: Y.encodeStateVector(new Y.Doc()).buffer as ArrayBuffer, + }); + const merged = new Y.Doc(); + Y.applyUpdateV2(merged, new Uint8Array(recovered.diff)); + expect(merged.getMap('fields').get('title')).toBe('newer offline edit'); + merged.destroy(); + expect(await t.run((ctx) => ctx.db.query('records').first())).toMatchObject({ + title: 'newer offline edit', + }); + expect(await t.run((ctx) => ctx.db.query('records').collect())).toHaveLength(1); + doc.destroy(); +}); diff --git a/packages/replicate/src/test/server-functions.ts b/packages/replicate/src/test/server-functions.ts new file mode 100644 index 0000000..0650bbf --- /dev/null +++ b/packages/replicate/src/test/server-functions.ts @@ -0,0 +1,6 @@ +import { componentsGeneric } from 'convex/server'; +import { Replicate } from '../server'; +const storage = new Replicate((componentsGeneric() as any).replicate, 'records'); +export const delta = storage.createDeltaQuery(); + +export const replicate = storage.createReplicateMutation(); diff --git a/packages/replicate/test/browser/index.html b/packages/replicate/test/browser/index.html new file mode 100644 index 0000000..d91a502 --- /dev/null +++ b/packages/replicate/test/browser/index.html @@ -0,0 +1,2 @@ +Offline replica regression + diff --git a/packages/replicate/test/browser/main.ts b/packages/replicate/test/browser/main.ts new file mode 100644 index 0000000..4c112a9 --- /dev/null +++ b/packages/replicate/test/browser/main.ts @@ -0,0 +1,83 @@ +import { collection, persistence } from '@trestleinc/replicate/client'; +import { schema } from '@trestleinc/replicate/server'; +import { makeFunctionReference } from 'convex/server'; +import { v } from 'convex/values'; +import * as Y from 'yjs'; +import Worker from '@trestleinc/replicate/worker?worker'; + +const api = Object.fromEntries( + ['material', 'delta', 'replicate', 'presence', 'session'].map((name) => [ + name, + makeFunctionReference(`browser:${name}`), + ]) +); +let callback: ((page: unknown) => void) | undefined; +let calls = 0; +let absent = false; +const transport = { + query: async () => { + calls++; + return { mode: 'recovery', exists: !absent, diff: null }; + }, + mutation: async () => { + calls++; + return null; + }, + onUpdate: (_api: unknown, _args: unknown, cb: typeof callback) => { + calls++; + callback = cb; + return () => { + callback = undefined; + }; + }, +}; +const local = await persistence.web.sqlite.create({ + name: 'offline-browser', + worker: () => new Worker(), + assetBase: '/sqlite', +}); +const lazy = collection.create<{ id: string; title: string }>({ + schema: schema.define({ + shape: v.object({ id: v.string(), title: v.string() }), + defaults: {}, + history: {}, + }), + persistence: async () => local, + config: () => ({ convexClient: transport as any, api: api as any, getKey: (row) => row.id }), + networkMode: 'manual', + readOnly: true, +}); +await lazy.init(); +const rows = lazy.get(); +await rows.preload(); +Object.assign(window, { + replica: { + get: (id: string) => rows.get(id), + calls: () => calls, + connect: () => rows.connect(), + disconnect: () => rows.disconnect(), + reset: () => rows.reset(), + absent: () => { + absent = true; + }, + cursor: () => local.kv.get('cursor:browser'), + close: async () => { + await rows.disconnect(); + await rows.cleanup(); + await local.close!(); + }, + emit: (id: string, seq: number, exists = true, raw?: number[]) => { + const doc = new Y.Doc(); + doc.getMap('fields').set('title', 'persisted in browser'); + const bytes = raw ? new Uint8Array(raw) : Y.encodeStateAsUpdateV2(doc); + doc.destroy(); + callback?.({ + mode: 'stream', + changes: [{ document: id, seq, bytes: bytes.buffer, exists, type: 'snapshot' }], + seq, + }); + }, + }, +}); +await navigator.serviceWorker.register('/sw.js'); +await navigator.serviceWorker.ready; diff --git a/packages/replicate/test/native/index.js b/packages/replicate/test/native/index.js new file mode 100644 index 0000000..bd3236f --- /dev/null +++ b/packages/replicate/test/native/index.js @@ -0,0 +1,2 @@ +import { collection, persistence } from '@trestleinc/replicate/client'; +globalThis.replicateNativeGraph = { collection, persistence }; diff --git a/packages/replicate/test/native/package.json b/packages/replicate/test/native/package.json new file mode 100644 index 0000000..3dd2232 --- /dev/null +++ b/packages/replicate/test/native/package.json @@ -0,0 +1,5 @@ +{ + "name": "replicate-native-graph", + "private": true, + "main": "index.js" +} From c3d6e49ebd773239d9657d2e66e84bdd3e34fb5f Mon Sep 17 00:00:00 2001 From: ettoc00 <41289053+ettoc00@users.noreply.github.com> Date: Thu, 17 Sep 2026 19:26:59 +0200 Subject: [PATCH 02/14] fix: make Convex subscription cleanup idempotent --- CHANGELOG.md | 1 + .../src/client/services/connection.ts | 9 ++-- packages/replicate/src/test/offline.test.ts | 51 +++++++++++++++++++ 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a35ab91..b5aa4b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Persisted rows become ready without waiting for network recovery. - Deletion and recovery absence drain/delete durable document state; failed writes cannot advance cursors or acknowledge undurable vectors. - Raw updates with missing Yjs dependencies survive restart; stale network generations cannot repopulate reset replicas. +- Disconnect/reset followed by collection cleanup stops each Convex subscription once and ignores queued callbacks after unsubscribe. - Snapshot/delta discovery works after compaction, including scheduled compaction and writes between small pages. ### Upgrade notes diff --git a/packages/replicate/src/client/services/connection.ts b/packages/replicate/src/client/services/connection.ts index 71a3c77..e8df920 100644 --- a/packages/replicate/src/client/services/connection.ts +++ b/packages/replicate/src/client/services/connection.ts @@ -60,19 +60,22 @@ export function createConnection(client: ConvexClient, options: ConnectionOption return (reference: any, protocol: any, callback: any, onError?: any) => { const token = generation; if (!active) return () => {}; + let listening = true; const stop = target.onUpdate( reference, { ...args, ...protocol }, (value: any) => { - if (active && token === generation) callback(value); + if (listening && active && token === generation) callback(value); }, (error: Error) => { - if (active && token === generation) onError?.(error); + if (listening && active && token === generation) onError?.(error); } ); const unsubscribe = () => { - stop(); + if (!listening) return; + listening = false; subscriptions.delete(unsubscribe); + stop(); }; subscriptions.add(unsubscribe); return unsubscribe; diff --git a/packages/replicate/src/test/offline.test.ts b/packages/replicate/src/test/offline.test.ts index 0bc6418..0b46920 100644 --- a/packages/replicate/src/test/offline.test.ts +++ b/packages/replicate/src/test/offline.test.ts @@ -49,6 +49,7 @@ function transport() { const sub = { args, callback, stopped: false }; subscriptions.push(sub); return () => { + if (sub.stopped) throw new Error('Subscription already stopped'); sub.stopped = true; }; }), @@ -126,6 +127,56 @@ const page = (...changes: any[]) => ({ more: false, }); +test.each(['disconnect', 'reset'] as const)( + '%s followed by reconnect and cleanup stops each transport subscription once', + async (action) => { + const db = await disk(); + disposals.push(() => db.persistence.close!()); + const { rows, network } = await open(db.persistence, transport(), { networkMode: 'manual' }); + await rows.connect(); + const first = [...network.subscriptions]; + expect(first.length).toBeGreaterThan(0); + await rows[action](); + expect(first.every((sub) => sub.stopped)).toBe(true); + await rows.connect(); + expect(network.subscriptions.some((sub) => !sub.stopped)).toBe(true); + await rows.disconnect(); + await rows.cleanup(); + expect(network.subscriptions.every((sub) => sub.stopped)).toBe(true); + } +); + +test('unsubscribing suppresses queued callbacks without disconnecting other subscriptions', () => { + const callbacks: { value: (value: unknown) => void; error: (error: Error) => void }[] = []; + const stop = vi.fn(); + const connection = createConnection( + { + onUpdate: (_ref: unknown, _args: unknown, value: any, error: any) => { + callbacks.push({ value, error }); + return stop; + }, + } as any, + {} + ); + connection.connect(); + const value = vi.fn(); + const error = vi.fn(); + const remaining = vi.fn(); + const unsubscribe = connection.client.onUpdate(api.delta, {}, value, error); + connection.client.onUpdate(api.delta, {}, remaining); + unsubscribe(); + unsubscribe(); + callbacks[0].value({}); + callbacks[0].error(new Error('queued')); + callbacks[1].value({}); + expect(value).not.toHaveBeenCalled(); + expect(error).not.toHaveBeenCalled(); + expect(remaining).toHaveBeenCalledOnce(); + expect(stop).toHaveBeenCalledOnce(); + connection.disconnect(); + expect(stop).toHaveBeenCalledTimes(2); +}); + test('manual session subscribers start on connect and reject old callbacks after reconnect', async () => { const first = await disk(); disposals.push(() => first.persistence.close!()); From ab574aa114434d057f7e8bff30b5c9bde6163656 Mon Sep 17 00:00:00 2001 From: ettoc00 <41289053+ettoc00@users.noreply.github.com> Date: Thu, 17 Sep 2026 21:16:26 +0200 Subject: [PATCH 03/14] fix: address offline durability review findings --- .github/workflows/ci.yml | 9 +- AGENTS.md | 14 +- CHANGELOG.md | 1 + CLAUDE.md | 40 +- README.md | 71 ++-- docs/CDN.md | 365 +++++------------- docs/tests.md | 48 ++- .../scripts/test-offline-browser.mjs | 7 +- packages/replicate/src/client/collection.ts | 12 + .../src/client/persistence/custom.ts | 5 +- .../src/client/persistence/encrypted/web.ts | 5 +- .../src/client/persistence/memory.ts | 11 +- .../src/client/persistence/sqlite/native.ts | 54 ++- .../src/client/persistence/sqlite/schema.ts | 71 +++- .../src/client/persistence/sqlite/web.ts | 38 +- .../src/client/persistence/sqlite/worker.ts | 101 +++-- packages/replicate/src/test/offline.test.ts | 116 +++++- packages/replicate/test/browser/main.ts | 27 +- 18 files changed, 576 insertions(+), 419 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 837fc66..5db15d8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,20 +6,23 @@ on: pull_request: branches: [main] +permissions: + contents: read + jobs: ci: name: Lint & Type Check runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 with: node-version: 24 - name: Setup Bun - uses: oven-sh/setup-bun@v2 + uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2 - name: Install dependencies run: bun install --frozen-lockfile diff --git a/AGENTS.md b/AGENTS.md index 1dfbb3c..db63f7e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -62,14 +62,14 @@ schema.prose(); // Validator for prose fields ```typescript collection.create(); // Main entry point - create lazy-initialized collections -persistence.web.sqlite(); // Browser wa-sqlite Web Worker + OPFSCoopSyncVFS +persistence.web.sqlite.create(); // Browser wa-sqlite Web Worker + IDBBatchAtomicVFS (IndexedDB) persistence.web.sqlite.once(); // SQLite singleton mode (shared across collections) -persistence.web.encrypted(); // Browser encrypted storage (WebAuthn PRF) -persistence.native.sqlite(); // React Native SQLite persistence (op-sqlite) -persistence.native.encrypted(); // React Native encrypted storage (not yet implemented) -persistence.memory(); // In-memory persistence (testing) -persistence.custom(); // Custom storage adapter -schema.prose(); // Zod schema for prose fields +persistence.web.encryption.create(); // Browser encrypted storage (WebAuthn PRF) +persistence.web.encryption.manager(); // Optional encryption lifecycle manager +persistence.native.sqlite.create(); // React Native SQLite persistence (op-sqlite) +persistence.native.encryption.create(); // React Native encrypted storage (not yet implemented) +persistence.memory.create(); // In-memory persistence (testing) +persistence.custom.create(); // Custom storage adapter schema.prose.extract(); // Extract plain text from prose JSON schema.prose.empty(); // Create empty prose value ``` diff --git a/CHANGELOG.md b/CHANGELOG.md index b5aa4b1..3332dd6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Deletion and recovery absence drain/delete durable document state; failed writes cannot advance cursors or acknowledge undurable vectors. - Raw updates with missing Yjs dependencies survive restart; stale network generations cannot repopulate reset replicas. - Disconnect/reset followed by collection cleanup stops each Convex subscription once and ignores queued callbacks after unsubscribe. +- Full-row updates remove omitted optional fields, SQLite document clearing is atomic, and browser worker shutdown drains accepted work while rejecting new work after closing starts. - Snapshot/delta discovery works after compaction, including scheduled compaction and writes between small pages. ### Upgrade notes diff --git a/CLAUDE.md b/CLAUDE.md index 2fc5365..b74eda4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -19,7 +19,7 @@ Single package with exports: - `@trestleinc/replicate/client` - Client utilities (browser/React/Svelte) - `@trestleinc/replicate/server` - Server helpers (Convex functions) -- `@trestleinc/replicate/shared` - Shared types (ProseFields, XmlFragmentJSON, OperationType) +- `@trestleinc/replicate` - Shared types (ProseFields, XmlFragmentJSON, OperationType) - `@trestleinc/replicate/convex.config` - Component configuration ## Development Commands @@ -53,8 +53,8 @@ src/ │ ├── persistence/ # Swappable storage backends │ │ ├── types.ts # Persistence, KeyValueStore interfaces │ │ ├── sqlite/ # SQLite backends -│ │ │ ├── web.ts # wa-sqlite Web Worker + OPFSCoopSyncVFS -│ │ │ ├── worker.ts # Web Worker with wa-sqlite (CDN loaded) +│ │ │ ├── web.ts # wa-sqlite Web Worker + IDBBatchAtomicVFS (IndexedDB) +│ │ │ ├── worker.ts # Web Worker with configurable wa-sqlite assets │ │ │ ├── schema.ts # SQLite schema + persistence providers │ │ │ └── native.ts # op-sqlite (React Native) │ │ ├── memory.ts # Testing: in-memory @@ -163,16 +163,16 @@ Server update (via stream subscription) collection.create(); // Create lazy-initialized collection (SSR-safe) // Persistence providers (namespaced by platform) -persistence.web.sqlite(); // Browser: wa-sqlite Web Worker + OPFSCoopSyncVFS +persistence.web.sqlite.create(); // Browser: wa-sqlite Web Worker + IDBBatchAtomicVFS (IndexedDB) persistence.web.sqlite.once(); // SQLite singleton (shared across collections) -persistence.web.encrypted(); // Browser: encrypted storage with WebAuthn PRF -persistence.native.sqlite(); // React Native: op-sqlite -persistence.native.encrypted(); // React Native: encrypted storage (not yet implemented) -persistence.memory(); // Testing: in-memory (cross-platform) -persistence.custom(); // Custom storage adapter (cross-platform) +persistence.web.encryption.create(); // Browser: encrypted storage with WebAuthn PRF +persistence.web.encryption.manager(); // Optional encryption lifecycle manager +persistence.native.sqlite.create(); // React Native: op-sqlite +persistence.native.encryption.create(); // React Native: encrypted storage (not yet implemented) +persistence.memory.create(); // Testing: in-memory (cross-platform) +persistence.custom.create(); // Custom storage adapter (cross-platform) // Schema helpers (matches server API) -schema.prose(); // Zod schema for prose fields schema.prose.extract(); // Extract plain text from ProseMirror JSON schema.prose.empty(); // Create empty prose value ``` @@ -187,7 +187,7 @@ schema.table(); // Define replicated table schema schema.prose(); // Validator for ProseMirror JSON ``` -### Shared (`@trestleinc/replicate/shared`) +### Shared (`@trestleinc/replicate`) ```typescript ProseFields; // Extract prose field names from document type @@ -216,15 +216,19 @@ export const { stream, material, insert, update, remove, versions } = r({ ```typescript import { collection, persistence } from '@trestleinc/replicate/client'; +import SqliteWorker from '@trestleinc/replicate/worker?worker'; import { ConvexClient } from 'convex/browser'; +const sqlite = persistence.web.sqlite.once({ + name: 'tasks', + assetBase: '/replicate-sqlite', + worker: () => new SqliteWorker(), +}); + export const tasks = collection.create({ - persistence: async () => { - const SQL = await initSqlJs({ locateFile: (f) => `/${f}` }); - return persistence.sqlite.browser(SQL, 'tasks'); - }, + schema: taskSchema, + persistence: sqlite, config: () => ({ - schema: taskSchema, convexClient: new ConvexClient(import.meta.env.VITE_CONVEX_URL), api: api.tasks, getKey: (task) => task.id, @@ -233,10 +237,10 @@ export const tasks = collection.create({ // Initialize once during app startup (browser only) await tasks.init(); -const collection = tasks.get(); +const rows = tasks.get(); // Prose binding for rich text -const binding = await collection.utils.prose(id, 'content'); +const binding = await rows.doc(id).prose('content'); ``` ### Sync Registration (Internal) diff --git a/README.md b/README.md index 9ec53f2..6ec8cdc 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ graph TB App[Application] Collection[TanStack DB Collection] Yjs[Yjs CRDT Documents] - SQLite[SQLite / OPFS] + SQLite[SQLite / IndexedDB] end subgraph Server @@ -192,6 +192,7 @@ import type { Infer } from 'convex/values'; const sqlite = persistence.web.sqlite.once({ name: 'myapp', + assetBase: '/replicate-sqlite', worker: async () => { const { default: SqliteWorker } = await import('@trestleinc/replicate/worker?worker'); return new SqliteWorker(); @@ -211,6 +212,9 @@ export const tasks = collection.create({ export type Task = Infer; ``` +For offline startup, copy the packaged runtime with `replicate-sqlite-assets public/replicate-sqlite` +and precache it with the application shell. See [Durable offline replicas](docs/offline-replicas.md#browser-assets-and-offline-startup). + ### Step 4: Initialize and Use Initialize the collection with optional server-seeded data, then query it like any TanStack DB collection: @@ -362,19 +366,20 @@ const empty = schema.prose.empty(); Replicate ships with several persistence backends: -| Provider | Platform | Description | -| -------------------------------------------- | ------------ | ---------------------------------------------- | -| `persistence.web.sqlite.create(options)` | Browser | wa-sqlite in a Web Worker with OPFS storage | -| `persistence.web.sqlite.once(options)` | Browser | Same as above, but returns a singleton factory | -| `persistence.native.sqlite.create(db, name)` | React Native | op-sqlite integration | -| `persistence.memory.create()` | Any | In-memory (for testing) | -| `persistence.custom.create(adapter)` | Any | Bring your own `StorageAdapter` | +| Provider | Platform | Description | +| -------------------------------------------- | ------------ | ------------------------------------------------ | +| `persistence.web.sqlite.create(options)` | Browser | wa-sqlite in a Web Worker with IndexedDB storage | +| `persistence.web.sqlite.once(options)` | Browser | Same as above, but returns a singleton factory | +| `persistence.native.sqlite.create(db, name)` | React Native | op-sqlite integration | +| `persistence.memory.create()` | Any | In-memory (for testing) | +| `persistence.custom.create(adapter)` | Any | Bring your own `StorageAdapter` | **Web SQLite options:** ```typescript interface WebSqliteOptions { - name: string; // Database name in OPFS + name: string; // Database name in IndexedDB + assetBase?: string; // Base URL for the compatible wa-sqlite runtime graph worker: Worker | (() => Worker | Promise); } ``` @@ -639,37 +644,34 @@ await configure({ ### Encrypted Storage -Encrypt the local SQLite database using WebAuthn PRF (Passkey-derived keys): +Encrypt persisted document payloads and application key-value payloads using WebAuthn PRF (Passkey-derived keys). Storage metadata, including key names and the document-ID discovery index, remains visible to the backing persistence provider: ```typescript import { persistence } from '@trestleinc/replicate/client'; // Check if the browser supports PRF const supported = await persistence.web.encryption.webauthn.supported(); +if (!supported) throw new Error('WebAuthn PRF is required by this configuration'); -// Create an encryption manager (handles key lifecycle) -const manager = persistence.web.encryption.manager({ - rpId: 'example.com', - rpName: 'My App', - onStateChange: (state) => { - /* update UI */ +const storage = await persistence.web.sqlite.create({ + name: 'myapp-encrypted', + assetBase: '/replicate-sqlite', + worker: async () => { + const { default: W } = await import('@trestleinc/replicate/worker?worker'); + return new W(); }, }); -// Create encrypted persistence -const encrypted = () => - persistence.web.encryption.create({ - manager, - name: 'myapp-encrypted', - worker: async () => { - const { default: W } = await import('@trestleinc/replicate/worker?worker'); - return new W(); - }, - }); +const encrypted = await persistence.web.encryption.create({ + storage, + user: currentUser.id, + unlock: { webauthn: true }, +}); +await encrypted.unlock(); const tasks = collection.create({ schema: taskSchema, - persistence: encrypted, + persistence: async () => encrypted, config: () => ({ /* ... */ }), @@ -837,6 +839,9 @@ function create(options: CreateCollectionOptions): LazyColl interface CreateCollectionOptions { schema: VersionedSchema; persistence: () => Promise; + networkMode?: 'auto' | 'manual'; // Defaults to auto + readOnly?: boolean; // Defaults to false + requestArgs?: () => Record; // Captured for each connection config: () => { convexClient: ConvexClient; api: ConvexCollectionApi; @@ -849,6 +854,10 @@ interface CreateCollectionOptions { } ``` +`tasks.get()` returns the TanStack collection with `connect()`, `disconnect()`, and `reset()` +methods. In manual mode, call and await `connect()` after credentials are available. Await +`disconnect()` before changing account context and `reset()` when clearing the durable replica. + #### `LazyCollection` ```typescript @@ -996,11 +1005,11 @@ interface UserIdentity { } ``` -### Shared Types (`@trestleinc/replicate/shared`) +### Shared Types (`@trestleinc/replicate`) ```typescript -import type { ProseValue, Duration, CompactionConfig } from '@trestleinc/replicate/shared'; -import { parseDuration } from '@trestleinc/replicate/shared'; +import type { ProseValue, Duration, CompactionConfig } from '@trestleinc/replicate'; +import { parseDuration } from '@trestleinc/replicate'; // Duration strings type Duration = `${number}${'m' | 'h' | 'd'}`; @@ -1066,7 +1075,7 @@ A full-featured offline-first issue tracker demonstrating real-world usage. **Features demonstrated:** -- Offline-first with wa-sqlite persistence (SQLite in OPFS) +- Offline-first with wa-sqlite persistence (SQLite in IndexedDB) - Rich text editing with TipTap + Yjs collaboration - PWA with custom service worker for offline navigation - Real-time sync across devices diff --git a/docs/CDN.md b/docs/CDN.md index 9a340bb..e8c9c72 100644 --- a/docs/CDN.md +++ b/docs/CDN.md @@ -1,319 +1,128 @@ -# Self-Hosting wa-sqlite on Cloudflare +# Hosting the browser SQLite runtime -This guide explains how to set up your own CDN for wa-sqlite to maximize performance and reliability for your users. +Replicate's browser persistence uses wa-sqlite with `IDBBatchAtomicVFS` (IndexedDB). The package +includes the compatible JavaScript/WASM graph, its checksums, and the upstream license notices. +Serve that packaged graph from your application or an immutable CDN path. Do not assemble files +from a moving wa-sqlite branch: npm `wa-sqlite@1.0.0` and other distributions may expose a +different VFS API. -## Why Self-Host? +## Copy and verify the packaged graph -| Benefit | Description | -| ---------------- | ----------------------------------------------------------- | -| **Performance** | Cloudflare's edge network (300+ locations) vs jsdelivr | -| **Reliability** | No dependency on third-party CDN uptime | -| **Control** | Pin versions, custom cache headers, monitoring | -| **Native users** | wa-sqlite only loaded for web, not bundled for React Native | - -## Current Architecture - -``` -┌─────────────────────────────────────────────────────────────┐ -│ Web App │ -│ └── Web Worker │ -│ └── Dynamic imports from CDN │ -│ ├── wa-sqlite-async.mjs (~15KB) │ -│ ├── IDBBatchAtomicVFS.js (~12KB) │ -│ ├── sqlite-api.js (~20KB) │ -│ └── wa-sqlite-async.wasm (~400KB) │ -└─────────────────────────────────────────────────────────────┘ -``` - -> **Note:** We use `IDBBatchAtomicVFS` (IndexedDB-based) instead of OPFS adapters for stability. - -## Setup Options - -### Option A: Cloudflare R2 (Recommended) - -Best for static file hosting with global edge caching. - -#### 1. Create R2 Bucket +Run the package CLI during the application build: ```bash -# Using Wrangler CLI -wrangler r2 bucket create wa-sqlite-cdn +npm exec -- replicate-sqlite-assets public/replicate-sqlite ``` -#### 2. Upload wa-sqlite Files - -```bash -# Clone wa-sqlite and upload dist + examples -git clone https://github.com/rhashimoto/wa-sqlite.git -cd wa-sqlite - -# Upload to R2 - core async build -wrangler r2 object put wa-sqlite-cdn/v1.0.0/dist/wa-sqlite-async.mjs --file=dist/wa-sqlite-async.mjs -wrangler r2 object put wa-sqlite-cdn/v1.0.0/dist/wa-sqlite-async.wasm --file=dist/wa-sqlite-async.wasm -wrangler r2 object put wa-sqlite-cdn/v1.0.0/src/sqlite-api.js --file=src/sqlite-api.js - -# Upload IDBBatchAtomicVFS and its dependencies -wrangler r2 object put wa-sqlite-cdn/v1.0.0/src/examples/IDBBatchAtomicVFS.js --file=src/examples/IDBBatchAtomicVFS.js -wrangler r2 object put wa-sqlite-cdn/v1.0.0/src/FacadeVFS.js --file=src/FacadeVFS.js -wrangler r2 object put wa-sqlite-cdn/v1.0.0/src/VFS.js --file=src/VFS.js -wrangler r2 object put wa-sqlite-cdn/v1.0.0/src/WebLocksMixin.js --file=src/WebLocksMixin.js -wrangler r2 object put wa-sqlite-cdn/v1.0.0/src/sqlite-constants.js --file=src/sqlite-constants.js -``` - -#### 3. Configure Public Access - -Create a Worker to serve R2 with proper headers: - -```typescript -// workers/cdn.ts -export default { - async fetch(request: Request, env: Env): Promise { - const url = new URL(request.url); - const key = url.pathname.slice(1); // Remove leading slash - - const object = await env.WA_SQLITE_BUCKET.get(key); - - if (!object) { - return new Response('Not Found', { status: 404 }); - } +The command verifies every source file against `manifest.json` before copying. The destination +contains the complete required layout: - const headers = new Headers(); - - // Set content type - if (key.endsWith('.wasm')) { - headers.set('Content-Type', 'application/wasm'); - } else if (key.endsWith('.js') || key.endsWith('.mjs')) { - headers.set('Content-Type', 'application/javascript'); - } - - // Cache headers - immutable for versioned paths - headers.set('Cache-Control', 'public, max-age=31536000, immutable'); - headers.set('Access-Control-Allow-Origin', '*'); - headers.set('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS'); - - return new Response(object.body, { headers }); - }, -}; +```text +replicate-sqlite/ +├── dist/ +│ ├── wa-sqlite-async.mjs +│ └── wa-sqlite-async.wasm +├── src/ +│ ├── examples/IDBBatchAtomicVFS.js +│ ├── FacadeVFS.js +│ ├── VFS.js +│ ├── WebLocksMixin.js +│ ├── sqlite-api.js +│ └── sqlite-constants.js +├── manifest.json +├── LICENSE +└── ACKNOWLEDGMENTS.md ``` -#### 4. Deploy Worker - -```toml -# wrangler.toml -name = "wa-sqlite-cdn" -main = "workers/cdn.ts" -compatibility_date = "2024-01-01" - -[[r2_buckets]] -binding = "WA_SQLITE_BUCKET" -bucket_name = "wa-sqlite-cdn" - -[routes] -pattern = "wa-sqlite.trestle.inc/*" -``` +Keep the relative `dist/` and `src/` paths intact. Retain `LICENSE` and `ACKNOWLEDGMENTS.md` in +every hosted distribution. To verify the installed package without copying it, run: ```bash -wrangler deploy -``` - -### Option B: Cloudflare Workers (Proxy + Cache) - -For dynamic proxying with automatic updates: - -```typescript -// workers/wa-sqlite-proxy.ts -const UPSTREAM = 'https://cdn.jsdelivr.net/gh/rhashimoto/wa-sqlite@master'; -const CACHE_TTL = 86400 * 7; // 7 days - -export default { - async fetch(request: Request): Promise { - const url = new URL(request.url); - const upstreamUrl = `${UPSTREAM}${url.pathname}`; - - // Check cache first - const cache = caches.default; - let response = await cache.match(request); - - if (!response) { - response = await fetch(upstreamUrl); - - // Clone and add cache headers - response = new Response(response.body, response); - response.headers.set('Cache-Control', `public, max-age=${CACHE_TTL}`); - response.headers.set('Access-Control-Allow-Origin', '*'); - - // Store in cache - await cache.put(request, response.clone()); - } - - return response; - }, -}; +npm exec -- replicate-sqlite-assets --verify ``` -## Configuring Replicate - -### Default CDN (Your Hosted) - -Update the worker to use your CDN: +`manifest.json` records the exact wa-sqlite source revision, build revision, and SHA-256 digest of +each runtime and notice file. The provenance details and reproducibility boundary are documented in +[`offline-replicas.md`](offline-replicas.md#browser-assets-and-offline-startup). -```typescript -// src/client/persistence/sqlite/worker.ts -const CDN_BASE = 'https://wa-sqlite.trestle.inc/v1.0.0'; -``` - -### User-Configurable CDN +## Configure Replicate -Allow users to override: +Point `assetBase` at the directory containing `dist/`, `src/`, and the manifest: ```typescript -// src/client/persistence/sqlite/web.ts -export interface WebSqliteOptions { - name: string; - worker: Worker | (() => Worker | Promise); - cdnBase?: string; // Optional custom CDN -} +import { persistence } from '@trestleinc/replicate/client'; +import SqliteWorker from '@trestleinc/replicate/worker?worker'; -// In worker initialization, pass cdnBase via postMessage +const sqlite = persistence.web.sqlite.once({ + name: 'myapp', + assetBase: '/replicate-sqlite', + worker: () => new SqliteWorker(), +}); ``` -### Custom Adapter Support - -For users with completely custom setups: +`assetBase` may also be an absolute, versioned URL: ```typescript -// src/client/persistence/index.ts -export const persistence = { - sqlite: { - once: onceWebSqlitePersistence, - create: createWebSqlitePersistence, - }, - native: nativeSqlitePersistence, - memory: memoryPersistence, - custom: customPersistence, // For advanced users -}; +assetBase: 'https://assets.example.com/replicate-sqlite/2.0.0-preview.0'; ``` -## Version Management - -### Pinning Strategy - -``` -wa-sqlite.trestle.inc/ -├── v1.0.0/ # Pinned version (immutable) -│ ├── dist/ -│ └── src/ -├── v1.1.0/ # New version -│ ├── dist/ -│ └── src/ -└── latest/ # Symlink to latest stable (for dev) - ├── dist/ - └── src/ -``` - -### Update Script - -```bash -#!/bin/bash -# scripts/update-wa-sqlite.sh - -VERSION=$1 -BUCKET="wa-sqlite-cdn" - -if [ -z "$VERSION" ]; then - echo "Usage: ./update-wa-sqlite.sh " - exit 1 -fi - -# Clone specific tag/commit -git clone --depth 1 --branch $VERSION https://github.com/rhashimoto/wa-sqlite.git /tmp/wa-sqlite - -# Upload to R2 - core async build -wrangler r2 object put $BUCKET/$VERSION/dist/wa-sqlite-async.mjs --file=/tmp/wa-sqlite/dist/wa-sqlite-async.mjs -wrangler r2 object put $BUCKET/$VERSION/dist/wa-sqlite-async.wasm --file=/tmp/wa-sqlite/dist/wa-sqlite-async.wasm -wrangler r2 object put $BUCKET/$VERSION/src/sqlite-api.js --file=/tmp/wa-sqlite/src/sqlite-api.js +The host must serve `.wasm` as `application/wasm` and `.js`/`.mjs` as JavaScript. If the asset +origin differs from the application origin, enable CORS for the application. Versioned paths can +use long-lived immutable caching: -# Upload IDBBatchAtomicVFS and its dependencies -wrangler r2 object put $BUCKET/$VERSION/src/examples/IDBBatchAtomicVFS.js --file=/tmp/wa-sqlite/src/examples/IDBBatchAtomicVFS.js -wrangler r2 object put $BUCKET/$VERSION/src/FacadeVFS.js --file=/tmp/wa-sqlite/src/FacadeVFS.js -wrangler r2 object put $BUCKET/$VERSION/src/VFS.js --file=/tmp/wa-sqlite/src/VFS.js -wrangler r2 object put $BUCKET/$VERSION/src/WebLocksMixin.js --file=/tmp/wa-sqlite/src/WebLocksMixin.js -wrangler r2 object put $BUCKET/$VERSION/src/sqlite-constants.js --file=/tmp/wa-sqlite/src/sqlite-constants.js - -# Cleanup -rm -rf /tmp/wa-sqlite - -echo "Uploaded wa-sqlite $VERSION to CDN" +```http +Cache-Control: public, max-age=31536000, immutable +Access-Control-Allow-Origin: https://app.example.com ``` -## Performance Optimizations - -### 1. Brotli Compression +Avoid a CDN proxy to a moving branch such as `@master`. To upgrade, update the Replicate package, +run the copy command again, upload the complete output to a new immutable path, and then change +`assetBase`. Keeping the previous path available lets already deployed clients finish loading the +runtime version they were built against. -Cloudflare automatically applies Brotli for supported browsers: +## Offline startup -- `wa-sqlite-async.wasm`: 400KB → ~150KB (62% reduction) -- JS files: ~43KB → ~12KB (72% reduction) - -### 2. HTTP/2 Server Push (Optional) +An offline restart needs the application shell, bundled worker, and every runtime file named in +`manifest.json` to be available locally. Precache those URLs while online and activate the service +worker before relying on offline startup. The preload helpers accept the same base: ```typescript -// In worker, add Link headers for push -headers.set('Link', '; rel=preload; as=fetch'); -``` - -### 3. Edge Caching Rules +import { injectPreloadLinks } from '@trestleinc/replicate/client'; -In Cloudflare Dashboard → Caching → Cache Rules: - -``` -Match: hostname eq "wa-sqlite.trestle.inc" and starts_with(http.request.uri.path, "/v") -Cache TTL: 1 year (immutable versioned content) +injectPreloadLinks('/replicate-sqlite'); ``` -## Monitoring - -### R2 Analytics +Verify the production build with the network disabled after a full browser process shutdown. A +warm module in an open tab does not prove that the JavaScript/WASM graph is available offline. -View in Cloudflare Dashboard → R2 → Analytics: +## Cloudflare R2 example -- Request count by file -- Bandwidth usage -- Cache hit ratio - -### Custom Logging (Optional) +Create a versioned prefix such as `replicate-sqlite/2.0.0-preview.0/`, then upload the **entire** +copied directory, including the manifest and notice files. An R2-backed Worker can serve objects +with the content types and immutable headers above: ```typescript -// In worker -console.log( - JSON.stringify({ - timestamp: Date.now(), - path: url.pathname, - userAgent: request.headers.get('User-Agent'), - country: request.cf?.country, - }) -); -``` - -View logs: `wrangler tail wa-sqlite-cdn` - -## Cost Estimate - -| Resource | Free Tier | Estimated Cost | -| ---------- | ------------ | ----------------------------- | -| R2 Storage | 10GB | ~$0.015/GB/month | -| R2 Egress | 10GB/month | Free (no egress fees!) | -| Workers | 100K req/day | Free | -| **Total** | - | **~$0-5/month** for most apps | +export default { + async fetch(request: Request, env: Env): Promise { + const url = new URL(request.url); + const key = url.pathname.slice(1); + const object = await env.RUNTIME_BUCKET.get(key); + if (!object) return new Response('Not Found', { status: 404 }); -## Checklist + const headers = new Headers(); + const contentType = key.endsWith('.wasm') + ? 'application/wasm' + : key.endsWith('.json') + ? 'application/json' + : key.endsWith('.md') || key.endsWith('/LICENSE') + ? 'text/plain; charset=utf-8' + : 'application/javascript'; + headers.set('Content-Type', contentType); + headers.set('Cache-Control', 'public, max-age=31536000, immutable'); + headers.set('Access-Control-Allow-Origin', 'https://app.example.com'); + return new Response(object.body, { headers }); + }, +}; +``` -- [ ] Create Cloudflare account (if needed) -- [ ] Set up R2 bucket `wa-sqlite-cdn` -- [ ] Upload wa-sqlite files with version prefix -- [ ] Deploy CDN worker with CORS + cache headers -- [ ] Configure custom domain `wa-sqlite.trestle.inc` -- [ ] Update replicate worker.ts with new CDN_BASE -- [ ] Test in development and production -- [ ] Set up monitoring/alerts -- [ ] Document CDN URL for library users +Do not mutate objects under an existing versioned prefix. diff --git a/docs/tests.md b/docs/tests.md index 8123210..67d7d04 100644 --- a/docs/tests.md +++ b/docs/tests.md @@ -14,12 +14,12 @@ Replicate requires testing across multiple layers: ## Test Categories & Environments -| Category | Environment | Purpose | Tools | -| ---------------- | ------------ | --------------------------------- | ----------------------- | -| **Unit** | jsdom | Actor logic, validators, Yjs ops | Vitest + @effect/vitest | -| **Integration** | jsdom | Collection sync, offline→online | fake-indexeddb + Yjs | -| **E2E (Convex)** | edge-runtime | Component mutations, compaction | convex-test | -| **Browser** | Playwright | SQLite persistence, OPFS, Workers | @vitest/browser | +| Category | Environment | Purpose | Tools | +| ---------------- | ------------ | -------------------------------------- | ----------------------- | +| **Unit** | jsdom | Actor logic, validators, Yjs ops | Vitest + @effect/vitest | +| **Integration** | jsdom | Collection sync, offline→online | fake-indexeddb + Yjs | +| **E2E (Convex)** | edge-runtime | Component mutations, compaction | convex-test | +| **Browser** | Playwright | SQLite persistence, IndexedDB, Workers | @vitest/browser | ## Dependencies @@ -50,7 +50,7 @@ src/test/ │ ├── compaction.test.ts # scheduleCompaction + runCompaction │ └── presence.test.ts # Sessions, mark, presence └── browser/ # @vitest/browser (Playwright) - ├── sqlite.test.ts # wa-sqlite + OPFS + ├── sqlite.test.ts # wa-sqlite + IDBBatchAtomicVFS └── worker.test.ts # Web Worker communication ``` @@ -277,14 +277,19 @@ test('extracts prose text', () => { ```typescript // @vitest-environment browser -import { persistence } from '$/client/persistence'; +import { persistence } from '@trestleinc/replicate/client'; +import SqliteWorker from '@trestleinc/replicate/worker?worker'; describe('SQLite Persistence', () => { - let db: Awaited>; + let db: Awaited>; + let name: string; beforeEach(async () => { - db = await persistence.web.sqlite({ - name: `test-${crypto.randomUUID()}`, + name = `test-${crypto.randomUUID()}`; + db = await persistence.web.sqlite.create({ + name, + assetBase: '/replicate-sqlite', + worker: () => new SqliteWorker(), }); }); @@ -293,16 +298,21 @@ describe('SQLite Persistence', () => { }); test('persists and retrieves data', async () => { - await db.kv.set('key', new Uint8Array([1, 2, 3])); + await db.kv.set('key', 'value'); const result = await db.kv.get('key'); - expect(result).toEqual(new Uint8Array([1, 2, 3])); + expect(result).toBe('value'); }); - test('uses OPFS via wa-sqlite', async () => { - // OPFS is automatically used when available - const estimate = await navigator.storage.estimate(); - expect(estimate.quota).toBeGreaterThan(0); + test('reopens IDBBatchAtomicVFS data from IndexedDB', async () => { + await db.kv.set('key', 'durable'); + await db.close(); + db = await persistence.web.sqlite.create({ + name, + assetBase: '/replicate-sqlite', + worker: () => new SqliteWorker(), + }); + expect(await db.kv.get('key')).toBe('durable'); }); }); ``` @@ -408,7 +418,7 @@ export const createDocWithFields = (fields: Record): Y.Doc => { - Client → server → other clients - Offline accumulation → online sync 5. **Browser persistence** - Real browser APIs - - wa-sqlite + OPFS + - wa-sqlite + IDBBatchAtomicVFS (IndexedDB) - Web Worker communication ## Running Tests @@ -636,7 +646,7 @@ Rather than writing 100+ trivial tests, aim for: | **Compaction flow** | 3-5 tests | Scheduling, retry, peer safety, retain logic | | **Effect actors** | 4-6 tests | Batching, debounce, retry, shutdown cleanup | | **Integration sync** | 3-5 tests | Full client→server→client cycle, offline→online | -| **Browser persistence** | 2-4 tests | SQLite write/read, OPFS access | +| **Browser persistence** | 2-4 tests | SQLite write/read, IndexedDB reopen | **Total: ~17-28 deep tests** (not 50+ shallow ones) diff --git a/packages/replicate/scripts/test-offline-browser.mjs b/packages/replicate/scripts/test-offline-browser.mjs index 0b73575..54f4860 100644 --- a/packages/replicate/scripts/test-offline-browser.mjs +++ b/packages/replicate/scripts/test-offline-browser.mjs @@ -152,7 +152,12 @@ try { assert.equal(requests, requestCount); assert.deepEqual(errors, []); checks++; - await page.evaluate(() => window.replica.close()); + assert.deepEqual(await page.evaluate(() => window.replica.closeRace()), { + acceptedCompleted: true, + closeMessages: 1, + lateRejected: true, + }); + checks++; process.stdout.write(`${checks} real Chromium offline/process-restart checks passed\n`); } finally { await context?.close(); diff --git a/packages/replicate/src/client/collection.ts b/packages/replicate/src/client/collection.ts index b9460cf..6df93d8 100644 --- a/packages/replicate/src/client/collection.ts +++ b/packages/replicate/src/client/collection.ts @@ -1029,9 +1029,21 @@ export function convexCollectionOptions( (fields) => { const ctx = hasContext(collection) ? getContext(collection) : null; const effectiveClientId = ctx?.clientId ?? 'local'; + const modifiedKeys = new Set( + Object.entries(modifiedFields) + .filter(([key, value]) => crdtFields.has(key) || value !== undefined) + .map(([key]) => key) + ); + fields.forEach((_, key) => { + if (!crdtFields.has(key) && !modifiedKeys.has(key)) fields.delete(key); + }); Object.entries(modifiedFields).forEach(([k, v]) => { const crdtInfo = crdtFields.get(k); + if (!crdtInfo && v === undefined) { + fields.delete(k); + return; + } // Handle register updates specially - set value with client ID if (crdtInfo?.type === 'register') { diff --git a/packages/replicate/src/client/persistence/custom.ts b/packages/replicate/src/client/persistence/custom.ts index 13c58ec..829f23c 100644 --- a/packages/replicate/src/client/persistence/custom.ts +++ b/packages/replicate/src/client/persistence/custom.ts @@ -28,6 +28,7 @@ class AdapterPersistenceProvider implements PersistenceProvider { private updateHandler: (update: Uint8Array, origin: unknown) => void; private updateCounter = 0; private writes = new PersistenceWrites(); + private acceptingWrites = true; readonly whenSynced: Promise; constructor( @@ -38,7 +39,7 @@ class AdapterPersistenceProvider implements PersistenceProvider { this.whenSynced = this.loadState(); this.updateHandler = (update: Uint8Array, origin: unknown) => { - if (origin !== 'custom' && origin !== 'replicate-persisted') { + if (this.acceptingWrites && origin !== 'custom' && origin !== 'replicate-persisted') { this.writes.add(async () => { await this.whenSynced; await this.saveUpdate(update); @@ -76,6 +77,7 @@ class AdapterPersistenceProvider implements PersistenceProvider { } async storeUpdate(update: Uint8Array): Promise { + if (!this.acceptingWrites) throw new Error('Persistence provider is closed'); const bytes = Y.convertUpdateFormatV2ToV1(update); this.writes.add(async () => { await this.whenSynced; @@ -99,6 +101,7 @@ class AdapterPersistenceProvider implements PersistenceProvider { } destroy(): void { + this.acceptingWrites = false; this.ydoc.off('update', this.updateHandler); } } diff --git a/packages/replicate/src/client/persistence/encrypted/web.ts b/packages/replicate/src/client/persistence/encrypted/web.ts index 7858db7..640914e 100644 --- a/packages/replicate/src/client/persistence/encrypted/web.ts +++ b/packages/replicate/src/client/persistence/encrypted/web.ts @@ -82,6 +82,7 @@ class EncryptedKeyValueStore implements KeyValueStore { class EncryptedPersistenceProvider implements PersistenceProvider { private updateHandler: (update: Uint8Array, origin: unknown) => void; private writes = new PersistenceWrites(); + private acceptingWrites = true; readonly whenSynced: Promise; constructor( @@ -94,7 +95,7 @@ class EncryptedPersistenceProvider implements PersistenceProvider { this.whenSynced = this.loadState(); this.updateHandler = (update: Uint8Array, origin: unknown) => { - if (origin !== 'encrypted-load' && origin !== 'replicate-persisted') { + if (this.acceptingWrites && origin !== 'encrypted-load' && origin !== 'replicate-persisted') { this.writes.add(async () => { await this.whenSynced; await this.saveUpdate(update); @@ -154,6 +155,7 @@ class EncryptedPersistenceProvider implements PersistenceProvider { } async storeUpdate(update: Uint8Array): Promise { + if (!this.acceptingWrites) throw new Error('Persistence provider is closed'); this.writes.add(async () => { await this.whenSynced; await this.saveUpdate(Y.convertUpdateFormatV2ToV1(update)); @@ -170,6 +172,7 @@ class EncryptedPersistenceProvider implements PersistenceProvider { } destroy(): void { + this.acceptingWrites = false; this.ydoc.off('update', this.updateHandler); } } diff --git a/packages/replicate/src/client/persistence/memory.ts b/packages/replicate/src/client/persistence/memory.ts index 089c9da..dfb659c 100644 --- a/packages/replicate/src/client/persistence/memory.ts +++ b/packages/replicate/src/client/persistence/memory.ts @@ -32,13 +32,18 @@ class MemoryKeyValueStore implements KeyValueStore { */ class MemoryPersistenceProvider implements PersistenceProvider { readonly whenSynced = Promise.resolve(); + private acceptingWrites = true; - async storeUpdate(_update: Uint8Array): Promise {} + async storeUpdate(_update: Uint8Array): Promise { + if (!this.acceptingWrites) throw new Error('Persistence provider is closed'); + } async flush(): Promise {} - async clear(): Promise {} + async clear(): Promise { + this.destroy(); + } destroy(): void { - // No resources to clean up + this.acceptingWrites = false; } } diff --git a/packages/replicate/src/client/persistence/sqlite/native.ts b/packages/replicate/src/client/persistence/sqlite/native.ts index 5b1ba8e..93ecc24 100644 --- a/packages/replicate/src/client/persistence/sqlite/native.ts +++ b/packages/replicate/src/client/persistence/sqlite/native.ts @@ -1,4 +1,9 @@ -import { initSchema, createPersistenceFromExecutor, type Executor } from './schema.js'; +import { + initSchema, + createPersistenceFromExecutor, + type Executor, + type SqliteStatement, +} from './schema.js'; import type { Persistence } from '../types.js'; interface OPSQLiteDatabase { @@ -7,15 +12,52 @@ interface OPSQLiteDatabase { } class OPSqliteExecutor implements Executor { + private tail: Promise = Promise.resolve(); + private closing = false; + private closePromise: Promise | null = null; + constructor(private db: OPSQLiteDatabase) {} - async execute(sql: string, params?: unknown[]): Promise<{ rows: Record[] }> { - const result = await this.db.execute(sql, params); - return { rows: result.rows || [] }; + private enqueue(operation: () => Promise): Promise { + if (this.closing) return Promise.reject(new Error('SQLite database is closing')); + const result = this.tail.catch(() => {}).then(operation); + this.tail = result; + return result; + } + + execute(sql: string, params?: unknown[]): Promise<{ rows: Record[] }> { + return this.enqueue(async () => { + const result = await this.db.execute(sql, params); + return { rows: result.rows || [] }; + }); + } + + transaction(statements: readonly SqliteStatement[]): Promise { + return this.enqueue(async () => { + await this.db.execute('BEGIN IMMEDIATE'); + try { + for (const statement of statements) { + await this.db.execute(statement.sql, statement.params); + } + await this.db.execute('COMMIT'); + } catch (error) { + try { + await this.db.execute('ROLLBACK'); + } catch { + // Preserve the statement failure that caused the rollback. + } + throw error; + } + }); } - close(): void { - this.db.close(); + async close(): Promise { + if (!this.closePromise) { + this.closing = true; + this.closePromise = this.tail.catch(() => {}).then(() => this.db.close()); + this.tail = this.closePromise; + } + await this.closePromise; } } diff --git a/packages/replicate/src/client/persistence/sqlite/schema.ts b/packages/replicate/src/client/persistence/sqlite/schema.ts index 93275f5..4f6381e 100644 --- a/packages/replicate/src/client/persistence/sqlite/schema.ts +++ b/packages/replicate/src/client/persistence/sqlite/schema.ts @@ -9,9 +9,15 @@ import type { export interface Executor { execute(sql: string, params?: unknown[]): Promise<{ rows: Record[] }>; + transaction(statements: readonly SqliteStatement[]): Promise; close(): void | Promise; } +export interface SqliteStatement { + sql: string; + params?: unknown[]; +} + export async function initSchema(executor: Executor): Promise { await executor.execute(` CREATE TABLE IF NOT EXISTS snapshots ( @@ -43,15 +49,20 @@ export async function initSchema(executor: Executor): Promise { } class SqliteKeyValueStore implements KeyValueStore { - constructor(private executor: Executor) {} + constructor( + private executor: Executor, + private assertOpen: () => void + ) {} async get(key: string): Promise { + this.assertOpen(); const result = await this.executor.execute('SELECT value FROM kv WHERE key = ?', [key]); if (result.rows.length === 0) return undefined; return JSON.parse(result.rows[0].value as string) as T; } async set(key: string, value: T): Promise { + this.assertOpen(); await this.executor.execute('INSERT OR REPLACE INTO kv (key, value) VALUES (?, ?)', [ key, JSON.stringify(value), @@ -59,6 +70,7 @@ class SqliteKeyValueStore implements KeyValueStore { } async del(key: string): Promise { + this.assertOpen(); await this.executor.execute('DELETE FROM kv WHERE key = ?', [key]); } } @@ -67,23 +79,30 @@ class SqliteKeyValueStore implements KeyValueStore { * Adapter that wraps Executor to provide MigrationDatabase interface. */ class SqliteMigrationDatabase implements MigrationDatabase { - constructor(private executor: Executor) {} + constructor( + private executor: Executor, + private assertOpen: () => void + ) {} async run(sql: string, params?: unknown[]): Promise { + this.assertOpen(); await this.executor.execute(sql, params); } async exec(sql: string): Promise { + this.assertOpen(); await this.executor.execute(sql); } async get(sql: string, params?: unknown[]): Promise { + this.assertOpen(); const result = await this.executor.execute(sql, params); if (result.rows.length === 0) return undefined; return result.rows[0] as T; } async all(sql: string, params?: unknown[]): Promise { + this.assertOpen(); const result = await this.executor.execute(sql, params); return result.rows as T[]; } @@ -92,6 +111,7 @@ class SqliteMigrationDatabase implements MigrationDatabase { class SqlitePersistenceProvider implements PersistenceProvider { private updateHandler: (update: Uint8Array, origin: unknown) => void; private writes = new PersistenceWrites(); + private acceptingWrites = true; readonly whenSynced: Promise; constructor( @@ -102,7 +122,7 @@ class SqlitePersistenceProvider implements PersistenceProvider { this.whenSynced = this.loadState(); this.updateHandler = (update: Uint8Array, origin: unknown) => { - if (origin !== 'sqlite' && origin !== 'replicate-persisted') { + if (this.acceptingWrites && origin !== 'sqlite' && origin !== 'replicate-persisted') { this.writes.add(async () => { await this.whenSynced; await this.saveUpdate(update); @@ -113,6 +133,7 @@ class SqlitePersistenceProvider implements PersistenceProvider { } async storeUpdate(update: Uint8Array): Promise { + if (!this.acceptingWrites) throw new Error('Persistence provider is closed'); const bytes = Y.convertUpdateFormatV2ToV1(update); this.writes.add(async () => { await this.whenSynced; @@ -129,8 +150,10 @@ class SqlitePersistenceProvider implements PersistenceProvider { async clear(): Promise { this.destroy(); await this.flush(); - await this.executor.execute('DELETE FROM snapshots WHERE collection = ?', [this.collection]); - await this.executor.execute('DELETE FROM deltas WHERE collection = ?', [this.collection]); + await this.executor.transaction([ + { sql: 'DELETE FROM snapshots WHERE collection = ?', params: [this.collection] }, + { sql: 'DELETE FROM deltas WHERE collection = ?', params: [this.collection] }, + ]); } private async loadState(): Promise { @@ -165,20 +188,45 @@ class SqlitePersistenceProvider implements PersistenceProvider { } destroy(): void { + this.acceptingWrites = false; this.ydoc.off('update', this.updateHandler); } } export function createPersistenceFromExecutor(executor: Executor): Persistence { const providers = new Set(); - return { - async close() { - for (const provider of providers) provider.destroy(); - for (const provider of providers) await provider.flush?.(); + let closing = false; + let closePromise: Promise | null = null; + const assertOpen = () => { + if (closing) throw new Error('SQLite persistence is closing'); + }; + const close = async () => { + const active = [...providers]; + for (const provider of active) provider.destroy(); + const failures: unknown[] = []; + for (const result of await Promise.allSettled(active.map((provider) => provider.flush?.()))) { + if (result.status === 'rejected') failures.push(result.reason); + } + try { await executor.close(); + } catch (error) { + failures.push(error); + } finally { providers.clear(); + } + if (failures.length === 1) throw failures[0]; + if (failures.length > 1) throw new AggregateError(failures, 'Persistence close failed'); + }; + return { + close() { + if (!closePromise) { + closing = true; + closePromise = close(); + } + return closePromise; }, createDocPersistence: (collection: string, ydoc: Y.Doc) => { + assertOpen(); const provider = new SqlitePersistenceProvider(executor, collection, ydoc); providers.add(provider); const detach = provider.destroy.bind(provider); @@ -192,6 +240,7 @@ export function createPersistenceFromExecutor(executor: Executor): Persistence { return provider; }, async listDocuments(prefix: string): Promise { + assertOpen(); const result = await executor.execute( `SELECT DISTINCT collection FROM ( SELECT collection FROM snapshots WHERE collection LIKE ? @@ -206,7 +255,7 @@ export function createPersistenceFromExecutor(executor: Executor): Persistence { return parts.slice(1).join(':'); }); }, - kv: new SqliteKeyValueStore(executor), - db: new SqliteMigrationDatabase(executor), + kv: new SqliteKeyValueStore(executor, assertOpen), + db: new SqliteMigrationDatabase(executor, assertOpen), }; } diff --git a/packages/replicate/src/client/persistence/sqlite/web.ts b/packages/replicate/src/client/persistence/sqlite/web.ts index 0f79575..328591a 100644 --- a/packages/replicate/src/client/persistence/sqlite/web.ts +++ b/packages/replicate/src/client/persistence/sqlite/web.ts @@ -1,10 +1,11 @@ -import { createPersistenceFromExecutor, type Executor } from './schema.js'; +import { createPersistenceFromExecutor, type Executor, type SqliteStatement } from './schema.js'; import type { Persistence } from '../types.js'; import { compileWasmModule, CDN_BASE } from './preload.js'; const INIT = 0; const EXECUTE = 1; const CLOSE = 2; +const TRANSACTION = 4; interface Request { id: number; @@ -14,6 +15,7 @@ interface Request { assetBase?: string; sql?: string; params?: unknown[]; + statements?: readonly SqliteStatement[]; } interface Response { @@ -33,6 +35,7 @@ class WorkerExecutor implements Executor { private nextId = 0; private pending = new Map(); private terminated = false; + private closePromise: Promise | null = null; constructor(worker: Worker) { this.worker = worker; @@ -64,6 +67,7 @@ class WorkerExecutor implements Executor { private rejectAllPending(error: Error): void { this.terminated = true; + this.worker.terminate(); for (const [, handler] of this.pending) { handler.reject(error); } @@ -72,13 +76,18 @@ class WorkerExecutor implements Executor { private send(type: number, payload: Partial = {}): Promise[]> { return new Promise((resolve, reject) => { - if (this.terminated) { - reject(new Error('Worker has been terminated')); + if (this.terminated || (this.closePromise && type !== CLOSE)) { + reject(new Error(this.terminated ? 'Worker has been terminated' : 'Worker is closing')); return; } const id = this.nextId++; this.pending.set(id, { resolve, reject }); - this.worker.postMessage({ id, type, ...payload } satisfies Request); + try { + this.worker.postMessage({ id, type, ...payload } satisfies Request); + } catch (error) { + this.pending.delete(id); + reject(error); + } }); } @@ -91,11 +100,26 @@ class WorkerExecutor implements Executor { return { rows }; } + async transaction(statements: readonly SqliteStatement[]): Promise { + await this.send(TRANSACTION, { statements }); + } + async close(): Promise { if (this.terminated) return; - await this.send(CLOSE); - this.terminated = true; - this.worker.terminate(); + if (!this.closePromise) { + this.closePromise = this.send(CLOSE).then( + () => { + this.terminated = true; + this.worker.terminate(); + }, + (error) => { + this.terminated = true; + this.worker.terminate(); + throw error; + } + ); + } + await this.closePromise; } } diff --git a/packages/replicate/src/client/persistence/sqlite/worker.ts b/packages/replicate/src/client/persistence/sqlite/worker.ts index 04dcfaa..309e490 100644 --- a/packages/replicate/src/client/persistence/sqlite/worker.ts +++ b/packages/replicate/src/client/persistence/sqlite/worker.ts @@ -1,18 +1,20 @@ -import { initSchema, type Executor } from './schema.js'; +import { initSchema, type Executor, type SqliteStatement } from './schema.js'; const INIT = 0; const EXECUTE = 1; const CLOSE = 2; const FLUSH = 3; +const TRANSACTION = 4; interface Request { id: number; - type: typeof INIT | typeof EXECUTE | typeof CLOSE | typeof FLUSH; + type: typeof INIT | typeof EXECUTE | typeof CLOSE | typeof FLUSH | typeof TRANSACTION; name?: string; wasmModule?: WebAssembly.Module; assetBase?: string; sql?: string; params?: unknown[]; + statements?: readonly SqliteStatement[]; } interface Response { @@ -26,6 +28,8 @@ let sqlite3: any; let db: number; let vfs: any; let mutex: Promise = Promise.resolve(); +let closing = false; +let closePromise: Promise | null = null; async function init( name: string, @@ -66,38 +70,62 @@ async function init( sqlite3.close(db); vfs.close(); }, + transaction, }; await initSchema(executor); } -function execute(sql: string, params?: unknown[]): Promise<{ rows: Record[] }> { - const operation = mutex - .catch(() => {}) - .then(async () => { - const rows: Record[] = []; - - for await (const stmt of sqlite3.statements(db, sql)) { - if (params && params.length > 0) { - sqlite3.bind_collection(stmt, params); - } - - const columns: string[] = sqlite3.column_names(stmt); - while ((await sqlite3.step(stmt)) === 100) { - const row = sqlite3.row(stmt); - const obj: Record = {}; - columns.forEach((col: string, i: number) => { - obj[col] = row[i]; - }); - rows.push(obj); - } - } +async function executeNow( + sql: string, + params?: unknown[] +): Promise<{ rows: Record[] }> { + const rows: Record[] = []; + + for await (const stmt of sqlite3.statements(db, sql)) { + if (params && params.length > 0) { + sqlite3.bind_collection(stmt, params); + } + + const columns: string[] = sqlite3.column_names(stmt); + while ((await sqlite3.step(stmt)) === 100) { + const row = sqlite3.row(stmt); + const obj: Record = {}; + columns.forEach((col: string, i: number) => { + obj[col] = row[i]; + }); + rows.push(obj); + } + } + + return { rows }; +} + +function serialize(operation: () => Promise): Promise { + const result = mutex.catch(() => {}).then(operation); + mutex = result; + return result; +} - return { rows }; - }); +function execute(sql: string, params?: unknown[]): Promise<{ rows: Record[] }> { + return serialize(() => executeNow(sql, params)); +} - mutex = operation; - return operation; +function transaction(statements: readonly SqliteStatement[]): Promise { + return serialize(async () => { + await executeNow('BEGIN IMMEDIATE'); + try { + for (const statement of statements) await executeNow(statement.sql, statement.params); + await executeNow('COMMIT'); + } catch (error) { + try { + await executeNow('ROLLBACK'); + } catch { + // Preserve the statement failure that caused the rollback. + } + throw error; + } + }); } self.onmessage = async (e: MessageEvent) => { @@ -110,17 +138,30 @@ self.onmessage = async (e: MessageEvent) => { self.postMessage({ id, ok: true } satisfies Response); break; case EXECUTE: { + if (closing) throw new Error('SQLite worker is closing'); const result = await execute(sql!, params); self.postMessage({ id, ok: true, rows: result.rows } satisfies Response); break; } case FLUSH: + if (closing) throw new Error('SQLite worker is closing'); + await mutex; + self.postMessage({ id, ok: true } satisfies Response); + break; + case TRANSACTION: + if (closing) throw new Error('SQLite worker is closing'); + await transaction(e.data.statements!); self.postMessage({ id, ok: true } satisfies Response); break; case CLOSE: - await mutex; - await sqlite3.close(db); - await vfs.close(); + closing = true; + closePromise ??= mutex + .catch(() => {}) + .then(async () => { + await sqlite3.close(db); + await vfs.close(); + }); + await closePromise; self.postMessage({ id, ok: true } satisfies Response); break; } diff --git a/packages/replicate/src/test/offline.test.ts b/packages/replicate/src/test/offline.test.ts index 0b46920..ed3e152 100644 --- a/packages/replicate/src/test/offline.test.ts +++ b/packages/replicate/src/test/offline.test.ts @@ -68,6 +68,7 @@ async function disk(path?: string, before?: (sql: string, params?: unknown[]) => path = join(directory, 'replica.sqlite'); } const db = new DatabaseSync(path); + let closed = false; const persistence = await createNativeSqlitePersistence( { async execute(sql, params = []) { @@ -79,12 +80,13 @@ async function disk(path?: string, before?: (sql: string, params?: unknown[]) => return { rows: [] }; }, close() { + closed = true; db.close(); }, }, path ); - return { persistence, path }; + return { persistence, path, database: db, isClosed: () => closed }; } async function seed(p: Persistence, id = 'a') { const doc = new Y.Doc(); @@ -448,6 +450,40 @@ test('writable default still inserts and sends document updates', async () => { await vi.waitFor(() => expect(rows.get('new')?.title).toBe('edited')); }); +test('full-row updates remove omitted optional fields from outbound and reopened data', async () => { + const first = await disk(); + disposals.push(() => first.persistence.close!()); + const net = transport(); + const { rows } = await open(first.persistence, net, { networkMode: 'manual' }); + let seq = 0; + net.client.mutation.mockImplementation(async (ref: any, args: any) => { + if (getFunctionName(ref) === 'offline:replicate') + net.emit(page({ ...args, seq: ++seq, exists: true })); + return { success: true, seq }; + }); + await rows.connect(); + await rows.insert({ id: 'optional', title: 'row', note: 'remove me' }).isPersisted.promise; + await rows.update('optional', (row) => { + row.note = undefined; + }).isPersisted.promise; + await vi.waitFor(() => expect(rows.get('optional')).not.toHaveProperty('note')); + const update = net.client.mutation.mock.calls + .filter( + ([ref, args]: any) => getFunctionName(ref) === 'offline:replicate' && args.type === 'update' + ) + .at(-1)?.[1]; + expect(update.material).not.toHaveProperty('note'); + await rows.disconnect(); + await rows.cleanup(); + disposals.pop(); + await first.persistence.close!(); + + const reopened = await disk(first.path); + disposals.push(() => reopened.persistence.close!()); + const next = await open(reopened.persistence, transport(), { networkMode: 'manual' }); + expect(next.rows.get('optional')).toEqual({ id: 'optional', title: 'row' }); +}); + test('delayed data and cursor writes cannot be overtaken by marks or concurrent callbacks', async () => { const dataGate = deferred(); const cursorGate = deferred(); @@ -467,11 +503,16 @@ test('delayed data and cursor writes cannot be overtaken by marks or concurrent callback(page(change('a', 1))); callback(page(change('a', 1), change('b', 2))); await new Promise((resolve) => setTimeout(resolve, 20)); - expect(await db.persistence.kv.get('cursor:offline')).toBeUndefined(); + expect( + db.database.prepare("SELECT value FROM kv WHERE key = 'cursor:offline'").get() + ).toBeUndefined(); expect(network.client.mutation).not.toHaveBeenCalled(); delayData = false; dataGate.resolve(); await new Promise((resolve) => setTimeout(resolve, 20)); + expect( + db.database.prepare("SELECT value FROM kv WHERE key = 'cursor:offline'").get() + ).toBeUndefined(); expect(network.client.mutation).not.toHaveBeenCalled(); delayCursor = false; cursorGate.resolve(); @@ -619,6 +660,77 @@ test('raw incremental update survives disk restart before its compacted base arr await vi.waitFor(() => expect(next.rows.get('a')?.title).toBe('latest')); }); +test('SQLite clear rolls back both tables, fences writes, and survives reopen', async () => { + const first = await disk(); + const source = new Y.Doc(); + source.getMap('fields').set('title', 'base'); + const base = Y.encodeStateAsUpdate(source); + const vector = Y.encodeStateVector(source); + source.getMap('fields').set('title', 'complete'); + const delta = Y.encodeStateAsUpdate(source, vector); + first.database + .prepare('INSERT INTO snapshots (collection, data) VALUES (?, ?)') + .run('offline:a', base); + first.database + .prepare('INSERT INTO deltas (collection, data) VALUES (?, ?)') + .run('offline:a', delta); + first.database.exec(` + CREATE TRIGGER reject_delta_delete + BEFORE DELETE ON deltas + BEGIN SELECT RAISE(ABORT, 'blocked delta delete'); END + `); + const loaded = new Y.Doc(); + const provider = first.persistence.createDocPersistence('offline:a', loaded); + await provider.whenSynced; + expect(loaded.getMap('fields').get('title')).toBe('complete'); + await expect(provider.clear!()).rejects.toThrow('blocked delta delete'); + expect( + first.database + .prepare("SELECT count(*) AS count FROM snapshots WHERE collection = 'offline:a'") + .get() + ).toHaveProperty('count', 1); + expect( + first.database + .prepare("SELECT count(*) AS count FROM deltas WHERE collection = 'offline:a'") + .get() + ).toHaveProperty('count', 1); + first.database.exec('DROP TRIGGER reject_delta_delete'); + await first.persistence.close!(); + + const reopened = await disk(first.path); + const restored = new Y.Doc(); + const retry = reopened.persistence.createDocPersistence('offline:a', restored); + await retry.whenSynced; + expect(restored.getMap('fields').get('title')).toBe('complete'); + await retry.clear!(); + await expect(retry.storeUpdate!(base)).rejects.toThrow('closed'); + await reopened.persistence.close!(); + + const final = await disk(first.path); + disposals.push(() => final.persistence.close!()); + expect(await final.persistence.listDocuments('offline')).toEqual([]); + source.destroy(); + loaded.destroy(); + restored.destroy(); +}); + +test('SQLite close releases the database after a queued write fails', async () => { + const first = await disk(undefined, async (sql) => { + if (sql.startsWith('INSERT INTO deltas')) throw new Error('injected write failure'); + }); + const doc = new Y.Doc(); + const provider = first.persistence.createDocPersistence('offline:a', doc); + await provider.whenSynced; + doc.getMap('fields').set('title', 'failure'); + await expect(provider.flush!()).rejects.toThrow('injected write failure'); + await expect(first.persistence.close!()).rejects.toThrow('injected write failure'); + expect(first.isClosed()).toBe(true); + const reopened = await disk(first.path); + disposals.push(() => reopened.persistence.close!()); + expect(await reopened.persistence.listDocuments('offline')).toEqual([]); + doc.destroy(); +}); + test('custom adapter drains delayed updates before durable removal', async () => { const values = new Map(); const gate = deferred(); diff --git a/packages/replicate/test/browser/main.ts b/packages/replicate/test/browser/main.ts index 4c112a9..a53c3fc 100644 --- a/packages/replicate/test/browser/main.ts +++ b/packages/replicate/test/browser/main.ts @@ -31,9 +31,16 @@ const transport = { }; }, }; +let closeMessages = 0; +const sqliteWorker = new Worker(); +const postMessage = sqliteWorker.postMessage.bind(sqliteWorker); +sqliteWorker.postMessage = ((message: { type?: number }, options?: StructuredSerializeOptions) => { + if (message.type === 2) closeMessages++; + postMessage(message, options); +}) as typeof sqliteWorker.postMessage; const local = await persistence.web.sqlite.create({ name: 'offline-browser', - worker: () => new Worker(), + worker: sqliteWorker, assetBase: '/sqlite', }); const lazy = collection.create<{ id: string; title: string }>({ @@ -66,6 +73,24 @@ Object.assign(window, { await rows.cleanup(); await local.close!(); }, + closeRace: async () => { + await rows.disconnect(); + await rows.cleanup(); + let acceptedCompleted = false; + const accepted = local.kv.set('accepted-before-close', true).then(() => { + acceptedCompleted = true; + }); + const first = local.close!(); + const second = local.close!(); + let lateRejected = false; + try { + await local.kv.get('late'); + } catch { + lateRejected = true; + } + await Promise.all([accepted, first, second]); + return { acceptedCompleted, closeMessages, lateRejected }; + }, emit: (id: string, seq: number, exists = true, raw?: number[]) => { const doc = new Y.Doc(); doc.getMap('fields').set('title', 'persisted in browser'); From 267ef9f52fd388a4179bbcf822ce413884a1cc93 Mon Sep 17 00:00:00 2001 From: ettoc00 <41289053+ettoc00@users.noreply.github.com> Date: Thu, 17 Sep 2026 21:33:38 +0200 Subject: [PATCH 04/14] docs: make SQLite cleanup example type-safe --- docs/tests.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tests.md b/docs/tests.md index 67d7d04..6af3dc3 100644 --- a/docs/tests.md +++ b/docs/tests.md @@ -294,7 +294,7 @@ describe('SQLite Persistence', () => { }); afterEach(async () => { - await db.close(); + await db.close!(); }); test('persists and retrieves data', async () => { @@ -306,7 +306,7 @@ describe('SQLite Persistence', () => { test('reopens IDBBatchAtomicVFS data from IndexedDB', async () => { await db.kv.set('key', 'durable'); - await db.close(); + await db.close!(); db = await persistence.web.sqlite.create({ name, assetBase: '/replicate-sqlite', From 26df7352a95d074081e49cf3913d32dc576ffe21 Mon Sep 17 00:00:00 2001 From: OpenAI Codex Date: Sat, 19 Sep 2026 18:27:32 +0200 Subject: [PATCH 05/14] refactor: source sqlite runtime from pinned dependency --- apps/sveltekit/package.json | 1 - bun.lock | 7 +- docs/CDN.md | 25 +- docs/offline-replicas.md | 8 +- package.json | 1 - .../assets/wa-sqlite/ACKNOWLEDGMENTS.md | 45 - packages/replicate/assets/wa-sqlite/LICENSE | 21 - .../replicate/assets/wa-sqlite/PROVENANCE.md | 18 + .../assets/wa-sqlite/dist/wa-sqlite-async.mjs | 16 - .../wa-sqlite/dist/wa-sqlite-async.wasm | Bin 1223567 -> 0 bytes .../replicate/assets/wa-sqlite/manifest.json | 59 +- .../assets/wa-sqlite/src/FacadeVFS.js | 508 ---------- .../replicate/assets/wa-sqlite/src/VFS.js | 222 ----- .../assets/wa-sqlite/src/WebLocksMixin.js | 412 --------- .../src/examples/IDBBatchAtomicVFS.js | 820 ----------------- .../assets/wa-sqlite/src/sqlite-api.js | 870 ------------------ .../assets/wa-sqlite/src/sqlite-constants.js | 275 ------ packages/replicate/package.json | 13 +- .../replicate/scripts/copy-sqlite-assets.mjs | 41 +- .../scripts/test-offline-browser.mjs | 58 +- .../scripts/test-packed-consumer.mjs | 80 ++ .../scripts/verify-sqlite-provenance.mjs | 16 +- packages/replicate/src/test/assets.test.ts | 9 + packages/replicate/test/browser/main.ts | 5 +- packages/replicate/tsdown.config.ts | 4 +- 25 files changed, 280 insertions(+), 3254 deletions(-) delete mode 100644 packages/replicate/assets/wa-sqlite/ACKNOWLEDGMENTS.md delete mode 100644 packages/replicate/assets/wa-sqlite/LICENSE create mode 100644 packages/replicate/assets/wa-sqlite/PROVENANCE.md delete mode 100644 packages/replicate/assets/wa-sqlite/dist/wa-sqlite-async.mjs delete mode 100644 packages/replicate/assets/wa-sqlite/dist/wa-sqlite-async.wasm delete mode 100644 packages/replicate/assets/wa-sqlite/src/FacadeVFS.js delete mode 100644 packages/replicate/assets/wa-sqlite/src/VFS.js delete mode 100644 packages/replicate/assets/wa-sqlite/src/WebLocksMixin.js delete mode 100644 packages/replicate/assets/wa-sqlite/src/examples/IDBBatchAtomicVFS.js delete mode 100644 packages/replicate/assets/wa-sqlite/src/sqlite-api.js delete mode 100644 packages/replicate/assets/wa-sqlite/src/sqlite-constants.js create mode 100644 packages/replicate/scripts/test-packed-consumer.mjs diff --git a/apps/sveltekit/package.json b/apps/sveltekit/package.json index 9040ebd..5475bab 100644 --- a/apps/sveltekit/package.json +++ b/apps/sveltekit/package.json @@ -41,7 +41,6 @@ "convex": "catalog:", "convex-svelte": "catalog:", "tailwind-merge": "catalog:", - "wa-sqlite": "catalog:", "lib0": "catalog:", "y-protocols": "catalog:", "yjs": "catalog:", diff --git a/bun.lock b/bun.lock index a625cac..be7968a 100644 --- a/bun.lock +++ b/bun.lock @@ -108,7 +108,6 @@ "convex-svelte": "catalog:", "lib0": "catalog:", "tailwind-merge": "catalog:", - "wa-sqlite": "catalog:", "y-protocols": "catalog:", "yjs": "catalog:", "zod": "catalog:", @@ -219,6 +218,7 @@ "dependencies": { "@logtape/logtape": "catalog:", "@logtape/pretty": "catalog:", + "wa-sqlite": "https://codeload.github.com/rhashimoto/wa-sqlite/tar.gz/07ad48cf2f682d279f9cd69818cc1d39b2ccda86", }, "devDependencies": { "@convex-dev/eslint-plugin": "catalog:", @@ -254,13 +254,11 @@ "@tanstack/db": "^0.5.20", "convex": "^1.31.4", "lib0": "^0.2.0", - "wa-sqlite": "1.0.0", "y-protocols": "1.0.7", "yjs": "13.6.29", }, "optionalPeers": [ "@op-engineering/op-sqlite", - "wa-sqlite", ], }, "workers/wa-sqlite-cdn": { @@ -353,7 +351,6 @@ "typescript-eslint": "^8.52.0", "vite": "^7.3.1", "vitest": "^4.0.17", - "wa-sqlite": "^1.0.0", "wrangler": "^4.56.0", "y-protocols": "^1.0.7", "yjs": "^13.6.29", @@ -3482,7 +3479,7 @@ "w3c-keyname": ["w3c-keyname@2.2.8", "", {}, "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="], - "wa-sqlite": ["wa-sqlite@1.0.0", "", {}, "sha512-Kyybo5/BaJp76z7gDWGk2J6Hthl4NIPsE+swgraEjy3IY6r5zIR02wAs1OJH4XtJp1y3puj3Onp5eMGS0z7nUA=="], + "wa-sqlite": ["wa-sqlite@https://codeload.github.com/rhashimoto/wa-sqlite/tar.gz/07ad48cf2f682d279f9cd69818cc1d39b2ccda86", {}], "wa-sqlite-cdn": ["wa-sqlite-cdn@workspace:workers/wa-sqlite-cdn"], diff --git a/docs/CDN.md b/docs/CDN.md index e8c9c72..70786a9 100644 --- a/docs/CDN.md +++ b/docs/CDN.md @@ -1,10 +1,12 @@ # Hosting the browser SQLite runtime -Replicate's browser persistence uses wa-sqlite with `IDBBatchAtomicVFS` (IndexedDB). The package -includes the compatible JavaScript/WASM graph, its checksums, and the upstream license notices. -Serve that packaged graph from your application or an immutable CDN path. Do not assemble files -from a moving wa-sqlite branch: npm `wa-sqlite@1.0.0` and other distributions may expose a -different VFS API. +Replicate's browser persistence uses wa-sqlite with `IDBBatchAtomicVFS` (IndexedDB). Replicate +installs an immutable archive of the original repository at commit +`07ad48cf2f682d279f9cd69818cc1d39b2ccda86`. Its asset CLI copies the compatible +JavaScript/WASM graph, verifies fixed checksums, and retains the upstream license, +acknowledgments, and provenance note. Serve that graph from your application or an immutable CDN +path. Do not assemble files from a moving branch or substitute npm `wa-sqlite@1.0.0`, an +unrelated unofficial publication. ## Copy and verify the packaged graph @@ -34,16 +36,19 @@ replicate-sqlite/ └── ACKNOWLEDGMENTS.md ``` -Keep the relative `dist/` and `src/` paths intact. Retain `LICENSE` and `ACKNOWLEDGMENTS.md` in -every hosted distribution. To verify the installed package without copying it, run: +The copied directory also contains `PROVENANCE.md`. Keep the relative `dist/` and `src/` paths +intact and retain all three notice files in every hosted distribution. To verify the installed +package without copying it, run: ```bash npm exec -- replicate-sqlite-assets --verify ``` -`manifest.json` records the exact wa-sqlite source revision, build revision, and SHA-256 digest of -each runtime and notice file. The provenance details and reproducibility boundary are documented in -[`offline-replicas.md`](offline-replicas.md#browser-assets-and-offline-startup). +`manifest.json` records the exact archive URL and integrity, source revision, and SHA-256 digest +of each runtime and notice file. The copy command reads the installed dependency during the +application build; browsers do not fetch GitHub or a third-party CDN at runtime when `assetBase` +points to the copied directory. The provenance details and reproducibility boundary are documented +in [`offline-replicas.md`](offline-replicas.md#browser-assets-and-offline-startup). ## Configure Replicate diff --git a/docs/offline-replicas.md b/docs/offline-replicas.md index bcf34da..3e61295 100644 --- a/docs/offline-replicas.md +++ b/docs/offline-replicas.md @@ -98,17 +98,17 @@ const sqlite = persistence.web.sqlite.once({ }); ``` -Precache the app shell, bundled worker, and **all runtime files** listed by `assets/wa-sqlite/manifest.json` under that base. Preserve the relative `src/` and `dist/` paths and license/acknowledgment files. Serve `.wasm` as `application/wasm` and JS/MJS as JavaScript. Install/activate the service worker online before the first offline restart. `preloadLinks(assetBase)` and `injectPreloadLinks(assetBase)` accept the same base. Failed WASM compilation is evicted from the cache so retry can succeed. Without `assetBase`, the existing CDN remains the default. +Precache the app shell, bundled worker, and **all files** listed by `assets/wa-sqlite/manifest.json` under that base. Preserve the relative `src/` and `dist/` paths and all notice files. Serve `.wasm` as `application/wasm` and JS/MJS as JavaScript. Install/activate the service worker online before the first offline restart. `preloadLinks(assetBase)` and `injectPreloadLinks(assetBase)` accept the same base. Failed WASM compilation is evicted from the cache so retry can succeed. Without `assetBase`, the existing historical CDN remains the default; copying and configuring `assetBase` is the offline self-hosted path. The worker uses `synchronous=FULL` and awaits SQLite/VFS close before terminating. Durability is subject to browser storage eviction, device/storage guarantees, and application cache lifecycle; offline assets are application-owned. ### Runtime provenance -The vendored graph is byte-identical to official wa-sqlite GitHub commit `55bf0b6646ac1bb81b00b9c25636b59a87e4a918` (tag `v1.0.0`), including its prebuilt async JS/WASM. Those compiler artifacts originate at commit `44cc640c65f29de9bfbc2004974c9f6c2c690c2b`; its Makefile specifies SQLite 3.46.0. Per-file SHA-256 values are recorded in `manifest.json`. +The copied graph comes from an immutable archive of the original wa-sqlite repository at commit `07ad48cf2f682d279f9cd69818cc1d39b2ccda86`. Its package metadata reports version 1.1.2, but the dependency is the exact commit archive rather than an npm release or a similarly named Git tag. The required files are byte-identical to that commit. The shipped module reports SQLite 3.53.0, matching its Makefile. Per-file SHA-256 values are recorded in `manifest.json`. -This is reproducible distribution of pinned official artifacts, not a claim to reproduce the original compiler environment. `node scripts/verify-sqlite-provenance.mjs` compares every file with that immutable upstream revision; `node scripts/copy-sqlite-assets.mjs --verify` checks the installed copy without network access. Keep upstream `LICENSE` and `ACKNOWLEDGMENTS.md`, including the sqlite-wasm notice. +The codeload URL contains the full commit hash, and `manifest.json` retains the archive's SHA-512 and SHA-256 digests. npm downstream locks record the archive integrity; Bun 1.3.6 retains the exact URL without a digest. The asset CLI therefore checks fixed per-file hashes before every copy. This identifies the installed source and prebuilt artifacts; it is not an independent reproduction of the compiler environment or WebAssembly build. `node scripts/verify-sqlite-provenance.mjs` checks the archive integrity and compares every upstream file with the immutable source revision; `node scripts/copy-sqlite-assets.mjs --verify` verifies the installed dependency without network access. -**Do not substitute npm `wa-sqlite@1.0.0`.** It has different source/build contents and an incompatible VFS constructor API. The pinned GitHub graph and the historical CDN use `IDBBatchAtomicVFS.create(name, module)`. +Keep `LICENSE`, the full source `ACKNOWLEDGMENTS.md`, and `PROVENANCE.md`. Do not substitute npm `wa-sqlite@1.0.0`: it is an unrelated unofficial publication with different contents and VFS API. ## Verification diff --git a/package.json b/package.json index 37476cc..14a4df4 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,6 @@ "@tiptap/extension-placeholder": "^3.15.3", "lucide-react": "^0.562.0", "@lucide/svelte": "^0.562.0", - "wa-sqlite": "^1.0.0", "@electric-sql/pglite": "^0.3.14", "eslint": "^9.39.2", "@eslint/js": "^9.39.2", diff --git a/packages/replicate/assets/wa-sqlite/ACKNOWLEDGMENTS.md b/packages/replicate/assets/wa-sqlite/ACKNOWLEDGMENTS.md deleted file mode 100644 index c22f983..0000000 --- a/packages/replicate/assets/wa-sqlite/ACKNOWLEDGMENTS.md +++ /dev/null @@ -1,45 +0,0 @@ -# Acknowledgments -This project does not use code from [SQL.js](https://sql.js.org/#/), but is inspired and influenced by it. - -This project uses or derives material from the following sources. - -## [sqlite-wasm](https://github.com/mandel59/sqlite-wasm) -Copyright 2017 Ryusei Yamaguchi - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -## [monaco-editor](https://github.com/microsoft/monaco-editor) -Copyright (c) 2016 - present Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -## [github-corners](https://github.com/tholman/github-corners) -Copyright (c) 2016 Tim Holman - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -## Pull Request submitters -[//]: # "Use this format (replace 'name' and 'username'): * [name](your URL choice) - [PRs](https://github.com/rhashimoto/wa-sqlite/pulls?q=is%3Apr+author%3Ausername)" diff --git a/packages/replicate/assets/wa-sqlite/LICENSE b/packages/replicate/assets/wa-sqlite/LICENSE deleted file mode 100644 index 5715004..0000000 --- a/packages/replicate/assets/wa-sqlite/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 Roy T. Hashimoto - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/packages/replicate/assets/wa-sqlite/PROVENANCE.md b/packages/replicate/assets/wa-sqlite/PROVENANCE.md new file mode 100644 index 0000000..87220b4 --- /dev/null +++ b/packages/replicate/assets/wa-sqlite/PROVENANCE.md @@ -0,0 +1,18 @@ +# Runtime provenance + +The browser runtime is copied from the original wa-sqlite repository at Git +commit `07ad48cf2f682d279f9cd69818cc1d39b2ccda86`. Replicate installs that commit's +immutable GitHub codeload archive directly. The package metadata reports version +1.1.2, but this dependency is a commit-pinned source archive, not an npm release +or a claim about the repository's similarly named tags. + +The runtime files, MIT `LICENSE`, and complete `ACKNOWLEDGMENTS.md` listed in +`manifest.json` are byte-identical to that commit. The JavaScript loader was last +changed at `c17fe55df5d3b9da82ab34aa6b356a8a90eaa023`; the WebAssembly artifact was +last changed at `b0d5ff44548ce8a5c76f360a416c2d4321ed3c10`. The shipped module reports +SQLite 3.53.0, matching the Makefile. The installed archive has no runtime +dependencies or install, prepare, prepack, or build hooks. + +The archive integrity and per-file hashes identify the installed source and +prebuilt artifacts; they do not independently reproduce the compiler toolchain +or the WebAssembly build. diff --git a/packages/replicate/assets/wa-sqlite/dist/wa-sqlite-async.mjs b/packages/replicate/assets/wa-sqlite/dist/wa-sqlite-async.mjs deleted file mode 100644 index 4f1de65..0000000 --- a/packages/replicate/assets/wa-sqlite/dist/wa-sqlite-async.mjs +++ /dev/null @@ -1,16 +0,0 @@ - -var Module = (() => { - var _scriptDir = import.meta.url; - - return ( -function(moduleArg = {}) { - -var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";var isDataURI=filename=>filename.startsWith(dataURIPrefix);var wasmBinaryFile;if(Module["locateFile"]){wasmBinaryFile="wa-sqlite-async.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}}else{wasmBinaryFile=new URL("wa-sqlite-async.wasm",import.meta.url).href}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}function getBinaryPromise(binaryFile){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{if(!response["ok"]){throw"failed to load wasm binary file at '"+binaryFile+"'"}return response["arrayBuffer"]()}).catch(()=>getBinarySync(binaryFile))}}return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(instance=>instance).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}return instantiateArrayBuffer(binaryFile,imports,callback)}function createWasm(){var info={"a":wasmImports};function receiveInstance(instance,module){wasmExports=instance.exports;wasmExports=Asyncify.instrumentWasmExports(wasmExports);wasmMemory=wasmExports["ja"];updateMemoryViews();wasmTable=wasmExports["bf"];addOnInit(wasmExports["ka"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}var tempDouble;var tempI64;function ExitStatus(status){this.name="ExitStatus";this.message=`Program terminated with exit(${status})`;this.status=status}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":abort("to do getValue(i64) use WASM_BIGINT");case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];case"*":return HEAPU32[ptr>>2];default:abort(`invalid type for getValue: ${type}`)}}var noExitRuntime=Module["noExitRuntime"]||true;function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":abort("to do setValue(i64) use WASM_BIGINT");case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;case"*":HEAPU32[ptr>>2]=value;break;default:abort(`invalid type for setValue: ${type}`)}}var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;var UTF8ArrayToString=(heapOrArray,idx,maxBytesToRead)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var ___assert_fail=(condition,filename,line,func)=>{abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])};var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments);return PATH.normalize(paths.join("/"))},join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else abort("initRandomDevice")};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var zeroMemory=(address,size)=>{HEAPU8.fill(0,address,address+size);return address};var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var mmapAlloc=size=>{size=alignMemory(size,65536);var ptr=_emscripten_builtin_memalign(65536,size);if(!ptr)return 0;return zeroMemory(ptr,size)};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw FS.genericErrors[44]},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{var dep=!noRunDep?getUniqueRunDependency(`al ${url}`):"";readAsync(url,arrayBuffer=>{assert(arrayBuffer,`Loading data file "${url}" failed (no arrayBuffer).`);onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},event=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}});if(dep)addRunDependency(dep)};var FS_createDataFile=(parent,name,fileData,canRead,canWrite,canOwn)=>FS.createDataFile(parent,name,fileData,canRead,canWrite,canOwn);var preloadPlugins=Module["preloadPlugins"]||[];var FS_handledByPreloadPlugin=(byteArray,fullname,finish,onerror)=>{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}};var FS_modeStringToFlags=str=>{var flagModes={"r":0,"r+":2,"w":512|64|1,"w+":512|64|2,"a":1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath(path,opts={}){path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?`${mount}/${path}`:mount+path}path=path?`${node.name}/${path}`:node.name;node=node.parent}},hashName(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get(){return this.node},set(val){this.node=val}},isRead:{get(){return(this.flags&2097155)!==1}},isWrite:{get(){return(this.flags&2097155)!==0}},isAppend:{get(){return this.flags&1024}},flags:{get(){return this.shared.flags},set(val){this.shared.flags=val}},position:{get(){return this.shared.position},set(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var i=0;i0,ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error(`Invalid encoding type "${opts.encoding}"`)}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile(path,data,opts={}){opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams(){if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError(){if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.name="ErrnoError";this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""})},staticInit(){FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS}},init(input,output,error){FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit(){FS.init.initialized=false;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAP32[buf+12>>2]=stat.uid;HEAP32[buf+16>>2]=stat.gid;HEAP32[buf+20>>2]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+24>>2]=tempI64[0],HEAP32[buf+28>>2]=tempI64[1];HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();tempI64=[Math.floor(atime/1e3)>>>0,(tempDouble=Math.floor(atime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAPU32[buf+48>>2]=atime%1e3*1e3;tempI64=[Math.floor(mtime/1e3)>>>0,(tempDouble=Math.floor(mtime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1];HEAPU32[buf+64>>2]=mtime%1e3*1e3;tempI64=[Math.floor(ctime/1e3)>>>0,(tempDouble=Math.floor(ctime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1];HEAPU32[buf+80>>2]=ctime%1e3*1e3;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1];return 0},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get(){var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret},getp(){return SYSCALLS.get()},getStr(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream}};function ___syscall_chmod(path,mode){try{path=SYSCALLS.getStr(path);FS.chmod(path,mode);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_faccessat(dirfd,path,amode,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(amode&~7){return-28}var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fchmod(fd,mode){try{FS.fchmod(fd,mode);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fchown32(fd,owner,group){try{FS.fchown(fd,owner,group);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var setErrNo=value=>{HEAP32[___errno_location()>>2]=value;return value};function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.createStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 5:{var arg=SYSCALLS.getp();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fstat64(fd,buf){try{var stream=SYSCALLS.getStreamFromFD(fd);return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;function ___syscall_ftruncate64(fd,length_low,length_high){var length=convertI32PairToI53Checked(length_low,length_high);try{if(isNaN(length))return 61;FS.ftruncate(fd,length);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);function ___syscall_getcwd(buf,size){try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd)+1;if(sizeHEAPU32[ptr>>2]+HEAP32[ptr+4>>2]*4294967296;function ___syscall_utimensat(dirfd,path,times,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path,true);if(!times){var atime=Date.now();var mtime=atime}else{var seconds=readI53FromI64(times);var nanoseconds=HEAP32[times+8>>2];atime=seconds*1e3+nanoseconds/(1e3*1e3);times+=16;seconds=readI53FromI64(times);nanoseconds=HEAP32[times+8>>2];mtime=seconds*1e3+nanoseconds/(1e3*1e3)}FS.utime(path,atime,mtime);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var isLeapYear=year=>year%4===0&&(year%100!==0||year%400===0);var MONTH_DAYS_LEAP_CUMULATIVE=[0,31,60,91,121,152,182,213,244,274,305,335];var MONTH_DAYS_REGULAR_CUMULATIVE=[0,31,59,90,120,151,181,212,243,273,304,334];var ydayFromDate=date=>{var leap=isLeapYear(date.getFullYear());var monthDaysCumulative=leap?MONTH_DAYS_LEAP_CUMULATIVE:MONTH_DAYS_REGULAR_CUMULATIVE;var yday=monthDaysCumulative[date.getMonth()]+date.getDate()-1;return yday};function __localtime_js(time_low,time_high,tmPtr){var time=convertI32PairToI53Checked(time_low,time_high);var date=new Date(time*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst}function __mmap_js(len,prot,flags,fd,offset_low,offset_high,allocated,addr){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);var res=FS.mmap(stream,len,offset,prot,flags);var ptr=res.ptr;HEAP32[allocated>>2]=res.allocated;HEAPU32[addr>>2]=ptr;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function __munmap_js(addr,len,prot,flags,fd,offset_low,offset_high){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);if(prot&2){SYSCALLS.doMsync(addr,stream,len,flags,offset)}FS.munmap(stream)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var stringToNewUTF8=str=>{var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8(str,ret,size);return ret};var __tzset_js=(timezone,daylight,tzname)=>{var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=stringToNewUTF8(winterName);var summerNamePtr=stringToNewUTF8(summerName);if(summerOffset>2]=winterNamePtr;HEAPU32[tzname+4>>2]=summerNamePtr}else{HEAPU32[tzname>>2]=summerNamePtr;HEAPU32[tzname+4>>2]=winterNamePtr}};var _emscripten_date_now=()=>Date.now();var _emscripten_get_now;_emscripten_get_now=()=>performance.now();var getHeapMax=()=>2147483648;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var stringToAscii=(str,buffer)=>{for(var i=0;i>0]=str.charCodeAt(i)}HEAP8[buffer>>0]=0};var _environ_get=(__environ,environ_buf)=>{var bufSize=0;getEnvStrings().forEach((string,i)=>{var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;stringToAscii(string,ptr);bufSize+=string.length+1});return 0};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(string=>bufSize+=string.length+1);HEAPU32[penviron_buf_size>>2]=bufSize;return 0};function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_fdstat_get(fd,pbuf){try{var rightsBase=0;var rightsInheriting=0;var flags=0;{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4}HEAP8[pbuf>>0]=type;HEAP16[pbuf+2>>1]=flags;tempI64=[rightsBase>>>0,(tempDouble=rightsBase,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[pbuf+8>>2]=tempI64[0],HEAP32[pbuf+12>>2]=tempI64[1];tempI64=[rightsInheriting>>>0,(tempDouble=rightsInheriting,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[pbuf+16>>2]=tempI64[0],HEAP32[pbuf+20>>2]=tempI64[1];return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var _fd_sync=function(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);return Asyncify.handleSleep(wakeUp=>{var mount=stream.node.mount;if(!mount.type.syncfs){wakeUp(0);return}mount.type.syncfs(mount,false,err=>{if(err){wakeUp(29);return}wakeUp(0)})})}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}};_fd_sync.isAsync=true;var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(typeof offset!=="undefined"){offset+=curr}}return ret};function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var adapters_support=function(){const handleAsync=typeof Asyncify==="object"?Asyncify.handleAsync.bind(Asyncify):null;Module["handleAsync"]=handleAsync;const targets=new Map;Module["setCallback"]=(key,target)=>targets.set(key,target);Module["getCallback"]=key=>targets.get(key);Module["deleteCallback"]=key=>targets.delete(key);adapters_support=function(isAsync,key,...args){const receiver=targets.get(key);let methodName=null;const f=typeof receiver==="function"?receiver:receiver[methodName=UTF8ToString(args.shift())];if(isAsync){if(handleAsync){return handleAsync(()=>f.apply(receiver,args))}throw new Error("Synchronous WebAssembly cannot call async function")}const result=f.apply(receiver,args);if(typeof result?.then=="function"){console.error("unexpected Promise",f);throw new Error(`${methodName} unexpectedly returned a Promise`)}return result}};function _ipp(...args){return adapters_support(false,...args)}function _ipp_async(...args){return adapters_support(true,...args)}_ipp_async.isAsync=true;function _ippipppp(...args){return adapters_support(false,...args)}function _ippipppp_async(...args){return adapters_support(true,...args)}_ippipppp_async.isAsync=true;function _ippp(...args){return adapters_support(false,...args)}function _ippp_async(...args){return adapters_support(true,...args)}_ippp_async.isAsync=true;function _ipppi(...args){return adapters_support(false,...args)}function _ipppi_async(...args){return adapters_support(true,...args)}_ipppi_async.isAsync=true;function _ipppiii(...args){return adapters_support(false,...args)}function _ipppiii_async(...args){return adapters_support(true,...args)}_ipppiii_async.isAsync=true;function _ipppiiip(...args){return adapters_support(false,...args)}function _ipppiiip_async(...args){return adapters_support(true,...args)}_ipppiiip_async.isAsync=true;function _ipppip(...args){return adapters_support(false,...args)}function _ipppip_async(...args){return adapters_support(true,...args)}_ipppip_async.isAsync=true;function _ipppj(...args){return adapters_support(false,...args)}function _ipppj_async(...args){return adapters_support(true,...args)}_ipppj_async.isAsync=true;function _ipppp(...args){return adapters_support(false,...args)}function _ipppp_async(...args){return adapters_support(true,...args)}_ipppp_async.isAsync=true;function _ippppi(...args){return adapters_support(false,...args)}function _ippppi_async(...args){return adapters_support(true,...args)}_ippppi_async.isAsync=true;function _ippppij(...args){return adapters_support(false,...args)}function _ippppij_async(...args){return adapters_support(true,...args)}_ippppij_async.isAsync=true;function _ippppip(...args){return adapters_support(false,...args)}function _ippppip_async(...args){return adapters_support(true,...args)}_ippppip_async.isAsync=true;function _ipppppip(...args){return adapters_support(false,...args)}function _ipppppip_async(...args){return adapters_support(true,...args)}_ipppppip_async.isAsync=true;function _vppp(...args){return adapters_support(false,...args)}function _vppp_async(...args){return adapters_support(true,...args)}_vppp_async.isAsync=true;function _vpppip(...args){return adapters_support(false,...args)}function _vpppip_async(...args){return adapters_support(true,...args)}_vpppip_async.isAsync=true;var runtimeKeepaliveCounter=0;var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var runAndAbortIfError=func=>{try{return func()}catch(e){abort(e)}};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var sigToWasmTypes=sig=>{var typeNames={"i":"i32","j":"i64","f":"f32","d":"f64","e":"externref","p":"i32"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i{runtimeKeepaliveCounter+=1};var runtimeKeepalivePop=()=>{runtimeKeepaliveCounter-=1};var Asyncify={instrumentWasmImports(imports){var importPattern=/^(ipp|ipp_async|ippp|ippp_async|vppp|vppp_async|ipppj|ipppj_async|ipppi|ipppi_async|ipppp|ipppp_async|ipppip|ipppip_async|vpppip|vpppip_async|ippppi|ippppi_async|ippppij|ippppij_async|ipppiii|ipppiii_async|ippppip|ippppip_async|ippipppp|ippipppp_async|ipppppip|ipppppip_async|ipppiiip|ipppiiip_async|invoke_.*|__asyncjs__.*)$/;for(var x in imports){(function(x){var original=imports[x];var sig=original.sig;if(typeof original=="function"){var isAsyncifyImport=original.isAsync||importPattern.test(x)}})(x)}},instrumentWasmExports(exports){var ret={};for(var x in exports){(function(x){var original=exports[x];if(typeof original=="function"){ret[x]=function(){Asyncify.exportCallStack.push(x);try{return original.apply(null,arguments)}finally{if(!ABORT){var y=Asyncify.exportCallStack.pop();assert(y===x);Asyncify.maybeStopUnwind()}}}}else{ret[x]=original}})(x)}return ret},State:{Normal:0,Unwinding:1,Rewinding:2,Disabled:3},state:0,StackSize:16384,currData:null,handleSleepReturnValue:0,exportCallStack:[],callStackNameToId:{},callStackIdToName:{},callStackId:0,asyncPromiseHandlers:null,sleepCallbacks:[],getCallStackId(funcName){var id=Asyncify.callStackNameToId[funcName];if(id===undefined){id=Asyncify.callStackId++;Asyncify.callStackNameToId[funcName]=id;Asyncify.callStackIdToName[id]=funcName}return id},maybeStopUnwind(){if(Asyncify.currData&&Asyncify.state===Asyncify.State.Unwinding&&Asyncify.exportCallStack.length===0){Asyncify.state=Asyncify.State.Normal;runAndAbortIfError(_asyncify_stop_unwind);if(typeof Fibers!="undefined"){Fibers.trampoline()}}},whenDone(){return new Promise((resolve,reject)=>{Asyncify.asyncPromiseHandlers={resolve:resolve,reject:reject}})},allocateData(){var ptr=_malloc(12+Asyncify.StackSize);Asyncify.setDataHeader(ptr,ptr+12,Asyncify.StackSize);Asyncify.setDataRewindFunc(ptr);return ptr},setDataHeader(ptr,stack,stackSize){HEAPU32[ptr>>2]=stack;HEAPU32[ptr+4>>2]=stack+stackSize},setDataRewindFunc(ptr){var bottomOfCallStack=Asyncify.exportCallStack[0];var rewindId=Asyncify.getCallStackId(bottomOfCallStack);HEAP32[ptr+8>>2]=rewindId},getDataRewindFunc(ptr){var id=HEAP32[ptr+8>>2];var name=Asyncify.callStackIdToName[id];var func=wasmExports[name];return func},doRewind(ptr){var start=Asyncify.getDataRewindFunc(ptr);return start()},handleSleep(startAsync){if(ABORT)return;if(Asyncify.state===Asyncify.State.Normal){var reachedCallback=false;var reachedAfterCallback=false;startAsync((handleSleepReturnValue=0)=>{if(ABORT)return;Asyncify.handleSleepReturnValue=handleSleepReturnValue;reachedCallback=true;if(!reachedAfterCallback){return}Asyncify.state=Asyncify.State.Rewinding;runAndAbortIfError(()=>_asyncify_start_rewind(Asyncify.currData));if(typeof Browser!="undefined"&&Browser.mainLoop.func){Browser.mainLoop.resume()}var asyncWasmReturnValue,isError=false;try{asyncWasmReturnValue=Asyncify.doRewind(Asyncify.currData)}catch(err){asyncWasmReturnValue=err;isError=true}var handled=false;if(!Asyncify.currData){var asyncPromiseHandlers=Asyncify.asyncPromiseHandlers;if(asyncPromiseHandlers){Asyncify.asyncPromiseHandlers=null;(isError?asyncPromiseHandlers.reject:asyncPromiseHandlers.resolve)(asyncWasmReturnValue);handled=true}}if(isError&&!handled){throw asyncWasmReturnValue}});reachedAfterCallback=true;if(!reachedCallback){Asyncify.state=Asyncify.State.Unwinding;Asyncify.currData=Asyncify.allocateData();if(typeof Browser!="undefined"&&Browser.mainLoop.func){Browser.mainLoop.pause()}runAndAbortIfError(()=>_asyncify_start_unwind(Asyncify.currData))}}else if(Asyncify.state===Asyncify.State.Rewinding){Asyncify.state=Asyncify.State.Normal;runAndAbortIfError(_asyncify_stop_rewind);_free(Asyncify.currData);Asyncify.currData=null;Asyncify.sleepCallbacks.forEach(func=>callUserCallback(func))}else{abort(`invalid state: ${Asyncify.state}`)}return Asyncify.handleSleepReturnValue},handleAsync(startAsync){return Asyncify.handleSleep(wakeUp=>{startAsync().then(wakeUp)})}};var uleb128Encode=(n,target)=>{if(n<128){target.push(n)}else{target.push(n%128|128,n>>7)}};var generateFuncType=(sig,target)=>{var sigRet=sig.slice(0,1);var sigParam=sig.slice(1);var typeCodes={"i":127,"p":127,"j":126,"f":125,"d":124,"e":111};target.push(96);uleb128Encode(sigParam.length,target);for(var i=0;i{if(typeof WebAssembly.Function=="function"){return new WebAssembly.Function(sigToWasmTypes(sig),func)}var typeSectionBody=[1];generateFuncType(sig,typeSectionBody);var bytes=[0,97,115,109,1,0,0,0,1];uleb128Encode(typeSectionBody.length,bytes);bytes.push.apply(bytes,typeSectionBody);bytes.push(2,7,1,1,101,1,102,0,0,7,5,1,1,102,0,0);var module=new WebAssembly.Module(new Uint8Array(bytes));var instance=new WebAssembly.Instance(module,{"e":{"f":func}});var wrappedFunc=instance.exports["f"];return wrappedFunc};var wasmTable;var getWasmTableEntry=funcPtr=>wasmTable.get(funcPtr);var updateTableMap=(offset,count)=>{if(functionsInTableMap){for(var i=offset;i{if(!functionsInTableMap){functionsInTableMap=new WeakMap;updateTableMap(0,wasmTable.length)}return functionsInTableMap.get(func)||0};var freeTableIndexes=[];var getEmptyTableSlot=()=>{if(freeTableIndexes.length){return freeTableIndexes.pop()}try{wasmTable.grow(1)}catch(err){if(!(err instanceof RangeError)){throw err}throw"Unable to grow wasm table. Set ALLOW_TABLE_GROWTH."}return wasmTable.length-1};var setWasmTableEntry=(idx,func)=>wasmTable.set(idx,func);var addFunction=(func,sig)=>{var rtn=getFunctionAddress(func);if(rtn){return rtn}var ret=getEmptyTableSlot();try{setWasmTableEntry(ret,func)}catch(err){if(!(err instanceof TypeError)){throw err}var wrapped=convertJsFunctionToWasm(func,sig);setWasmTableEntry(ret,wrapped)}functionsInTableMap.set(func,ret);return ret};var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={"string":str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},"array":arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return function(){return ccall(ident,returnType,argTypes,arguments,opts)}};var stringToUTF16=(str,outPtr,maxBytesToWrite)=>{if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr};var stringToUTF32=(str,outPtr,maxBytesToWrite)=>{if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr};var AsciiToString=ptr=>{var str="";while(1){var ch=HEAPU8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}};var UTF16Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf-16le"):undefined;var UTF16ToString=(ptr,maxBytesToRead)=>{var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder)return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr));var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str};var UTF32ToString=(ptr,maxBytesToRead)=>{var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str};function intArrayToString(array){var ret=[];for(var i=0;i255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();adapters_support();var wasmImports={a:___assert_fail,Y:___syscall_chmod,$:___syscall_faccessat,Z:___syscall_fchmod,X:___syscall_fchown32,b:___syscall_fcntl64,W:___syscall_fstat64,y:___syscall_ftruncate64,Q:___syscall_getcwd,U:___syscall_lstat64,N:___syscall_mkdirat,T:___syscall_newfstatat,M:___syscall_openat,K:___syscall_readlinkat,J:___syscall_rmdir,V:___syscall_stat64,G:___syscall_unlinkat,F:___syscall_utimensat,w:__localtime_js,u:__mmap_js,v:__munmap_js,H:__tzset_js,n:_emscripten_date_now,m:_emscripten_get_now,D:_emscripten_resize_heap,O:_environ_get,P:_environ_sizes_get,o:_fd_close,E:_fd_fdstat_get,L:_fd_read,x:_fd_seek,S:_fd_sync,I:_fd_write,s:_ipp,t:_ipp_async,fa:_ippipppp,ia:_ippipppp_async,i:_ippp,j:_ippp_async,c:_ipppi,d:_ipppi_async,ca:_ipppiii,da:_ipppiii_async,ea:_ipppiiip,ga:_ipppiiip_async,g:_ipppip,h:_ipppip_async,z:_ipppj,A:_ipppj_async,e:_ipppp,f:_ipppp_async,aa:_ippppi,ba:_ippppi_async,B:_ippppij,C:_ippppij_async,p:_ippppip,q:_ippppip_async,ha:_ipppppip,r:_ipppppip_async,k:_vppp,l:_vppp_async,R:_vpppip,_:_vpppip_async};var wasmExports=createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["ka"])();var _sqlite3_status64=Module["_sqlite3_status64"]=(a0,a1,a2,a3)=>(_sqlite3_status64=Module["_sqlite3_status64"]=wasmExports["la"])(a0,a1,a2,a3);var _sqlite3_status=Module["_sqlite3_status"]=(a0,a1,a2,a3)=>(_sqlite3_status=Module["_sqlite3_status"]=wasmExports["ma"])(a0,a1,a2,a3);var _sqlite3_db_status=Module["_sqlite3_db_status"]=(a0,a1,a2,a3,a4)=>(_sqlite3_db_status=Module["_sqlite3_db_status"]=wasmExports["na"])(a0,a1,a2,a3,a4);var _sqlite3_msize=Module["_sqlite3_msize"]=a0=>(_sqlite3_msize=Module["_sqlite3_msize"]=wasmExports["oa"])(a0);var _sqlite3_vfs_find=Module["_sqlite3_vfs_find"]=a0=>(_sqlite3_vfs_find=Module["_sqlite3_vfs_find"]=wasmExports["pa"])(a0);var _sqlite3_vfs_register=Module["_sqlite3_vfs_register"]=(a0,a1)=>(_sqlite3_vfs_register=Module["_sqlite3_vfs_register"]=wasmExports["qa"])(a0,a1);var _sqlite3_vfs_unregister=Module["_sqlite3_vfs_unregister"]=a0=>(_sqlite3_vfs_unregister=Module["_sqlite3_vfs_unregister"]=wasmExports["ra"])(a0);var _sqlite3_release_memory=Module["_sqlite3_release_memory"]=a0=>(_sqlite3_release_memory=Module["_sqlite3_release_memory"]=wasmExports["sa"])(a0);var _sqlite3_soft_heap_limit64=Module["_sqlite3_soft_heap_limit64"]=(a0,a1)=>(_sqlite3_soft_heap_limit64=Module["_sqlite3_soft_heap_limit64"]=wasmExports["ta"])(a0,a1);var _sqlite3_memory_used=Module["_sqlite3_memory_used"]=()=>(_sqlite3_memory_used=Module["_sqlite3_memory_used"]=wasmExports["ua"])();var _sqlite3_hard_heap_limit64=Module["_sqlite3_hard_heap_limit64"]=(a0,a1)=>(_sqlite3_hard_heap_limit64=Module["_sqlite3_hard_heap_limit64"]=wasmExports["va"])(a0,a1);var _sqlite3_memory_highwater=Module["_sqlite3_memory_highwater"]=a0=>(_sqlite3_memory_highwater=Module["_sqlite3_memory_highwater"]=wasmExports["wa"])(a0);var _sqlite3_malloc=Module["_sqlite3_malloc"]=a0=>(_sqlite3_malloc=Module["_sqlite3_malloc"]=wasmExports["xa"])(a0);var _sqlite3_malloc64=Module["_sqlite3_malloc64"]=(a0,a1)=>(_sqlite3_malloc64=Module["_sqlite3_malloc64"]=wasmExports["ya"])(a0,a1);var _sqlite3_free=Module["_sqlite3_free"]=a0=>(_sqlite3_free=Module["_sqlite3_free"]=wasmExports["za"])(a0);var _sqlite3_realloc=Module["_sqlite3_realloc"]=(a0,a1)=>(_sqlite3_realloc=Module["_sqlite3_realloc"]=wasmExports["Aa"])(a0,a1);var _sqlite3_realloc64=Module["_sqlite3_realloc64"]=(a0,a1,a2)=>(_sqlite3_realloc64=Module["_sqlite3_realloc64"]=wasmExports["Ba"])(a0,a1,a2);var _sqlite3_str_vappendf=Module["_sqlite3_str_vappendf"]=(a0,a1,a2)=>(_sqlite3_str_vappendf=Module["_sqlite3_str_vappendf"]=wasmExports["Ca"])(a0,a1,a2);var _sqlite3_str_append=Module["_sqlite3_str_append"]=(a0,a1,a2)=>(_sqlite3_str_append=Module["_sqlite3_str_append"]=wasmExports["Da"])(a0,a1,a2);var _sqlite3_str_appendchar=Module["_sqlite3_str_appendchar"]=(a0,a1,a2)=>(_sqlite3_str_appendchar=Module["_sqlite3_str_appendchar"]=wasmExports["Ea"])(a0,a1,a2);var _sqlite3_str_appendall=Module["_sqlite3_str_appendall"]=(a0,a1)=>(_sqlite3_str_appendall=Module["_sqlite3_str_appendall"]=wasmExports["Fa"])(a0,a1);var _sqlite3_str_appendf=Module["_sqlite3_str_appendf"]=(a0,a1,a2)=>(_sqlite3_str_appendf=Module["_sqlite3_str_appendf"]=wasmExports["Ga"])(a0,a1,a2);var _sqlite3_str_finish=Module["_sqlite3_str_finish"]=a0=>(_sqlite3_str_finish=Module["_sqlite3_str_finish"]=wasmExports["Ha"])(a0);var _sqlite3_str_errcode=Module["_sqlite3_str_errcode"]=a0=>(_sqlite3_str_errcode=Module["_sqlite3_str_errcode"]=wasmExports["Ia"])(a0);var _sqlite3_str_length=Module["_sqlite3_str_length"]=a0=>(_sqlite3_str_length=Module["_sqlite3_str_length"]=wasmExports["Ja"])(a0);var _sqlite3_str_value=Module["_sqlite3_str_value"]=a0=>(_sqlite3_str_value=Module["_sqlite3_str_value"]=wasmExports["Ka"])(a0);var _sqlite3_str_reset=Module["_sqlite3_str_reset"]=a0=>(_sqlite3_str_reset=Module["_sqlite3_str_reset"]=wasmExports["La"])(a0);var _sqlite3_str_new=Module["_sqlite3_str_new"]=a0=>(_sqlite3_str_new=Module["_sqlite3_str_new"]=wasmExports["Ma"])(a0);var _sqlite3_vmprintf=Module["_sqlite3_vmprintf"]=(a0,a1)=>(_sqlite3_vmprintf=Module["_sqlite3_vmprintf"]=wasmExports["Na"])(a0,a1);var _sqlite3_mprintf=Module["_sqlite3_mprintf"]=(a0,a1)=>(_sqlite3_mprintf=Module["_sqlite3_mprintf"]=wasmExports["Oa"])(a0,a1);var _sqlite3_vsnprintf=Module["_sqlite3_vsnprintf"]=(a0,a1,a2,a3)=>(_sqlite3_vsnprintf=Module["_sqlite3_vsnprintf"]=wasmExports["Pa"])(a0,a1,a2,a3);var _sqlite3_snprintf=Module["_sqlite3_snprintf"]=(a0,a1,a2,a3)=>(_sqlite3_snprintf=Module["_sqlite3_snprintf"]=wasmExports["Qa"])(a0,a1,a2,a3);var _sqlite3_log=Module["_sqlite3_log"]=(a0,a1,a2)=>(_sqlite3_log=Module["_sqlite3_log"]=wasmExports["Ra"])(a0,a1,a2);var _sqlite3_randomness=Module["_sqlite3_randomness"]=(a0,a1)=>(_sqlite3_randomness=Module["_sqlite3_randomness"]=wasmExports["Sa"])(a0,a1);var _sqlite3_stricmp=Module["_sqlite3_stricmp"]=(a0,a1)=>(_sqlite3_stricmp=Module["_sqlite3_stricmp"]=wasmExports["Ta"])(a0,a1);var _sqlite3_strnicmp=Module["_sqlite3_strnicmp"]=(a0,a1,a2)=>(_sqlite3_strnicmp=Module["_sqlite3_strnicmp"]=wasmExports["Ua"])(a0,a1,a2);var _sqlite3_os_init=Module["_sqlite3_os_init"]=()=>(_sqlite3_os_init=Module["_sqlite3_os_init"]=wasmExports["Va"])();var _sqlite3_os_end=Module["_sqlite3_os_end"]=()=>(_sqlite3_os_end=Module["_sqlite3_os_end"]=wasmExports["Wa"])();var _sqlite3_serialize=Module["_sqlite3_serialize"]=(a0,a1,a2,a3)=>(_sqlite3_serialize=Module["_sqlite3_serialize"]=wasmExports["Xa"])(a0,a1,a2,a3);var _sqlite3_prepare_v2=Module["_sqlite3_prepare_v2"]=(a0,a1,a2,a3,a4)=>(_sqlite3_prepare_v2=Module["_sqlite3_prepare_v2"]=wasmExports["Ya"])(a0,a1,a2,a3,a4);var _sqlite3_step=Module["_sqlite3_step"]=a0=>(_sqlite3_step=Module["_sqlite3_step"]=wasmExports["Za"])(a0);var _sqlite3_column_int64=Module["_sqlite3_column_int64"]=(a0,a1)=>(_sqlite3_column_int64=Module["_sqlite3_column_int64"]=wasmExports["_a"])(a0,a1);var _sqlite3_reset=Module["_sqlite3_reset"]=a0=>(_sqlite3_reset=Module["_sqlite3_reset"]=wasmExports["$a"])(a0);var _sqlite3_exec=Module["_sqlite3_exec"]=(a0,a1,a2,a3,a4)=>(_sqlite3_exec=Module["_sqlite3_exec"]=wasmExports["ab"])(a0,a1,a2,a3,a4);var _sqlite3_column_int=Module["_sqlite3_column_int"]=(a0,a1)=>(_sqlite3_column_int=Module["_sqlite3_column_int"]=wasmExports["bb"])(a0,a1);var _sqlite3_finalize=Module["_sqlite3_finalize"]=a0=>(_sqlite3_finalize=Module["_sqlite3_finalize"]=wasmExports["cb"])(a0);var _sqlite3_deserialize=Module["_sqlite3_deserialize"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_sqlite3_deserialize=Module["_sqlite3_deserialize"]=wasmExports["db"])(a0,a1,a2,a3,a4,a5,a6,a7);var _sqlite3_database_file_object=Module["_sqlite3_database_file_object"]=a0=>(_sqlite3_database_file_object=Module["_sqlite3_database_file_object"]=wasmExports["eb"])(a0);var _sqlite3_backup_init=Module["_sqlite3_backup_init"]=(a0,a1,a2,a3)=>(_sqlite3_backup_init=Module["_sqlite3_backup_init"]=wasmExports["fb"])(a0,a1,a2,a3);var _sqlite3_backup_step=Module["_sqlite3_backup_step"]=(a0,a1)=>(_sqlite3_backup_step=Module["_sqlite3_backup_step"]=wasmExports["gb"])(a0,a1);var _sqlite3_backup_finish=Module["_sqlite3_backup_finish"]=a0=>(_sqlite3_backup_finish=Module["_sqlite3_backup_finish"]=wasmExports["hb"])(a0);var _sqlite3_backup_remaining=Module["_sqlite3_backup_remaining"]=a0=>(_sqlite3_backup_remaining=Module["_sqlite3_backup_remaining"]=wasmExports["ib"])(a0);var _sqlite3_backup_pagecount=Module["_sqlite3_backup_pagecount"]=a0=>(_sqlite3_backup_pagecount=Module["_sqlite3_backup_pagecount"]=wasmExports["jb"])(a0);var _sqlite3_clear_bindings=Module["_sqlite3_clear_bindings"]=a0=>(_sqlite3_clear_bindings=Module["_sqlite3_clear_bindings"]=wasmExports["kb"])(a0);var _sqlite3_value_blob=Module["_sqlite3_value_blob"]=a0=>(_sqlite3_value_blob=Module["_sqlite3_value_blob"]=wasmExports["lb"])(a0);var _sqlite3_value_text=Module["_sqlite3_value_text"]=a0=>(_sqlite3_value_text=Module["_sqlite3_value_text"]=wasmExports["mb"])(a0);var _sqlite3_value_bytes=Module["_sqlite3_value_bytes"]=a0=>(_sqlite3_value_bytes=Module["_sqlite3_value_bytes"]=wasmExports["nb"])(a0);var _sqlite3_value_bytes16=Module["_sqlite3_value_bytes16"]=a0=>(_sqlite3_value_bytes16=Module["_sqlite3_value_bytes16"]=wasmExports["ob"])(a0);var _sqlite3_value_double=Module["_sqlite3_value_double"]=a0=>(_sqlite3_value_double=Module["_sqlite3_value_double"]=wasmExports["pb"])(a0);var _sqlite3_value_int=Module["_sqlite3_value_int"]=a0=>(_sqlite3_value_int=Module["_sqlite3_value_int"]=wasmExports["qb"])(a0);var _sqlite3_value_int64=Module["_sqlite3_value_int64"]=a0=>(_sqlite3_value_int64=Module["_sqlite3_value_int64"]=wasmExports["rb"])(a0);var _sqlite3_value_subtype=Module["_sqlite3_value_subtype"]=a0=>(_sqlite3_value_subtype=Module["_sqlite3_value_subtype"]=wasmExports["sb"])(a0);var _sqlite3_value_pointer=Module["_sqlite3_value_pointer"]=(a0,a1)=>(_sqlite3_value_pointer=Module["_sqlite3_value_pointer"]=wasmExports["tb"])(a0,a1);var _sqlite3_value_text16=Module["_sqlite3_value_text16"]=a0=>(_sqlite3_value_text16=Module["_sqlite3_value_text16"]=wasmExports["ub"])(a0);var _sqlite3_value_text16be=Module["_sqlite3_value_text16be"]=a0=>(_sqlite3_value_text16be=Module["_sqlite3_value_text16be"]=wasmExports["vb"])(a0);var _sqlite3_value_text16le=Module["_sqlite3_value_text16le"]=a0=>(_sqlite3_value_text16le=Module["_sqlite3_value_text16le"]=wasmExports["wb"])(a0);var _sqlite3_value_type=Module["_sqlite3_value_type"]=a0=>(_sqlite3_value_type=Module["_sqlite3_value_type"]=wasmExports["xb"])(a0);var _sqlite3_value_encoding=Module["_sqlite3_value_encoding"]=a0=>(_sqlite3_value_encoding=Module["_sqlite3_value_encoding"]=wasmExports["yb"])(a0);var _sqlite3_value_nochange=Module["_sqlite3_value_nochange"]=a0=>(_sqlite3_value_nochange=Module["_sqlite3_value_nochange"]=wasmExports["zb"])(a0);var _sqlite3_value_frombind=Module["_sqlite3_value_frombind"]=a0=>(_sqlite3_value_frombind=Module["_sqlite3_value_frombind"]=wasmExports["Ab"])(a0);var _sqlite3_value_dup=Module["_sqlite3_value_dup"]=a0=>(_sqlite3_value_dup=Module["_sqlite3_value_dup"]=wasmExports["Bb"])(a0);var _sqlite3_value_free=Module["_sqlite3_value_free"]=a0=>(_sqlite3_value_free=Module["_sqlite3_value_free"]=wasmExports["Cb"])(a0);var _sqlite3_result_blob=Module["_sqlite3_result_blob"]=(a0,a1,a2,a3)=>(_sqlite3_result_blob=Module["_sqlite3_result_blob"]=wasmExports["Db"])(a0,a1,a2,a3);var _sqlite3_result_blob64=Module["_sqlite3_result_blob64"]=(a0,a1,a2,a3,a4)=>(_sqlite3_result_blob64=Module["_sqlite3_result_blob64"]=wasmExports["Eb"])(a0,a1,a2,a3,a4);var _sqlite3_result_double=Module["_sqlite3_result_double"]=(a0,a1)=>(_sqlite3_result_double=Module["_sqlite3_result_double"]=wasmExports["Fb"])(a0,a1);var _sqlite3_result_error=Module["_sqlite3_result_error"]=(a0,a1,a2)=>(_sqlite3_result_error=Module["_sqlite3_result_error"]=wasmExports["Gb"])(a0,a1,a2);var _sqlite3_result_error16=Module["_sqlite3_result_error16"]=(a0,a1,a2)=>(_sqlite3_result_error16=Module["_sqlite3_result_error16"]=wasmExports["Hb"])(a0,a1,a2);var _sqlite3_result_int=Module["_sqlite3_result_int"]=(a0,a1)=>(_sqlite3_result_int=Module["_sqlite3_result_int"]=wasmExports["Ib"])(a0,a1);var _sqlite3_result_int64=Module["_sqlite3_result_int64"]=(a0,a1,a2)=>(_sqlite3_result_int64=Module["_sqlite3_result_int64"]=wasmExports["Jb"])(a0,a1,a2);var _sqlite3_result_null=Module["_sqlite3_result_null"]=a0=>(_sqlite3_result_null=Module["_sqlite3_result_null"]=wasmExports["Kb"])(a0);var _sqlite3_result_pointer=Module["_sqlite3_result_pointer"]=(a0,a1,a2,a3)=>(_sqlite3_result_pointer=Module["_sqlite3_result_pointer"]=wasmExports["Lb"])(a0,a1,a2,a3);var _sqlite3_result_subtype=Module["_sqlite3_result_subtype"]=(a0,a1)=>(_sqlite3_result_subtype=Module["_sqlite3_result_subtype"]=wasmExports["Mb"])(a0,a1);var _sqlite3_result_text=Module["_sqlite3_result_text"]=(a0,a1,a2,a3)=>(_sqlite3_result_text=Module["_sqlite3_result_text"]=wasmExports["Nb"])(a0,a1,a2,a3);var _sqlite3_result_text64=Module["_sqlite3_result_text64"]=(a0,a1,a2,a3,a4,a5)=>(_sqlite3_result_text64=Module["_sqlite3_result_text64"]=wasmExports["Ob"])(a0,a1,a2,a3,a4,a5);var _sqlite3_result_text16=Module["_sqlite3_result_text16"]=(a0,a1,a2,a3)=>(_sqlite3_result_text16=Module["_sqlite3_result_text16"]=wasmExports["Pb"])(a0,a1,a2,a3);var _sqlite3_result_text16be=Module["_sqlite3_result_text16be"]=(a0,a1,a2,a3)=>(_sqlite3_result_text16be=Module["_sqlite3_result_text16be"]=wasmExports["Qb"])(a0,a1,a2,a3);var _sqlite3_result_text16le=Module["_sqlite3_result_text16le"]=(a0,a1,a2,a3)=>(_sqlite3_result_text16le=Module["_sqlite3_result_text16le"]=wasmExports["Rb"])(a0,a1,a2,a3);var _sqlite3_result_value=Module["_sqlite3_result_value"]=(a0,a1)=>(_sqlite3_result_value=Module["_sqlite3_result_value"]=wasmExports["Sb"])(a0,a1);var _sqlite3_result_error_toobig=Module["_sqlite3_result_error_toobig"]=a0=>(_sqlite3_result_error_toobig=Module["_sqlite3_result_error_toobig"]=wasmExports["Tb"])(a0);var _sqlite3_result_zeroblob=Module["_sqlite3_result_zeroblob"]=(a0,a1)=>(_sqlite3_result_zeroblob=Module["_sqlite3_result_zeroblob"]=wasmExports["Ub"])(a0,a1);var _sqlite3_result_zeroblob64=Module["_sqlite3_result_zeroblob64"]=(a0,a1,a2)=>(_sqlite3_result_zeroblob64=Module["_sqlite3_result_zeroblob64"]=wasmExports["Vb"])(a0,a1,a2);var _sqlite3_result_error_code=Module["_sqlite3_result_error_code"]=(a0,a1)=>(_sqlite3_result_error_code=Module["_sqlite3_result_error_code"]=wasmExports["Wb"])(a0,a1);var _sqlite3_result_error_nomem=Module["_sqlite3_result_error_nomem"]=a0=>(_sqlite3_result_error_nomem=Module["_sqlite3_result_error_nomem"]=wasmExports["Xb"])(a0);var _sqlite3_user_data=Module["_sqlite3_user_data"]=a0=>(_sqlite3_user_data=Module["_sqlite3_user_data"]=wasmExports["Yb"])(a0);var _sqlite3_context_db_handle=Module["_sqlite3_context_db_handle"]=a0=>(_sqlite3_context_db_handle=Module["_sqlite3_context_db_handle"]=wasmExports["Zb"])(a0);var _sqlite3_vtab_nochange=Module["_sqlite3_vtab_nochange"]=a0=>(_sqlite3_vtab_nochange=Module["_sqlite3_vtab_nochange"]=wasmExports["_b"])(a0);var _sqlite3_vtab_in_first=Module["_sqlite3_vtab_in_first"]=(a0,a1)=>(_sqlite3_vtab_in_first=Module["_sqlite3_vtab_in_first"]=wasmExports["$b"])(a0,a1);var _sqlite3_vtab_in_next=Module["_sqlite3_vtab_in_next"]=(a0,a1)=>(_sqlite3_vtab_in_next=Module["_sqlite3_vtab_in_next"]=wasmExports["ac"])(a0,a1);var _sqlite3_aggregate_context=Module["_sqlite3_aggregate_context"]=(a0,a1)=>(_sqlite3_aggregate_context=Module["_sqlite3_aggregate_context"]=wasmExports["bc"])(a0,a1);var _sqlite3_get_auxdata=Module["_sqlite3_get_auxdata"]=(a0,a1)=>(_sqlite3_get_auxdata=Module["_sqlite3_get_auxdata"]=wasmExports["cc"])(a0,a1);var _sqlite3_set_auxdata=Module["_sqlite3_set_auxdata"]=(a0,a1,a2,a3)=>(_sqlite3_set_auxdata=Module["_sqlite3_set_auxdata"]=wasmExports["dc"])(a0,a1,a2,a3);var _sqlite3_column_count=Module["_sqlite3_column_count"]=a0=>(_sqlite3_column_count=Module["_sqlite3_column_count"]=wasmExports["ec"])(a0);var _sqlite3_data_count=Module["_sqlite3_data_count"]=a0=>(_sqlite3_data_count=Module["_sqlite3_data_count"]=wasmExports["fc"])(a0);var _sqlite3_column_blob=Module["_sqlite3_column_blob"]=(a0,a1)=>(_sqlite3_column_blob=Module["_sqlite3_column_blob"]=wasmExports["gc"])(a0,a1);var _sqlite3_column_bytes=Module["_sqlite3_column_bytes"]=(a0,a1)=>(_sqlite3_column_bytes=Module["_sqlite3_column_bytes"]=wasmExports["hc"])(a0,a1);var _sqlite3_column_bytes16=Module["_sqlite3_column_bytes16"]=(a0,a1)=>(_sqlite3_column_bytes16=Module["_sqlite3_column_bytes16"]=wasmExports["ic"])(a0,a1);var _sqlite3_column_double=Module["_sqlite3_column_double"]=(a0,a1)=>(_sqlite3_column_double=Module["_sqlite3_column_double"]=wasmExports["jc"])(a0,a1);var _sqlite3_column_text=Module["_sqlite3_column_text"]=(a0,a1)=>(_sqlite3_column_text=Module["_sqlite3_column_text"]=wasmExports["kc"])(a0,a1);var _sqlite3_column_value=Module["_sqlite3_column_value"]=(a0,a1)=>(_sqlite3_column_value=Module["_sqlite3_column_value"]=wasmExports["lc"])(a0,a1);var _sqlite3_column_text16=Module["_sqlite3_column_text16"]=(a0,a1)=>(_sqlite3_column_text16=Module["_sqlite3_column_text16"]=wasmExports["mc"])(a0,a1);var _sqlite3_column_type=Module["_sqlite3_column_type"]=(a0,a1)=>(_sqlite3_column_type=Module["_sqlite3_column_type"]=wasmExports["nc"])(a0,a1);var _sqlite3_column_name=Module["_sqlite3_column_name"]=(a0,a1)=>(_sqlite3_column_name=Module["_sqlite3_column_name"]=wasmExports["oc"])(a0,a1);var _sqlite3_column_name16=Module["_sqlite3_column_name16"]=(a0,a1)=>(_sqlite3_column_name16=Module["_sqlite3_column_name16"]=wasmExports["pc"])(a0,a1);var _sqlite3_bind_blob=Module["_sqlite3_bind_blob"]=(a0,a1,a2,a3,a4)=>(_sqlite3_bind_blob=Module["_sqlite3_bind_blob"]=wasmExports["qc"])(a0,a1,a2,a3,a4);var _sqlite3_bind_blob64=Module["_sqlite3_bind_blob64"]=(a0,a1,a2,a3,a4,a5)=>(_sqlite3_bind_blob64=Module["_sqlite3_bind_blob64"]=wasmExports["rc"])(a0,a1,a2,a3,a4,a5);var _sqlite3_bind_double=Module["_sqlite3_bind_double"]=(a0,a1,a2)=>(_sqlite3_bind_double=Module["_sqlite3_bind_double"]=wasmExports["sc"])(a0,a1,a2);var _sqlite3_bind_int=Module["_sqlite3_bind_int"]=(a0,a1,a2)=>(_sqlite3_bind_int=Module["_sqlite3_bind_int"]=wasmExports["tc"])(a0,a1,a2);var _sqlite3_bind_int64=Module["_sqlite3_bind_int64"]=(a0,a1,a2,a3)=>(_sqlite3_bind_int64=Module["_sqlite3_bind_int64"]=wasmExports["uc"])(a0,a1,a2,a3);var _sqlite3_bind_null=Module["_sqlite3_bind_null"]=(a0,a1)=>(_sqlite3_bind_null=Module["_sqlite3_bind_null"]=wasmExports["vc"])(a0,a1);var _sqlite3_bind_pointer=Module["_sqlite3_bind_pointer"]=(a0,a1,a2,a3,a4)=>(_sqlite3_bind_pointer=Module["_sqlite3_bind_pointer"]=wasmExports["wc"])(a0,a1,a2,a3,a4);var _sqlite3_bind_text=Module["_sqlite3_bind_text"]=(a0,a1,a2,a3,a4)=>(_sqlite3_bind_text=Module["_sqlite3_bind_text"]=wasmExports["xc"])(a0,a1,a2,a3,a4);var _sqlite3_bind_text64=Module["_sqlite3_bind_text64"]=(a0,a1,a2,a3,a4,a5,a6)=>(_sqlite3_bind_text64=Module["_sqlite3_bind_text64"]=wasmExports["yc"])(a0,a1,a2,a3,a4,a5,a6);var _sqlite3_bind_text16=Module["_sqlite3_bind_text16"]=(a0,a1,a2,a3,a4)=>(_sqlite3_bind_text16=Module["_sqlite3_bind_text16"]=wasmExports["zc"])(a0,a1,a2,a3,a4);var _sqlite3_bind_value=Module["_sqlite3_bind_value"]=(a0,a1,a2)=>(_sqlite3_bind_value=Module["_sqlite3_bind_value"]=wasmExports["Ac"])(a0,a1,a2);var _sqlite3_bind_zeroblob=Module["_sqlite3_bind_zeroblob"]=(a0,a1,a2)=>(_sqlite3_bind_zeroblob=Module["_sqlite3_bind_zeroblob"]=wasmExports["Bc"])(a0,a1,a2);var _sqlite3_bind_zeroblob64=Module["_sqlite3_bind_zeroblob64"]=(a0,a1,a2,a3)=>(_sqlite3_bind_zeroblob64=Module["_sqlite3_bind_zeroblob64"]=wasmExports["Cc"])(a0,a1,a2,a3);var _sqlite3_bind_parameter_count=Module["_sqlite3_bind_parameter_count"]=a0=>(_sqlite3_bind_parameter_count=Module["_sqlite3_bind_parameter_count"]=wasmExports["Dc"])(a0);var _sqlite3_bind_parameter_name=Module["_sqlite3_bind_parameter_name"]=(a0,a1)=>(_sqlite3_bind_parameter_name=Module["_sqlite3_bind_parameter_name"]=wasmExports["Ec"])(a0,a1);var _sqlite3_bind_parameter_index=Module["_sqlite3_bind_parameter_index"]=(a0,a1)=>(_sqlite3_bind_parameter_index=Module["_sqlite3_bind_parameter_index"]=wasmExports["Fc"])(a0,a1);var _sqlite3_db_handle=Module["_sqlite3_db_handle"]=a0=>(_sqlite3_db_handle=Module["_sqlite3_db_handle"]=wasmExports["Gc"])(a0);var _sqlite3_stmt_readonly=Module["_sqlite3_stmt_readonly"]=a0=>(_sqlite3_stmt_readonly=Module["_sqlite3_stmt_readonly"]=wasmExports["Hc"])(a0);var _sqlite3_stmt_isexplain=Module["_sqlite3_stmt_isexplain"]=a0=>(_sqlite3_stmt_isexplain=Module["_sqlite3_stmt_isexplain"]=wasmExports["Ic"])(a0);var _sqlite3_stmt_explain=Module["_sqlite3_stmt_explain"]=(a0,a1)=>(_sqlite3_stmt_explain=Module["_sqlite3_stmt_explain"]=wasmExports["Jc"])(a0,a1);var _sqlite3_stmt_busy=Module["_sqlite3_stmt_busy"]=a0=>(_sqlite3_stmt_busy=Module["_sqlite3_stmt_busy"]=wasmExports["Kc"])(a0);var _sqlite3_next_stmt=Module["_sqlite3_next_stmt"]=(a0,a1)=>(_sqlite3_next_stmt=Module["_sqlite3_next_stmt"]=wasmExports["Lc"])(a0,a1);var _sqlite3_stmt_status=Module["_sqlite3_stmt_status"]=(a0,a1,a2)=>(_sqlite3_stmt_status=Module["_sqlite3_stmt_status"]=wasmExports["Mc"])(a0,a1,a2);var _sqlite3_sql=Module["_sqlite3_sql"]=a0=>(_sqlite3_sql=Module["_sqlite3_sql"]=wasmExports["Nc"])(a0);var _sqlite3_expanded_sql=Module["_sqlite3_expanded_sql"]=a0=>(_sqlite3_expanded_sql=Module["_sqlite3_expanded_sql"]=wasmExports["Oc"])(a0);var _sqlite3_value_numeric_type=Module["_sqlite3_value_numeric_type"]=a0=>(_sqlite3_value_numeric_type=Module["_sqlite3_value_numeric_type"]=wasmExports["Pc"])(a0);var _sqlite3_blob_open=Module["_sqlite3_blob_open"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_sqlite3_blob_open=Module["_sqlite3_blob_open"]=wasmExports["Qc"])(a0,a1,a2,a3,a4,a5,a6,a7);var _sqlite3_blob_close=Module["_sqlite3_blob_close"]=a0=>(_sqlite3_blob_close=Module["_sqlite3_blob_close"]=wasmExports["Rc"])(a0);var _sqlite3_blob_read=Module["_sqlite3_blob_read"]=(a0,a1,a2,a3)=>(_sqlite3_blob_read=Module["_sqlite3_blob_read"]=wasmExports["Sc"])(a0,a1,a2,a3);var _sqlite3_blob_write=Module["_sqlite3_blob_write"]=(a0,a1,a2,a3)=>(_sqlite3_blob_write=Module["_sqlite3_blob_write"]=wasmExports["Tc"])(a0,a1,a2,a3);var _sqlite3_blob_bytes=Module["_sqlite3_blob_bytes"]=a0=>(_sqlite3_blob_bytes=Module["_sqlite3_blob_bytes"]=wasmExports["Uc"])(a0);var _sqlite3_blob_reopen=Module["_sqlite3_blob_reopen"]=(a0,a1,a2)=>(_sqlite3_blob_reopen=Module["_sqlite3_blob_reopen"]=wasmExports["Vc"])(a0,a1,a2);var _sqlite3_set_authorizer=Module["_sqlite3_set_authorizer"]=(a0,a1,a2)=>(_sqlite3_set_authorizer=Module["_sqlite3_set_authorizer"]=wasmExports["Wc"])(a0,a1,a2);var _sqlite3_strglob=Module["_sqlite3_strglob"]=(a0,a1)=>(_sqlite3_strglob=Module["_sqlite3_strglob"]=wasmExports["Xc"])(a0,a1);var _sqlite3_strlike=Module["_sqlite3_strlike"]=(a0,a1,a2)=>(_sqlite3_strlike=Module["_sqlite3_strlike"]=wasmExports["Yc"])(a0,a1,a2);var _sqlite3_errmsg=Module["_sqlite3_errmsg"]=a0=>(_sqlite3_errmsg=Module["_sqlite3_errmsg"]=wasmExports["Zc"])(a0);var _sqlite3_auto_extension=Module["_sqlite3_auto_extension"]=a0=>(_sqlite3_auto_extension=Module["_sqlite3_auto_extension"]=wasmExports["_c"])(a0);var _sqlite3_cancel_auto_extension=Module["_sqlite3_cancel_auto_extension"]=a0=>(_sqlite3_cancel_auto_extension=Module["_sqlite3_cancel_auto_extension"]=wasmExports["$c"])(a0);var _sqlite3_reset_auto_extension=Module["_sqlite3_reset_auto_extension"]=()=>(_sqlite3_reset_auto_extension=Module["_sqlite3_reset_auto_extension"]=wasmExports["ad"])();var _sqlite3_prepare=Module["_sqlite3_prepare"]=(a0,a1,a2,a3,a4)=>(_sqlite3_prepare=Module["_sqlite3_prepare"]=wasmExports["bd"])(a0,a1,a2,a3,a4);var _sqlite3_prepare_v3=Module["_sqlite3_prepare_v3"]=(a0,a1,a2,a3,a4,a5)=>(_sqlite3_prepare_v3=Module["_sqlite3_prepare_v3"]=wasmExports["cd"])(a0,a1,a2,a3,a4,a5);var _sqlite3_prepare16=Module["_sqlite3_prepare16"]=(a0,a1,a2,a3,a4)=>(_sqlite3_prepare16=Module["_sqlite3_prepare16"]=wasmExports["dd"])(a0,a1,a2,a3,a4);var _sqlite3_prepare16_v2=Module["_sqlite3_prepare16_v2"]=(a0,a1,a2,a3,a4)=>(_sqlite3_prepare16_v2=Module["_sqlite3_prepare16_v2"]=wasmExports["ed"])(a0,a1,a2,a3,a4);var _sqlite3_prepare16_v3=Module["_sqlite3_prepare16_v3"]=(a0,a1,a2,a3,a4,a5)=>(_sqlite3_prepare16_v3=Module["_sqlite3_prepare16_v3"]=wasmExports["fd"])(a0,a1,a2,a3,a4,a5);var _sqlite3_get_table=Module["_sqlite3_get_table"]=(a0,a1,a2,a3,a4,a5)=>(_sqlite3_get_table=Module["_sqlite3_get_table"]=wasmExports["gd"])(a0,a1,a2,a3,a4,a5);var _sqlite3_free_table=Module["_sqlite3_free_table"]=a0=>(_sqlite3_free_table=Module["_sqlite3_free_table"]=wasmExports["hd"])(a0);var _sqlite3_create_module=Module["_sqlite3_create_module"]=(a0,a1,a2,a3)=>(_sqlite3_create_module=Module["_sqlite3_create_module"]=wasmExports["id"])(a0,a1,a2,a3);var _sqlite3_create_module_v2=Module["_sqlite3_create_module_v2"]=(a0,a1,a2,a3,a4)=>(_sqlite3_create_module_v2=Module["_sqlite3_create_module_v2"]=wasmExports["jd"])(a0,a1,a2,a3,a4);var _sqlite3_drop_modules=Module["_sqlite3_drop_modules"]=(a0,a1)=>(_sqlite3_drop_modules=Module["_sqlite3_drop_modules"]=wasmExports["kd"])(a0,a1);var _sqlite3_declare_vtab=Module["_sqlite3_declare_vtab"]=(a0,a1)=>(_sqlite3_declare_vtab=Module["_sqlite3_declare_vtab"]=wasmExports["ld"])(a0,a1);var _sqlite3_vtab_on_conflict=Module["_sqlite3_vtab_on_conflict"]=a0=>(_sqlite3_vtab_on_conflict=Module["_sqlite3_vtab_on_conflict"]=wasmExports["md"])(a0);var _sqlite3_vtab_config=Module["_sqlite3_vtab_config"]=(a0,a1,a2)=>(_sqlite3_vtab_config=Module["_sqlite3_vtab_config"]=wasmExports["nd"])(a0,a1,a2);var _sqlite3_vtab_collation=Module["_sqlite3_vtab_collation"]=(a0,a1)=>(_sqlite3_vtab_collation=Module["_sqlite3_vtab_collation"]=wasmExports["od"])(a0,a1);var _sqlite3_vtab_in=Module["_sqlite3_vtab_in"]=(a0,a1,a2)=>(_sqlite3_vtab_in=Module["_sqlite3_vtab_in"]=wasmExports["pd"])(a0,a1,a2);var _sqlite3_vtab_rhs_value=Module["_sqlite3_vtab_rhs_value"]=(a0,a1,a2)=>(_sqlite3_vtab_rhs_value=Module["_sqlite3_vtab_rhs_value"]=wasmExports["qd"])(a0,a1,a2);var _sqlite3_vtab_distinct=Module["_sqlite3_vtab_distinct"]=a0=>(_sqlite3_vtab_distinct=Module["_sqlite3_vtab_distinct"]=wasmExports["rd"])(a0);var _sqlite3_keyword_name=Module["_sqlite3_keyword_name"]=(a0,a1,a2)=>(_sqlite3_keyword_name=Module["_sqlite3_keyword_name"]=wasmExports["sd"])(a0,a1,a2);var _sqlite3_keyword_count=Module["_sqlite3_keyword_count"]=()=>(_sqlite3_keyword_count=Module["_sqlite3_keyword_count"]=wasmExports["td"])();var _sqlite3_keyword_check=Module["_sqlite3_keyword_check"]=(a0,a1)=>(_sqlite3_keyword_check=Module["_sqlite3_keyword_check"]=wasmExports["ud"])(a0,a1);var _sqlite3_complete=Module["_sqlite3_complete"]=a0=>(_sqlite3_complete=Module["_sqlite3_complete"]=wasmExports["vd"])(a0);var _sqlite3_complete16=Module["_sqlite3_complete16"]=a0=>(_sqlite3_complete16=Module["_sqlite3_complete16"]=wasmExports["wd"])(a0);var _sqlite3_libversion=Module["_sqlite3_libversion"]=()=>(_sqlite3_libversion=Module["_sqlite3_libversion"]=wasmExports["xd"])();var _sqlite3_libversion_number=Module["_sqlite3_libversion_number"]=()=>(_sqlite3_libversion_number=Module["_sqlite3_libversion_number"]=wasmExports["yd"])();var _sqlite3_threadsafe=Module["_sqlite3_threadsafe"]=()=>(_sqlite3_threadsafe=Module["_sqlite3_threadsafe"]=wasmExports["zd"])();var _sqlite3_initialize=Module["_sqlite3_initialize"]=()=>(_sqlite3_initialize=Module["_sqlite3_initialize"]=wasmExports["Ad"])();var _sqlite3_shutdown=Module["_sqlite3_shutdown"]=()=>(_sqlite3_shutdown=Module["_sqlite3_shutdown"]=wasmExports["Bd"])();var _sqlite3_config=Module["_sqlite3_config"]=(a0,a1)=>(_sqlite3_config=Module["_sqlite3_config"]=wasmExports["Cd"])(a0,a1);var _sqlite3_db_mutex=Module["_sqlite3_db_mutex"]=a0=>(_sqlite3_db_mutex=Module["_sqlite3_db_mutex"]=wasmExports["Dd"])(a0);var _sqlite3_db_release_memory=Module["_sqlite3_db_release_memory"]=a0=>(_sqlite3_db_release_memory=Module["_sqlite3_db_release_memory"]=wasmExports["Ed"])(a0);var _sqlite3_db_cacheflush=Module["_sqlite3_db_cacheflush"]=a0=>(_sqlite3_db_cacheflush=Module["_sqlite3_db_cacheflush"]=wasmExports["Fd"])(a0);var _sqlite3_db_config=Module["_sqlite3_db_config"]=(a0,a1,a2)=>(_sqlite3_db_config=Module["_sqlite3_db_config"]=wasmExports["Gd"])(a0,a1,a2);var _sqlite3_last_insert_rowid=Module["_sqlite3_last_insert_rowid"]=a0=>(_sqlite3_last_insert_rowid=Module["_sqlite3_last_insert_rowid"]=wasmExports["Hd"])(a0);var _sqlite3_set_last_insert_rowid=Module["_sqlite3_set_last_insert_rowid"]=(a0,a1,a2)=>(_sqlite3_set_last_insert_rowid=Module["_sqlite3_set_last_insert_rowid"]=wasmExports["Id"])(a0,a1,a2);var _sqlite3_changes64=Module["_sqlite3_changes64"]=a0=>(_sqlite3_changes64=Module["_sqlite3_changes64"]=wasmExports["Jd"])(a0);var _sqlite3_changes=Module["_sqlite3_changes"]=a0=>(_sqlite3_changes=Module["_sqlite3_changes"]=wasmExports["Kd"])(a0);var _sqlite3_total_changes64=Module["_sqlite3_total_changes64"]=a0=>(_sqlite3_total_changes64=Module["_sqlite3_total_changes64"]=wasmExports["Ld"])(a0);var _sqlite3_total_changes=Module["_sqlite3_total_changes"]=a0=>(_sqlite3_total_changes=Module["_sqlite3_total_changes"]=wasmExports["Md"])(a0);var _sqlite3_txn_state=Module["_sqlite3_txn_state"]=(a0,a1)=>(_sqlite3_txn_state=Module["_sqlite3_txn_state"]=wasmExports["Nd"])(a0,a1);var _sqlite3_close=Module["_sqlite3_close"]=a0=>(_sqlite3_close=Module["_sqlite3_close"]=wasmExports["Od"])(a0);var _sqlite3_close_v2=Module["_sqlite3_close_v2"]=a0=>(_sqlite3_close_v2=Module["_sqlite3_close_v2"]=wasmExports["Pd"])(a0);var _sqlite3_busy_handler=Module["_sqlite3_busy_handler"]=(a0,a1,a2)=>(_sqlite3_busy_handler=Module["_sqlite3_busy_handler"]=wasmExports["Qd"])(a0,a1,a2);var _sqlite3_progress_handler=Module["_sqlite3_progress_handler"]=(a0,a1,a2,a3)=>(_sqlite3_progress_handler=Module["_sqlite3_progress_handler"]=wasmExports["Rd"])(a0,a1,a2,a3);var _sqlite3_busy_timeout=Module["_sqlite3_busy_timeout"]=(a0,a1)=>(_sqlite3_busy_timeout=Module["_sqlite3_busy_timeout"]=wasmExports["Sd"])(a0,a1);var _sqlite3_interrupt=Module["_sqlite3_interrupt"]=a0=>(_sqlite3_interrupt=Module["_sqlite3_interrupt"]=wasmExports["Td"])(a0);var _sqlite3_is_interrupted=Module["_sqlite3_is_interrupted"]=a0=>(_sqlite3_is_interrupted=Module["_sqlite3_is_interrupted"]=wasmExports["Ud"])(a0);var _sqlite3_create_function=Module["_sqlite3_create_function"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_sqlite3_create_function=Module["_sqlite3_create_function"]=wasmExports["Vd"])(a0,a1,a2,a3,a4,a5,a6,a7);var _sqlite3_create_function_v2=Module["_sqlite3_create_function_v2"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8)=>(_sqlite3_create_function_v2=Module["_sqlite3_create_function_v2"]=wasmExports["Wd"])(a0,a1,a2,a3,a4,a5,a6,a7,a8);var _sqlite3_create_window_function=Module["_sqlite3_create_window_function"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)=>(_sqlite3_create_window_function=Module["_sqlite3_create_window_function"]=wasmExports["Xd"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);var _sqlite3_create_function16=Module["_sqlite3_create_function16"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_sqlite3_create_function16=Module["_sqlite3_create_function16"]=wasmExports["Yd"])(a0,a1,a2,a3,a4,a5,a6,a7);var _sqlite3_overload_function=Module["_sqlite3_overload_function"]=(a0,a1,a2)=>(_sqlite3_overload_function=Module["_sqlite3_overload_function"]=wasmExports["Zd"])(a0,a1,a2);var _sqlite3_trace_v2=Module["_sqlite3_trace_v2"]=(a0,a1,a2,a3)=>(_sqlite3_trace_v2=Module["_sqlite3_trace_v2"]=wasmExports["_d"])(a0,a1,a2,a3);var _sqlite3_commit_hook=Module["_sqlite3_commit_hook"]=(a0,a1,a2)=>(_sqlite3_commit_hook=Module["_sqlite3_commit_hook"]=wasmExports["$d"])(a0,a1,a2);var _sqlite3_update_hook=Module["_sqlite3_update_hook"]=(a0,a1,a2)=>(_sqlite3_update_hook=Module["_sqlite3_update_hook"]=wasmExports["ae"])(a0,a1,a2);var _sqlite3_rollback_hook=Module["_sqlite3_rollback_hook"]=(a0,a1,a2)=>(_sqlite3_rollback_hook=Module["_sqlite3_rollback_hook"]=wasmExports["be"])(a0,a1,a2);var _sqlite3_autovacuum_pages=Module["_sqlite3_autovacuum_pages"]=(a0,a1,a2,a3)=>(_sqlite3_autovacuum_pages=Module["_sqlite3_autovacuum_pages"]=wasmExports["ce"])(a0,a1,a2,a3);var _sqlite3_wal_autocheckpoint=Module["_sqlite3_wal_autocheckpoint"]=(a0,a1)=>(_sqlite3_wal_autocheckpoint=Module["_sqlite3_wal_autocheckpoint"]=wasmExports["de"])(a0,a1);var _sqlite3_wal_hook=Module["_sqlite3_wal_hook"]=(a0,a1,a2)=>(_sqlite3_wal_hook=Module["_sqlite3_wal_hook"]=wasmExports["ee"])(a0,a1,a2);var _sqlite3_wal_checkpoint_v2=Module["_sqlite3_wal_checkpoint_v2"]=(a0,a1,a2,a3,a4)=>(_sqlite3_wal_checkpoint_v2=Module["_sqlite3_wal_checkpoint_v2"]=wasmExports["fe"])(a0,a1,a2,a3,a4);var _sqlite3_wal_checkpoint=Module["_sqlite3_wal_checkpoint"]=(a0,a1)=>(_sqlite3_wal_checkpoint=Module["_sqlite3_wal_checkpoint"]=wasmExports["ge"])(a0,a1);var _sqlite3_error_offset=Module["_sqlite3_error_offset"]=a0=>(_sqlite3_error_offset=Module["_sqlite3_error_offset"]=wasmExports["he"])(a0);var _sqlite3_errmsg16=Module["_sqlite3_errmsg16"]=a0=>(_sqlite3_errmsg16=Module["_sqlite3_errmsg16"]=wasmExports["ie"])(a0);var _sqlite3_errcode=Module["_sqlite3_errcode"]=a0=>(_sqlite3_errcode=Module["_sqlite3_errcode"]=wasmExports["je"])(a0);var _sqlite3_extended_errcode=Module["_sqlite3_extended_errcode"]=a0=>(_sqlite3_extended_errcode=Module["_sqlite3_extended_errcode"]=wasmExports["ke"])(a0);var _sqlite3_system_errno=Module["_sqlite3_system_errno"]=a0=>(_sqlite3_system_errno=Module["_sqlite3_system_errno"]=wasmExports["le"])(a0);var _sqlite3_errstr=Module["_sqlite3_errstr"]=a0=>(_sqlite3_errstr=Module["_sqlite3_errstr"]=wasmExports["me"])(a0);var _sqlite3_limit=Module["_sqlite3_limit"]=(a0,a1,a2)=>(_sqlite3_limit=Module["_sqlite3_limit"]=wasmExports["ne"])(a0,a1,a2);var _sqlite3_open=Module["_sqlite3_open"]=(a0,a1)=>(_sqlite3_open=Module["_sqlite3_open"]=wasmExports["oe"])(a0,a1);var _sqlite3_open_v2=Module["_sqlite3_open_v2"]=(a0,a1,a2,a3)=>(_sqlite3_open_v2=Module["_sqlite3_open_v2"]=wasmExports["pe"])(a0,a1,a2,a3);var _sqlite3_open16=Module["_sqlite3_open16"]=(a0,a1)=>(_sqlite3_open16=Module["_sqlite3_open16"]=wasmExports["qe"])(a0,a1);var _sqlite3_create_collation=Module["_sqlite3_create_collation"]=(a0,a1,a2,a3,a4)=>(_sqlite3_create_collation=Module["_sqlite3_create_collation"]=wasmExports["re"])(a0,a1,a2,a3,a4);var _sqlite3_create_collation_v2=Module["_sqlite3_create_collation_v2"]=(a0,a1,a2,a3,a4,a5)=>(_sqlite3_create_collation_v2=Module["_sqlite3_create_collation_v2"]=wasmExports["se"])(a0,a1,a2,a3,a4,a5);var _sqlite3_create_collation16=Module["_sqlite3_create_collation16"]=(a0,a1,a2,a3,a4)=>(_sqlite3_create_collation16=Module["_sqlite3_create_collation16"]=wasmExports["te"])(a0,a1,a2,a3,a4);var _sqlite3_collation_needed=Module["_sqlite3_collation_needed"]=(a0,a1,a2)=>(_sqlite3_collation_needed=Module["_sqlite3_collation_needed"]=wasmExports["ue"])(a0,a1,a2);var _sqlite3_collation_needed16=Module["_sqlite3_collation_needed16"]=(a0,a1,a2)=>(_sqlite3_collation_needed16=Module["_sqlite3_collation_needed16"]=wasmExports["ve"])(a0,a1,a2);var _sqlite3_get_clientdata=Module["_sqlite3_get_clientdata"]=(a0,a1)=>(_sqlite3_get_clientdata=Module["_sqlite3_get_clientdata"]=wasmExports["we"])(a0,a1);var _sqlite3_set_clientdata=Module["_sqlite3_set_clientdata"]=(a0,a1,a2,a3)=>(_sqlite3_set_clientdata=Module["_sqlite3_set_clientdata"]=wasmExports["xe"])(a0,a1,a2,a3);var _sqlite3_get_autocommit=Module["_sqlite3_get_autocommit"]=a0=>(_sqlite3_get_autocommit=Module["_sqlite3_get_autocommit"]=wasmExports["ye"])(a0);var _sqlite3_table_column_metadata=Module["_sqlite3_table_column_metadata"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8)=>(_sqlite3_table_column_metadata=Module["_sqlite3_table_column_metadata"]=wasmExports["ze"])(a0,a1,a2,a3,a4,a5,a6,a7,a8);var _sqlite3_sleep=Module["_sqlite3_sleep"]=a0=>(_sqlite3_sleep=Module["_sqlite3_sleep"]=wasmExports["Ae"])(a0);var _sqlite3_extended_result_codes=Module["_sqlite3_extended_result_codes"]=(a0,a1)=>(_sqlite3_extended_result_codes=Module["_sqlite3_extended_result_codes"]=wasmExports["Be"])(a0,a1);var _sqlite3_file_control=Module["_sqlite3_file_control"]=(a0,a1,a2,a3)=>(_sqlite3_file_control=Module["_sqlite3_file_control"]=wasmExports["Ce"])(a0,a1,a2,a3);var _sqlite3_test_control=Module["_sqlite3_test_control"]=(a0,a1)=>(_sqlite3_test_control=Module["_sqlite3_test_control"]=wasmExports["De"])(a0,a1);var _sqlite3_create_filename=Module["_sqlite3_create_filename"]=(a0,a1,a2,a3,a4)=>(_sqlite3_create_filename=Module["_sqlite3_create_filename"]=wasmExports["Ee"])(a0,a1,a2,a3,a4);var _sqlite3_free_filename=Module["_sqlite3_free_filename"]=a0=>(_sqlite3_free_filename=Module["_sqlite3_free_filename"]=wasmExports["Fe"])(a0);var _sqlite3_uri_parameter=Module["_sqlite3_uri_parameter"]=(a0,a1)=>(_sqlite3_uri_parameter=Module["_sqlite3_uri_parameter"]=wasmExports["Ge"])(a0,a1);var _sqlite3_uri_key=Module["_sqlite3_uri_key"]=(a0,a1)=>(_sqlite3_uri_key=Module["_sqlite3_uri_key"]=wasmExports["He"])(a0,a1);var _sqlite3_uri_boolean=Module["_sqlite3_uri_boolean"]=(a0,a1,a2)=>(_sqlite3_uri_boolean=Module["_sqlite3_uri_boolean"]=wasmExports["Ie"])(a0,a1,a2);var _sqlite3_uri_int64=Module["_sqlite3_uri_int64"]=(a0,a1,a2,a3)=>(_sqlite3_uri_int64=Module["_sqlite3_uri_int64"]=wasmExports["Je"])(a0,a1,a2,a3);var _sqlite3_filename_database=Module["_sqlite3_filename_database"]=a0=>(_sqlite3_filename_database=Module["_sqlite3_filename_database"]=wasmExports["Ke"])(a0);var _sqlite3_filename_journal=Module["_sqlite3_filename_journal"]=a0=>(_sqlite3_filename_journal=Module["_sqlite3_filename_journal"]=wasmExports["Le"])(a0);var _sqlite3_filename_wal=Module["_sqlite3_filename_wal"]=a0=>(_sqlite3_filename_wal=Module["_sqlite3_filename_wal"]=wasmExports["Me"])(a0);var _sqlite3_db_name=Module["_sqlite3_db_name"]=(a0,a1)=>(_sqlite3_db_name=Module["_sqlite3_db_name"]=wasmExports["Ne"])(a0,a1);var _sqlite3_db_filename=Module["_sqlite3_db_filename"]=(a0,a1)=>(_sqlite3_db_filename=Module["_sqlite3_db_filename"]=wasmExports["Oe"])(a0,a1);var _sqlite3_db_readonly=Module["_sqlite3_db_readonly"]=(a0,a1)=>(_sqlite3_db_readonly=Module["_sqlite3_db_readonly"]=wasmExports["Pe"])(a0,a1);var _sqlite3_compileoption_used=Module["_sqlite3_compileoption_used"]=a0=>(_sqlite3_compileoption_used=Module["_sqlite3_compileoption_used"]=wasmExports["Qe"])(a0);var _sqlite3_compileoption_get=Module["_sqlite3_compileoption_get"]=a0=>(_sqlite3_compileoption_get=Module["_sqlite3_compileoption_get"]=wasmExports["Re"])(a0);var _sqlite3_sourceid=Module["_sqlite3_sourceid"]=()=>(_sqlite3_sourceid=Module["_sqlite3_sourceid"]=wasmExports["Se"])();var ___errno_location=()=>(___errno_location=wasmExports["Te"])();var _malloc=Module["_malloc"]=a0=>(_malloc=Module["_malloc"]=wasmExports["Ue"])(a0);var _free=Module["_free"]=a0=>(_free=Module["_free"]=wasmExports["Ve"])(a0);var _RegisterExtensionFunctions=Module["_RegisterExtensionFunctions"]=a0=>(_RegisterExtensionFunctions=Module["_RegisterExtensionFunctions"]=wasmExports["We"])(a0);var _getSqliteFree=Module["_getSqliteFree"]=()=>(_getSqliteFree=Module["_getSqliteFree"]=wasmExports["Xe"])();var _main=Module["_main"]=(a0,a1)=>(_main=Module["_main"]=wasmExports["Ye"])(a0,a1);var _libauthorizer_set_authorizer=Module["_libauthorizer_set_authorizer"]=(a0,a1,a2)=>(_libauthorizer_set_authorizer=Module["_libauthorizer_set_authorizer"]=wasmExports["Ze"])(a0,a1,a2);var _libfunction_create_function=Module["_libfunction_create_function"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_libfunction_create_function=Module["_libfunction_create_function"]=wasmExports["_e"])(a0,a1,a2,a3,a4,a5,a6,a7);var _libprogress_progress_handler=Module["_libprogress_progress_handler"]=(a0,a1,a2,a3)=>(_libprogress_progress_handler=Module["_libprogress_progress_handler"]=wasmExports["$e"])(a0,a1,a2,a3);var _libvfs_vfs_register=Module["_libvfs_vfs_register"]=(a0,a1,a2,a3,a4,a5)=>(_libvfs_vfs_register=Module["_libvfs_vfs_register"]=wasmExports["af"])(a0,a1,a2,a3,a4,a5);var _emscripten_builtin_memalign=(a0,a1)=>(_emscripten_builtin_memalign=wasmExports["cf"])(a0,a1);var getTempRet0=()=>(getTempRet0=wasmExports["df"])();var stackSave=()=>(stackSave=wasmExports["ef"])();var stackRestore=a0=>(stackRestore=wasmExports["ff"])(a0);var stackAlloc=a0=>(stackAlloc=wasmExports["gf"])(a0);var _asyncify_start_unwind=a0=>(_asyncify_start_unwind=wasmExports["hf"])(a0);var _asyncify_stop_unwind=()=>(_asyncify_stop_unwind=wasmExports["jf"])();var _asyncify_start_rewind=a0=>(_asyncify_start_rewind=wasmExports["kf"])(a0);var _asyncify_stop_rewind=()=>(_asyncify_stop_rewind=wasmExports["lf"])();var _sqlite3_version=Module["_sqlite3_version"]=3232;Module["getTempRet0"]=getTempRet0;Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["addFunction"]=addFunction;Module["setValue"]=setValue;Module["getValue"]=getValue;Module["UTF8ToString"]=UTF8ToString;Module["stringToUTF8"]=stringToUTF8;Module["lengthBytesUTF8"]=lengthBytesUTF8;Module["intArrayFromString"]=intArrayFromString;Module["intArrayToString"]=intArrayToString;Module["AsciiToString"]=AsciiToString;Module["UTF16ToString"]=UTF16ToString;Module["stringToUTF16"]=stringToUTF16;Module["UTF32ToString"]=UTF32ToString;Module["stringToUTF32"]=stringToUTF32;Module["writeArrayToMemory"]=writeArrayToMemory;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(){var entryFunction=_main;var argc=0;var argv=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"])shouldRunNow=false;run();(function(){const AsyncFunction=Object.getPrototypeOf(async function(){}).constructor;let pAsyncFlags=0;Module["set_authorizer"]=function(db,xAuthorizer,pApp){if(pAsyncFlags){Module["deleteCallback"](pAsyncFlags);Module["_sqlite3_free"](pAsyncFlags);pAsyncFlags=0}pAsyncFlags=Module["_sqlite3_malloc"](4);setValue(pAsyncFlags,xAuthorizer instanceof AsyncFunction?1:0,"i32");const result=ccall("libauthorizer_set_authorizer","number",["number","number","number"],[db,xAuthorizer?1:0,pAsyncFlags]);if(!result&&xAuthorizer){Module["setCallback"](pAsyncFlags,(_,iAction,p3,p4,p5,p6)=>xAuthorizer(pApp,iAction,p3,p4,p5,p6))}return result}})();(function(){const AsyncFunction=Object.getPrototypeOf(async function(){}).constructor;const FUNC_METHODS=["xFunc","xStep","xFinal"];const mapFunctionNameToKey=new Map;Module["create_function"]=function(db,zFunctionName,nArg,eTextRep,pApp,xFunc,xStep,xFinal){const pAsyncFlags=Module["_sqlite3_malloc"](4);const target={xFunc:xFunc,xStep:xStep,xFinal:xFinal};setValue(pAsyncFlags,FUNC_METHODS.reduce((mask,method,i)=>{if(target[method]instanceof AsyncFunction){return mask|1<xProgress(pApp))}}})();(function(){const VFS_METHODS=["xOpen","xDelete","xAccess","xFullPathname","xRandomness","xSleep","xCurrentTime","xGetLastError","xCurrentTimeInt64","xClose","xRead","xWrite","xTruncate","xSync","xFileSize","xLock","xUnlock","xCheckReservedLock","xFileControl","xSectorSize","xDeviceCharacteristics","xShmMap","xShmLock","xShmBarrier","xShmUnmap"];const mapVFSNameToKey=new Map;Module["vfs_register"]=function(vfs,makeDefault){let methodMask=0;let asyncMask=0;VFS_METHODS.forEach((method,i)=>{if(vfs[method]){methodMask|=1<H7EIwAYxlx8vgisGV?+$#Ge-opO)qaRJ;O;~xL+9?x`-XYq*7?|imXZ`e4AlUfWA zwOS`?*K4tj^V(iZYEi@n?Pp_?nAn)yBuk?tso7f6h$CZ7y;(Q4#ZeqtW8yfeniEWyCvRK~L8it+O13HOo?KXHcje5Je3`p4WY!3iw z);l$jQmJ!;mhjk}4h)j(SljM=X3LNW$Cbg~sJ29!&;dW#`V zqsh>+U2WM(K24x0wkA)K9N73j=rM~R%hd^k(gJWHkp&0W!P6qBYM%!$jIsvbFrloV z4jOpZh}-erY-b0OfnFlJxXn%p6VwmbD~oG;7%;mxkTmn|gTNpV)xd9D%WOAGObRCJ zhX2)RYXP2Zhs*)F(S&+Hn!p{K?jfezjG7DU;J*fy3*poNn*EKEIt(MLWkHZkWNp?2 zYt5LJHij@|vuZYKK#y^41r!Qn0(xv&ZZ7-6K6T6z+8OXI#LkPRY!qz576ZgT3X4Ux zSZJtavxfsQj2qV=pa}ZnTL`8Lepxu5)gkFU_XRcpTAauyNsZQE41N)&;jf5;Lm4hR zto8u=fK_JEL-Xa)KSl8(vxvQAqkvHMpavqWS!xoSu;uKZUWo)$QHDrR(RR8%p**^ucgE;g*a@rfLeqc2(1eN@PBJstvZAOF@sUFz{GnlhvF7QX_A6ma1g}{ z>z#T#M#^N-LI#jlf>r)O;^qM|QLdC|qE;*CHUB}mjXLl#F?1I!NgLX|}F3A+yDF=P|Rb-Qpi z8{A}X_?(stAYyh1x)BKqHW^(uoGIi54}I%k;4SdVS400bcpX|x&wKeV^hD}f=pV{n zz%mxZ0-Xr8db{0d05wd^e+o9A%Tw0aXs|A0*1KiP$1r6R>8=f;Xg{8GO4{uMakDeE&mT8mOzrXG=IY4)_qh2&YF{vJ9%;*Q^SQcRKW;vs+DG!* z+QY}Oy*4nDwHwFHWs%)9Zk}K_kDCv5?4!obdph=rar4%Wee}3_ZO0xtZh-VLgN z+oz73*QNGpj2_#k)6?328#m{tc5K{SmDuqKbH23`6XsVUFkx;7 zcdW?TC$aX9ee#6)WNM!>Va~GlsT1be_Gv7jW1r5%9s6%g(XnF_=2IOzK571^V<#rf zzuL)3b4y~UCe0NsJ3VPW3GOD%C&1mL`FO`ZbJBdQW1lr?J__z8&3WK%(!2`Nn>1f) z+h6o&`XDwtYHlg#ISY>p|h9 zc^xR6GMBXM#FTkW!%j|_(>ivF*Bv`OWnK*qr_8Is;goqLIGi#!C-zxW=Hix}nKCZ} zhg0TM=x@s0QMb>YGA{*(Q|2oz`=3+hB^~>mDf41*IAu@5}%w3t?G-dvj+09et!>N7LlsPxGM@*RyL4#A~kC{Dk%6u@jkC`%m$m~&5=FZGM zcFMe|WsjaRzsv07rp#|M`*`5b>=UNU?U{Yzl=)3&pEPBDo!KW(nRnOiQ>M(j;NdBA zTV|g&Wp2&v)0w?x|82_rGP7e-=9bKkPn(-FJ27p3k=e;<^YhG3O`DrCJ3VcFn%QHf z&Dm}H@6+Z3ZTrk=^OMXzYuenH*_ml`ZDO}fn;&QP*lF{l%szYC{4lfsF>T(^u>U!2 zZpiF&rp-4pyLH-Jmf3C7=F-eQciOxLI-E9N&+LCqo3CZ|dDG^rnSK7Wxg@j4Pn(M~ z``^>%E17-4wE1#o%V~3AX4g-fFM-2p^LlVNZ7u+Z(`IL8H%^;BCw3FFCwB9+`C?`t zHEn($+arJ$98Q}rfWv9?>Xv=XwD~+ZoHpl!!)f!`%pN^$J_8PU-Lj9LHlGHE)89?s?brgr8Sb5?4%9An;}+GCF~?@L?X z#a=6;^qlySx3+)Per5Cg$Ne&;)#Z+G6@c~j>Voe$-& z$zPqnB7b@QlKfZM53=uPAI(0Jotu3iyDR-;`iJz+^mpm)>2K0sr?;iIroT#mnckA# zoc<#Hd3sa&v-GFwPtqIHAE!S`f0*8o{viE+dR_Xx^t`Yf06$@zbXG&{?q&?`HlIH^B?6u%x}oA&wr4AKff;jUjE(u+WeaQ zJNdWsZ{=6#SLIjc-^{PbzmZ>_UzT5*e?9+N{?+`F{Nns8`IqyH@(c4X<)`JZ%wLwD zn!hxEZ~mVA-T4{$yYhGDr?=jbzrA&O>vaCUJ%3yN*8DB`oAWp2Z_MA2zdpY@d0qb6 z{Db)i@-tiSZN0m7c79g={``IUnfV3z7xORVpU=rQ`ET<(@-MV*&#%kA zmwh+8HoGQ!UF+M~)!9|qmDxA5E3)ro@6XdF5B1t!FOV$;phzh!urn|0}l!iXh#ynb9Bt4Td zhO}6anzWbbq(!3BJ6MvL3YMfWye^U=T5A&?cCBslh}YUIOy8B(7^a`ViJrZx6%}ax znp+hQSq=}DBadz`k;jr=T^>t&4SBF|UFrymM%LMDvWjGT(Wn(>r9HM^m&bFC;zRnd zewJ7?9U{6HH+r>z0lTcI_3CLE6~J6Hiu!(bdB5R$@p3tcZ#V>pLBQJ(K8pl=*2>7? zGnUazIzVW6Rn*G}yc{b~J(D*}j-BZ<;ab~eW59LB10*(ifKsqrnnNQioAz*HbK9d$jT{jCtD{S`~+kDkn-E9~&rgMQsL#_Mhz>{b|NwRy^h9CVkUM79E$ z#&pBRGF$ED(5Lb;VHyS05tuLoL(8l%mR;tD)=hq;3=PM~(84%j$XeN*88hjEwCA{9 zwh5-6!*#LS)Yxrm>^3!abOY0{siD&n*~auAkSB!|mhQ#zx`KYI4HN{4u_)Lqk_U(_ zqb+@#L$8HNKTgzOHoG`0D@(*Z=NT4fs@&W(&Kvn~G1N)VCg*kQT0oyK2Xj*NPVBb2H zg7)UaKAXoE2v6C%fasVendfzaQj2{(XW>Bwmoc~?96>=9Sfk#g#ux?M~9t^minT!%jpbl zM6(Qq-J~@vf;~-PFf>XGjly*QtGt{4;;rdNNrdb&3C?Lbx<=53u!J_3_hP#aDg~u+ z9toyb+Ur2{V{(94X|I--d>6@^D}?b2D0M9_1-6y;8oqxtP4)Xr2H#)ezdtqEz($B* zu|Z~aU)l`V3etap3VM;Vs(hmEBZJ`i8#&=z+3Y!}xWD=K#-Z*1n;7>~^XQghz_<-3 zWO#^C!9z?z9%2geSb}ZAV<{FPj}^V9Je(FPFqmYooBNGQuu-CD=|;7}Mu{1$W?Lid z7iMt7QFqbudnJ|_hEn%?@EU`wtsGRknqdtmYB3n*5w-n>(-{q?u^UcfH=G&PaAp{W zt(ak$oS0!enrrQfASntjDOL)xA{tD&^f-8O$6w;DW%Iagylg&C-|=ec^R{hEUmwrq zp&?_t?l8;)ycIkI(L4mvJOt4^1kpS|^nDrI4N!rxUB4G&yK&Fx#^!DWg)Yp75PXU{ zAYvOw&Nf!7hSmKU16U-UVxkZ#zJE6{>|U^?-$c$}wqP5wr7>Pj z59{CU1`pW{9%4)L*abVw+tP}|UQMaona#EJYr4;z<>uAWqNZ%(92roF6I8D09^S7Z ziQ_|~eIR(}ZYW@GxXNt8G%w=rb&bFdLBHDe$kH3d2t6l}WzRjo z)yvqsQ!x$WS**s`e~U|sO+LpsMi0F)u??znX331Pfj}A zH?{jCkXrI?7q&}WRH5^z-2Pnpf`zP)WpzlwpTqjKnbK^A^~41ovXBeIY*AlP7L{%3 zbx1$Kbt>&~=Q1_#u~&4noPSG*plEg9hkFvl8~j!o&`!+(!v={S1Pv*CCEn;^Vs|9v z`?nv_OR8^^T(#g~<&Eaq(9DhIKaTRcuNkPL`?4g^MKZL>>!60P<+2lpp-&sYjqfXh z=Gb9#y`mzJvCg%UwH=Fm-A&yigetDIb<)5(*?_zgaf^Ntachg#!2@wSrpEl0qEu%Q z#jco_Y}O!dGpc!HUy5j(H+sZes9YSZ0@Hm{t@pocYTihie)gJnBeZlcOH16wIzK+f zk5{+U`R>U;_IE#5kzvLDapm^jKf$K-)_Y$i!qf{|(SE!W?Z*SIzAr_mjK%J1v?5`Z z8uD_h9NNmc5sKh5B)V1~TibotK`a&G20^og*xHxoS@1lhx_>2=?!#LfxIo=cM+3ou zU1Xh{76IXeL=m0UJ$xBPvWn(i^_&kLc+SBK`hR1?zIT}X{uWpNbrjxgx3iVTkUB>d z2$i7B{bSQN>&;Vglmb2=@s@`X zqa&nR#OL(Q3!g@hQ~w-GL<^hr&)U3kbb)zZm>2fV6Sn11mZaK5A}48ir;Eg3Zv^nX z;vjhC0Q5HYFo1~4+>XYF5~mkoipX{IhJ|+XF~N}t(Tr-C@}i-o@>+~?pc;-G`Gz<7 zhL6qTlGoZWi@gpD%NRzpw_YkldjrOYti0|U7_afJG0nlaqv#E%#3Z)PyZH>6uTmU? zArqZYm;u0vbXW!;(FhG_w^S}=Fxihn!m&y zit4LJPNDYWw;pcvzZ)Jo$;k0}3(}$CaFwHS(bf&lrEcYu6A->wBMz;YB{JA*v$$`|hB)9Lf+)ws&0>9p=^$u19kb$3 z(Ol#D9v$HO;6Kk23M~{WxQG3m%na5tz_Enm`;l8MFdhwh-P;ngc`xVdi&EH5bmNl7 zK#Yq0g=tNAZa@&2wYw@iXGa~eVE+khIW$G;I0P4|SM}%Dbbj zVtB0--2G}EcYGf0;haST89Q~~63m&lvfq7sK-4YGQAnCX_+b$31txPO!cki3m?Pg8 zPH5TgwqUqcwxku~l<e|dk}TcYTwTR#^+i&`VfSn2tSo~DyJ&Z_?aNKl679V z85m}lB-a-)h@yuMNiGD}_0*ltbtZ>mFZXPH;^yy^^K-XWvnqBcPyh~ojU8kUbCe;qq&muuT|c_9-o(WvAo!ilrPg>1AT4i;$xLekN3eRx-D z6>7(o&24>iZcpOEOzO3>v~6_HlZm~3?AMqU+2GJ)S$R)m-#-Ma7Pdk3qt0T|Q8 z2_?&3#R=Vaj)+Bw2`w7TU<@JE_z~P#7;JknAC{<1Dy*r|_^{}q<%?M%ksw+m!pE#p z`{4>5EXJ#g;v;r2-u^04C$2m~LQHucjf3ryU@C-=@uzo}0q(;%kTk4f1{C<*rVUhZ z{}TTH7UX5CWJ5G7`@aPF4|cWWB@_Qh1V0Qr2(3WK_Z0rqki4M(A4CR6Pt>5Qm*JM0 z75PfU@`k>?lsD&#jP8?gJYRFbBIx-RhgzbwQ1FiE$<6_}!uGYoLyTCc^a`87u?%o2 zpGyyz!GCqB#T%EeE*b4|N%;Jt(a$e(pG%LO0h*nz45p|lIYr&441@{3t}`cuqhZe> zj;1ck1^2s?K?1(2^)#$68{T1fJ4b7)0{v^IB+2 z2jTvKNS62@@0xChGs6A6TOyJ2*+JA%%U7c2P8RnPzrTfs%|%|4=@!rIT%VzFT8PZV zNT?0TXdw?Lz$LjX1L8-nXLA4PE(Q+nN#@j3h@r^XXGd`^A$z!c8T!_6KJShVz(lI;A$h-DPD{o}Kv?PvAtTei|nOGj7q<45BsA&R!Z zzx*XKN%m)^h#%dLm#31hgCToqNoI|ImVZeaucIkliq=uvM1u8aMJ{ZS&frT3wl)om zaTVe$>o6SeuO-M`E8{90XCg~B_8a&ce1BcUp0>+u#xZ#jQfC5T!fF}|>jvz4JEH$c%5z313 z8bg4kStcsE0k3;T%rs(RVma0Yu)s-et!L2X#v52D>m8o6rX%Q_wb0v%ve7w%eA8VK ztta(}>;hK`{wdljwAyx=pCm9* z*<>snS+{LcvEnT82-?PF@?$vNcdv4?57Rm;6{ROyLbIK)f~Y|BhFF(us#?4*+X>z% zF5$!WT3hhQ*4i;1=~}xoD9cq|9sFP(iTk&BU>YwFp*P}bj_3uqe_DIHL>Nrvm2+PN zM{2(g42a#6&$B(W^sH#Ehq>G8ZVutBw3|K21;q!!c!fftg!shwx~21!W`2ZYpmQC` z;e3-*C76F=wUB)htA%%6Xz4!8mB7Gc3c5IaJep6Z*N890k4`u^rkovkisUT9LX^U~z>#ZpPYrg{l}ZlAqEUNq)X+<>iY%#+*}8Wq&WhGF zJ#?>NN|i2nyDv-y8Ehn=LiNBoE_%&4Dj)`l?zp6?qkC>d1jTXoZqupQXRIwSq^5e) zv+vjNkp{=PN?@Jr(*0Tu2{tN8iVNU<&i|Jsk)NMOaP2l@D}uhKq#a zz!-4Wkm-Jz$|AQdq=8bIL97RjNU_3(`jq#>*%``*(_D+hP>->+h`YqH{UMt?c(8fw(K6~+ApQHl#a1< zl%6$;%bC3CdtqEKDm1`DTm@;W_3C6YRvT>J;Zf^;)Ec#`Ix0q{8?}}8Yv&g6xkYsD z2`AtU)X#k?I~4bt3MW|QBau)mx19TAG4x2$F)%NhfFlc$3@sag50JiqEU?2gQNCDn z(GtW*<%s(duXCt#UqzYY4$ydo}7deJG(EnCYSJdc;rq#==V zaTsjq4oV8MCH(VYowx-xTZ%oi@ESP=&jg1yij1h$=Dd zZNR@eXdJNTjDmg5J*2}5*4N#fzO)myX6urn7zC=p^i-GJgA(yo;Hpa`20;gjLGTzO z_`qW&p$Hzkuo*rEG4Si5Qpq9?>lmTk!fqm;(BtAGFgo(B(7Pc0^k`FG)KObv@|mDr z1mmzrtyTxl6qeWp_>bL-V{s9KN+{|TMXP(<+MvV9_VwWz_0JQE2B^J4B1Z>AE0EC9 zmg5l4`yR2pk3!kjNA_O_>!Sd@cV4;i63+W$o%y^250}*;D`Z)s(FAdTgQr<}@U8A^ zD*t^nm9hSm9j6H>5ad5Z-BZ^`C!Zx!FN`7_&nS`+Ag9=n1iQ$glhQ6Y0VM>-LRy%X)eV)GgjZmy0=B9#b( zh$E8pYuoy*az|J4@E{1ODlbb_XrNu%G?^kTt=o9nXHJ4%Y&I2EUV^-h{gjAR1MCkF zC>BJi0Ckd4;aY09dUnvbTN?&CN9r% zFR|h%p~-Fe0Z2_2w6usfNiZn{8~CW%Z_H+uq&yo5E+Wt?40(Y-t8qD6goR8_TG0mW z$GQ~?#w z4!_%Nw~T7H5h2NP^5bp=f{d<129~-fnRLz|eBpQwTvXXvp$iG%D&CiPP17v1s(0M| zhy{_^J#>~uM=V+ijg01R%|=8z=LX6T5?d(}iZzRfuvcOEBUEV0k3@135pGnHw3}d2 zKK(nCp4cOhVjq%0WD8Lmx?pW%qN%X)>-DiOXFAl~NhwTa6ZF{NP^wgwiY14QEWs=y zwPHHdHL}PyjZq7MWW7TOKf;S5Z5e-8bx zt`!pjFM&t4Q1%KAXRpF`Yj!(*XE(}cnS(O%IbEF~e@~klo-RzAXKfjo9$7l#g2CH>ZF(`8gaJrm20 z^|2lf5i>b0+CqDr-a#P^3l(;mZVSur!X*+^lbT17Im1#XE3btQ=Smx#>tli24>?;F z>9F6Pw)Q46=@V%*AV&w^v=%meQ+V@Cg)xuVeaw zAv3fUZN7XO3}CxYlhfzwIEn(WLgtm}QP_?(#4rRl;YuDWoj7AIZwz$LX$*`2!APYv zX+1_K+3Y~su+xwsC=feU+$_IM3Juy3e0g15Ep%i=6sf0^pno+Th!uTRz2qBFz@xUf zKz&evLyIKWu!h+i50w8}4egY(0!6Y?f%57Z1Ho_nplV6Ay9X-wYF&U59|oZEpx6Te z1J6?G3nh4sIV#SIR%I$(b3w5msiPw`%NIp#5*n!NgmHjC8zHBpk5oq;2~+XfpS~>@ zZ7Hdprj}3k5_J-95Hou;BU-`>MOI#FHj+3bsO83FM;7>rA1q{{YhU1I)(w%F0XY`q z$kANax5qOr{qM;Vl{HjKF zYly^*(GM_-B`Qar5fy}mOIv3H_fED*6Ftu}*{1Wyw2|ax zZ@O{!kG5^2grg!ay4?>o$|bYflkmq9I1>e3$hK9UW4+uXtOuAn5@Fb*>gqRsPuBum zKCax;eJSAwx7Y>$J7G{wFXD|$da>p#vYJ|CyvyZCLapemwQG2E*V==4EI@Gv>)4RPi0V#O#z$y4|MvBmyV`NYesq4?24 z1BC=lT2()ZaYxYvd~3HZNO3{bXIK%sBUhYo5gFk@?!t~tERJHZ1@NRFNRbYjWVV9A+d9N6m|D=CCd&2zsBn1 zej(~&%)w+=K&7x>xrBy7NQFrssreVI>71_O@M;CQJZc(5ki-e1RUR-uBq;nU2?i|8 z+7`UmB2M38IbC7b`To5~V2}?+|A+qP5F6GCv8fLCV-w2))TsO@Z~4IkB3n^8MmUkj z%ZZ_B25AY_G0VybAVTekNnH%DsF8)|%8QHuC$V0`$pfN(fjOkXNhxj5jwRWK z!IU+12+p8&FNk^TM$FJVOrb+a#kkA`M={qDc`2CFVA;+txg$3}L?x0YtW=`7%)Hxm*OzGh6{fnJ zZw#puq_Nht`aCczW3OF&1WsCOk5uj8+)lzxXoul@`?T~w*qwT65uxp_eJK|a(P!O) ztT8BsfR18OFtLdD4>yZ28BBQzNl=T$Nl`5OLpeJy4`<=T908-W+Xy*07%FWWb-y+^ z9#~yj;-VA2snfCm%spjZ$5stVGwOVD9LfQ+1z>_PRRc{vZt}NCzHl5s;wG^smV-2L zag*!kscaZJt~nqAcG%IvF4QZlEO%*{m`D{|BYVK7L)9B!ZuP)&kS~RG;s=V2U1=K$ zRs!X_pBW6x3+E$`LcGHbjv2cDBImn=6jt=D-0XkzJJxWY4B7P-qmY8D8 z``!`brCbWzah3%(y>gN>3SAy872`t*m%v;1@xbN93XW;q3ne#HIY``_49=){ZEYwT zsL%3a(WY%7*dpk@BIKZ5Zls*F!kC`3On(SuDr<2)dkLxRR?AlxpgjgsKGb`ADuQ`xAHk9cl>I z3XT9%_(THEU|#M&C7zv&b&#_Zlpk_leEe{7#$^!h2kEL&X#(StK~N#Pf(JWL@X&Ht ze0nknyjyTE{%S04>p?tlTjw~c_wQYvRJE61x#MrY%k!jUzLSSzg8;j*0F=u^c%Fv@ z*m+30gNLL$c<9*!xz);XibR=a3)2xJ8q!pPaze3zE+P5A9@}+l6!M75w`1BM#>HT$ z!R2gn152oTy7=1iF+noOfzpC<%?zbMzNjon(B?c>ndy{_?S{h?kbBHbxW|k|$~~-N zlu||RSW##X9VaYJZk;kS`3oABL$+$D@ddL(C(ickb9*(J8UY&9V7*=zkdWpAN-pZs zYhGn|)DH!67)(EkW>)beXUm7(&r8bMY03NN4l{UpD6zu3=Ir~c0PUt|zMA17-6yMo z1O~;zl3luw{S6L?o_ZJFrE>V^#=u0FJEnG>Av) z>VfSvf1wMSOXYm`l4P*rzoz(e1te3R^o+++i*@#$amhR3+HyO>Fiqdd4|j2^ffN*q z4Z1Qn>KAd6V71v_e6%YT^iZUt{=CD%4IJfZmzyo+OJBA9QD{GCl*8)s$f!e?eyhmb zN8*xTbvx!MIbX9%4z|l#@|A_LC&IUx9PX!fZgW3cUVii2i;k5)GcxwGi+D!uG8~t4 z-(im}@A~9xuQW3ym&4KL0zN%0e)a{tEKlG5Y~r>T%zWx_BmZ6b=ACEgtLMD+4dr|K zwb2V^YUie*NGWbgVWHQD&1hEG=)iIzCojEh%?=|9jD~Gv@%Td1zd?8P>gK z-Fw_CbHgLfxX&4iIyH!H7BM;91vH$RH~R}}oY|R_KjZq8<~C3SF(4)tgmYd9Y-#%G zJZjFCkShmLm!zYx91oGYJa#*+xeM0R$ffEnWH8u~gk{SWOX&l7&LJJS1Yb;!+2JL! z{Ze}qJr}bsDIdCpnwz;Uc#yh{j{L$_tJP@M>-;{N{6w1g;z{`-{QE|y##b#+!v~8c zVW*lT3kiZy91i)!-JeymB3-5hOB?cLNNq*kQ)+!8;hSdF|48sZL{rH?G0Ll8STQCy z=EI{PB$IMgs1R~SnXW+CITUk*L+5HNxuLwZ#!yx3ZUDYAt&k0_wYRN?CwAR*6C_hC zCXe3nnDvNulwIzAR6DI+nN<=DX$UU7W!0W{>JW9UruKnX*BYew+#y2vaUp5QcOsfL z&?lX$B=AdO2 z@(g?Iqn@n*jY}XSyACQJ#wM-axV+accOb)pEh;Xlb}e0c zu*uXAf#%A5cF=cmd+m$%>ZQv8qP~cheAz&+xAK_-lN`KjOsr${7N(HF({9Z2qFPxc z@CJQm(>V1chj^-X2|d?6mhL{E=hCW>htJ#r&*RD}XXl5m65H%S(r=e1NfjiOgYuYD zFu_J!~K3ZVQy9~m{BVU zpqTW>(cCN4h5}0iV{sQWkgq6DYND*?o}KX);^5q06=E}GBG+_5E@;!CgET{*3UYQe z$}}gk{jGT{#d}O0+=nSFq1|Db=npz|-%)9?!Lr1ma*QrwLF~i`zu?h9QPFUBmW3r8 z_RggkJ{04h*mY=KNji!#)Wqb&A?H(a4JR(d{D#Bvg%A(%nqP zi+4C*F?JXHLQh+M=O=ta99>%Xuz@5z?nQ|$K>uaFgdXQc3A9< zF;iZ2p^hr~l_81+CG4<7U=q0)>MjJG+--9Q&+5O2-9)>u~!-{WX2AOI$enKGYG|d zK}pTA_0jgfN>XaziM$AITwo>lYdOzzDJ*z+vvcUh9rV6EjxGenVmC?{LAZm2(1B5# z!$M_EECc)?p)4UVNiK;chu81f!xWDP`-cS)#-c} zZ||lvFL4N#91+PXSK=IU-^zSyCR-jtnGPsHy?l8iXKrc#v=CrFr^L_xfCF&JJnJ45481TovqPh=HV=|A87g$$+YsEcTb)PdKaaZjPKYQc-)u9Qch6X2HUxwo?yWQsx zG@t6Iky;o&BtJZ>lK$p%tlfWmJo_^8^Yjb^;0kY zr1(7_@{_tH{dLD=M7RqB?Z;?C>?=6!hy$8$ljHtI#o@YkA{pERf z)O(0L&xv{umFF(_IT}vDiW39-Hf*ib1=~z-F;<{6X8bSTbf3|$_H^?@sklFdyzseZ!j|YfMU%cmm&#=Bqev#zfc`#yG^fs)UO#aR2Sbh7Zc;WEyys#Ib7e}Mk{a9n3U?r;+het9rXnbBTMOUP2 z?aqjl@J?7X;L?kz^7hNHUAR`j$Je|ZQ1OHWiimk}{rUgdI#?K=DsEdFXT!&mgE))2 zALWf(@IX|sxWnDCyje>=NDrJ6XeIl}RI>A-Y;myrUhFCH3=042y^hBxqpyPNc&voM zc#Oe(JPJ5cti4_a3fR6Y+_u4se0jLfs5QJ)%+~KT-6yg8K7vQ|sNM^S;WlRgS$>9P zaBWQ-vs7FJ?l08mnQ}&BrCct{bAPU4=P3rzTjc#)Y`ETvv;IoPSi_V(5)pJ*(uo2A z16a~W@N(>KE)D1+bdrbYBs3O!7OBg50Y7$)^2h23A%Q$c!cYaKuZ+$$odIpKhN6&L z=}GcphL^v;`-|I!o_89`h6v<|pbX>tSRs}b&Pw+ia=gw*3r7|}AEc^>DMSYGFhU=` z5w6ufxiEh|m-%H~Bt`o%C(dAmBd2_qk{z@*7T2kvEmHIdst)d^Da@h*ev9?W~mbCe!Mz;5CXr_bFiQ8$bcc5I@H4l9jhJ`&Rr3KDlm?=pXJq3mq!8G z=q~y=r0$||yXYg4%|I#}oYaNf^;FqljIgUNRLO$bRX>K0SbC%f^bC`Ni%E`j@&^w_ z$Onp0KIM7{ice;*2={%J6BVxPX0s@5DFZ3Q&Tw+vV_wWy#E@`CIENsZOu&6jaPOm- zRaU`c5SK(5QQ z6C=uX&-HTIJngHc3BrYP(1}7h%PX{Wi$%pA#X`z*#QgY>47A)0q~sgsTH!i)E9Gm_ zY{gKsfJ(#~RW@n>%(hW97_)+{uN`Ps%MH@aL(OV%i)<*m@0P1=-OBwkGKva$nYH*(+Fcpuu z?^Fg#1k$Z+Uu{l-UH66MzOFIinXSSCWUJV`0!=iikIL};E9GAJ9XWvgSL3djyB|yk z`@-+6cLSCjhd4cl3D#XD5Wf|`DzA>Hb1BEm)kf0ql!^B{tW2iwcbK@v%UgA#j984k`^M0;+llA}NanII%9C~IHgZ4v6> z`^hG%76)nvN(C~pQi#hCUzUm~C`7C%D0N`2^gTJA`#PFoeD}i+2*KsSpao$EKum&U z3{?ug1q7@mU~twU_*00WzYV|bCU-Vlu{frdoiWzChx(;V#jO~?{ zd)F2@vgZymVOyQ+Fc8$wB?}`96&wgo$VN%{*3pl_A8S$h}+90x7JTPhOvG~}C< zhjkB*PxUXG2gf`7OVeL}t57pt zNUh@A2kM|%`8zeARDnLwjlCq`AG?J#V_HJPcSdE0FtkUgt`fJ>c@%+A#L;pX*+7v& zM35rt)nFBmP*_F8mi%Z)yI4HK*Iconk^Hn+jNliS^3Lz`+ZgYKSlCVK1qosq%4AZG zY=pE(qkNDj8&iJ!0)x^h^DICxr$brHeWAGYO# z-57g>f{>hInp&~=&`7~P#6cQpuoP048(c`C^kSBXe3R>3;QJc#jTNE^4|2IaCAQi7 zf*G*VFXJcwj65sLmDL(pL3K(E5|rv9u!*s=uh zjF2?HX)5wc%54c^@8tNg3m!Jghj`pXoOeAxE*}y`8Em?Qq1Y1reNnN)m3^AB(cgk;#m|@z8d>Pak~KaLh`Li8A0J* z*_Z0&K0`=Ve#Pg4v;mDn6Rr+XKNaz{p$&ZXX)x1pbp~%WT7VRX}3*yavrz zx#oKXmJ)%Eut0FmxB_+NS?%Y66FGzrQP#@iyN{vs>Ulb=;6G0 z%TX2NCDtKS3hw(gJ;W|7+-rd=H_Cy7QDW#(%;^J1Mxhy?tBpydLpGILr^h z$|-HE5w>Si&x;gvNHtD#PW*|LuW`sKfAeB`!USvFluMNft23f8_d2K+74d-#;j$2A z!2Tjsi6>5ctATIucYfHY{N4Ly;1`sC7uJGyMIsPB5h}#nl70Sr*Bk`3x^EWi`tL() z_IPlL0KI!ifimB(OtAl*2Q@Kx#%K_@;K|_s1$BxiXAPxkU z`ziHC`7l4g50p5H1xkbubAv1us?vrPRBL_nmqCkF02Q~zZ>*zP&Fb4u+{zYdwS~#p~ zJ`XMYQw6c7g?|dI1FG30jDW!e|Lh@IL|s(9{O6(OA;|Rz-=YJoj|krf!WG-ZIRk4d znZDC#4;Yr%(N26v32s%IDJmAaA9%(BT$9zqKrzzGX&lcI%Haz+PC0l#){keK_NXjV zuG*yLnwsa_VWn@XV52&|<#)*RB709C+yk$HL+`G+C?#kYDJv;aRat$G1QBZzamPtd zQ{sAH7>j(DTCp-BkSxE};+zW?)C@lF1r7z6_T7&($_qRW76o zD&e_rStF;{$n(Ip_G*#%z;=ba=Xs;NXDv4k&3y&(IL!T}!Q4}9>6iTEY8C~D1^~_j zfP&{+w0tXczHrcaV|iiKHEaUy&$NQy$`e?8V03hO65)A?ws`^;Lu$2A*GTsQ6!BXN zf=7QZkKhdJM&&T!68B!0z$k`z4`AAs%`)I-SUl zhzT9Z?ybPp)Yo`H2l-dh0%KlUw0csxk;p_Zjimeu{dQ2lEq9smYK&K$RuDs3U$|w3 z4-aAlqn5VVc^X@EKM2s^#IP~}pLX9A@y>CTo@sSZ)+_i>+`F5`y=*q-1288rk6OiprY&ipU-J!#WVX6jTi!ctFA3Og;`Y0kjvxB#Vd!5N zI@NUOuUEamy4sxs{p=`MVNX5|jV z%5dzC<#Ii=`rUayD-W5GUsGPS-f$3bgq3hdy9hodR$hmK^oCriqsK~0jsuJ90cOQ~ zzSOTn?WZbggE6|I-xZ%z69z!@-;ZCZ%t@k!7pB+JOyk=oz zIyz-}S=a=*oq>gQKP(31Wuw420U^_pMv{&of%$g;fecyX65u-(?^EAMc&9C9^ol;A zCb(3bFJMW^7U4Q^ScFwu?n7l?f+D1d`1o+r&@C*t&IU=3$Q6-Awtsv`Z?%{#*yYFs z{n2V{J5~hxG5R~=trwl;y-cPmvW*&IkXla3vkweVif*6iedcDV(eLQHI_s_q&X4SJ>NCWZ!wn0bbo{uA39-u?Omh z7ZP+4AuG-`Yi?1gvS}6-p)Ib6DgwFO5lCF@5z1_6PxTWYh%4$=tbSnz8 zs>OZf(0r~TbcI4E)9!*+ZXGTi6*LitmkCy~WqSw%Y=JoBhY?Y$3&mj493^~5G{A4- zRbdmG{7mCje#X6mz^3Uy&RrdvCR8I`J-g{14jPRL$X)N6EKzin1_6LTmVXpGBa=aF zQ^IUkp&SMfF~K4QLdQQNZ0u=e;7>eAqYr`+arOl}J`y3cb{IGt5%g%NZ@DFiEAb!+ zPJF9Eu_r`?09~7KJH&Bg#K9XaGFPVD&~r473y8#5nGQrOG11B-w=Bi)H~=nv*n0{?aeYtV}<=sT{VqZ@UO z5>Kt)8E#(Lo5BD)Y#Fm7EaF&M-;qi#vYLKVS2n|aa)e)+)s1rG1w0pm(1)8ph}2uc zsWj1#!~Yw>wiG%dZ8fOKAq;*?pigmu6MfOvZR87hb2zrW4&(SnMGYz(ROtU998ad# zc!X&1@*2N1DMzYI7A(v)t|kJsa9O9|FA*k|gtqwA*ADjz2$5bQKxeA1+yd&l-ahF1 z-FxYZ#jlc%S-&?=*YDj+*LcwNx_P=@cMn~K;b);*bc%ABcv-73B?v*GZ4QUnh?S|! z6~a;9mzjvjx|FA6t|T7yeLq(pl!{z)hzEsAt@=~-P|hl{P&}UKH{}Nb=!;E>?ollN zU|yhCn#z!#1twL)ZC$jddzU>$4@y{5IVZzx@p9DBh2 z^$r?#ZNM|vduSdgloI0Ho&g0(q7?KZ0e%k7p{^^aTeKEAV2W-T(_$5`$+L8k2?8DD z$$dZN&(ZVpkywS2iPtX=0~n8+8v<^G0!umjRWENCh9-dhL*Edi=lJgHqwD&PNmAR${=eux)a+5Ac}&f1uf zX>Ocnnj8HzW3tJWISbk_iX}1N@u(Fsl22oUu}GfE3Q?AhHymC6Ygn|lfqz!I&kyr^ z`jarZ(!0a_PyFO6i-x4izgD8_r$fD%QZe(>d+3D(6SRuzg6a_|KMS2fD}<_@e>U3L zFVE=@`5^?$Ai9KOp-1J{ccI z+^qQ)!nP9Tw?0)QQ5hVR16?^38nYk{{s)wwn_Pmoj&*BLSH8-u2KQLtl6B+-L3ObN zua=Y~qpTqgfLO}Oo^ggamycGJ*O+6mUCQ$a>Eo|r#nzU~?ISDnQZ7kvbJ&GQE~t^; zn(%R%D;xwUZ=$&XUIjIO?y$hU(%ox?ft_>Os|vcgOi~6>!at<{fHL0FCwX*;`#?ot zAtF%K7PDr(z5FKq!lPG}(=Uec8N$Bw!P66d*;9nbQrr6I!CL3^ihl}@$2S~@hD`gNYtm!YIqEdP+L2mU|thJZ8H_-T){!TAB&4paN zOJTGeyi(cfw}>rGIyDo=vE2SkJGn@ii(-+;8a&Vne(ohJqlz+b_LPZ-d9HYvH~V$( zCv-GO7s+oPd7=Wwr!u6KP=375Igw7FVum0EHeymC6}aTSDdK7)d)^d*wUI&-xmrj4 zOwZE-h`_lB8gWsnA)whqQHKgN_o9fk<9F(oSwP?7ffltl09t(fDpL%xN;yeb1QORN z3Q)XI#0ONk3Y_!!gvH{K8+tIRdYNc0flx6nzYWC^oWc|fWpA*L5uaYYxn-~|gGS)F zYSa~O!9L;VC3>(;ufspCSCcKel%+3&xAuZ@_F~0a8P+K@$9&|Bv=X;;A6o1qOtOfN zU`}LOXQsc8OtGK*Y&D;BihcYiy|wnD>Ju)b=i{~fL^XhSie;h<*%E;1q%4FdC!679 z{$bZIl-wLQCKU_i#BE<{nN+*zXG=9x!e=7Xe(83hRg#T>ABtsag8XuLFMA&QRD`!cdfV`5fh_sa60td3#WH6D{JLu7 zSw|F=z$(9g6*~PUjNeft?y1B7rs@enhnBa8mhEDpW@&C8ZndYM1GT#ap)|6FJEZ4! zf*Dr~ui=iN?%r5rg-h5fG3ltElTGG#D|Aie-O@Et&GlQ~QFTp#?suW#j);aNTXiA7 zo6{5o0oxO+RsBBn6DnVMW zV&{1rRD}rm1r}La)0xn2X@Bs;4oeah0rV6zm0Az=h$w%OEQVaE3H74Wq;wb+h1h5# zdF9B(XwlR%Q5}ieZycZD0FBykT3aV`W0X{e*bqg`Wgu*{q4>O(S;*0e0ERPJ2?2ug|)CB3`+NF!=uHVA(X-G)H; z^JvGw7|zO*!c4bc!}8gSW|1LcYMcYgXW6{qduc^be{r+I{6*G%e)$(aAqIjDT?&;2 zEraLciRG0MP0pf_(46=)8b#I{T8WLLNJWd1QRU|+yTxfqYV3B56pG7rP;2 z`PG3JSB?E}6mB>X19iFaUQ#s~5`QlZ&7>$|Zxuu@ozsq;AOd|XMuP;RhhjZGFv6$L zoJlDNgs7@qsKchecK;#R)v+K{&?g#@q~h|vl)ns7fJXjpwXb3h`NfFoCLG8Ae32EE2Com;1_57?ly!v>ERDs-do( zVn5&YRlCyl)gxVdzU!-ZrR!^?t5=2COTO!ChPn>oCJ^pvVWt7mo#xvPFdK-DJmDzO z?JLnZB}GSc7>wL!Jo3{5jq->Pq=(>3TE%HKsF2`B(-dkX6XK(tz!9n~|^&$)wgvIN_T>n@s zf!w*?QGV~{^?thjROo`oH-u*L;}s61H&kt4@?g2WF|>0zN&)?i!|j50dy{L|DrH}q zDh%E4XrSkPNTyTO9qI^0fi zTt#mb(*!@+yTQ&`tQ15IAB%*UWw5vc2z(#5rQ)`?xk=gB3b?oVN!1qcb`XQg@8=AJ z(%VD70kCf$?iaZE^w4gA{nO{PlT`j(yuBmfV*uJad{-~@=Iiy&&}%T^JAJPaY`-hC z8!X^m!|ejL=V693!kPxmaE9+X66_gbhJnJKhZ!98mw0jMY`b8TPrPJ)cbI>KLEc^A zM(?husL*rpdqSrHUfwgj-oP&J4ebVadGBz$U>u^a#20qT_)OPnn0L;c(+LuPpKqtU z^S-Ku@(z|R_!K{Z{T|YdbbEgo{!k%O>S@JadVkejH9A}{;5@(Pv%*>iYd*{O(v1od z=j_mKu;#Oe+l{PQf3yl|6(lnU0DSUCECFP5tmz*N0+r1kLmvn$-y5m%0Y7*VWSRVc zAJQ}Leu47jkuSY#fPFY8xDR5u-_6-MY7Q?{q4lBpAa^7dKn?)!DaxcRpAIP#0T@`c zlIas+gU<;QjTK8(&7V_23HHMYfJ!E*;fOg&Bxz8YvJ1jV`wfKCxo%eCG?j2V*U#%i zx(?Ra!s)}I-(WvKJlwD1?YTmSUrZE?#zRwn#CN?Hp~Ln6uGfIj&hx!S)T3^Lt7y>U zK9UN>*{gW9?bzv~Zn*Z4w*9Cd&eN@md2db567wS7B}V74KkG{efTziig=qv$kt+3% z4WlWr$HzlES)FV5@!@tF8y;0mm;jDLjuoL+6(`}uS8L@%vEx7C1}At_0r81BgVXMl zp`ERO_~dXq1y!T&$LtL~}7&lH~u?FRVx)Nngz-P7>XuAvimE^hy6 z-|$|xyWb9cCkzMQxjeB%5k1V63G|r&$pGV@8J-{r>(9;w%=l+Yn(x9ya*^Fmyh zeiONJ`VM3j`FP1(lMPWZKx8!+@zvMk%1!)@wv%S$N&!>oHHZf}BCbMEw%G0E=jMX_ zIS-D~Z9w$-q1}K#&mV3V2=DWAm-qSMcB9K1TAUZivJ_S%=*B~HO9%_#q5#e+`G%bl zLDKM_PelZQPC1bvm|W%NgDDOmR~;R?eJOj zi`)=~N)8-dl)Wu##d4|jzG!4T@bu*{TaDSiJp0?P1ejT8q3irg)dXD@K)yH(vYbIK zu38AlxgM!TRuB8{l4Zl2;+|6CAt2plGD;(t*MYP{Bg)<6B0s)WmsRqQFqgI`6FX?H z2MX`8M?}tzvfrZ^HKKA@vThiT9Q@KV^(3k!jUwZ*%j654%`T=T;Xy*7z@rx>2?jT5 zMGag*A&{O>Lv*${zKD$EJS0&hiTzc1Qt*0-Lx~73e{I1f9xo$iZ@i(`9S8~}7(fb) zf%BYA3$Dmg5hD)=uD|L=U%Y;mUTE=EKlHwmfSJodUvsTZxd!&p!+l??_J|Il!j*Yj zt^{;BOJRNCYR~Qdli}Oj`lmcPF zJO8wlM~?T0gs+r231}fIJQfPh=~pP#N<UgS7sf>;j?Zz?R2Xv(X4#f62>E$EUko7m*q83Bep<1z8 z7^D<3wN!D7)?{H2x70zyBlCJ%SGe)uu_xXsW)TAoQoH<2#UClTibKyL5gB{uO$MCKDnw}I#pZ$&9F#BKvxRF zzd5|dK#*64R?O@QH?JIS7U<|I*9>_=phRw7xN5kSFBK?v2>AK(-lD-NRknU?E;Ud* z>~~rZ-}(jX)=TjR>sX;xAOSJ*p%Rh*c4;3JJXD)FVpvVNt(-}a@A+g*ssQA*BQi*d zlXw(L`mdAnlpUNj1%DKp0EkRTwxT-$8L6!DwJzvN%08s9D3rEb9q^EMKNWGz-tDyW z>b&CyWL!+3r=pwP?Yee>ol2qAQk+|(Qo{XeO{~TOr-Sv}xYbbF!IVDGpmspCrr#}^ z2Sh97Hz}|Q#&{&C0CLKFca)gDHO4M#@`G+QS0xPcA1slf<$XDND#FB<>Vc6})e^oX zOW=e7#QLs;o&1(xgvbQZ`SK6)EFL^4Wv$8kM)_^G_yr^`abd)6jJl6ygl|`9fO+^a zFq&6-l5XD#-MF)aoaXl;K5=*()LZz1BRwxku?_hXp&Qu^uFR1)OZ)MR=A6kq$S?jl zh^`4k|41Nm_R%%N(1eE9hK7Hnp_%~K&S?gAv6S^k-`S;x2pVyV*?&@kQq0fwr~E~< zuvcN12Q5V8%x+t7E#JZJ$M?9sf)h%bIwhF-ou@?{<*KhCjMk^mU4fruv&Ga`@Ms%=q=eQ{4FVd0Ka+Z5c>pf~9>f1%R@(94(Y*{vfO=?w;K!f8aq~ z1{FzFRCk-q;o}F_ho(~1g{GpaO9Z-BbzNU|1o651e{2t%-9$n2~} zc|+AvX4IQ*dhI|qLAv(2b4*k;7ARFL^2n+{{13yB{Gc#w_u*RkLqFtlDy^y@fk-Lj z#E+!4RNJeI?GV)OW(hY^Q zhnt1hq3OWQzZ@QOFUXZttEl{0O7~Z8h{Z&hpIrXR_i<-Aay>~7BnYj|Q0$1l=3_PK zSBOZbREaHAB9UWpVA*LBv1e8y^u(=g#t4(5=1w|6Cre-;PH`L%b);r*Gbgwtro;&@ zBE2Hm-TfSL2qc;jU)Fn5fw^vVaEk=Ol)iNUc%Ug)aVJBGnV`ZGYY+P5vIj8`RAlcZ zg00|XR_rCkrm(&go2r*g5tz{J^8VPy{yy_wU+A`mNYN|#ae!C7OHEHIFt#qQ$tN5! zehxt2hK^=aD)D)n-!s_nuCEGTyr8^o0KM{>6ZC>ZU=ehpFjQjVx`QW*1;Hhva#Md_ z*@j_U7R{sj`xb-_DA+6ZrRZ)LnH1#lgZ4c}tf2XIpdfMG5eVH=ZTagt;ApWrW`Tpw z*;$*#f}2$uGXSNZv9U#RRBzw3*muax174Oi)7w|?{;6!u-vltSVqfZ7e&Zn!6()Do zyCSi`f}T7E^*gcqtv1vBmug+Ny8#!JKNOY+3(AkTS1T(98V;ZbV&{&~?-j5Ty`%*H zj`@0tg(bi8!QkC9g9QGq>%Er<^WRpzhDFp$jw@mYsl$MUD)C(bJ9t^Y3)6G)2VB9} zB1V2!4F%ZB0B+kkLF@&=??b;nbm5Xczn{00>|}L-PWV~~JE&^WiK6QlklWH@p+JyYpfV{vWyIk?!<`ONYCiZW`Z^cnI169z zlbE%^V%V{qu81v^^SWU$ag~oo6^k0T>!@WMlOG?1o7c#tTH-p%Nu}PNSXpjG+-atV zvnq`J!DEbVq_F!B6&OLkx&FmIphO8IVET^%(=Wz85Rs)j^v6+T`yHnib_)TxrDZJq z*k|LtBp4u0B~52D4o*=Ozp@~TMO0W<)f;>QInD?s_)H9kKLtQ2h|K`Sk;2+ zrpdP|`w}Y`>oB-*B78aJBgU9EW5m1Mh+4J_6W-;A!g%oO8DczOtQAY22&sCvXyLJxv+)zx3P|U7#>_juH?f1x$ zqH1zgoXLX$-+F`0RiTvut^4}Z>GQm_G0x}JodxE0b!e(QNu+x9;B|Qae1GpM%=5$R zdWo)y0~svQHFX)5C=U1qv6nTbt-oNTObzzX?F(bWW`?-R_`+tbxE1%JSdeXnaq}s> zXtiQ5jsqyzR(Nq;BG8^8H;2NOYnl0y*z99iPd_~MlDZZXi>|0^W4XHfYga4wQZI(0 zBwOR9brG3#GC>5t|Rz{jneXHrzQ^N<*}l6YVZqTeh|+r^W)`1 z4S*5Xjg0!bx=3Tyem@jLk$yt;`*n%1M1K(bGsE}~R=$2k?8B6PNA*|Kg&O30eJltF zH`xkaKT-_zC>6`N)-rCoM^P!G2+ojSu2-{_8{(i!v!5|`Z>SrKR^cl{hwzFgRId!L zNy8J6fdjHXB@O%8w7F6#?@AFR^{yb_@D9BybQ-iyd52y#+N^CsjJ9cq&+UBJ_fk>_ znCWMi9&V7Og^s_Oa|Xsb3qPSgZKv4%FbM|C0w=cmZJjG8%>ZHyR?JP{P##ib1rO;~ zhi^+QAx4{XRNI-w_5nM;aWIJw--!5S5;ulP1dGKKF;>DHWju7FLuBW#9@PF;sQv0; zz^mdyc879^jevC_yNx8S0k2-;O%<^Hs3g9oZmNMduMOqc@{tGNwIgL3J-Sps6l-XM z@=#sAUibx45#a7zTTN(UetV};oCNZ8JL5Q(PGhkqglkKmBSX*t^JJ>)Mvh{`sv=nY<_q@@q% z+m(M!;~N$ihDKW@^TF4x)CYqW*sgJhLR<)NWkEGJ^%p|*;03x#bJ>qYJX8D+V0%+z z8cpx?0y>I>6p0qljG?&6<-p9y@hv^-^${kh+;WGlF(u*kp*c(awT5M{z&FcY$34dso^ zq5;8KpV_dHO1(G5dMDNGzbRBQB}e0DNenA$a=1BELU?RYHnp4U8jaFba^5P$0CtVf zN1Nx(YDeqv)kHp3o86lmLuS{oOJQKkHJ0)&`&ia%f150{;CK?%UP>v-(1czqE4jT66Q(h)DMr(6lLV&M=eW^s zb)()=nW1wU4G?@w07iu}jk-c4n>59@glTM)G98aRQGI8BmN5$cVKR2Et?g7PuYdE8 zjRfpZr#pFjENLYnXCb}5b*R^kCKLHTW~6?}Uvcz|4* zwSDsTk)oi3Fd69J?94bPY51D~NnHd+G6ycmA(?}+?>H>&#`JN1e$X@fXdw_%neB#~ ziz~!fz{BcXxbWAg5dbo?2^|idKfts{aVH$)TCEkKFYg!{I$H`>`yC@g$2sY%_Rd)0 z8qJjoTtuOLrgt_vbO?GlDswh=7=ik(SpO@aF6>L{`@2Hj%{BCEBZa!HdO_YD>-Ok$ z7Zu+fDsJ+M0cvpJR0m?2%u@rw`Y7VXk)7&2u_b_}TVH9Au_y`WdqR_je{s<7jm2%! zauQ71q~AMIn2xM_oy1fr+!SF{Sd8IvQn2uSp+VTd6Zj%lclK1w=2AVldT7nYp|$|| zKa6$6s9cWxVO=w#E&apA5t~rIY%Z(gEB8ln5-3y-zCQ}pO$_-!8Qc3~KPND@_t!nx zJj#TNA-FB_0Ka zTN+~oopzLn67j?6KeaZzY9g>SfiZ^zww&Ea|cFtN6*Mq=Q>S@cpMPQeb za)n%qTuxkSyQKv{>fa}(61Zl*E!m=M)yhc4;3jAV<9RoQ^J_D@r!3KS4}{fS)|2t%$!R{jIA zA(9vqA>6ed+Q*6^`h6~VMT-g za6NeG2z3mwcAY?jBcX!g89YPok-EGgfsvbrGY2{q0wbYU53xi6E4(9ei-6iv&&+?K zQ}`T^qAK|T!uW29vxhH{fXPL>DS@F@o=-gXMiS%c}(GAFX@ACL1g- zqF>AVvBC1@zPul+%d@-@+FITk3J(eBOa^EnGd>0-Hq|EN&{F<+m@}ieC#(LvZdNPp z3kZ{~U1wS{U}m~|NOL9h(7FwlFUkdr)8YaHz)v8?UA0&hpPnC&5{FJul$Bo!S%9uu zQyDL8-INZU?MlxVA|^Vc)l9fW&%BYOHs6*c{q>|a#n>V^ErmHn&oQp*csbbo8PlT@s{?UR+Knl8(D4{2)oWZkHKs5|A=_ zrU+8dVtw2pxGCKy9ChtFMq8 z1&e*6*<1|$KpT=Lz^^Q0Hj_{RYSKFG9%5%f?z4OW^6TRI817Frgn@7rpQn+8El)rK zLZEky?CdeqPlkcPrru|h{a^g#`hsVHrOc-WWnLG`d}>f8bf6U^SG?KkW)&Fnfe-EJ zJWH_DH6N$~BqJHTt)-3z`6r8Svfs{7)@668MQ_HZBkahI>Xh^8(ECubV5GF_<^=t* zXu8(O4k?kHSKZiW52Ny|bG{eEvg4nL%l;YfsaIh=o2L7j(21~qfQ;&b9U7ySq;%siTKR*S)Xmv3;1Gn z#}D_n79UCb@*~wOzK6$ft*00r0<+TkF_r(FueCe$&dcIf>Wi`?B zr8x8&XTDUIZ{m!ohI<8uQOC*p?EaK6-*ACrF#}982izI8F8O8esz8k;UuNA)U7A8&csk@D5plOgc^G0O1s2@xL;d#<;Rmer2e6i0LoAK(E>Y z7xrMOzpTqJ(HP1WJ@$sT_9K*ssJ^!H?X7VX z50ywT6uq@B!ziMH`1RPzIIVoWE)n|ptJn(BnGw_fsxCw`#*J!&y{4DU=|#*owDgVG zQiEo`5n5U+3qGPQ*fByg($iQ8v{fzLkji^+#B!VWnZVrxvD~&=k0KV^X^l(#&Bj>a zJ_fvRu2!?=@CmthVen%z8L@%-A~#5z|gJYdS!>TjBr;%57IV!_P_ zLwuvGt6W##X_lP{Q-bV>H3|qI) zUn|8=^J_D5$>^T9QeHF4>!Jl&9XtF$jIzezBuf-0(>VtIq<7H(fl~{E~=?9>)#p$i@>e^ZMa}q4Ej2wuJ-RjBEC1$7_lV-;3{Co+bkp506}}S%%?*SuKzXc=djpeEt@e<_ z?jc|m5k{FUK?wQFUiLxvm;GeL@L3VATf*27jAOk!Bb>VBMyS`Lk?*W)0?{(S>4XxG zc3cPL%?#aL{aQD?ep**r%{})Yp@LA>_5c5<%Qu$oKf`dyq=hf$KkFi44Cc(@o-;R< z;)ZI8H-@uK^333|!v`RbMq`e54dysk&+)FhZMrWaE}V>WWvj2Vc2~g3IODqqGyb>N z_>Awan~?oc^4qf3z+ihDQ<$ z@s;7zq6czc3R=>E=5aPTCm_o=C~fKiZJe=56PU)zBji^Ms{_Gh6``t8l?U@P zz~^|4iQ?TkpJU@;cs(e-hkJW12HLK9lrfFpX5_QG(kshT{(zwIT-od;O6P;IT#uBE zzJqzNSuScu&kf};6BIP@+-4cuXf*Je{e6P;#YwF9zTG8=qfKLH&g&~unXzj9%=YXj z=D9V%%9?KZINOO~0kvfix3sQ`!&97?JN&O2=^9u)FP7_-8^bi7*DMz;jH}}`GMmQL z!({?yJU=!z==Axape=61plf0|b?U0{<||B-p*6QARr!#<|VK(24?H zX9c-pNA3j!nw>G%ojbvq>1iF9_X|gd@WSSt;xfM|lnX<6QL{|#Wf;c|V^og=UIiNH z^y1jh0G(dkY@_xPy(AVCK6$eAmxO`_yQuYCJ3OFkN6G*J8_S40zYqs9=BgwSX7j}b zdFi0@jX@5*bfjUR_Od~_ILMbZ%f+4Zmk$Q{gzDvWiGU{8#a6zK4Q_V$=4!8P5nopq zh51D4(5@@Vn%yz(zcQ5HkBtzRo1xsSvfy4rROxw~<C++Kk{f_(9;$1hd>VN_Db)yuoJMRaKAEiJuR)qNCx0?ejHDqxy;#+ z!xYrt^K?uQPq5DIVw|96=2DqaLyfW3adU7hHrFZ2YgA8tq)enKX~C=!owOk`{7JZ( z^byxNnN8$T>!Z`@@H3XbpV6<9zgRqSODkyzLRgNd7^eLypJb0Mx(PqF`>HU> zdT)KY+AmGtyc+UkMmTb4lnc+|51_}5-j)fX8;4e@4*Gbt7eU9z@omP%t3$z=T2o}Y z>!d@Y`QVJTZ-lpu`>3^ZpeumGXcQkHecWVxSYI@@h3p`EN(8~_{*2H`*REz^D!cgjma zzk}<2Hh>-A*Lox&B7lg5X-2>p=e8xMD7=8LSU~GTgXpcr9%WW%7;=RZ`d|E#F#Z#6i|Tz>=Y7A0g<8G@X)a{ zxA$9qaafDZC0?1`LTQqp+Z|#ALkN^yvJHeaV9jK+C1+4|wOZy7E^}bNo;Lc^kl1)} zMT*mcxl+dFW0RyN?fUC-&Ds5p43jH0sfUtl$yEe0#|7MB=FpOw|6_Vk*Eoouh>y<4 zk?hD8ma?msT3iJdn9pk+KMTAezX8j9Z9vYhkTZHW!_{>`Xrb*x5%=Mo`eT>Z9SS{6HhUmbt5v5ZZiUj$<{+E#>*5G?In?Xw+JOkwcWuzz z)GT__Dn)1OqOWfjef>yLndP%(Po7()u;Sb1dRLXz#J(L)n(CxQB5!fRIo8oE%e8uJ z=aMztH|A{B-;WzrcxGJF7$E4mECS@XRZDj4Jo07$b=_Zf07fhh< zX|VvjPX(q8tr{ZWO%ZBSAjO+jE}td@7DkA)frusV+AP*$3p5(L&AbT?ft9Vk6~B;i zDJcL#+(tF}W*C9as`hK^5rT$6fpBpK zQy!*0QJ$bJYGZ45(YjyRkd{+tGevQ0-NOKbDN)U*tL$-NDEgJ@63FZdH1W;4;!u(- z1UJ9gC!#HfH7Mk7lh5eQ&8ak0kTviW*bU(yao~1E8XYkf{lx)@Gr<)R4pfyJ?aqe! zh?;YHbdP23#Ux#nu4H;RXY^JfD7e6m`qqt3aHs`b8pU1c3M<{d7Rv%FIz<_rH}y}6YYddplinKEwc1J(({=^w zTLa)s3yO-Xs9s@Xfu)LiM&cb927*7_34@zOe4)gDWt&Be)c66Q;aI&`1-9``9lJf* z9Trg}yv>KCyLOV|t?lY6K@dDE(-dv(O|qD$iKnj0CgaBqm?y}ia!IrOKM z5i20SM0ZocWpa`nOm>H9KM@q>TD%Qt(wkihEe0&_VRiCw&MrGU8$oYx;(5ym8kZ7g(F4 zTy_PTQkZS7+1A>-`^i~0`4UWvsmp?}@AP4 z10uSR2dAPg;sFUgg$Kg@w|JbWj6GxW3jTK<#C%=C1Cn|=54_En^5E8-XY+W_qq2QG zN-kYYdCos7JE$kOHeIdfmPchT)bk_@f*30w{HW|Yedk`w>-BsnIIX87x}G4^8}xh_ zvqA7>w$psq?7Dp$!^ANx3#rv+gj`T?YI|tcs~x(byx6I5(W)|is;W_t zbEqmNQklqzJ*zv@ozEO6LAKR!5*LDSGBccv^B5PLyD!eueB}&_dWLq*I&mhy{tsGNReyR;SF@E<7rojP_q6V4~MM`20CAimKLi>FqJ4iO2cE#nE!2Snwo!5?ErMZrn&1bkNF3Ff@(#nmVR);|{1 z<4u-NWf9 zrVrz9ax4TNtQLbk_{~nDa6R<+ZUGRhBk#JJtV;c|Sa7h%LQ(@*=S^xvoZffRiJkWX&AhS&BTX+~fjD#Z z&@5x)Jfv! zl0-EeSf1r=loi0}3V4Z8tVEvl0r)}>T3)nuLN4f}G0WAqnFW;01E<`9@*R<_Hrf`dLjkwKed1}#ksly=Q2gCn+! zKh3J3J4Nv%R6MKd?1Dps1vbqJ^?c6eYCpmdW+Um05wZdx;THED5#XU{QVJtS8AHDm zt;|O3m^1nI+APcWXDe}I^8h!*p}-9uCgDy7DbUtV1{*rZDd;32;L&Xs?BpC>_T;=k z3(OApJNur(tASKU_-PrWsT6OiktKqyW+p5TisQ}8Rt}poDLdBazEkt!e#2?Zm{Hj| zbpW8v2B7z+S$g>h+BbLslpz4MPDbcE6By#p!{Q_=;_2I=FeXAx$C)totave8!I6uc zlE;z}eNae}6NsIfwc^Se-FF`*=7MxIh!#(kGN>LmD~B~Tq)bynzO?S4v25%(k)Y>l z4sJfJ{;Y68rX0AS`5#jqlpnZEBtdj<)?n#f@}$L+2dogWJ;VxCGre%MX4Gto{}w4d zVoW7&RV)$)ZDqP2R{Q=9GG+`t)l{1o#)(NfRYOg`7 zH?!QL_jXP1Ew5JFN>q#LQLF6OQp|L#TW_&G$GYWM0|YdE>s@+LW(sZMvla*SW04tj z;HDPDULl{V8}G^=i6uqSg}d^T^Q0U*+#kQ}*YT4dxLe=*6H8c!av+UgR;JjA#D)5x zX`>!)q0>rw}!y3y@+fjl-i+cfRfm6tQgdN4N-q>I*fj~uenqo3%@*m zD%WS5V14Ez4l)9DtR7(I0~EB(1O=?M>6s1K!hKRSAs6_e2^3?C;*Ky$G?7xgIFgd_ z0F14Vt)hATe<47fN0{WDRUYPsk6RaKkn-J8bJ&dOCeZJ=vt6P1zhkgma_$9Q>2 z+VGe~9py2H(BZKep~FM@f_ZGgjm%?V-mX5`>br2;IiJUmIIi_L4)GMuRHDCrAt7XV zOJWEajv(}m@Ftf&E9) zae#YsFaw^O(rRr((P~Yc0*gB~dxnMbYo^6(R6d9(gyn<`;JOYQ7xJ1-Vhd|;YEsq~ z(RgBR+Bsn*Z7YgGm+*2wY7Z~@#*Vq&@c<<%7Q_(; zL2g2WQd9*)=_6$uXhH%<%xmn|UzNlE{1hix#OC}&Hce~n*Ra^pFsD{6_uXUcgAMwZ zu`r3aRs$Cs?dUAvysO*n{sirU@mB5Pm9_dK793=0Eelbsp+K$mY6t>32|-W@g&;Uw zgdivvLJ;f}krWEth~f2`iL5=Ub8j6mL)+O-%C;h5GwlR(m6{%y;d+P*@(>rKND0H? zn{pcPIF8jPiVqjODdJ5nv>f-9FZRY|kHX88X@?BVW0vb?E-xo`WY2Cd9k}ivZp*v# zV2A#c*;4ZBhzvH*OLUF1r_y|}dQOXB!XbZyO^eB!(Ph)UWyM1r-{?zcMlWcrG_PR@_E#0b%3L45S~aiDG60} zuBbnciofDAT2=e(p|VVk=on|n5c@zVx6C0OoUh}q1u*2+npQHvS3?@=yXBt%z7eAz zpjB&&ueYnUC<+ECjc&h%hN*Bvy_j4|mok(wPFF60)c|zUzJ9h;K6$>iR3fNbn{Ecl zJHD+$uMwGB#etj?9|KLE0G5Ew3NvEe#^v}gvzv=0@~i~+%q9*PB+ENG6oa0cFc{CJc@Dk(1823$JfGZR?pd#p3E60wr*8knaH1#l>JEKl<+g=j1L7dgVs4X5XcQ7)empK`@{S9X!O92 zQVg5vD#+mDJT*}mFVl998V~LofN4lSW$TV~y9yz6+tU3^NR;Bo5*DZi;!`ZF95~)J z8nVxfQtD9J{l_DlCHZ2uXz=MLA}dL)%oK6qgq(<`lB3Lvzka%PuZjk% zXe;dU$JUhYT?^-N95M!$4E~#p8FKcF1??h3k7mVd@aHa_HS&Q~ufXUseeA$R%nV!Z z$mh6D`dCV5OIM`7NhltypDD8^pPsJ*zmmQqE3@BJ*rVx>@?J;OGBDIEq;VxAebQ-NbK*~3_5{>ASM_&)6ktb`S#!K>{}1H&M_ zPi_*C6mAl65}27gk)`ZL6f`F?O6!MLF}E8&()47*rBrOfeS}~Iu=tr9C0W=g!6BGM z46%Kvs1>HHds?x|Hy39CKcCex4QK5?u{!XJIDxoF^4_s@Y^7z|(7GcrH29nmL*eW$ z_(6|@CW0H$XcL_!Tg;u=RZ@k_E(d3~A+h4tCSRIcn>VMs4PQNvXtt<7#S@Ha8Zp9I*fV@9h#$|mW<-li1!2B5W{5o*6SN?Y)f$GDzQ8?z^`mG%}eV;8~_0u z6u0^)I2;`v>rx+B1Kaiz@L}Ep7_8pojO85x z;YY!9f5=_()W}_1N057Tjz*%1RDUoV4UT9~y-frplCX%Fb}X%6Xa}){$OJ1+W!I>M zcPWVPu%B3cGJz3h)ia9kj}2Iarj2+G9J~4oW!MBflf3>Xv0A8oQL!Z`{=V(2!TpRE zu4EqFmrVS8tmAn1(ZnqR8VPH_kE`t#vsB(uln?@Vq#k7^@Pw8C-8gR2%@<4LLDR%w zQLZL1S*<9qWo)@k!zj#lia?)*glNY+=Bl|EOz!dNg4p<*R3V&uIcR)pve3U>*{Oe8m6h*;2o!tjFp8^xy`5X zpB)XpPVGpcCH%|H<@Ocz3Av4>37s8Htfs}y@@asK*Ncyv{-olURXQ>SNrz2%fHM(Z zwu*n^i@%Nj3pJx@doz=DGiO&y^k({h02~E-b-`|BET{jCs_x^v-*aS#v-L9+LbvTbTWEY4i%?7ln$R(QtDvRQsq@ zBhrXzDCfuM8_?J074$Am}^09;u>L=-cJj`Bf>>m#BBkt&$vbd(5L=8L&5Bb9G zuN^19V3eaVsO@|Au01#9C=$=s?KtJApjMxiaO4l-6W#857`S6&oESi&!c!`GxfILx zDf+%GA^#ZR_Otg7U*lXoDB=C9%=G?m%R$SI7|+J7#rkdv)HsMM9h&0Lv$ghjs|ZAY`Wk_sCVljxLg^8FdFPXFeTGG3+hounyZbG`lF!iP=TAwq6pRU zRs@YyN%!+v+Fof0l>@&I&JDO|a5C#59>POAbvzU*#zVnDJm%P&AgYwkSkQX#aY#ryM__y@Qrv%QYqUv-;bIjhd11HMgeY7^w&!Epw~z9Q1kQz zk;O0L&x|F%;3c*9uQ#VBwh3be5Ni}IDC(8w>PmNbC2T`rM)nv)0?NH0q*<|Yj6tuG zWeEySF4@NXee}Od%$WZb@1r?SB5Ii9u6tbyVmQY|fTAQ>kc^Ui%K$x+K3==4)scVk zjgmA6oq5HJJ=KA9mvKI3M>Q}KYSz0m@kny$iWu?|OI^xfb@$Oc{$)yR*gu`>@5;~K zq|fQOdR)Gzy5}grpeJ{`x2_WD(qMEL6hc=XI7{8UaEA_PHi)!X>FE{q+kln!JFC|2 z8PYZlM-7LZ2-HCLEC5r7C68}P#HLBo*ue6aHjP?SDfdj@a; z`j_0+=kdT!*&KqMvIfPuv>mV*2rgx4LWj7Lr+u*G~ zOEHsK!#gomq73KQ<2ycWEjVd>hqr?*E#&UNSUEBh?m0rA8*G>PIuKJWqOSuMj6r2( zM?8L<;(R9vL~xM?WuhQ4T%&n@U}I5-PQVR_$e`^G8BQ5iIaCj=(SXJHmMJn{FBQ%n6j&6s<;Rj|b!F0RtbN5wp0@B&b!J*HP&exnEjl zkDr20p+bu3D_jx$Kc5shx*>q@zN6-LZ0=|pY=VC{U(>BMQ>GebnE~Z~b~t3%i|*kG zn@X@OO%)GNsqXq&o%p7pb%F;uz%zDI>+i^Y{f1l(`+h809jF&d8(#Ec6k#kM4ZmO} zgzdEd~lsug!i-5D0>-E`*qpoVvVX}z`?l%#^!YspNI=?6d!u)C;8Nh%i zP8|dtM$O^Qh3v%95P=^j18r)8_4RuroMM%(q2O(q<=TXU%WYw+l$e!Q(;_A@aD0JH~iCg`5*S zev5qQlziI!W_`PO9-kE9Mx4Co@$`B0S_zM1N{x8VS@c9*EmxnEAWF7wnL*GBFQGB) zldUuc3bYVqey31#w@Hjj+@fW7e<#a*G{QG4?X31inz|9cUpp4CdBS|)7>T63S;>HK zHgb*+HMi6VY;#pwu&KZC-Y(*}Oiv%LJ_^>d82O5fW1n*z~T%n2hhS$!=Yqc4} z5iS9hNBS_gSFE025^O{<<{IQGi&@{rj?7&LFi1LSJJ}>n+m@Uxe>9GMzOeH0P@f9F z374r)KO%h~r!UMDhXpG(fRXBg=cL+lj@1IvTNxuU7>NT}Qo3!9p%pO;4E?|uIE92E z5Yu?Vgo78x&mB#AqYUD}+@XM94GtQpiX|cxvEd`qmbE%x<^{1~)d>|RK@BPoIUA3> z^m@8;uNbjs4sGcWP%X9xnOR|k-qDykiu*3qd*7g*``yMX)(h+FOzPCmH|o?*KPrJ5 z=$Bf+s7{kQ$5|xC2xt;`B+j@nB^xaOq4K-HD?RDCty#QdFaqbAq>>Yw(2xKW_$TgE zjlqSNaLu+Q?BF%uE@rABvy-*?&M{?oQZF}-3>EC)_d|nTo%i~{1LLi|h~5HiYP?WR z4P?3AxK*zDRU4>)6&!E^Fk>I=F?NJ1vNv|Lvc1?PXj`f8&hky zQHW-U4uB=oMTOWXcp?L$S!LaHLR6N~*g6}(8Uz2Uo}InQOAWHd4EKGGS0|FgNr0HI6s4m2u$(wC`|RPc3pK{sCqS`&W62i0LP(f zSkMd~Hoyn=pP6>Hm^s797E9SkNLTH$)BYdB*@#iWB(mSkGxf)|guHagDK#u7xfWM9*;C!wM%$=)JHMbeor_Cs<^5u; z#C8j}Sn(np5SYZKrpP&-VoJ)hX{i_x<7nQK`qt``cWPU*qkn>-@_LpQy0g4pOUeAE z0JDuYbGS_Px=(|x+@7*A!Yr)B3|P!x68fxT4oXJ^Dzv!wN3^p-6{}TUIO~xy&Rn91 z+fa~8HBrG;e+E&JlWCz(zE>;;`=681&{b6FPGqS2G53tF=7LIhqK|e&m@ok7DpuWO zvm7HSE!Bi`oRkm}n}mq+hbmCR6hq}@L)Y3os61trl^dSQL5&Px+Ei{nh=GEC0HUH01>!DDe($`6Db4i4J#uYiZegd zzICU4DR!N~!~;4z6T${UGn!7}98B zAE=~-jY!ilIczc9K%DH_TCSB@x~>#i^w)1oHk)x`a2nEX=(`N-|GboJp~^*^Rb^wg zAwH-gZC`NXF!K)A*zfPpJtF<({u!;(C(9Pm2jj;xrDX52^-<;|8kJymw48 z`V&lfx+SgVW5)sOMj(t3B;+L!cR!5$2#yJ;m^5*w9`(Hu(^O(~6ZHlda8juE04RN3 zUG1bswMa9t(M#q@pF{12zRlN*=~4Q&vgM3RG%Gy`56smtxGkX*+#`eu2&!8e9mFX- z*h;M}K9p7uj<2JPFszLQA7TZ;57I$A#7h$1=-}=sS8GJB-Hu$G!|4;{Ggz{X#x0Fk zLZISMtfS?jFZ)Dhh@mo2aVTI}yv%ME<142jbQ}#{tYiiYsP9Kw5EXS>MBYlNA-Ei3 zxAUxs>&4yV2u&;#CWL2Kvx)dm)cIgZgNN^&B7qw43OLC(DE>6#6|$>OBc-N_wC6i; zVu7IFQBV#eKwIP=IXF8ySA|ePE@46YnFiz)iX{3L=D4V!wVMS3<$^Y5zR0M6+1g1@ zBK_a8Yz|>nFGs}y8|b99i$i#Hvn^48`z##C=F7Dd;nTM`g@;(wdUMhWQX?Z8)<31j ziv84wx-s`3ktUp}$d$jVMXofR?aP=HZ*Mt|>Q=L5ypF&r)s$rm;n8c^H1?nXO1Arb7^!XSO1- zpZFvCv`&g;p4o~FqRMQQd1kB3Gh1clrc<-C_>lxx7w{m#)rCAraCH$65?non2MMlz zi^t|uv#0SO&(*~|$a8fG5As|+J?>TfIDtzh-4CtJC-%24Pxqnd9Kd;I;rU9lCVa!C zu1Aja1(QG;m@Z%JAWp?W9RgJG)?U769xPJvvULFlR?7AyJQ!SsPO2OCcSQzO`V2X7 z)fNcV;&_If@cfRo*)oFRC7*?lwDVXf46cxHBgGfKZQEkhV+?Qvl}EyXwK^(<4pp7P z7T098?d(m<^9(mz%oiCWj$?PbL*wKkt4`ltJyVBxaR4o|ufj+uU5*|8NIA7MdHKGj z?U(hZmac#A-+uN6{%*WThnc(uMokM=|6C+USM}NLu=+M|L_J#4!y!>nnU~@ddfgu# zz`0CoYUvfRmnTsrjE81-(`<7*B&9QYvu3moHjZ*{_1(mh9?g$Aw^NtE%)4asv`Tm* z1w?ebW^L*?}Z6-7~*qCvLkpDCUJ6X-^~Ypd7RQ; zdu?DnW&@2a1b_|J4K5SPS~*n^%mBrOt$k-D{@;Q4K`Y8yvJqB}Um|wcqTv=!86a1$ z&y)7#=^8!PJ78RC6U|I2iW$WN=_7@ zs&C(-{aAK3Eu~G0!r#s=*AN$%P$HKUaHk=w?cck(pI5)MTznZZfC{;E!2UauJh%GL z0W{v-hnKcrwNGrE91Y!5^QU1SO`V!wj5JatDyR7Ji+RiAX&4fknqgb3`c6VZ2%E!X z{J=ZB5lA*AI9y6XSJz&F9(M;M;sBtf1#hsNpB9X3023vDrc3wsto+85A@eO zI)6G)+Xvj%gysCvfBT*KbCUcI(eRpgQ)wybD$(Rq_)a3u%RV6J^8K<8yt4b~{Mld! zU?G2r0b_Nr;Fqs{lq`pSwk+28Q`{Z_6G0J*mA`!`TUt>}z^JEh?OpcK>mGdg-1l5` z){lSbG5^o4Ki=_0Z_nl)W^1Fmaeo}&GvkNkak}l>T6yIS`tMK9Jj*{k_0Phn0=J9B z{`7-i`}*zszVWMPZGF-0|Hnm>dq3dCCY{NJmDKRJw_p67haWxVl(Rl|_5+@M@x$JC za~xG&k~KI*;6EjQ_92wudI9#AYd#2T(>Xf+>s)!^CJ@On_Q0J-lPepapSTI0e2mGV z#~GHqGBB|l_AiNJ^7rmD14@d_z^|t`l3X}I$;I7P^`+ncmm}Z1?XN!cw*5=r_{qQh z;P#*X<3EL}nzyQ+<5d?UehFOLz2BdH?zV5gCdGGij%X!1mX>ZwK)M=CM*&Q~2%tG~;Ec=4 z`U~|gyGUre)Vhj{q-R`xkj=B{2;ZYKSHg3y2=E>MO$rwE*CWY3Q)cSM4jfp#3^&De zT!RDSPeek@@IJj#MMV@B)}@ays*8rcJ;82J8H^;3BCl8VuA|98YbbWXlG9_+fC5qo z4yWI?UoFP=(w`*fBACRi3~~mxqi4n@k0b~CGf3Vmev<4q4oIPy>WVv&2D^*b;}RA} z1TL!;DT2KsFX9jlY3gH>>`iRr7AT} zA2_i8%7Y&^{;{bmmSh4&XXDn0x1hj|?JSY0yY?b`kt*`{?==b0vHPL*x>M!5_V90Z zj$T+|R?2eZPok2z2c7j2Cm-+LK9fz3hI(unY}{g`B=hJ)Qq56pWSCiwwF05dw^@(z zm_zmx@v(WHfHUd-$J{fG7cip}6x#U%&sZ`}mU`sNHcrvng+P^DiR{B|>Z4hkmn8=1 zFbo}q-P1<{F|S{JWKNriw7Zty<;gVraWb41=YTAn*|leU)f%bUd=<*Sp7)?yH1z9$S;6jo&! zL!-jJq1(mgANi?)$!?uiphxyR&E_(dl?8r0yg!ltM>W@>NYR}tNozW9$^&0Rgjb%^ zFw-YE#-jNIkbaE!;^c~U*b>EZ;d0Gm&=#MF;@Yc62<+O6UX{m)Im+r-B)=#IPA|rv ziMy$~P4RC;wyE9$_N3Bkt^Izheoy&5ttOwzK=)994`=RCuwKdbD7v_vvs9>AZlPw{ zbJhGzi=$@yF;-GqyZvNK-FiF+tV{(=`v62U8?VL*RAaxVx|4{uThm>rb_t8#&mL=Z zMJbb#o+T%-Syh4fLr%}X+dAGjlDhd(U&Wy67gc0>Y zDPzJa0)=JlG3m5Fmj-sb%-Up6mu*9du05OZ%UGc1&vCjQw~T_i8M3mqkP2v)2mY8j z9=%fsLET&A9$^%pYmc7!Yl!z_1a&Jeiy}&!$YZl7Z7Ff6@$ERIyxnLPP0|Szj=V}9 zXV$Z}7b-SnO#$S-y|T=A^~Zv+4yj$Zt%Q}9ub16071u^Jj!at)FN$*WE)&Yz>?9xq zQ+^dS&SJ2gJ}F@&|6yL?66}K+lXzUqJ*7%@29>c}>0~`AxO+ zYzsOb#Bowx^OcmW^Hmk(v3rm`(35&-5j$uV1f%`EeUgGqmX56opxzPMatuXkQ?ONB z$H82mYaQUQzODg+^gv;A;>Q#mv)Iow~`i4jK>2tBilj}|F^?|F~uxjj6aS-k!-*jOz6_RS>;j`*+mO&u;`)nG#+ICI%#-A4)*+_IGB ziwp^x0H0+WBnArmp-f1tM=6fax;mS7fAWjr9^r6}rF=Sm?hzDQhwC_S#k5EQc?kXX~y-(^l9qO^TPH5M4 zZc#MPb-Amo~VtZdCp3n&B+FT=t{V#rc1ipQ0?ET#}# z4#67-7%MJezJrKtVv8a)Ef}XXdrRk8zq&gbp$5LAn~pTwvc(JeQo;hEveG8{v?WM(_y zl+lh?fVCy@l9XjhQ$^+L6psZ5;4eWwIHRXq*A_{WSUjJd$*3s~oq(aTvP<|dgW%va ziM2DMtWjrq&B>=Xa*J($*2c~r$AC{uaRTt|(JSQ|EUFPRI><+&QM_r_g zMjVVOWUk3aajt=&`w*%XyvFGUa~M42?0|*OaV2iHeM9T8PpgT zYdL>cH-T7&)NWSd9Tk0MznK8)G=xPJQ!k?$|;QQjEj_L@j$~A$<#9MYO ztssVQrNwzpkoEj&fy+yVbej8~EhH|m%c(`g6bzEI<@>9=%JdP}udtbzsjB@y(N>=> zUoa_CfAn#2Exp+CKXq1k8D~Ma`_H;9WCTMRR}jepf@sM1HqNrhM*z1whGG;!Kwlgz z-3b^X^USo)Bo(0hI&Egp7JplE0{2vg*NpeDkU)L=zJ%wv07d23&ms^Z(M-dEHCN2q zog}Jebqku&6_rfdTE~BT0#>0|Z(e&QI>pQR;!LzY?k-%EVumsm*s$6(47?B0Sxy-+ zFs@k44f4`#ltDIhizZ1PmkNqdsuj@c&39^*iG#U;42#B*D#BGZ$r!)m&1Q^OcifQU z^O9FAtM2?JNNL$LO$Q~!O3XwWDN<@k6|Fw{WoWW^X;Ue8f#{0oF*S71(kyM(kRBpX zJk9-^@=^7&frFY7ILJfniN}4rlMUv}gjnOj5omV^DLtETMOeMJx)P^Aru_#VyDTm+ z%uh(UE%^#mbiU)KLQaK6QA(&_^r zNR>1mN{$E_%SlrTXWTuP4QJe|t)*DXg_N&-Qab6L4Gzq^1NFXh8M(4h9pWlQ)P3$` zI1H@P`@==`jV9!bdbXU*Ra*L46>7m6j$f zp;e4F40^LN*HSSCEe<5URm=x#I$E(*#VvJ@(dDR$M3~359j&)T^%m-S(GOXVG^mrK z6&F--Yh5w;6l{v>FsPKH^}shjK4I_-=ffMI8Dxgey>YPCK(pQUg5l_R$^9nJmb@Ti zTDcu+^o*eOk5_(>k>IH?`*4`i24j|i+Vr~*tTAru7TTZ$`JD#}7y50o3ahX55oz|A zG*gMix&zNQMhC_FI!rd4cpPqD<2uU+yQtdd(7vIW!eQA;#L+Dup$=^b-OMc5*_RW2 zB3v!O2~?;2N{Xk!Pa+;N-7 zbZR#6;PYtPmhY1r=dHX$X2UsO4T99~QFhugpJp6$yz=yGtUc-8_(|>^46{IhOf#7m zMVl+5HdsnxIRqx=v|}Fm0k7bc5~7@~)cO0(+~9GvD$Nj_jMoJ5&0Ok4No%t!w-DaQ z1{cC!(S<1&h%KT-5P!}hV$xNM%ZIO;&z2JR66f$7nG=Wmt*g+2h6~8FlXjoPf@zn1Q~!GX z_5~}Q-mDgy+#KXA-Lfxy({Nx?)g8$t{Z`Df5e>tM;to!FN6C)5>5L8kL5C*9_1RC{ zDLi%qk3C-km?d{4!6RW}|3%+;<5tZ9+QTAjE7Sx$Z9`p{*cxJw(?~&ug`Uykgs}R( zro2kqdNhEp+XtO{K0jnY9WBJKvkGO}eu;vr$1)IB=*f22SjAauecZwE#E+!ai!;u| z)~^PeSfSoF(KD8c$i1QD6&b4t8CQ1yEVE| zdtXxSu-2}F@DO_OxG!1LrMqtBHFNHVTZVkpDx0Vij*i0J4{bNpjKrJg;XG$WUC^meamZx8`L&F{@vdHMj z=5vtMuJ)4A@bjc>Go&$-MV@u``n9_+{vA2CC0^;iF}qjuV&J{5t$gT5R>pA{`?4#1 zfg=)#SC`p&Xa_6Km_n15FG-xw)ytTVS1?W+tSNEtB{{!S{ZKtRsP^QYtE>wzFJ_iH7_Tkqc_yvIhs`z0 zAg5OG!kP~2tr&!?@nrHpC|!pz`WLhuSG7j{1daWxfgBaqt|Cs4sV5AwiD60E?iH9T z%~FR-9BewoilAs!95Ul$t9p!(C&&THuBYtEC=g&Ih_tFR#D!YYm)%jS)P(H9BTn`W zysU~;!7Lo4tDyR0Qs}tqdn>=XvXwvx)=uqc9jph+v-2!;^uUlesxh1@EdkM;pFd>SMvZ5AqlLnqeS8c^&vc?w3m!vQ$<K z{tV_5`LU1B)ToO&llgxIpG;@KNX_H_4VaVTMTkm@yY{3sR!13rTp>BCp@y0SzYW+F zT{}cJeOB8&0lhFK2isfi>OY9q);5xeA_%|+ATEo+&dk`iY1-A@sv+N$9HRjm;hn+; zAol8a73Yq!$y&o&!5m{ezc^89+y0irtQMsnR`lUjoR_QEDblGRP)WLDdW)kIMZgt= zdkX(eE@*mExc=xMz%fEUw7sv#2PUYdAWh#l~p4zOcy_(zg1n zL;Gqv69dq7O-KJ#v17Wg2^-V#$oJKc)B6h%qd~}rTzh|G&d5Wnh`I&pa<;Lm$^^{+`Au|#0W6EUrjTD0Cnbf`)*FzC#T5eaB^bD z3!ir7hx@J9Jvv{IL@v`0Dkx6BwfU`-K~}bIdUQ@c5X60cN?zWie;3O3O@|)M86VE% zo}!nh^U8U`oy*p9Eyhp2e2xj>V$SOKoRKT9)_F`FgCcaB z;KNR~2!3Ss5B&-KzPozPfy;H2xZ~fhIB+@se=vf>*zo|CogeFlzWm%)^P8XB%EJ5d zpx<0G!NcSN zoNNq|aoEo^gQRY}@MdTlSCvYX*~;ctX)27ydRAw&8V3@-b|dh0479DQS{XjaX8AjH zAs+hQLsc8Q^zc62BRQkPW>ry+?Zzvk(}i)p_I=I=-98IB)J8(1Vs1O{6c)T-6s8@6l;Kcp`|=Z(ZIm04<-^@q<>0cj@K( z`ZG)ARh+j3CVc6ZYc4v>H2okUC8jR#p8%n(*vIm4U-B|n zZGxYi*p+7o%)eZjeyovJImaMvGq0SYV(UqV_fevE`9Aw`O?d*Z*OasT99{y&%i$Bu zi{dPzk2JH9Qil)pOdl6nLnJRK*FK3;e&u=^nl1}9q^W7_OfB>NNOe%oQedXsU_I&Q zenjab$(0w%eLf}&(GI$Im(ILe`YVCOba*CSQ+3Rj)V^>sUm?fB+>{Rog%V>TP+6_3 zAvvP(a!Qyh6m<&UO*jH%M@>aYR42xBOotrXc%GR)E(QO_(MXl(=)fa861?z_C+FLR zMyL5PM?RJMS{yvc!1w^0)EP)th-ZS^mxmG*N2-hDf992B0^kt&LFf~rEV~ynspP5r zW1P#lm$LwIuykKPz3{LuQ)SK!t5FET6%;dfKT}x6ucUmLu~zI!NTR#Lc~V(|+AvOq zr0-GQIE!!IKhq^d8Wn;JrrbM(K-|yae`JPs>k*QdVyowiLNP^PTS=NMo^9PqGav`V z*S@Qta2iyJOges5sP}wA9rSxYl|qj6k;uAMy@iMdgMMwHWhPATHB1z(ko;WLq5n*Z zzi37IdjDcY4|dbJl^dI@hRNK!g|+@Ty@`W}?ZxH(`YlMsDmkwLc$;>@n4;N3@|Wt` zyU`r*y@EXYEcj3$gx*!CoxzqN0p#zZhdz${e@m-PX&htyUmklapa8=s3}bRUPpWo8u3h8EaRc zr7^sA+-`XfJ+ld@GB(3X@pd>yL8x5(Ku1Xq9PziSs*+ zNGfIEf2uNAY)dM^+rCbmmf#;q$PtG5G3(7oWm;`gt~U@9__w4BLbu{f=W&KK2HDY; zCz;zW^i5YW^EgdelV#XgM&&t3gl}6svGNYjn%weK%Cp$Gyer`eJd{k1M0fs6ASaAW3)04H;enw+E@q{TQ4$&MAXk1G z9H0w405j>DwU2cMk2P{Ha30K4W{p|r1^GpQbf&|V2HduQp?jcIT~Cangc5-_ciG7T zhFZEKTDu;{xNzXY6{it7Q~lZH{?s$7;#vLfG7@aMoP9>sdsd$}%Lu;iGpg}t^*J-4 z<9gcOARQ6^t|1$w)#)tvCsiIWk)J{-DoJwnjH>gj{?sz-FhL!uqKMUU1`E;ZOptWU z>X1VOVRQoju3PSp+dB#s_HF|*j{2%?^%%v3l~_v^vWJ!%tO`FB5`Nv*xF$mNP$%zhl#yw3Zobd%4dqfPmCu%b>wJ2F01Ma-B8F+Zii=g22EG zH9xS+A{Wa!N@8=9s!UU$F>=dzW11%~5zp2PzppEq14EuxQW!EqSwkGXWlXaqoZM*j z#|@+mW@4GF-m|4x)`W*m0g+x!xV2MddS93!F(uI~l59yPPt1z0=VKa6#7Iq~b}@kyPhdOSdI> ztw?ni#<)NatP8bbtVmYe$ro>!YSCu_3xnrdDni;ws`qfxKe%)|+WWJtV%YTIOW3lf z-55(^Gp^%E>UKj7O>`Jg@q7wuz@9-INvP*;FIx8$+0qsE#MIcePu5kKp9|BX`_!VA zx|7I=;>NT}&+8r<%Q~Z;)UCDlp(`|!d8`VtcQ~LV0OHE_0`ypU$`d{6WY{|vg`@)n zeOz0KF%7-~L@{lv>mg^fx#IeCz71P$gKDr9{=(jipNx?WckKL4P&uvZE^fZ^XYw5O z@)QAK7#tLW3?~OhQ3v_Wq_-t=+5=Y7Vu?Oz+;HFvw_BdAGaKt#c z;tS9OtfGD1-jQ=<41c^jnLK!h=X-{wo_aqaCBttF-2Uui63`#;l;lk2WeA(g3JpT2 zR13DFT{7ELJLu#QK=w0O@-rmnnw4)fOh8MjTa}-`~*Kb)wj5qF}QY}=-Dt0bXWXNB)Y&3qQkM}{xd>GY2Gv+&O+ct;-o{+ zaX6J{SFjW~Gc7=euGxHdcH6P-^!v4qpgn0;lHCLXaiq8Dj(FP{Ma)PeXzTcM$piIb zA(G10W$9!|_ok_Ie5D@T2=D_1llerL_%rCku(ZA;ta*-60e;6vAA@ZvHrjO<8WUt3 zN|}(Fh}6;pT;AF5D5h_<{XF40Cq++DG(+=RWik7}?je=V^h}nuCMG)LV`E&g%zs!O zP*C+Y44}?*n^zM`Bh#wZ?IJFaE=7QjRPmNA>??@$MYUAuiq=>|lGui&OpAkUNSGuo zO8aQI7BCES4HzbSEie8K9_1Xo*@{uZRv~6zd^pM^lScsNv`RN&Nd2?XA$Y3d8IDKL zLquUFf#J$910K_XBN~;8IHicx5JDJE5GY=n=3FXx9>yRPnnSIdBs^E`Q=<`D=ratl zglX0j46lI>_JfN`z#^fP+2}*IO7;ZbTiZM%2zyVuT z4!9$ZlPGGlPbIjcl7=63O- zT~s((YjkyiKZIhsM}86j~alA!p=9l=BsF&#qg- z2?je-pl$CYF2BOs_yUaO7?NiqlbU5*+C3i@Ly>tbVV#-Rlpk}W)O*?SKCY{OBik@) z5PYw3AJ;KsE8wFFCxoZf;eQ-8985fZi)*=fJdKOEc>H%R)8cU)NL;H{pxpr!hi=ra zCQBIEqq0SRoZ&{rVmA7Rgd(f|$@yK9K+%lz`D$f+k;7K}IYXXEkQJS6j4^rM{KW2d z5dKGewpH)!B%X0U1U5khg~YQ_2URpYrc)`S0F!t0r-V@x7G-EvrlcrMl@q)A6N)0S zNOMnIVY(b_mf(Fv!|x%<19?15fgDkzXWTSRj6q7Lw^$A_(sZxkBe}V!?5;+eIesP&sIWRypb!ZrMPY$idpBFet&S0Pi`NqnHbv zNC?t1`U_H8epVH9!&9QRhDoZ!3!0II7;2#WJpZ)ap1&5f@ISo%Y5imf6LZ#K7HYa z`oC=Qgp7@mRsJi6f17{MNe>*We`>AG`y1DE*Uvs+e5RAZ+vuWGtyALQ~PnZi7^A$F{IN;wOG=`h?~$qrMA2W7OM@%IWZ<97*dYcX)8 z>SKUg7|YoEnc&pM|3fni0)M~Ebi8HR98cr{*?m zCwq@$o6P~TCK(rJXT()maIj3-$*45Rj>R3QNln~E8z4tyHgfs`mW2*1twDzv0(AYJ zF;7g^B{5mBLmnDfR)reZi!4F-Ov8KocI<(V7*tGUgK}ML>gz6~r~-lt(Po*TR<0~% z!Cgm*WU& z&IGuW8%1(s<&h!CrrM9hsZN+CkKO3MzEi3ih(lVl54az zV&gHp8rZm@G(JFVyy}M7!CgN=g~e}~is zTZ6TBl40xAd{{q_hFq)_o1L-)29B=r={(C5RsteWJf`zvzguh)ql6vc7F14$28?je z*eaY0U_Ki`jYYT##|u%aCxm%bFQ2YJcf|{|kFfMZ9r?v%&hhDkUcQjU%gOpagA?Km zBuoTrImWeiX3w)7dK$nmhei*LncoGPQkdPKJin$aFA3Y^+-xgeQq~s-o(>%##5nmj z;u`XM%GlE5lACZ#S%B?&na^Ezzoga%^V#qA;x-x7!G9d1r*O5G^<>}$b@cLsQma3k zfD=r6JGUIul&=4H3O_&c^yC5_Qo18@0Mgys>6F{2hwe+yopQ}NVlpf2Ob(%5O5{+_ z%JCw#VS>We1hSsFP|{4W(eyHP0s{e z@q4}!wmqfZg-gD?0%YYEc};RfkW|KSi`Pj4d#vwQU*QGCbrP<{Qq?iXAQN#+N+91W`#X6TnuIR=zoU_Pp^ zlf@sIgN>=q8}KyMCsgyzVpH+LUr-;#3R7GgFdG`2QWm)>R%Tlxo*#%BMz9rUD%Z^j3F)5~*>R~Li9o2k(xESt;{i6F~nHXAr zZ`P0>$UfMcuHOGV@u8}Eus8l7XAo;c7eE)K&GntO5_OK_L?fY3U)w{7T+|S5FTv#y zA?4RsO;)c?4NlUHAL1=PP?NP{3>^ZMN2D5CCyH}C+PE3h~@EYbS}XKAq~#{vx56|ab!-l|cLv-O7!mdJQ5 zF4Kp3?Gqi8Q4MwGVDh5Rrcq=Mr-Z)kHb7T1PVxF11+XX`#i7|qQ(TSryVdI9?S-|N zgLP}H6$)$%4SxcqlWA!sw#6cGC7Aoey%>A8PpBRq--jk15t{facngxKiATgD5i&Hf zJv5=azPHEsYGP`={$;rZHHG_d%Gg9NBkEZ481}+5a1_Kn@$u+E5sQAwS`@V$Y|-g2 z#YX8gZrNFAjbd?Bx3A>vk*y0U6;#P4bici8NM-fWperc02Ns~4p}O3FQ4{Mgd&kw6 zP6wz}^~=?SAMn)+Zg3Q= zw<|oZ!53sf?yy{(Q1ZRcJzW>U1jR(7tB6&~V>XYm>XG$OUag@#GWNilL>9&gp1~SE zDwfBXxluJ9wX()kLk&TRH8>Ca$r+Rzq1&j&l ze-q{lYiEo4<4Y|S8U1F~bY(uYpg;Bqbfr5UAMIwY*d-KOb#XvxJ4|D(HQJQWoE}TY z+O19|ZJV*qiwL9WCmQTD{mK@qu!PZ{79gSRhi6r%`LN5tQ2;W3s`LV4spq**0TziS zBD$X3B~7I1Dxj@LTU+hwSHS!UqsT{ldnR5Zw;&DwrJP1?4&wBoL7W~dMFKS*9@&~0 z^gsqb#=E4uCsdDV4u0wZp|&es(lw=YvC}QedK#4VYIN2M0u;^&0}wMZE8+}q>p=r# zj_n!rA}{#WmGyqr>zO<;%$wRA#zDO~*21bsKKW~^j^KsNKty>Pf6ePZK>fy2XZjrR z`B2cA<(VssO+^{t!&5f{DSsrXhlx>L9AG1em_2V|bF-&gyr4EI>aK1XDLA#UF{M64 znN&C1Z6f6gH7$$<DAdNdzDkn$@GkA|i@{y4aKqW3ERSLk!rh0}`bAy48%Xynrx8U#NWG$m1#FXI2>d$_hftoPDH~o~2hdAm#5ABPk7l%aP ze;!&tanSk((YZ+YkSncnKQ>H~k9!-eHQ4%`4z`xB0HQbyYaCSIFSh_s$;9DrTlCgL z^Pe($lh4Ik)Nj>;&X*n1i|nKaJLwE)%j0dvNy477gu@4p76qowbJ`qKJ_At-Zlv8Uu2`ljFFd0+YhU6i9ng)vV6r;tVR%0SS zR-Y*?x4RUbnxp#yz3jBL(z32h^42PJIv zgEc_ACI2ciSRUIzjzVT$7Lq{`ZSkWEZ6~Y0#MsdvNcnQ}f&4}2WCNr=gup2ZVm-Fc zg|W#42Aj|+I2c@BeJ<2qA35~2B9*3QL1=KfctaY@9>&9ho4HsYb_RpZWovGFSta9W zWZ=w}vV9((!8?NzXOwiNDGH^}M<~5FKCLzs#&hcu*H19PxGY`f_6= zQTBbgSulbH$WxBh?I=7E%3|1Va*vhrovXNk7oru zzZ%C=!}F`5fwdY>gy+{nZ-Qr7vagMln`(@{*Eddd17@4>E%04oT<{PEc-$KMXQnj# zhm+jW8z-P5QYliXh3{nLQ@N`4!algMMdE7JequM3%3bXgB(_F-9Y69!3<`BXnr@QY)qR}Hpi@) z7QEad#-t?xH_J&%p}VZKb0M=k!hCBV&mCbBGtSB_s9khM&>Fjb?6R0sjhcTQAw?>^ zN!IAEL&fR;m$`S3x9cqHeaB_q)|zW2W2H&E(xmN}qk*oFwVKdf)7VzY$R@X@7v!KD z&*6`AJbupZPO8U*?8?VaA%O-cf>IR`6{RBD!fpf=wJKtYpd1k`ips_cr63o%Sfpa1 zg`V&4dER%-G1pqqfc;~C+N?3>m}9(`=Y8()^FEJ2Y*rf&Js2OF_JL?=LQSYpG0rEb^-X{Kjr~SR0NI&FPjgNhv3xp)KO(s&r5FEOV_%~(X z0O-xlXPQO>!H8K!R>jvF(ZJ*o6D{2Yr-Hv*@WUFelKWB6eefg(}X#{nfpJ*CUC@-=hDPlZ{nZYO+?ofQu_e$C|sUNc*#JzGGbkW zY})%|Y;Rq;5#3|PPT3UYdPNg{vS~BWPGWk1g^|(bEqqv8?>sVEXZ{!P5H7S1T`j|J z!suqNuhuo*mruntyR!IynDM7V(?(w?t$MRON49pQji8qL{pt83LM@7tPlvaSi5R?^ zem)Z)zn@@rxc8j#gU__PBhLmu3BT1{qZp&FqJ80#n79i{0QG;4t&UCPe-2F=Hy^MU zz>_L+;V*nPzA(k0-KPHR@D8Z)qdf-u~C^ZkYAB+(* z*7&S>uC*J%-i`Fr$PVM z5fEPvZB1#xy{)Jh(H5o`3AtoZD1~|ULqXYV)c1e)7I6}?3hxy&{P)n_plOd4cqDfG zegi2)mDE3GTK*#|9&c+)W6kC(p#_71xdOft-X!`u4m>Ie8hA75uf{i>0ihFpHN3g( zzzBJtLqm-C(KzCkPv+6^UU%GMB*Dl0aiCya4t4FZ@US1mbq1&Pk?~^gVC^q4&;^8< zJjPC?^!zn%3TG$CE#2?llzXoG<&guB-88k$@6oLzI zzZ1Q-Q=Ydodkz=Q>^_$ZCmo;1WnNCmPPuVs_Jc8`_0x93woZmG{$C}lr4}=0iL_&n zz4~qt0ngoSGVB5_5P~kdNEQSF7glIlEO9!Ci{ThC{}acvILs&qAz@37Jq;?_&IOdX zkbN%Y{9Q@lsHGQkMq(Aq7>Iu7|J&1R@w-X`DY#rA%Jsmbn9Z6l-oi-$oG&yPe(mVj_@d|542eyj1k|&WSOo8lQ7_^^3`YLd zY-Qe~Rg>UL%SLYN2o@Ld_$P>6kE{s@lEpsXr#G}x(4z&MXvy8|@{_Llp2D0!VX-qU zcC@-h{75F$1>>e$GqMfnWVV)xg_(gFV{qT@J4STid9%K407f9i4D=t#S4)Q13jZe% zIvEjU?(pFPeDqD}g}EsFpWx~cur2lE31Anu)`W>P!G2qZEHzIz-3+g?goAN!m-a}sD_aK-olcqD>{S1HKyq!Yn5?IFDf}!a?Oq&1S4L zoCfiZ=QRAbp54wbqj(^LTGe6u~l!d<0faB@f;4v0_b$@inMiaPf1>YeuMRu zWxL~lA~Q&|KJ!}73=O!Btm))gnsls~v*pOazcdk4*Ph#Vw2QXw*%y78OrVKsA~|9o^4zlK`YM6;oL4evQ8U9`DVvo&Vm^SPDI`}onBF?Q^5&- z{13@~qE25J+?pBtLJ>#NO$aJ6bG^A2l?)3nxWwxdMS+;j8vk4j_(?TNp%N(g5ycDy ziD>pkbXSpJ!CnF{2HK)2j;oyMEn!VBVZo6(Y0#FSMn>0@r=tV4iCg29ldqT$M{2n5 zrs&llHXIoxM!OTm*KvwDiEt8?Nw^WN@d>~^T`mvS(J&Go?Pf@!o?Z^*$Jt~FCYqvW zwPQ0xYVR1I+cK217Ly8xhY~$25SFn6@sxP&3T?hlMtQEo43?{h!#MyuQv?rx<%31f zr|=8NOC}RF(DwqtFcyGQlenIjscoU(2$`G3sJ3Ql5PY{NS^ub3v4^?Mp^4(IslB7M zggMf{+Oj7lh>m%^JFH&>B&X}OoDtZs(#Fg^u810xzl4S1m;x>=x>mk}H3#Lg=|*fZ zU~pbYKh0=dG{!#H@JM~j!CAneCbY)YTyeab-pehvcGM=tHA<4ekYQ%}I_@$kJYtv; zhj9_iaz21R9DXQ%eJaGS0@UfyKIe8OLRndj*?Q&>;Na*dPN?G*E6qr~BRK`84F?hq^E~)c_z+1(DE!1_FQmYaGiPptA$a)&#xt3rOWB9|s)s@I12dDp_;pQpHDlj2SL%3_8TLXSaKZ`^Y`4%L@HVrao{IJipK^@>pPjo zbK*7=4jH8;g~52WFeAO~d?NtH1F%3VFdg-byQJLmTlVNPi62v+B&p*!9$he=695{I ztEa_Xy?Ee-o)P&DF@XTawHKI$j{V z+J;#4;srF+P#o;o37o(QRvlw7=>!+doH6~llsSpJe_&RR-xKC9(}v)wv(mU5dFr^hbeVWQe~1=V%H08~J{^k(v|SQT%Pr%AW~M;7a1tcOUb z!r7(?0tJPPe#Aj+m<{h3ALP%RlH}NCh#j}`c|KASnvL~SO5zD4n>NCMnkXp4c^ad| zWrEUPGkkt#^L9Kn(}RFS0g%x6pudz-8+r?_ei|kdhK5rxG3lI>M@(hJE_t9%qmFPG zrg27S!(Xk&br=MXlh-qO@=Tpz_FDoLb3By@2OLlGIN@rN#|g*NH}yD0i($9Y72z>@ zo|O#R1EU9JVF`o%ofp;isl)MT*6&&zY0zMnzepg3TK32c;0b=rERud-=S6!^4^F=f z{X-%*6BTy%@aNx#X`iFMWuo#hNj*?TNKT0yfk~llzTjxZwi1Dj=q1zzfa>eqLSyLH zp5XEN9af1D^O6o}JCX8GpRt=|CRZTG`O@p`n&0e4^f~LN28e)RwDsMO#`!VH@SZF2gx#QNfKaSr&r#)A4LrxH(dC@~iceETD?KsiRFu)WBNkO^$5d7V%; z`H3u>i8SvXfCYXGbaN#gzP|sfNF)ueR2DPv!8|M}p4PVk2mU!6a)$$bbJUAtQ=HHz zRp7o&WYks1q{x?AFAJMkWE-&{ELbUhEYHjvz&Kc-m9-!6EyN$n?hV`xvr@DZWAy)+ z5J9S}%Da69yILVWn=`JyhavJ$qeqAt2*wl7!m96|?Fm8#Jl(Pnz$4&^@5{xI$|=D_{1!PPh7r5eBuq^lQ{()p8_tEPQw}#v>F7Ik7tZ7!YdvM zctuF{w~1G);7>DY;-w~Vi2hdKkbwEE;ZS#V9P-Jm#3Al~BOHnd-wYV~@-^N+n=~|H zhOaXKD!3o5KllhI-En{hl7}c#NGHGfc$FC5!3kg_Ii$o&>yVSYAw+9}!x-f#o4U-v z1#EG^K5l|s7fCDO-0lr^ z$FP@@Bs_S*%_CZ7Knxl3CoesE3m60qu-_`aqbVves8WS!ykW+gzxt!SK^5SD(?n3o zL}WUZ5He#3D#R5)T>KM9!J^`HFICi;!EktIwlV=@%MS%ZNr1SxD`Vu+d1C)*<9pV- z6HaD!2R@LG7@;d0cuX^zbM*qvpU7#`Z-KW-aF|qa25}Zm;ECt+;-gB`Q_4J!UMq5y zMCa4{xa++HzumW-lVHv}2Vrne-HAglic3m%r3i+By&=GO4AEqpyZ zi17)QSBWBCa;gbtUC zUMfJM}sc*;OE*Ro4Kvmi1V^TW0_zWm(LE_`an;bzwGg2WG9C3FRtc&JdP49FuybB2UxP8so<2a)o` z-@h5dg`c$Pfi7!gVR$0x9pxRT6Q9Ga|Hu7y+s^a2n92b^j9CrwB3u=!cw3aRz2~l+6y^XA@^G?Fv#XGYI-2ifov|Q?n zG~k{zGhPI;v;i~cwt%lxnZo=FZWcS$R8!)(lCpHr)>6)mW6v#5Lp@AG)l@``$ zI^83h4=Z90Rej);S{nh{93G4Tb7zRpZ>_5kz*p2#YPJvncS6;|6#8-W2>2od!1xjZ z0E~tabi}z_c#o2dwnd(t8wD4;ZwfL%YA_HN^-;*Zd)@3z{fS2tWS-R~cX+Lgnne;rVrI(Te$mQ7i;vy@#%zWwjaf-0L07Q4YPS1aWWn;bS6gKxsJ6TFk+0ap1J_$Y@^FK!wfqj zim}^ZDBbzs$XW-36xC=rz=U1QvS&IOW+!_gz5*OwGA;My4VnY7<0c)*H zgll{jjVWPI#4=^vk4xawV|@jEJipT7_~^jbl$>o>i9pK;bih>iB!&{>a`i*>An~X+ z?Y60ACv@jNP}|W{-yR9*#mb`;OC^xZh4xG{FcF#759pSChRKR)mnhsrBbi>kAVu#5 z0HE%Jla@2o=tu0)_LIR^NY!mshI_bPKr5)<%P?MJXu~kf+Aj0!crrgE?>^I=A&;~^ zfssA-jXGu&=Jb?XPv|g4sVxf;Q1d*)p+#C^tfrB$@~ie~)=p<;S`f>K;}2jhvqNog zg2Nz4>Wkxq1FUEr+>l2gER4lP${VX;i+?w($x@3pQW2EB2D8FD*pL*=D8bLBmDITT zk5%_6gN^~Pax_MkgJB8>0NU~u)F`XrRT_Jv>7vaT1Ub7U!Bob3fQ74v29?|nlRg(-yVFx+R_v<`d${ z+%6p#PY{-bz)FlZy-hBOHbxVRWZ3l$Fq-A))R&YUTc>(END26I#)V#<))+-H#2$V$ zw=friJ%ujzd7!&|*U7YG6*`Ut%OjLLNQ`cA0>ZW>iNJs5W@J!h2b~GFg@cYcr>>B@ z>qryHU3^3M~xA_A~T}bvYCT|t^wG{G88`0 z-i+nM6+YkrNsc-I4=-C#pfh8$GL{8P6gWYxW5%*!775TLhG@13zCyBU#%XHOQc7qH zHtlx}1_VM2yY#4`xy=gd1JlG6AgSxnFNJq}{5F*jn!5|S-64cYU?+X!Xz1PMW)tyj z2InSRfnpUfR^vE$+y%}6QY=1fE5Qy|;J{pg_|++!B{z;gZ+3^}y_{F$(m!`Q8H31r z1|I_V*H=~!+~|9K^8@=>!cT26Ry?HmFF`eUHCJIaEXFtS=77XJu-u#Dh`G$01A~({ zhs%uosD5E>0%EcPXXnmgf5wuquIkQ-h^cWQPEFm?JrSf)3mQs5%x~<)$#US?AZF5d zagb#0#St;ei(?vjCdBj*D5+RXOegWeG&SiKV%l9Bg5?+RM_Ztf58CwO4BbSTHsZ9(+tVlF3X(Xx0ks@r?^%4|*WbVIlBe1ni+l zvv2vXA9TLa(2Bw2^;#)++F!%CXXyhMMye(zI)j9R7=cOnnNQLUfSx@qjX;YCp$6QN z_;OF-GNva{b-Wro09e)4m>#3EusI=>4LSG$8m31_f$8NiJ*}ILauz|TV zJpc@{x49jAc>$@k5L)N_8*;lYNY!nS3aLO};&$l1k=v1oT}p)(rR&^|X5n^5!gBWU zRTI-}TS#ShjqqE3K|?B=4$1-nvNF1ei6nr=kqU3Z3Z$|P3JZb)!JI3V#9j!g0!on` z8kFLkaoC$Mr4(D&R-02}3^Jk=T-;HLXX4%jmNhL$l(HYjC@ua+K1BrDGhQ zOpgmFg}4tWHR(|@%TvNe9_Z*#!VYRYN_<|9P^^fkSSpY~kwq8WZS%zyH&e#VxD^)5 zY!Q5^^@f76g)tA`pJqAvhwY#_N-6m&(AcG(rgeFYg9~z)XL5YNXON+$I4}dAtPmt< z46K>`oLhvaS{TTx6aP6=_iwJJj!LUud-QbK-P3v5Dfx961;&AGhlg!<7!9T2@Or@f zsFZk(5{&bhx*>149Q8~JW8tl7@p5zRkcG42j)w*D2z%be+lcu6WX`VP#Tjl_0>Qly zZ2hg&sh-TGOrUNPOm-HI<`|+OHJ*8j{b}2uWOxFHJp8zp%V~?}Vhf#3=DV|TL>E(5 zK)Z0u;&t;ZY;-F?nr8T~PstTNDcwSPSSyLNzdQpCz?TLOA_& z6VKHv-lVSOthUH_x{k+Qh*q;?=pvngjO~0W8B|ji*(-G!{X~;7S7Gp#KWTf_@cQ+T z9dbdZBN)eKE>LUPtfeWt$?&)PX>a*Dx2otMN|F&iTa+v`T`me5lzc&D4C z2M~qQJM}9#95us{j}YZX_(ynJ3p)WFThkDBHcgl^MZ7{N@v`$#8W_%AcH06Xgcviu z^!I6uFAIlDNP-a(FLN;Zg)yv{{Us=rg;9L1BfyMvdp`)#_q6tqS`w+MmDZk+KYoDU zAW)zcli*yC9?*lNiNXw771TA~;wKzYYeej!&d~Jz5EG$`tCaRRh-hOW(#ws9D8bz* z&9&$txlDiVSOAD92$KT|a(H_RHpnjJTZj%RvwMf{NomSZZ_MTgic0a^{33x7FA7Of zC3q5!Dw%MinQ`+lj}m(lf^7FJaOxzBv^KH7C(|W$g#iAi^4O)r^IO=+i@m$ao($iR z@KBUZ->evv=HQd*Li zVK4C~QRJXgX%Tkmo~o8Nua%ieue^9Lk5CG6c@fvJbhoG1bIz&iT$NrQDI$oB@sVJt z5C&ZTFqsLZb%{VEiY(N*xUZ2+79-E5MUL8_@$g`4EdCMFcol_)_ytV))^=Cv8$=UY zqmY^o6~XD1+diJ2=-;X0r}kxA$={xqDgFyN zH|m9(4ojnR9%&2j5$^TI;unl@#dS3BP)642?3+&0xK^B&v9mfE&VXdamoe9iH%<-z zBuCNB2(<%g##Ga)EHNW9Prnc~3xII0i^9~TH~x-n@VyPH^Y+x8V&}ZO7Xj(V0eZz(ayCQ* zZV)HgH4TnNd(aAD%i1uc$zh||3F7FZ+R#1>qXreEgllX^ik~-ydvK@x;=Cj`dTAuO zz*DgDNXPkJHVlu!9gIIvMICd7fMCPJC$CtXj%Af(FQiIbTvIQ+^OkJ2MQoKxmO=yP z=b}Z#Q98r2aUtckZl1+@DV%R&jkvu(+n7WylxUG1l-biaJTBJj72j=iLCD0DygMw9ZG(xhCuoT2s8e|+PCu^1n0q|LpPa8#r!-fsM zt$9MNbVi1Op_=Ex%dOSsCc^N_WD7U@-_1U}5p_5`k+FMtw+<2nmC_>rqhuwfe;s7$O)~CHPM&9t=DT%a1OogK%P@X#l{0IJs32wP}uD^7961{fl=h zh2@XbN(mZ-zk@TLGPpO3rwq^}{v)R)u|pxTaCCH8(cpC~FhjNAWI|>WQh8N& zD;ze-rQw1n$@NmJSa(_Qm||pugh!o{>fqX~ZSUp7mk(E#7i$Ts)#+BoEz-mV6_@5j zoE?Ream&q65b7*wIwaJ6)z)UJEv3VuwB}XiC(}KliReCv*dGU_~!$cA`YSQuL z8eAuDZp361Zmi4O(~5#&D_T-3FcLhB#z?Z=Q7P5Y83yp1yrxg}V+gN|nzi1_#As-P z@Ncw8M?jYqYUkndp!T?5ApE=0`Y~H_H`8)#auoFzt zLqa1lAu%19v8Pgru;)d6Tkn#W!)D5iLVjHy;=_RBMBP>@eoT++IUQVr8U{ZrnT?hC95lQcVR0`SVToNK9VmA5nG2J)Av!qJ zdUihgNk0mMUs3KwNTuX5#GHx>lqs7S5N}K||FYdVEC?6@M;$#mt>e>4lBXW&G-KNp z*fUE>=CDjjP_z%=lH`z6iN~;dQl%<}(o*n>=X&G@1xb+K6iI?BLV?^@0i}fW2>c?; zLZ%bXC^=3gxqR0agn0O zMT(yGYO!p%$Q#N<-cT-^VOv~e;Bb+^;397*7agJIq9fE?R6&r7DhP5>1wk&VAjm}( z1P7`hxJ}=lHCnIBb0{6i<+&6R#1~ffv#kOxlq?vrK5}V^zG^BQhle2d8sR@0!O;uk&Y@|-;|Cn*7dG*v_;pu z)6rA(-rLgAc3tmDM>}-?Ogeh1uJ2Aqm+1Q5bhM!BU!wcutPwz$ zfCzk8=YHNQugN9N2|+_pak40nVTWf*5tagybJIxd1OD zHPdqc6FX2g)bc`HsQaS&y^MVjV=TYpOu0@D8aB4XOlI5;BG=!Q$znO9P)Tk30!hmV z3CG&SGySX5r*Y|Bl`e4MX6cvBBDB|}5CD7o;%fHe7LIE!5%O1GOty9s8`h7oXSWex zPieL~OFXkjahUf#|BCG4oVr^xl4ko4z^j?(2dQgH{D8*bEbYsu-%#682USzUP0a_ejuk)0Jl4zFDSEmv3RsG z6yTn4DAleqsOGz!j}P7JuPE^yHszTG#?PX%|3+ddrlM-*>=WU1pj$;BEa6@!7{QDn zZ$ws3M$TO!;yG^W(BAxrVrv|+O?WbPcMgw~Q`c5hlrPu7w<->?9Drx!I)c7wR4_(s zGDqN)#Xe6)4Ogp31qmI&+`tMIA^>}HslJiPNh}q0%>7VH?aA9FKYcx`1vaR{9(IUF2)@V)f%5JsoRJC|TzNEXDwQ_((PZ~>5mm2kveRq(_+0g-|p)e(*QT5lclxxa$bi)RsaFi0O zEHOe6uJ9~u2|mq8z1&V(OGHvdE(=3AY3Lo|Z@ncTA5Mg`>Yw~2*1q_$sDQyV0&Tc< zm6jJ2AMZug3d&%GeM>cqrUb1@YrNX?X7FiY1ZB#38wf{3;C2VjJLSc5_*Pn8bY)A| zIeHlLyz5x@^#a5ygq2)_#N<*A!FN3)y5rp)qbabStmpfyp>1^WJQ!H-pkCWhc+XsC zfd!w}_y+`YnOl1Ia=0}wtHnLZv)Le&e@csKCuM=Bq9inQX`D$#K-V?&%cU$fjUY_A z9PWc4MZ#$MEeDDo3^-?t&#Uh&!A~H{uRE&*gdB)938fDnzplD;bZL1=ovVoJnkr zjKI+A0A#S-ja%?teH)q6&BHJGOUR;86?PLmGgU8<%t<0w<6N3$W*en0xVHj};CH z0%j!4v}qTTJS?}+klJuv#$W0C3%XHAuE^Kv9Iiymmm_#bu*q|1}6{c%d(ZoV33&oWTYEb|-KKYRc zqlh@XM8U%1z+OhxU}^yKSRg6i>>H*f1Da=Cb{VQUVmc^QfVlC6>Rgd)3jujursySq zM|m4fos=GFxOg(Pa;nYN1{l47C4`>qm?#kOANF5d!oaB(P>-E!NkG6(=PT-!U~KQR zyRgnBqTT(o@bnxJ%MPLPRq3TdWoaT^DUGO_M(QCjsP?j==pyAgxUOF!Dfd+hp4Fkc zXg~>}`Xryi@r!(TmZZaEgI;blFHYyQ5=xAc@>hrjSP-qkFI9UK>E=<56NZDk;|x{- z>`TcCWJl<@8+;1nuJSrR#2``)orPRVuE5ogu>vV5Np@^s)TQ13D!&1ALi@0S4jK_+ z-V2Qy49X#CwWk~eq24Gtvo-i}Td}@Ll#ohgBzfS*1$>IOZF1hammCcM31vp95YYmN z&vhvBGVH(nuU;h1d-b?j>hP*mfs|aNp(+NdzGR%8g?hEZ_wgX;V*xJ4`WqU@ z(ICN0dtN6&N}!$`sEcCX^&PLrn!1_+!rYWKE5}q|I}mNXYjSeEVXYGRk0@tq{AJki zK$2eH0D^Z>l!sR)1&SlxUR{5>&(71;+_cEch2o3p75RXe4}3@3F3CucfAkpj%yySc z<)x=E?$JqZ25ZRojP?rJXOdN$6fwHA2WGKpw50A)Gm`zo(V9KUXtA8Cm;<)7^eg`H(kGqdl-RoG7q}=u_x#(#DDe!}Jg$|17SuX~6BLgkBof<6~yFX7g zWukKJm18r;yRG=;X^7}t=WG*1WGF+^+W>3pU9SeqyTvc*O;u@zCz4rQ*k&AUu~ z=2F$#a}2{Col@`l&QlnWgMkcxTEKl|UJS9`_jz zS%F?$Irdj#cEI>@w=j{iQgNjDa#^h53nQ4Brp#cjN@FCL|9&pY2^Ps2c3t-fl|W72 zx{SM|Jbui)&1BZ#U1kcRU#W;N5PT~LrJKR5IBzNW{yIA-aX}}jtS80#A?XEqO92MX z5V)VF1po2kw50PdevvP}W~Q;qHKIKXf6VLAV!#)_FdfU$Hj1qr9sn161{D@!j{L|b z3PyL)MX4Er^(|_|FaQzI0u<+jS3-Ul#Pyk;6qlhZE~0L7QFE?Qn#!=A#Y$FKAGln= zlk!o9Q~=CqOj34IVHQ8Zi=@~{^?Efm!}S?|NuDsKdY5bn+i?O=1ZCy{x{F^Fypzz!=6Qs4x)T9ce3RHi2@M zbQhPWO+YH2_F(wm$dHM_qVs}TwygQKJttnuOyJlkZfGf%;&DIhrI340 zH;q#4i^YvYHx|eu5JOJLYqlrE`Wj_p3T0t!aijzymo`_}Qov0_D!Yn}Fg6(g7|NDKS}gFui%*{H9JRmu z^#~FE6?Mq;N`7y(rtDstKJ{9|UQPOsAAkIXN5!((Qo~;<)j-tBe7C3P5?LRVUa7Q~ zRUnX2&~`kWVlT#0U!wyB3HXdxk9-IWhKIl_Y=i~ja%pxV6JXluXb7cl!k0yr3gsqZvpaz56G&Q zr?2H*r`a7W!-eILnt36s@pSEF#@EXA2NE%jPW|60^e~7u$IWgx20HJ#!Ov6 zdfD@}WcKOSFD(8ctuOMCkT*6=d@V&9WEEX&z~4yv`07J@*Z%DxM}kq=tpWkC_4I5>~ao7?lXhlunA>b&T}4F z;1OKdLVr7gmCLmuYinMw=h{oGIN31`WqBn?JYCyU#8>f#bV!4~ilyv&(0Ep5JO_2@ zYe=Q1U@_5`rZl^R``~UAa`DkgI+@d+7MnFPdpDQ%Z9U)qmahZKHF2Swg^nUe1#D!l zgq$uPmMdZ8U79Pw9-+&*?J4!FS;l}#X5z&6D}R5_e8Gm^psrRM^4@B*lwXPc1KQ!X z20UD0y7uz)o6UDG7yrer7Gk*`h9{FyJanY}4fN3&E^uhY7$zEmR0(&T@Z{Z7PHVvsEYETh^`H8jk2z!KXWdE+WHi0FR3X^zM=RX zP5ddXCL2EqXmfaUPRnkb!`ENsTOy&sRU|iL)zA3`im{?X&glr?r+Qb=i1;)yN5#i_ zv826M^I>J2w`~-^B{~hTj3X0l<82-u#*#PB8RY19v0-MHST_{>QWxbqst^t8OMFg5 z;{^O;=CP1{R=k(k;`l&l*jRX`9do9|#OjxvG#ga>3|6>+mSen)&)dZtbbrj3gxbcJ z^k(EsHR>$jV*2UCV>U__jG<>-Q%xckq;& zN`rb^tE)(6t2N>UC#LJg(8&8F3Hk%cuuzWob}L z-r}^DJI>#zD856YZ*e>J#uA;S8`PJs@`iy5JyRUW?0u3ySfz^4@pkW+2VPM8Oj>V` zP3Y&bl-5x3?Gz^}`EeU8-7y}uLZLP49o~S6`baZRx5t>7ko4*Cfr$QvsT$IPL@L@I z&e;&-VkWJ|!7MkzN)8hxvBDin-8Uquc9(-amX+&IkDk5OdJx?lF%{&k&A?} zFYsjnR74^I2SMtx2jaO6Bzpp8x7&~%jgfyc7D_7(sC#RaxV_25`1iH z^2iAM)2PgR=u{dax)JxpI!%*qf@mngDRt=eS^a@`q=+P3V&CaQETUE`6RO-+UV3Y_ zT^h3SXoG{e)L6;6GJu0q3B}!V&R^M@Y6C}8(tW$)bRD00e5dpesv{Ed!J@7}DYT%)`K6_gM30$3DVCPPbus34Y%; z8fFb%%Q@_m!o}BG74TZLT@AtOA$Yy1+JPrUXeM&wC&?FnGo^u#n_kjvCE(8F;!BrUWfEoAmgu7M?{Z_T2%Bxg_~_#|Oe(#qySt zXUqRV7=SSxjMBEq@O2IBn_pZsJ|i@m;dXw-bo~r(7C*Z`K32pS@1hSohTol0y+j$= zsB^dfC1badpTVaccN>s}cnU&OkpMF!1or6?=AZ4&EoX{g6S1FRc=v{yj4D~of7Zjj zp$FRui6wh^Yb@{I72nbpx&|f<{$1_Y;`IL{K8d@Cvg`w*A$<7OxIGmWF-cO1Hukc@ z;NBfy-a;38`Q5F#^OW@tQNy+rJkfID7+5W65Ny~LntP8oCn-ece#J$+r)e+1kTNc4 zNazC`a;3gvvxA%z{|Di#HaM>cJzf84Y%Pbn@qGDz#ZPEg_fJE+6KssP7pW&*YHzYN z)IJt3Ms$cxH1=})`KaV5HivJ39{ydCj zymiN{(7crx;G^tDlTSch-{jk>PI$&>tYw`FbLhV>!tWA^L<8UZnrW6}zlhqZ^61{e zi3BhWiss%Ta?`-){e&r#U-N{@n%d4*;|*)3eLh8YZG_o!7@e!u$z24f&|j+9|h67<-BR=+GTE0KYN;{p`Y6*2InFvg*0v=fb1Xej`5wdJrZ>D4}`uAXRvaFvu$qgZvio%X!T1(D4)Y0Sml}`z;A(GzFqEBc^kH$==?Vri<7hh5V~ukrE6S^r&Y{Dd3A zXy$DEe;1lDrf&~3bG+94{H8R@+rJMlV`6+y{rBOGhDtX|?J>)DECfFkySqf_Z}|D4 z<~{J!=%1btTsJ{6T*P9lBJ!J!Vjz|j2L_^8=>gg?a3o|;8&C*2)HZ0(v>UvEnRctB zN3s2>O|?1OvIY6N94$RES_h=_a-I9rj1c8zuorUoGeDN+T)?rph~pc5i5BUFjVTn$ zjeJ>B*lTjD^u%Y|4I9p>lWe{sdQWEibrTid>~qZUa_&GiC!errmZ>&#+n~82Bb_&w#L4UQ6mh=UlFRMHMMOWMW-R-s5#P|InUJ6ifHV zCy8kYlyZOjxkxFqHCxB0Spo^uw<}IHfMdP1jly;XS1R^Nxqf@P$PAQQ0mh@f2a2U3tGJ%f*{?OoEi4vApwLu(bQJLzqMY6xt!{JG^2Ca^q4uf~2luKCyH!K&a4 zPf3GYcz*eVAQQNz-Duyc8e__wiBO4_2wN(m3AT_Y!FcyfQz5O*2_ch@M3BB!Cm#u+ zH0Xb%c`WiD-xlD7kB(c!v4&>cExsa+_@m(!6AN)6F49=mjNuP%G4yey`2(>rx<*Lc z+NmE1&CEpm39zk2|06mW3R$o1Lbej^3%m)h&rCDdkHx9T(g{@Yv8FkjNI(NIGglSI zcp=|{XFt&AtOpixgoV<|sCLT1pbm$i3XE zea%4w`#EJn#0J_qC*W2X$J%KBp3n3eu!g8S!y4qMjne4opTfdP zixb*3IQB_j>ZJY-Gs<<$=#$~u2?7#)bZ}#NJg@XejRd+;&5$Tpug&9{ zq!OlO@-jokqZS7GDero|ew%h)UYgSNr&_~w-H)c=u$-}55j(+#p3YwZ*xSjy5!(E8 zm<}(o(ICV7)1k?=(YY$#u0e!1J`+X(tz27wrkT2aZFV3tk*P%#={7?Obc?PPZbYGF z9GU|E^4eM(&(0=3+e{u76?aGgubK(t`CNSK z4DLH%3>-`${oIOI>EiQo@Ei~1*`?xjy60>^M1S(s7h;na!fV85OQVM6AN}aTNSh%3IL;BpWE@#WB5wR4oB^{}RE0ciBbEzl2%h_YY`= zkVniUpc}%4T(1&Xj3maN(}^sLhsG^U6~8FDc__4GJ1D|Q#73sT>KrzxIN;qHjauG$ zgkV|pAyf70`@Z4{RHMZCVpt3of?QB|U$hus42_TdXoh9ETT4u)thWFvdB<1=4e(!M zGr88(WYE8cMgmju39~-yNPIMA=cV+(KTJnCzZm%Fi-BYZNJeUp`uf|Y*#-HA z6YY}cn`FzGfdYiOkYc21SXHFyhXZin`as8}`om$wM$ZvpNC05!s0ftB=-6WXTl>jK z87@hsN9Xh^c_a6YWQ_$u)qlgG5fz=p2_%-(Il7W$Btp+ODVza&?KSpwi-1I2rGbRZ zSe+}^A$CMfu=hYWePZA_*8`lmUyjZNzM?O1jCSUT=R%24+Y7@YvOcfx$@wPozX8N43*q6gP1fpn2&X(NV!LV_e zSX}PlL_8o(gVfceh{Gy5QlO(%8#G1olPWrgAfJ79bDiA&=5Sy%OsNk!5FzdBcP3eF z0j=kSYBS73+Y)2kJ6Fp1cw850T-ZJHENozk)kt4AF z(wuxzSfxtT*gZYkCUOH_|L*Xb=eUDT^Z$DrRMAhfMq!)-;f00d;*+&4TWyvq4vytM zlaSvGzzO>oFof##S~M`WsMtb8=MhqvO_@tWAkeN0EY%!Q&T2rL?J^_r+;I!1F!q!+ z$$eA0+cu>1r?@u^3fWmB5ACtYJ8pp$lQO29ixGpX!p6Z5bZ~FrW{kxDNJJ$Id0A(y z@sR+ZaX?($r@#n05xL(&wJxkI5q9Iyk*~xCiFkpRT7zF{13ZfEulj?Sb=q_KYV%0s zY3%{Cld)*`S zfKsc!9vY7lkX;b&kc-=i=JEIri}R~eh<~hpJiHN2P|#4PsDi5-&=EQccRT0UpCL!>n{!5hb4KFnFeHw5Df3S>QeGUgv=Vgn@}I@vXSOd6y|^|6=Dj35 zV^j@m_0E)+PJUNaa-MXq`fF;&@&fAKb3+KPj4~ zMZa{#vkfC4l%1flQt|myaz$^%3@tAfNtqFP@uYZTPwVh#YgtNeg0L3jJGwY5@5@5x z*oWuS#Ma{8w0>FW`J6@*9izF-7Og*>ZLm{j9AGkpS6&Urn3u=-TwwDdyv*kF@}|`| zcNU4g#sgI;7puQ}TYUFp+7&_THZ|wAHYg;$C0AY%A7#@~vFWj&SFCtg{p_tafRm;g z(dV`F8R9TY#t>Aa4PpP$SKJ2B@}U2C>~9+H{zbN&KOVX=MiP(C>+l%;wD%jOg8_Qm zZ`2U9l_odIj?qT&aw;=>1UEHgXd&s070zrvNq!??n|4d{QD3@~ynG-+gL?eZZvxTv zLm#Xqvd_+|abSvGFdeQ;cAy%uC$JGyqT<|p%zg4opVj)}ooW5bW;y~f4JXCdkm}eh z0pzdphvB4H$FB-ck4k$m>;2i1yx{kcwUP#B%gsB{%urn>ov_gg_m%yL*iELa z=06eo86Oc82$A{AfV>6xRvpuKm=iLMknI*tP{^W0T?m zH_%KO+fY9k%(cizekzW9Y-jyc=-fj8q6j1J%azGn%?%A*D?Ie=zCB@dylxy-&FPzR z4nX(O4ReA!*1@vCuX6EOCaEH8>_bW*^V6i`f2KIv^Fk(I*i8l0vxHB ztR2;sjukDPpYa#vx7z@>UswE`4x#=`c-aEAH-+UOBhSbT+G>sbDx|Q|xps5FG0twe z#5;Q^4-mMu1;NOU|HP8=A89UuRu11$pGeNCcnawVaXTBWes& z)G{!5EMujV(VW2s)?u!39GKU9nE}O1TYP#E6@M-cr4`HlbIr8I{GT31rV@DXL1$uk z9kCzWhx@~jx~65>=nRgrqt~s{(d$|Z>q6G1!g+NQV-X5@IXW`BST=b`D1l7*d2eo5 zZbBBWDL&fcj-=hb*=BbR)Amv&ytvo|?r=Y7=fQQb*I|%_I`OvL#r6wvq-f44Mb*$S|XI!>yI(7`T{eywEkSn3??VnVGWF{(731+1XF{upJ0mp{wsl)a34>da7 zFU8T46>`eR|CgHXL4YVNIq`99ZzaN-;-DbBRLmVGcybN56rxjYb(W6rLMOEod%|{_ zFOECSymDi8F+-JrG5Or{mXp0cLjLRx|4t_<##p1G?4g6iI&i=<}&?C zR8|h1#=@Zn3_ECSJam6Ol1|j9-Wp&MX7H8(g=Pj$#BXUe zH312+Df~nyPh!U*#GWRjcvJPXNuK&Y;@G~H02hMf%-;APtu{fF=s;JC^4i%7iTxSA z1vN<2$}(CWpgZi)cj``SxhyL-9{oTmudk$QoC+KbkRYPUO-p5mKSv;P5>oEpKI(9Z zUy~q9IpgmR12y7|p+9j5@~PoxRm}`GN(rMOPpaLr5lvl|R(rCS?djaI=P?3u*4{eW zrf0`y@@ele$8Yz&bai^Qt}soM0)unu1Y65##~z=e^ySg4@;bc^kE=|@p@r~h2gYJN zl+VVt1>MifgMRRIP4Uwyx+ebS1I(4%;Dgd9WycBSx9>VYLH4+?)dtc1MudxkSC8pX z@NYB&6;pH8W}2;bF*Ym36Pa;YXg_r&^BFw@49SC~ud`ScyE2F1{mVCUOi`M`{(}XN zjp^c%v{7E)8WHLvLMVb4ZJpj4#x(ZmH}jLu6S(i&;=7v}=~IBJ$Kbv#yd2J~fqpfv zAUK^~qaE{8J2%l+`CeFIawrJ_B4_{2xSAaFDSmdk{>{*6b9UPHBaLSA8h<&jCLn4D zltv%9rzaN0uVsaUZKoRMt2CkTft>-l<1QmN2*8}mVbn@Kg7wJaY5z=X$>Dl73V^Lr zhb3~}ous%W5mzW741BhJYS_@@<0bYHH7eRd3LePoLc97^=gQc?Aq3Z{s12CrWO(s*ZTe@Eg{mZd2XD!~8grWb?Ou z1W35@DZUB++hGJv_#s>>qy^;IODioP;h|7mO^{dHt1!eAWr?qmkcuN>L4S~N5H3%+ zn9_t;O7UT*AIUoUCl@7-L>7bHB}fdhv6mI(xAV1r>pjw^lF_dPw3oy#;S|~~iG2F) zKHCd;i%o7ki+C6x)Ty?&Pf~H{S{~O__M>I%w9jg^BN-v1lJP)k9p$oQJo?B`*dXGe zI=#jcG@1d8*2|GCm4G=n7d_1I=H`uM{(GToxcK?#h;wp{{$A5{ zfSe1dD3F}06CV`P>7F?H3*b_TIE)z{_k>m^4xRsgeD-7ZAnK+h{O`9PjmIc#A3VBC z{vf_*hc8IR6FT{WZ}4V^l>_@29UIdg;YdJqr!~AkY`+<$jI=r^#OyL{Cd0<15o%A_ z-KJ4r9G^JQ?|9_g@fnT~usXy)vn<3ihUjE~7PeZ&&V>2P7@Arp+;(U78Y`E<$lno1 zZpO4@#XG{NCw*N)Rf+tuSIe+h!jXuw$UY$95YSBHe-s=4b7WaSxjzbxhcH&B-rNSJ z&5cAk_}QLhR#zr5vEoR~ zSfNbduI~&(ZQMss#9bAG9~3Hy4+%ALOa=U&5n0|&xUEucklWx0iR%}22Gdd?@lZK) ztWmOn1BAcjDslw{6#HWzo-(rk%yj+7VQ5yEfurcsVrD`|qz_D0nPJ8%GYq_Un`HgvS{-{I=&_eL&@S7bMFS-Jv+c2I8Gncc!g9`Tebr%F%hdf`sW z5O8H@{#CkOdIe<&xRyI9L%?-JaDuMr+jr=C@lMJRaNV+#G6YcO;$A$7~QJ+tDPYEXX{2`f$qKTa=Hx|_1RZEU<1U2d+&kI#BBy9Es$wiQd8*Ijp|A;8FIv~Gw z7rCk@k}zWF1;2Gt{NJ@EY$FT5gz~V=_)x9DgXT9GHcd4+wEgzCGL^AjuRmfB;HLJ9 zmsso;nFX!qPgWHa%Ic}evJn{sNvv-~pe+G^z9$rFl_HIP$Y^l9CZjapU8WVf%;8Zg z9-8?13m(|bFWg9VUq2^hYLU%W>!GF+N(5DXVFmT^Hda7gZ?XqS}jG zRMLuz>NRswNh>a@P{L(lL|PdgAR_IjQeq*uFkh&!!9^8HxSRz7N53M9!Vwxw6{P}U zAaK9NnRaG)Ue()#RgfK}A6WqO(`PT9en^v+Fe39%LpEmla4PHh1Vi12XI#7gs?<$m zX*s=GFvVI5=LO@#Oa+%gDs^T0E=8vXe3m6n8Sf)>mFkkp3rDn%(odnA9`yX>OvEc^It6N&l&^s+OS=8E*|NEgQVOz;IQxwxvg4 zRsM^{qw_ubb5kHB(|JKsfgfGmco;hRVHv+tcy*Hx;1V@3?aTI5P9ZQ3EkTyP4=&cu zq7Y61Whggcqib?sV(to8SQMzk`~;Mnd-6(RLakzBP^&y&(<;+Ikf$UgT8eQxmyB!^ zNiq^jD9MP|7ReaN`)ZN*@N?P9qQf&|Qk1_M`sISUZmyFj=KC?Q1UErJg`{=ZWpZ&u zn@vuRv{o8DTm)jQzUN1EHsJs__Qn#L#r^olpUp_vyrG)onOA?+Rlg$gbS*W zDMKW%a8dl8RZ2Y1kD(0$3feAS4IP)sW2?cr9$bC`(HpD{uR`DP6f+47MZPbK%W5Cd zgrRr4DuVZ$29vn&Nv=gZ=u^Mu-_atLR|!IToxsm9R>P&qB}OFu0CWhu_+8TCwZI;n z8$gtGz25wJFskv3jtWWr>N~X0R!4?`(rN2pT{f-^Moh6L0PQV=rQ)=JbkWS@<9~$W z&^{3qQc0Uqs`FtP9~h>y%jMVQ<7HeyG&ArfZc3lxqUy6;<`G<6Hltl}k^JH!`Nc)@ zi;LtJ7s)R!XCbj-O~Q03*{00(&>iD6*P_&oGF5WN zuh;fPI+0c55)JT|w)4Rhtb`R@$tR(TavgHf31aqDLE++8Am+Lvol28+MO6;&hC~;# zPh>1tuJ!wbNR~Ty(K+%L+lLRnHYFLxg03;8Am88D3WjP)CIF)N&n5I|2$#gp>?ST4 zf|O;OI3dYG<7-sFJYH7-f%@2jF{Dkkd(%4r!(MuhbtO3|&Qia!6Dv!`wMHP2)Ds%T z1u$gSTyvH;kE)7cX}sEG0s`9TU)_z>m%NEa&|s@=PphlaiYHYvPNp!6Npt$T*%ITM z(JOGFlxr51x{s*D!`8r-(6N_gqKseh_B7UH^6F{K%S$D(!CbtsRU|2}g}4w$DwK)4 zv@!$s<`ZnA?dfl1Kjk0@HdcB+?|0Rf0`t;gMB7`sS zC8C*HaAT%V{s34H6Ph$=GIt(GmPFavavm@gen7TDr*ex+#Bvb@asiXbVk1k2ynfP+ zR55{LYMZ%$EhU$sR3!W!LYB-`Bs&4VBX)Lq;P5|yR+R6~Osk;q(zW8AFd}#c2vAgb z#=zz5;PW{rXO+PyEY8FD;iWKQ>z(ch764+N0^i0C^);6|=vB-*!`H5&c@<+J0)Zr> zM9U+ioQs4Am$Q%p!626PO(V9w!l;vqOnx$<(5uu3RKsxk$Kjk#OZAlkG6I@{xAFxf;4}B?R5A0-$ z;SDdPzCfMdVDK_4$6?<+fpT-A*CtJ%Vo1M<*Yj$b%8Tlj@W;LZe^H_8x zVcZp871)B!%$8s7iVl5tIaKtuniAoQb+rp(wy_(BGPudtOY^j`Y?&>G#Ml9;BFQHuYcK+bQ-& zttKWttB07;jri-<599}h#NaSoe}N0^eoI9COl!fHsrqs-!SXFD{6^(T>}!R8u!*Q- zq%x5?tt2Tzd-cUfuHq27K6Q`RC-WnmYx?2(ydxrslG|KVD41gR{Mu{(dOk>Nm5jI~ zH-I!9t^gw4RG~C&m;v4;iF(Y;4eKzmYF)gzzIjxAbFQe(A`XR~Gu@>1OGy)v1iuxc z`lX#3--Gz7iKs9ZFRa%ozR-0CJ&!1|k7y0bVMj-QZ{XupQnNkuGEp^@! z1u_kWR>`F(^&hudxIq&glp!h5DC;cBM2{)&XnVvs0&wQ($v(YI96xxUp*-A^simUu zn|;9<9@!U2J=qrsO4%1?jh0-@z957`$ep`=K~RL`3meW>@p+{SwoZm`$kN`4GTrld z@>~D_T&_-_dFIQl=H8u^#0jZcm?n~?4?5{^5b7ciVw{*-X=X^;WQk3m1K?1ia&!hO zoYFgtJ#uGwv&?<_2HjtV2?WLnz7OwIx~G2|VD4*2rzg)K^*PmZuTHG3gk!pJXv8nh z@|qJDmVAJ*l(|_rYVQc%L7mJ+R5Bg*d-n`zv&IdZW0xpQ@I*a@siZc>Bk~u+0JODj zPNd<>vov3B6STb4SkA~O8PGbp$OT3BiCm#5v~|Wsb|07ZEHamQT)|vq9dVI$#6{K-7gCm~Hg~=40H*WvTK>x%MNa+I5GZld%yRbHj>*>R)W9+ErZeaf^ z+g(bjiR*%o2b-e)-Tx^iF|0x39tK;ac1YPM#j4$T2df7irFHf6i!GO0U6UmlW)P|3 z4zYKISD+>}kcX+D;RZKU4uU7ehdIGlr@rF-^GlrCVb!}x3r>>_E9vc{X;XTz_SBgr z9)+Bl*ny_mFd~ErQqkMPGuduWc}~dqhUefo+2aHi0>mhVV|5r7wXUW) zkRwZa^1tQ2Xx=%{bm%H`*Wej+W)3&Ed%}aRK$65k$u1dPE+jZZb|z(s1;$TWH3uD@ zOemnvZmzQ*}1T7qGvON#VJ+UPWKaP0qBc7EwH7uE&nl^$7{~7n-zDe&P)P!FFDPGtG zhP6P{f(;41`I$X%)@thD@}Yn_rb*YQ4LCuKZh(UrnF-!jCa{;Mg9^?04H1~3%Cr;2 ziis;Cu|g>rPsZJgJ{iC-MjYN+jxF|@>p+80hCC^Lyit$C0AnN*Pw$G;- z))3-qWVkb7-@#$zu$s~KGMwSKqC0IQk-fO~-P1^d=G|lx9k1v#ChM5)r;P6Ti&Z{J z`XvZFx!A6uJA8tAz5=SY*k{`XK^ul|f#k)u$L2UGKzg%XSZZ#18fCoUH|rEF!FlbG zlm=8;NWua`*pim+K$bt?0xp&Lbzm@o1T$#(iY~N}Hfavn(vLsRjt__Gd5YX)9Np(k z$jOs0*vI)fahL-nT|m9*<}{#YQCY?>jXR+3-x0wqyh?pry;`lm2Kh%xIVFbEiPN4w zh;!K(Om`tij;-Heyh?`n-5Yq6hwJpv(ctzUn8mWY{(>QXFj&a+5CA5b)FhplW^dbh zL-!C&0k0(Ctg0m`7%`J+g>YxmG!tRan9sQp;(RU`A=pH1{y;cFKv&gOoMPZ>1mK0F zvoqnyy5x^p4@Z-uabw`Y2wYxBBiRg;&r#7d+y22q5kqntVwU%V`OuhF)8H^`Qxf1}tJ)Yy zCfe}`;q(g{;-L1L(jDXEp`c$Rp;qzuEuf`J!w@{s3MGcw=QIvc$~hS(n6Ey;oGb`Df^RcSFT5!|Pz;!D zvtTQCjpsr2uIccLW2&}v41`V4!JxMK#59|Me_^^CeYz{)AMr0j%B%b)wq~Ko@8mmy zLM2oU=i-ZA_cs9w98wWvebWudIL_e$n{|xyN^gVOE9ee+Bb3i|0|JP8u}I