From d43f1910b1b933b9f0c3a57129ee852695e972b6 Mon Sep 17 00:00:00 2001 From: Ar Rakin Date: Sun, 28 Jan 2024 18:10:49 +0600 Subject: [PATCH 01/10] feat: experimental bun support --- .gitignore | 4 +- package.json | 194 ++++++++++++++++---------------- src/index.ts | 7 +- src/polyfills/FileSystem.ts | 28 +++++ src/services/MetadataService.ts | 10 +- tsconfig.json | 103 ++--------------- 6 files changed, 153 insertions(+), 193 deletions(-) create mode 100644 src/polyfills/FileSystem.ts diff --git a/.gitignore b/.gitignore index 030038b88..f478dc827 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,6 @@ setup.sh *.bak *.traineddata /credentials_api -/.env* \ No newline at end of file +/.env* +/bun.lockb +*.tsbuildinfo \ No newline at end of file diff --git a/package.json b/package.json index b0bcd555c..a6adb9e49 100644 --- a/package.json +++ b/package.json @@ -1,98 +1,100 @@ { - "name": "sudobot", - "description": "A Discord bot for moderation purposes.", - "version": "7.25.0", - "main": "build/index.js", - "license": "GPL-3.0-or-later", - "keywords": [ - "bot", - "discord-bot", - "moderation", - "automoderation", - "discord-moderation", - "discord-moderation-bot", - "discord-automoderation", - "discord-automoderation-bot" - ], - "homepage": "https://github.com/onesoft-sudo/sudobot", - "icon": "https://res.cloudinary.com/rakinar2/image/upload/v1659628446/SudoBot-new_cvwphw.png", - "readme": "https://github.com/onesoft-sudo/sudobot#readme", - "author": { - "name": "Ar Rakin", - "email": "rakinar2@onesoftnet.eu.org", - "url": "https://virtual-designer.github.io" - }, - "repository": { - "type": "git", - "url": "https://github.com/onesoft-sudo/sudobot" - }, - "bugs": { - "url": "https://github.com/onesoft-sudo/sudobot/issues", - "email": "sudobot@onesoftnet.eu.org" - }, - "dependencies": { - "@prisma/client": "^5.7.1", - "@types/uuid": "^9.0.2", - "ascii-table3": "^0.8.2", - "async-mutex": "^0.4.0", - "axios": "^1.4.0", - "bcrypt": "^5.1.0", - "canvas": "^2.11.2", - "chalk": "^4.1.2", - "cors": "^2.8.5", - "date-fns": "^2.30.0", - "deepmerge": "^4.3.1", - "discord.js": "^14.13.0", - "dot-object": "^2.1.4", - "dotenv": "^16.3.1", - "express": "^4.18.2", - "express-rate-limit": "^6.9.0", - "googleapis": "^126.0.1", - "json5": "^2.2.3", - "jsonwebtoken": "^9.0.1", - "module-alias": "^2.2.3", - "pm2": "^5.3.0", - "reflect-metadata": "^0.1.13", - "semver": "^7.5.4", - "socket.io": "^4.7.2", - "tesseract.js": "^5.0.4", - "tslib": "^2.6.1", - "undici": "^5.23.0", - "uuid": "^9.0.0", - "zod": "^3.21.4" - }, - "devDependencies": { - "@commitlint/cli": "^17.6.6", - "@commitlint/config-conventional": "^17.6.6", - "@types/bcrypt": "^5.0.0", - "@types/cors": "^2.8.13", - "@types/dot-object": "^2.1.2", - "@types/express": "^4.17.17", - "@types/jsonwebtoken": "^9.0.2", - "@types/module-alias": "^2.0.2", - "@types/node": "^20.4.0", - "@types/semver": "^7.5.4", - "husky": "^8.0.3", - "prisma": "^5.7.1", - "ts-node": "^10.9.1", - "typescript": "^5.2.2", - "zod-to-json-schema": "^3.21.4" - }, - "scripts": { - "start": "node build/index.js", - "prepare": "husky install", - "dev": "ts-node src/index.ts", - "dev:watch": "nodemon src/index.ts", - "lint": "eslint src/ --ext .ts", - "lint:fix": "eslint src/ --ext .ts --fix", - "build": "tsc", - "start:prod": "pm2 start ./ecosystem.config.js", - "deploy": "node scripts/deploy-commands.js", - "gen:schema": "node scripts/generate-config-schema.js", - "clean": "rm -frv build; make clean", - "test": "node --test --require ts-node/register tests/**/*.test.ts" - }, - "_moduleAliases": { - "@sudobot": "build" - } + "name": "sudobot", + "description": "A Discord bot for moderation purposes.", + "version": "7.25.0", + "main": "build/index.js", + "license": "GPL-3.0-or-later", + "keywords": [ + "bot", + "discord-bot", + "moderation", + "automoderation", + "discord-moderation", + "discord-moderation-bot", + "discord-automoderation", + "discord-automoderation-bot" + ], + "homepage": "https://github.com/onesoft-sudo/sudobot", + "icon": "https://res.cloudinary.com/rakinar2/image/upload/v1659628446/SudoBot-new_cvwphw.png", + "readme": "https://github.com/onesoft-sudo/sudobot#readme", + "author": { + "name": "Ar Rakin", + "email": "rakinar2@onesoftnet.eu.org", + "url": "https://virtual-designer.github.io" + }, + "repository": { + "type": "git", + "url": "https://github.com/onesoft-sudo/sudobot" + }, + "bugs": { + "url": "https://github.com/onesoft-sudo/sudobot/issues", + "email": "sudobot@onesoftnet.eu.org" + }, + "dependencies": { + "@prisma/client": "^5.7.1", + "@types/uuid": "^9.0.2", + "ascii-table3": "^0.8.2", + "async-mutex": "^0.4.0", + "axios": "^1.4.0", + "bcrypt": "^5.1.0", + "canvas": "^2.11.2", + "chalk": "^4.1.2", + "cors": "^2.8.5", + "date-fns": "^2.30.0", + "deepmerge": "^4.3.1", + "discord.js": "^14.13.0", + "dot-object": "^2.1.4", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "express-rate-limit": "^6.9.0", + "googleapis": "^126.0.1", + "json5": "^2.2.3", + "jsonwebtoken": "^9.0.1", + "module-alias": "^2.2.3", + "pm2": "^5.3.0", + "polyfill-await": "^1.0.0", + "reflect-metadata": "^0.1.13", + "semver": "^7.5.4", + "socket.io": "^4.7.2", + "tesseract.js": "^5.0.4", + "tslib": "^2.6.1", + "undici": "^5.23.0", + "uuid": "^9.0.0", + "zod": "^3.21.4" + }, + "devDependencies": { + "@commitlint/cli": "^17.6.6", + "@commitlint/config-conventional": "^17.6.6", + "@types/bcrypt": "^5.0.0", + "@types/bun": "^1.0.4", + "@types/cors": "^2.8.13", + "@types/dot-object": "^2.1.2", + "@types/express": "^4.17.17", + "@types/jsonwebtoken": "^9.0.2", + "@types/module-alias": "^2.0.2", + "@types/node": "^20.4.0", + "@types/semver": "^7.5.4", + "husky": "^8.0.3", + "prisma": "^5.7.1", + "ts-node": "^10.9.1", + "typescript": "^5.2.2", + "zod-to-json-schema": "^3.21.4" + }, + "scripts": { + "start": "node build/index.js", + "prepare": "husky install", + "dev": "ts-node src/index.ts", + "dev:watch": "nodemon src/index.ts", + "lint": "eslint src/ --ext .ts", + "lint:fix": "eslint src/ --ext .ts --fix", + "build": "tsc", + "start:prod": "pm2 start ./ecosystem.config.js", + "deploy": "node scripts/deploy-commands.js", + "gen:schema": "node scripts/generate-config-schema.js", + "clean": "rm -frv build; make clean", + "test": "node --test --require ts-node/register tests/**/*.test.ts" + }, + "_moduleAliases": { + "@sudobot": "build" + } } diff --git a/src/index.ts b/src/index.ts index f16b6f3ae..85e586e7c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -117,7 +117,7 @@ async function fetchCredentials() { } } -(async () => { +const promise = (async () => { await fetchCredentials(); const client = new Client({ intents, @@ -174,3 +174,8 @@ async function fetchCredentials() { await client.login(process.env.TOKEN); } })(); + +if (process.versions.bun) { + // @ts-ignore + await promise; +} diff --git a/src/polyfills/FileSystem.ts b/src/polyfills/FileSystem.ts new file mode 100644 index 000000000..ef65c5af7 --- /dev/null +++ b/src/polyfills/FileSystem.ts @@ -0,0 +1,28 @@ +import { readFile } from "fs/promises"; + +type ReadFileContentOptions = { + json?: T; +}; + +type ReadFileResult = T extends true ? J : string; + +export default class FileSystem { + static async readFileContents( + path: string, + { json }: ReadFileContentOptions = {} + ): Promise> { + let contents = ""; + + if (process.versions.bun) { + contents = await Bun.file(path).text(); + } else { + contents = await readFile(path, { encoding: "utf-8" }); + } + + if (json) { + return JSON.parse(contents); + } + + return contents as ReadFileResult; + } +} diff --git a/src/services/MetadataService.ts b/src/services/MetadataService.ts index 67e8634d5..c5d845e06 100644 --- a/src/services/MetadataService.ts +++ b/src/services/MetadataService.ts @@ -17,15 +17,21 @@ * along with SudoBot. If not, see . */ +import path from "node:path"; import Service from "../core/Service"; +import FileSystem from "../polyfills/FileSystem"; import { log } from "../utils/logger"; export const name = "metadata"; export default class MetadataService extends Service { - public readonly data = require("../../package.json"); + public data: any = null; + + async boot() { + this.data = await FileSystem.readFileContents(path.resolve(__dirname, "../../package.json"), { + json: true + }); - boot() { log("Successfully loaded system metadata from package.json file"); } } diff --git a/tsconfig.json b/tsconfig.json index 5426335b2..73ead9a20 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,107 +1,24 @@ { "compilerOptions": { - /* Visit https://aka.ms/tsconfig.json to read more about this file */ - /* Projects */ - // "incremental": true, /* Enable incremental compilation */ - // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ - // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ - // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ - // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ - // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ - /* Language and Environment */ + "incremental": true, "target": "ES2021", - /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ - // "jsx": "preserve", /* Specify what JSX code is generated. */ "experimentalDecorators": true, - /* Enable experimental support for TC39 stage 2 draft decorators. */ - // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ - // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ - // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ - // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ - // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ - // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ - // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ - /* Modules */ - "module": "commonjs", - /* Specify what module code is generated. */ + "module": "CommonJS", "rootDir": "./src", - /* Specify the root folder within your source files. */ - // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ - // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ - // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ - // "rootDirs": ["src/", "tests/"], /* Allow multiple folders to be treated as one when resolving modules. */ - // "types": ["node", "jest"], /* Specify type package names to be included without being referenced in a source file. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + "types": ["node", "bun"], "resolveJsonModule": true, - /* Enable importing .json files */ - // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ - /* JavaScript Support */ - // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */ - // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ - // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ - /* Emit */ - "declaration": true /* Generate .d.ts files from TypeScript and JavaScript files in your project. */, - // "declarationMap": true, /* Create sourcemaps for d.ts files. */ - // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ - // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ - // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ + "declaration": true, "outDir": "./build", - /* Specify an output folder for all emitted files. */ - // "removeComments": true, /* Disable emitting comments. */ - // "noEmit": true, /* Disable emitting files from a compilation. */ - "importHelpers": true /* Allow importing helper functions from tslib once per project, instead of including them per-file. */, - // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ - // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ - // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ - // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ - // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ - "newLine": "lf" /* Set the newline character for emitting files. */, - // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ - "noEmitHelpers": true /* Disable generating custom helper functions like `__extends` in compiled output. */, - "noEmitOnError": true /* Disable emitting files if any type checking errors are reported. */, - // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ - // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ - // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ - /* Interop Constraints */ - // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ - "allowSyntheticDefaultImports": true /* Allow 'import x from y' when a module doesn't have a default export. */, + "importHelpers": true, + "newLine": "lf", + "noEmitHelpers": true, + "noEmitOnError": true, + "allowSyntheticDefaultImports": true, "esModuleInterop": true, - /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */ - // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ "forceConsistentCasingInFileNames": true, - /* Ensure that casing is correct in imports. */ - /* Type Checking */ "strict": true, - /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ - // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ - // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ - // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ - // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ - // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ - // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ - // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ - // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ - // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ - // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ - // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ - // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ - // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ - // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ - // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ - /* Completeness */ - // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ "skipLibCheck": true - /* Skip type checking all .d.ts files. */, }, - "include": [ - "./src/types/globals.d.ts", - "src/**/*.ts" - ], + "include": ["./src/types/globals.d.ts", "src/**/*.ts"], "exclude": ["./backup", "./tmp", "./tmp/**", "./scripts", "./tests", "./build", "./extensions", "./docs", "./docs/**"] } From 7062fddda5739e9ec08dc28299b7d994ced978d4 Mon Sep 17 00:00:00 2001 From: Ar Rakin Date: Sun, 28 Jan 2024 21:42:51 +0600 Subject: [PATCH 02/10] refactor: better boot process --- package.json | 199 +++++++++---------- src/bun.ts | 4 + src/core/Client.ts | 340 ++++++++------------------------- src/core/DynamicLoader.ts | 75 ++++++++ src/core/EventListener.ts | 2 +- src/core/ServiceManager.ts | 147 +++----------- src/index.ts | 56 +----- src/services/StartupManager.ts | 24 +++ src/types/Utils.ts | 5 + 9 files changed, 322 insertions(+), 530 deletions(-) create mode 100644 src/bun.ts create mode 100644 src/core/DynamicLoader.ts create mode 100644 src/types/Utils.ts diff --git a/package.json b/package.json index a6adb9e49..84240484f 100644 --- a/package.json +++ b/package.json @@ -1,100 +1,103 @@ { - "name": "sudobot", - "description": "A Discord bot for moderation purposes.", - "version": "7.25.0", - "main": "build/index.js", - "license": "GPL-3.0-or-later", - "keywords": [ - "bot", - "discord-bot", - "moderation", - "automoderation", - "discord-moderation", - "discord-moderation-bot", - "discord-automoderation", - "discord-automoderation-bot" - ], - "homepage": "https://github.com/onesoft-sudo/sudobot", - "icon": "https://res.cloudinary.com/rakinar2/image/upload/v1659628446/SudoBot-new_cvwphw.png", - "readme": "https://github.com/onesoft-sudo/sudobot#readme", - "author": { - "name": "Ar Rakin", - "email": "rakinar2@onesoftnet.eu.org", - "url": "https://virtual-designer.github.io" - }, - "repository": { - "type": "git", - "url": "https://github.com/onesoft-sudo/sudobot" - }, - "bugs": { - "url": "https://github.com/onesoft-sudo/sudobot/issues", - "email": "sudobot@onesoftnet.eu.org" - }, - "dependencies": { - "@prisma/client": "^5.7.1", - "@types/uuid": "^9.0.2", - "ascii-table3": "^0.8.2", - "async-mutex": "^0.4.0", - "axios": "^1.4.0", - "bcrypt": "^5.1.0", - "canvas": "^2.11.2", - "chalk": "^4.1.2", - "cors": "^2.8.5", - "date-fns": "^2.30.0", - "deepmerge": "^4.3.1", - "discord.js": "^14.13.0", - "dot-object": "^2.1.4", - "dotenv": "^16.3.1", - "express": "^4.18.2", - "express-rate-limit": "^6.9.0", - "googleapis": "^126.0.1", - "json5": "^2.2.3", - "jsonwebtoken": "^9.0.1", - "module-alias": "^2.2.3", - "pm2": "^5.3.0", - "polyfill-await": "^1.0.0", - "reflect-metadata": "^0.1.13", - "semver": "^7.5.4", - "socket.io": "^4.7.2", - "tesseract.js": "^5.0.4", - "tslib": "^2.6.1", - "undici": "^5.23.0", - "uuid": "^9.0.0", - "zod": "^3.21.4" - }, - "devDependencies": { - "@commitlint/cli": "^17.6.6", - "@commitlint/config-conventional": "^17.6.6", - "@types/bcrypt": "^5.0.0", - "@types/bun": "^1.0.4", - "@types/cors": "^2.8.13", - "@types/dot-object": "^2.1.2", - "@types/express": "^4.17.17", - "@types/jsonwebtoken": "^9.0.2", - "@types/module-alias": "^2.0.2", - "@types/node": "^20.4.0", - "@types/semver": "^7.5.4", - "husky": "^8.0.3", - "prisma": "^5.7.1", - "ts-node": "^10.9.1", - "typescript": "^5.2.2", - "zod-to-json-schema": "^3.21.4" - }, - "scripts": { - "start": "node build/index.js", - "prepare": "husky install", - "dev": "ts-node src/index.ts", - "dev:watch": "nodemon src/index.ts", - "lint": "eslint src/ --ext .ts", - "lint:fix": "eslint src/ --ext .ts --fix", - "build": "tsc", - "start:prod": "pm2 start ./ecosystem.config.js", - "deploy": "node scripts/deploy-commands.js", - "gen:schema": "node scripts/generate-config-schema.js", - "clean": "rm -frv build; make clean", - "test": "node --test --require ts-node/register tests/**/*.test.ts" - }, - "_moduleAliases": { - "@sudobot": "build" - } + "name": "sudobot", + "description": "A Discord bot for moderation purposes.", + "version": "7.25.0", + "main": "build/index.js", + "type": "module", + "license": "GPL-3.0-or-later", + "keywords": [ + "bot", + "discord-bot", + "moderation", + "automoderation", + "discord-moderation", + "discord-moderation-bot", + "discord-automoderation", + "discord-automoderation-bot" + ], + "homepage": "https://github.com/onesoft-sudo/sudobot", + "icon": "https://res.cloudinary.com/rakinar2/image/upload/v1659628446/SudoBot-new_cvwphw.png", + "readme": "https://github.com/onesoft-sudo/sudobot#readme", + "author": { + "name": "Ar Rakin", + "email": "rakinar2@onesoftnet.eu.org", + "url": "https://virtual-designer.github.io" + }, + "repository": { + "type": "git", + "url": "https://github.com/onesoft-sudo/sudobot" + }, + "bugs": { + "url": "https://github.com/onesoft-sudo/sudobot/issues", + "email": "sudobot@onesoftnet.eu.org" + }, + "dependencies": { + "@prisma/client": "^5.7.1", + "@types/uuid": "^9.0.2", + "ascii-table3": "^0.8.2", + "async-mutex": "^0.4.0", + "axios": "^1.4.0", + "bcrypt": "^5.1.0", + "canvas": "^2.11.2", + "chalk": "^4.1.2", + "cors": "^2.8.5", + "date-fns": "^2.30.0", + "deepmerge": "^4.3.1", + "discord.js": "^14.13.0", + "dot-object": "^2.1.4", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "express-rate-limit": "^6.9.0", + "figlet": "^1.7.0", + "googleapis": "^126.0.1", + "json5": "^2.2.3", + "jsonwebtoken": "^9.0.1", + "module-alias": "^2.2.3", + "pm2": "^5.3.0", + "polyfill-await": "^1.0.0", + "reflect-metadata": "^0.1.13", + "semver": "^7.5.4", + "socket.io": "^4.7.2", + "tesseract.js": "^5.0.4", + "tslib": "^2.6.1", + "undici": "^5.23.0", + "uuid": "^9.0.0", + "zod": "^3.21.4" + }, + "devDependencies": { + "@commitlint/cli": "^17.6.6", + "@commitlint/config-conventional": "^17.6.6", + "@types/bcrypt": "^5.0.0", + "@types/bun": "^1.0.4", + "@types/cors": "^2.8.13", + "@types/dot-object": "^2.1.2", + "@types/express": "^4.17.17", + "@types/figlet": "^1.5.8", + "@types/jsonwebtoken": "^9.0.2", + "@types/module-alias": "^2.0.2", + "@types/node": "^20.4.0", + "@types/semver": "^7.5.4", + "husky": "^8.0.3", + "prisma": "^5.7.1", + "ts-node": "^10.9.1", + "typescript": "^5.2.2", + "zod-to-json-schema": "^3.21.4" + }, + "scripts": { + "start": "node build/index.js", + "start:bun": "bun build/bun.js", + "prepare": "husky install", + "dev": "bun run src/bun.ts", + "lint": "eslint src/ --ext .ts", + "lint:fix": "eslint src/ --ext .ts --fix", + "build": "tsc", + "start:prod": "pm2 start ./ecosystem.config.js", + "deploy": "node scripts/deploy-commands.js", + "gen:schema": "node scripts/generate-config-schema.js", + "clean": "rm -frv build; make clean", + "test": "node --test --require ts-node/register tests/**/*.test.ts" + }, + "_moduleAliases": { + "@sudobot": "build" + } } diff --git a/src/bun.ts b/src/bun.ts new file mode 100644 index 000000000..b23af23a5 --- /dev/null +++ b/src/bun.ts @@ -0,0 +1,4 @@ +import promise from "./index"; + +// @ts-ignore +await promise; diff --git a/src/core/Client.ts b/src/core/Client.ts index e37153976..84e91b81d 100644 --- a/src/core/Client.ts +++ b/src/core/Client.ts @@ -18,10 +18,8 @@ */ import { PrismaClient } from "@prisma/client"; -import { Awaitable, ClientOptions, Collection, Client as DiscordClient, GuildEmoji, UserResolvable } from "discord.js"; -import { Stats } from "fs"; -import fs from "fs/promises"; -import path, { basename, dirname } from "path"; +import { Collection, ClientEvents as DiscordClientEvents, Client as DiscordJSClient } from "discord.js"; +import path from "node:path"; import Server from "../api/Server"; import type AIAutoModService from "../automod/AIAutoModService"; import type Antijoin from "../automod/Antijoin"; @@ -32,7 +30,6 @@ import type MessageFilter from "../automod/MessageFilter"; import type MessageRuleService from "../automod/MessageRuleService"; import type ProfileFilter from "../automod/ProfileFilter"; import type VerificationService from "../automod/VerificationService"; -import { SuppressErrorsMetadata } from "../decorators/SuppressErrors"; import type AFKService from "../services/AFKService"; import type AutoRoleService from "../services/AutoRoleService"; import type BallotManager from "../services/BallotManager"; @@ -61,19 +58,31 @@ import type StatsService from "../services/StatsService"; import type TranslationService from "../services/TranslationService"; import type TriggerService from "../services/TriggerService"; import type WelcomerService from "../services/WelcomerService"; -import { CustomEvents, type ClientEvents } from "../types/ClientEvents"; -import { log, logError, logInfo } from "../utils/logger"; +import { ClientEvents } from "../types/ClientEvents"; import { developmentMode } from "../utils/utils"; import type Command from "./Command"; +import DynamicLoader from "./DynamicLoader"; import ServiceManager from "./ServiceManager"; -export default class Client extends DiscordClient { - aliases = { - "@services": path.resolve(__dirname, "../services"), - "@automod": path.resolve(__dirname, "../automod") +class Client extends DiscordJSClient { + private readonly eventListeners = new Map(); + public readonly commands = new Collection(); + + public readonly prisma = new PrismaClient({ + errorFormat: "pretty", + log: developmentMode() ? ["error", "info", "query", "warn"] : ["error", "info", "warn"] + }); + + public readonly server = new Server(this); + public readonly dynamicLoader = new DynamicLoader(this); + public readonly serviceManager = new ServiceManager(this); + + public readonly aliases = { + automod: path.resolve(__dirname, "../automod"), + services: path.resolve(__dirname, "../services") }; - services = [ + public readonly services = [ "@services/StartupManager", "@services/ConfigManager", "@services/CommandManager", @@ -114,267 +123,84 @@ export default class Client extends DiscordClie "@automod/VerificationService" ]; - commandsDirectory = path.resolve(__dirname, "../commands"); - eventsDirectory = path.resolve(__dirname, "../events"); - - serviceManager = new ServiceManager(this); - - startupManager: StartupManager = {} as StartupManager; - configManager: ConfigManager = {} as ConfigManager; - commandManager: CommandManager = {} as CommandManager; - infractionManager: InfractionManager = {} as InfractionManager; - logger: LoggerService = {} as LoggerService; - messageFilter: MessageFilter = {} as MessageFilter; - antispam: Antispam = {} as Antispam; - queueManager: QueueManager = {} as QueueManager; - snippetManager: SnippetManager = {} as SnippetManager; - welcomerService: WelcomerService = {} as WelcomerService; - antiraid: Antiraid = {} as Antiraid; - channelLockManager: ChannelLockManager = {} as ChannelLockManager; - antijoin: Antijoin = {} as Antijoin; - profileFilter: ProfileFilter = {} as ProfileFilter; - permissionManager: PermissionManager = {} as PermissionManager; - metadata: MetadataService = {} as MetadataService; - quickMute: QuickMuteService = {} as QuickMuteService; - translator: TranslationService = {} as TranslationService; - autoRoleService: AutoRoleService = {} as AutoRoleService; - reactionRoleService: ReactionRoleService = {} as ReactionRoleService; - afkService: AFKService = {} as AFKService; - inviteTracker: InviteTrackerService = {} as InviteTrackerService; - ballotManager: BallotManager = {} as BallotManager; - fileFilter: FileFilterService = {} as FileFilterService; - messageRuleService: MessageRuleService = {} as MessageRuleService; - triggerService: TriggerService = {} as TriggerService; - aiAutoMod: AIAutoModService = {} as AIAutoModService; - extensionService: ExtensionService = {} as ExtensionService; - bumpReminder: BumpReminderService = {} as BumpReminderService; - logServer: LogServer = {} as LogServer; - cooldown: CooldownService = {} as CooldownService; - keypressHandler: KeypressHandlerService = {} as KeypressHandlerService; - verification: VerificationService = {} as VerificationService; - reportService: ReportService = {} as ReportService; - commandPermissionOverwriteManager: CommandPermissionOverwriteManager = {} as CommandPermissionOverwriteManager; - statsService: StatsService = {} as StatsService; - imageRecognitionService: ImageRecognitionService = {} as ImageRecognitionService; - - prisma = new PrismaClient({ - errorFormat: "pretty", - log: developmentMode() ? ["query", "error", "info", "warn"] : ["error", "info", "warn"] - }); - - server = new Server(this); - - commands = new Collection(); - emojiMap = new Collection(); - registeredEvents: string[] = []; - eventMap = new Map(); - - private static _instance: Client; - - static get instance() { - return this._instance; - } - - constructor(options: ClientOptions, { services }: { services?: string[] } = {}) { - super(options); - Client._instance = this; - - if (services) { - this.services = services; - } - } - - async boot() { + startupManager!: StartupManager; + configManager!: ConfigManager; + commandManager!: CommandManager; + infractionManager!: InfractionManager; + logger!: LoggerService; + messageFilter!: MessageFilter; + antispam!: Antispam; + queueManager!: QueueManager; + snippetManager!: SnippetManager; + welcomerService!: WelcomerService; + antiraid!: Antiraid; + channelLockManager!: ChannelLockManager; + antijoin!: Antijoin; + profileFilter!: ProfileFilter; + permissionManager!: PermissionManager; + metadata!: MetadataService; + quickMute!: QuickMuteService; + translator!: TranslationService; + autoRoleService!: AutoRoleService; + reactionRoleService!: ReactionRoleService; + afkService!: AFKService; + inviteTracker!: InviteTrackerService; + ballotManager!: BallotManager; + fileFilter!: FileFilterService; + messageRuleService!: MessageRuleService; + triggerService!: TriggerService; + aiAutoMod!: AIAutoModService; + extensionService!: ExtensionService; + bumpReminder!: BumpReminderService; + logServer!: LogServer; + cooldown!: CooldownService; + keypressHandler!: KeypressHandlerService; + verification!: VerificationService; + reportService!: ReportService; + commandPermissionOverwriteManager!: CommandPermissionOverwriteManager; + statsService!: StatsService; + imageRecognitionService!: ImageRecognitionService; + + async boot({ commands = true, events = true }: { commands?: boolean; events?: boolean } = {}) { await this.serviceManager.loadServices(); - await this.extensionService.bootUp(); - } - async fetchUserSafe(user: UserResolvable) { - try { - return await this.users.fetch(user); - } catch (e) { - logError(e); - return null; + if (events) { + await this.dynamicLoader.loadEvents(); } - } - - async loadCommands( - directory = this.commandsDirectory, - metadataLoader?: Function, - filter?: (path: string, name: string, info: Stats) => Awaitable - ) { - const files = await fs.readdir(directory); - const includeOnly = process.env.COMMANDS?.split(","); - - for (const file of files) { - const filePath = path.join(directory, file); - const info = await fs.lstat(filePath); - const isDirectory = info.isDirectory(); - - if (isDirectory) { - await this.loadCommands(filePath, metadataLoader, filter); - continue; - } - if ((!file.endsWith(".ts") && !file.endsWith(".js")) || file.endsWith(".d.ts")) { - continue; - } - - if (includeOnly && !includeOnly.includes(file.replace(/\.(ts|js)/gi, ""))) { - continue; - } - - if (filter !== undefined && !(await filter(filePath, file, info))) { - continue; - } - - await this.loadCommand(filePath, metadataLoader); + if (commands) { + await this.dynamicLoader.loadCommands(); } } - async loadCommand(filePath: string, metadataLoader?: Function) { - const { default: CommandClass }: { default: new (client: Client) => Command } = await import(filePath); - const command = new CommandClass(this); - command.group = basename(dirname(filePath)); - this.commands.set(command.name, command); - - for (const alias of command.aliases) { - this.commands.set(alias, command); - } + addEventListener(name: K, listener: (...args: ClientEvents[K]) => unknown) { + const handlers = this.eventListeners.get(name) ?? []; - if (!metadataLoader) { - this.loadEventListenersFromMetadata(CommandClass, command); - } else { - metadataLoader(CommandClass, command); - log("Custom metadata loader found"); + if (!this.eventListeners.has(name)) { + this.eventListeners.set(name, handlers); } - logInfo("Loaded command: ", command.name); + handlers.push(listener); + this.on(name as keyof DiscordClientEvents, listener as (...args: DiscordClientEvents[keyof DiscordClientEvents]) => void); } - async loadEvents(directory = this.eventsDirectory) { - const files = await fs.readdir(directory); - - for (const file of files) { - const filePath = path.join(directory, file); - const isDirectory = (await fs.lstat(filePath)).isDirectory(); - - if (isDirectory) { - await this.loadEvents(filePath); - continue; - } - - if ((!file.endsWith(".ts") && !file.endsWith(".js")) || file.endsWith(".d.ts")) { - continue; - } - - await this.loadEvent(filePath, true); - } - } - - async loadEvent(filePath: string, addToList = false) { - const { default: Event } = await import(filePath); - const event = new Event(this); - this.on(event.name, event.execute.bind(event)); - - if (addToList) { - this.registeredEvents.push(event.name); - } - } - - private supressErrorMessagesHandler(suppressErrors: SuppressErrorsMetadata, e: unknown) { - if (suppressErrors.mode === "log") { - logError(e); - } else if (suppressErrors.mode === "disabled") { - throw e; - } - } - - loadEventListenersFromMetadata(Class: I["constructor"], instance?: I) { - const metadata: { event: keyof ClientEvents; handler: Function; methodName: string }[] | undefined = Reflect.getMetadata( - "event_listeners", - Class.prototype - ); - - if (metadata) { - for (const data of metadata) { - const callback = instance ? data.handler.bind(instance) : data.handler; - const suppressErrors: SuppressErrorsMetadata | undefined = Reflect.getMetadata( - "supress_errors", - Class.prototype, - data.methodName - ); - - this.addEventListener( - data.event, - suppressErrors - ? (...args: any[]) => { - try { - const ret = callback(...args); - - if (ret instanceof Promise) ret.catch(e => this.supressErrorMessagesHandler(suppressErrors, e)); - - return ret; - } catch (e) { - this.supressErrorMessagesHandler(suppressErrors, e); - } - } - : callback - ); - } - } - } - - addEventListener(event: K, callback: (...args: ClientEvents[K]) => any) { - const handlers = this.eventMap.get(event) ?? []; - - if (!this.eventMap.has(event) && !CustomEvents.includes(event)) { - this.on(event as any, (...args: any[]) => this.fireEvent(event, ...args)); - log("Registered parent handler for event: ", event); - } - - handlers.push(callback); - this.eventMap.set(event, handlers); - - log("Added event listener for event: ", event); - } - - async emitWait(eventName: K, ...args: ClientEvents[K]) { - const handlers = this.eventMap.get(eventName); - - if (handlers) { - for (const handler of handlers) { - await handler(...args); - } + removeEventListener(name: K, listener?: (...args: ClientEvents[K]) => unknown) { + if (!listener) { + this.eventListeners.delete(name); + this.removeAllListeners(name as keyof DiscordClientEvents); + return; } - } - async getHomeGuild() { - const id = process.env.HOME_GUILD_ID; - - if (!id) { - logError( - "Environment variable `HOME_GUILD_ID` is not set. The bot can't work without it. Please follow the setup guide in the bot documentation." - ); - process.exit(-1); - } + const handlers = this.eventListeners.get(name) ?? []; + const index = handlers.findIndex(handler => handler === listener); - try { - return this.guilds.cache.get(id) || (await this.guilds.fetch(id)); - } catch (e) { - logError(e); - logError("Error fetching home guild: make sure the ID inside `HOME_GUILD_ID` environment variable is correct."); - process.exit(-1); + if (index === -1) { + return; } - } - - fireEvent(name: keyof ClientEvents, ...args: any[]) { - const handlers = this.eventMap.get(name); - if (handlers) { - for (const handler of handlers) { - handler(...args); - } - } + const handler = handlers.splice(index, 1)[0]; + this.off(name as keyof DiscordClientEvents, handler as (...args: DiscordClientEvents[keyof DiscordClientEvents]) => void); } } + +export default Client; diff --git a/src/core/DynamicLoader.ts b/src/core/DynamicLoader.ts new file mode 100644 index 000000000..820b1e53b --- /dev/null +++ b/src/core/DynamicLoader.ts @@ -0,0 +1,75 @@ +import { lstat, readdir } from "node:fs/promises"; +import path from "node:path"; +import { Class, DefaultExport } from "../types/Utils"; +import { logInfo } from "../utils/logger"; +import type Client from "./Client"; +import Command from "./Command"; +import EventListener from "./EventListener"; +import Service from "./Service"; + +class DynamicLoader extends Service { + async iterateDirectoryRecursively(root: string, rootArray?: string[]) { + const filesAndDirectories = await readdir(root); + const files: string[] = []; + + for (const file of filesAndDirectories) { + const filepath = path.resolve(root, file); + const stat = await lstat(filepath); + + if (stat.isDirectory()) { + await this.iterateDirectoryRecursively(filepath, rootArray ?? files); + continue; + } + + (rootArray ?? files).push(filepath); + } + + return files; + } + + async loadEvents() { + const eventListenerFiles = await this.iterateDirectoryRecursively(path.resolve(__dirname, "../events")); + + for (const file of eventListenerFiles) { + if (!file.endsWith(".ts") && !file.endsWith(".js")) { + continue; + } + + await this.loadEvent(file); + } + } + + async loadEvent(filepath: string) { + const { default: EventListenerClass }: DefaultExport> = await import(filepath); + const listener = new EventListenerClass(this.client); + this.client.addEventListener(listener.name, listener.execute.bind(listener)); + logInfo("Loaded Event: ", listener.name); + } + + async loadCommands() { + const commandFiles = await this.iterateDirectoryRecursively(path.resolve(__dirname, "../commands")); + + for (const file of commandFiles) { + if (!file.endsWith(".ts") && !file.endsWith(".js")) { + continue; + } + + await this.loadCommand(file); + } + } + + async loadCommand(filepath: string) { + const { default: CommandClass }: DefaultExport> = await import(filepath); + const command = new CommandClass(this.client); + + this.client.commands.set(command.name, command); + + for (const alias of command.aliases) { + this.client.commands.set(alias, command); + } + + logInfo("Loaded Command: ", command.name); + } +} + +export default DynamicLoader; diff --git a/src/core/EventListener.ts b/src/core/EventListener.ts index e33167862..41beff442 100644 --- a/src/core/EventListener.ts +++ b/src/core/EventListener.ts @@ -20,7 +20,7 @@ import type { ClientEvents } from "../types/ClientEvents"; import type Client from "./Client"; -export default abstract class EventListener { +export default abstract class EventListener { public abstract readonly name: K; constructor(protected client: Client) {} diff --git a/src/core/ServiceManager.ts b/src/core/ServiceManager.ts index a3c4e9834..a7e19c29b 100644 --- a/src/core/ServiceManager.ts +++ b/src/core/ServiceManager.ts @@ -1,144 +1,41 @@ -/** - * This file is part of SudoBot. - * - * Copyright (C) 2021-2023 OSN Developers. - * - * SudoBot is free software; you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * SudoBot is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with SudoBot. If not, see . - */ - -import { lstatSync } from "fs"; -import { readdir } from "fs/promises"; -import { join } from "path"; -import { log, logInfo, logWarn } from "../utils/logger"; -import Client from "./Client"; +import { Class, DefaultExport } from "../types/Utils"; +import { logInfo } from "../utils/logger"; +import type Client from "./Client"; import Service from "./Service"; -type LoadServiceOptions = { - extensionName?: string; - serviceAliasName?: string; - log?: boolean; -}; - export default class ServiceManager { - constructor(protected client: Client) {} + constructor(protected readonly client: Client) {} async loadServices() { - for (const service of this.client.services) { - let replacedService = service; + const serviceFiles = this.client.services.map(service => { + let filepath = service; for (const alias in this.client.aliases) { - replacedService = replacedService.replace(alias, this.client.aliases[alias as keyof typeof this.client.aliases]); + filepath = filepath.replaceAll(`@${alias}`, this.client.aliases[alias as keyof typeof this.client.aliases]); } - await this.loadService(replacedService); - } - } - - async loadService(servicePath: string, { extensionName, serviceAliasName, log = true }: LoadServiceOptions = {}) { - const { default: Service, name } = await import(servicePath); - const wasPreviouslyLoaded = this.wasPreviouslyLoaded(name); - const finalName = extensionName ?? serviceAliasName ?? name; + return filepath; + }); - if (log) { - logInfo(`${wasPreviouslyLoaded ? "Rel" : "L"}oading service: `, finalName); + for (const file of serviceFiles) { + await this.loadService(file); } - - const serviceInstance = new Service(this.client); - this.client[name as "services"] = serviceInstance; - this.client.loadEventListenersFromMetadata(Service, serviceInstance); - await this.serviceLifeCycle(serviceInstance, wasPreviouslyLoaded, finalName); } - wasPreviouslyLoaded(name: string) { - return this.client[name as "services"] instanceof Service; - } + // FIXME: Decorator based event listeners and lifecycle methods + async loadService(filepath: string) { + const { default: ServiceClass, name }: DefaultExport> & { name?: keyof Client } = await import( + filepath + ); - async deactivateService(name: string) { - if (!(this.client[name as "services"] instanceof Service)) { - return; + if (!name) { + throw new Error(`Name is empty for service ${filepath}`); } - logInfo("Deactivated service: ", name); - await (this.client[name as "services"] as any)?.deactivate(); - this.client[name as "services"] = {} as any; - } - - async serviceLifeCycle(serviceInstance: Service, wasPreviouslyLoaded: boolean, finalName: string) { - if (wasPreviouslyLoaded) { - await serviceInstance.deactivate(); - } - - if (!wasPreviouslyLoaded) { - await serviceInstance.boot(); - } - - await serviceInstance.reboot(); - - if (wasPreviouslyLoaded) { - await serviceInstance.rebootNext(); - } - } - - async loadServiceFromFile(path: string, extension?: string) { - const { - default: Service, - name - }: { - name?: string; - default: new (client: Client) => Service; - } = await import(path); + const service = new ServiceClass(this.client); + this.client[name as "startupManager"] = service as any; + await service.boot(); - if (!name && extension) { - logWarn( - `Extension ${extension} has attempted to load a service that does not export a \`name\` constant. (file: ${path})` - ); - return false; - } - - const wasPreviouslyLoaded = !!this.client[name as "services"]; - const finalName = extension ? `${extension}:@services/${name}` : `@services/${name ?? path}`; - - logInfo("Loading service: ", finalName); - - const service = new Service(this.client); - - this.client[name as "services"] = service as any; - this.client.loadEventListenersFromMetadata(Service, service); - - await this.serviceLifeCycle(service, wasPreviouslyLoaded, name ?? path); - return true; - } - - async loadServiceFromDirectory(path: string) { - const files = await readdir(path); - - for (const file of files) { - const filePath = join(path, file); - - if (lstatSync(filePath).isDirectory()) { - await this.loadServiceFromDirectory(filePath); - continue; - } - - if (file.endsWith(".d.ts")) { - continue; - } - - if (file.endsWith(".js") || file.endsWith(".ts")) { - log("Attempting to load service from file: ", filePath); - await this.loadServiceFromFile(filePath); - } - } + logInfo("Loaded Service: ", name); } } diff --git a/src/index.ts b/src/index.ts index 85e586e7c..b5d0ef82a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -122,60 +122,18 @@ const promise = (async () => { const client = new Client({ intents, partials - // makeCache: Options.cacheWithLimits({ - // ...Options.DefaultMakeCacheSettings, - // ReactionManager: 0, - // DMMessageManager: 0, - // GuildForumThreadManager: 0, - // GuildScheduledEventManager: 0, - // VoiceStateManager: 0, - // StageInstanceManager: 0, - // GuildTextThreadManager: 0, - // GuildStickerManager: 0, - // AutoModerationRuleManager: 0, - // ApplicationCommandManager: 0, - // ThreadMemberManager: 0, - // ThreadManager: 0, - // ReactionUserManager: 0, - // GuildMemberManager: 25, - // GuildBanManager: 0, - // GuildEmojiManager: 25, - // GuildInviteManager: 5, - // GuildMessageManager: 50, - // BaseGuildEmojiManager: 5 - // }), - // sweepers: { - // ...Options.DefaultSweeperSettings, - // messages: { - // interval: 1200, // Every 20 minutes. - // lifetime: 600 // Remove messages older than 10 minutes. - // }, - // users: { - // interval: 1200, - // filter: () => user => user.bot && user.id !== user.client.user.id // Remove all bots. - // }, - // guildMembers: { - // interval: 1200, - // filter: () => member => member.user.bot && member.id !== member.client.user.id // Remove all bots. - // } - // } }); spawnNativeProcess(); await client.boot(); - await client.loadEvents(); - await client.loadCommands(); - if (process.env.SERVER_ONLY_MODE) { - await client.server.boot(); - await client.server.start(); - } else { - await client.login(process.env.TOKEN); - } + // if (process.env.SERVER_ONLY_MODE) { + // await client.server.boot(); + // await client.server.start(); + // } else { + // await client.login(process.env.TOKEN); + // } })(); -if (process.versions.bun) { - // @ts-ignore - await promise; -} +export default promise; diff --git a/src/services/StartupManager.ts b/src/services/StartupManager.ts index 629090635..0dfd0dcf9 100644 --- a/src/services/StartupManager.ts +++ b/src/services/StartupManager.ts @@ -18,13 +18,16 @@ */ import axios from "axios"; +import chalk from "chalk"; import { spawnSync } from "child_process"; import { formatDistanceToNowStrict } from "date-fns"; import { APIEmbed, ActivityType, Colors, WebhookClient, escapeCodeBlock } from "discord.js"; +import figlet from "figlet"; import { existsSync, readFileSync } from "fs"; import { rm } from "fs/promises"; import path from "path"; import { gt } from "semver"; +import { version } from "../../package.json"; import Service from "../core/Service"; import { GatewayEventListener } from "../decorators/GatewayEventListener"; import { HasEventListeners } from "../types/HasEventListeners"; @@ -227,4 +230,25 @@ export default class StartupManager extends Service implements HasEventListeners logError(e); } } + + boot() { + return new Promise((resolve, reject) => { + figlet.text( + "SudoBot", + { + font: "Standard" + }, + (error, data) => { + if (error) { + reject(error); + return; + } + + console.info(chalk.blueBright(data)); + console.info(`Version ${chalk.green(version)} -- Booting up`); + resolve(); + } + ); + }); + } } diff --git a/src/types/Utils.ts b/src/types/Utils.ts new file mode 100644 index 000000000..f3dc4b3b5 --- /dev/null +++ b/src/types/Utils.ts @@ -0,0 +1,5 @@ +export type DefaultExport = { + default: T; +}; + +export type Class> = new (...a: A) => I; From 14dec5a9fd559ad4fb118eca082f3b8213b35bee Mon Sep 17 00:00:00 2001 From: Ar Rakin Date: Sun, 28 Jan 2024 22:02:24 +0600 Subject: [PATCH 03/10] fix: loading errors --- package.json | 1 - scripts/deploy-commands.js | 4 +++- src/core/Client.ts | 23 ++++++++++++++++++++++- src/index.ts | 12 ++++++------ src/services/CommandManager.ts | 2 +- 5 files changed, 32 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 84240484f..eb7bc6837 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,6 @@ "description": "A Discord bot for moderation purposes.", "version": "7.25.0", "main": "build/index.js", - "type": "module", "license": "GPL-3.0-or-later", "keywords": [ "bot", diff --git a/scripts/deploy-commands.js b/scripts/deploy-commands.js index 022809ae7..6531aac48 100644 --- a/scripts/deploy-commands.js +++ b/scripts/deploy-commands.js @@ -65,7 +65,9 @@ function makeContextMenuCommandBuilder(command) { intents: [] }); - await client.loadCommands(); + await client.boot({ + events: false + }); for (const [name, command] of client.commands) { if (name.includes("__") || client.commands.get(name)?.name !== name) continue; diff --git a/src/core/Client.ts b/src/core/Client.ts index 84e91b81d..ccd79c1ae 100644 --- a/src/core/Client.ts +++ b/src/core/Client.ts @@ -18,7 +18,7 @@ */ import { PrismaClient } from "@prisma/client"; -import { Collection, ClientEvents as DiscordClientEvents, Client as DiscordJSClient } from "discord.js"; +import { Collection, ClientEvents as DiscordClientEvents, Client as DiscordJSClient, GuildEmoji } from "discord.js"; import path from "node:path"; import Server from "../api/Server"; import type AIAutoModService from "../automod/AIAutoModService"; @@ -67,6 +67,7 @@ import ServiceManager from "./ServiceManager"; class Client extends DiscordJSClient { private readonly eventListeners = new Map(); public readonly commands = new Collection(); + public readonly emojiMap = new Map(); public readonly prisma = new PrismaClient({ errorFormat: "pretty", @@ -173,6 +174,10 @@ class Client extends DiscordJSClient { } } + async getHomeGuild() { + return this.guilds.cache.get(process.env.HOME_GUILD_ID) ?? (await this.guilds.fetch(process.env.HOME_GUILD_ID)); + } + addEventListener(name: K, listener: (...args: ClientEvents[K]) => unknown) { const handlers = this.eventListeners.get(name) ?? []; @@ -201,6 +206,22 @@ class Client extends DiscordJSClient { const handler = handlers.splice(index, 1)[0]; this.off(name as keyof DiscordClientEvents, handler as (...args: DiscordClientEvents[keyof DiscordClientEvents]) => void); } + + emitWaitLocal(name: K, ...args: ClientEvents[K]) { + return new Promise(async (resolve, reject) => { + for (const listener of this.eventListeners.get(name) ?? []) { + await listener(...args); + } + + resolve(); + }); + } + + emitWait(name: K, ...args: ClientEvents[K]) { + for (const listener of this.eventListeners.get(name) ?? []) { + listener(...args); + } + } } export default Client; diff --git a/src/index.ts b/src/index.ts index b5d0ef82a..a0a1f7850 100644 --- a/src/index.ts +++ b/src/index.ts @@ -128,12 +128,12 @@ const promise = (async () => { await client.boot(); - // if (process.env.SERVER_ONLY_MODE) { - // await client.server.boot(); - // await client.server.start(); - // } else { - // await client.login(process.env.TOKEN); - // } + if (process.env.SERVER_ONLY_MODE) { + await client.server.boot(); + await client.server.start(); + } else { + await client.login(process.env.TOKEN); + } })(); export default promise; diff --git a/src/services/CommandManager.ts b/src/services/CommandManager.ts index 0663c51d8..9a14461b9 100644 --- a/src/services/CommandManager.ts +++ b/src/services/CommandManager.ts @@ -214,7 +214,7 @@ export default class CommandManager extends Service { } }; - await this.client.emitWait("command", command.name, handlerObject, command, message, context); + await this.client.emitWaitLocal("command", command.name, handlerObject, command, message, context); await Promise.resolve(); if (handlerObject._stopped) { From 1b707af75490aaa5cee5e59a7eec949c3cfaa0b2 Mon Sep 17 00:00:00 2001 From: Ar Rakin Date: Sun, 28 Jan 2024 23:36:12 +0600 Subject: [PATCH 04/10] feat: supporting old and new decorators for best compatibility --- src/api/Server.ts | 1 + src/commands/moderation/InfractionCommand.ts | 3 +- .../moderation/InfractionDeleteCommand.ts | 3 +- .../moderation/InfractionEditCommand.ts | 3 +- .../moderation/InfractionViewCommand.ts | 3 +- src/commands/moderation/NoteClearCommand.ts | 4 +- src/commands/moderation/NoteCreateCommand.ts | 4 +- src/commands/moderation/NoteListCommand.ts | 4 +- src/commands/moderation/NoteViewCommand.ts | 3 +- src/core/Client.ts | 14 +- src/core/DynamicLoader.ts | 60 ++++++++- src/core/ServiceManager.ts | 7 +- src/decorators/Action.ts | 121 ++++++++++++------ src/decorators/EnableAdminAccessControl.ts | 62 +++++---- src/decorators/EnableGuildAccessControl.ts | 62 +++++---- src/decorators/GatewayEventListener.ts | 39 ++++-- src/decorators/RequireAuth.ts | 62 +++++---- src/decorators/SuppressErrors.ts | 62 +++++---- src/decorators/Validate.ts | 61 +++++---- src/index.ts | 4 + src/services/ExtensionService.ts | 10 +- src/services/KeypressHandlerService.ts | 2 +- tsconfig.json | 3 +- 23 files changed, 404 insertions(+), 193 deletions(-) diff --git a/src/api/Server.ts b/src/api/Server.ts index b2c159564..7bdb052fe 100644 --- a/src/api/Server.ts +++ b/src/api/Server.ts @@ -29,6 +29,7 @@ import { log, logError, logInfo, logWarn } from "../utils/logger"; import Controller from "./Controller"; import Response from "./Response"; +// FIXME: Support new decorators export default class Server { protected expressApp = express(); public readonly port = process.env.PORT ?? 4000; diff --git a/src/commands/moderation/InfractionCommand.ts b/src/commands/moderation/InfractionCommand.ts index a0bf4c31a..197884a0e 100644 --- a/src/commands/moderation/InfractionCommand.ts +++ b/src/commands/moderation/InfractionCommand.ts @@ -20,6 +20,7 @@ import { InfractionType } from "@prisma/client"; import { MessageMentions, PermissionsBitField, SlashCommandBuilder } from "discord.js"; import Command, { ArgumentType, BasicCommandContext, CommandMessage, CommandReturn, ValidationRule } from "../../core/Command"; +import { safeUserFetch } from "../../utils/fetch"; import { isSnowflake } from "../../utils/utils"; const infractionTypes = [ @@ -182,7 +183,7 @@ export default class InfractionCommand extends Command { return; } - const user = await this.client.fetchUserSafe(userId); + const user = await safeUserFetch(this.client, userId); if (!user) { await message.reply(`${this.emoji("error")} That user does not exist!`); diff --git a/src/commands/moderation/InfractionDeleteCommand.ts b/src/commands/moderation/InfractionDeleteCommand.ts index c94f1b898..4ca1f693c 100644 --- a/src/commands/moderation/InfractionDeleteCommand.ts +++ b/src/commands/moderation/InfractionDeleteCommand.ts @@ -19,6 +19,7 @@ import { PermissionsBitField } from "discord.js"; import Command, { ArgumentType, BasicCommandContext, CommandMessage, CommandReturn, ValidationRule } from "../../core/Command"; +import { safeUserFetch } from "../../utils/fetch"; export default class InfractionDeleteCommand extends Command { public readonly name = "infraction__delete"; @@ -55,7 +56,7 @@ export default class InfractionDeleteCommand extends Command { where: { id, guildId: message.guildId! } }); - const user = await this.client.fetchUserSafe(infraction.userId); + const user = await safeUserFetch(this.client, infraction.userId); await this.deferredReply(message, { embeds: [ diff --git a/src/commands/moderation/InfractionEditCommand.ts b/src/commands/moderation/InfractionEditCommand.ts index c64225e21..4f4b77156 100644 --- a/src/commands/moderation/InfractionEditCommand.ts +++ b/src/commands/moderation/InfractionEditCommand.ts @@ -22,6 +22,7 @@ import { ChatInputCommandInteraction, EmbedBuilder, PermissionsBitField } from " import Command, { CommandReturn, ValidationRule } from "../../core/Command"; import { ChatInputCommandContext } from "../../services/CommandManager"; import { stringToTimeInterval } from "../../utils/datetime"; +import { safeUserFetch } from "../../utils/fetch"; export default class InfractionEditCommand extends Command { public readonly name = "infraction__edit"; @@ -87,7 +88,7 @@ export default class InfractionEditCommand extends Command { return; } - const user = await this.client.fetchUserSafe(infraction.userId); + const user = await safeUserFetch(this.client, infraction.userId); if (newDurationSeconds && infraction.queueId) { const queue = this.client.queueManager.queues.get(`${infraction.queueId}`); diff --git a/src/commands/moderation/InfractionViewCommand.ts b/src/commands/moderation/InfractionViewCommand.ts index d4368c284..3d7616bcb 100644 --- a/src/commands/moderation/InfractionViewCommand.ts +++ b/src/commands/moderation/InfractionViewCommand.ts @@ -19,6 +19,7 @@ import { PermissionsBitField } from "discord.js"; import Command, { ArgumentType, BasicCommandContext, CommandMessage, CommandReturn, ValidationRule } from "../../core/Command"; +import { safeUserFetch } from "../../utils/fetch"; export default class InfractionViewCommand extends Command { public readonly name = "infraction__view"; @@ -51,7 +52,7 @@ export default class InfractionViewCommand extends Command { return; } - const user = await this.client.fetchUserSafe(infraction.userId); + const user = await safeUserFetch(this.client, infraction.userId); await this.deferredReply(message, { embeds: [ diff --git a/src/commands/moderation/NoteClearCommand.ts b/src/commands/moderation/NoteClearCommand.ts index ef869a480..2197bfe08 100644 --- a/src/commands/moderation/NoteClearCommand.ts +++ b/src/commands/moderation/NoteClearCommand.ts @@ -20,6 +20,7 @@ import { InfractionType } from "@prisma/client"; import { PermissionsBitField, User } from "discord.js"; import Command, { BasicCommandContext, CommandMessage, CommandReturn, ValidationRule } from "../../core/Command"; +import { safeUserFetch } from "../../utils/fetch"; import { isSnowflake } from "../../utils/utils"; export default class NoteClearCommand extends Command { @@ -39,7 +40,8 @@ export default class NoteClearCommand extends Command { let user: User | null | undefined = context.isLegacy ? undefined : context.options.getUser("user", true); if (context.isLegacy) { - user = await this.client.fetchUserSafe( + user = await safeUserFetch( + this.client, isSnowflake(context.args[0]) ? context.args[0] : context.args[0].substring(context.args[0].includes("!") ? 3 : 2, context.args[0].length - 1) diff --git a/src/commands/moderation/NoteCreateCommand.ts b/src/commands/moderation/NoteCreateCommand.ts index 91f370092..71e9580b6 100644 --- a/src/commands/moderation/NoteCreateCommand.ts +++ b/src/commands/moderation/NoteCreateCommand.ts @@ -20,6 +20,7 @@ import { InfractionType } from "@prisma/client"; import { Message, PermissionsBitField, User } from "discord.js"; import Command, { BasicCommandContext, CommandMessage, CommandReturn, ValidationRule } from "../../core/Command"; +import { safeUserFetch } from "../../utils/fetch"; import { isSnowflake } from "../../utils/utils"; export default class NoteCreateCommand extends Command { @@ -44,7 +45,8 @@ export default class NoteCreateCommand extends Command { let user: User | null | undefined = context.isLegacy ? undefined : context.options.getUser("user", true); if (context.isLegacy) { - user = await this.client.fetchUserSafe( + user = await safeUserFetch( + this.client, isSnowflake(context.args[0]) ? context.args[0] : context.args[0].substring(context.args[0].includes("!") ? 3 : 2, context.args[0].length - 1) diff --git a/src/commands/moderation/NoteListCommand.ts b/src/commands/moderation/NoteListCommand.ts index 219b1a27f..cbb0017c0 100644 --- a/src/commands/moderation/NoteListCommand.ts +++ b/src/commands/moderation/NoteListCommand.ts @@ -21,6 +21,7 @@ import { InfractionType } from "@prisma/client"; import { EmbedBuilder, PermissionsBitField, User, escapeCodeBlock } from "discord.js"; import Command, { BasicCommandContext, CommandMessage, CommandReturn, ValidationRule } from "../../core/Command"; import Pagination from "../../utils/Pagination"; +import { safeUserFetch } from "../../utils/fetch"; import { isSnowflake } from "../../utils/utils"; export default class NoteListCommand extends Command { @@ -40,7 +41,8 @@ export default class NoteListCommand extends Command { let user: User | null | undefined = context.isLegacy ? undefined : context.options.getUser("user", true); if (context.isLegacy) { - user = await this.client.fetchUserSafe( + user = await safeUserFetch( + this.client, isSnowflake(context.args[0]) ? context.args[0] : context.args[0].substring(context.args[0].includes("!") ? 3 : 2, context.args[0].length - 1) diff --git a/src/commands/moderation/NoteViewCommand.ts b/src/commands/moderation/NoteViewCommand.ts index ca2a0c055..f07a70596 100644 --- a/src/commands/moderation/NoteViewCommand.ts +++ b/src/commands/moderation/NoteViewCommand.ts @@ -20,6 +20,7 @@ import { InfractionType } from "@prisma/client"; import { EmbedBuilder, PermissionsBitField } from "discord.js"; import Command, { BasicCommandContext, CommandMessage, CommandReturn, ValidationRule } from "../../core/Command"; +import { safeUserFetch } from "../../utils/fetch"; export default class NoteViewCommand extends Command { public readonly name = "note__view"; @@ -59,7 +60,7 @@ export default class NoteViewCommand extends Command { return; } - const user = await this.client.fetchUserSafe(note.userId); + const user = await safeUserFetch(this.client, note.userId); await this.deferredReply(message, { embeds: [ diff --git a/src/core/Client.ts b/src/core/Client.ts index ccd79c1ae..7c7320836 100644 --- a/src/core/Client.ts +++ b/src/core/Client.ts @@ -18,7 +18,13 @@ */ import { PrismaClient } from "@prisma/client"; -import { Collection, ClientEvents as DiscordClientEvents, Client as DiscordJSClient, GuildEmoji } from "discord.js"; +import { + ClientOptions, + Collection, + ClientEvents as DiscordClientEvents, + Client as DiscordJSClient, + GuildEmoji +} from "discord.js"; import path from "node:path"; import Server from "../api/Server"; import type AIAutoModService from "../automod/AIAutoModService"; @@ -65,6 +71,7 @@ import DynamicLoader from "./DynamicLoader"; import ServiceManager from "./ServiceManager"; class Client extends DiscordJSClient { + public static instance: Client; private readonly eventListeners = new Map(); public readonly commands = new Collection(); public readonly emojiMap = new Map(); @@ -162,6 +169,11 @@ class Client extends DiscordJSClient { statsService!: StatsService; imageRecognitionService!: ImageRecognitionService; + constructor(options: ClientOptions) { + super(options); + Client.instance = this; + } + async boot({ commands = true, events = true }: { commands?: boolean; events?: boolean } = {}) { await this.serviceManager.loadServices(); diff --git a/src/core/DynamicLoader.ts b/src/core/DynamicLoader.ts index 820b1e53b..43b4c70db 100644 --- a/src/core/DynamicLoader.ts +++ b/src/core/DynamicLoader.ts @@ -1,5 +1,8 @@ +import { Awaitable } from "discord.js"; import { lstat, readdir } from "node:fs/promises"; import path from "node:path"; +import { EventListenerInfo } from "../decorators/GatewayEventListener"; +import { ClientEvents } from "../types/ClientEvents"; import { Class, DefaultExport } from "../types/Utils"; import { logInfo } from "../utils/logger"; import type Client from "./Client"; @@ -31,7 +34,7 @@ class DynamicLoader extends Service { const eventListenerFiles = await this.iterateDirectoryRecursively(path.resolve(__dirname, "../events")); for (const file of eventListenerFiles) { - if (!file.endsWith(".ts") && !file.endsWith(".js")) { + if ((!file.endsWith(".ts") && !file.endsWith(".js")) || file.endsWith(".d.ts")) { continue; } @@ -46,19 +49,39 @@ class DynamicLoader extends Service { logInfo("Loaded Event: ", listener.name); } - async loadCommands() { - const commandFiles = await this.iterateDirectoryRecursively(path.resolve(__dirname, "../commands")); + async loadServiceFromDirectory(servicesDirectory = path.resolve(__dirname, "../services")) { + const commandFiles = await this.iterateDirectoryRecursively(servicesDirectory); for (const file of commandFiles) { - if (!file.endsWith(".ts") && !file.endsWith(".js")) { + if ((!file.endsWith(".ts") && !file.endsWith(".js")) || file.endsWith(".d.ts")) { continue; } - await this.loadCommand(file); + await this.client.serviceManager.loadService(file); } } - async loadCommand(filepath: string) { + async loadCommands( + commandsDirectory = path.resolve(__dirname, "../commands"), + loadMetadata: boolean = true, + filter?: (path: string, name: string) => Awaitable + ) { + const commandFiles = await this.iterateDirectoryRecursively(commandsDirectory); + + for (const file of commandFiles) { + if ((!file.endsWith(".ts") && !file.endsWith(".js")) || file.endsWith(".d.ts")) { + continue; + } + + if (filter && !(await filter(file, path.basename(file)))) { + continue; + } + + await this.loadCommand(file, loadMetadata); + } + } + + async loadCommand(filepath: string, loadMetadata = true) { const { default: CommandClass }: DefaultExport> = await import(filepath); const command = new CommandClass(this.client); @@ -68,8 +91,33 @@ class DynamicLoader extends Service { this.client.commands.set(alias, command); } + if (loadMetadata) { + await this.loadEventsFromMetadata(command); + } + logInfo("Loaded Command: ", command.name); } + + async loadEventsFromMetadata(object: object, accessConstructor = true) { + const finalObject = accessConstructor ? object.constructor : object; + + if (!(Symbol.metadata in finalObject)) { + return; + } + + const metadata = finalObject[Symbol.metadata] as { eventListeners?: EventListenerInfo[] }; + + for (const listenerInfo of metadata.eventListeners ?? []) { + this.client.addEventListener( + listenerInfo.event as keyof ClientEvents, + (object[listenerInfo.methodName as unknown as keyof typeof object] as Function).bind(object) + ); + } + + if (metadata.eventListeners) { + logInfo(`Registered ${metadata.eventListeners?.length ?? 0} event listeners`); + } + } } export default DynamicLoader; diff --git a/src/core/ServiceManager.ts b/src/core/ServiceManager.ts index a7e19c29b..07f489d23 100644 --- a/src/core/ServiceManager.ts +++ b/src/core/ServiceManager.ts @@ -34,8 +34,13 @@ export default class ServiceManager { const service = new ServiceClass(this.client); this.client[name as "startupManager"] = service as any; + console.log(service[Symbol.metadata as unknown as keyof typeof service]); + await this.client.dynamicLoader.loadEventsFromMetadata(service); await service.boot(); - logInfo("Loaded Service: ", name); } + + loadServiceFromDirectory(servicesDirectory: string) { + return this.client.dynamicLoader.loadServiceFromDirectory(servicesDirectory); + } } diff --git a/src/decorators/Action.ts b/src/decorators/Action.ts index 4821ab1cd..7aa32787f 100644 --- a/src/decorators/Action.ts +++ b/src/decorators/Action.ts @@ -1,57 +1,98 @@ /* -* This file is part of SudoBot. -* -* Copyright (C) 2021-2023 OSN Developers. -* -* SudoBot is free software; you can redistribute it and/or modify it -* under the terms of the GNU Affero General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* SudoBot is distributed in the hope that it will be useful, but -* WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU Affero General Public License for more details. -* -* You should have received a copy of the GNU Affero General Public License -* along with SudoBot. If not, see . -*/ - -import type Controller from "../api/Controller"; + * This file is part of SudoBot. + * + * Copyright (C) 2021-2023 OSN Developers. + * + * SudoBot is free software; you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SudoBot is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with SudoBot. If not, see . + */ + import { RouteMetadata } from "../types/RouteMetadata"; export function Action(method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE", uri: string, middleware: Function[] = []) { - return (target: Controller, propertyKey: string, descriptor: PropertyDescriptor) => { - const metadata: Record = Reflect.getMetadata("action_methods", target) ?? { - [propertyKey]: { + return ( + originalMethodOrTarget: any, + contextOrMethodName: string | ClassMethodDecoratorContext, + descriptor?: PropertyDescriptor + ) => { + if (typeof contextOrMethodName === "string") { + const metadata: Record = Reflect.getMetadata("action_methods", originalMethodOrTarget) ?? { + [contextOrMethodName]: { + GET: null, + DELETE: null, + PATCH: null, + POST: null, + PUT: null + } as RouteMetadata + }; + + metadata[contextOrMethodName] ??= { GET: null, DELETE: null, PATCH: null, POST: null, PUT: null - } as RouteMetadata - }; + } as RouteMetadata; - metadata[propertyKey] ??= { - GET: null, - DELETE: null, - PATCH: null, - POST: null, - PUT: null - } as RouteMetadata; + const data = { handler: descriptor!.value, method, path: uri, middleware }; - const data = { handler: descriptor.value, method, path: uri, middleware }; + metadata[contextOrMethodName]![method] ??= data; + metadata[contextOrMethodName]![method]!.handler ??= data.handler; + metadata[contextOrMethodName]![method]!.method ??= data.method; - metadata[propertyKey]![method] ??= data; - metadata[propertyKey]![method]!.handler ??= data.handler; - metadata[propertyKey]![method]!.method ??= data.method; + if (metadata[contextOrMethodName]![method]!.middleware?.length) { + metadata[contextOrMethodName]![method]!.middleware.push(...data.middleware); + } else { + metadata[contextOrMethodName]![method]!.middleware = data.middleware; + } - if (metadata[propertyKey]![method]!.middleware?.length) { - metadata[propertyKey]![method]!.middleware.push(...data.middleware); + Reflect.defineMetadata("action_methods", metadata, originalMethodOrTarget); } else { - metadata[propertyKey]![method]!.middleware = data.middleware; - } + const metadata = (contextOrMethodName.metadata?.actionMethods ?? { + [contextOrMethodName.name]: { + GET: null, + DELETE: null, + PATCH: null, + POST: null, + PUT: null + } as RouteMetadata + }) as Record; + + const key = contextOrMethodName.name as keyof typeof metadata; + + metadata[key] ??= { + GET: null, + DELETE: null, + PATCH: null, + POST: null, + PUT: null + } as RouteMetadata; + + const data = { handler: originalMethodOrTarget, method, path: uri, middleware }; - Reflect.defineMetadata("action_methods", metadata, target); + metadata[key]![method] ??= data; + metadata[key]![method]!.handler ??= data.handler; + metadata[key]![method]!.method ??= data.method; + + if (metadata[key]![method]!.middleware?.length) { + metadata[key]![method]!.middleware.push(...data.middleware); + } else { + metadata[key]![method]!.middleware = data.middleware; + } + + (contextOrMethodName.metadata as unknown) ??= {}; + contextOrMethodName.metadata.actionMethods = metadata; + return originalMethodOrTarget; + } }; } diff --git a/src/decorators/EnableAdminAccessControl.ts b/src/decorators/EnableAdminAccessControl.ts index 5301a864f..26b509f89 100644 --- a/src/decorators/EnableAdminAccessControl.ts +++ b/src/decorators/EnableAdminAccessControl.ts @@ -1,34 +1,48 @@ /* -* This file is part of SudoBot. -* -* Copyright (C) 2021-2023 OSN Developers. -* -* SudoBot is free software; you can redistribute it and/or modify it -* under the terms of the GNU Affero General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* SudoBot is distributed in the hope that it will be useful, but -* WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU Affero General Public License for more details. -* -* You should have received a copy of the GNU Affero General Public License -* along with SudoBot. If not, see . -*/ + * This file is part of SudoBot. + * + * Copyright (C) 2021-2023 OSN Developers. + * + * SudoBot is free software; you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SudoBot is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with SudoBot. If not, see . + */ import { NextFunction, Request, Response } from "express"; -import type Controller from "../api/Controller"; import AdminAccessControl from "../api/middleware/AdminAccessControl"; import type Client from "../core/Client"; export function EnableAdminAccessControl() { - return (target: Controller, propertyKey: string, descriptor: PropertyDescriptor) => { - const metadata = Reflect.getMetadata("aac_middleware", target) ?? {}; - const middleware = (client: Client, req: Request, res: Response, next: NextFunction) => - AdminAccessControl(req, res, next); + return ( + originalMethodOrTarget: any, + contextOrMethodName: string | ClassMethodDecoratorContext, + descriptor?: PropertyDescriptor + ) => { + if (typeof contextOrMethodName === "string") { + const metadata = Reflect.getMetadata("aac_middleware", originalMethodOrTarget) ?? {}; + const middleware = (client: Client, req: Request, res: Response, next: NextFunction) => + AdminAccessControl(req, res, next); - metadata[propertyKey] ??= middleware; - Reflect.defineMetadata("aac_middleware", metadata, target); + metadata[contextOrMethodName] ??= middleware; + Reflect.defineMetadata("aac_middleware", metadata, originalMethodOrTarget); + } else { + const metadata = (contextOrMethodName.metadata?.adminAccessControlMiddleware ?? {}) as Record; + const middleware = (client: Client, req: Request, res: Response, next: NextFunction) => + AdminAccessControl(req, res, next); + + metadata[contextOrMethodName.name as keyof typeof metadata] ??= middleware; + (contextOrMethodName.metadata as unknown) ??= {}; + contextOrMethodName.metadata.adminAccessControlMiddleware = metadata; + return originalMethodOrTarget; + } }; } diff --git a/src/decorators/EnableGuildAccessControl.ts b/src/decorators/EnableGuildAccessControl.ts index c0c4590ac..c6e712352 100644 --- a/src/decorators/EnableGuildAccessControl.ts +++ b/src/decorators/EnableGuildAccessControl.ts @@ -1,34 +1,48 @@ /* -* This file is part of SudoBot. -* -* Copyright (C) 2021-2023 OSN Developers. -* -* SudoBot is free software; you can redistribute it and/or modify it -* under the terms of the GNU Affero General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* SudoBot is distributed in the hope that it will be useful, but -* WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU Affero General Public License for more details. -* -* You should have received a copy of the GNU Affero General Public License -* along with SudoBot. If not, see . -*/ + * This file is part of SudoBot. + * + * Copyright (C) 2021-2023 OSN Developers. + * + * SudoBot is free software; you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SudoBot is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with SudoBot. If not, see . + */ import { NextFunction, Request, Response } from "express"; -import type Controller from "../api/Controller"; import GuildAccessControl from "../api/middleware/GuildAccessControl"; import type Client from "../core/Client"; export function EnableGuildAccessControl() { - return (target: Controller, propertyKey: string, descriptor: PropertyDescriptor) => { - const metadata = Reflect.getMetadata("gac_middleware", target) ?? {}; - const middleware = (client: Client, req: Request, res: Response, next: NextFunction) => - GuildAccessControl(req, res, next); + return ( + originalMethodOrTarget: any, + contextOrMethodName: string | ClassMethodDecoratorContext, + descriptor?: PropertyDescriptor + ) => { + if (typeof contextOrMethodName === "string") { + const metadata = Reflect.getMetadata("gac_middleware", originalMethodOrTarget) ?? {}; + const middleware = (client: Client, req: Request, res: Response, next: NextFunction) => + GuildAccessControl(req, res, next); - metadata[propertyKey] ??= middleware; - Reflect.defineMetadata("gac_middleware", metadata, target); + metadata[contextOrMethodName] ??= middleware; + Reflect.defineMetadata("gac_middleware", metadata, originalMethodOrTarget); + } else { + const metadata = (contextOrMethodName.metadata?.guildAccessControlMiddleware ?? {}) as Record; + const middleware = (client: Client, req: Request, res: Response, next: NextFunction) => + GuildAccessControl(req, res, next); + + metadata[contextOrMethodName.name as keyof typeof metadata] ??= middleware; + (contextOrMethodName.metadata as unknown) ??= {}; + contextOrMethodName.metadata.guildAccessControlMiddleware = metadata; + return originalMethodOrTarget; + } }; } diff --git a/src/decorators/GatewayEventListener.ts b/src/decorators/GatewayEventListener.ts index ca9f5f077..845df11a8 100644 --- a/src/decorators/GatewayEventListener.ts +++ b/src/decorators/GatewayEventListener.ts @@ -19,16 +19,39 @@ import type { ClientEvents } from "../types/ClientEvents"; +export type EventListenerInfo = { + event: keyof ClientEvents | "raw"; + methodName: string; +}; + export function GatewayEventListener(event: keyof ClientEvents | "raw") { - return (target: Object, methodName: string, descriptor: TypedPropertyDescriptor) => { - const metadata = Reflect.getMetadata("event_listeners", target) ?? []; + return ( + originalMethodOrTarget: any, + contextOrMethodName: string | ClassMethodDecoratorContext, + descriptor?: PropertyDescriptor + ) => { + if (typeof contextOrMethodName === "string") { + const metadata = Reflect.getMetadata("event_listeners", originalMethodOrTarget) ?? []; + + metadata.push({ + event, + handler: descriptor!.value, + methodName: contextOrMethodName + }); + + Reflect.defineMetadata("event_listeners", metadata, originalMethodOrTarget); + } else { + const methodName = String(contextOrMethodName.name); + const eventListeners = (contextOrMethodName.metadata?.eventListeners as EventListenerInfo[]) ?? []; - metadata.push({ - event, - handler: descriptor.value, - methodName - }); + eventListeners.push({ + event, + methodName + }); - Reflect.defineMetadata("event_listeners", metadata, target); + (contextOrMethodName.metadata as unknown) ??= {}; + contextOrMethodName.metadata.eventListeners = eventListeners; + return originalMethodOrTarget; + } }; } diff --git a/src/decorators/RequireAuth.ts b/src/decorators/RequireAuth.ts index e79429680..bfd4518a7 100644 --- a/src/decorators/RequireAuth.ts +++ b/src/decorators/RequireAuth.ts @@ -1,35 +1,49 @@ /* -* This file is part of SudoBot. -* -* Copyright (C) 2021-2023 OSN Developers. -* -* SudoBot is free software; you can redistribute it and/or modify it -* under the terms of the GNU Affero General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* SudoBot is distributed in the hope that it will be useful, but -* WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU Affero General Public License for more details. -* -* You should have received a copy of the GNU Affero General Public License -* along with SudoBot. If not, see . -*/ + * This file is part of SudoBot. + * + * Copyright (C) 2021-2023 OSN Developers. + * + * SudoBot is free software; you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SudoBot is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with SudoBot. If not, see . + */ import { NextFunction, Request, Response } from "express"; -import type Controller from "../api/Controller"; import RequireAuthMiddleware from "../api/middleware/RequireAuthMiddleware"; import type Client from "../core/Client"; export function RequireAuth(fetchUser = true) { - return (target: Controller, propertyKey: string, descriptor: PropertyDescriptor) => { - const metadata = Reflect.getMetadata("auth_middleware", target) ?? {}; - const middleware = (client: Client, req: Request, res: Response, next: NextFunction) => - RequireAuthMiddleware(client, fetchUser, req, res, next); + return ( + originalMethodOrTarget: any, + contextOrMethodName: string | ClassMethodDecoratorContext, + descriptor?: PropertyDescriptor + ) => { + if (typeof contextOrMethodName === "string") { + const metadata = Reflect.getMetadata("auth_middleware", originalMethodOrTarget) ?? {}; + const middleware = (client: Client, req: Request, res: Response, next: NextFunction) => + RequireAuthMiddleware(client, fetchUser, req, res, next); - metadata[propertyKey] ??= middleware; + metadata[contextOrMethodName] ??= middleware; - Reflect.defineMetadata("auth_middleware", metadata, target); + Reflect.defineMetadata("auth_middleware", metadata, originalMethodOrTarget); + } else { + const metadata = (contextOrMethodName.metadata?.authMiddleware ?? {}) as Record; + const middleware = (client: Client, req: Request, res: Response, next: NextFunction) => + RequireAuthMiddleware(client, fetchUser, req, res, next); + + metadata[contextOrMethodName.name] ??= middleware; + (contextOrMethodName.metadata as unknown) ??= {}; + contextOrMethodName.metadata.authMiddleware = metadata; + return originalMethodOrTarget; + } }; } diff --git a/src/decorators/SuppressErrors.ts b/src/decorators/SuppressErrors.ts index b4ca054bb..991c99d27 100644 --- a/src/decorators/SuppressErrors.ts +++ b/src/decorators/SuppressErrors.ts @@ -1,32 +1,44 @@ /* -* This file is part of SudoBot. -* -* Copyright (C) 2021-2023 OSN Developers. -* -* SudoBot is free software; you can redistribute it and/or modify it -* under the terms of the GNU Affero General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* SudoBot is distributed in the hope that it will be useful, but -* WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU Affero General Public License for more details. -* -* You should have received a copy of the GNU Affero General Public License -* along with SudoBot. If not, see . -*/ + * This file is part of SudoBot. + * + * Copyright (C) 2021-2023 OSN Developers. + * + * SudoBot is free software; you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SudoBot is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with SudoBot. If not, see . + */ export function SuppressErrors() { - return (target: Object, methodName: string, descriptor: TypedPropertyDescriptor) => { - Reflect.defineMetadata( - "suppress_errors", - { + return ( + originalMethodOrTarget: any, + contextOrMethodName: string | ClassMethodDecoratorContext, + descriptor?: PropertyDescriptor + ) => { + if (typeof contextOrMethodName === "string") { + Reflect.defineMetadata( + "suppress_errors", + { + mode: "suppress" + } satisfies SuppressErrorsMetadata, + originalMethodOrTarget, + contextOrMethodName + ); + } else { + (contextOrMethodName.metadata as unknown) ??= {}; + contextOrMethodName.metadata.suppressErrors = { mode: "suppress" - } as SuppressErrorsMetadata, - target, - methodName - ); + } satisfies SuppressErrorsMetadata; + return originalMethodOrTarget; + } }; } diff --git a/src/decorators/Validate.ts b/src/decorators/Validate.ts index 450411a38..fead9f587 100644 --- a/src/decorators/Validate.ts +++ b/src/decorators/Validate.ts @@ -1,37 +1,50 @@ /* -* This file is part of SudoBot. -* -* Copyright (C) 2021-2023 OSN Developers. -* -* SudoBot is free software; you can redistribute it and/or modify it -* under the terms of the GNU Affero General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* SudoBot is distributed in the hope that it will be useful, but -* WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU Affero General Public License for more details. -* -* You should have received a copy of the GNU Affero General Public License -* along with SudoBot. If not, see . -*/ + * This file is part of SudoBot. + * + * Copyright (C) 2021-2023 OSN Developers. + * + * SudoBot is free software; you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SudoBot is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with SudoBot. If not, see . + */ import { NextFunction, Request, Response } from "express"; import { ZodSchema } from "zod"; -import type Controller from "../api/Controller"; import ValidateMiddleware from "../api/middleware/ValidateMiddleware"; import type Client from "../core/Client"; export function Validate(schema: ZodSchema) { - return (target: Controller, propertyKey: string, descriptor: PropertyDescriptor) => { - const metadata = Reflect.getMetadata("validation_middleware", target) ?? {}; + return ( + originalMethodOrTarget: any, + contextOrMethodName: string | ClassMethodDecoratorContext, + descriptor?: PropertyDescriptor + ) => { + if (typeof contextOrMethodName === "string") { + const metadata = Reflect.getMetadata("validation_middleware", originalMethodOrTarget) ?? {}; + const middleware = (client: Client, req: Request, res: Response, next: NextFunction) => + ValidateMiddleware(schema, req, res, next); - const middleware = (client: Client, req: Request, res: Response, next: NextFunction) => - ValidateMiddleware(schema, req, res, next); + metadata[contextOrMethodName] ??= middleware; + Reflect.defineMetadata("validation_middleware", metadata, originalMethodOrTarget); + } else { + const metadata = (contextOrMethodName.metadata?.validationMiddleware ?? {}) as Record; - metadata[propertyKey] ??= middleware; + const middleware = (client: Client, req: Request, res: Response, next: NextFunction) => + ValidateMiddleware(schema, req, res, next); - Reflect.defineMetadata("validation_middleware", metadata, target); + metadata[contextOrMethodName.name] ??= middleware; + (contextOrMethodName.metadata as unknown) ??= {}; + contextOrMethodName.metadata.validationMiddleware = metadata; + return originalMethodOrTarget; + } }; } diff --git a/src/index.ts b/src/index.ts index a0a1f7850..ddd5728b4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -32,6 +32,10 @@ import { sudoPrefix } from "./utils/utils"; global.bootDate = Date.now(); +if (!Symbol.metadata) { + (Symbol as unknown as Record).metadata ??= Symbol("metadata"); +} + const intents = [ GatewayIntentBits.Guilds, GatewayIntentBits.MessageContent, diff --git a/src/services/ExtensionService.ts b/src/services/ExtensionService.ts index a85c1383f..68ee70739 100644 --- a/src/services/ExtensionService.ts +++ b/src/services/ExtensionService.ts @@ -328,28 +328,28 @@ export default class ExtensionService extends Service { } } else if (services) { for (const servicePath of services) { - await this.client.serviceManager.loadServiceFromFile(servicePath); + await this.client.serviceManager.loadService(servicePath); } } } else { for (const servicePath of servicePaths) { - await this.client.serviceManager.loadServiceFromFile(servicePath); + await this.client.serviceManager.loadService(servicePath); } } if (commandPaths === null) { if (commandsDirectory) { if (existsSync(commandsDirectory)) { - await this.client.loadCommands(commandsDirectory); + await this.client.dynamicLoader.loadCommands(commandsDirectory); } } else if (commands) { for (const commandPath of commands) { - await this.client.loadCommand(commandPath); + await this.client.dynamicLoader.loadCommand(commandPath); } } } else { for (const commandPath of commandPaths) { - await this.client.loadCommand(commandPath); + await this.client.dynamicLoader.loadCommand(commandPath); } } diff --git a/src/services/KeypressHandlerService.ts b/src/services/KeypressHandlerService.ts index cc1134a17..c53c4f5ff 100644 --- a/src/services/KeypressHandlerService.ts +++ b/src/services/KeypressHandlerService.ts @@ -110,7 +110,7 @@ export default class KeypressHandlerService extends Service { logWithLevel(LogLevel.EVENT, "Hot reloading commands"); - await this.client.loadCommands(undefined, undefined, async filePath => { + await this.client.dynamicLoader.loadCommands(undefined, false, async filePath => { if (failed) { return false; } diff --git a/tsconfig.json b/tsconfig.json index 73ead9a20..c547b59d7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,8 +1,7 @@ { "compilerOptions": { "incremental": true, - "target": "ES2021", - "experimentalDecorators": true, + "target": "ES2022", "module": "CommonJS", "rootDir": "./src", "types": ["node", "bun"], From 314a9be3ad33dfe1d784f23b41160491453d97a6 Mon Sep 17 00:00:00 2001 From: Ar Rakin Date: Sun, 28 Jan 2024 23:46:13 +0600 Subject: [PATCH 05/10] fix(runtime:bun): decorators not working --- src/core/DynamicLoader.ts | 12 ++++++------ src/core/ServiceManager.ts | 1 - 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/core/DynamicLoader.ts b/src/core/DynamicLoader.ts index 43b4c70db..bab05a4c6 100644 --- a/src/core/DynamicLoader.ts +++ b/src/core/DynamicLoader.ts @@ -100,12 +100,12 @@ class DynamicLoader extends Service { async loadEventsFromMetadata(object: object, accessConstructor = true) { const finalObject = accessConstructor ? object.constructor : object; - - if (!(Symbol.metadata in finalObject)) { - return; - } - - const metadata = finalObject[Symbol.metadata] as { eventListeners?: EventListenerInfo[] }; + const metadata = + Symbol.metadata in finalObject + ? (finalObject[Symbol.metadata] as { eventListeners?: EventListenerInfo[] }) + : { + eventListeners: Reflect.getMetadata("event_listeners", (finalObject as any).prototype) + }; for (const listenerInfo of metadata.eventListeners ?? []) { this.client.addEventListener( diff --git a/src/core/ServiceManager.ts b/src/core/ServiceManager.ts index 07f489d23..2fc4e9af2 100644 --- a/src/core/ServiceManager.ts +++ b/src/core/ServiceManager.ts @@ -34,7 +34,6 @@ export default class ServiceManager { const service = new ServiceClass(this.client); this.client[name as "startupManager"] = service as any; - console.log(service[Symbol.metadata as unknown as keyof typeof service]); await this.client.dynamicLoader.loadEventsFromMetadata(service); await service.boot(); logInfo("Loaded Service: ", name); From 2f170d4eb2393c8bb1664b98069b9c57f8526d91 Mon Sep 17 00:00:00 2001 From: Ar Rakin Date: Sun, 28 Jan 2024 23:49:10 +0600 Subject: [PATCH 06/10] chore(deps): remove unavailable deps --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index eb7bc6837..a284fb64d 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,6 @@ "jsonwebtoken": "^9.0.1", "module-alias": "^2.2.3", "pm2": "^5.3.0", - "polyfill-await": "^1.0.0", "reflect-metadata": "^0.1.13", "semver": "^7.5.4", "socket.io": "^4.7.2", From 11e6f70d3de9d95d9141de98068df52ab993ec02 Mon Sep 17 00:00:00 2001 From: Ar Rakin Date: Mon, 29 Jan 2024 21:22:19 +0600 Subject: [PATCH 07/10] feat: dynamic event loading and unloading --- src/core/DynamicLoader.ts | 41 ++++++++++++++++++++++---- src/core/Service.ts | 2 -- src/core/ServiceManager.ts | 14 +++++++-- src/services/KeypressHandlerService.ts | 4 +-- 4 files changed, 49 insertions(+), 12 deletions(-) diff --git a/src/core/DynamicLoader.ts b/src/core/DynamicLoader.ts index bab05a4c6..561645ac7 100644 --- a/src/core/DynamicLoader.ts +++ b/src/core/DynamicLoader.ts @@ -11,7 +11,9 @@ import EventListener from "./EventListener"; import Service from "./Service"; class DynamicLoader extends Service { - async iterateDirectoryRecursively(root: string, rootArray?: string[]) { + protected readonly eventHandlers = new WeakMap>(); + + private async iterateDirectoryRecursively(root: string, rootArray?: string[]) { const filesAndDirectories = await readdir(root); const files: string[] = []; @@ -84,6 +86,11 @@ class DynamicLoader extends Service { async loadCommand(filepath: string, loadMetadata = true) { const { default: CommandClass }: DefaultExport> = await import(filepath); const command = new CommandClass(this.client); + const previousCommand = this.client.commands.get(command.name); + + if (loadMetadata && previousCommand) { + await this.unloadEventsFromMetadata(previousCommand); + } this.client.commands.set(command.name, command); @@ -107,17 +114,41 @@ class DynamicLoader extends Service { eventListeners: Reflect.getMetadata("event_listeners", (finalObject as any).prototype) }; + const handlerData = this.eventHandlers.get(object) ?? ({} as Record); + for (const listenerInfo of metadata.eventListeners ?? []) { - this.client.addEventListener( - listenerInfo.event as keyof ClientEvents, - (object[listenerInfo.methodName as unknown as keyof typeof object] as Function).bind(object) - ); + const callback = object[listenerInfo.methodName as unknown as keyof typeof object] as Function; + const handler = callback.bind(object); + handlerData[listenerInfo.event as keyof typeof handlerData] ??= [] as Function[]; + handlerData[listenerInfo.event as keyof typeof handlerData].push(handler); + + this.client.addEventListener(listenerInfo.event as keyof ClientEvents, handler); } + this.eventHandlers.set(object, handlerData); + if (metadata.eventListeners) { logInfo(`Registered ${metadata.eventListeners?.length ?? 0} event listeners`); } } + + async unloadEventsFromMetadata(object: object) { + const handlerData = this.eventHandlers.get(object) ?? ({} as Record); + let count = 0; + + for (const event in handlerData) { + for (const callback of handlerData[event as keyof typeof handlerData]) { + this.client.removeEventListener( + event as keyof ClientEvents, + callback as (...args: ClientEvents[keyof ClientEvents]) => any + ); + } + + count += handlerData[event as keyof typeof handlerData].length; + } + + logInfo(`Unloaded ${count} event listeners`); + } } export default DynamicLoader; diff --git a/src/core/Service.ts b/src/core/Service.ts index 78c86220c..040ef51e2 100644 --- a/src/core/Service.ts +++ b/src/core/Service.ts @@ -23,7 +23,5 @@ export default abstract class Service { constructor(protected client: Client) {} boot(): any {} - reboot(): any {} - rebootNext(): any {} deactivate(): any {} } diff --git a/src/core/ServiceManager.ts b/src/core/ServiceManager.ts index 2fc4e9af2..b4a572552 100644 --- a/src/core/ServiceManager.ts +++ b/src/core/ServiceManager.ts @@ -22,9 +22,8 @@ export default class ServiceManager { } } - // FIXME: Decorator based event listeners and lifecycle methods async loadService(filepath: string) { - const { default: ServiceClass, name }: DefaultExport> & { name?: keyof Client } = await import( + const { default: ServiceClass, name }: DefaultExport> & { name?: string } = await import( filepath ); @@ -32,11 +31,20 @@ export default class ServiceManager { throw new Error(`Name is empty for service ${filepath}`); } + const previousServiceInstance = this.client[name as "startupManager"]; const service = new ServiceClass(this.client); + + if (previousServiceInstance) { + logInfo(`Previous instance of service ${name} found. Deactivating`); + await this.client.dynamicLoader.unloadEventsFromMetadata(previousServiceInstance); + await previousServiceInstance.deactivate(); + } + this.client[name as "startupManager"] = service as any; await this.client.dynamicLoader.loadEventsFromMetadata(service); await service.boot(); - logInfo("Loaded Service: ", name); + + logInfo(`${previousServiceInstance ? "Rel" : "L"}oaded Service: `, name); } loadServiceFromDirectory(servicesDirectory: string) { diff --git a/src/services/KeypressHandlerService.ts b/src/services/KeypressHandlerService.ts index c53c4f5ff..8b12d78c7 100644 --- a/src/services/KeypressHandlerService.ts +++ b/src/services/KeypressHandlerService.ts @@ -110,7 +110,7 @@ export default class KeypressHandlerService extends Service { logWithLevel(LogLevel.EVENT, "Hot reloading commands"); - await this.client.dynamicLoader.loadCommands(undefined, false, async filePath => { + await this.client.dynamicLoader.loadCommands(undefined, true, async filePath => { if (failed) { return false; } @@ -128,7 +128,7 @@ export default class KeypressHandlerService extends Service { return false; } - if (!built) { + if (!built && !__filename.endsWith(".ts")) { const currentDirectory = cwd(); chdir(path.resolve(__dirname, "../..")); From 64c58f5b3f8ab2af0da0a41410faef35378192ae Mon Sep 17 00:00:00 2001 From: Ar Rakin Date: Mon, 29 Jan 2024 22:44:37 +0600 Subject: [PATCH 08/10] refactor(api:server): organized code --- package.json | 4 +- src/api/Server.ts | 257 +++++++++++++++++++------------------- src/core/DynamicLoader.ts | 27 +++- 3 files changed, 155 insertions(+), 133 deletions(-) diff --git a/package.json b/package.json index a284fb64d..04c6c2ef2 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "email": "sudobot@onesoftnet.eu.org" }, "dependencies": { - "@prisma/client": "^5.7.1", + "@prisma/client": "^5.8.1", "@types/uuid": "^9.0.2", "ascii-table3": "^0.8.2", "async-mutex": "^0.4.0", @@ -76,7 +76,7 @@ "@types/node": "^20.4.0", "@types/semver": "^7.5.4", "husky": "^8.0.3", - "prisma": "^5.7.1", + "prisma": "^5.8.1", "ts-node": "^10.9.1", "typescript": "^5.2.2", "zod-to-json-schema": "^3.21.4" diff --git a/src/api/Server.ts b/src/api/Server.ts index 7bdb052fe..36cb28cea 100644 --- a/src/api/Server.ts +++ b/src/api/Server.ts @@ -19,24 +19,34 @@ import cors from "cors"; import express, { Request as ExpressRequest, Response as ExpressResponse, NextFunction } from "express"; -import rateLimit from "express-rate-limit"; -import fs from "fs/promises"; +import ratelimiter from "express-rate-limit"; +import { Router } from "express-serve-static-core"; import { Server as HttpServer } from "http"; -import { join, resolve } from "path"; import Client from "../core/Client"; -import { RouteMetadata } from "../types/RouteMetadata"; -import { log, logError, logInfo, logWarn } from "../utils/logger"; +import { RouteMetadata, RouteMetadataEntry } from "../types/RouteMetadata"; +import { log, logInfo, logWarn } from "../utils/logger"; import Controller from "./Controller"; import Response from "./Response"; // FIXME: Support new decorators export default class Server { - protected expressApp = express(); + protected readonly expressApp = express(); + protected readonly rateLimiter = ratelimiter({ + windowMs: 30 * 1000, + max: 28, + standardHeaders: true, + legacyHeaders: false + }); + protected readonly configRateLimiter = ratelimiter({ + windowMs: 10 * 1000, + max: 7, + standardHeaders: true, + legacyHeaders: false + }); public readonly port = process.env.PORT ?? 4000; - protected controllersDirectory = resolve(__dirname, "controllers"); - expressServer?: HttpServer; + public expressServer?: HttpServer; - constructor(protected client: Client) {} + constructor(protected readonly client: Client) {} async onReady() { if (this.client.configManager.systemConfig.api.enabled) { @@ -45,143 +55,134 @@ export default class Server { } async boot() { - const router = express.Router(); - await this.loadControllers(undefined, router); - - this.expressApp.use((err: unknown, req: ExpressRequest, res: ExpressResponse, next: NextFunction) => { - if (err instanceof SyntaxError && "status" in err && err.status === 400 && "body" in err) { - res.status(400).json({ - error: "Invalid JSON payload" - }); - - return; - } - }); - + this.expressApp.use(this.onError); this.expressApp.use(cors()); - const limiter = rateLimit({ - windowMs: 30 * 1000, - max: 28, - standardHeaders: true, - legacyHeaders: false - }); - - const configLimiter = rateLimit({ - windowMs: 10 * 1000, - max: 7, - standardHeaders: true, - legacyHeaders: false - }); - if (this.client.configManager.systemConfig.trust_proxies !== undefined) { logInfo("Set express trust proxy option value to ", this.client.configManager.systemConfig.trust_proxies); this.expressApp.set("trust proxy", this.client.configManager.systemConfig.trust_proxies); } - this.expressApp.use(limiter); - this.expressApp.use("/config", configLimiter); + this.expressApp.use(this.rateLimiter); + this.expressApp.use("/config", this.configRateLimiter); this.expressApp.use(express.json()); + + const router = await this.createRouter(); this.expressApp.use("/", router); } - async loadControllers(directory = this.controllersDirectory, router: express.Router) { - const files = await fs.readdir(directory); + async createRouter() { + const router = express.Router(); + await this.client.dynamicLoader.loadControllers(router); + return router; + } - for (const file of files) { - const filePath = join(directory, file); - const isDirectory = (await fs.lstat(filePath)).isDirectory(); + loadController(controller: Controller, controllerClass: typeof Controller, router: Router) { + const actions = ( + Symbol.metadata in controllerClass && controllerClass[Symbol.metadata] + ? controllerClass[Symbol.metadata]?.actionMethods + : Reflect.getMetadata("action_methods", controllerClass.prototype) + ) as Record | null; + const aacMiddlewareList = ( + Symbol.metadata in controllerClass && controllerClass[Symbol.metadata] + ? controllerClass[Symbol.metadata]?.adminAccessControlMiddleware + : Reflect.getMetadata("aac_middleware", controllerClass.prototype) + ) as Record | null; + const gacMiddlewareList = ( + Symbol.metadata in controllerClass && controllerClass[Symbol.metadata] + ? controllerClass[Symbol.metadata]?.guildAccessControlMiddleware + : Reflect.getMetadata("gac_middleware", controllerClass.prototype) + ) as Record | null; + const requireAuthMiddlewareList = ( + Symbol.metadata in controllerClass && controllerClass[Symbol.metadata] + ? controllerClass[Symbol.metadata]?.authMiddleware + : Reflect.getMetadata("auth_middleware", controllerClass.prototype) + ) as Record | null; + const validationMiddlewareList = ( + Symbol.metadata in controllerClass && controllerClass[Symbol.metadata] + ? controllerClass[Symbol.metadata]?.validationMiddleware + : Reflect.getMetadata("validation_middleware", controllerClass.prototype) + ) as Record | null; + + if (!actions) { + return; + } - if (isDirectory) { - await this.loadControllers(filePath, router); - continue; - } + for (const callbackName in actions) { + for (const method in actions[callbackName]) { + const data = actions[callbackName][ + method as keyof (typeof actions)[keyof typeof actions] + ] as RouteMetadataEntry | null; - if ((!file.endsWith(".ts") && !file.endsWith(".js")) || file.endsWith(".d.ts")) { - continue; + if (!data) { + continue; + } + + const middleware = []; + + if (requireAuthMiddlewareList?.[callbackName]) { + middleware.push(requireAuthMiddlewareList?.[callbackName]); + } + + if (aacMiddlewareList?.[callbackName]) { + middleware.push(aacMiddlewareList?.[callbackName]); + } + + if (gacMiddlewareList?.[callbackName]) { + middleware.push(gacMiddlewareList?.[callbackName]); + } + + if (validationMiddlewareList?.[callbackName]) { + middleware.push(validationMiddlewareList?.[callbackName]); + } + + middleware.push(...(data.middleware ?? [])); + + const wrappedMiddleware = middleware.map( + m => (request: ExpressRequest, response: ExpressResponse, next: NextFunction) => + m(this.client, request, response, next) + ); + + router[data.method.toLowerCase() as "head"].call( + router, + data.path, + ...(wrappedMiddleware as []), + this.wrapControllerAction(controller, callbackName) + ); + + log(`Discovered API Route: ${data.method} ${data.path} -- in ${controllerClass.name}`); } + } + } - const { default: ControllerClass } = await import(filePath); - const controller: Controller = new ControllerClass(this.client); - - const metadata: Record | undefined = Reflect.getMetadata( - "action_methods", - ControllerClass.prototype - ); - - const authMiddleware = Reflect.getMetadata("auth_middleware", ControllerClass.prototype) ?? {}; - const gacMiddleware = Reflect.getMetadata("gac_middleware", ControllerClass.prototype) ?? {}; - const aacMiddleware = Reflect.getMetadata("aac_middleware", ControllerClass.prototype) ?? {}; - const validatonMiddleware = Reflect.getMetadata("validation_middleware", ControllerClass.prototype) ?? {}; - - if (metadata) { - for (const methodName in metadata) { - if (!metadata[methodName]) { - continue; - } - - for (const method in metadata[methodName]!) { - const data = metadata[methodName][method as keyof RouteMetadata]!; - - if (!data) { - continue; - } - - const { middleware, handler, path } = data; - - if (!handler) { - continue; - } - - if (!path) { - logError(`[Server] No path specified at function ${handler.name} in controller ${file}. Skipping.`); - continue; - } - - if (method && !["GET", "POST", "HEAD", "PUT", "PATCH", "DELETE"].includes(method)) { - logError( - `[Server] Invalid method '${method}' specified at function ${handler.name} in controller ${file}. Skipping.` - ); - continue; - } - - log(`Added handler for ${method?.toUpperCase() ?? "GET"} ${path}`); - - const finalMiddlewareArray = [ - ...(authMiddleware[methodName] ? [authMiddleware[methodName]] : []), - ...(gacMiddleware[methodName] ? [gacMiddleware[methodName]] : []), - ...(aacMiddleware[methodName] ? [aacMiddleware[methodName]] : []), - ...(validatonMiddleware[methodName] ? [validatonMiddleware[methodName]] : []), - ...(middleware ?? []) - ]; - - (router[(method?.toLowerCase() ?? "get") as keyof typeof router] as Function)( - path, - ...(finalMiddlewareArray?.map( - fn => (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => - fn(this.client, req, res, next) - ) ?? []), - async (req: ExpressRequest, res: ExpressResponse) => { - const userResponse = await handler.bind(controller)(req, res); - - if (!res.headersSent) { - if (userResponse instanceof Response) { - userResponse.send(res); - } else if (userResponse && typeof userResponse === "object") { - res.json(userResponse); - } else if (typeof userResponse === "string") { - res.send(userResponse); - } else if (typeof userResponse === "number") { - res.send(userResponse.toString()); - } else { - logWarn("Invalid value was returned from the controller. Not sending a response."); - } - } - } - ); - } + wrapControllerAction(controller: Controller, callbackName: string) { + return async (request: ExpressRequest, response: ExpressResponse) => { + const callback = controller[callbackName as keyof typeof controller] as Function; + const controllerResponse = await callback.call(controller, request, response); + + if (!response.headersSent) { + if (controllerResponse instanceof Response) { + controllerResponse.send(response); + } else if (controllerResponse && typeof controllerResponse === "object") { + response.json(controllerResponse); + } else if (typeof controllerResponse === "string") { + response.send(controllerResponse); + } else if (typeof controllerResponse === "number") { + response.send(controllerResponse.toString()); + } else { + logWarn("Invalid value was returned from the controller. Not sending a response."); } } + }; + } + + onError(err: unknown, req: ExpressRequest, res: ExpressResponse, next: NextFunction) { + if (err instanceof SyntaxError && "status" in err && err.status === 400 && "body" in err) { + res.status(400).json({ + error: "Invalid JSON payload" + }); + + return; } } diff --git a/src/core/DynamicLoader.ts b/src/core/DynamicLoader.ts index 561645ac7..e1b1e4c72 100644 --- a/src/core/DynamicLoader.ts +++ b/src/core/DynamicLoader.ts @@ -1,10 +1,12 @@ import { Awaitable } from "discord.js"; +import { Router } from "express"; import { lstat, readdir } from "node:fs/promises"; import path from "node:path"; +import Controller from "../api/Controller"; import { EventListenerInfo } from "../decorators/GatewayEventListener"; import { ClientEvents } from "../types/ClientEvents"; import { Class, DefaultExport } from "../types/Utils"; -import { logInfo } from "../utils/logger"; +import { log, logInfo } from "../utils/logger"; import type Client from "./Client"; import Command from "./Command"; import EventListener from "./EventListener"; @@ -32,6 +34,25 @@ class DynamicLoader extends Service { return files; } + async loadControllers(router: Router) { + const eventListenerFiles = await this.iterateDirectoryRecursively(path.resolve(__dirname, "../api/controllers")); + + for (const file of eventListenerFiles) { + if ((!file.endsWith(".ts") && !file.endsWith(".js")) || file.endsWith(".d.ts")) { + continue; + } + + await this.loadController(file, router); + } + } + + async loadController(filepath: string, router: Router) { + const { default: ControllerClass }: DefaultExport> = await import(filepath); + const controller = new ControllerClass(this.client); + this.client.server.loadController(controller, ControllerClass, router); + logInfo("Loaded Controller: ", ControllerClass.name); + } + async loadEvents() { const eventListenerFiles = await this.iterateDirectoryRecursively(path.resolve(__dirname, "../events")); @@ -128,7 +149,7 @@ class DynamicLoader extends Service { this.eventHandlers.set(object, handlerData); if (metadata.eventListeners) { - logInfo(`Registered ${metadata.eventListeners?.length ?? 0} event listeners`); + log(`Registered ${metadata.eventListeners?.length ?? 0} event listeners`); } } @@ -147,7 +168,7 @@ class DynamicLoader extends Service { count += handlerData[event as keyof typeof handlerData].length; } - logInfo(`Unloaded ${count} event listeners`); + log(`Unloaded ${count} event listeners`); } } From eee3cb5bc9b7f11bd5ed9a9aef8add17c8e13d33 Mon Sep 17 00:00:00 2001 From: Ar Rakin Date: Tue, 30 Jan 2024 22:59:57 +0600 Subject: [PATCH 09/10] fix: remove unneeded logging --- src/commands/moderation/BanCommand.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/commands/moderation/BanCommand.ts b/src/commands/moderation/BanCommand.ts index 851e70099..e9ebe79c7 100644 --- a/src/commands/moderation/BanCommand.ts +++ b/src/commands/moderation/BanCommand.ts @@ -28,7 +28,7 @@ import { } from "discord.js"; import Command, { ArgumentType, BasicCommandContext, CommandMessage, CommandReturn, ValidationRule } from "../../core/Command"; import { stringToTimeInterval } from "../../utils/datetime"; -import { logError, logSuccess } from "../../utils/logger"; +import { logError } from "../../utils/logger"; import { createModerationEmbed } from "../../utils/utils"; export default class BanCommand extends Command { @@ -167,8 +167,6 @@ export default class BanCommand extends Command { logError(e); } - logSuccess("DEBUGGG", reason); - const id = await this.client.infractionManager.createUserBan(user, { guild: message.guild!, moderator: message.member!.user as User, From e08af0aa0cf28cb372d7e2ac5982ae27d5eaa70a Mon Sep 17 00:00:00 2001 From: Ar Rakin Date: Wed, 31 Jan 2024 00:05:59 +0600 Subject: [PATCH 10/10] docs: add v8 release information page --- docs/app/(docs)/whats-new-in-v8/page.mdx | 49 ++++++++++++++++++++++ docs/components/MDX/ImageWithSkeleton.tsx | 30 +++++++++++++ docs/images/sudobot-v8.png | Bin 0 -> 254597 bytes docs/mdx-components.tsx | 11 +++++ docs/styles/ImageWithSkeleton.module.css | 15 +++++++ 5 files changed, 105 insertions(+) create mode 100644 docs/app/(docs)/whats-new-in-v8/page.mdx create mode 100644 docs/components/MDX/ImageWithSkeleton.tsx create mode 100755 docs/images/sudobot-v8.png create mode 100644 docs/styles/ImageWithSkeleton.module.css diff --git a/docs/app/(docs)/whats-new-in-v8/page.mdx b/docs/app/(docs)/whats-new-in-v8/page.mdx new file mode 100644 index 000000000..b7eef7c80 --- /dev/null +++ b/docs/app/(docs)/whats-new-in-v8/page.mdx @@ -0,0 +1,49 @@ +--- +title: "What's new in v8.0? - SudoBot" +short_name: "What's new in v8.0?" +--- + +import sudobot8 from '@/images/sudobot-v8.png'; + +# Introducing SudoBot v8.0! + + + +Wishing a happy new year to everyone out there! We've released version 8.0 of SudoBot, as always, packed with a bunch of new features, fixes and improvements! If you have any questions or suggestions, feel free to let us know! + +## Changes + +### Features + +* Now Fully Supporting [Bun](https://bun.sh)! During performance tests, SudoBot's performance was 25% better when using Bun instead of Node.js +* Authentication and Loading Environment Variables using a Credential Server +* URL Filtering by Crawling **[Experimental]** +* Embed Text Filter +* Image Text Filtering + +### Improvements and Refactorings + +* Refactored all the decorators to support TypeScript 5 Decorators as well as the old experimental decorators, to support bun +* Refactored the HTTP Server class + +### Fixes + +* Minor performance fixes + +## Updating + +To update your instance, simply download the [latest release](https://github.com/onesoft-sudo/sudobot/releases/latest), or run the `-update` command. +You can also use [Git](https://git-scm.com) to update your instance, by running this command: + +```bash +git pull origin main +``` +However, this will update your instance to the latest **unstable** version. \ No newline at end of file diff --git a/docs/components/MDX/ImageWithSkeleton.tsx b/docs/components/MDX/ImageWithSkeleton.tsx new file mode 100644 index 000000000..317a9a8f9 --- /dev/null +++ b/docs/components/MDX/ImageWithSkeleton.tsx @@ -0,0 +1,30 @@ +"use client"; + +import { ComponentProps, FC, useState } from "react"; +import Image from "next/image"; +import styles from "@/styles/ImageWithSkeleton.module.css"; + +type ImageWithSkeletonProps = ComponentProps; + +const ImageWithSkeleton: FC = ({ ...imageProps }) => { + const [isLoaded, setIsLoaded] = useState(false); + const { onLoad, ...finalImageProps } = imageProps; + + return ( +
+ { + setIsLoaded(true); + }} + {...finalImageProps} + /> + {!isLoaded && ( +
+ )} +
+ ); +}; + +export default ImageWithSkeleton; diff --git a/docs/images/sudobot-v8.png b/docs/images/sudobot-v8.png new file mode 100755 index 0000000000000000000000000000000000000000..d875d946d703d1046c6995b5fa7fa37899f6daff GIT binary patch literal 254597 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�d9#XjsB_^Elhd!CK{Ib?IEjIKxu4iY%OZY0j6{&;&nCug)i9(ed^f6k^yaA%6W18aX)ZehMuF4l;X zn0GnMXif4flFOcg-GeTod-BbV(NyYfXXYq4K&rxK-G=sFd}aIjpF>kIo(ys<`h&W< z(X}mamQSc8W<;k?uXrU7EA+Km9m6h2{n7m5fJYpt45HlZMPwYAy=eGj0WM*Hi!xHmT=s>%o(@Z3cvBC^F1t za1)ygL>kBKDysk5|F+JH)&&62t3!g-yH7>@c7C+KKWD^kB!M8Yt`7#fq-kbZ5&fLC z-ucA2GVmhhuKxiHb(;36hP8XFU1C zX^JnUl@eaYD2c;U%cG%dy!oHT%ud15web4G@BGs0g!LaF>lNG@r&XnU%c_|qXX07m>yss`}S&x!mZx$zi^O@A*gZz7|@ z%5R2qG(?-!%YDQoYCZ`KFCBT!<2=MMZxR=OfmCd=B**E;e3=DLQzcjPo@l`k?>CmR zCgV3OB_414k}Z0RTddMTN%$R*c{%MqB;F=1!+kD3U!i=Fjtr#Mh=5QMa8oetfE3Gk z=*#x&NBYcxanij$<1-D(0`Jl4U}9KWeR}xpRurS|uZ_rhn+$Q>5eRv`#c9+x%&yvs z4P`*GNQ7`Q-mClyWq9xD<4xHY(N878t@kBv8kdV2X_xZ)?&H?*R|wB@p0HUDb-B0m z=vD6Z+K&3EY=TNpuQ$}AfqP`D!G2D^uTuWa1EQ$nwF`{b;b_+Z8ub-uC}72RLb%_q zwz=NzJ{wy`T~KBiH@BfGtSrH=oha||AZvJdF?T(HsPF!Uy(}K-_Cc@WQCK(bYY`&M z@>Hsz$Gt^bwfxGa1>}Ia+9|K)whFeg*u5{+TcPap^}_SX@_qwYx&cK~5S@QKu$#aNS?zxsHWgzyQJTUJ=OmsMQTHN`W}|f4e7?{^B$C_`U;M9y zxrQym&o`%W=Qi-*ex$U`h9IvOETBqmTE;g5S8bK(LMvMxS#r_u=)Kztmy8A6OGe%k zeJP(&vkh!3IcQnb<@Xp0(QBLO8-RcNhmE4VQWgmH4M+C?2`Y#@8BoQM0m1GTP(-Z*pQ+t!gG0;b5$o9l|L-7L1aJ?7xZ$bVSgzQ4)@ z49LI|i}!T_r>AtU&Zhw5RKH$fg&bA@m4Bx14?5n8-3ImTDMkZ0gggu?fr}|PJf1ql zlyDcQ;@;_?10|IXhrA40GOmaay2h>nZIwX%-`v68T(?9R$ONc6HIE3^S@zAlASITV zqM#IX&XL6RgSH0a!`EX~U@@$_(nJ2sB=bP=_>QMh_?TF3qjz_r@%2uhl)xpYL*7tJ z_uvL%gR!}9e5Ekk6~#>7n~tm^0$a~eZg2ceTV(;I){lmnDLH1v$0!)9(Q@o&iQV1H z3ZcYgqv+%>Ao?-I_e+)dwLihz^f{gNd++Wvl?l%lM7C^mY+%bUq10ZlqmwMcG4wG+ z@;XREQ_2W7<$GX;F^BYN$z`uxm~U-aU7&b}skPHDY*zyItqaHk=~4wVCW&X4dV zCY7DjU1{Q<1N>yu-pKNP=HnE+tAKj*!wB?Oxr1w@1?xuKvEbR=br1_H#U7Ne5_|Op z{9zUF<`gR;u?}iG6=(N56v5zsjjKBo_%=tQ?B02V)3ZmE80{%2>H$NkDoh5aW6|3c6-Ux;#!q zMgA42SN^f$Fzn~&`tPl0&o=`Beo3T*dIAm=fy8`^03U!xZ42qGw(wgHOTGlXp($|+ zvBXVnPr5MbY|l6mKgZ2sDV2puhGq1MqK~S84qGZo@x83oo~wh z)n3#agvqZae5YQ1+qyYfGIb)?VwY+41HF`!Jx%mygyGj1j%FTwdhjgWo)knf{o+=0 zASptUJhdaG#^}WW2fvdaWkh#fgwgumd1G~Vpmv1f2Jq66RjSd)E$<#{zi=E zR`lsFf||cAF@ar5W;AQ9Q|g=C2?4pd7IuLo3%CebjM@x+Jm~O2bFK{pLp{sOU2y!x zDU)$vJ0NgL%zlZwsjrON;?!4@?TPLEY%BrlXl)=rXu)N4WcAu9%UAIM zEdoZL`UB+OmA-N)1&tfw=BdIk)7&2`0e!BOsqH=#AacP}T7bxfTB4b9Z0rmy-*e3H z6ih9~!&>ykw!P6#CzZ70BwBv=ba(g4&sFXTZpoUsK!&*T!)WwycF%u+h4?XdO~{C^ zt0yw6z75JFfYI)@XUyb8fyq8Vr(*&a{Y{={{bG`vpPjMO4_e;9WZEp=Y2o{8r!m}eh)k` z8Co`eVM2jGc|#UZDImOVHGw;5>FUMnEh|3-{jU1=Rh`dkI1x`7FFvjqGE;HETijU}YpX4ATjNsScNtqc#p9FadhSeXs#mJ7Ob zK!ynCtpXwh=$5j949?Yt_2wvFpiz*wB1{sf<~Iy=Ae#E_<+ZiGw?zPW{b<~4Z(03^ z_erVoqoe=VF|saWybW+4UREn`EmVU{@9sC<>4ooq=5rfzrMl#w-^P5@e9#maYCO-j zw^NM{p<6mlV>SNaGzA+B>Gy1$w2~ae}xm%Q$|>fg3G}5 z#X;l@Jy7Ik^8l2aWoXK>1q!$QG^C2Zw1Y_gX5D3PJKDmP8bMgoS8uLiZ2R>G>4&)R z;p{9EE4IU1Jo8VY(g1D*hN*9P-{$w0|ExqZCNR&#b+d##5A8^H*|SLBr+er2E&>2Xf2OJ|hIZG3{*&5!LEZ>~`3%sTRs3DT}S86<6jp zCwJM}K6c?0M#pNW&knrBZm}&f{AYC3QSfqsJX)Ao6NG|kwFZFj;KI~s2VJGonbf-g zWRj|JrMudiG*-zC7~yEdOh`?fZlkN|8%|a}b_`hl43u13dwdS@E9-kgEU}jW;d!9V z>^tCt`tyU)`RIp-0m(YO#SBv|wqFtSbT}%|;+Xxi>JOOtJ+m}na`Vbhr*`0n5%SHQ zc(pJ&!7^IKo1zZ|rZXb5rc^Rqjz}h^jf@;rn3F(La7L_b1yl-&xVrOee^D+B)E0L3Pc~P7ZyvG%+bC#Qd-)O5+aaZ262C~^+94?%60%tTeeo~*oQZCp zX8QcW(=%I~z`yFT5q?Ypi}8Up_-6nU_1&B_tFK=MAXmCL+>_GGd9HeH-?{QE?wA}v zJbXjz+g?RPnI;Zdq1=x@)&V}h)jHePD@Bj!)YpL@RU%x7w-w3YfMwg@;)KLy2r_X# zebyl9{qmCdmIM_&ZU${aF z|Lx`{MkC^v)PI>9r98N0RThZ*=NiG^>9$bf=ecf6@ng}u|y5Q(UV;Wq}ugTsMLOmrBCn$*}PFd`Z zfuw*RG%hg+-W_o0w7;M7Bup3s9GX{9B2BoGbgkwT?6CK6Oa!oXJETD)U4F&7UT7Fy zM=tO+{)dfvXzpun4Hs9S;+T$)EhgT?Wa_%hDvKkQJh;ZnLS>jFf9MN{xx>BYqFDv) z5e|kjoVt=Fs>Ukp(VECjvj%f>ebu$y{AYciI4l@*&S2-5vv1z^@J!n-QGCFx(I4Ht z_BTC%Xe+JitlSnn<8?-yT~$~#v$vP>aNfPAj%yo)5YZfaGaZqF z$$+g$!+@eN-=?p`#xU!-sAPS!k!1fM~VX7?E_m$oR&1*`5Vs_@%v--!NVZ+n-AU4_I$m&HL3DQ zZ+WE{w=}1)&=bQTMo0put^9Bx`EYB$X?ZMYj}KhnKOXG1PR{#ozf`A09OBL%bGHF# z=l-M{s%JcJY0`58bt9#@L~a(ceog+BW&1A51GIKc@)^I#=Ogry>sWiOd|Y-%6$+1V?Ze`f`E$_i?Po?FoXX;qWeOs&XFuYS*87#Nt%mea7ia;Z59#rD*uUNb zMUV*rU_NU27MSIs)YB^(c2j#>k?<2mh#6mrbh-pmEekm#C(eTBZBY>swBqiDW9g76 z>k^R{k$&dV?SHt_V*w!cM9B5eaN0#sN@%D*z#*dlcRu1kG+|NI*p^@Rg%PGwa!)f~ zQSzOJji?G|>HX~Q(Ipn>iEd$)Ha?$S)$EJLS1J@D`af3B_SMjZ@oD&ExxR2;Ffr*| z%Hp@VcoX%M&;Ivv78JQ0HdMa?Y*8rCUDEXnX>lS`p<<`z4U102631oxjDRC%=9@bS zfMHm>KCPgUq+BZJ%ca&G^xfV9XUguP%Sv$uhRuzPjC3A}a;_b% zx&Js4^m;e~#x5ft?5gry*v4GCCCgO6M9{@WAIFKqgt7uKb*C{}w2- zJ{s+uzRLi6b(+tv-}sk))Au8^z1n>ehAcs&vQ1=k7=kODgH@%el~ce-Qa`c_>%U%P zmNeL^&)KwTo-(DBy(%Ag110{qt^f6FxoB%*7Tx-?wY79i?t+uH#XuUkJ4QsUzLKALIsZ9q+@St(EJmoy1&q=OX`I)WmRt-3$BEF!myQ z6xSB!0dJCl>eh7{(;}}};u+8kM;L-G#l9bu1JGGhL|9*c_a8I!?Fqr|agBi8EtZ>^ z=XH+>1e+`T={PC=NOW;m@O@N5%6|u>X=na8?3Tj-sO0TdmV|qAH6ttS(d@AjFoOb@ zj-bWgSeL$sRAza2_RJ|oJR3ce#VJ@j8^qe3BXe_FV2{jE-7yR>J4o&$4)jT+=9>Ka z>Coe4C*fLEzx&TirT^;Crupe7gP89!HlZ2+*%-Td!M)xR&1g``yz6CAhfy^~x`Fgo z$@EOOK$?X{#!^>m{%ZQ8A5y)Y%yS>u(1|M8Tq4=~p8-d-a76+nMbnB22b7e=2_>jz2op}h@}X z=-A2E0a6|q7~JslRo$UL;^zn!xiyEkl#_qD{=7IjxZ<_?Q~YEsj8m+qJ2W_3=7%1di7?zFp$Y zBu=q!E@uk)SiG3>;Mt$Pg4cU}G>Xh3MzR2&@WGmD&sC2$+kz_qP@%(hc`D>O?_0rk zr=J&%tU<4`-e??^@^9^3f+lC7yG_P$B=CPpIEtW>yXg= zYn{HT&MfH8b`HW|YAC7j`EN9sm6ujRfGLM;!Odt&ER=AtDKPrEJ~tQm zStaH^2*=QmhG`eu$GcXWhT<;0krU#!U9Qx6!|?v!)`yy{lnZKAY^vD ziFM77T6mpi77pKL`nr!JX|#;z_Pk(0!<*fYY9<_gO8|MX2&>R+50W%)-QNh??!xaS zb+ISbn|(}wXB!-%J<8G8WuL%bk&F)(PE_SdOw&(HF)r0^SY_#WOZ0|HhkdzBWQ&k( zaVnwd%LrOO%y=kDUD_&gU;)(iG_k7|FYa4K9tc-<0{3NXD0P1jzIKpm037DHwXM*m zo~KIy*T{od=l9U!_|=gtpaC@u$)m1|od~>Vfsh+BDYylLl&WdN2+xCXF5xGh2`D%A zLtX*peiJEGi1fD>Sm&uug457W_(`;Wz9qLwY@$WnhekKnEr`!6D+rSJ|L(NDj0U>Zqe{-`?W$& z-HIobP3sfgn3Riu>uyS#4U|m3yQhJ^Y#L%wm%DJWUD#uZDsrf4-Q=n6!2a5c0b&33 zRpYQ4I$`_3=#H)2DG#&K(X=Wbt(F3h=d1F=Uh8b8Anqs_z)u=C(}C(r=)nx0ZU|yM zCnuD&1na+hQ2PUkS4NwNXfmWFprJE*YL?C%$6G-zMt?Cah~Q0m5e20L4^;NoQAzKDIrMi z?I|sX=9m{>cB7*6R&_jDXDON$JU;7emHh?ROE^^PQLjGZQd9A)Grb`ie>5T@%MB&_ z4l;eYx}W3Mnt(cTUA^@b+%h>r!nOMJmt0*?%$w%zCjc^t$K%RL8G7XYl~MJ%>HSJg zil>CE#(yQKWFdQN2DINy`&&DFPf0{IOiUX$8ur`V_79IburrhN&mKM{Bsq`x%HVev z)=mb|m2zmYe|y{K-y1rxbcN99u2P*75-GhhF`0b2KIv>F4`qo?@HdK{yH0kOycjO% zyGKQ8CBofutS}4tkmJ~x@XMUHKvBk0e#13PSkaQ#T`hdFR|_sh{zKiJwHHuWmk3c0%=iID;`dU>gH9*->Q!)b^`Sb+H(ROojw|aYe;!4--_0q%z4$l*oT=x?c$cN{lXNL1> zzC}3FE%t&gg~LPEOloIACy(VwnM$Ul&#cN&)y@1RVL-snLFa>{Eko{DCLmu&lZEOp z{QpOh=S%khLv>h_1WlD{vya#3BSC!K0XfHzEu(z&%FOk%@T<+-!SY{3C7Xj&O zAz1XJNgh%)GXOEwKSW{XRO;U(HF3W@F&eNc9omY^0KChOi*t`XiNRt{x3xltv6Gvq zet3<_h>5^T8RQoTy;lEzv&b#Gw_~uorV0Xn;F38{KmW!SQMA~!aXuh^v(hiuK7L74 zb|mC8dkLfZ`y1)18Y{Ex(=-*Pk&=T74+v+{xpT8pW;Z1*e;0;1A;Q!ZJ1pP5S0=Ex zu77yb%^RLa7 zJ;A3nF9}2Cy#QZ(2yZRVGq5#{0O6^@G(I@|y@L%s>Ko%T;a& zmz3qElOO?_0rNfW6>;c)oWbk*8q`|(H>DqD@xLt8kGF_la44Li0*GwXA6uXt;=8ps z`qJjMzVFUth-~b16SBH)3Y_* zc2CWQy0CeltJem<4hBiob7!nLSd$y%zsZjO?eO=V^(1{fFdA5r$hmntQy44>I>N76 za@-p`|10lpXzBXhjFSy`z7rL>Oh~pm-8|^c#lh7DxLIJ#nHMyiF!&|GAjEWBh3^9Mq)^K1pFLiYC}q zLq(`IaSlg+7r_iaR|*?mUhKA>B$)O5uCA^ONb{*+NpZ3c+aDx3RKCx#f$8(l7%l0t z?*nByEBAX-Hxoo+FC!2B%m~5&khXSsfEEBk&X9X(hcelpWI9?Qc+Y--aCgX3Z8JS$ zbyU?puwhf)MNJCtbiW6(?RNOI`!MW}TqI{BgeeTpM{>HgaH>6*v`5`XJ#E>m+A~Y`Q@Qmw zYKJWw)%fj2Wi?JERP+(af&S(rl8t?ThF5d`!z0hU0Gqc1ToCK)B)zvpLHeJ10u_GW#E?X6_zGd+b zY^2v8ePP$+3ucB=zw)~i%vKg&s-GirBm?mF=S-{Ilv5$uim%IkWX z^AX6uE_dAzxQsf4Tsscp^#qs-&ss+vD1ibj`+ReJG#TZ(1=#?TRi>iUu#$wGj36#`nJjKSqDN)^_F}t!p-| zt_qJdq|PczMr`?0-2#eYjtP3gJ?6P&V3QZ~m;(KO=MQ7DE`42J#|1@lHoWqwVRkq$R?9;dRfffC98Jl^;KS8)|CrP2(5!b+vKe0PdxhOISApj6-$Go zc@-O|KW{^r<1*4KYCpfV$o-IRL^dKN>%+64_EpYCs$c};4t+hd2OsOo%3Y=psPB=e8v?7<=k_|b6AB_;!<6oC4E{a1l5@M9 zUv@-4JF**__Ttv~w?%A|D{|iznxGS+MSH@5O0in3QLg66uYw;IQ@7N7S=lECRXjtZ zF3$0Ghf)bC;Ehj@m%eDnm@}D3LnG=S#*-xci4<-@65hRx6GNH zD&z0kjdYA^af?)jvq|+GJYvY}M;7X6>6p^GhiSSAza=_r$(*%)FO#4N<*uDh2c0Mn zv zx|$%1x#Lqq@o)(*r2z5_jh}$xiRmjLq6;o3hbnK62iu=653QEHZ3TQ~toCcGqfhV9 zho>mtMqGVRM|&HQ%-K`jIEIiP>py0aQTiKMOV=%@Yk#RcgX?7AZm;z}%3RjXGM^T^ zyZhOkA~{&yG5&{tVeRnMKdzCNExs0>#g$!Q!ATdSvGY6E{e8xD}sb`hu> z_Ug5txULN21N`*CuYZAl{lC$bH`{-NS>EA(pid;?9vrC1uKXir@i#?uU3`@>AnP-c z0FScGb;-26XXUM(vS~wuNJArrilzNaU7Im?-z}JIp?~)@U>yf@=Jm;F;{3$t9~JSL zuDrj)NK}6XRq4y<%x(9Yq)Vd%lQUhvBg8O03m549NcZ->HRZ^1_j1tdF=om5ZbUM- zua2uu|JO%~&Z$5Z(DnsSkKtSV=ug&M&ZYMI>oC^|P6)OTGhdj7KHkb#-h!8mj=s-P zD&s1*5nsh7-wnqT=PW+c(nDS##`=>5z^ckpd=h-5X11pLKXHA&v8pcnzVlWXi*=_@ zQRTLyj3KDpI%LH5v_D_}qtE5sS+QgKnD94!yYuwQU6t8uQN0yUVn%G35rR8o(V`XQ zJ=z#eRMs+UXl^EuBOUPy<&SvVPPL6fV%q7GeCrx0u(VPy21E>yYat(AHE_{RyU ztKV(}EV{E^Lbdbz?%;yB`b^-4@IJ5g8=Gz-oogC(yW*`)&SMN6cX=!FR5-XI<`CC{ zy$z(Yq756H)jE9|m?Qgty*&q0awZ2(f?6oyu`>YHZm{dXwoR|cazd-C!9i5PLY(^H zv+=|!X}1tpo%ZI(6vI%|uo<4X${ za;D|-{eMaF1VM3`>)wBg#oR+hONPp&=;Bac{#D*6P_($5?hTa7Zk>jS(DuZNecz^r z%f`Ca$1Eem8p`I>(833K7Umvr7rVsvx`Zn(xL6onP+?B+|8v)t_ySi3j!Zz=S-ajT zzP?0kTzv1&ld-k=^_nHs8~hp_F0ob4teAjIJNJ+1S$E{K9yleVk%!?H`(F_==NB1@ z^|ufoP_ZU^Qje|x6%c%=0to8=H4!IUIJ>rL`03?@zKXM2a8Dqk@{e68H}2Uq$V9apyg*JGh6p?8nyGJvNc18H_P#cB{3=wky<&}5*jZVZv$JNk7y zv#FOwQXdztC%%_?wbpcTz)Iwggw>?asa<7chHnVoVdKv`4U-0!5kpuA2(#*qJAA?N)%7dG~lA_5X<@o9;wg1A;tN+K=cR)3@b=?L~ z5kXNv>7Y`T4hqr{6$v0H(tAgG?+{QyM4Bd)AYDL^-g{B1^d`MTq!U6E2uKNeJKX#I z<-K>t(4jIC&)IvGx#pT{pX85z&n0!vGBH-mzy85@$QWr?=vp}GU-Wn9sVB4X>c^WR z6$3So_8s!1+|D{w`GZGXf7f{7N`cM#p?wG^ZCfY9Bl*vPL4Ny@!OY$_?a3foX~bYK zR<+vnUmdZK^}}8E`t*MogOCF)>5r}pA=#9c*sknpR;hI`$v);$kXcRl{0hWoaO9W4 zA8c>j84@z!a!Q|G-Jj{^lZ$rvwr*@X|2FR|FwOhKwNjZWCXS8#@5@Zao4!q5Ahagn zm1@249<0xOB&^C*(k~Fi8PAe6{dCRhRWD#Bg2BJ* zda_yf8^u3aJQ`pjzoQQ ziig7w*uyl_Bb?JDHvFylwT<3P6GLTGqJHxVQXz^MI2?byBfk;apE3dtkRhg}|L2No zQ`%@OKedR8kDlh{PB-|2oFqTdK>FT+ENA~Pn7%XNi@`|Ph>?bR@mzlwL45PkLo!HS z<8^?B{`>m+V{Q+mKH?=D3s%DB{DKJ*mrY5gc0tCG7|eALf_GqLSL{_8;|)@me}<0_ zd(BykRvH}jD%4N+J8~3g7&DLjvg#NxN-vWydJhY;Inp|w;3uy%`pmU4mFU|Dl7K* zcy^f2hQJN=^e*A16*qj0=Y7l_8KLwyEut3v-5ZaBkN&h!%n;pa?LBbQ|L0_AFNRJ5h-Cc9)@G&W0rll#wV{kZ)*zeREYN= z{m_P8iG}`TsU`ITj3P$}A2xx&lXtw*<)~z^r;gc00|nP;>x1K;1@R>QlQ@htVzBkj z9A03kE{PZ-|DUVV!so_jsDUr$#b!R2F>hnb;&dWKrF2g=CC|yXh^MCF#%z!ZJL_dF z@0PCjdDn6Nmj48Hw~;XNSVA;$y&o~&CxzVmbfS50)%XAY{;$eTao+G*ijMc5=B2Pg z{6_a8SdkptM|?{gg5&lWA^oz^R-0;6t~zS+)>VtcVV|H0Sk5gbF`s~T*iuK7fP8*E z{ukZ5sgiBs)cjXhSQ^||_RKA>eM!_8&vM_iy(3^_(y~3k`fRnm5SM!O(Vz={Aek(^ zOLI@`aF)J>JuQm++eH2!B zLPVOz8pX__X;%K@g zjjGCD<=gm&<)0nj>bFFbN(_%wO%4=A8cbFbRPC&WkorgQpI`KCVPu!7{IJjM*yyW2}el!jw(>=Tq8I{l~CFn;nsGWEYp zk0@=pyr+1cIsD1;6L@l6`PV&~F65VNN{$ykli8G29R~OQ#4;URB>5Wm1088@Zhq^i z!AS++bO8OLAD(?(jnEBbnn1knXx#rBOksHCE(t`rY%K#oj`1+{m0;q3!q5;ePqnJ3 zoG=7E=bwqTDOF_*dNCn6(5tV-E>YjbcYd)%Ull#P!o1`9k9SlUqTD5q5cE3=eM@70B5xwDG6&>| zZ@(J&0^Qok*4j~^c0G1wuUo6%Nb?8huUBG;A`qqI8c}f@dhCz92 z`0P_pO*2p!ZgmxM8tWY`SN;AiAIy{%_=hvM0wOHQ*PHvRWhNhXT4U9xMHTE^4=qg^ zmHMAguw-!1X4RVDks4t*zGPNNt>m3G%k;PSh}#vn)y&e@s0Y;H+!7IGpW`Eh_~OCgdoDJpGY8=Pm$e5{n9CP%&U&aav|!B&R21kwcdXfhRbJ9Bwdz#amvEUk)akEL8*KZ5>ZRw@qL4<<|Zmg1Ww^)!z9<4WldZ zo;Nr;M|2Zfe^sb1^vL-yA zbmQJ%pEh-MP6)*PzXHJ3vhAiesPQE@A9B($L9VK%2fENx)R$`udHa^chc*1Wq7+9V83repzjAxx7*0G>c4zei3ZyWgjZ2_(?1A~Jd zP;vp_#J>;DE%mOxnW>t+EGRV>)DS$zwI67~QOxI0i%#9q0Ai&ejH;*MH`-8>YTZr2 z@(Wc5lpf-($`fBNQ6|sRLy%FO?Ch!v%S>NVE)^%6oYz1I&u*!~YsR3hrO$E10dp~R zMFTVLyTE)$sP2hZ|A4l-I)aF`8U@ClfMG{e@+1avRY+e|uYX^!G7`3%P1)ivdc35; z{$?BjBaxahsLCxnqzjN*@I>2@i}iXoZQV*7_SR`?cJg%k?j&s)v{4-wB)}x*6p&fY zctlStT@ZcKi-!?0+(@1!thSj}FZu0VWxTF9x6XXTT?da$T+yynnTP=+^TdcFa$A*Eh2xMMAt+`pa&GhiFk+~XaM5CkJ;b*7`#7rxOQ}2ZkJ?mtWS6KyTcft4x z=d84{$(RYJ8TdS;(;Pn-8!KSlFZ6JomD$k#1ox+mi-LjpBeQq*<{Xu+xaL85<@%>G z>xvBJC3YezDV~|l2Gl$!&o}~4Y}1#u&V>x?=^0&$RP7Z@UQ-?k12s-<+H-KKD8N|Y zJnU%?aDW`>>0ISQQPL}(*OfvvDwj*nq+$6>3Ssg|OV$;LK=XnP@^g@PFOJ>ZgFN+L zh1L0phyGTyU045FdN9?p>thPOAfpy1FHx;^1z1}Qmsws|e^Ut)7&HV{2c0SkZ?a7f zWzM`>jB|3=L@d1#0rkTDDEN~LGSkSpWOB9oQewj1_R(!yWS5^d9hTDEn?wa4T! z6;3=xy*DsQ9cq#*$NZ>gEK^i6E#K&JM8nAH#WZuDP^DGL3MF~j6h>XNYhf;NQU8J?1P=}oW8}e`RFxHKMCNhv$F8OZ>WcW zm$Z@#8t{^OdI=ru>=@Br1_CxphKOA;=Ks%yDS#Q&-KOX;62{PKG?SDxR}x zdLv=)#cX{IqCf?{(5ulxB_HtHTAducg1M?R@Rt_WM-$l(5CHA-Swtj9H zjY}n&muQ4HCCz|Td`Qye!dI(8LR}e`J8O)8=u`jvnui&0o3GGlb?6S- zIm@&7L_kgzK|1I$5+)qjfN7_Egb++Q9z!gE^ZV||9Q^A3Bj>sQW&9vhyLU3}j}%My z88;;3%})a&l1{l}{WG!ehZ74A%VrdNPOg1Hf%nt1AsV-XNUu6^6qpPjwp9)f^3J4x zzP}grLuoiXjY0B0xt&;v`qtiCrHXfS#=*WPOgDA-EFaj^A;m9rs-PdJ9o-0Brsa7c zfDXKu6%jMi91ei(}_Z4P-LBUQ;$)KJ6qg7$>k zV#p{U3edm7m%cK1!TA{sEiMDs_!zw73F2D8KS<0hwAiO}!Nv}51f}O5+PV&}iMzCZap7?j^)zY%9LrxSjLlqB7b0Ub?EK@@V1}> zLqO+pa1t9(Rm8Xq{Fju^<&BN#l&S!<(yW~RoLjT(7u5iLJZ$@Y_ez$_nN0R@59T=wrMHp%GZtFR!v%D+3}nQf zPd-L*3|MC$q64MTJR{`EX44ZeX`5S7$*w$gvb`_!lcKL?Il24c3cb{7mrXk%+*=W| z?zbJuH-Px+TiBSSwmXvcd)Y4>dBtAdY`Yait)|PZ(R=+qvCZoZR3YvTjmc4VtVYbK z``#j4j}bzRbLtkjDHs3uAnX5;#(z83FqpQ^)oLQKnLkWtHvB{v!)>bEnXuPv??}y$=<9Z38wCNvR0q7Lxu0GvBAO zPxy#i?95^=ZwRpDo$0ly`5rxa1;e@3+*x2-RLlh$ztf%@2^5N}7C$Du zX*_%~x*?TnE!p%W&4J8Jjvu84ziqUh!VxJ?6>v!Y*ND?@szq8yl|V%k-pI7$rXHVS z{GkR+AnD%4jB@p0;ZJ|ErVa>gs_Am{#j!a;3OR)Yzi(wZS9ljDI|8ejS8UR$yZ+tg zpJ1Bh6EY?*)^j*d;7Z37^EXKRXwF<6?}taan22jAnwTXs=D zevJ}2Fy^~n^B+X13B9=s-6%Q9=B6V;=^Vuc(VG3pXT4Kt!xLN8(y7djK1U93c}($zdS9OIP&EF6=27Ls(W6~ z&De|6R!j1mM(Oyj|H0P!T!5IdoOYx&gYEigO>>gAqAO6o+nA*rK!c;i-^?@+X0Y8= z(ffc~|GT?%s4Kn~C02G(I61+EoA$O5HmSWaZEvN}YFW-S#8Q>x`hw!wX*Sb_a8UM`-mN}^7>8E6 zR#jvN2P@YKOHPk%xtchj+HQeXAEd9wHl1_-iqYm26iV-2LqCtY&1L*|F#QdWsm!{- z^E-Bm_NlK#KEW^1DIZ_1lFRw^mEv0Ycsl1A?k{$Mm1tD zJ>a+m-w)^smcv{XGDyY+LEl6YGjXuAA0tb+5uZ--#Gu$(HU?)@=-&JK+e9ie%s^g7cGIfntsuLtqcwPpAXx+=_!Yu);!=?NzGHP#svVW|mbzsAA zVPnIvI~%+z{t8&+_|ArIuV(>)=ngxzx8x7(VuLNk4_3OwlJpR0BImy zDb6w7=~B~5lh8eZ5Xl8-$A73?=DRh7526mM8gC5d9QPsZ`f_E}>5ezrgItzjLeY!T zHR7q*!ymuI0`YOWHtiD#2~J`JPdDJZ{fGx7r5~mrl`k#je#Y(B;=Ntu530lOLNYe5 znO;nMpbQt-lwZ3$g$~D7x~Ly*?;j6e;>}%7UNBl^@pH>&jgp_>{?`<{iW(V zHAuz&J6xRn-DX9TW0H5Ld$U~r3Nj~-5s*>enkA~wy*X}T>R4TOA&hCs>nlXuoquvN z=$%tRmCjOPKcPD67@&etl7&bnydf|4tMQPnI+${)Pa{=YTuP5QXpY}bb!a(3n5uFQ zoXsm7W#_c)p6K)~W-a-JIhoEKgw{ir3<;%!lkl?017``X{|*;Qn7+1G`|Q6rn!Gkfy(Oik)Z zJh5q^;e@W-b!&TL0^9KrmQXM2RbR8(H_1ZV5b($`3P6G+sdJ7TRccFS-*~ydv(-EI zMQuFTwbZi?w6~ld)my1%pZaFL$5HM4L3~@?u`R`Lr}?_Y;NmlYB<3VmO7V_Y^J{7w zX%ckQcO&RgWA`nncG)yC=l-*UXC`zpwvvNHEFmoC)pZS$u`Q^D2gPZUz&|!l9nj>3 zbTr>Kp}OHHbkdAImk|iU2jaG4tjv_6NVlK6Uz;C|GMxX8?mU&Q?z|e?uO>-2G|aql zT$;8nsQgf8QZI-v3FsoTNsWyTHqN4h!OpH` zxlPutJSVrw`N#5|NHt!7$&y8+L4y7*u{qf(RP;y-l97KcF<}%T5c<85pZ4#TY7-2p z)gU>CRFdbuY6({1A3GL0RiDfi47ur-v}}IXgz#p0mxo<$)j7WqM&nt6AKD)O<%5Xm zCs8p!uyG&V?7zjGEqPl~L(t`(hN89?jX>p~DscT0%&=pGCO8|Gx3qLH<0mgZys^JqYB&ml2$0{MO)^3kJZGO^BWx?@2_eypDI|MXS%W z-P;j1x_F~e8-COi^2Z@~Jos;)##{?A8`;#PMbV=MW{XH@u4b#l9W;NI?OSR>=`DC_ zO%8iB3E7lI1Ma`u7SM9m4T)`-B76>ycPIJ>%(Lii^ap*xoHl)YtWy>iRv9CtZ*eq) z_3i2$D4Zzy5M`-dDb)6MZN5Fx4(sB)@EzH<>oDnV9x~W{J*Y=Im&)H6>eOPk*;lO@ z16_c5i@fsPy>jC<#f{l z>hlWLfblG?_r857ZM&9DDT3(>7zr~!lFC`qCo|EQ_dPCYGkNF&0^utn|GAzoF1&o7 z3iJZh%fpIjG{*VXNrkmRK47*s<^9ueeVtS*^dY5I2za2~F<*&0%-A>R)Q6N356;`N ziro7wdw(ean8%ERys!@NL{n|1;2EF~38B#=2;Z5Ir<#zCxE3XFzr+dz`)8BRFe^t2 zixfWw=eXl$QL|%bnH_6)AvxgBJl+oGe1JorZTj$U$4U5;wW!)nM55(K3;iy=nr!p2*}r19?WeHS`GDkJDa@@hMa@DC{;!!?qqs1K!4Y3{RgoFW3oL;;$|HYdmrJ>k@#+1CkOpYwuBd^R8*3e&yRX zwX*>HjJ6ADX$82yO9d#vD}o-9e+&F0deX`lu5n+)mdgZ?P&4b)w|4^@X-PX#(9gP58iE9+VRm#R*fgP_Ilff}UW}g`sKrgJu_}ilU7of@t zQ85g>d%!VO$Z2?t6xzICq)F#1|CZ(~O7@q+bIbsB+szl;npYjex>7 zemw1rT>wsiwhp2d_K;H8U4vF=*6j&+PsuWk;AR{EE@z;X5DuO{q%3a0BV7_A#$GzF zrXPsbodfV@rR(G_ED0{C24pP%h_;s6xm4?2Hzd^MpVSWl4cjHtnl!;VYyTdbCTEP$ z+|1~&IZ+5d8v4)Q}8FuM7?@~=Joc&&pmkb1zITY;RR z1}&Blw-U0$*;g7b(N-5Pff)P^nuw9}s`t2)zFXspIRCt|Du#Fzy73(_!@GZ*$?Sm@ zqnL5i73EIr@*nl~JLDC4?~@n7A63}L3lOmzgiZ-97K zG-n_>er!-4Y^mb?Gza=pHQv*llvd;M6K7+zN&_;!^6hEYq>fm;e_1C}s+p>os zB9@@L#`{KqvMK6=)ZlN>AtlAEs5`U9fJWcCT0c<*Yw&o&3$`XWYAn73#5Ude6E)6O zrv5!w*H+C5^%s^fE^3DOo=^@aTh^>XU%W+E0^cXoqae#w?I``u%kH<25SC|dd}@&W zE@+bwd(0ZM-t~1Rwy-afb!KG&9rq4&N*f36>Dc{opZPwCit_Ju;ECliyeFKA#SrtI zQR^DJ+&aZ5zgM15ws?nnl>w~V6+V|x zRX!I^M2nHw0VUmbU_g20Sk3I2^TKGRn%11oA}i9qWDjARvlS~AJbzj{r&+rJg>!pJ zF>Ft}^(@i@&HhFe&CX=_>Q>z(w6S!UnCRjcu%ilTk%NKjev$wx(Kl2r>BnMOW>`U2 zH0H*-qDvH_1$O(#HOmWR!jTCRpj$&eB zEA(>>Da33`+fLDng5FHMD41cODENgVh04v-EKw{0a8diQ)Q)gn4D6dB)k9Y-F^ea9 zlXjAK?SZVFX-O6LkL;QkIubUmDUfnp^*mDtOXuvBkaY>z#*47U-j`eTpl#lj_(NRO zWWP{;t@j&^ehaF4YjO^~vvKtnA_pbXQ%K7!U0(9~`#V{9wZ&@<3r5SDF2Cc*AH7a| z+diIj>5+XH#&klZhr-rsQ^WB$m~{%)V*0z({-ga&)8K}~_^SmR(CX4kt&dpD7a&lq z9C$Bs8|i7zwgO&jij*YwDy(Mmf0oth1=nd(yO1g{8m+6TNKqFbMU!@#r8#qhzzR3; z-dytZuM9zhP+Z;Wf%B2(g~1z4|fQa6u`6v{(}AOTM#YaNgV&6B7{v zLa0$ZH+P~d$x7cLe#nUERdHHGuL7pw(aU*Pp^!f9U}Ogj#tI7opdb`#Wpr4p55y6t zdXr}#Icd3|^-txWQS%VGKLEJU*Vtx7`2j`mk?3iD0aa%=!A!>G&*Uc0eR**&3w0s+ z3OKZgLFClZF zS`v~W6V1T7$Me`{b5{Ij!m|iFhe<9a{ljNJGMp}sc1@yMo&^fl_gZU5*>O~3CU*>4 z#6>M_St^h_MjCx79!802R+Qu_aQ<6B`V|FR{p^&!o=xe7F^YWwUbHGg)Qep=)TR|g z9#cWMSGQTzHyv)enZ>RAA(2>x@51!_PQq}-ztJ#@xY`7|VKU&~h6cq6G>|xQw z>IxYI5ZA=8ZBx7g$=2K%&~Ys{qzp(xOvadt&j0vz3b$yJAkr4E&}l?VNa?epJlib9 z9Z&V*HXfOiO-ZW^6M2OXIvREfD|!o*E>SN-0SsnLGb-537@IomUC^WeN=a?uSlS3v zqvK+z*2@n`UF5TZ#ImXNPEq3(!NSH5Y7mcpW)fO2kL{RbYWd+$cvdk#z0KAFKr$fMNY6;)_B0I_MC z&9oo>vm+^{rRKveTiz+gQl*cU9RdPWHVh%{2xET5v8p< z&c&VClGr*h(U@Ge`W@DFJr~0{)w(^>7wD2Gwcg4AXN_C=Xjv&ztn}j?#7ym!y2Cm@ zij5`bg_!jLS7Dp+y@m{_n(t;$eD_4P0> zwDvG}KUAM!(dG^F9zhg=+aH@D5r%=lWwfX>X|ItnmZVIHWT&5jE{|_z#bju~ow`#^LiWCph!gvq1sGeJQ|ojs|3$p-tt=)P zveq8!!v%jN*e~o7YSTDP@BP@|p94b<%NYtjbvm8!6=5Bvxx(h%I90nlLP~?Mj_TnO zHTBItOD0Ah7D<~q)xyGko@#vMNzBcaLZ($W2JOQ8FjJ*N>16G_pB4V4OF`!-+Xtj1 zmf|%W`1XyES2*?py*Kq9#ub4ni}mMS2mu!7-h1k0Gdy&l=eoXY`JI7U@pp|bB*gAi zzTJYkz|M|HCHd;xzmrX&{qZs>1N$n}j1z2h=RMeD(oa_2*u8AEl0s+h2zs?QB*NTa ztNW+rH`G$j_LVp|__Pj8v(la=f%L%vVYO(Xoz!@|l{**)hC;}A&4})h_tv3*u5@(v zZgsnw8})hN^ZS5d`6`pY+!y)mb2jCuvX<}*X}^wKk#BBLxL~Da%3<_q7XrMOlr7bY z5*HTst%X`8&hy4fz%8EuXp6@xkOV|OM!5%rTBnk+j0CdgQqbD<7$5?M62COZBS%o1 z^fmjz-p=^ZaGNdTT%AEocU-;N#jH{!3mx6tu&Ld2B4tSJEOO0shKJw6xh{f1r_WK@lm|0MiFNyH zh70}=fvzhmi5Lv=+6OmUa3B<_5JTaPeKGr_-m!BI_Zvv3Wik7_39*E7Gw_p5stsxo z`yl-khQ1M6qa)GQx$zks)B6VG!r5$m+vQe2a@yPL9eafE@hye`;3p*Xw|BXn;xnif zLWz!^@e2;x?!{$XJ?Op%E$Lss&LRMnzJs>U3nQ-!(5-^Le9Xe(m9}7q={+;upE@hG z$z!aiXBzc_D#WdTmD4bfJ;}sNsm0@YBvH6-PAePFd+;b-RF}h^3?fW&>g%8;n54Wh zTl8B5e)lS*v+F@O1TU#U8dlWE_K~k790cnbY1&${isi7qc87xG_>V6xnOT7Z71mkA zx&Gtss zuV#_s+1=VevRa=Hv_9%-@{9?=usWXy1r@uETgO99O$|o&bFU|g7FA7>{m`*Ev{^*d z)e5|85RbP{X5-|e-m4LQdd=}Ibn)IPmWh61-T1)(ArExyf={_iU2$|-`piuy&)@-a zrvenrh7~o*03vx5LlqcqlC6NrOtmg_M%^o$QKhp4_5bI%HM`STW0f=mx{UL@kdX4z zG>-BPiybEBz0=L^W24O`-376bqk7wayKefzjmEXfRyAo9wBF2!CL;u_OT-@a6B<%a zI|AWF04B!mJoq9>{C!bBH|-N@pZ(EQIMg`=ZqVZ5NTD1bC2*JM44?)36xMKq5#7wQ z-fCs>Kk+Utq4YzVCrL<|DqNs2eLym4bysmD>=*+V+~r%8REC7m5EaMQQ92#5!#Ls? z8B+EMmQlfU03oc%SHdH~>6CQl+)Aha`Gu7Yn@PR7-BgMpjm6Yc&t-%4za$k+ankr$ z=iP-0B7vx^Xok(d&quwc$f<(K8|e{ma*gkwNKI7Am~n4vc=N3*V)sNirFr{L5`c<1 z!qjos`Gr?P+C(b5!NOk}?V1K7hv0QVdP8|HLv_Mo$Hvx!mFm|ppR1eBViE(Ftt0QP zxr~dd;P;%aB|hs8pnlg#{RqbM?&QQOL6ri&&lrivWA#xzgedEdK0|ho*{nfR#?|&a zw`Q*CB(z1Wtmo}if*FKe%l`>n591C%7JHNW7R*Gby(RkSK{X#NYGB+n;n7uaFLzcCU2e;k0A&|1tjJY7hw=(OjUIKRh0xK|2=*!r7VTqb#^!-)@F?o>)InP#L4 zSb@C1ZuQTCCBg6#QQi^K-h*D4?Ll|f_EW~3@2lEL&8AFj>W3ULVMA>eQ%e~YeIJe7 z%E;KO(w1I-6?z1LjOv0Al`fZf%zlkG0(X>I2SZKL2)`$~po1etNRro#A;1Umzdeub zfq+^wGVzXiE3XA{SnEnAA3TgY z#7}Rmo7#2@q>q=Rh=$KxI!u2i{JH3p^=Ql^M`qbF12;;9r1$IQnzjTd+^wf;6^Wxd zD~EBAM>Bm!sMVmivh(_Q0rxa}o?3l}&}EM9YnR$NyONe4K9)^hy*E7k9RSq*{e_Jz zm(Zq^^I$WP#LaZ8z70#6rq(hRxPLl-Io*A2n)aEK54R^|#WWyrn}|Z@0xoJ9FQzU@ zz2FJ`9XJ+yR=9MpYOKF%zpZon2);!IQEOYLhNDaKqg+~y!4xX%X>59+3ZQd?c@|il zh%fc%-^4jOJFvaqOr@$pwOQ7MOadx&dkL_sVF=2FC3(rK_NpSRq#19QpF5bldHLn- z?D7Y%?m4EdK74#j1n{m`S}~7N=b4Ebbfhq`g!-i=yP!Bz1tN$MFwq1Qip`DgG`n8U!R9gmSw?+^85XtDX+4=JiQ(cySn?1orw+pnGx<$+PK ze;Mp!%`3G`&wyO#)@cYG_`DeRUYqEL$dB<8h_VRXMzW`NgEc%Z`g3tC*YaXIr2%+M zwc3t#nD;hoAMk+-8o8MPmSRIQ>{3mDka-WtB_5~yW$D(8@ccGOGkU#@Uidt5c{6T$ zKbTZaJ>#Q-;MSE}Z!N`8(GZ`0T0|Y+xn8-J!idI9oxSj{0J5qUkbzCQ9nf_3{eNH{T@ zg9!fLrWOHae;GnOfG28w--22Eo{X7b(l}qR%iTLLJB(eSj_vxmRDIFT1Cy!3f8xl;LWVLl^^tFB_U?@e=gz&^>La>= z$aw1^fBZBHr_QsY@!f>7&B61rs~Nbg4NoWDLus~AY##%8`f3ykj|}QDM&SakRzgc#0W;Fb;fIgEJX*Oo{EVWwq*$(=1u(jR30FDY;hJ?lu5sD( zM2WUqD~PM@&oP`xTUOWWZT-Yb<{QZhbTM_vu@PZJX1vo0lvcpp7Rt$}A;RK`w>@9X zc~Cqrg~{KUAf|@TzXEyIUzKrjcX$XWTsesaxaMjlGrZkFLUX@S3PGwNptO-Pd@3kO zmag*(`1QL)Fzk7Yo79g43#K!9)yty}=5|hZH&|rgOZUn!eacb)GLC<^T59oY6>!C z##Iui_r^g4sh0poz@P7qnrqTXSLH4x;eJ7c;$|EFLd#Ap;(0gfEmrb}LiR3&4ru1o z)iA@$@*BP!-CA#bXrWy1YJ`6%n{r}{26Kew!9fKMk{f0-->CJiD*(~vf)lLsx==j0 z;h@&%T!u4zyeCkgX`gz$&sSmcf#H!wbbgT?a`)sSGhe=mQf6cIJ7?@sz&ySob+q$( zdefH21D#-U`z$nax#Q9i&*+$~MtDbjPBHElt^rI)G=8rHO#@~fZ@-InaGSj?9J4Np9%mytd?<0BooQ=&oe^kr-3p{B3hrcqTr9Z`;M11$zOdJ zj;Ev(xzVv z0-x$I?wV?nQXJua$>z~ehVV;2#yvMbz!pBFJC_%8_)GCcptbA|G~@GZmHMam zI<-I;Hn9E9V5wgJdnBv3Gl>LZb4sOjI7*p>kFyffyV(z-dz$+XzvLR3Q-}Y6^%|2` zh?>06;N}8d#z-bC3wMga{y9>v?ZBf$dko&n!VCg=lPLS4_ZXl)u$4ft8KS8|j4Pc9 z4Cxx`T&S1(EEd2%EnF(~uD{q*&I61h z%~s-NwQjP%8xB_8>p4321xOOk`d-`P`@6XB@QD@}K1yI>bo1MZwU+t}-DqO7)1@m8 zT24BT4H{T&83Oc4h3U_o<{x?&3kFkekNNq} z;*ky6l+XVTJZYF`c4%Xzn`O){6lYYmB;nqqPxY*XZ%kX7|fKRcnBMybU zPMloi4RI1LI#V>@f{m<#vi@=hvZTCKozlfGzkBX7-SRAs9%-H_ANP^=FY?fuzWbq@ zQE~%#a_jQoNyh?C3IcguXY^sw8$fj>=`_l0Lqb^@mnfs*C;rpKG#@ZNNn`2375Y1^ zjnc~ZXz>y1KImio^0#HV5kysSP2{DINz&_Xa133g=s!9UhFSm(HTQik;2Bi=w)#`| zZ#W6=WQh<(mBbYFdx~&?_`UQ8k)lMh^0eq$f`&xvuO7`^NpG#y_2$(z3Y?`T3SW05 zU5pNgvbO0A9*13Ub!e)a`u%x5xL3J{S9gvW3o^Sz2 zMvo*1A8ACrqtD44<71kzn`}YoQg(9Du9_H5+k1MKxZ_1$K9ghx+$pNBRyI-^qV)j4 zs3WVkyHC01wl;TlCR(J^gM%C=9)}SUCTfFx`$sp82%#JiU)0ic1u*-EO#ovB|J^j@ zTonKU2r2x1xMSw+iJ@XfbJFo(N5?O%qCk@eYnA~LkQPAoXP%aWCqRx}Ov})up&nKw zM&0J4cwR`VQ6UiwHWyq1n?F>|+&W)zL_t5_BXb?3m-hyNDhOJQo5Tsu^KCWEV&A-i zs@T-=)VXc81RM|0nl}g57vU=V{xnzCk59z30Gg?a`UaO+yLso^!fi%$!;GBHX9w$o z0?m1mSUZk-N4_Sb{dbM1f*%Zw78X~p&g|WbvJ8I5I}1|^L*9Ed)5C}A2^2Al`tI*H zb+%rD-ahN@(-wP5TP>8qD=-to)T$v z6V2U(t6doI9=G0wR)mX&%PSe8&x=E=g?+ZX;I~=$rDMT4^E{0j&;i#qWzjdPsomxS z2SI{iuK~*EG=}u#Aso$nvn@O@FIvCsmG2)+*rJt=28Gy;F3qX&jn<|bk=>0oB2Puc z*%!|l1;`tLO+W(FYzEQ2?Kz}LAV8wjd8S^KR~-|FuNV#Uk;(mY zuI5;MOVy|j+yH75U&MBAW1}lF%?p6wwCRiHJ5!hEFWrzq?U$;V6X)+#z%2PgOeZju zE@J%XG*^m_HN!)pFRNk6R%DjelcFdNYq zS)rY-j_~9$c`3E8uD?rAJKctfo+P|kozmT$$r4SH9?N^f+0WC1o1{?E>83J`=cL5# zOcuRGCFjG6J8(mRzHS)&5LJ~ct|EBLr40fRQ4fA^#J-c=4HGmt|=L*i5t)W{&t0>H%e zjTJqh`4*OI$&m{@Gt>{zxv3ZCaP`6Z_TbbfPS(!NHR6-^-tTNgr59E|zEO?Q7x{5w zr6tJZ@m|hqtosnpls&g5erf#irn1k6HMwj$ewqRuRT=^QVnJ(1p?zY=&GQ@y6RDDJ zzuOi6c5k+wMear6T$MwFhg%O@XFqq&eCwbKyNFWEOw;qvf!5a0x5F&xqoZWm= zy5p$aIb+&gbTR-2pWTS@hJ;be`6EE73XwAjFg)@HSz5e~!UB}7>(-!O9wvLwS&KxtZR;N>Bk1!#+1T|M4K0S!cBtq9Q;Eq7bKWO#mw*;$No4< z;GhL#^-*AaYc7kTe;@X3a)kFTp&m@*axMfVaF04V1v{=IY@-B33~bphxoPx7!7e@i zvp*j(TI}6rO*mQ}>543F0CsbdHpediR(12E5B=jlV>Yt(HT}Dvy?ZWmRQy-ib5rTh5@YQxNndl0 zvVjg@-Z->nba*rQ3y?V5^> zXh)8psM`@ZHlv;i z%ZYg6tR#=@s+>a`m2giyNGE6%hj*^;M0W4H2S87%eK|?mtkaW{hMJw{OpY`bMr;YQ zcdtPdJ_6`DQH=n3Acz?TTJ6LvY1hfZYzQ|qZ`^}zfx)E@XQ(<8Y#xYKd#)_H{DAW~4mqX>ZcdzFF%|qv%=7U9Ij&FfmJEnSCw2vpH(L zX%n2@o-})?9FMQvq|}N?9b?R#>TfI zpc7l_(24;592y7jg7QpnAN4}Du~02>?c{7;QWi2&9BIl1`IC2NNOq4X>s!)Q5?Ma| zkt7+;CGboQH@+Zq>PeH5)FA&I&^O{Y9qIO#(Bg5ks_6!c>Zn7^o|D=Y;zJKL zXkHvu76E^%%re%JXieF*S`Ce7z__&7qFvm`KwB&|o6w_a;%__L0;~PIBxKz=Q3iQi z^|EE&JuPY#rAE*G#4YXN_8GS7pDRHugB}_@y>LwrV-GapqvEw^@9{6A7{kmy%TSss zk2};Gw)p2M|IDPEiq*Ow8ykfFx(pPOo{QboEv(bS=Wh0&H>_QDKwet)6`H+!;q?Xy zr4jWb<&*G@k1s}e<5pch7|g3WrK)3j97>a~aCKZK)fYd{q~e_i1mc^&qB@_6ZZn5_s5U0PTHn)e zv3HIbI_vASoBqQ`YsE20X*3J_Ku8XIkp(|evVUzCJ0-K0d;S_&BM90%LM`(9Q9`=e z@(ha&`rZr6uIGwOkDoeC&YQGUbA`YJ;t4b51BXHmnuhsaCN(&hZLM(fdOT)+y(~t) zM)-|6;bV-Ketwf+Mb*UE z(Td*{Nf$cw%YZ}4H68E!7(>YKv7e}X2y1ZLwV!WHJeU6uVecJ}_4ogeUqnP1iHn!L z64{l#w+NXbWQDlwy@|-)J0m1}?@jiMjO>w3_IB|-*VSvhKeyi>zw^(l*G)Ok^Ei)j zzds(2b54P-UG7Cth=yLIW*gDxoP(%-4c(~RUb#*9k+03Y`jjL1ebLRo9^c$a!vzt= zLhY9DX%#wd#d$NPH7jIhbD2thhh^q*v994g4r)HBO3> zy&BD`5GVhzjH1RiR0sRpTn7f6Qx?3k14g~N#M|ScT4v#a=Wx3&^k4kN<;#rJp|oGQ zEUb$4rtgb1tCwL_RYjf~sDJSEdZi4vdEALh<*3X^Lfj*_TALy9DF=?&tpv+r%4He< zayU#wG1txVydNZd(z~+%iu*hYW*H81d^tSK}>d|E+ z)35zfEApC|p`uhvf%C;`asDY0x_j3!?+M|Q<(*;d#f=Hk!!eCVH6wio!m1OJDxFK$ zhgyq`zZMUN)SG(N+P$^Kg>BAxqY~FYx#?bSqdV-NK}wa+YU^0}2-dm$ox+6cPY8={ zp%g#x+OW3#*bIYzS&dU>Ol0%$sm<2qIv|a%rJs{)wV!U9FV7#cd4aMUdL4Zc;xTS7 zR4Y9npzA(I%5#yeXEihCl_tE-aE2h1-gfm815nnfr0D8{LY#63vWn9G_5wORV)+Sj zQK@>n#Q0OdjZ&=i&DzUL2Yxs#b+gQO!>-_Z=DDO*vT*gql_Rd}$d?zMgP{`VMWIx^ znyx^igk~%)0<4dHh)rUP^JkN_SsCdZ{mOjNkJ4YcD z_i#cZ=iN=vr6r(guAe&bL0-q&pY1R?dF(p0ZXcw4z@Sqy)yJNE-duZDpez0celL;6 zBExA+H$Ho6i&Muf;14BPNEhJ7yA!xO^A(Y z7?oWF_2X9!Uox@vD6h~b<~C#%1?%EPKBg%{m;k=UVcJ&%e=zAsb+8BO_qZ&m1&rH> zAiF#`+TMCxYjM4oMr93(tC-sB9@&j$s#A}jWHJ4q`3eZbiw29*ov1S2K^XCv_q_Lf!m8PM$N>)RcAOIas%{S&$x z9a2)EpYa~}l!k++)>COMs5yJ3A}iMNi@TkV2@~m!sGESa41lz_+Mt-(LAS*~x*4)f zWV`_@C$nlH1-_tjbw=4GEhPT5$HIluPR>Sc>Tz&(BPYy{jlKH8JwMhKXnwo07PFMP06*_mdi4yKFHtAOk)0wX;uCiZo(k{Q!SY)pe6glJ;GMl}n6e~QzbySJWhC|x zm1z}L-QrM}5Z4wgDZ9Hle=U+}Yz99MBm8T1sPyWvb1*x0j7ytxw@Nn$gS%@v{YCkj zy+Jk$!;TiY$tyX$=|y8o_3^DE@6n08SexI@4J(4i$LCd@V~cPDL;i|up`PC?GJL|r z`r_3xN<3kd%b1&geH+=$q7aOOQLyFs4KV=iT=H!Jy%`YbCR9}mj(R!#AmeZCysM9$ zp~)4r8(!2*tpdbrAa*Kl@IyCVdB-6!x3NhRt#dAvf=6r}6;g~>g?A^f`}r{;Np2I( z=$OV26Bn6?UO7%Z7qcfZn*tfC88r4_DmwMW)TDg===7bOZu$kEC6CoO8j%5(*wY>v zmo)kKQ;zDGr$D-TQ++ea5_olxdE!=VJD_<^yN8{Z9<7)&D0nP=otG-OvM$%6&GL8^ z2nn}Ht5mIFh+#3A*1NJ1I#>OaQuJqa9xk38M%TGMJ&3xwh{(Dqv>=8!KceSUB8%Bh z)&D-C)pZyXYnNEqHC>7S-8!Wz{8Z+ZvMDt|t6sFc;FX4Q*)S9M)vh8*h^rwMl2X;Z zqGnCsf!C1puH*Wp-4RD}!OZ^s4r(>-VZQ7>b@@Xoh0U!mI%L(|bO!1NOuW*u#N`@;I+0qA#{5Qnh2Ek4{dH=}z>N|-ENyA( z(F51@Hs_V(&8Y`K!)4#zuPB@t$JwtYUQpj}x~Pw>&9=4}WWg`-zLzaH1fr8C5LV#P zu>bzpT7tH(mwLcht=IS~qoXIs9`QDr;zGifit}t;nLO;cIw1pbM-*_Uz0Vw*Ac8%p zK?E?o6vD`Coq^gGT$ocHbQ@OVJR?d9)42suu`XHT7y5;Jd-0oKdI0p`%{tCH7m^CE$L?!znO|eg-?Z1TA$o=xt-U7d21V% zYoerZfEK598E8Ow%m=~rTd74=>E7P-4>1tS1EW>jkFXFJ=xs&tW?zal+3wd8v9@+> z24N5#m%Jd}Mshc?eZ|5OfX6LGH_NNy-+@q&o`DD7dz`Na?DxMvSd;x0jbCMLZdXLt zaE{^RaXMJLR;Alu4!>79|=I70)L0{uCw5>H@ zXbN2-E{X7_o2JiO_$@14-x4i0eL`8SBR-R3gZBMHrt5~M1=!o9IE?K*=SKDT-kUS| z&8_1dT>Io>8HZOr7GJVPm(}0C;(PIce`oZ29ZuImo+6Lbg4k13s4`=Z5ceaGpPqxG z9M_-fmlvHWFoI+quvE=ju*8ZvHl+1qMOW#g$`j zBi|Bqdu2DBxOc_*E_bYl|rTK)P+4YSLI!uC^N0Xx$AV@l+KiLeL_+|efsp<*4lWQK0vF^rRA`dzvR-oI ztsSIUe*&I=snA;Sp~Np|Uz|gEv`)woa~lyVK)nDDd~OJ@rRUL@qRk$mNPN7bZ^`&( z4GD&k0)*TY1~S!cxwGcQi$U8knfB5{tMUU%=iSm1oK}N18Qn7&F`HXQ6t&!mB6;z=X!IEOd~BxCH1ibGdjVW3F^j5j&` z4#(WrB#xn0m|EWEl`7M|(4tal{<CPr@@U-o z11caQcs#W8$a1ku{ufK% zhk-Qiq`ppEzQX2Z7uYz5ho#}AK{l*hi0|0g1GZy1 zc<`sS8V{JZS>FlqRHHhqigCcMuSG`TcC!**VRP|e&7CfrS*c<_`i<$oo_G6I!{$8B zV2M@3G(aq_cs>Z-m`j94a$b&BJ@G>b50Hdu&WW-3VDLt40k9GdQ*yLm@5=(3aMb!_}E^_2vy*PnS(Z;-&MRJA5&wI`fz zef=ThYt%i}eIYwJl%JSd2}s{_&9oD#oh=B2=m$_0a-bPV{#f&JB0nWmRuUZ%gZ{&O zzH}76m_mdN=h8=sw=~U{Q6ii@epdWC4VSr5>O3MF{cY1`<4zn9>##(`x#*E>EW7VQ z3-&7o9|`s%FVGon2r>*oJpAk^E9Gi`g`AB}eYNhw_WNZ6sz45gTdIzicqdQ}y>~fA zJ(#-bXMGBijSFgyKD=^}X%cX1XUE1TqWbiZs{izm*DG5DUhy#Tg=Kn$|26$hvX z=+?io7L$K|C9vR!U)3@b)oe*n;ay^J2Pj34-rtgiP(4!VY$PAVtHYBa^<$khr@eGn z$MSj|(_}CuW(bLT6gy5=?eq!&S&KA7%r2XG@Oaw8@Os>$1eY^tnW?@Jm~Q>$A00Oz zAH(?4<0#SmQNBLQ@*xOhUA=aoVhvYngK3ydeSFn0C3a$F@;)hd=nX1g8IyVp z+6sv+qu_D25xM6;+udqi#U5g6iA*we88z9;ch(3U5F$JSmBQ-%lWK#gHhRbqUeyBs zvuf2j1_Cq|DvNAEfUDYPqK5v)&JgcibqT`dPmW{2rTA3fYjNy4N~U}Ko(MLW%e{`d z>j9HF&?CLiGOGNcpujL zwEu$iUFsc7)twloyWEz3p6MITjy`P4s8klMCa$feDpJF!6Y+sDy&Q>8e4(uO8+Ne; z?R`W%fvJpQovKD`^q`S530GAI1i9n{n~_|%`x-T;M5|6c&x9=Hc|D?i ze;GWIM!C0hD*0$_g94|E+P<}I`6M;dtJ+({34~@e#3N^r7QWm>nRhpemlyCvJL z$a1!06P4sRr`6J@eXY$t5F&YuKo{TD5sDISiI1=nFuWo1wMEqTfo)GOje9;QuA2TZ z=4nxdpBVAcJIJM;)fz_D*WVQKpy_3dk4NICAv5rVlINT$E2*%lPBS%sVwKs+Rp+2_ z7vIC++2d)!u0gx$D#O!{I&qGd-*!8qOY3LiXTyRii~Y&B94EWp!n8JqDndg~XF5lW zz3k2E*^<>ov2SJ8?%+z$lXbllcATcNZ}lX#tmeLgg!Tk@QPW3*yNDoow~+RA_C6VF z)=jUT&Tfj{A@k3RP=Q2^raky!9~p`Q0ZBB&YNgTw-lEj;`NJavNvZFjvyul`l?u>h zXn=8L>fPE9#V+TV75b*Mk`Tkx^&_+#O~oZ&1}QiFi}|M*1ojZCV)Ey&ThJD;KoEXu zC%59!&ywL3b0U*l5l~A{`QV>W;yn*+Z0(c%>dvGs6$-S>$wJV6h~Wp_WFH% zwQOryXNCB(!V^}DvJlrqu3?5+5A>ejBvCQrD-w}MhZVDc|DCXtF&uF*7Z7N5`?(}T zDX;yRwM-F9;}BT@yXlRKKnMQ6?{8-CXU;=1be3)-dV?U4&op*Agsi-SC^kDqy7Gqb z3i;wRb-gAGnq0@{jcZ*JM%0VaGHm0V@j6sgL^4q<`q*eMT%_6PPQ;G=XY*oxQ=h$+VC>QGWl_zO4;yw~f}% z8^>_z9Ij6xt(#kYJ?68vq@=q!p&gxv)iT-7dOR#;Y||)-SPE@Yf45qve67ZB9rmBb zy-C>>02)Jg2N_1M6Ak8FmjdzYTCM@v13uI!acgt;(2fjag0(0uZvS|66Z=%;*O-DV z5F23xf9zfx+r{gZ*Jzz6R6OOt-a@V~mw~;>t0E-k{FO{)0^OB;j1VW6;m2AVB7%79 zD%Io^X-07=+Pm#UFp=T5@U6x*WFkP8@#h9$ec!~*aP8zMRP5yb2{MhDuA8f&yA||z>zBIqH5kbNsmSYc{?(O{0rd9l0XS2I`EwOfExUzz^&5a~d+!-~QXY+5Ql z%?XzI-GgImR9z1TD$GkBJ-=*QKU5bww0~IFpk8od%ynB1R?(!$MU=ctAfCrYpE&!T z(>eXca9b5&{WfX-7GB+(IkXJy>u|%%n>6>cH9+|hDMSOr3(gRTmrZm=_29>DmYpc3 zy+6i;8dY0_if2{YtW#U#snt25*k^!ibt^r9H3s++Wr@LH8Qu)HU+`^IyBLv_70bLK zr$>Qnsh;ACePaZinu4wIKk%($4Q=yn<eyJl>g!jq+F{K|V$5|%iN6PDB#G>dFfWaKI zpSXoX4;7%JoL3nBgRR&Qnib7qv6my~DCWCf#e*uAL!*AnXq*THZtcj-CUj-@`y-%i zGBj^Na|gs-wK?6Av!PAsjy$?GAWq;r|R z1d~0rH_cL9kPAOqfZ3i{=D^5C={V)K^NiSZ;Z~AhQ|5rwX?C*Za_LBQ>`u_-QdiUd z!7J^Zz5`-+XUYmw(uxu_yk@(C0&$+OEiPAjX4(01Jh6vF6xY0`hrlZ62>1i-PhfO&IuXU$EUS_e?Ti56qcj)C7Pn0~<=<9C-X@ z@+W4J|u?eez-Au?nF=}13O*N|q18#Bl9e1NHW(#zxy?T+8aFJE>!*9I1T(*=yt3+0VH!j#V`4c04BHyVB)zN z2Qj-1a<0GTuGVjX|3Qw0d^7yoElmtRRXknWFNfO5 z>ZH;bzQ!21mOxQs_eV$04ERdaRuY&uJ7_{bN0ulGvkk2XFS-I_^i#M=-j_keZC3?U zT|yVZ%vf^~0!n1vHL<)inTIf*_#ZPP|0AVv!k33rDxI&ZxiNJxvqFc1T&jx*GLin( zTwM8TJn*i&Wy{ng3eOkg(Wq%|=303BW;1!C6R%>ju)@0U8tja$&iZ6AEqCY@SXIOu zB+NoHN%GjqkESWh(uwLJwgRjT4AIZ*As!PUCFo5t{t|hgqLg=H5RW`llj$YbZSoa zhJKuK0|7)>{}E1>r>KXLYb1Q3y{FcfaYeb@ zuFiYTMUG51l6qk#P|O*0SGC_?`iV0JOLh^cLS4}se(Tjs-Y;17p~2lcjtQ_XP|Ils z*GxcA)c~vz9i+1^-a2&ccS0e0fCwCI=Rh5p5$aI#87Zu=aG^Jr2qXZ;wWiqzPu=~B z_lSA~QT0itbLA{o!HHpcXt$p{nri>FgO7P~7bkyQY#Sxic<=P!voWI+CQs~$GADad zY{r^2UA>7C{N{zj9|&(Xw=zc@$f*vBXnr)zzp$gz8<+j~BEAcbG0Xqjjjzh}NIgCU4fQ zp<)bj!OM%Fc?^$~&?kY@l#4aYV^6K-o_N?^d&Mw=37nCy3J`)|6rYArqhlcIx_2VN zX_6@;kSJhoj`HK{7n)Z@Rf zEU}=F!`P<4!H)b~OQ11;AvG z#sTmc3L(Z++KF+sl6Ur8mU&9Z>xJ4#50F{*l85=cZy>0KuUueQXWGhxuEAbR>-P@j z=lq*jfI}}l2KnT7Vy6c?mEu>8cM}-rOe}k-5l91s-UTV7pa#PJQ zPc;8vtoz7{lehO6TQ>`SZJQ@7Ka<1C9D z!`q>90oDLmM{KgkFZgpd8Q@Q2Cn7!~C=Cx(~XG4nQiCVf`% zCa;t|PUTJZ{=^jx52Rrc!A*FAnyeq{xjc_OrePchM|TE*Gfv_@fx=2GZKn$v$T!&C z!POpqQB1Bp@fA{MXxT&Y&-Pc2SOUxW*HtuW;cNa7b~?-s{~us3qr|amPt77O{UQ5o zDbVP|M6yqb2>(vhb6HnYk=wXLbT`?)N6_1tT^yPL!~Q_!B}j3^phbdLDnh5gSX&hO zLAD;^m+mP_KdKVL<}8WtqE}zw3w;<>_2-!u`>0yh<%{|LZ7LO4(FA}j7%^}0yi8Wr zGY~Lth+oQ+i6o+$0-)-J1p}{q+y=^$;h4tQJ#UD+5-(GB@5|$#`z|NN#ter}m{Z{N z%^Zz|DA70$M=|;zRe$);TH{A78DkxvR2z-CMWHEsu>a z1LVd2j={2eTwPhl7j&oR4R<|iAN?G<7Zhj7i1D09VZs5k>y8N-KDJKH<(^{hEZBAL zlRtPu7VcZ;(w&AYtG}8a=w6@`r#)q?ri3&L@2t$N!y_+%Js`3YqN;&Wyp1AP-!9Bf z2p6Pa%B#nx%KhR{g}1^qdxU|XXI>o7(HZsDnFBp&xX8o0kFikR`;u_`#J0aUy5Y$4 z8Yk@-xF4$rzjMt?=>k~RC(>v9?j}4!c!V$JfX3@0d;*>yLMbdH>E<2SUtKn7UvZ{4poI*3@Uztz)NpzMjFia~LLy6r)-Vu7TQN;eX&|NN$Z zb7eC>Z{d+Qo@&@bnv~wh7tf$;k3n>hSxgN9`p`@`MCXpHtI3}g^yJn$Kw##75LiBn zKI6_?%bwf+8caUn%MNdNK7-i07!?d;$FF$!1XF*;M`rBn{~aCxe#i)1|B0zd?B0Y} zA6>nZlCoAjRB+8q1BMqyFvufzS0};qjA3RCY=igj1OyGm)P(z9MA!!{d|sceIyEp8CCMPIQA>f$mO#9{)Ft9VcKa{i5BrNuVHPGhZSg%goQn}m zh+Uj#liBaU?{VjN>`~kFThTOuId0s_LXYp+yK#+bdd8XU%+T!RYbzZ-!TC<}Z`&(L z<8(S?5v@QhH$zxa@R@W|vw;!wpCf!JIWH&~?5WRe{P60m_ZQQwg`a}u_y4g7l;dh+ z-LxOeuO!4?viV8vA-{_X8B{{Ar|#F4;En1GKzV&4KtkfPGL#4B z%h6u){$_p|@xBe}M`hkT-^*g_A1@lynllGa!31BhPJcMO*ZuKJrtMT+Q{o{lkmpFy zX`*%+GJEr+8cjkLVGBf!!gam>p(&bo*H;BrJ#GVlZVwr+T9H0sd6D%qKe( zKPo4cft{i9-4`2aiZ4|4=uNQ#Kli>&JUMj>uRd#&-g3h*S~qW3zUmD8b<+`Xv`Z18nskKjOce|2Dh!E3xV^)>Azvf> z`{z=!DsYO~#K0@{3}jtne5Ker>kWgmo8~iHz$hSF$jAV)*k30(yXcg;e4*-pyTPno zK%Id^nEP#s`Rl5#$(y{<{W7?6=iF?7RRy;YduNTzdtvZi=;-7(J)cCybBN8{beGa^ z_#GD5Egyq8Mb-vL#A-+J{i^iWulcil86fsuGf}nXE4P3Oz0^P`Kl;BF5U0ljypL|0 z*eDSzA9KrXDIef+WwLL5@2LawGMZgETqEsfBmz$#`3p1W(I0jc00KQ#Jyufk%2Oc| zZjc>4u%<<(Qq1azG3S`(_^Oeh+;Xb1U?eFk_*N9S-|#LuYwyBj$q^JIrI{7fKgYud zxIi_HJ#4*+;&)KDpT7x0)06*5BjRFu^8>A*eMY~{$E+tb2iUaE`T`sL$gnV+3@V|} zig4?*Dc}S#HRZ*jN4~E|@rf}a9sy!;7#B@;Ty#`|UgY6Tq3_4q&~MVC^9iWL7jOo# z1gHeU30nKuZU1Ggzk}D|hw=oGz|>3+0L3A+BTSGOtIhsB_`h(mFfd8GdCQ!^kM(R$ zYUsh?$=7*Z9Gyw`N1vj$eG2Y|;>zuZOM{|uJ7|TvU_0R@vnN=TSW^ zFa^=FG|HH!*L8=ww)g8=T&7OJ(o5&1(89B?Ygbi|pQ(i-YG5TH&4{OjX}(-nF)O=2 zJ~&$NPkR@?66cthjObVbNhDf39du0Hg@{T?u-*6^_jJSq?!$Mb7A}-E9zal63xOWCr$Qvsy&pd}7pLftx`ip)z=kM|x?mj~&0Z#+eV=7}R)=X>OCSfe2yz!M2Ohhrmw z=LU9O_RF8|5tgtg#P!d;e)49~`lYQN8F*uF{=~fZWEmm7+iM%vos0UU1Y;AbuTAv{Va+9;b3k2%P;TDHWm|RuizJ@RPoU3=@>Q;(C;E zK10S5eaE?X`w;p++p#d%fp%ycw+k z-Zbcymq7IDrF73OBz5^wREd;6O7Ft2d$VbD9VRd39s)$i;IC-hu$Nn>Th}5qm!-$8 zP(U7)9T&Kdq)HhH4h!WzR#ps^58fE#h8z1MI zYt%g8$1$xpYfvB9R4NOUKzuQ%{J{SjF9|3E%#YqzwsD*8Xej)@-5!Rj4Lb94s(R0F zpWt*a?Bew7VWTr%eGkOa?!v-+zq5vN=E zW~pNrKj#`FXmYT6Z%vlgxd<<9==`(dVC0H1^P5@dm!)oF1s$gXAEvTXHZ#JiQiG4! zYP>p4+DCXpGY`QxH%-ymWkDd6!Sab|>@)H|@4Ep{Kqs=OLh{%>&zER!ZMTga zkvXozED5a59>mm!7z7Uc7yXkf6QNR+4lsHvBW46GI$l(qek2Lc{Az9p0xz$779!jR}Jz?%P!ckJ!P6QG325lzlzbv~$0?G7EkY3HukJa9R(<`7E z4!QvA+j2H{TlI+NN821Hz?usff!F$h4!l7Ke%+>Yj z|G-*do_SO2*+bDUdz~-Nd3D(_K=q-u-KEE!kzvC?>*BzJNuWiYSX}I@l0QH#2WEi7 zyrjkw*JJ73YbJhqvx<99?zf!FaRS%ymyow?X*oQKmvgrlc@{(3#Ymly4bt8kBiphF z(*>I?H^sjx^+Ef>Lx-#^)m}+r4jM_aqXQaweqNmZxcA3}pTXh;8$xwUJPhFcdEWfq z6d3`mMr&%K(UPk&C>6c45ghonEn#NCCFlV24f|h(p9$2yuLX`gzoC2H8v^;@PL8}kw5WG-^O2n#Le(IUy@{aiesDriGiAS$ zwsFCxeT5HaYH~j&q7z@0w5oa{9~K$sfV!^1wmKWQUpiA7^z+2gj8<@Dp84YJyg$rg zGko*F`M9)u^n-w=+sKt>A*-_0R|isu^3bh&OmD<)^qR--rVPI)wDpL3o|ENewD6OQ z?p&b5g)f3jj9;-@XwXHA>-Xt1Gji}PC4blr#Y-=3B9J2S|GZCq3WQW!IPdrJhJrg2 zs1iuwMV^a%VdScO0Z=NCva1SAIj-!mKN8h6*yZE|=)rxzVgIloDeAXD_ijP(2>cb* zA|pxWu|toz+K3=-3BqRKKz^c_I_v*cA>T?Gz0)XvA_jFQlb-JCFcyYQS%Z}54iE5I z99EaGz`h*^YvxLn7o2H*UvCDtr^|HZNENR)J_-~Hz=V##Gb#CsX@wUxtf36kX~XQO zqyn*=z64bk!B|S{o?kE+*Qv2SXD8hV#;8wMi=*k`!se@&;ODIs_XbCODgf0R@Vw%U zW3tF__5EWn`ATOBH;*9$dJX=PIz?_ z##{<|^VO1LI<^~_Ob@67@V!}`#L?x+O-!~y7kz|?)OuT1pnL!R{HpwQSihRCYFatC z!-YcaOm)CTkraFW)0Tx#33^K%A~=xaRYB+?Kv8^VM8QN#!`RXx=HCPW=piD8M$$Gp z5&;}&6qLxnlcNzFkD=PHZSt1{p4gfH4ro?bR@*`nN zDvbEOQ1nf6Vc|{%e&mmq!7ddSe3toD#<$ay-`O9Ob4_uPNKs#8rBzP}vidDgzAHao zT=!>PKfP2y9uI>QBT3M(VaPB#{C06ZS^Xr>BO2(Dq?<<3#v=Cdu8lY%hX!e>)C^L9 zJ*m7V*9;kUhVZB+$DD6Bq!@=i5c&Nf1fP9uoDg`@UwLG)+UJxug+Dr9Ux$Tg=>GZw za%8SA7gY$U*bUu>us+R>t+o9W_I}o3yc)+>BL?L7I$Ouq+{nK+n`;#a#{ECRpc#ls zj3w_0+l%_L(NH8BtfEwYSINL$YSJ6^ofC9tb`mJScqo8pCSVC3nlPaW?Je(0yMB9l zk$f{>Fn@1ny!_xb_l~yC5T^d5vjuI8zWDr{$xWdz*#&tvh6G2w4Sg46pH35wT60W(x^lMYQLC0SYvX)@jIEwiDWcZa*pBp|J(gyGO9 zgw)IM^TzgtlToS%$~S3{I4V2bl)69YAX0|UUO8I1na@;1D&nga*8BQe`rYNZz&S}H z&*9S!RdA6YOS{ytSWr6p6pd$hZcPO1a#)fKRA(! z{qegb*7RX?S!a$z@2T}f(EM^dy_JD|+*`ijm(%Qd@is%udV z-BOcCwY(D_F|V~{XMWZu_2@m8Iq}T(lWD`_4FP(``Fc-()@|az8@O%iL$a=}9R_fT zHw4mz%$uf54dk4IW=8XLm z&w)U^=ur$#;twT%(FJ&t3R>thAzJNdK&l&enZL_s(w^E&dXOvo`M6>K4iO>l7q$o)AlsKb$@_Ae zIj-TyaX0fNcv(~rr+?YLj+-c-YC7W&t132&7TU@-*|H!DaOCnOQ6(1l>}!5M;6-i~ z{C*;4=d?(#7=}a@hZS%xvM|FSB!oQshy)cBZ~a);DH+x!Zv~U}y&4JMBJub>r^em6 z*^2!DTo(?8eayKCVPM9YGdQugt3-S|kQbifBqtGOo$m9ido}_e^^4=Muy{h)WCFym zz*hCkp|J8={}Zy{7Z)al1o$L?lbVVS`_h7Q2~TiwCSSgOYngiwDbff{_teZ=}B@xIkb$j7nB!+S^t5hX!-UK{A;JXpaP3iM|dOwlo`1 zJGa;;7lci3@_ib&JA94XwfL2)+24WdJ&EVEryyYq`x$c}$jaV+dbAVz)8)BElM|v( z7F2&vrb~Fk%0ajDT$UtauL=M7&ew2Q;>6rby(!#Pab-VQw!fUz+%#s_xlR1om~A8w zvVgEW!W*rycwm5mXILrAXbb`^@2a$qQO4P-qpN7c$IX1@vO_vZ56Ca8oKyDjpr|E> zt?hQJu1JdgMu7wdEh-wzOAPGFKWR1uJ?q{;@nMMeX$%0nN>t3^6vyGg^QtAyD;ed*IezFcD-KR%5s;?Qs}L8PaRJMC%x3!=4MHW~4hZA} z4~4b67;X3<#$q54ccl{OX<~t}x6X_>mS^U3HuLq?{wV}PS_6&NeVz53ryMz~^5GIC zp)&rgfj7t;^6%jfSTA2ai|Z}Fu@tb>DV4j_zAP=nWvN(mS@-o9G9;~|nhSg31rvbp z#Ib*9_Btt{s7nuE|LRqJRXyfOYnMtx*7b)!f9T-@(}RpT`(O2d+*45;4Wlo={lFRU z^d-n9tL^A8n(g+coD|iOAQLGOB8j*XH?H${yL1zEy;KHbAu@qeS^dG?l40BtnB`=v zu!niYy~=)_x2SxXq}BGT8HMELvgYjt$RkSuwS3f`*4w?8!zp-`d%?eI*hWNFFEfd{ zKx`*B{UQe8BGctI)s=_b6p{YJwG-W)8@#BgxL4QnGR2>ZT#TwoEsW@u-7 zwOzGqO$JL_J*}F4t>_ghcplrG*$mBvzshnI|5ffaeN}y;2Yz8OS8?gr)SQBfjjDMr z7~PHlxxdYs1G7`X(!BYm#WCV+AfO;*NGme<1_C}oWIfr$H^#rXscux=G>8CVf9|GH zw_=J+xGb4Won5kT6csf0Kuf&o@?PW(Cr*>OQ#ILgtBU3?K5qg<*wsow5_9io z**ZX@YS{lvJ^D(niR5Ax>0;`bR;OYayn1(=L*VLF*1@gFUN6%R9_z)@f>{~58zb(j;!yX^c>fBd=UUi|+(3SL|#sWrZzJAaYa9j(V5JSD6HyY`Z9n6#uEAH|O0M*ThdegDv$ z>}~NHRnH zB~{wI2B&kt!u63I%~T(Nk>Qg7w;LU1!qfRt?P=Hz$&R2VmnBh3v6lv63Q}dh^)aL8 zCv|)QDSHTY-izmq{KbRlly+p^lZmUYCZl4<&&0k!cvN_q$`M{SjrMWZp_9?)0~*O- z6v$rN-jI=nTz8wSV_r^NXo-IZF^mB3>1tf6<|Cwho@DEA@|U&EL@l1J=gAj@{ZrWW zegm+#AH(Wzed zRR*@ffh$hBVi)Y^tK$7El9mz{Kk8Se!( z(L4AHvD+wLhyAsGqSpdwJ4r4gfKVLrxzQI+$6Kk7?xKk(j$)f{`tOHX6B{c?z*E6* z;JSAsFBM|#e}~p|k?L|7dNJ=qU>=bDpdEG#6%nD$ut9_dJ?+^h|EkO*0HHkwZ`wsJ za2da*!)(lxVa^;lUGSrK`?jR8O&=^p%BMGD?}?6D{HwO)_B!?je|m9E9Hz_EULMnw zHGAOdl+>jTd2lh&C?2n940(P51@e3P!{Q_Yl-wEEe#;Wv_KR8$zPt2beN+O-)|hXI zfIK$$vg7s|s%(xl8&59Vl$$b_F4Xm`jYb*={6&cC_}u^n;7MdlsJu>Tb9FilpZRI5hP3%p@;j+wbLT zCtuWhpPDMi1kwl;T7#PgF)S6 zB78t5Eib>HJR-ab(_C*G)gz_G?rbKN54Pnem&V)b;IMDqw7Z3=gU3*8Ry=`SGnCT| zV-5GREJ(Hb!2T6-+oMNXz+My_ai~&Y`>@QT!(dDnP_$OD0|UegZ1*sd#Y8|5r5rcu z*e~Y+qoM;E@P-1UME}f$NmW#@>H{-- z*ZqQW^MJ9_T1br&QZqn?29UedM>|p3k%X&pcb|YrUCsAzfycL+hO=7k$IOq{Z_+kC z;HiqNi}5U*3UK)n0)4x97oVebhs2sEOk^DUvAw7}g|@^=b>>9H#1?vKGyl=guYm&J zm|Qf%sq84bUEk5YN+!ImaDSeXnePAc-N+ zHlsWmdw_y4l>7?0RcW9i2LF_O^tJI5=f|!ZPSrufwOeBkKHe!XentXX#zmS)Fm0t!~5Hh zwZ<~jL<}mhIq@q+3K?f;Xva#9CV0RKmn7VzJrZx)Rs(SLG4ri1Di2i~O|w1U&u)+I z+TLP=IJ20nK5_**i|hq}Ys3i&?J{39kFpA#%UM#PEzGp&S@9}%9`ao;Wik#%TO*j? z$8I)e?)yWhBj?B5j4`*;>$iRR6jQK`xR2Ls$NxFX`eZOLcjn%)|5kogHEWiJVQ;hN zuDYHIx)MqY^qexE6c#@Hjz87QP)N_^Wt{sCN{Q(@1FNt!Cqd)so(n!@bNs^ZdID;} zpY%ebYHs@6XeXwNR*!Z@bL~%)U`I+g5x^B@a+5B9bi8|Wb9XT0l z))qpvXx)Sq@FZv-I4R6#8P02YdLjt+w|P6YWly?l8h0G$h?R0HARvf{)zsKk3Qx^2 zda2UF&tC2~i2EL-!QC5yTvI|F?WN-y$%|NuobHK^SSn z=>c_qbl}cIXI363Sgys`o3NS`&)`J8mHDHP*}LNoF2?0kc!6e+!W&^jTH1!J>yA55#LBf6Ln3W zg$~fvtE@CO2FYJk{CC%RWt-=|$8uw5qI!EBnP<}r@vApGAp#-Q$GNqy;Pqua{{9s1 z1&-A?;HvTNuEr((>$1P9OAt9d6NX~4+EW`Vr~KTu34m>%MaFV{TX`k^E_0{k_4a8e zZ6w1@JxST#Q9Mm(m(En_&y!Uq#$f7O>bjKb6NhCi;g?7DUNt0Mf9$kRh`bmolD0Ew z5(=(y!VAdt{Vb7?L5AwnLAa_F`MmBr>^7drhabPs3ERHg#_LW z6$j=RA%9#w7La8~W1AcgVIB_tu7ek;chtxb?6KRUI`78W7KRA<-quD!N?xOBvU|VT zRK7yI)heTvmr_uUQfKa|B?P8Fhy;#(Q{XnFDc3!Ci@rVaiv0K#RDeVx;v|0|Bxpq# zpQz0#kIXf+=pnEm$zaI8Eg9a{082{|+wqq8WHAd^8j~l(ww;4C!DR~{-+%+{)!(H& z)QsQ^G-Ee(%I8irTTT+GSBA+Y=#QtZY#L(%V4AvY1w!xVD2XmD>J|P-re@{@^VF5NSxih~4ZdgzzyY1~z8O`K< zf>nQa{a!68)1FgOJH19;agRIVun7v&yz&}pQM{iRD0@*UT^vuGP3fy0p?OOqm=;M9 zl3`F0BL(xX!mQJf)V(n#$AHnXfPi(vMe$MKS~_xS{@E>}JTKaVGuwcvYD*eB{>9HD_O6^_M#P0QnFShr9yQ#>2(xfko%lNb!=7(r5{L%3>ZZKuXX zyO*4UVMwm0*H7nMy{UJU8q~rAIZB_BRci>d!^E?xCFL}D&;i~Wb%FSS*j*HVSN6J| z6bMN1#&d3RO5fKXMfd^Gdk}|2UOle|nB`ycC^HEfJjf=UAFYD+2~y#_;-G>XiL485 znlW^+Q>=g+5>0^~k{?3i*gDqA?(^X`uUxdq#Gqo6ln6_wkDLmZ5W1`$@So!?e;0ppBl&QAxf9X zM6?>+s=Tk$+R;UFp3E%>k1~I*uSs#qskcn>v(?0Ci!T>Rbv^eWs2b;Sd^fM<&r*d` zn=>t+f>iBZ)U`*0ig|#s?GF3ljCXi~_WeX8%Msy0taoHBPD&&3?|yHQr^Ff9u7v^h zKKB9*<`5mV2wYc?G`y+z5QA0~6YNbMdEkG9<43~DW!A-T{XLy4 zg;TGd1LFKqRp>!3yoRJnsTeSsywG7W=yuak;c>p#?#3V9JB*D?r?%i6SO2(YLg3?R z8dSsgh-OWz4cf^wg;?>zq`j}x?9MUwxfl^du^*2ITSDdcha_PI+nSi)|Bte-j>@w8 zwtWyA6kkadNeNLJ=@Jl7Qbp-TkdQ8El^0%Vix3o0K~zGzL%IZ%?vj$0?z^5Bzw8o@9n&DWku)&;+yz~-KqHHa&v$g0~ZYR6s;RF2}>F^ z5qV%2?NWVcX2*jW9Vp6;?A-r|0<3Vf<|wVzPS{_MHrGs<9l+SsP#xzr3l~^27XUGa zKa+27^7UH`zUd%}S1le3dql$)GH+U3>&qcyKwW~yG^c4i(K)!<=JVdo4{o=AElOAk zg?8PqS#>>qHl%g&qTx=HU1y>f$$-olQ~tepGZ+<}BYykFrEF?vXm~3ywdq5&7|Q`GAbh z5`ugFAvP4mvZUxBND_T5MBzn6&KilGC%*_?M0Snf)~7KZA7zV>j8>AGrQ0y=LLvNv!F*F8!=#kM*bP%)5EzX{>6}z^z)J8qd=O28P8rUk*XG z+W8eXusd|Aaz0Jw3{cy9A-`gCjb^V%Vg10cU@Dk%YJD^LqYa5_Onyj(!eAvY;EmTl zslRPLoom_kUY(oGO}$h~x*aM+sQS3&!!Nh923B<>5AtI#Owimp{G4{C2HuEtd$vuf zAuDjh`Kg~dU1S$qq2k`5cRqhEeA1C&a!P-OBo;j5h<_0@b+UjhNA#WrbN`bMvW(A} zZhg2%bE1i2>?ig)fAhWA?6pk~OkrI?N@q&Oh?`8N`MpTZi1!^BSlNcrn+{o&UAMPGTG`1y5vW#n6AU&V$4XUB2GF>UGVB9VehsFi#4JhPL50Djj~iZ*&{wFlVlVFnaeVY(N~hxR^1f>LwmFj z{LEOm;;vAb+J(mrI5Kmu$<60+@Q)nrkmHD z=ny>L@@Mbt5|b7oB6$lPrRt5Xc8&X`T4c^1Y)eOIsfzkBc6D) z7mIt`?~+Uu#;jy9!;(PkbCBD|ma377Y4yS!yg&(_?2EQ;aaVLG7( z{m}fzv=g)gi=^KckTOCi8XhkTa~o>yo@pBqs^>Fn;S{vlyNJ0KL}`MqIs`22+_1z3 z%nQt-RKk-lwdN_)@4c~_yE}qe z+gm8FN#aDayko+Sh27%vr{E*9@oZZRBUQNdq!roAuu-RAqkdSCopA(|_enhKnRfJz zNaXM_y&&8uI`FUU6;&tVI?htPo24b&DiqqIeyjg5@u)X}yyhJJofpRd9pzOfO7cHO ztX9V-6knq^G&ow#2|LuIZQyj6=>FymOKQNhVix^!euYC6w z-YX@oZMmcW)NfSHDJZpRn9j?le`9{0W6z8F(hnH!1*IXVb9627i#)0-Q=~R^NG;D? zlp#d6vKyE8(~Z$o%ceTLBf1>?Sw7Wu+47BTJxkoNWr99_+G5nakM9{Kh1krjjn|); zlKc~1s^_aVR-|{n-;RFu0%(48CvuOlHwv?GIj)8yr*r>pzv@Q3&x_qvg|n3RdK~S7 zK1)&dG{CBM;>MzImfoa`W6c5q&m-8m-b!hdg-KD~ICP>dSR}9%np^FW z0k|EEU6U1$j6dUuBQPD)#_WNh(G&r(7?_N<-bwdsNqs+vRYnt(hos;%$)DjwRjS9Z ztg%k^yBqGFV`m6%ONs$Vu`VwHq!p9Y6ZvLU5%sZAk07NbT}pqc}*93Lt@ zDfKksB>nwg4SROHj)rIq)Akd;>HgzNv;5o-RJe_uRTt_vUlS(6OKDn}LZDR3Muioh zlKZ7+muA&R&d!e-ss&xla0|2$n1wD20T~=Bbi7976v5+?ZL~lx-3OwX&J)z_>5L0u6b-U_n*Ji-GZeL zmYytspyanAE-B+3Dt$K)m%Vp7-Gkp~_C0R3zGDkhz|~^sI2YVg zy1f#4$qr6WC*jW}6U%J1k6g`Z!nQe>M*7YST<{nUBL%$uaDTa2Fk{h0(K=+y@1URI zitS|+onMF8a(AA*`>Gle>m=NiB1(#au|WfDNSz}kFQ*ze+{uyGX-h&AQwhcC-sWir z2J+qO2}OA1%{|!GTHd*jx{~L0O3u)2y4{nWRbTwgPVsRdD{qA`I{U_@F81*-$e-DtN=6xGhQ0ixak{uDk&?;hyHjUggPh!d|EH`>Fat8XJa{ zzr91&|CHLyu3Y!$Sng4Y;(GQiXw*Z7T1#BjHvv-WD9XhR40_V4J+|843I1w5SC`Bv(3~h+#X$Rxj%3ob9cD0)RCXhjs(yZ3Po!R$EL!3B=942m4>K@^o z+~RMZ2L-G>CA*xMFOW7&tq*hbXGW|4PhBoE zc(50jXKKsUYVPGZ78R*tK#k}^6gN5^SmJqe_1YprM*=x3J9q($O;<58op~Y1zj{60 zg@pJ&FLv*LEViyrNMs1^BU=jTb10uao?2gtmAl+5qq7x_rkOyymk(GRhljuWa`bg4 zKOR|6=wad+tON2PMjO2>w2=MYs_;nGly8T}Vr%sD^zXrISpt`K21D1bd?@qvqBfR{ zC*r(JYnyT$@fjzD>wYBf^`ucy-WDNwQ^Mi;$hZG|30J#YrmG}yjkp^^19^_7vm22L z2Go+{cS&m0WOV91X$;EjPiX#5X1@*597k)f+dwjxH`GIqn3#Gn(rq}(c!;lFZw&T4 z{lYkQT@jHsu{jpEo6)b`lRe~c0j3dIu@?$3^Az6F0_0tw$8tFCnsdq}??_kHcjK~S zW%@Mc?5OYco_KHT#(8KY`oA#4EJ;sh0_rvG=Fc;kz5M!3a>?6HmD%06=_Qgm0O!up z$+mSjw~e)c0$8#ZS2VjMso_cC*%#+1)tVzcPj@~v*u*mk(?%k6UD;k550#r7Fh=sK zULPdP*m=^Gk8z8BU-!z)=-V1a%fW^t0si+LiU*=CuSz0AiJq86tqHGpu#{diFCtHu zAnj*LU#<=O9C^PQ?qiB4_2?**UNm6d@O1ezjOg5}NXBJVUrQ)nb)*Ai&v@ zc){@(wIYu3q~VVDH`a`DDlfsa0~nP2a*@qGjkHlAt74=L#Vs`*xboHg#R67L8EjQ8 zHt*-j1?c9Rtc;qI#q|3;PK5ckS8$)lM8uq+!s!ql^DO$Kn4W|1U1#}V!Ck@YW>SNF zS9=L5Q(q%Jrted4Qka{yo>a^fXNO-%gZ-ScnNOW=D>Nc6Q>52Dbcxl+b7ul2_8J># zq(0>GT<%Hza$xkyeSt}-Ev8|dfPfL0K@w7aOw3(^^HnOiC{bwL7YZxkum?s zYQfs?pmaC#(vM3B!iUc&ein?b@weswn13T`t4;AwkgzE}N@=rl|kZcLhcE^ zLfPDqbq6z55Vgd#Om!9V=&-i9>cI)6d#)ihyt|%u+#eb0Y?qC zlHJ7JF4hi$+3|BJCEH}?U3#)});gi<_Tolka+ojP=hAog!Ug*fFZ~bpK^#rPg$VdxIX8L=A_(tX-eyjKi)Dr(ZPAn z;v<{7rA`IM-%VX{G?cGleRxu&vtLhRSGV&Wlp+x*u0FTdUMMFDh`K3#1n8ZNj`^E_ zsE$t~1S-HyQfe3HadmL7f~`ac>tvb^ks@32F}{vJk2JbigCe5)ML5Vh;i4&;aa;Vp zGd6^=o!#PFjpUw$3fjjn|BrkL)SMLi*;3Uef^nR|$eTs9;JLt0X@Z&6c3k^j5hiOv z1tXB^VmITJYiTsR{D0HBjth?Q#ygZ4OK-~b?e{362R0^Bz*}{*8Q>LY3SsJHdD7G0flPQ;%SzfE>xOY0YF~7+CeCbB}4HX9G9pfa&xe@Hbv7 z)V)pgkw}-yA{GS5uFF2gRHLj*8O-=3A$?q}yD|6`F1xh!OwmG>ijCjoFS3HKQxUQO z3-5OtO0|9I2@uH+6i~vl3LjI7JLe?DH&y(UV;p(k@hQ^gO~7c%?W#366jyd$cJR{f zUBSriWZS=qHmG%07?n;#rdpf&Lnph5EH*qxSC61&! zjWaymfO_N7G2NseXKxpt3fP)F$mw{1@-Cdv8rejuwLn#NiSTAYSMBo4NnpTdRnVF$ z`zxmCs|3T_5Y}5x@gdG~l_HqMhtq0}Im%V(9T!RJ;Y0L=o_DLoXu6A!lTsZiBTS(Q znZo6ngvXf)QB;X!{t0Rpk)#PHG1-VR7p*8ABk{mi z_CJ=(C4v$3B2^g=(S=<5*z&gNy$p!PP627k`jWY~{C6nH=Hr_`5Pc*uEK%?$=Hv1) zZZ-Yn%W;7#Ho!F-|D_y2Q7HXh|0D zER^R%00!oz7h&zxFp;V`vGz5SzUR&tY>Hg#f-@Ml=TLlX`}yD-QK-6oI{D#`OJ&PH zpz3$}d{kd>KzJ<*gmwfmMWhQy_X9M|)4H_6{mYIL0HG<6O(=ADn5JAi{XaoF})nXCwM<+Ot4pR>Lk#Kp}&TZ|7zE~cpAr!WxHb;JL8mU1>Ycx%L;`P$EgX=kL`z&G zDt%wbK4B+h#K!RUtW1jqCd(FT8kSu0pCwGdkv|iCT)RbA0(IRnvYPpX=6z6ClBVQ2 zHq>P`E6?ovu6gd5UXlwC&%_QQb#IXn-JRJHApxiZNKr0z-#2&&+f;Gbo&WjVme&t* zHfKSQ*OaR~rqvX)l^@zd5qOs4V_7zch&5JFrFVV4$a`3~j$32(pVja)WUdJFp#P1O z(H+yHbJ6^pnrg#~nb66K`l33eu%%7TMv}KhA$6(qA=?X{ULATW-3geK2H-z4ReO3jSQf z*#t2R5l|!x6*7_taZ1d@8$_!*nf|RFGQrMNzUUBWw z7hcnoIhSk1lww_ctk`LBSmGz2o#*pZw;y1ydc$$neJ=n!W+|V0gmZ?k)ueLZw4`jR z=<|tzpQ(rTVVe&G2W*4D6FL3gt4hv~DbO-CyA-Z>Wz}XCZ7rXQE?Hsr<9KNW^gh*8 zijrm*R2Ua8`u2@UDHhk^o=}F8bpZ=(vE@_<2Vw5O` z0m8W$EOkGyiT{cV7lU%Ha+MUUO^!18HwO5hcE;3L6PI!~6k%;9JF=pl{K@fFoiU_o zw5o4P7QKBi3;AWmR$-Z0Lkc2En7{Hu`F7Vw?u)LE63@jp!yZ|@>8>ET`nN14)Gf(h zTZ5v2ZEMb&L`!3@vvBu)`4q{62*t_resrJYG=H9WAMtow>8NhfrhEKjam(y*=XlaA z+ntY?PA}@kDizvOMXIK$4clvTp+EBVR?A_{7}dQCkFrB`e*-_RQ5aW=*iEvuzRYKC z`kMzXU$78m&Tn4#0KAARvENjbC|)g!F7(;d5~I$X7C|Ww$NALa^HHUHCgIST_`XJV%>+ZUiiHakJ{$rx@a*IG|Lpd z>NKaaYzxu6sVnG7b!bGuQs6@i_SRLxD2ozoC=tx-K`4`CHcICC+ZP8c==u9er(XE)j9^(;VGQp=u9gDidRL43uy6g z1UojBXB=+lD+@t0Yb`kNZ zpAEsa8pl@8bbY*b^Ys1KGpne0n|tspeIaPKL;&9KQ(J)#KWTY=9ImQ&&=EM_id1EN zC}W5BO?%-@T~?jp<&tI1&;4QJg@0PG8R+_XLeug_QI=smk)8H})PzfOL_`6#w6`?n zKtIaR?bM)Yz=7gI?X4}7#vBz2l2I`lOqyKfPEJugN5GLJ#(*L0Cs?F+DG+>{_HG8d zeLYJ7m0-Sd6HJ`<`bwDBxk{2j6#hF>5e9i(LtJ%xCqf%3dFP6heWebp5@SMRy`c)HT^DJH$w^;={G zTy5h16a`;3ks7Y*o8$MCG(5dEXEn08Loo!`O1qmeG|St=R$Fmj3Z01Y6Y-rzh1&yrawdO zIl3i6xJj03v6};F*(hhc}-gw*`9sm^(9!Gsv6i!eN}&h zudiJq0Q+Unz43BvaQ1Yp=uk0R%s_-OJgThwU!|+;_p+9XvmHNaoZw8l_v!RaT3E+) z@W$@|gCp1Rf!$3B`4akbI3gXEAqQ#-nRfxiP0? zl%5(i9LT2WybP=N?2R~5#O6&o<8CI#D7z;01&Ao4?C!&5TGjxpSIiI1GlO>Dt_UFp zlhuqP%UxBG=L@OaV@_H$0^*GW;tl=_@qQUEhXzbvb>KdoR^=8Xz8nm z{{A1Cj%Uj;?MYvb>tX9@rTUEPm9N%u85A1xq z^6|M9WcCGjtGFgv(qQ}bgCRJD@xZgweYUo4jIP73 z(OjQnxd?KZm2vo@Qk>t(?xD6_IhCceG2|uIx$_b3!!Xum1 z$1PZs;~z=hH~$aZrZYtGfS^Tb`09_~X^g%Hb^4!C+={;Al_mwu;&S_-EeQ#{hl{`O zqU#+*lx1v?@$8Fh&o(KAv5ep8uUr8*JEjLo_IGdzlf9WI<(pDp4Olj;qW3-qna>3j~y!7vG7xmpAOVXzw z5*){GxTIo>G>V?c1iWCm%_{n=eCp1cX2JJU@1M$o- zR4?fJR}5Lp?p-(;ynDT|O1>!bX2X#B>0^vtS*osy*j540X(eJ^)^3nSbU~XG-A<6A zoZFUaH@?(6fh2>9HC6+Cq{}1KD_b@HPO)`{vzq@Ze#JAbqt9y{yw|z5qz{ND~sgl*TYkzDLtkp5v@$tP66Z{u6F; z?mT6{bTxu}`rXIq2otXus_W=|s;MTUH5}rlpmw zEE!Q^jTwk_u3(E19}*XM;NT*H-@d;$CKKqqNjpN+DvsJ~DjfN>+02kyOuIO?=hVD7 z7>wId_bztbB?h_Arwmk%$;|%wp04LVwbg%S)fR^|L&2 z7@_5PtFB$IbWSh9_ZzjJ%19;COnHcsC7uK62d(42Ok;>{(2i*USx|GY_JN_2zocsf z)_|GO$hvh}Op0=|)tc)6A=Y$;WXxJnY|=Z@!@NVm6{@kLf|mlZhSBj`@zoDyFw@Zme{lQpF5f=6Hrg_|W-QL2 z*PEpBH9ygh1LizJTp|11PY?BfZ?TzD6ttjS8B5ygy`pVOI};NI=aViVI)u@pk)rx& zHP<+PXExH>TVz$Paul=peBqFV$(rm!xz2RT42=a~|JB+thio`$Oa$VKzx2$?Hzgr* zMA&<_dt`#v=a2pI&%$}5kNrO&a5R!kOi0X`JF$jilej_^4U+XpV1?}U5I9g2-b2~b zhX>1B5H4F)nbNcrD@Sj^mrGyu!nP_D@x5BR=xCVac@kQ`nMjCX(EG-Q*I%7MkFPlX z^-MA)qmh>hLkJT$lt#7qJC2hywtBe-cbygCF)LAW4D4T~iAQI(qON}H&zsGQkIREgxN*oL`JU9Ih z)YFl_9}FGERK4vV7V&!tO=yzQQw6Fc37^Q6DGO}Pq62C=q5?0BGd|l$HJQchC)ti) z(Og~&A*V>@ln7`?fc6Fu>9$?x#_ZDbHNArzG`Gl0By|B9nze1J9MOc73_8)n_rOwj zd*6I}sjIbRYB$O!$zd8}ZlAleGcrEEsF-N@qghO{(_Tx$fsKL);j1Z8Hhh^LczpX- z%Hl)VkuU$MuYUKJx9s4*swJuUzO^3Z+^P!lN-?1?r76!+m8F|!s!36vrm89P zzFVJ@8SdO^y&&x5CVn;wSNH6glN$tY7%EvwGWc?;O3N_V-HZ!INZK~~unyi`9Gb1D}RTz6yoVt*zCgv*J%XX0Sje%ws zK=T4!eLsU`705fW)sT1m&(Y73bSMljTkCZy6eTZGRZX%o5mKpBaRfUn(AP~bJ$t};Gtbb;o=o#q;@16K7p z3YQ!WU1U52c`&?;q#)QW!YsZ=r6ixqWBPH-0Yt(nxkfoF;r{MG_6b(axP&4)O3pZ- z%^!;ZlV^obqKfvaESonU9+|wUe9iq(I3eQX;y7aj@U`qCKp64;?_9e5ol7>Z&5tPX z22P(fV>H?hq4~lZ{suZ-JOE@r%-XT7?iWv?s`|lz(Y2puJoIEw8`lyo<)G`6t*`LK zA&>Mv9}lMH`8l|ku`Ln>-6YH~QJdt%w@x%NO{UpNzz$S4D_g3*&7Ldr&jmpc~=w21|85qk7A72(ZjoeRd+L4r^q>99cq=v$L#eRm6=H4{36J;3Z z54dWR8Za{al#E3sQPq_J+xlfL(=nR9(M2Cs!xi$HwXhs&Tp_96dS^F1nH&vozma_3 z%1FvB!gEv98*;<4Jeri-+C0laO%=ahY569aRm-M|o(1IOlIIN*##ket7)`>uJIY%= zUQGmUS)f;at{*FaSJe^8+cSZ<4XA(y&)h>G1*rDClH1P&WpP2fnlop1G9!a=E=KSW z?2avnhES=BJwtpAm-DBzZHy+R>YO1DTQEb%5cD_O3Chnj+TG$`oW9MHF{N@D!d=FXgHlB*ty}QvqzFXqzDk4Pfg>i zud|gX#Vy&9$T(8f$MWd%*sTS##hy&@X=J(1aZ%NJDR@5b)K-LdZr)p>zCndI{)fJk zsEvDhSIl;=Ppor^d;`Q zKO{7erKBcG%d}-R(}N-R=2UAjOX>J&;WXFq5C)z^=`>SKn65Rl!-0`UPQow*qt*}EE%o@e*sl8GVI z6ylB?!==YZ2$q`_nXfGx8B3H&t1K8esK;ic9VGAh)7)FSp}CklxEt&}yFK3&>}~Bi z8%G)$tQ}8O6S4c?<|LIHkGPG^F`v{7)+u7e6T;KFQ&w%rBUk*>{B&c|0#nF4@4pz7CxOQaMxBG6g> ze*96;uTyMJfz85*X9i>;m+gtXmvw{n{`?1)2;y?QHs%A|!>kWou{zsjtIb-Gve%!v z7|P{0KGk=`(QU>Eo-Eo#`GB_b*t5vNmA${VIlTv4OOa4`&#oG^z9KsmDuYsaRaZ3~ z)uPAZFW6(mKX5$;z2(G-p}ddRN#VY9D!APAG#bi^;gk*tg0zy_ zoa8F*N0!8M@XcT=ZLnhHw7{-pFb#}kv=e=T_SdJK8;#lePwQ4MRaGt2Fpgkxf)l-u z0*X4^M8>sj+>ahbe5`&gbgzwO+f;jioJYlfEwfgM!`8I_mFgKzD3|rc&(wHrn9S^ry{LL$uLAV}#x60lW=7;gIJhNh>|+nQK~nayzL)tg zuDp{u+Z_1#J8eJdbBWVy+taoE#RE&&tx2=O?>!fILX`CRC)eKE#_BfLBo12X(oB2J z`f&|1UW^_6@2G~L-nl4T{+QzsCGLJNrjRWCiyQ=^xr=m5Oqmr3 z`SqTZ+ypr39EO!XQ*<3`gfJMboJ)_Bq>B=Ytm`FDJkVkW6>updC2v$G_39zSpn+eC zDv|$~p{p1}li9Ln{G4*AC$r{zL*=FNrbjjNF3g;W@$;y=zB#Wem zpJ-o1mQ8$308` zY1E23?3_#cMT-mhQ)3@J%i{ByDY=330-#rX-Z>Ma3ADA;Na+Gm?_l%iGPGKM@~mO= zbwvrJhbq~l6~AC@q)R<`oUQu`mv70$kd}q<#S>X|uNOgpC8sg%@0U21-d%=}8u`Xo z$16C_6@=XwUcO4R=k?$-M~q(Pw@DTxr_(C?HZR$E?7SMe8eAhlV?a?NS?Xln6lqz^e*GMnM9%Dh z8vfI@Rb{qEfINU8FZjwconN=e=0`1?t5F}`{dYQ#KijiiAVNG>8d!|2r|KfL+;~DR z_Y)hq3Nz@r?A?0q%klLNU^=_Fsm(D1$-mi)&}u8ND}Rjuy)?G*P&yzwu9jRx^_79r{nP z@ab-_3Q~m&hc>5dC&q(2dNs)s4uN|Ja?VW+>LI=I`?Xg&++88Z64(BDH1cR5)FE>4 zJf+Uo0Us}IHy(=cw?R`0ETgqQUsOG*fZ{U>8kZUVpTSywVRTL9A@JGBx>s_4x}od( z*TG?*^CtKWgj6EK$c!xaxI3C!UX@Sv)0CPNnjFWn+(Jbnh1@gc9&1-j;;agNx03Hn zN*x-N7j82>>Iv?Elq7Tov;eR0rA-{IHHp54cS4?y?ey^2HB!Y0VF4SDF1NzGC@?tw zRvtPa`8GM2uV;15xY?7o+#(!L91l}{)#=bA;UOsVVHZ2Y3p1adz!F%h85@8D!#DBw z(WQ-lqNwa|6!|?c3$%0ufss?(QQ3{PR$_r+^UnX01^ItLKRzDa4fsPR zo7OvHk(%B@At|NQB3RCr_mq$_bf#xV2*5?3^rf1TObg{aNc30!pN{!tO3RtVT(0@a z*~d>3N@8K|^I`76AwKe!bdB>)+7jJba?2qaH0O2nq%7t`X9@8+(&Nm}42^VLmu}WM z+nclCU{m8diEX9*lVDifTnHJS$}09wvmEE4jp(n=AI{2#HE0QYaE2&W_SO1M-+-)u zPjg(V<&=|8JTc&_$GkX(NcIPLrLq3v8(1K95r+W2V77AZxcLuPNN5Hr{bxxy3ChAQ z&jv>&6x&&u+t}^>Bm$#teo|#h3--;KBK4f6{cqgI#QLKg{{93O3=Vy3>%!wa!!Lqi;Wg8{Mqh%SEY66k;>w|R#~hJiq+B-pw| z)cpRW>e_y&>e3`{clnfbyXWYU#utYxibt;c50?5Iwd%+*-?AK#5U1v2V zY7p|egrnvsOC<>6D8g5(xAEr$v;oOuh8iFBP-0q7czHXr1pXxrYJZze-QE18x4BQ7 z8Gm5?ylp_p!7sM(Zs=a`9ZW%-t($(xD@Smtz^DFKQ?8|4`x18$63s_FC)&%;Gkg}j zdK-9tN8G;Ikp6YoUNNndT8_aeV&Tw@Nl{<1LATyRfRPsT{>>@*WE{w(-<9XGJ-c2v zgZ>PYn6<~o8v6YHl`&3(_L<6b;rkmQir1FG`dGb9TsfTH?8{->x}S*hbu;iiW=WR& zhRr!q49go;X{L;i-t|OxWLQJF@xPE7*1>iG+|;g!pYbr9*K~+30S8fbPL{xU z#45$wyO{u7C!^7iGqYdb8^`8%`lGsWa(@4QXouxL;JtRVOy)7%dc9nGExsd&p8a${6-^O7m5Z3Q(0ysvlLml3|1RGg@MTb z+-%@3h1pIi)e+U%Sg)3DjEG^MvoBb2R*Z%o{%Pm=6OG^BsS=kFCVMfC&zk>Gg&oyfps&s-X0}}@H8Lnj) za`@`PeKGjT89$}X`_^5wG!4JeBG2&mR1+H28MD913%-glpwbSU;ef2Z326g_oJ-T3 zHGP{6c2+xM@A7sX0K(3gFkW-Ni#`wdv@TvF44|3BEak&fd)5Fv4E{3Z_g^a??zo<7XWeYKt4w3twphzKsIiEpDE?&|`(@IbFPLE`vH6{=={32s3cn-$GdnA- zG|~UrHt|nuA#wE0v!{_~qEtN|U-5_934brZ$0LZ3DgLU7whoAs%w2oC7iFn9*NY6| z&it7j`8Q2UR&tI!g)ovGm55IDlY% z1t&G0(e`M23sH3FhkRNgtvbAW8?$IFb6Gf3^LHN?&n0+F-baRS$Kg|ph>yMf#W^YF zoKjkUo`>iMv*mcuMQ3+9T}G1f6Ns z^?IMl*||5<=bU=f#cQ_2<~~)`qWh%7(6!|+;1~cd#XxYhV$z{Ccc8Kb`y4vbeeGZ^ zsL+Q4ZcUsYHn(`rZ$THPuL6*n5f3D1@9oGmro`e#r&)~5P&?T~% zsv$)_*%z>Uw4m&-+HHpL{&s8rz3jDYOIp;nOQ!5y8v&;$=B-)&(;1-ho}2F%-hvFD z9iI69_QwejSrywY+Mp$ie*;m{7(O;?g%rpnbY>&SavE;fam%40Eq!-xe0=lu+KI!e zudlpdu8U_KNU&_CFuaJUar)bq>Kt!8Ajyvhj^SSFCIg1|ye6n%7X2Ha7gLM|0e`0fOeoeCfU$=tE~G{qjY}c+0=EW6KrT z4<|mSkHW`ptdMeNd%bfl`-PeplFg*?AIrU2eA$}yH7d0^8Giq8{p3Aceh1dtgJGYk zJBB>bb5@g?e`6wgBLSzuSE~JU!-G%r{o+sjPJF&!Mq8No>Q_5X1k z0{%(+8Jmdr}erN6$6)$|#z zGdeL~_f1+JX;D*fH?|l(`|TmiLj^tRt;->8_lq2x(I|LXb++hl6G`&6)z%lZhzaye zdB5hVaOF~neqw)F;Nyq~>hN?=`IM*7-Jc+9qTiQ$<@yChu+90P#$mq|2wkYhe$@JE z!C}Oud)Sr)@AI?BW>zG=DtQG3vd9)kDAtogblC*TCdX{sZVx{V^Y z`D#mul@p0IEZ1+kdPQZBe7vL_|MTu6)u)0#~U zX&G;WMNDj9yQRjm1}x48;2?S5nsfN6iq3A*tyV%xvH*gv$L%&60_J|R^OPjcV`a^k z%WU5?8|;!W!Le+EvhcUKI-F~Lv3x?Xixi~=&)otpyaaY*9~|f&_U?Xm9p8B$Y-tjF zIYd847i4SbVsPTUtbBIjw@&KTngm~G2B=nz{=7xKp6)gY4S1E1eZnkh3pK}8GFKbXWqNVmMF`hJjh#pn4*TW*ZTi6L1)cO zi{2LHx!FeuQE(mKdHMPjwppPULx>F8+;W?^D!)ji*Nwr%C4|NDk>ZQ^`Koa-_oyYn)N0Jhm_Ist@V7< zs>Oz!X>;*{nM}1pnQ`|aY)M?;tXF^&>X4+CQ(2 z`nQ;6K>Y#2uiF@$=;}4gU7`nbta!8_?NeWjRe`g~>9U(!*?jD8+})Hz70K2lp+)r^ zFEPE$g4OR-sf@?DvN1G8=Jrhca!}WMLg7jk*?%IoX9MlD33MpGrt{z7llX#EL{w-M zp=tmk4HJ4(CShr9rDlBZ(a8``ikj0jv?!&NB;T(>!(Prxu%CK{%{ak1g&bt))3lhaY zSa#lO@9NDLLlroxJ&QchDdpn?y}FH=&ZCu{jn=<86gxY^9-;m)(IPk$d0|V@h@HLH z%q_(EKmxj_!p@?}0@2lyz!1Ub+r#IV)f3S?PEBa~elas;-fa@3%My#tiH0Re3~|nP z!MxCP_QY4tCofp357C_v+Mb=-BtuNBrk-kOxG_L~_srmtwf6ipGvOcUKh8sJsQooe zN$2hy;U>p?6gXeQT=nV*4UcM$E(2aQdThrUvm3^FV%l@y-%o3RZ)#ZVUT?bvyOPR; zcv$|krz141K*IK4MibZAyQ`Sy{Ur}s0QlwonEmsipnKwq?x${;?ciqc(Oq$x)dZe! zIz8;$)35L#6qsB>;DB>ng>h_Eyl>4B7Y)=iB+0NJ8C-n5-c%yFdtZ-IcrV5qpDI`= z1HM8t04@pX6271Vi_zKtZSG~kZ!m_CHhZ9Dd?9Fd@DbPAyW5xw-*$9iy}F_$a6Fen z_)~Xgz6$Iz&&<-{+f$jml50)TBEK!Rwlv8EmU)kdh2#@AU29z zOX%lq5I0pd!OlZ27)?Ee77t}isM0LWR&pe*{2S=NJN_k!_PyR3z9!D)l53vrE)ql% z0$GAyQO<;%$Mte_;n@7~k85KZ*C~~0%RyN0>$vcY>r6Zm;an!Tm^$Vg@Os;)o)8+u zM;2ctb4gAQ24Gjvu1;=%zm_n`HGQ7J>mogy*3``?AWU}e`l$?~yC~_BC99J&fb4`B z8QpmyvMS5XT>|9mHNY)6r?e$3zN$HM-O=i$F-U`Kf2*Hca2IXn8?Ht7%?B1g)&sWs z{@2-c>Y<$pL!unBuRkHeg{R^OTgGlmq~6}$#i6tzY*umWrZol0`T>MX(E8v3BDITjY14%@d!4aNa8ozbj;Fsw-e};&}d% z-zBf)?6HQ(RZd-{R8IvjbNkY>8;{n}1G!Seu$B`VAlZPK?p`RIeDFq3b;>ihF+UQw z%neU889+zr9tj&K!KZ|X>i#9a(#)>(np>hDKp$AU?{@Wo z&(&z&im+76W;U3bNNi$k*m+7{Z$e}(7wB0ijyG}gPN{M__H=rLY*}fl3EiS#@WPoL?R%Sa`NbB?a4>SIh5<%Z-LIF~#GwBG*MsyT3h17Qkin)<+qrxK< zb5|&kNb|Liqife(4nBNqKi{*rpl5N%N|ak2xs2WCP;KM&rNP>qgpoGm8F}`j^n{S% zHqc(EUEXd0ll_aurp?U)Uw$md<(Yn?OEjrg^8`rkYkXED=UTrbdS;t#PNq`-S|#PU z)y0A0_2KovY0!t?ikzo?BYqjGIlj(Y=y#6iY_%?WCb$IkJ$3IC5B;vV3Aqz~B##7F zP?Vh18%QcTqV;%A3%K*b zvey&d$~l`CF7@_pB&E;H(a#5v$gf+i>+53^eu7$U%p-5@=t$?l>|V297E{=d&5zDq z?qU#YBHs=zLW$Y-K`5R(DZjAw|mv~^7IOi zgj_sPXaM{4Iutv2?;LXJ{=%0$T1+m($b6&zmk{w&jP&PV5`0SXTc3<(gRW}&cIS)U z!8^^&F*WK81WntJYy$u&UQD~kj zZVs%@?K7RSb>aTk)JT1KFb4q}o^?7J5^B87Jxf{3qTKjXdD*>G80 zP=hFkhSRNvl%98s3b5f?u!@^E3-t0^u%^9@OkGR~8kFOCfuqkHpwLI16m4^p^ZF_Q z?6Fti)XaYAah`A8VEf+hQZOqv+PtUH*=~t|^TU%Ti1-QGhN|{xLW3Ah%xYdDCYHUR z#5FF53_dVsWSBE;A=&&i-z?!1^LObKIV&ir6_;Nhaj|kjy*h}XVPuWM$0J`Bk~v}vm!rjE za%_`-8+D+lXkfS9R*-Qrz81v)lb1sV>j0BlLbaq1-@>mJ#|r?Y$VJtrw1^E%0sP}k z2Vj{HVe5sfeSx^r0NiQX)#17>Fn+N;fDybhjd)l1fP<-Q6)rjz~+lFm%I^6U?_}#`}5RFaCV=UBtAL-=m+50|XZm-pX8;Ky*ws9dB1j?!hMn@Ul7`017|yhnSsmBl^2A0|HV zc1!|)yF_lgs0rGg?nvN^Pk;aUrnUqQ=l%ZtI|T*dv43b0q3cfbAD>}X_j68HXQsZP zMknCF3FiSP>@t>4pCl;e_w|z9#D`v5MaE$7^+M9O=yxbQj_o{kiVn=x6;2*Xm&oDeW z!?@UXFFg#LX9pA<8}ory6EOAVXkz3_U~oT2%|63-b%w%DH;0@M>Zw>jE&7?O#Y4yp z8FR*EEAF44Ls#uU_lxCzUgd_seH%U>$sRsJU}z@=28C!w!jVq43#e;V-L?Pj6M)PJ zH+O%z*>4N3OHH^gvbtDD*n?ocn@_(yYkc#8_wKk6u-@FE_S#c~v;2K=38VY%qpu6S zY&1t**de1Px^jYV(7O(c1>I7RXzE6yt_#QC?aQ1UO!&$9%?XNT60F*q^vXU0bMbDh@`fd$|6>?%G^|kfOu|)k)EHimTk;uA8Gjz z%d{X3^Yqwis_gw@NcdvHN3UfSeu)kE3WHL-)3{$?1Ugq zDugXoHDIJ+tXy=s5UB=e=sSqT2Z*-Yd+MM*o)cQzTi8=vQFc{+hzoF>G; zNE*E`4Fv)z$3hIZ-bLWyudxH*_y!!lJ^_q=IPsW4lj+~ZCnBYb@Tz53YM|N z7PxGxGSjNg2#UhCb^vFa47dbUi}wNNPOK_I#*~w6ULR+5nWBBib*Blr6ZE4wba3kyX8?slubsM;x*7!@SLWJwt=`3d;|JhgKHOF`sD*QN6F(da73kxCNvLy3J!eA$l zhh|B6jNM}d|24^~>jMvSj@^~jbUH1aLH6I*0hk>%GOLpGeepW4y>UssoYQ_fg59Iq z5d^US?w?b>=7=-C`>BzdS^pX+(P4XMk!>IlG{_$4JH^1bZi@m*FG0q_K$md<$Xi4e1I70Kse~5o-LGi|9`pX2!cjP{~=)S1*Tdy0xEKJTT9s* z{@3=UR~)Apz4jKu5`wXv=81?PN;K)8q;4CO?HFIblO2+3qovQ<5A zTC#TT^CQ}i8;vs4A|Gh_$BoKC0;XRZlAkxCr7K`k^1pfFzz1~O8#f^6Igx1n@eCv@ z!EkqMbZ^WU?$Qb$uvAp@Pr}_pKc2ewAWdsx@BhV`CO-%8=Ky-vp9t{h;5#$9GlPic z&evkB?r8v)`0F10rn6ZUpxe0PbmXNxc|WypiR~OiatoE^2(zDSfWMtW&laY zdvQ7ObRzhCfhXP}dSd7+pfy(GFRc+(jqsxq=JZaV*zKI0 z32_xIkWF+z3;TEy{to0XJ~?=O=1N@QU7&Bh$v;vUU}@nlRj2lDe%G>%eOYAn373Z& zZvPdrK588s(ar;W@?4jAzf7#$+#QCEUkmNWVJi7KpWt;$MwO2AMS{XECOhbcteKPm zpRb}yqOW>0-|X(_)3j_h3gIPd&$Udqgn8*4EdOrr>N2ra9~!#ey_G!owKXLO*`Ze} zpE%0$4Vg`Z=xl@>>oGp+4;VXw6FJ5o<9_sxfY&7T0)U1z+l@Ig(o;ZC-lzvxc>!+! zpys1D{@3yw{g0g-W8|%ePF39YAml958dUH>Q z3BTVMFvK3r3i52Hs@Wc2lS-@TKqu48=j2UpN~2mJLQ8tSvUo&528;d_^I*in`&O_F z9ee9{ibRGV*EVuJF2-{8fQ}o|r#h=Zml+=RuVG{&0KRi6KDWhvFOn;=$H+9gdZl1E z>Aq~wDt+tmNStviP;oZv5;F?hOn_| zd9XIgWB4`1n5~eved3yEm#y6c>HPU!an`jgC+{%B{JqMV{HLaZo7gN6)B8>an-hG7 zoADX^*uen${Ec|i+QF5T;;tM&+fL%~$=;M8z)Y?)A*mYMb;K@Dqc>p&IK zl8BBoL0^HEAUk%8WL)6E=Y~DFB!fT3vr^%Afe*_2*9ZMLo_~a}`Ek%0#`uAkyAC+> z^N!k$25Vdu)~-#k$Vg63Au8p{?E&G}(|<<07I&6RYyDx|ZC}w# zDfD%M2cn_VL3I4Jd)SrBeo^|A{!?Qt{``TH!vW4XYsaQ4@r>-q6|?`DR%{gxZy#QP zyz_~4%num=gy$yD>|TPr4<-1GAc)Jfuk_fgDel#f3FJ*CzPgk&*_K3YA2y{4-PxUI z(3-fD50I(pUTD0X+RiICvqTX6x~$ zEDC+0xPQbv*yqjWnPx$CxAf$g0kgw&uj)w2p?3 z8@kSJI2}vU2RH|4Syv4@aVGxejF22+1P~OIM4v4L5S){CQs?yOeM(-hOa3bbAGow! zB|Y8k^@YW>zGoH=s1LQNaO-Opb~^+&RN37{i+%u_g#6>%K&|U{8#~fR4=>txc+yk~ z?zp;LtC55 zx;L>ixBUt>TBZjwY&KgJnBC3A$W#+rHp_4YO_vNFS010RnSOh!sTDxyr_@$UV$0LgUCGYz1w2j1n$bgXt?0?);I$V-ms#e@P`z0Y zwEUXMoUKJHdJjY4D|;q#*%V2pa_yI`<{zo7ho z<8_RdFs|`7S(Hxm^Z;Kym0D#rlaGA2q5anFuFlkI;vwZX<+g2-SG!twDU>MuI`dX(M;U>2_kq>_eN(u1a72#S2WpLZb4?&vCf z>}Ze#g$jWi$`}r$$3HhmKC`kTJeeAAfVgpS<+cokl&VFEZ56EyUDxU;5eeALfB)+3 zJ8jNqV6T6U=GAdpy%>rndTq%AQSWKlf`4vniEwydLH790h9<_0a)bQ7$M=%!nnu;R z&vTf!MVIzf(klQ_LTr2VeoQ$Tf}z=}cwEsxX3iEQwFrP=PP3buH(E;wR7fF+dnAQb z;YU0rn(zmJpG5K{8NIybdaDwvXbC*{4Fa2l{Qj23IGrLRWRPlR^H-m6W%UJeRil5n zFP_%imV9)mqH^$Tq#6FqGADU?DWT7v}pKPF}eJ8_%c~u(o zrs##Ge#z8u`IieT&jBL}+fPaDY$fp_nJSitlDEod;v<$o0D$RSPpf&~$UAFT3YVhNp~qTtka_LdGyi;n5t#zA z==We+mt9JGy(m)x8x&z}-%lF;tjW~}TFlc)XEOw_d#_#Z9ZQNkVfmrACAzWpIF!rG z_L=PG5DQ=fdcMg@uxRWb%Z#-3`V@doWXL+DP${MR6e0ncp>X4^)ToMq@Ng|}@jJMhCJ-{q(B#0&up0ngT z#U)JdL1VWJ-7=S|om8+4Efud914gw1xw&i1U+a91CZ+j|UfZA_KND4ZpuNO=1lqd0Y^ev0O?o-0|OU2#qFE;+hT(Q@0eIQb=!#gzAq9Xni9tA<+ zBxUCU%I^5E*05C3MJxrV3Ai!c2|*MzQcTYaNtdAME3I*(3ooJ$TP>YP!WoxYAzXrwspFF7t(c zmAJ_p6wh)hZb~hDMcYpvWnohH^l8Ej1-ex<+05v}L=m?0@UVsMt;n9ozYqDr7V@C)#8Csp618c!NY0H?Sq;k*&6)P7|oVCHDY+C9qOSbsrKxK{=;z#!*|oa z=FBVw2&5JIrAzNZb^F`jMo47Q6YUEjXZe_08`Ag;@!O8f@V!-wpT~DbULG`}Jt;j4 znSAPpgQlI}*+=7CTwyQri7o(;fTbQDYm1l*-znMvvOf%@fqrBYGhXQ&vW*s?2924C zgp8$!C!R{H5TcRhS*L%j(sMP83<^4EE<6q~IFC2UZSDs<5-5*OQt?jB6i9%aW@|4C zw6yf7#YWIIT7vP$j(os=n23Ea_|no8pwA3H;@;!iXr5kC1g@rQP_z8`N>iIkt-I1Q zi-iG^HF~49lAnTh9iR8gAC>lYhoj6BU5?mqa=zEOlpkW^-lJH_^h21#S(q z+8a(?G$)vk$sAfkRhy?2G_8)L7;ss>nUaSf1!B=nk71I3nS;9+jM+nwyyF}oZqJ5h zJ-+~)W~C&r--aYqHhSO#+~(iv$D8G44&+8mz2>MGs5-8gRTI)7;K!mryeOTRcX>-@ z&NuUCcVf7{l&Oh=oQD6Y#XrJtVe~1T3%dS%*uy?xbzpqr(_AEoYw8LFmtHQx+U{DX z6&&>OpmKQINfy}G6+%yp_u$z{Ca;$mt03&~E>I2?G92NI-jXGt;Fe$+LkAZ5ORP_y z!{kyq*n#qlB1tLUEP?~p4~Pp_7+3M`Y1+k>@qUR#j^x{O%}W$@y>&resomG zKV=zUiMSXUoi4!)RnA@tPCy1r=#9xfLtIcF$6I z^qafhXq8w_{vF`-s`uE*q()fDZ!@3dkIUvTt?kQ5%de&didVyS9VW&6ogAgGn}WEXw*TXna;{K4J}7(5Qy%MP8OgVe^;`QMz})t_!*V%Rz6t(xmK z8nFM|Lu;HK`q{@J5gRo^aqxnJSn-VYvM0HpSAc;YGC#}kgb0(eJuXzg$Rm)>^Md|# z)I>4h(R;$y`mZVb9RFE%Sh8lWzI`xlNhze;u`8~V^?yTvtrc)mBf?2Z2NeegUFy{R zcAOA0b14H_Kr`K(2bHv^Wi&{E26uR0php)Z3m)WwMueXsq&k1JI^G{dyNVFE0l>X| zupJ4MrIVpk5%*5XJNLQ4w@z3MTzdepL}rDldSPQN4lhr8cDf7H37i5c8zsLKF)m6I zk47C6!uN7^U&%5Nc4FwhB!>HqS${MRM*#Q7Dy3zO~S|B!Sy4iK)Deud% zBx~h=iQYkWJmA_x7ru!7>ww2=hkiLqaF@G32JfdfCI%g~a*WYs!9mIG7GA(z4X+D zovDQV6+-baZJ${Fk%Lho_0~+mFXyX$>`>2F9K*^Ljtpwd9F*)~>OeN8Y5-obA~PbbyHJY zBy20c_SBv@Y@WazbPBLG&D^FMbTssW2|aGnm+_Gv(XitJ_XnRg>?Ov;QBv*>~@tT?i#H&L}(qq?fYn4?X9*~h#eOo zCdFXJfO+;F_Atl7Q?0zFtPAqBfwSxp1Xc<@+ncx9^M|T8QN^_PbY!ML`H4`; zCg5SN^D_LEg+f#s!nFr?AM=ZATH12u;^WGVaM)+@Evv8u&(~}CT3mk0 zdR+O9kfNs&uQ0cf?$H@}>L8U9JxYA#ku^EE7=*LgZ2W^!ygGOzVS(S!{f6JIJUxTx z?4jR&1%P;X>IAFo{540*u+ePGb&quolR3QYLIZh^lO#Y#4IUC?t%vMFpg1hPzWq=K zoktBFwMe*n}P;Ml=PRQo(Vre#sErQM?ALLxH$Th*rN;-_W7=Ps^)}rTl&+{lM z!_B6N?LWTFD^7W!?_h2e4Bc#@W8@*3IYO?w4bIGP4f2j7oteUCe@6eIdoOCFl1TaK z(Xt&K%TzEq`)2jmhJ@^~J7CBd@^+M18gZWL0Ibu`RyKlz3M4rw`O>2hB)CG11QQS_OYz z@C+8F603}kuGWnZ{ko!4+L&I!SR*DMQJq~bvF4s*_xbB`w0jqe)ujY;1X#s+V2i~Y z@5SE3a@vKfsoGYVBEH?1N|)3o)C+7WO4VJ&BW>c=2yUQc(i;I11I%i;ij}>H5{^>^7(np8@t0}{f>Z(q{m1tVQOD@y_ly2 z65*Q`Gcr|#`dep-n#*&Tiq5GT-z`a0Pw~8S8`8#lI%l}PlEr7HWhCijQlbu9GteW% zG)2aHI#4zH_MdjFw{<$@3ywvXsEY}wQ~Y~6S+<0crL91@THsDxh*TzvU zXkkN~?tba*P6%RC5^h%l4q>B>9CZP3piYy8>@vq zXR3GEkKV7GpD-QWO0c+uC@X_K#xF3GKI)EtG%s2;?t+LJj&d2}&NJM`%8BQz=AG>( zZ=IM++{p`+)pjUb0UciJMnha+G?WCY1<5vo>eVoX z2mxC$LN&6mGM|s$u!!D!`NLr0FLa@G2oQ=Sdb7rujW+Hiq!O^takmXT>F6xcAOHB8 zi(dedQD}w0r-L>dTZW3N{{Ry%R~?p%x-FBwocAf9w>Ny~mfh=2uiAfK^9(N?asDYy zD5ehlDqGMmx+FxDLO014gs9QtSIybfYk?3>usXS)=b=6EV&b_W;>=1@vh#Z9vDp-A zUBM+Zq4|DyXW9ub2cI2hCE$p#zvfVQln6@SwQj#{g97HxXn(soxY_u-&4EZT_`=VA zt{bi?e8pP&;+cgpE1yonUA~H$0oWk?lay3nMw_F~h|#W>S^R0u2#?Rr?~Q}g3=*^V zY}7S*aEapN=gDDTww_N|B~-77X5_?e7X2!ZR}j><_&*6U@&)Q zQFiHdnayf+xq7wc1c8rO8zxx8G7Th6P0}|m0&2>~r6NjZ0zgS>cD8gx&Wqe9L#a37L2gryiTrVraSq%%Y@3l#HSa0j#f!r^P@B(k?(x=+0bHWYNbtr0 z5IXQJYN4E&$$6M*yRRCAtBL#&0Sv<*{~G>-hCaYBbjW|{@kOyMZ(+h(AAn|{Ik54i zWcV{Vp(!P)f(VmBQ%cw}mqIkVo(dVD<~W^+?n`W|0!v;;L==^T>HnoJ>Rie8SIb%Ht>A2x35JvRQVcII$ME1jpM zO|8ETy<1ColCOb*80ui_!rYu-9#+etD-&7SiAqRqbKp_SFJ0$6sel$&)V3?tO`9CQ zYZEB2A1$8PHIf}{_4Kg6ngb)Y=2G}`INrs5TPp!69L#c(4{IXiH{~XXN|pCqd(IPO zFk03321hJbwH7V(7|B)rp3wN_^UI+ONwkK6tH2saSzEB=`W9U!srdTs(F^(?SS_)o z_gzyZHQR2}H=*crJLFIyvxnM6yz=@;Sq^GHQt;>xXj;AT_i204UY{^DHmGr0a~Lls_Uf0AE zq5fmqiT=h?0kRDCK$aWhCFW7UBuc@6P2^GO647Qu{de)_o!DoF+SOK77aO@AMLNWV z&4Fsm3rl)TOP@_o<4r$fFP-qf!#2Z~_OL$$sg$ChuEdpFy@bcB?u+9xwJe{04?E%= zR`~@-#bo3$mkWkCx$TX5?7lyM|E7- z3|j~&MRqCwIh$K6Orh>BXa+Tn7R~Ps7+c(`mIIk3sfj~tcbA%cNPxh928^vA&}(p$ z>3KQ@GO+aQ?hDIWzU?9R*3rcGZ-6#9`F{VCTk1pyF#c~Mk;Jotf6Hu%>)daMD*RzR z2$H4!wOWVTShJE+ts6*f7n;?Rqq!PG_uVhKwO9tu+)i_XI;(Df?yX2f{6W;vM70;l z5&BW;BEjB~!SpSYzBNL|(+hHhzseE`T&I*?NgrZF9rN>eAZYyP***EG*7)SN#1`$v z_mbSzi&bX|-90L4y}lBPc)xb^?_*VA^L-II0DyZ70y80)aijrOdo$=&9*=&})NJUx zI6A5PqD~9YceN;sB*2FBaE4}`)fNRxL%jV++ge9=aNj*0%f4TVIRd-JTTeCn&Py1r zNv(ZTLc1tg{-Rdc<#AXw0wiOe!0y2-?$LSnwTcm=i0bsncxU)Cl^3#1SyED*LM}&L zTjNhXYga`Ckd-qk zsa4{sZE+|m2ua71+(b!;o2VGvnF1yS0;c-G7^~7C_FL+J#%Au+@5ht7N=pnNMUo95W!#pAJ6dow{^23tgZU1 z2utQx)JOX3g2xO0iJ~^#Oqrnf+|MbADkC;Sh5Wj5f&#=65J((c)GS(zXeB@^;xQr{ zI!i2L>22GB9a%p-zhL#cd2Gf0}T#3JzK)7Kxz%Xo38@3$C-nwU3-(5>>jIZ z{4_QT7wi5fRq^z0I_rXnoxr||ruM5=xJ6EXFQ=w$jXZtqMbscaY`lBSX4=m6SGPRE z$Y9*KjDG`JAc?rKAox8oMQG1(Gc2Ayk1cM=@vCV2^H?9iSXFEGArfq2BM^oO=1!mc zZ97HKl6y^Q`^TXqj=%EA=Tj2v%oDExmDZ`s9nAp$6CL*}*|mEEPP*q~C+%qU+R&R$ zUnRNkQb4)sFw|ooR~su+B!MO4jwS`qvl{rjg7S2MFxM?)bF~>Y=x!>SiW%!5_KHiQ zUIf^Qf2ye1*`%^aor3zS9^>_hFxB%dn{>y4X~m*dTE#BX93kQfIs ziEq!l)xGDcM|`#_z~~87S7Jx#Xw~?e50R`KP|1 zr6S}Pp=4u6?_VS}8r0N_Dw#_U>TB!PIa1_5JP^Tz!;F8?8CR$~@S;)0NKp|u67~)m z_ja8>#yFO~`_NHg(S5*kV8FunS9hG@*oKXJMXo z4drh0)k%JA2mwW^i2?;D&bivB68qVa@)GqctAM*ttGVZ~%1|+K;M^}!-s$qfq9uqZ zJ0wYVH6d=o4=P9=50i{ET=bEEmbeQaMTxIBSh#i_=Wau1)K!t~Pw!p?-Gf?~aS!iE z0zNjJ#HNr$_gn*?QF(!8BVnw$^kl}Xel;)(_pr#1E>a<%i;z%mqT*nz%_YM05s}b|651{9s?(jt6Vkf7(;j_YC5bJL1oG`>pZ^qw12#Vp-vtOa?;E=_lfM%M zN!WO_;z$u$pXILQ(xCaBqO-i}DYDlWWUX_4Hs{<@;^~8_&WoKYOa=+=CN2ZHHhTxO zRAK#Hu}7)IOtby0cBQ&S3odOB)Q|pNU0H+M*1=-?eUI3*vJm&Je{rJ~NM^lPwU4yN zKYlzb@W>ySzW5bRsJ+kM+$t4QsIR< zs-0~J^XyPp{l(l}v(aCC9d+Ak4z&)KennwgmMGx(&CxQI*=vAbo-@(i^BJd!8Ha<2b~z_S?!Mll<~K^XuAu{%#ITs-99*^2d@q zXj{O-WXqM7y0joE5QYk`k@(QNdN@!n|LBZ)-Kk7htNq)cK95*!l8Gf1iye5d;`D1R zlh#6y`Jaq4B)L7F@?`a?Ke%H6Q`;cc2G8!NY_B{gpGpj;a>9dIOj^yNs(xU#_TfYh zLghZ&3A%M+ZyRl&|9%lI4f(guvak6rzrz@I$4{ySk4ez)!)qf!*_`2jNaUU-KEvkc zrq6GUF*R(Z8SZV%2VVDAZ`2X$v_FahJyTaB$LE1yYHWmECF|;vXQyPtUR<0Kf6+X$ z)*;!q9OGUKN^mQE;tpNd!)EF(^Q&cf;hq_T60mV&WqY08emHmXQ;c%O+dVM{#H)q9 z_X{!+a77-0x!RbFHJ8LN2k~y>J^dNsE-rlb5IO%ruO;P_dyxi_ezhM;50O9$c8iC* zvgBceSKwsnRSY!yQNQm%(g-5P*SjPx2q^U2BuV$S2?Ktp>G6%k2*QHaZ-8FRs5WO+^?xwd z2kd)fHT<9T4Hh7@Vd)m&ZYP6g%9_pJ^c4Ub&Mq?*kJ+&-nsWntQyhp*Ez*0SE|J38 z^_4(SBBM`W=7VaHmIyg^fm_i7D$61wiufE0n1&IaYd|Qir_}Dwu6XwE z?kuT9aklO(V--ySwnQ72CkzXwa~VOfr(S%3TmeYHqh{7sBrn7vBG&Pl!=P>v8}P8> zM#wo@6T9zQnZxrkbIZGh!=F3TN-3e9mn5R}QsS;fI`%%;nZ;BM*X!s6h4j$8_WA%O znj(F_#Ux4Yc>xT?d#FE;`o6MQw*VK>aJzy=&`XjJ~}6zl{JRYb#8r zLB9ctx=q7u?hHP?0VO8`z7~nNQ4`3acxQI2r*2Gh?*Jxn=yQjXHSjS(e-2 z;hmiE=;|A-+qJFpEbY;-p%=#Su(B$iU zZ51&Tsp`(*r7}D~PS9(Qi5cJ49g%vpjH+rwziNLT{r)emRACKq$zS87t=sF|m@sHJ z1{-im<4WGjy%l_?Cjiw2S|0MLHw-;O$@Qu=Tm6EU+v`NT^}Qo=y+o;!;gddFp5X-e zpf>`Nup||$qh25>Q2P zI~T>e4G)_5t`7Ry=|*uyak+JZbr=7_7qmEcd8-%dA4u>1Up4Ze&;s#?3B4&f2&}sA zblUf@1bnR!1=^YFL}>=!&^QMHSwfL!3x2?WD(6*5j7d-Bu2(PK+*>Dl$c+^+9dzYN;n(0alSFqoU0=Y&TrOal2$@M^I6FLBcaT?-N^x zrc-qBUe{W8J2I}ksT8e*2~$FdE1_ShYPJ_HZVm9Wp#ldwJTfi{yLfgUj&pkCce!;% zi3?jXEev{KOE`x@+dMLGm=5Gyq;QH90%SJ z=*bd|f~kmKZ#S#8V{n%V^OP&hA+EKW7Kgc~p&!YlxOX17HphpnI~L`HKNFl=;1t5M zcgtnGa%ZeE0`%J2B2NU{Yl98*BbD23z|m>^4%k=d_B47a4nfXYbpK}a@&FPqDaMkl zs8a(UMR0oxW~oajt-u)b7@(ibeS-JBU9-oUIpekbDmG5M=@z;<-g-9qC)TSPdV~ zK}nJ)>8~UP*I%?PAxC2603Qx{YZ15`p8w!U2Q~2UG&K7N<<62#2cQ;_g-PqPF@3Po z=uYRTOKopoA|qSfE;bE|jR!SYOBLOR%xv^8HnDBAE{^J?t?WnJa;osyf6v%ZbfvGh z#?4BA-8K<_PbI!IVj&k#1}%~SFNd2QeKNHB_GN7iAu(G)Z^PvZg(1kD0QHw=NIBWr z&maA1ifppewPffbdqM^Y%oP~D$Yt}HzQ4-i&XCf(X&-I68;@O`!(X&8wUveATWU^r$T+GMHqKBt3{!H_#_%RvP%TW@76&5bqQ|lqWFyLrl|?sDl4%oJ zAsprLw&Jh$qwiR8BAn7!ZKOgfN+ko~C~-e2tnDwoy5bG)tcf{s5_9&P)6j&Q4Fa)C{hM+J>=;->SNOea1ZX;ZtP~TDg%)KJa(SEN# z1lIt-yttUgvY3r5#E3#)_7ies=Vjw{jJHC2$WoA6!D!#}J#8<&P`g<;%;+Tr$|NEr z`;8D6)P#CG3h+`g{)?c8Gh_lJjNRJas;82_^GPl>+2|a4SkamvSBr$#I&C`vqY}>h zkC8O}CFOrG;qU1D+-$r^rXaqd^c-}EbTs$^=KZW!?h`0B+* zE%VYH^{2Gzn+hV@c7f8uY{D4rf<=8Izu~3h8kpsv=;Chc{>w3DV6eaX!o0(%B#Ji_ zx2%<6$t@X-`sNgz6UQXbt{{mBuIOKomx+DFmbitL+;BE3zxP&$fa~hpJm_0C$rTNE z<^wp%!w%vUJk}Ls11>7BC~~V-n>WE!cq@K7bAV}#Ewzr_kCj8tT!6PBb>1l#!^)u~ zIzczqBtKpns*0VA=Oq8;cX4a;rqsc}FD||}u^N_Nsv`@Bt!#fvcLlHw4I66UgJNEauvboBuASjPg$5$q z&qdCIH+@yeimC5RoT}BU?iP)FPDF?z10J>fO=U0D3!&L~1Q;EnJ9{dvur# zCEM#AFsMObP~%2(TWYN~yz}}<&|GLwe9a)F()y=v@+9v;F%Kl|v@_klQNf236ckt_ z|Di<6^J0zOB`iM3?EexAvK>#$6EEuFSe{hAf@m-s7cvQ6ihAG!;_+E9r3>yODOu=f zv87G1(BsPruF~cuJZUB%=VxeBAYk9y;tF@~QfD zO8aMVr!VkC{Hz1x+~qSmDgQkq6l2|E1 zt~DGbqyCp4L(sSOuCqX2)V`5W_P|8Q$CZpdUUm2K2wx97HLSBbX#C?NG^dPwcyVo2 z?3Ujac>C_-l!hgo&cyz~lq|UlNOi0yE1%~epH(Hh|484vGHo0t_06sR!yRMRM5Wtl zK`!l)L65dwl;Y}@`SYYo%5Ti|BxWO(()dc|@4dBLSZc4uCG0ZC?`g#^9BM38iEh9z zgd}1yaYYL8E2g+O<@LF4K&aEEY~&92 z$61z#HJCX9#X z`kCV=rqHJG;38gc&$D6d{u_jMU6J*zd7x3jEbY4a&F)*EF;ZqOokv{T7{_Vuuwc6y zU0QVpyiy1Rg0(f)7T#-spv-?fH5xJ<;?$?hw#*$RM}L2CqZ5oxP|MH>vd`Q%EIaY9 zMtRSjV?BO5-dAfeTe9{@lbh^ES?JMHJG+#X?qS`OGGsOw^=Jz#0Wi+>iVj+ymCnCe z^9uo@okQ7f!gk$XeLcE!uZ)2f)MilJz47@ibG5bgrZO|LxR_@CP0W5Xb$W!Dl^CaH z+$4xcd3h+b8}^4BlK@&I4~|0H7(Gi5>=cJ}XgWr=@q0SN4vE{v-b(9wRB=lsi!Wk1 z*ID7NO_u`BrLC*2yRBJJLBdm<>{SAyZ#izHRRk%P7o0U0jL`q(04okI)2Fmr4a93| z7=M2B>$-MI%$n>{X!-xFLZRGhhL;sDOF%!^iE;vS>P!?>J<1_&w@ZfjaD#UAiv{iV zO#VC;!Y3D_;oP6;Bs6MIC-Hck&R*^_zYZGmMg`5~2@XY>G^zKZfeFvE{)k2>Z10(R zhod?LCX%Od+*ZmJAX=~|p*VAkD`aiWi@|5w(*Oafakkv_1Bt4d)Dt(4n4@gSK4u_i+G zB5YR?q3bUY~ z7UumnZwt419$zou5V-?;Ix@YV(6U&g`DfV$gul+=U3ab znzGyE5i2p>y;HIq_ml)6X@3%S8nDXB>wn&fG zV<2i@1gJ0WpxqB-PeS!#l9*_WH1L2Atk!v8*aomcA!cX(zm%NW?qx9Qb}QFTf2toH zqqFHK7l12gtq#?&1hl-Ez5Z?Ck9Bo?h$0GTr)g0W!;fv~)6kKf=Ox%xInl1bN(!)q zW~fDF+$7Zqv>*`&wE&ZD$$jTO#~RLnnRQQ{+Gu}1Z3_K^sz)jcbj3Vsc6g@~AZV!1mIT7fT#)rac&eRtfn5g&eckUA@-RE#7k%(; zlemB6Z07uvB?m6+NhdQ+x!8GF4O_C`bt?^5F+l~Y`t5GA|H)6hB%{-wejS!Z&&+pM zOy0zA5({oTC-jS6AVI2lUFv4}iUZ zpc4N5({xmx^pP4pXCaf=*Oq?u!|x@bXR%cwZzRwG7V$_+c8u2^2i~Idgx)hwZK2a3 z81z_X5a+-7#{6pWc?i7CgTn&9ZV)dJyfP}M({a+0OTxUI7PPy>$MM^nB06&w#=B)xmZ1aWvQ{$2PZgg^a|OlSY8M} z@;}1wSqThJ8P@{=sH)`u0c%}0k%~GsFC8c)C3`Ari{Cm#tnKT)Yw*wMXTf0M#dX*s zE^f9FgiXb#m#;U}V9HsgolKbS@0~?GkoCodo2~*MOG7jWEZ-PC#YxjE2?{0ZaZ}9wryjl&o)(oYf1`GijgX)AP{NF zY2{tlLv7@96H3ef@jkTk1`-1x_%v6Q!!u!Mv-!kGYb4hh-ibFjnmNYj)#o(xTVTOr ztcvA=O+ZmGVLZ@}Q@B)$F)#FGv{s*5Rphm+Cc9-Ll%sJasT3J*R>pFJ5Hx&!nxOO$ zXjFN6T=uGOs#sv5r({;_%*lXbO4e;J{fw2WyS66DGZ%*!rVUQ%^MA3aso66-s6Gkm zM&7(d<^M>3zc7_iR&H0S?L*(e#+vTcnzsNO;#l4{* zc*D16PG|vP-Tbrr2l=3We-Gbmp@}{S@j!1GKRir6qO~m1T+n-$yk@YRuOvJ9t%Z4Y zv04_}e=oc1w`;o~Z&vC0dIb))B$Yau6Dt&#lo34Y0AJzW{^9!6+G>w=p?wsQV;IXVqHm|%clO~QxdVcU(h!aI&2Vfoj%7=~T1j^9}a zPS5trrL1x0diR4EJ^mk9QQNDr$Ve6g=jC4A4+RfSIbC3+YDqsG{k5N1dO|-wVT=_Vh^On#O`fB@GiMv4_Ru5uD=4^#x z8~HP}Rg2{7Dw=)|mjS~&MhfNME;d9Q+xCEIJz1SU2;f;f@gw!r$CFJ;a@+$>>m2x1 ziZ1*%LH6n6`Z)K>3o@0lKc9dA*HK~@%u87n(-X=a zLk=aU?NsPLm7_i8efZVj&prk`3x)tdLWoYm+nMXZ_3PR<`8bvupN(-d28_R<@Ok+q z5jW{}^y;1cXcMIqXmR01xEXYl}?QdhS3(SsbZWkT*Sbf!p@J>PV;gY z<%+X^jC)ASR8gOmB_4T?44#D)Xd7DpgSoj;_ZqDe=ELQeh&^fijYb zpE}A?tf!!O>8c^&77G{5wSj1ArDPEZ|I7u|4Fr(r-D*Y_Di%jbE#GK8Q)B_<ZL;P^jt7A!ur>Jp}~ z)804*cPkiyN4Pu)WT`1%6{_jZdK^=J<-n%tos(v~z5Xu`rof`Qqs<0_RhlSCEj4-_ zT=`%aTh^s*7|(ZIJ9B8h6k$j<^f2Pr*%~E~`u;0PDD0ZG=!=0R7q+6HfVO`|GPIrw zwI!N^N=M9%Xv&N7OQOby9Qe42q*KyG@}Gi&lE53PRpaevO+Kamg-l5w{t7bX0b#QBo`N^Tvt4J;&kRBR; z$*-xtrMZcU%Qp^7{0mO^|I-n2Rj615wtnGJ1HBRj*|lR7((eFD8G3GffiaQEyuc5r zIXRGI`=_AMHQJqb?!YL2#vMr3m8H4K6CtLzs}6R^ntz8KJ~jT;yQ1vGNN}%_eHFvb z)muw4O|WvKT5@rncDZs0x*$jgK+B?RPC=(pj}an_S1YgV(tq6jX#4Y5C_dj06z?-m zD5r*|&RJ5RrEA8YEIOZ}J<$;+AAI8?Ax^)j9r)n4*r<4O|#`%Rm}(Wm(r$Q&m@;F-KP*TpVwg5CG;48HQta%e7|wdiBZ)Y&+^;M2We`RWCt zq?)~gY2fioug}YiXR-f_uJ;b4@{ilckDU~SD6?TiRw;W|gshP4J&J>H?3I!1Y=tN* zdmlMAW$*1AjwIW$9m3)JKI-#4&+m`lAO33I@B1~b>v~=9*Zo^k>cv-^6mD1|b8hop zE*_mSer-beMX0`rDeZBDd%o4?ic+syVXsiW80B2VW3B0!NTI=M#71WfEU}KP-6K6I zQhQWPVb6RsbOI6L+y9}U09#^rihb{5dieKs0Sq~@?>#)XHRZGc-3OOwmt+6I$UtG2 z@O>Wj$LD3)o;`s-e84r$!!IH#pys`NsVkd~wxbU6p1-P*ganV;xPO>zxakd$h2e|P zi!pI=sAGaSD_cmXsOQ)Ef-U1X06coCXHRaq2)^UstJ z1D{vp`q)3auPcELr{w{B&Z5`P3S-mSl#qZiv48vy#UEi(E2LRKq zi-QW#O~?tP=2KZ+^IlESiq}?{(CxdZ(k2 zL-p+A_*>30F#Z!;cthR2N>hCz^g?`!`*qZW)9@3-C5__2EQ+#ut0^n{^5EvJ6)K=B zUi0+*ZvGe+KboMkU$N+Vx?`SZ3Hv^lR(;D7_5+@fJB~Wle8E>oxL>CT^4a|{j6qUobKQS`wcbr6V>j;G;jY*dJ zd7w5vDh&nKIhB>va2&-9Tg_@sX{D6S>kTb@Z_ixDdB3{b{2L2_T>Dojg%jnfdBlxm zNJ=;bUf^Gbo(0a^wc;2P6crjo(Ig>|Bpak)U7q1yKpv@m+TF3JH$detbgd!At09~2 z5?GkZ&&6S|Sz{PpbcQhh7N93d=V^3YZ~uhad(Xm&@pJ&ZsrM;%1Q07bE5IhJ(^{$~ zD^aQLhUS%%;H;879l{5RAz2D%z#p-oC8x0VoZ_&F7+N3Gc30}al$v1VjaBOXC^qiw zlm#``hD3`24v;Z5F}%V*}EN z8urV}Rv8ac?}BV!Gb&WR74FLO6KV_aWn!F*>CJhkINl3Uety@nlx+h$B<;3Z%w@2P zqtp22CnW6E@fG3qXYYC59RyYVZ2HYIpWB{NYUqY5kq$<0#Gr|LwV`4uT4Rm6$CWUq zkNJW*F$kY`T&((wKabo};Y!uK$w^%+onGs@52UfRCdGHArL1|nu$iUn0l2Q0#zVoW zD!FAF(3gVN5;@aW7{n*NT|-*P^~ZlHfWS+_uS8|fzG>*mv2SO&4j(V^?+{g{h+fFA z`8eUu%UXYp4-PhWLf<2MuL+MCT`8r9Eal7@Tc$7b=eQoQ)U7$!Qa-TUny^9xr3XZ3BEZV=)HIaMzh?Y2Opsp0yF~Mqx&r0P;77rS>%ztA-w9ewzH{p zZq~)@R-E3w#}Jc-y4asv22fen+hv|ZNNSm||7pQ(;f>QcduRRF%l8d*FeY%2djf&J zPbHV->}o#3<~j7QGNGF7Xdd>{AG2sG*ck>=eYazr9&4h>G}3CEn$WkS(^zbQy#OHbx z;NL-@z4rcZdwpee40UbX+Y}4SqB!cV1W-u{(77&Xu{4t^T;Lnjk8^*0X<&!FQ7136 zvUr-z33YV~(E(j;m%2!M^?|D;lvZj6bt;F&ID%9nx@|qy<4^li+iITDs?@nISdii8lgrDVDz0Em8>--yo^-6G1 zBZq(1KK_)KYq!1|lFUlB1G_lr808wHzI`gfN&r0wxE$S@+s;;N zX;s-}-OG?lb-c#a$=aq2D7!rakRpAcV`vLvF1F7i(_Sby4T%5!f3KMBN~zB(uj~h! zn6B5VH{Od0e9|P3NN?heSHy4}(h{*lrY-vdwhR;V)O9` z(~bF*dy?^`LsbUV_X;@idw)RGYyO9*tM`UC_DaoMOH;4q?L5a|SMg8m8VY`kV#-Yg zG1wF70rVYtX+0mPP@s@_tV=WgKlfk!MVt^`a?#{&uC^2>JI{Q0`-3RZe!8+;X>i-K zwzFmwhXevcF^rQ2Rd(?vJY1v{Vm`Y$dzY?@a-oB6TxWp{!17KoE6%m{icWv4n~c+6 z()@ktadGAo#K4o3!Fe{r+dS1ZCnD05at;{{CzP1!yw8i>z8l&l=1W`Xlk_hbg)t2+ zYgOjVmC%>B9A*^i1xQhR$m)slo{nwN$oVSc+@cAL8SUt_1!H_l+iROI>z|>@+y%qW z*O)ZE`ILC8ewApC$LzoRQ(hQZUUTmiD&X$BX+DP;rRqr)gnCxjRXvIpYL)8;Y8&Z+OGN)(5X zN*!+J?`a@W>GY*p*F!EzDXv}3zA8Yl#NvD2a z1VK!g6w!~4ep-^#BP?K(Nb06K@vZv5P5LT7x>E`zI$ia%!n|sd(bonEl^=f)xMeQ^ zP;W^vXG)5xE$;PiQpms!paA(Dn*8<(mbk2?S zNhsfFZd(TbuuX{;Va>TIxro)!$f5t<<@?o+NV_OKA+dpXv_#)Q-&)oqdmc{cRoZ!0~m5GfQH0DUW)Q$7)C;p>)VTp5=s0)$}N9jgaadFj9fYsFE_defFb{%wn zd}L&Kq=Cyf7?*idR~Dh|R?CfZC|}Px8W~H6M`;hkqN|{amas!(>-DSL`T{!fz2@1@ z)_s8qi!;qL6bpUai@{%TQIo|>b?TM9&6s6&!;U*T^RN*uX(uF)1n>P(E4!M+O3|&Y zt0l!iBaaIO0w|l(UyO6JDu|*Qz^$A`-}B}^n-5v*2!dmiS%vuCit{d!@>cswDSvYm zE}LUhzc66MMe6n@)ZK+ce?ti)#+j_(Ps?;B#~3`>G%xRX{DM=(`@G*kF~9MSuMJSXtSx9SETo*CxIl}p5c*!D|sZZ)NVqg`?H(`{a%G? z`kxDt>azc6^wgxV!A6#KDQY#8xnMY?M6rjsvOk7VS1#Eygp?t{Y%^m%Q@Ax7udK%w zbBG`c$WL&Tke+m{@r6cvS=O(d;9dW402%Du|5s5?#=`B~)5unB*lNKe|$p6c>B z-OdyjB7Gr=kqPW)*ucyzCkwr0nZc=zVz#>|$F5C>yb~hb_i&t99Wi7#Ri6D`v6%a+ zKJ)NFRGkk~bsyqL13Uacd*4BCZpI~LZcSmQ=IAN(?M*y&m() z9%ADAFBwu**Pdik`={qV6Gcn85N&7O69(yUg^M&?7yrUYKcr-MaFMF4=!<#^@>Buz z7AX#}D?AQqE#fmiZj>Ow2wAFg4rP&>>0B`-G_LWA%ppy? z2}QooD_rWp*k(>TXGj;~M-8Qna!a%`wdO1*fFx6i^FxEuXreRwlWukYuz3jpLWtG> zL2|+dZ9Z|3rm4R)ZcKbrHdYonJ(WgBPVXO|P2KUMCe3Dbv4WV{m`%tmm&%xeULWv) z9#ET8EA8%Q=mH4W94Mve_=5i7xgeMJbc3gc zuE{_I>yenX;u4^+gGClJ@B^!i5x3$XS$5*4CkuNm02C_U5Qn*AiT;0H|2lFRPh9^u zmikq{``C43beTtHrSGKIiG|x;K;dZ($7&d_u)JYayE(&=XrS+|xzfhdvfe#b-*e(9 z)a3+%reoyEq~42z1^09M6y|9bFMlgV>CEe9NEf3A7k? zOZ%feXZd(>n!h!rPdt00{!@!b#0?qwCx{=f%rfEL2YPhs1SUE7fyWmO+aFC=S<*UV zW3m~hHu3FoAWJJwOOfszq$f~oe2!gl#P63!2HY!y>P$vYh?$|L zs-X_MvW3WnuVP_s+^*8yE0I2F+AHQn+lRWfMde)#FD>43d~+CP`oe+ws;6LI%f3-n zjxg^^7}F3KkMA|U+ka8&k~sYW5NE7)4TE9yscL3zqU9JcVtsgyOgZ+Fwny*x_ySG8 z1mBUuJ8r||)j;tSnPb+qU;4~dDf(q<88EFzu<{kplCNK*xMTX#l)aFr5I?Dlc8lYT z$YiD61(OD0ij5#~ij8yU&I!oo(l8p3(+|aWy_Uw$E-^7(A)5t^^y~&1ANO`94}a_t zhwzU2pO;Z)s=1ul^H|_Y9%+cU*KQ8~Eux*-iN(nWnqi9h&&Q3f&{9E`;B&^oaW{fA zLs{f!IzLc#7W4A@nnTHxsg!53|35{EzZ^D;+kYW^twRVt#Y5N}HMpSFmT7M&cy(hb zi{b&wyS(NaTuA7b7!ibP2@`}lJ$P8O^9qC4P6RNv6_Xsdl3y6|Dg$((1keQ@$FiB4 zvMawGptASy5Y~_zJ``s4txIul?tKcmCU*L{<8bX=1M3go9W1MpTE%qb*5p)NR z%f_pO2nD7Yth5rM>edkxbJCrM=G|B7ymO`(zIR6sT4ApDyq03n5nK0pNe5 z75jxs&u7!=*-US;+ka8A^pB}tHafgX;qB>Z(V2R++0xQ%m7yTDsbPNJY9Kl%j?d1) zA!M(3J(}Zk>VrTqwJ7%+t`75ru3_QzTY5 zMl;-f?kG4Y36Qu9m-UzLO;d!jG^hdjBm>ANXR%Js{+RXmk;o4F@;_WMUAb$Bv{l|u z{M);(d?%Ia1ye~{{Ri1u6vL`=cU7BEQJ{An%!XWYb^VkyQ`=kdPh(%&N1sr(+c%bM z5Mk({`bhca@H;tCL+xJkWI2U><>Rv*PDE;LW4dG2SG7_3n$|AURl-@9AJ4JAX5#Qz zYAdSf!alU55Gp=uD7nWk>D6H3%TQ(LqJL#^v2HP}??Lwbtw+&@&0CY^i`kK-72jCK zt?XvZx-KNzmY;Cr-c8yK9ie{-<=$hNSKU96zi<@*6?|UxWCtg#wa)o{eC=51i)z$$ zSMZndM*tFHM1F&ZQ^?;KFx;L#%%e7`?CYyCcgg9mw;cZAnQeI$U=I7US;ezN)1-x0 z;Y1x6pvj*UtXputj-MZec;DU1@RzC1mhk&fOW^PEetZ8KyFv1;g6=Wk38C^A`+Izk z+?N}zW}s4%s->e-$tw?5^9}9k2ppWdR3zR*?P|XG_o|GsY7~cNQLIv(Tylk1-?~HS zUx_&$%p5rC9DA{dmhY-!yC(Zrj8~53Gl;Oe49VC#i;X@I8}Bxq!m+DK6dM*kgc%50 z`rn{P=ySLGZT$?1<%7)H-F)ciHfM&PLT8|!)h`>B5}14}oNciyWRqB@k3wGn6LeO{ zASe(di;@XT@1~8sMy*A_cQBs(sqiGHUr-yeRSus4vNghTxwaBC*|gHLQlYi&eX(vi zi-P&Q6w0Dz$}qh>iy~&eO%YN0XVY}Tcl-CBo%%Q1^^&KZj0Y`Htc$$^nR0iudznH) zt?7hv~Q_q{kAXN=r#R@JgBm3W?i2KW90A$(s&qjOu9&YZbIdk zdbGYy0_H7}+on!6P5VguzOnWP8Vc4D5#vQkVG()len#na<4LLK*D_PL)lP7FOZAsx z3cq%373%Z3Hl&+KgSjVwv6a1{(Fz_PDC!$KV;cw{E}wvtr^#ShQU&h#Irzv$c8J7Z z?^#_Zs(1RO^730T5C^6qQcABV9V_muJb|gquFcvK{(!`}{gxLRPZb&w@Bw(Rv(uhU zVpmF>P;73(+LUX{B!_E593sFO<(J?iU!A(NW#F?}-j7-6T`8{uoPgkZ*AN((0!oA@ z!nceLOLQ}aad!pV&cXG>-B(jd>zF-lo*#+gN8exLTxL7ltS0nk-c4PCxcf>?ldGK^ zgnZj^ko#}yotqZ)MM5^b|2~0#4SpaXAgq^aH>&_%yq4on@agGoS7$fmGo^1}ikiin zEh=-5y$$XwMM1Zt_~n*IHi-{pAswclTom8G50KZP+`WNoINO{bkEq6{t8|Kh_r-bE ztR-Y{Z|Ydd^Plu!%~lV0*$A=)?r=y(>~Yl$-oo|Gq2`SbN`OUB32}+>z{AT++^(?b z@qJ`C<8br6z_e?g4ZruTseV@)kEFMN0uX^rpMZy91#^#rVToggTE!-Q`E{J;-R)~? z+6gP2w(hBIj7tuaYAEgL^gJrBA8jdXbN6RhwbA3+i!5|gFvNWptzTmDsI87M6 zD-x2_+wZa0);CxNqdf6-tkoL|o^ZMw*5(+yr;y0#X~S@Yekbx@ZpQ9qK zKFodgQIos5Kr_U5TN730nwaVL@n$UwHj!X{aQ$I5jnvJgXpmKvAghAGXJ3t|fStfS zh**FGBDQg$Gud0pWjsvoB$12fuV=`@raF70kQXRV;6!B<>UNDQj*7!JYVGcU^5DZu zE`@S2G>=s170T@DwW%{FlrE7zcxaIck@*bx+R=fh!BFtPmn@1rqm_Zr5BM&}*0KK4DSz_=Kp%e)M2~Bva&-1R6TX zvL-VD49Z)zn+6mN&YofXLy*+338wvsVT`!E33tVhi(>ii>l9lm(vRt!UIJ6u6S4io z4F`$*0HZ#&LHI*h5~kJujZrX^q8m7gw2GhU*W;uueL{WgEo$DV((QR@8J0n#Yo}kp zBE_!LydR&6uN@E-WG?7v`?xkEf@-%H2N4vg2YZaQ97#3yh~i0Z-0sr(G<@fz!6Bt% z2RX1of@8HYUyNq445b%Ka4|iP>zH;qYZW0ZANzcbR&bF=H3a_laX{Q(szfWfvj=Uy zCfmo?gTZIL?mX88Wm`zD6L8h1e7PDWN95GhbM$NzXm_pNwUqa zE@~<`aIhXw+mxKleCZ}Zv$rYQ%|>ugpbWBb=l z_ilH{uUl%k=Kiuw>DhD^pqyTAz;y#yg(c7)Z_9qe)k;P!VE=gmZZZ-=%q0Ho z+umTBvIk&odX-F(ex*tjvz6?f50Kr=$A0yX0E!2eaP4| zEiU7WbHCIu7}Oi3?1-=kp2OA(Z|=lJ_Lf#PXiPm{+o(T}$Te8$$APB9(u+f}NH3#JI*uFjFyhcVZ{z`LVBdL=E7L6@7DvLY^q@v-qF!-m ziny|^tlvOzj|g5|Pq&V5z>qma{K2{NE~)-_PIvN_2x+k_ZmW#LC)HmZk+9ZiY|%pC zU`uAtoY{+nJuocpl!2R9UNZ!(Vu{QbjYd;4+EU$OB!h5^e`ALG9d1t62(PnEo75;8 zyG0B}KL_s6j9xBI!x!tgND%=bdgDbLmuC*_bu4o3&Z<%9`CvC*0fM!d6%{n$y$T(r zl8|9C=?k1d12GYcJw#d0ec2K3)t62uVSDo6MGw$BsdWe=zs1{>D}boz-^-0cKlQ!f zkA0zd{4p>6>L0*a2_OQA_z_({dp#W%ug_A)9wNH(emKOj5@kph{v+(%03roD*Q|2U zP!fxuDW1ewUVh;~U%TVK5YwT;t@g~cxcNr|w}gr2GlZ+yr97S!&Ognbzq!JLELp;s zwb_kORJFZ`VyNiy`KqC?d~$#Ah2kiUO#tZ?<`Vg6-Qcix%)>N{8H&kM$~qGX(_Zo$ zWV$Ne7=?^3TfM#9{T0#Or(3r8fk~X-J}AvRrT=5-kVVaxyLPhD=hZIL*g5~22O=TX z{d=F}QFj)@5jiB82v0f;A2=9GoxT9Y;u0QGE|VFnx!fkUuqqibqACu&P7or+eei4J z7=eNH5@$2ro(JbPIdc(Gg-4V(k|J3uhcg9ro$~mpr6oY;aH%Ki87u2=0jh#9jr0Yb zF(Zn7@B$$Iud`Xaaq?i!8(+w$ufI|Pnujf*rA7GWvG;#)*)ygAmzFms&T}QMJO^tp zpbHW0m8ghf+pxL%t=87k9SiYtSs<9Bqx>3Em9I){dbbB^@8GL-l*?R;$MJ()RpyRzD#~XvV zQ?u0~$3}pT+2QDOZgRj1D8>>_Chc;OcxP=uVbbHo&Wud7>bK}q<1XRFbTMye@pyzd{89vYmU> z-&_Q|9krOCBMtY%WRnz{659wNPAL|(?o|zt!-Z&*bG`d4df^`6F%D9DBxFWiv=w06W zzrSH1;wgA!aKYpiUZoh$Nxbhokl&OAX_62*(RPIKdT^17FIAI{yKhrS`)>R=J7E(5Z6} zo1wmNM$^TKg%iz6FsAi|_Et^uAX8nb!*ZdAl$4MG(X)(>Q@V~8rbl1#W_;5Ah6?L_ zcq1Gw_x_HLuYG`;ohNKo? zR-Vz-N5YoT6Eh#hl;X3NEc9ZKX2FAPaI~>HYIt!Z74n56S69K0D{O@gFrE>6RLw zECDbIkZtC=D)wgUlw#Y$t*?{7`0=*Q%ggzWos>7zBss*y%u{@})9<)-Gp~+){1LQ< z#SZh>~wasqP=Ccvdc=X0=390I9R~J2N$g5#5 zF<6GjI4^W~RA-!O_uqNE`1Y&Ntt(YE)zcayv_<^q)2)5Cm9)O+h@a-{1ObvA1<|18F^-=Y&aazh;3vcWWWgbN_ z(pOwR5a7kFcGiYQV@F%ZTb_Y~t;A1Zrc9t$5WQl}nhqeZEXd6LOg2fmCh7xBm+7Ds`Rdu2Fe02pPS2a^+LIlEWMRAQ%CwU;$TzZLwt8s zHc~vW*^A?w(skF_lrd=l2$7=2TWq%V@W+_`>?+-EAXe!vq$xO%^=%x!ZbZ-$y*P(% z(JD&sr}oZb;jz+{fn_v}630n58+d@>r}&Y$!UN~MrQR&*J475mC#)y+3LA4jA!s$v zK{9%y{60)ic#g?-9rQ$%;u%DA!P!%OJR@KLQQ^PGkWjZPUH$;2c?9pIcnkdV7O2$r zt*NQib21l381A^3P3p-)HB? zs?6Cqrit`q+&f8y;7gy5Ls++KFCTrhDK{7tEza}(-Y`aCBsB~+_5(QOT)1`H^=`QW z*bTsmuN>^T)Y5u5TqFB3p#VRitG(7b)Y2LD_sz44gv%KlH#kI;^2j3J);NN23EZJ2 zVxmB|jDV9YzN1-ZHL(f=nuby$3A{kVd5({4=X0ZK>B@_@Kc=%Nq&Nu~UawWyN!2un zH)gG4k+!qXR{{b4MQ!o>P+3Q-vDBrq7rr%tE`PxPc7Q|Vc|ebO8I9Uk{cGCfzN7jx znLb{)Er2pYq}Eoll`JtI z4xCfvOvxnV;d0-c4n96$yB>6FyrM?NQ8bwb2v7vnhN}`VC2E}vSsmBKEArD#pp7x# z3FUa$KX)V|QGpK~Q- z7ykjnVvnsiAH2YRTvK?%7e;J&=*eeOQTWM7wXwUa4O`TA0`^@uFu!98oPf*Uzs!sM z7MW>3lR-XLC!OEG+U7wu=FzAyu3IYmG({ziQ@#&liF>tqtO1vP*hsaemN2LPY`<@? z_fnMIyaO_ERbbqz$PQp@+D2a=U=(o)z>_Z>9?@t0yADskRcsbR0)R*7;5weE2yQ)e z_gdv8_z)Vq64__(8bT?)t5Hs1NSte81*&dIBS6xGxFCBSD&vYMVlHtf$rPeurR{S& z^MfCF9ES}<9ynu{R8~2f+@pLxPOk|Z=3rdB%dvXj;tsEawM4GR$}_E#bAYF_8<;fW z*_c=A-`4yI54AB{o%J+-4b@?uvt}ctu)s-GkxO>=$D>gs>C6RxC*^~%$O-$MLC*=a zC$+|1h=8q{FZ}sLpoZuhEIs&+JYt-ai`~$s)m>q1bkqGij+qD|V2(!~E}GIWCW?aH zDj3-b5KCd19M=V3!_gh~ZOU6Y8x;S@SjLx!td_D-{On@(0o4Mwc@6tmvH6XQPtXa| zHIQWKhUB9u;6R8ZQ|~WRtLRVmdwFoL;3Sb0f>=LD>Zg9c9bcC5t}1?!kKfl;!rv1= z`>721OVEpz%}Gq4iuVG>*bHqHsl)KLWRAr$3jS++$*i$vv8>qgYMpv*ofSg*gbyN z?t82@D3sl}=z>`HrN#7r#l3?%Fa3E#W_HL_YYgjFsM5$CdZW_*mC)+d+W6+Xi>qUX z+1_@HnG53+Lfs3SpSQ0pOb>a8Y}eh(2liCYRFA^a;_aQ5xby^0l~@uN~L#O1E}iYMK0u;b6uOi?6~) zDbdJS!27B{FiupH%$3zwFbny))7IRD42Xd%T(zB96mbnwFFW^4?iBaxIY~~a50RuN z5JHOZVqVknx6(~}d{tyj_a9rC8L3;_3_|HUSPE~*Y3GrWiok%;>YFS*)8Xy9Pe<7^ z_ovX`mX1{mcKg!`C_9I*-;L#yp)S^U_Rlg<6uE2pNt3#Xz!C%l`-U_$<5NvN_G1kV zWT|-0*lHE6!+w2w5wBSm(d~s`%i)#jRqPofcnnH9)!^1Lh3_XLPQ{LyuL(>09u5Ty zaaw=X)nSZNx0^EdI(gxc(NodxdMcRT^A#QrFL=g*hm3d}^+$;rZfD zCLzeH6VcqmHi~|3QTA^gEeh&BCK}LG&3l$cj$2i{5_J1kFbXT)uUvJ zYTU{L<>E^F6`MGsjgWBMcL7SJg;x}ZGQ!#3f#|MgDxaUE%>@rDU#PXRnmM>m{)_D9^hlLY>OJ}O?6*s0lo9-Jy`k?;B z6C!7uj&!N75~!vlYWEUTH1n*14F?AJ$(Pn@8S%?m{R(^DU#-#TO=Z$Ts zTRpJgV>%&w<7~phT*KFVD{E!&!y1FcC@l6Sebfo^ki2vTbdl9;V}?W@w5}Jgz60<< zXU!R(_e^bFglXYbY_9g;9}d8bcXalg?c#XA6hM4t%)P&!eR{=+s=mXk1PSidL;#ca zrLyH98siH{AXlbHON7}J3QyVVN*~6g?tBrYA01}Y`1-YINGifz%GJ+o-@MTG@w!8T zP<|pKPr8@E%5%MJ`((k$x&<&J)^khS|M_i4H%)9M)!3|`<}ogE`Jw5D4zahstYxg) zD5R|^r(Hj|+%&x!=kZOb0DO?s>7o%8T>_)$?FJRa6$1Y;ybo+CC@sO!Z$C%m*KQ#7 z>2OP}uH$3>52BmCFV5dk7ARf1Z7~(!_3fGJ#Ov8$mqsy zhDPqf2FC8f6z-G)6u6(8xe?x054KGH+@JIOCG2JFGpkcx-q-qv~mI%zLB$V z^WC0=*3iNT z9~K#1eXXae3{A!EkS_)kevnJs=kQ?RTfR^Dvh~a9n8oyD#7FQ^VMJFuwv+XA^SGwm z3K>g$eap524%c;-;Cl=|2NBRd6Mvk#2lMCc{MP8uSJW>h7lS&HFfIBnx7e2FI8+Ing-@r!gvwrrrpRx{Upns#*Y*_XV? zwhofYA(sCcYX}qgl@`}H-YKX0`@h?ewqw9aW-oSPDYDE^GQde?)JM4Z&=M~QoqvLW zkfT)KKN02=k@z8itemRY1emV1_FdE#UWOEE6W&oPWu>74OqOr9sezG-MP3LX$i6q2 zQXg;0Lp|A{;CH=jhF_nhZzO`xN1y4R>|A8@EaQ2A;Iy)~5j|}JP~!1ccbjW^0q+XM zv@848-2MVZ<9WO%;C&rkRtFCq`dA{d|vzDt`2G%I)k|lSA9ucNiT6pC}C)Ait*+0k;74 zJ?&2=ZK*q53#;7DuA@$wQ5us|EGR3q?+E6!X+xZoCD_sN=#R7I=#>lB_O*9cSOOCb zs8n~5c58^70jnQdFV+m{`Y9nctavG?Z$g(GuM#ttArFP6jzPU33?Phy{lu-kz2n^L zn{HR1K!OM^16R5XX?$W1o*03&3SevH0bV07DkTn!3rkUV# z3Qp>E&RmNzsAe5v11d;m6rPKXpR*Ee z0Fvm%YLFIMmuvtCZS9<9teR^Kc%-gs*I z$h?;7H|!=h`S)HP{npXfd%-YD+Cshl1~IRg%Q<&O4DUBs!gkNMSx%ii8a1q%{fHyk zo>8cxwKK@=%Xe0s+|h9MAo98MvDLhvB5*N5Y_Yjq%1T-;Ze`_a%_ zl^n}*{|Bd^pL-2=oAg0KWNPst?V@tpy;2Z`oH%^b*c-jXPZ_D}b!wSe)L``?L1LN6-}04GU%*C$OUP^%tf~ zQ|xBt+NpF_{92nINs7g>Czq?fR~sTpc8=wZs9ZS)|7?r}g@%;Jrt?hu=WF;1BLCin zU}0)#!_Y0l1WG=1w!UH@E4+vts=c$h&`pR5iv)li;Ja-N zX3!c+Tg9PZMS~P=KH&nPRnE_wAGjd{-1r)qR$dW1J;HX$Nbpct7H2hEUwV&99L%lk z%SnU{<^}ujaTSNkecNs+nHsn_>;kkJNw?9A5TNX}g4-QL`3Sb3`|l}0yR0LHy8iaW zy1~Zdc!|M-{RR(Kq;`__xeo|HJzSl1N=1eB9Or;s&Kt}7Xvc?%p$ac&5G&G~s4BwM zU!8^h`>*U|U=_Dbi}I;>D$39tss?!u{4tYO_9ioT+st=D+GElPAPa3RsuL$}RGGzB zNFRf1;;mJ$$Vz&_-Wgo#rCQT&%`Eo} zr@lkYWLW6ss|U+T7fTv8?+6Pu-)A~JTB~>6o22&{<}kUJR(TS>hSY+5F$K}94C=qn zsvvAsMgwRHvpir^8u@g ztjDc1xrAqhoI|`$iE=%Ye9{3Wr#dTa~DQ~ZdZyj}kGD>c2Q_Vrx@2U+Qi#64q+jd_&30}uiR?$vhE zNqvf&Gm~V@`3>5rU{-irt-7=T+9CP`c~y3t`RKlK4*zwdGVMk1Wf)t$Kz#p|S zCvX{`1xglp0~^DwB}6v3D#8u0mHfepjgVhYy|ia)Zvx;iRm`U|rg`)&!JjcG>N7y{ zimW`6cf8EMdX5x3?OV?Lsn9{*6%a`Ue62+9JsSTXKwf!DkX{0K+1cDfQT&cBM537> zWwi0~N;(~yLWdqrp}bRR-t-%E%Bv?WR6aVNj$w3{SUHx%276OMYarxqVq-o$;(1c) ze4@F)xbTL*_;;KOfu31kEU)+W0smRT#BKpM@9%kL1@EkAc0>PlG3-macl%NP?zcdC zEC@0{GQ`>Rzy6LRlXfd=|BW9Hhv9M8fT40@HJldT9L5>_K^2EIP4oqSF(BSa{tt@3 zv`ATj#xLFY6Z13tfGX8;x?!7Ol_n(`GHXSDiF!C=#uZTHPi|rX|`wHl5z8 zujaQ656^2@w*4YxP|&x8EVKubL8KrWKT7gMFVuAC5kNRp@#)un7|v4=WiodttF^&X zM{kr~fg@z#m~44cKsYOSQQt3N`rtPCsAiJ!K|)H6DK#a|2a7(;ZtmUf-@=3QtKEnE z&K=@pAm>}r%06?wFZ=J$)5-?<%t4h*Ds}} zEqvJ6p>`xVY6yxCotprHF;}M8HN)C%s?VlN7Djh3fMZO?7JXhI<%qlsU|7Y9LXQK+hd8>(bL3jD`1!fQp06r>y$?It&xc2 z#L*Nm2;gCw1+k_gm|FW+Yqy)5@6Db#sYEIEz{?sHpqfKv<(}9C%)CM**hVzFLqtV4 zdbe{<~@~~h{(gXG0`cOC!?FkOjDS!jyq+{lu zb3v?{KnU^q+pe>l(g2eU-w)}eTSvJ1PkQby&PF{-&_GKZ+Kx*OxVB667AF)A$Jc(t zehkuq$Q%J0#{+&0HvFXfXTz-OBlGldg0{*rXaoExw{m(2Y`lAnaNht6OWwt|c>VCv z0zL1;kY|KJ2q%syZ%N9sRG|DgMEAkF5q_u&=El@kz4!~8ELq^ zKNV40?02Yq?dv0#|DFOL&k0}$2M%M28Id62K$yAB;elL}6dpoA=G=YLUjt>M5)2D# zSi$B5^;=+n5>>SF3JRyDVHRnmio%`i_R8dG=a|3BbG2gHL^>SKd*oxBR)2hZaPUY& zOUk-5e@xUqUEW?Zv;6fD)l+$XzpiVmDu(RM&k~$6yW0A;?)qGHql^}#qDvJ_IjryV z7H`|agMjX8t^)Yac)i@>C8x*jjd_O!ySJ<=6gRxWQB3YOWz{#Afiu(#|KD^r1tB(| zI~3fBsM|CGn%gJ-ix0!FZ2BVeBmzSiPQSEBnx~^<#+I^!8w`8aht8t_m1lecz_#z` zs0d5LSDE*4ARhEHaykdb0XbZdGid+B02$yUcNS73w=nH~T-PZoJAO>tddhbfdx11| z6~!(aaO8Xps--p~f*3j;cRO+gZK5uu^#UOW zm=(;JQ@|=5uP_0}64*EvC3@ml-pG!fi5qnRIF9Upg#Bjs2+w+nll71eB?AAEwYqPY zTbeP0Ud$do_x7?VJm!JkD6)lL?ScFd)UsF%Y3jj8U{54qjed*oRJBf9aWi~%^v~(g z&YHAY__qEfp@hUR%4{}WSMToO5vZCEp1{?Yy4rp?HfH+-a-5?TMB+K8{g=0IF@Q1( zSkEC|`9P5KgJ6Tr_99avkWxRDM4#wwLzAn_)8A&Br}tT!5tc3j5?nYzY#a{5Cf;7O3P1XUMGh`}3hBc>|LzX9h2X_Wlj5~P z3s#v^P6gO6zK~1nJavoRtpXdAb?No}N3u!u%xlj!B>t>g*t2{NhM#cP%5GD%Tcw{w zPU+~6u-ZK6q&vSC$YK2QOV(W3{okY9O z8(njal~NGs4(N%Zi_BykN`AZtAitGah$@D_qQF{t!RT?NxXnH=BkeoJ&_M+F!QuPt z=QJ9*jL8rVaFyV)+)6w2I0`!f?FEW~5ap+oeP&BMd2+2TH` zY2?)x=h)tMD@O#xDZRNXdBs*bk~o*qQ+gL> z)&5pnFWd=w{GOB!-H!&~?0bW5=c5P~H9mj>t1g`Ei-Zs&?f;SW)p1cpUAsfaARsj$ z4T1vFA}I_Zq97nC!VuCmfV4;|A&miuqzXtk14Dy^lG4p6-5rv555Dj3-tT_@so*(h zuf5i@p7rdt_wICyk6ELi`8`RuSG(ZOvfk%$l2M`3El? zzQ$Tj#0ZE5E%pu=ws*t`l|kFpw#Yx9CP#@a9`tGqy6h<$>p0HxjHz2p4tM6-@Q8b| zdZ67NEIdpgeuJA#S=kq-``xk)vyS)q4)S8E1<0cdcAK=aco6wLgtquqehaV3CMF)! zdeT{D6M;SdTO-GER_X*Q&AQreXMTJvPNtCRWnPEg^Qk9 z*$nw34f@J+ZXCnB5Fc>;eS-z^#|`i&=N%Ds|Cir-o`6#UApwH3@(~%_RA|a_h&>&+ z(eTMu&y>CVVc>I{s)G zDj?I;{pd|Gvdar~l+{H$qjPTn@>Qo-_~(Q3UZlGs zPX@G6{x!c>(jQf3*zG3>UybqyYwmNL6o4<+Talx4*rMzfL~& zesAiQn0X-Ns*3ZiIRH*# zsOza~hvM`)k}vWW?Y`OQmG80lGht1roS-O}a>_0fNU^d7hyI&N6C)%7HuZsEI&yht zvq*ttW_U;p6*`taFLpb-Reb*W_M>nHJlg?a?pmX-m{LKp@QIe&hJtyxX(QfdOn23n zaGhsHWHkw{5F0w9%7xX1-RCrBx!jEs7cxhlqYuNo_KnRPaJ-glxMw}$s`Kf*4W9Wy zRATlQhrAYbjYUjYP>QfN?ecCoFH;@Q{FjT|Xw{;v@V_E;$Eeo`pwyL-P3noi5fG}3 zAWM@s`#Rpz#ZRzR#f)w|xfb^1uPRRha6g`a<$pFeua?sfgnl7(0Jk( zP68*{6=3B2N#KBX$_e?UpblmCN3P(}5JL^^B)ltUCHGMZFg5zT1s*r{dPh!BYCzns zT!!8*F=8ovK=0SVpHCtmTNcT`YV~U9JZ`)Nla1^=IRRtRw) zusO&>TUlZaqY?%eUm2bf*pxKifW0XCHp>ek@*U9$_!Y`9BR-4ux`5jT{>E0s`Fq_- z(&xn&=0VE=-L9YjYCy(ERF^rdk|~->Xxs{V>&yrObA~Fbo(IZ7t*zYU0PZ? zWB9k~iPWKgbc51!mwAnXl_p7n9%9nvpP9>+*!%$Nw`Afzv%gCGU+4LlMlgt z1n=5&&xghIlHZmtXo2sEl9M{Yl&trbdYS)}-?@Gq!!9sc4LB|4Q& z6y-23;LJMI+P|vM<=xbXhsVJ5IsxHLiK0}g(4L?&q zSj1?i^kGjYhCEG{lU8Czn=0VwDK-;RksySMG3yH^D=7fOAyqsZDz51ncQ>{M1i<}U zI4I7z5<8vM@FI8MR%;jIesu3h=1z&Ah6BFypy>XDCLis53$#nG>V$Eul*{^w`JUC&8#oC zR>vV~J7&tJ?yIj`HTId=Bi<6V)@uyWvN`k48J}fd&^XmLi$4>m7sT~r#>SqwZsKmu zn#@f8th?pD)6h2f{Pa9RWZve-g4L^nTXlwWNBM7bzTNGb)FQS++HR3=dNvmABxng- zI-ebKd79Ey75(;7U-b)s=r!Sb^S|61oNsnQAi)%~QJ{pIp2$cdafaPqk9U??}r_Z#QZ0g+vH zHC00|E8GMB#RWjU!>akkQ_S&6Wr)-S#(iVVe{#O|s#Qw8|4eDw>A`PQO8f38!#7rB zUX6MYw*eV~xPbi zL}|v$bsW$-{lpWv-#$Wjc2&bwWKqbN)f@m{834XRWf~O{Wdim6nb^)V@vq5kHz3#7 zmmV=xDCV?{{tZ+sl>L~8YYeh491msbhNpL`P)8=yzq_|%4pA%YeIfM-M#xwZF?d-vObzfc! zxOLlJHMm*NrQM23q{MqWyc;cbZXixp*W5#~_UFKUax%(o^o0SfzIE5^`cywxwGsOJ zDE^qvG5lvH#o*tI+kz$8Tvut;2pWgI9?+_%S^FRDRP9&i9fr3(qK1d;AwE2x(WM=H zn-Gw_d`y4OAmG*$e`DqvOR6e%z8$OMs(iRK)mN;kgi!cyTIX-8Gh+p&8L>euKV6u;xJwFb z6rj%Q0+YN#i>CCv4Bho49FA*Jkn+l`j&a;rObd1pQevn6SZb1%r8RB?&RifVfd%%VF( zhv!SDkiJsu?RTW{$l2Ae#-vbDAe`;2JG_Jr`Us{xrk3BW$^(=CxuihVN=phO2I4+O zlyUchU;!3;wVd;*o(E1MD?1ve}Cx4$3;Nyrp$==pR{_*b^e;vM@25~ z+HykeC`3^-Z<7qKVS%!*@H8_LOAC3vt{#RY8sa{Ci&|Yf>cS?Z#$SyWT8Eq)(x2_+9U$Gp%tHBUh}lps>|5qgxY&B+3pV{j{La%CCJw*XRGL8q)sqb=p-x&IEf2iUS zJV_WuGacL{T`J@iTFnLbXrTjHBnG5q<<7He#uhmdoyEj|mS|cHHx~#=I_?X`ujJg4 z6{!MQ!%op7Nt!4@x;Xy~eli3ll7)qJ}of3F4_8iMQ$nR3YXo%b%>8CwpNmFbyyywca+6QG)?O{WNROL)ZQ z)+Ee!t4-G2B*9a9qXnF4@#d2A%o)2rL~K1=Qt&h&FrDGA&kTZ9K^VeRdZk6MV0i7N z*!_DHv$w0yu8DhcR%ESxPT#VMQZ0-Z_(66;YO8w;4^d_PR{Q~48#Yd?hbwd2Sj+r3 z$$>VT9!{i&PZ8yvHxA1+yz}*Wc3s=Z9^>(czG?)&ARUSOi-(F?@m`LKkImE08SP|A zJ2JnBTOKWS8%4kSoE224mu9gB@cOM{pMri@k<8D-U6lrGRNqtT=D#v+h9vo`d#)AI zi3LC$F_fEA7%;V!H#GTKEGn4=2}6%w(NG;Oe(2{ixQTchciZtc$P~W69inhj zf1LGfS=*T_&<&I~!Nsu_dZxhl$_I5xljDAu%i@@7%;<_OJn8zKXpWZ6BAtYE+?009 zP;j=qF0eNf3%oG5k1dw*zSD-kT+5`I*OxpE5fczDZvjnICPLDQTQ2Y6&yLeX1ohQ0UDZFAtPxgOXt`U`|X>{CS z9+{sdA@JUS>~tOqw=4=bw0y3g2$rm8mh!LK|NY$f&1Z@!$E9-h5%&s5&y4l7+0qno zQ|olaZ`$9@Io1)#hf6^}%!dMe36U^AgwYAWcB*?AFp&WTl3b!3B2DK)L8QjT;gz&A zZ+U`X5Z}9-YcPX))6CP-RSp+bC2r9znOIj4_<%2`9-d*|xtGjlXQn+T3;6qxRi%0_ z@I{)5B^hP{FvnvVVz}Zg7wsRn2w&PnU3&A3L(*C3SM3>Hoq^r$}VP2cyGch!7@z(vufn94|yg=V8QZaPfT ze)w=-H}D0U=p{C?i=l3N-M7M~q1O(4Gaur15DW1fw_PsXmED`{&PS$P(K}$ckm91< zm(E?Sn&uRUKF0)r|BdS^*AqE%-K)zdjFvTt8Gvg>{)xU#bgjPqM&S5YemC~O^^V6& zxFf%SnUt;q84}X>*;`&9qJw8O^~OQORl;?~`^3f&8IU}_+}-R*Mr>_eJYgiWUX)~z*uH+;FDMavN0VAy4tIjuXtX&y$9vR+2b#hC{zJ7LU znonfJCwQBn|I4ObVLOwUz#86;<(aqG$U_xRH{+5X_A_ybcn+WF>GwOoKJmU^)~=zv z-u%hfSIgH4?BA!12%Hd+aW>2X%+g+7)`Dq7Y=AE&w|54lsqW~L`Vx$51I3}_bqYXT$v72wp46P&HK48JC+fTj8_6RgcZE!)Uib07`pop$4` z=DI(I&#RBb=~=>#-!D_6@p9Lr2jj)h6)XFBj=d z5DDTNi+wJQx;|ZG7g=|>B}VZ4#6Wb1le*r>Fqn<#eNiM-A24=Y_^^7@Zlj&)%f4_k zePAu90BJ3f7J_3U-N~!R{S_CEown{$l>T0Nv|nx0bk0KkD-q%QwpRtrI13&sQ^eV@ z+tt@9=J%0bfzN_Ii{)gfLmrlme;=Ie$1s0n#3tX;jF$=3ne<(N<3!?IcVN$!KHbwq zOnG8O8OWC`8bvW~w~RXG3~0u<<9Vjb(RNS^9-3n}`U`TRL@@MK&5V0ZDkD=*M1Aigmc>8O6SJk7 zOzp?&y?Irf-GL#UL5`hA>+J;}+0DPJy%tDh>T#x=$pe=EeyKHJ(!J#od-j>nrk`EV zFP6Ix*l+V!>%EM4b9+v|cLJoGN;J;^n&f4qT<{Y$r-m$KIgyAZAmN_ADf(iRw79y* zIi$v>OhJXbzHILfy2B&!fV-XOzOUQbYcVS;tN)lG?pw)qrf0vDWdp zdaw;~*6zer*B@U`6UBkR%L)BBIRQPl!c>wD)c*9eSAJ5em=f4^IUi*I=HrqK_2<0Q z59##$Xc*qKf9b{#3^(-CD&n7`X9X#S7{J#+Al`Sj4EKH8k&P(!R!wF_nA*)oJC!3v zjtuD4jm?F&_%#Rd{c8Z_Ul;GDD`SF`q&n`eh5zV2yP z8y)kQQ(n*8tB;JI)+g|vnQFKRlOH^K#zI`Q{g(83lBvFOGw;{!2b;9j!zaBW$$^Wn z-mlj1a)R?(hBCK zW14 zYWZ(cq;Wm0`HOfLNcq5M&3Gg%J9O`3@9K}8h}upKc*wR=$NGH(yQ;B)QSX-d|6Wp{M@DY zclg%hjukxM(YoY!-4$T96AV;nXPd_@3b3Ro{;@GTI}d;|l+y=&PxafBkbfV#94t$) zb!jgt93CA0?$reURhSK{|G*V@gU}F@`HWT(PCtyc`MF19uiSO&yb0`- zYe2m>QRFg9Tk5oG`O*9(HHkgh^Nc-h+STPWxNE44m6TObPDokk%mL^P6uGIuJq1BDLrR@8}g{Zk&l* z6kZTEjSF@D`lKcKLOUu>w!D2MEdJOyq!fIRkUX;3Ocf&{esq5!-ZXv(k@Fs#tvJO{N~5@a?yi#lB(hAoonbf=*tE_jkJq5< z8rSoC#()?RRs+dn|4q^MT0o-QesCppf`*CC&8Kdh)icjxP0yh!{a5HJ`Zk?Jx$o5r z-<4alhuhyOZ%hV3DEZf0;#3veUEeq8dYw;euo|zrt$)FMS!uX$Ej6*?VSH!@YhC^_ zAQgSv^TPcLTZ0?BTT@O7`)t!Fp#Bs0W^U|bfcZH{fdaT@3%=@6tF5k^1NROi3wj^% zM7-gZYL-);P?D~Sd)8n7yid9TgG=6qkEk@lJ4BgLl52-zQ>Ms<;VAtt6GcB15-KT| z!Z|l{8obXwQzMw9p5B?TzRdT%dUFkH?@;8br5N()e|DF@|z8RMRPQFNQTA zm+lKA^`y-erGmq>K^OZT7o)i0zeKLl-gYm49SO`rzkk`x<=t@`+s{fX?icsd+{N23 zu~{TKmeo4>`|jq5H@xGFsg>U4Y_ob5Z|tz~Vo7M>LGR?fYsVGMwOPaGp7j&*hd|)# znbJ<38Bk&`*!;aUQP76S)7Ysa!^}0AsMf*`lRVcX{|-@i`9hW)Fygt+-QUiNKKou_ zO&d~M^7NR0j2jZzB7A$e7{MUZ1{7`M`A7+on(j>|2|1& z8k8aCemAw@B)`KB5!&fK5NTHalGF z7QIO%hwnWoi7}ilRUQhKaEL!!h4MRVb5c@|^bz2~KCg^iGl>+hS9PIRY9W6b))3}= z+(wbTV$SLeY-~VEH@MH zFJa5USWdi#camej67j&oQw?B2q2oghMjzJqyH8>&{NmlAid$s&`p7hhheA7_KlQD4 zDAGT<`HIeMIA_-<#c}Hu-yY6&o;R4_;s&{5@@@=)TujZ7khuNK%GAA2C zRV0+deY@Uc`<{g$(koI73-5oPpqoOg-|2O&69W1L469#2aA>mcBE5DZ8iTK&R0uq) z6j-PXf^i5Y6XO5ctt5S363&};P$v-xeY~$aiu-)M!$<3CT;9`@fJTA_V&ee1^~+)6 z3zrBt{bdRJ#EdTX!aPyNC=8zE{t?0#Wcya1$Lr?U=2`M8yehGmJ%=o-v!+InptpRZj_Y}dK;TZh{L18BL2<=;h0Nhob3jo zpS6Fs(?j+rQFmSoc%ekO+|2eV98C(Y0*C_|2KFv;4SWI0D$|q~dJWvI^XEOjQp@1_ zYpMz5rJxIslnEn;RQ(w~0HEJPz=uHs0)Sro5l+xQakZ+i0NirD72Mg)>LM@tc4)U! zDkO5^A}AC^Sw(rT0lR`Qg40m}@QG1Y@U@p)!c0-Y_wg$@P%N;HqOTFP!>OdFXjNvstF~sgNOSgp(hzJ(~~95v!v) z81q~B7A{A25Zyue?`;ueL>dJp{#CrbmOn+YR5etsO9^bGw!fVWY+X(%0p%K zn|1#}(5;8M5$GG*b@wX#H+8*@#Z5D?V6nIMh2Kkl@$XW|9Z)u6N__98B}|Phb2V>2 z%~gO=jgo8QHY*%>=Xo3Z76FxrlJOEC6nNF`>27R*`+2F4xnAPD0SN-3qWvbniaii& zcEaU=W8*S+*PYXI@sk{h5pm}=*C!cJ(NA)*cH*hzU79aUqKLThW}F{kf>?JMsaFU+ zAtX|iXgEe;^6Y7=nE-%?#|jdwC&7rNOv=X@um&wH3!a{00(RiK`9L7Wg;A{@qQy|9 z2cD7sl#{@LS&K+P`>6Oiu*x z>9DTpMEFIU!VLg`rELeCjMOie$=zD~mK50k^ve6qt%?rR>M~_*BS_Uu^=AafaZ?kC zoL%!|v!eA&z{*@l;qaw}H%G2r7#W{PhY!JffrbC}J{YNHm~L?qlq)&DzNrt#0$Bf_ z)r+k9i_-HC>q5bG7v!whT({5kjE{kNw|;9b;RZq<9ONy;+s(|C@$S9fd;$0+0C#on zjVs%J1ZsE6v!=gfSBMLM$}A6slq#I8w31(;z5)>0 z$oZshHu1Y9mvQGYiDDn3O;kqyi{Qu>VM2XnME`DkV9ToO(*#CsY+QjQdFz@t3*Pl7 z0A#j-vjM`!(Q4~HFfboY5IzL}>Uo2h^vfo2F8AqGn3ST1YKH<>C1c*}#$d{`=~Cpz zv|rTW?Y@l;A4l=$C{AZ~a-bJ7*w>c)#dB}s63N;-KTkC6dfm{;MEmt|tI-|qn+v#Z z+M9Aes%Yj~3LO<>B!rz37!9p)_%t(b2&=mTFV zbrf{V=qpI)iQZN{@O0BV!gb}7m|H3u^l|HFxl!Gq;Vsx&En@}^0JsWK86UZDl)ITR zWSrQX`YZmzpS#%{o*W_4qgp@n=EHr46C6J#Vg#FW2IJXAFaJ>ek4Y+WzL}w9!*DQv zNPzcRrZ$h5Zxq=%+4@C$t9mRoSA6%uDhZU;fipRqJ+iI{LBO}mJ8hSm$656)tn<7t zaByL_Q6sA^AOIT0abd(p#Vg!rf92!a;#yYSo~C^w2F6Y=v3VgI({-me?-;vAT5?$x zuqgn8&n{ce1nZC(sc1KhtTRp&iur$!(v|qO=;;2g(PoVuS^#K8zaSW1DCeeo)$$tv z)rc9W&-f`$d(LgXx}xd(A4ZXtS!_|!+JIz!B~DB~TwG~R*mx~4cOt6Yotm9w`!Yc? zG9Mre+S|IH-2XP8O!uT8HPnz27ZzYttNUhdvviTA6#wdIkENk> zrTg-i3dC#&aw&*W0fw$;<{?Ksu}jrIYyoWPd(dUdrKicZe5fQ~Q}mJ1W?+1?-}oqK ze+DqZ@MQ73a(eGjH8@a${h6f*9-j=GfEla>ZZmuL&i|1EIdbjL@2L4u5}6suTpFu( zL`7g*tLC8QTqXvteFzrV`e+;DK5#JK<|%o{>d}ngpik%VVdSFrmkupHzE}&1oPW3< zb#9W&VdVOT4nq~aEfBx9#l!b9a4UyN@|aII{ke!HG52QXw**w15m3W_Ds-d<7;!i^ zCHs*Wb;viY<>~A_!YJ@!af#S=i$W`2p`)5B+WYZXnqjW*yXs6Co{Ojw@4(Yf$ulky=n(5_aYR~L$elqk3c6Jz0}q>L%tf$-hBg>0<;FGNTO zHE?OgIZ}%apzU&p54pJPB_BF$hArG_=#84px_PEXD{XVdKxISOp0wXhq((S{R0B^) zO)*soTZsyE;Z%%z(g=<*(OJ2xHq-Oy79Oi;;eYd6+a zm1*}+u^dY0gxgisKj&hMxE$m67^>iXxR50%b#3hTC+(}(3+jxrD`j87PG7Sx3CuF2Vv6&v zpC~SR1P>KGaH*cjz>7Jjw#n925Z`d@R9y-}O8c+AsPHznx}5-CzZLv12xzm1uF#Lj zIKBKsIG%q{18Xd1Blu{49{Z=m)`IBP+L=$=J`YF}FB(u^0ga~oo`KDzpqO-ubaC80 zS!qzwT((|WDEWCl8t_N+N8e^bF+rpAn@|t~Iq$f9rdLFMLl?>v>Dty^REjy8BeOFN z&7cYx+*oPwJI;}Z=ELO1Rq=aPoKN}Lp|f#yBVK~{DgeyG@c~`PHo=8G@B0r3nYuNA z*|`d(MK=lyBFj9sa9ve-MyN_LGN|u9JRgzLFVpS=3^G=<_t<_c$YgKGzm9;_PEMq_ zwDpBZ32uPepxAkIW49uDS+C?PLlCwoj3vNp&>wO2M_=d=BerIu`v~rT;=3|dh4Q=5 z$I^EQB#Ygd9Tf=ezopX4+|4s95IORk5sm2+2+n|xd|Djx1d2N(?sA!t%?b`J9gMEpBv0t?(t+f(6P)t? zw0+H+Pk?%!q@YZ`NaE6e);}IQuQC-3SjOn$(1bn=F>XNJ;U2Wd8aD(O_dx=!mi1Jz zZ^1S*seU5I+t^^e$m|-rN;Z%ktKZu!;kF;K*?Anj-*-Z;ZzjsAzj~rT_jKDh9Lwhe z!oY<7PZuA>!rL<{3AaFVW05I3@*aNOi}32q+goG?Hmz9eBI1ySkRj1-CgxZZ-OqrM zINZnh&h=ZZ_k^!Gh`kDCuOi^Ds_-;K4J_*QIupgj;-@qcpgx7Tw_KAVV8*}lbZele z0^71C!YkGUCBzqS8|Ox0@JD7=LvGkO6s<~4rkV6k5#3w4Z**ta(${Qasj%}s=r*t< zLD=Zp*Jl()0m2i;1Rel^knpJIeG;`|5>%Kc9G5v%C00z>JALv9T^Yg``I^^Q1rwBW zMg@W#1ILm)+a=F>_m?GqeGS%r9%KU_$7xQuN&bOs({D)9-#o}wHkR%U7U+3Y8dQA< zo?V+^@8YrbZO{}iiBYC2?c<%9T`mmaCk}+d3->Ry%D$=LZ?=55%$r%|{|)WRqzA<2 zpk4V(2~pyfF=%aYqP_G4rP!_Q}X?Q*S+r|&GCSC!~&jqG-kMXJYh_T3i&nT<(j zoy|p_z~KtBXy~1T%@hV?wP)MO@u*O8+Gc*3nm|HT4>fkWZg2UB5lML1%mS?cs~%v?Ic{afoSMy_;nD4a`I$N`=?K)Zi+cvOz@?@lsLUk1^{IZ z;0Bw*Nd`1HF(Szw6fvd+=1{Tv(No#hcdBv|tgMmcr@L~p=@L33Qinh|h}C-Y8f$)s z2C)+>M_slo5C`9t3N~RUW*T3j#W6}e4gLcNic9u02@1_X7u7-Jm^mBY%imA?H3T=0 z7cHwaB{Ycz$2VQ2e%H}hd5g)F9bexSh3ot;;L*VX56SK&@O(tp6`3WLwZIY$A3pip zdon^2`pNK5-Fr3E;fb!R>g5`A=`)*0zQ#*0>xA3KzjaIJZ!+Me6-g~nqk)+NZeKg9 zyVfq%D-Njn1E89T(4aLNYIrB?Kh?-p1>bNZ#WH#g47gCr-OpounypjHF`}n*e3fj+ zCx{MWVU*YitX<(hV>T4(?*!ipN)vj0kmimDOZFq5xNmrpD)_T!)y3Qn+m;6Ut8=IF zy2UM&%fKOP5JvzF;GU6uiGpxi6Io4o6r;_uzD5Dp>x_L?GqT~iQ~!5YdA=PcxWCdF z6G)bMc@uM80AC<+7_d?}8IZ!FD*#oIw3o*y%*C&5zur&MTX#`*-#r=QiF|zg@fyW< z>C5SnLDplDqG&oT&)oIpEL2wX-V`8Lf%LfaLCYsFv8-w6t9(tk#DQNFF?M<&Yas$^ z;T<(4YtS}+mrtlyDvQJFRL>a1_)Ign0)8GJ67L4^ETan8SipCb|F6kWYZzv72?oyN z{VL7Ahu@`3HOtWdtOtcJBm`Di;{$@vsxwtyV6Zb(gN<*CzP_Z$h>lR^G=_F83|z`* zTGp7umGMmtX{6`4B8+Lgl?9zXApmHqM-4U~EB_}KfcgjI0&IHSHg4EOPr8}a#^+vk zxr7H4Cr%)o>N7S<0NV+pxkMZUU^_6%-fy4numSL^$`YnJ4K@Gv(ClJixOL&;!!$?O z-HS(4_+0$KZ(HkyAFic&Mo{mFr%aZbeV@U`CivX%vmO31)i<9L(L7ZxpQ%f~QDWj` zOJb>c(eT&bqbN*y`C^QfDC`;(7_lOnI`x5rITocB{R$ce;-W~xeerBz_Di^FAOCE4 z{$OE!QZ%D5D^2spcIZ&>WcFPht{`W1GIY(jq3tyms~`?%4TCoYsQ>sTR-GP5&qxtI zmHx4)C3n0?5gDbNB1svLl7hXx_Q$h!UtBYVmh^A+iOZ`Cr498fG!s? za##*iEJx1eqSta;9a)>M@XM2^E3Y+o_&klc-WkY7fH-}01LZ)!eIQ-q8~v#$pvs-k zEl|N;`LIU1-q~0WwY5`x*85-)LeK_zz;D;Tt4r`+oV)90IvHE-=p~7b@^czd2MBP2k#02V^P;|FM5gG|>nL^Pw|x*`vXSUFYP2 z*i5sDbiT4AZeL?n`tbsecE6K6XeZ=(_rpmd7T|c|fM6h0aw)<0LwG%j(b9{Ck$V=& z#RTamgmQ<8hJO+h)KI?;d~A?!C<)_s($=aogDyb)Y#BdnZe0-uO_;YBpT6U{T8%lT zksR(X>e!!ut3x%-32X*u!%NHY9us~=`i^^gF(VZ4DdR44guO|AM~~j_Io`hzvX#dK z`PAeS3Oo_}x*>bBU*b=F3bG#?ZP9(f>FcRB_40L~$AOanvRpvtOYmFre1pC*dGJ!T zs^pX3tik(F%>(^T2gcbE6N^=UNmU+-E5L4+#|QZ_;C=l(Ll(IUihGgV!^PYuXB8?? zOJ`%z%$cXE#4Ue}N6lxY$D7oYmrfGS0=~t?V>--c{L4-qTOUQyuF#gXkpg(M8M;sf zEei|RdZ@R26D5xKMP@|KOWN)ZRlFNJxiul@ZyGsx4NmJd9qZkwvnO40{N702?@Qn* z+yAJ`y4}?f>xX}Sk`%V%sEHhTgLb)S?;mcT)Ea=qoa_Igt~zrkO=cnf=u?kf1ND$O z=m9YhFVBizO{g&3I3c)qZ$cDAg>e_J^bSL9R%7X(}2u#*$c2)8U@sU-$~9>`9n|R&KKv? z=4OSZM6tRqpmH|w)M7waCoPe0uVciM(dTQI~o*gl$YY0`xi}npl&mbFK?u^CD@nl54B;b z6t=9ey@v@pe{Mhw`d>lD{?pO7?ZT}HQ*a2)z}6K`;3jVHytqrfu928{ppLVq z8skN-WzBfe&1Y?u?|q6I`GIcqdwG&9<$=2tbY1cP2?UxLY#=;uCPx$_t5~3Ck&;E0 z)iZ_!+rH{IH(@N#PGejBhMr^?3%lmSK>;s**082&)3$gb?tDox)l4`at6o?03h?ITdERJ6Xx_pRrU1{d|P5*uL!w*K%&g0p!M zsw&NIvTUtIFPNpSyETAS)_ffqryR?0d_s?sNaqW=}UXE)27g*j$U)uBA;UYpnwu`>;$dAWMrGY<^ z{F1?VEnQf4Yz9l9ENV%Fo)m9wSxQfEHE*Z-L>woH4S7zU0MQy?^pkpIYm5RyX;gp66U z^%>7671e=IM~W9AY+idgqAcTMF5b0ub@yuuKJT5j2PlRzS8}N^PPyAwu7aLLZD|GA zkvQ!er zO+-=njW%UN<|0@{(f(becDh+OxLyPTd1Y|;NNPlNg#UBlfWS|8u0Ctb*<%$`fBMpf zsZyLfde@Tp0QVB=inCf=7q*lco&MSLF<{uvU+W3jTs~>=%qV^ z*rg@}FL*PQAfL^N;RfJY75vz_#ID4zU_mbxMhJgxCEf#+pE-lsd%A2^L5xK>RmIJ8 zZDW#y}xBdJg6147a z#-9vT_=|eaP;9xqu+jdx#tnv)XtgEEPZc`AmvFwwSy1m-@OrWP!(ED3z@R=J%90RpJ(42oSOmEL_v-gz8g9v9uOYA zf2L8qbaxcK=?vMSlDuN@c8S~`gjEanUKs$Ya0-noj# zO!dU}5o8AxOPsjbisn||0dL^HEO5TU!MA_>_3%$^$0`9^cK)X#b!3{hxFJMna@at3 z@4X8&K#2QJPsep1%Er{Th*DG9msD|vYcyc( zs`_c^)FSBT3c0mC@H>Oisudo|)m#un=6~{o^UU*x<1XP=fj}Zs zUJ$g6N;R`O3NWck(6Lf8HLdt*=(vdpx?bQW?Xtv%`CL*onQND?J0|hW?C?S2yt(gP zNTa5FjBmB9)wqVSCu=!swcIFqu_-mHBQ9%N%I)OgbA;dJu0C#|1#vdF-*JBoSI%8P zP^w__3M7`QdsoXbRiEHK=xw1YVhms^LDpXzlg)0nhJ5`#Y#@gGh}p-*yyH!;bqT@! z2_d(y{f4ZsL_SHhJcLwRc1J`H^F5D}!+{u}4w6aJe1kS$L$0s=S1OpQ3 zInMw49k_TZu7R#}&m>hqVbznn+?pboi9smBV1e7>m16qfb4?2uMpl2s=yH<7`+8o9aJjK(1QcICaS;782BHa0eHo@a z12RRV(T3DYFz|P!p1$GOU3E6rcyV<~efUH_` zT>*yc&<^U8hJE*y_FT#}9j+?hk7sG?7r&+sqF4J*CA-iF)VQV%`QIc-)0Ig z*`)Ow@4=#q(!aI=8h~JSz~B3hz9MYMAf;{Szjn_~n8bAvd46nOkbyf(1g5_h|%cgQ?t`a zixzuPMvta6mA;ef-c1XBMqfBeBiT=OoBLrt0tLL6gcw>?DBxH58`}s^$#6;bwer1< z7m^l-EUvR++V$?MLVY?&;-1SV6?Vyn>$@AX(jewhuxa@HGzZ;whm?Mj5c%BfE{0K1NoaPq5A6Iyxk#^ zI+uR?#3-Ld+YEFF;%u3R2$M+BTP=cNG_rju`~6Pp*T3pz+hr9z>~sZ(3r!tjg-+O4Mo1w2Dko1yhlL8-`&4>7g=POX<{cOp|20)j zeE(zCILad~L}011({4#&%h5;K9NS3s53MW!TB(hRD|GL^z*VURMUBoVuDA&fLz%l? zuAz0Nf+kG>omgJLP8-8Vi);vS?)GOLM!{U6pAlCQY1`9my|ib>U_p~@HlHKwhQ7Lr&^n z8CeGMt(<%}ETR(_8dJwza)vKQMDw4B4ZwgjyZGMLgB@5H(h~IoX*>wdAqW-4H%cgB zry<$gjIu+x-jl7q8*|X^o>tUTDnEkQDp|{DUneS`AOicVm+EguFQ+a>R1&H$-bA_o zy}RkY!nxwUTC7Eo{FWdn**xM=9A|gSdPODY=Q~#qKmNdOzWxPv1aJ15f>&O<%%2^J z3*H|AtDuZCFgAqnxJ*eQ9n)qBo!A5`dvZVV7r1R3)-J&X3>MGh{@I|QEh17lAhPO7 zQHM<(hpw?E#2Ixkc|K~LI)x8^r>n9%G?Z=Wwr|_^6ug7Msyj}upo1qNSP@E^|%r=d;;+ZS?SmIo?4p?s0qL;J|yw zT}!JDk|Up{Rjke4gjAJ;>lw&HMc2So1$1f6v=$`C#(kj1Ps7{NlNN}mm<4g!_xV3r zm9m<27Mv*pfrOw4{HGpdDij{q+b;vw0f}JIl{L*QIQn z@3%NIKJv6NIU1F8S-TG|uUa=ZS0?}Ll6)c4JHdRAk|z8CP)_R zWN57`Jft0|8_=aKZtRr&yUiZ*!>0CI8~qIib4X6c0?7*P0ttjItipQ8y5R9i86Znw z-^f#Cy|k<)z@gzG-QgWuKh0mlh#DKlT>xuzyN&p7N)4Od!7IJ_xo{gmB?L0SbZgJ{ z`I16^u&LsnEy$;ly}qk?SGunNlvVloOxs88y-H2k$!%`8rhxS@-&+k68!p}P;6MIn zPVu^TMJ)YG;ouWv9}Ro1Y2?dr z&+^4Q_%K2b*Q@~BCob_8@4u?2N3+F=2c5tLo4ik1p5Xd z6D1Xu?ia!+zcU$@P=!?wrOA?km2z+#96ZsNX3g1(pfL1N2k{~T<)ids_OmY?|yU(U=`*cwUGQJBNzcp zBEWHDoe`vETfMk}-|Ma`S;Psoy_Eq#nr`DHfKiFJqd#5!EM%**N;(7Vy=@#rmwUuX>T zMbbjp$nAT7{uwXh9evx!!{(pwJ#<4aje8KR?6G~x@AWDwl;LjSi}@jDYyolk#+=ZK zb=!bsEmze`9=H@vIzq0fLx5dMmnur#r(;{ zofn>86DLdO=r5xLOI?-PbCoZL!& z9%Lxer{{yfCx=s~C{oZpJ%l0}w9|;o2#zN(MzT@g6aeSz>6R^47NiF=9FPTEAH?RR zxv(U|T$XonSm_kv*1m(caxKUOH|@EjZM6~x+qWBuL0|^Dn!g^eqkm;9)?9Y8x6-4F z>(H6i8~_*h#+PRXCp_NaHM=Ecf@3@a*NJ6PHzzO2ALX@wQ$74rF&8ZIJXEUZ;wU@i zhlKUjhRKwiq1BKL>NxixO`v3(eShO7FaFn%{g2PQX36ALAzi~>fx?9Uhpw-Vi*oDQ zzG-AA6&N}URD>a|J7*To$?gR~nbN6Tx*iNe~>T|J9>C z4jZH#u|cznYisnr%sLcw0vivojNl!^l$CkSjSv^*DX zfED~9uw4(nR#EAyTUPLloqFDZct;Ce){v06Wm$;;tp0R1PKf(`Ch%I0k3Waru_s~F z=THAq(-d?`q{7bclpxfRwEU7^RQIl7;1l4pbMuD`Q)d{zc3s@!xY%`IKS2V|+uucY zX}LWn8=7m$g&N5%ZclX0bl%tSh_)9Fz3h&of^uqFRVg*W0lq_9peERYfAamqM8cjP z6Ka85sUYBF{lI&LJcrd>;Uw7nyi!Kx@akf*xD16rF(L}af8^s&hCampN9@iBkm zW|4Bct9}x#jqKSlq^Nlr_a%Tb)OCs{sAd?g-xNRFQdbsM=O*ik51;AFHxC}y3iLvD zMXZ*84sf z?->R|hQ!&7(PQ{N$xm-CK#FN%x}kOTF!Mm+>YzSFqm1S4rtJ%0?VA}38lP7`Bt|0{ zG~6CD;o_eKlU=(Yb}oOr;8v!5izKX3vi>I&D(H3@M(~BeFap=0sQ((q{TskAxZZu8 zQ4W-VqJprffe}s61rlO50DP^YeS3YaTi}qkR4mUhCXgnHGN&>o$f~6k{6a_emj0mK zt**B`hSK6Iyk2qRhnM^n;2J`ZVF zc`wz&n|prDzu*tOfu$nYtf>OA$jSp)x8_T*5AT$afUGR!{C3_Gm8ql5%XsCJl3T6;EK>*LMTIAykmx~B`5)}45^smm1Jxx};n zu+Fw=+K$V1@{(j2x@-GFTe_GI6WH^d)dRghx59(9kZQocuyn>Y6!whd+Dc4*C*lr} zZA-J@F81-b?Kpy6v>0!3M!tw}*+PlY#F+)C*^ z$cMO4r0f3mc`@C7#=zDf7Q18?(*cGTrDq6`nQDRMq21c_&(_dA4shF|iKrHsy(HZQ zr-IYD;FqDdqcQi31dR*#X~>7p4&Ja$#h+nn!Fw(k;|;dgDl;6%y1UkAMNWQv0=-h1 zeus&&u!R`wj8?=4>FATd%oXy8M-U9|{C+1*^7NsE3w8`wOxOMBZSw&|}zjf(${g6-9CC z%yhR88H=B}=+=CJcJ?eD?ug>$!Mv;LhPgzuR=WkdKmQTuz4fpCt)cRUcrJsUZiC+L zw#P;${RnCIFZ9;c<95>n@>3$3Kg@oQZ0G;*S5zQF#ua_)6!GN3Y5F(R48~rhK=QB1 zQq0m)|7Kb{*bJ_GrrmEQONUG7FS_g|#r31eCc#8chNGWpkt4ju^*Z}!Q)SD8oeR!nv3B!Dbky)zX%xv zpP}+La~P$1s{d|1T@ybWxgiqG6j$iOv?;<0SWTd(2zSrsX!wknPQSf!@WKkEp>J=N?*3{oCY7MvOk= z1ZRNz9or1Gr}ygV%%%_brXP56biVT#Y#9%4h*Bj9rSowXorw5YHK06wzjCiZ zV4&(EX|9DeHs14#_ek2 zxQJ!y%akY4!+Es0B~pKi!aj3SK~r)B!_3(W2rkAafTPfp`V}A?y6Mc>hpYZGtma@8 z_`_O&;(4bfr8;K=Lj;p}1t2uu?{F?tAptlcRP!ylppfS^<6a?Vk}Ks?Wv>EH7C;ci zn(kYJolEzBtI%o*uU{j`WJIU?iYm#nB!Zarmu~yw79|Z9PWA6mjcF$Q$M+iHu^3iEb=(s5wr5_f)~)Gc!qGRv zP6zTHxkB+xFV?$JfN&R7M@^&ibKCsE%t5Xzfhj*gKq*@)!%9nz%% zO7Pum!Gt7OXA4)_tQruJ`yq7_dV8T_daVBZ|4B&pkAzr0-xM(e-AwQg3;masMSl2I zGjpe@WU^(aidU$%!@*@l8*lg=BpF}i{+0`rd#C<>S=qLDE|IJr#`D{QLAknXf%H)S z0)1y$6g4G*xUHK!@eBgD()0+%t#9}2QIrwGwQG+*rPf}e@|ybT-{52{VC$Vo z2EB@$ERpc>hV}g@+6%Ezf7ywVBZl{Rtpfs!=Fqbb@d^iyw;XMxXJd%s=dT}P zgOb&MRl}Nfz^};?!xJCBaSx*}isEA-PrapR&@8=p(%KcFlHOX(+SkOAUO6RqydOg?ri?r70 z$S$Hu8PH@1Kqp+HGJAE&w%RIB_U^FKD=c{&UZ$vh7kdljpWl8wVR_g>?<-X4%w|MN zqy5uM+fZ?A+dj04EaAsh7Ico?l{b3wQ#tqIiY~nbl6NV-*=rIrLC5kM^cK|r>EjvskLK9Fb45AY5`6|Dk=QaLTXd=xun7c}m8bOD-w2p-Bq0lxf@;x{FV{}`?& z+e;>>susY>K10}slxVBK;0zAanwY0Oig^UY8fCErTa&}8Gf{WnSeG+g|9CY8RTZ^<;P8!#GH#( z_$4g|43f*6pu^X0EvsD!_*oYOJH|9*R;ThEfEP8Li48X$GJ##VHHH}3an{kkI~l{= zK{MuW6hY%7j0`?oYPvGsvUraf4vjKMyLjiSo(K@}v{l6_)ojb>*|bt!EU7|80}@5u z8;EwQGU;9wFJH5QQ3alwNgx)4>GP*Zxd|a4t0X7*tWVO$nN_+&%p`Eg)^mpA16G|H zYYM|F4P+@GJC?GOw$`sp0xUN!26kKKJ7I|pk3-llVHa=vn-bfFtV6m8440}IRG7R%Oh33 zHsd5j&yi_w4an90o~ga5CN4^V%NptEK&@=L!-Y#EiZ&>>Qc0X^f2 zeBkwTjC_FWa+vT;ed8m(l)oicaf=+8Oh&7#Klk?A$3QOH)22x`!5MtA2b1eISSmgs z)38}Q@3)gk85x&qR*JY_D+%F)&@InP_X}(f+*p7HU74=d`|)az<&^dm@&C&7QKlh7+jh9_=15`)LV0h_fCqgd4R z1YP%rERama;r1^wi?8DI8@7=CgIz{$>X!kZ!qnf#V47z(B6Nh7`_{cicx|Dj`!~{#H|JYlgwR1KLBJgyhX*(s zc6DR%Fb(xBHZfJO%aT_u6K#L<(Dyfut6OkFw( zL8}!fT?{2pe=itiN&ns|JP>1l0{CrIow-0vM zx8tt=yBuGg9nC#?a0v9qWtcY`OdEQYeq&gvsq=H?qO`3+evu`Y3^8qyXBHd!?n5{; zT4-y{z-eAjudifQTM4eocBvS#hZA4a+ubVLfI(Hd1ZW-_=uZ)m8lJb*byQ$bst*z*onNm_R|(YUs2odgbIN%+9#_1oxYItvQao&)jX z0`6YN^OnZyCrEOX=dolPTu&{{_pp(6ap}5&gG&biTmt*Fab*0P+BAwa!3v0y;$K5` zISnmW9h+C(Zl>zl+Z;<&6I5ujHV%s*uKf`>8SUg;|etkd-_!mv7SBd52TMOKDh180fm?3AE6cD%9L4x6JNjwk4+`2K01tqzU=( zZR^@EcX-CQ0%mh{%R&r7mJ^%-w-kj0a8c|3!_pBU!;Z0#MUp&bGZ|T5uF)gVt^LD0*8|9z^X5+LSsU zH|!M7<}$YMFOJ`@sNcGf#)!e{4%hJiTrCABEO-Ytn|6I#^Tn`SJ$-RIbUs|gs%kJU zgmMPwLGX@CSMQkRD(uv904L*zsH>J6q&6Z3N}1Quy~80d9Brn5 zTPz3=eOq7Y>~@aO4HEgils&fE_Q`$wWgEbe*gFjhZA0Jl<^-K?%cJU(b$qFPdyXYF z#>>0J#>u&^@4m)Xp)wO+0%lv%2!)FMvECw6&!qnG{j8^0rKv^xjpLh7HHL{5wcQGp zX{axoj&3}wCQ~t-8!&0wg?SB~woS6ksDb>dwvkq}3Q|qI=Y@QI|}t3Q)e*{UOych4@rHF(QFTm!{FFl|H*bvf-(tX4JkVn#DBZpaRlzRI0u z#?f&-3!95etyHM=SFF+9)!&aEYjCR^GCgN&&@(kzcn+U8K^pBib}oH*e(|yEV#A() zbx6NY3M${Pd{J(nL(K=dAfN;v3fN=)D6+vdy1XdaTI8sXD=M7cQ$g3ny{M{@7{Ecy z(PJUF1pzhIO>H}Hgzc)3Q|VaiqClKyOZizOL)oswKIfh@+fM8Kws1eyiW7)M@+*4#ekZ_>Q^nh8#qwwISjacx;nE1cSsuJAlm+J#QFAs$MH?Jo~ui zc?W~^TT?Yzsr!R_mtRh zl}#l#y}Um{`_fQ`*;m*(jq^e#mF)Y>71r$qD>y8k`krE_r2sBZpmYC{aR-QMh<_$7 zQP5gIj0-JfvA#Ng4*&hOn}>+^uR)-sNH*qX59E!p601xfU81#>+_7k2@?bDFty%kIfW z#O=z7p%aQ}x}KQr*88goFwP;z-G#aMWPscuztPRHIVbTJT^i}wD{Ns@I+Q;%#)Y}| zYNxv=i(fKQDII@9Oyh*&c~8c~uuy7L8rN^xELh+}BZQ#rqZ7&Y^n+X=WDvnaPmLNl>FS4TIop@2VzIq20Mu9@TP(z;V2#s%k2 zV^h!&%h@UyKWI(AWmw`;n_^$~W5d{(2PU6PcV_W(LY*7Uy$?Hd%bU*ZCjHVG78`@V zKdI!@l&j>tTw{Truq#lO{YSnZ{>ayOo){|;u!I`lh?w#6GhxOpj~7}o71*Y>%aK5e z4Z#ZWUK86c`a#z}1@+EUn0M7tCrNrekC5A{49VKRJ*-r<3bLG^+_nY{ZF^MOjjeQf zwR)asO==4}j#K!KN34M@q#9YKJA0D>5*}^Gp`RfHKJ6F3xWShT zB-Zi#N=%}bETM3MK>2qTM(^!9U%uoG%Rlg|*!iXPQW|MZ(9Fe(QF^`&E^-BHVl^0E z&zIlDhI}e6(vxXY?8>tRg>Pfvu5GK?oU9gmFP1Mk`)zF%!UvZiQYp{7&uzYf@&Yj4 zay!E3(BPa8y`Vx|wxF(-+gxS+)S{#NT3o~(JzFahNFN=nplh)R=4?Hvs06Rrj7;s# zzmuT5&(4}i&x+2u#E_KigwOHKvr}F_4*X#dXg%`-GQA#Ng?g8I(+lr7Tw`oy1}Rr* ze)|RL#{7py_n#{>o^}TxJzOr_F@6FZy?BhjhgxM%|ZoRyM78U{I~??}eG0kAFaZgCpP;sO0Nj0~zgtpIWjGiWBzU`Uyjp1d)~p z+Y~cZ3=gTuwgk(;EL?4l7bITaM+&@z>*|TB4SMR_+pA0mH&n%4k0{^xrPcFM(bam_ zXsx1cmHfqF91o6Wsz^{nu#p4rILnuK&;vecvnh5(?!TgCp2Vz=oVqgNu$qwIp-e9Y zwa9pe+W#fn_5HDmO3SMr+hQ9Lke~JODqD-?lHpzjn}{s2ZAXsE(%suXQU#k2z}~Kp z)9$jn)xk)(A^TOsjw!>(S!{}wbzxqv@8cAtN_W9ov1%uocm_07^{xsv0zj;W(`GQH)B4cN2w`I#h9AuM(?3_6Rz#gury5bTQmbP<$Imx|29nbce-8Oe`cKya+ zu<82NtwjEUbyNnA+V+@nc*xdXA(9N|39WZ%ZoULs*u}N8KPq3tZ&a=M)R*8Qb4J$c zEZ*?7G(7Q6xKnv{>Eu+%qs^M+Uh)^!q7eZSma%q`JW;FM%?AONYBSRVpr@z z2ydtylkD#i&ahL^+*uX5%cC^_+V*Yq+Q3{%6SdU*1Sz$dtACD<>6R3qF(N|FiM%p! z;#x4W<3ecp3dc4dh<-RIDQVmC<*Q6-kyo&_+4|7aJG%{3QwOM~HZWzp#BP744-UWBPj79V~0F0G|l^ku1gY4N1=)1zEJij+ecFy-+!xAg9 zuA2w2GQXtX-YN575a6C6MPztB5jm(y2q2*?GM^TKZTL*-!_OWqF1x6-c8`x8UY zJ)T=|(ibKlio9Acr$RuV2q`YgdZ?t`^-Ot+Nx=tFp`?20l!DU1zi z$@UCx%@q&oL5Y>YTwSHbXKW2f4JSj~yae>C%g;i5Zd(B_=(}3#)?*geCd)St%*U&F zSKD$B3MS8O_Liq%>4{f>G8K-6P*dL!0V5)acyMz%O-i@0@GfQ0_$W>P9C}fZB!|n(KK&l(s0CH= zBMq|MZW0{c`s#lpFyTMwIlN-a!=Cjf%*hty`XPLKf@B>=4xuzfNP@y~R`gvaQ+jYD zqCjm*`%Mw-gI;e`>AHX|5mMwbZW{zut+ppL*BkpyK%78x`bto}{f$AF&oWcCf2Ms}SY-+HvYd~9wnIO~VcD?ML^Z5-e z$vz+Ji^(_7$23>oDyM#e9_+mZ>9?$LWhup0aJYxmmIt^vg~-8dTy2~bE;kZG5ADZN z(+jcB<+_@8K&5k(M$2ZP6sX5SH<%>k1{}Vp&Gq4$#D%{F>h`Oey()#vEo#X=5=_( zhbOqft^L7OiE=MG$d>>dATrvD%I%IW5#N#U?~^w=Ya}slr*}YRg^w!Fr&LGdz$}s{^@7efd&jw*AAVH< zp{Pz;6LQGMVJwx%A_<&!9i=J7qqzj|2_NJ*y*gb9dv2z!%RcjjMJ5+p4<}?%&Nc+r zjJ{BGo$Zbc*V1HHNT1sSpb^OoPQxbwE@luzlq0#`MvD0lV4|*Ybv` z>@@W|rdeRI7{7*FqwWs&6+0j0U=S&Hs4h z+*)~#2#$2%f608CNpGp5WPLMp_Vmm z)3JG#s+ZWS(5pG%7`*$l*G9|Z5e>HmZAV5{_CBbfUv8L!$s@mj$xECIquPjw25o$@ zE)u}!!Vsa`0<`Mp8QD_o_cN*>0E@z6h~h#T4wi&sbThzwc!pnq6!JYiS}3Xt<ZW`}pumryYlEkW7hVm$>y z!4nO8rkTrmwq%g&{8V-}snCEn>7@Zp_RhJ4hE)ZcOST3qDWL)tl5v@27YE$d8(29= zgsgF1QG?CA={s!sZfx0CWq4{Uo$Z{J4sJ4K_lK3r3vQl@?Y5s{`Ywz7DrEbh|KLm)#Y`wGIZp6@G zNy$obbAJZ*Fp?(d+^XRHmUy?bGsoa)dUKWxTbt#&G`C6oY8@X`KRxBuj1#yy>!nL) zs_x3!6{?~^l0k8fe^8fg!(mxvdMhDeZ+WH-s*2A#F!j7+DCcV+qn~%I76YV|Y4;;8 z6@Pqy67ncKUSnH=h`!<(VlucCGd-xMr>e$V1Nhqza=(w#K)qt}@xc(l5~rRl2poGt zkPmm)vd@-W8C~{!x^!VPgG2ccuRHGl;&*#~&^`_t&rlWh-vj(+qzEzGX)YhQ^4_h> zPMZf6@A5~2Jto4B>7X?uz7LGD@2F1NXitNA=Y$dT;?>-6_Jm%nw1$O#+3sX|P}`N^ z8caw}w2)ve<3g;L%|1JXefjC2WP>d-wQb)gloYzwyT+BtTFW0(8{36RZEtgfJ4bFX zMr^Redp59=L-oV;{^>dMS{4=`C-C@Q(O6^G*~RW=&eViTzGQ+YVD=BYV?LyH0-ZxB z4$Ok$0QlkE!DXMhevOE|`5xM<;0CLmE_EgN^O-bXgzV1mfVluY`I5hI7U2Zz-K)bj z!5-_tvZb4754I#tYTuPih6hP<^A~5_NrJ6S*lhsIp5zA|a}O>18~bi|n(%U-*~rSx zN4-O8ZuKY8w$A%!)0+6M8Em1_=62mGZUJFHR;Bx&w&ViG%LB*#BYPI@etGdBTHN3p z5(|Q{S-=d^FY!Y{wGO*Q}R+ zZW>p(^B~ zn<-u|9xG|tVzep+of6Ef!YaXy4p@t?qzFqnyy9@pjPu!5!QB_2HNv|W{s0N(FBV$S zdfC0p_u<$Xcy!8P#Ju;K61)|kV@?9q5I{SUQ+hM~VhapM!je~L?3XX$a#3PsS_t?g z5q<*$mXD#C6c?J~WxSNbl)*fv!e$jTOKpTp{g-z+YqraS9Z?1}M8#YS*@F+%HN{Od zG{r5O;yqPOPea&vHmyw>rdgUt>wBUshjm#Fn z?|u6q>q~RCN&7w2F>Ql640VbUz!5GQX{?`f04=Rem`;$a9mSjOi~ zXA2^{=+SrYp93lmRDk-F?a1&*WWLWiRVkU?T)fU%C3sdu&}oN}^huixc^lA)|4_Y| zKlmKvF=BHTdPZ+PQKLY_TKk^QC>`_TB@76vvX_w8h9zURLEpl=-STgSilz2;#b_1? z|F^yH3y#_dU9T)=*#DqELI_sS@9#iM!A(rr5v>|iN){jyxOv85WEro}oB|Kfdyisg z@H+)MYn<;(vE>o~8}9z+x+t~3Fn$AenTSgxMZA|CG#yql^}u<j3Y z$|w$5*W7lo0aI|sX7-&F*Zll}a~nRY(vt)_f0oeB?r#tBp5)eL=v}R%bnCZfR^tGfNnhR{htOe$S z+sMl8smt>nc6wZpC!(Clha(0mFd~DQgBR>-@qH z?5`kkvSuEX8F6UJbyeK!4q>g>hf7%xO6wQYQ!U96MsCd(lu59+lj1V)>#-rm8(xbV$Hat!djGZrENPBqN!Jw2soV&nv$Lp*u;AaB#@sB6; zGvFp;tbDPkOtl6E4E+hETnitMt^rwRs%HukUz~FeboWTTsFi54_G34+ol@cpx}LtEkb?k&4sL76R@ggb zdm4g_Q~W30viFL<0DJkv1t@XqA?*@l6`|LRT#72E0@cmZb-h~MS|W%b{l7o@)Yi0l z!e+igF9)!wc!`8eZHeBo&Ej>j-Z6zN(noR&S!<3%5b4iV!7XN-Z<#QrjH#QWw6*Wt ztg#%Zg?`GwClOQ;$$g}hL+nI(t=u_FVuH^frZC=h0Q6)frMP96M5nPmno^ouy?4$% zbK0I1%K39l>3_$E6h;?HUrmCA&$z-d*k1#P6mOJUAcvct2P+$t=a>Cexwx$_)wH~~ zzC<4FQgJ{}`gTz4dGN#58thlBgH=B(ijlNkFrVxnq`b4DWn3@&?^5j~<|Mv5YOxO<4zngZkw8=F>*`fU4}fkUdjzBO$>O9^QJpFW9bGK~%`min$^6imQ%@O-~#vxzOI?kgz z?dF+4Zg4kK!{iR`U|VJQDgy{9kS72fLuTtv#>~jEZ_$Lz*$iVIAwvGZ~ zEjoH+a*^l8v8bOG-5_`3^&OqD&n8_s1~E$=?Zw~MeP^!(3g2gZJ|GMN-wZ1a3jjne%~zB`5`N>zfoii_ zH{#RllaJSMJy(Wr54f*?Y# zb!$o~W|jH=l+tvOV^OxD{hatj$M`Z)RcLa7@wI1qv#b4U_ESz`GsYHMiEHkB2BZSG zvnQ2=n{E@ULeNzLMdcsQSdadtu6kv7ngp+v6DQ-wql*qaZ-EsBm<@A7kY(oQ;MUsK z>$+1)6b7X2pryuaJv#<~XwY)-AFqO_bA`=LjnIV?eyvX)Z#6F98{hf!ejFUaX6A`0 zwJ*{kW-@W$c0g%klWeODRlou}(mnpN3PqH?(|0%bCV=k3|JpNoX+m{shp?|d&D-^(Ra_V1HB`d_Q6tt z(XILW4%k(kYtPS7f}rPW*;b_Lg&Y7;;EWm-YYnNu`2TDR{9Ru4&-jC`uYv~JQL3{9 zPglrRMjnqH?h2})+M|O(+6N!|qm56k9@aC{apL!SenEfeXn%VV^Cv>V%9@SG!N8(Z z*AFP<-Rp6FyUL)cd^xX;OY?1|^AJRJq@ZK()9RSIS-%Fy^MH@J>%70oZ<|Q2w!Ue@ zeb%bEBxI5ZX%Jv%Ma6mgt%`Cl18?WbymI}Qyg~ULx-S-@M%)DmLfD6(uZNlK-^Nv? zAGa&wW;L1XNRPx`H|&s3f(f*pmH_HCk>9!cj=UOzx+0aPl=MN08I-r)FtF!J3o(}; zsimJJ2yWi-b@OTG&WAB=9Z6VGT4<{MnPHI-wJtlYdbg0!U$&&aKtuqee;W(cRx zPP`SFq}2Z=T}D|T^_xD+iUMv2x)M;He#Hrv{+t8gfP(%w{~QIio+^!cnAI)T(+)|a zvV8ua(m0=+9bf_{L}`W+^uFbyqxv`yRb21|@RF&+*1CUxO}(;V$DkMx27o0VzJ9kH zc)CkIySGBu?y%v4qjv0hU(jBk{Al*XF|SuAFj&Vh zoTmL3^zw>A!SMT#ZDnHUSJuVv-+=gRIfMMZ9Mfr}(rY7vG7gX4{B1B*p^Oq!>`sOq zU}uE%_OI?jPE5`n4hU+w!2<&P?J1?tm|>jwmSZKOBpamvjlk~s`y-^Q1pf}k0^&>HCP+r#=cp;xTLD~d)h6(E z$^Rz-t(pz{fpz-889!f6oBjxX+JPrAYdO^WA#pF?0-^UEmg&e;YY4? z`n=G~v>mF97_qZ7)?Izrs1iru7%74OzShqTutluuCmwUcVBek~)VTllRN0!{>g$UF zD|@V287P8cpDPyzyCmz2uzar(MgqAV`JtS{4~55c9ipL!gwHuY^*8E1M#2U>I?EPF;?J(Kq^8Q?%gBT#s6Uqr6y;7`_)W< zh&1C>t*4a24E>@JoTwW>X4`^5pVmS%7zkwo!W51HF%TcQNU|W?u=-0MbK3Sn{r$1& zwa2fDe855#$fSr#LD(a+xIj>C?x|-0U?Rr=X0Np=daOM}fV_oG(=q16jD}pYle_JB(EpsYi+W)^g zc2Vg>WyyUvkH-G0fS~(bzygC0)lDDtU;O6_0&&+^!)QeulImrZVm5DQO>a{{cX7Yw zY&STg39(cSL2$QldlE?f4;BA^UxBQ?fe|+QB`gC2srxLb?98SFP(V2`7REMeDLet) ziK!hLVX5pGp$MGfzttP^+^+j0uEh7xX`iu^KOu#0B4AKz9XOB1R{-rLL#`@!Z6C)h z3E9H_%|9A#4j>_ne) z5<7|XU{QXP!k{c5%Vn>SBkAMRnvgYtUuYgI!Avkr?r9*fp6TX)~NC6Jr^C-V3IrxuVWY2QhEKQtB3(@>TM@+@ztrCo)l$p z*>?t^mF$tJ@Nrf(!ww!l#FeOqm9I^2ova|NR%hL5$Ij_-!z$W%j&Uw+WgZR3jYlO2 z!M)22(p9&&;ph$-Sbs&e);Qz~N;OH2$}~DtI~LrK{_i6LJuLy`5<efO-cIa8-?E_e?%(nbNh2@7SE7G`P<{*h;bUw!54FYDx*sb`Tj|b>2F0T1YOp>$ zEssOe4Cdifjl5&3w;R#F_J*L+0=p&~DJW@; zut&$71S4_`sw{e)&s%vCP4RDbep?4<5G~Bqg}^_=NaBGxJ`)kpFfC+9hL*Auw!ids zK3QyGFaSp_Kte!PjVqYdyVgzPJ=``^?N8yCSzSo00B6oLmgzh*QT!v;)Z0K@}*HCm|P z=(3!6(*h|6_*}YJZks9qQk{GTaN(Yt9r3|rLm@P znk{8eLE0bywZF{7-9OvAb^lB$2l~ms$<5uv=2qWjk{&FmDV*1o#)q92=!c**X-OIP zif5;ijGFuq4x%B4F!?*$jc|hVf1fHz(_4L-gWSsS^{*CP4)gaqpFe?wc!jgQd^jvz zx4sluHOczZW3cPdfbsqpMfrc<0QTe^HXb*CAY6!P1$Bm5*7$~zrhCJ*L=gI^X3ns= zn;bJb`#&b~N}|~RP^*qCktsVbeqRm(tgV#+Y=8t3 zdVZwSO2|4a=b739m4mZJHME041BwAUuNiaR%;Ta%QdySIi!)4w62gt6N(f_JwvbXs z(DeoYU@-H+(LQi0%_3j~2nQ*r6Ady&Cm}`A&yi6~*_W$JZ~u~J77aq8egc@2mUWYm zh|V2Zin+Ygecj1z^01=NJd8yZO+I!$h^{1t=B%FEVLh2IcVl9OwdlYm839MUL$!Mh ze_OzTCU8d<{JBASiZr^dhvm`-`Zuf%@=`xf+W`b4n$+Y`Xf52U+rolOE=lq2mwlo& znH3WzRe~F#2_QIX(SjPUgF*gng615ZY~auAoS$ND=!gRTMz{ZVFso_5c$}_$y(PiF zofb#%Kf`@s#wC>r-^c7TwtSx3db6q^sZh544MgbsQT;ATaBGSMntv;~)w-~TIbAXa zMdZ|x`S?||lTJV2n_W%Li8AH%7XgF%v8Fn_emm1zk;BQZa^7JFy0kK zQag7nvPU4u>B#(lDd>x^*=GzWb6EC}SvoH%DfSmlkG}mVKH2lDVq*wb;Qs0TK{=Eo zFr2;qr7!A-gX`A$-M#v#XA0*o8eL|V+$h5Nc<&G>@9WXB<2Z4(RvL)g|HuSnI38e{ z=tldPxPUXQs*T#&)5PF-%gpfH`Cc(oTb(eF2-Q<(%?`UuuzqwZobVh5JqwNui&PsE z6ure*6sK51=7UHAbJ~iIl~x-Vy-M31`!{cjjtMrh7;X*xUU{2WRZF5jrHSSibqun4 zHuuV~M}y8XQ-I0J=A^Dqus9*;6)<3I1#PqcrTFv#q^r{syg^SSfMRp>b86!-V1ixM zz3r+Juk8MV*4vgIN_m&}rxQ#r* zFNUw_S4CwK3MF+eRwwV`mMmiWi5@|a{gM7BH3@X&!nzl=Mm71~wUl>e#^lp<)_tO} zS}4t{OHTRPN{6hzP&!0C;mTmkt#y_|;7SVFYzh&n?>JasE9w6jC)jv8QnF0W#le?A z8Ve7)e$rH4%S7*jA42<}W!77U7-BANsw>><(YC^=Fkd22Suy*5h=F4R;JDFI%YAiB zbVIS9_7HvM+>6kkQd(F9foy8^k!VS_N1?D2yrFYkid0`xDSM}r5*P1LZ~DCaL{5v5 zX2*&XK#muhGZV6{R`g1VpkGI7uKK`5+14`SFQDrl$EEeHFP%$H%LBi-9YB?GOsoX` z*mF+D_xKgylR7~^%~NfLMGj(EO-p=XUo?7j{SS7MadAdwmT_o0U03ed>E^h z3F1ea>i29b-rl&Xw?xpykwa%nT^(b}eXw`;G ztaelbkc#;dI?HF3gZZNqYmo$m1gy1x%7GcBw|CXa#4(nDhVQNRN;~R+D;~1KEroPs zmFCm*_N+gd+Q(#i%n85tm@M7!Rtsn_wX%d>CI5~d@FjQFbWw}fm1niJb?WkLR5S(E z))fpW+~h=5KF}nBa;_c~h7DJ29Wy{-U{su!1`iO|cgL_=Y#cEZ*!F9;?|E-QIm1Z| zb|LCfo2qLPEY$!YTJ({TSGdG}T%Dlg1poULAqn=iN;n44OpnoK7?-a0Z}Mp~&*#8h z5(N?sL_#NYcFSc4g%>K?oOx^zT5SUHrq71hWCk~vhewxgI094&_HLyNiwG4~_*kKu z;$U#$Zd?t3wMQF3)Ih&Tuhya%c5T77bNJvCwbC<-(e_gZz`7X->bwJKaF?9bew zRg`UZvw?i+ptrP>za)3{R@E!vuk5f6hZ8lO-(4iBipTR;%wQ3io#4;ZzY z(%j*{C2f4*c=i&lq9kr7*R_O7oE$>4|F|<-Yr!F6#I5Q4G|4ERMn|$$_NiAk5hQzL z6)j+yEBj5zC&62;U_ZW%ha@S{`=pk8k;NdW_ogpeaXNqBi;$=9?3x?V{`{rS_)7^j z;!?=H6sbrHio{aygz+S2tA?>D1$R&&`@;ojaES~Ts8`d~E9vi}j*~1t&lXX_hzSK2 zurzF#a}GjM962XZz4(!uwT&)ZJ%aU}smz55!YDWFeouh^)%xi9J=>|F~Fs0x6^t@6fq*(Y0mvWF?o%Sh1 z_SJZZ9yj?S&O)ZKR6h}ZLqpzL`IwrOo`dhk=xC?(U5CvG}0h{(Q!?a)x3IBnz@6U@1 zAGOZuCO4ZQpxEL8H>s7O+pl|yJQn5L5}vRs^n0uv?*<&L#IIPCUBjHKLVf9a_DgW+ zNA}3F+|AY8b=OIHj1Zw<`|vxtw)^@_>XY2dL{RI%=!0jk`#JHp`NwpkwzUe4o542d zN5==dR{81a2cV-KxAIXQ6h5w?%UIkr%i%`UV-J|$)uZ_y_3SI2{1NS~tnbII(;qAp zTXL0POjYM^^#5>(XOj^r_KChHNQtZt_itOM2w6#4|7zbp_NmM`cxhoq>eou=#L_S} z2?jqw{}_%DilKkAJo$DX{QbkLnE!5=5TbqOmsmnaO>%Xe2?dSLtDY8@=A?y&mA>cJ z5R{I$o?WaC1y^$JxBf2OPy(m@$lOREm-+*xBeL1E=DN+R1x&mE!zN|(EHrHI#OR*` zD{Fp_A%Qgl&4>|F*Rh(a>9S8}vq$d}!g<`04(G(6arTx26E6);2V^Fs8-}Yp{S9%? zD<9FZv$vg}-A)UBJ6$jzrSq^M>S?oZ-1aWfgmv@e9JdFZXm#Fzl`>Vi{mIoko)6AU z^g6Jem}GjU|DxXzg=ppp)E^c$VN(*WD)id$BKG=31a%#Wh{iP-7LD_Trla<7;mwlJ zNY_Hc^HP4MAEsc^lO|hcm$o9VZ6 zKeg{m^4pfny;+XsfE_4Gr*@}gW|p+t({HEGy}4_OE$H^ z)d5#dVQ*OEVN+z*U$`i~xO!aAC;ebxVPAMDkBC;UGJb2W ztgQk#@BE{44kOpEH&pcC@uY0TP;89Kz4vz_iouFmHGf@fVDPq?->FpVA%cvKT$%gj zUg(8Rou~rm!31FrKgvc9#GSzWngU67iW?@0)n@LrBWIPFs)v#I2zkG z_3l{{+q6M)sT2ptC*JMpUZ4wzpF@0){tRw?;EV-?MPH>RV-BVE1hs{l2#m5)de55iy9;F$fd52@>?0z16YM`Aq{ zO@_MpYR3f4sT$-eC5rmWPH6!a74yh;$@~4z{4$qJ_@K|;y~z{ImmIC%yx=qug7R8_ zm1swlT4Ckw7k`R)9K2f`_$Di}&-@s#lX~YiXuXF8>WVgWD(CWc!tc4Y;Ef^ZNXiiU zq0Kpsr~(T;)hK@~>V}4G^ZcFcmn0-mY(SNN2Pxj?|6IsH(d(YVgZ_#1;VB3zJPJbE zejQ?bz<;aHgb3_n4c5nQg7rYZ7`U*ZwN_QVj5Liwc%=4CZ1epX6o1vM-&<1f#Vox| zjx6zDwYV)`&T)UlrG>j!ygD}~>(jhv%q-jgqwC58ptMkd!># z;=vT@s?Eetzytw1){NMMz+@U!B4u`xcd@Z4-D~>YBp2CCm(kYNmu+CmH{TxU{7H`4 z3G+FnYZ48N^J`x$j}8+69D3_czmsYyWD%WanKzXu?W&1iqW_mM zD+QW}vt@V*zoYeMXQrtYxuEfm;lPX{H2%5`l7_u(j(Ih&^58#Mvba9Tw;{0u;=&Q! zljmSAcAp)j8Z1l$u7YFBd7Q5d$4~g1OC>3uYG(-;C&gRVe4<{+cfh8<-`f`H%@;@E zdq7s}@vG%BAZ%-RTct@x4qhgnAh%6X=BldtNZTt*gjL@0dM0Dk;SCq$o(0GB;f^N-%>rA4YFrd*1Q>SX+q*~7n#3|0(0%K3 zP-G|Mi(gS#NbTn7eCCbctouHaB0y!&V9Gn4@~8AR$TN-(SfV*J2U5fY%arBQpt1Ga zt5?}h%S)N!t9lC4Ki2;(mrKYy+;&f}1sBFeaJdRI! zabp|gde=*no+z^ArOOAqGZy#Kn$J*zt$UL z{DxXvT3U8jA^L(^0Yygf!;O~X2pv3QM);n$*h?sCzH$taG2>WC49?TH|H#lM)``vX z`v&{CtlmW~Y?348JdTTcq?5^6vD-`Ai2y#C3$0YqJQ;6B!C+k?g?E`kXY% zFE0@lcg?1$W}t>8XuB0??o(Qp+T=m&->P|%=@{1ogS|R8gsZ%cZnJ}Da_jENWXI$^ z?>6^?X#3-JdC_r6tf%mz>W?@xKdDQM#7u;dj|{%W?d=`JGAqN7Yhr7G$dInFmaYQn zhRWSq+`6F@9-8%C#T=h<8u?B+98s)XMh=OMofm9c>R#JG$tnE0Tln0i`8}YOlh436 zy}Ypx0*U41^ncu}!HqFALzX6V%>GK=zqYYGR% zIuom<3A)$1&5G2J@8qUF+s~;C%ilASo55gO6ly7ISlqd)IE@EUB})-9?FH{65CY>` zAim_)8=n&L1p`RMbxfP47F$W6!g7L!7pF&ftIp2I3D_1DRKMza`23*)h$KAz+aYHI zV(eG%4$mNSOPnM~5$W2yUcyfaTvGx*O0-pk{E@^-w~`r&5^Sn|d3po|j!l{;$L-bm z23l_q)Ogv);IVnt8)IZ!u)x$lA*`1tFUT-~J~&YI>jt)x$7DO?4kuT-mtG#Q$q>;N zj5`;v#|JgDCP*({4rcCoJlT1ruo`gm9{_=pQHyjysDK%XiB&dwzN|VGt3?Y!C zoa|&fMgMAZQE*p5^*9jk_{tlbfyh{PI%y(!-81L;gMIoyt-45RIX)ckS;u5I2Q+wb zT=LF&471BYt_QGi2iXSIDX>ygN=qq(@K9C-$fjoRM~p?C{5pnEUslnXf*PDp?!o66 zS>99Vo>d_%W(wUESg2}IP#=8jRvp(ZQd=BJ53u8AWCIFuL5STF{i%w|0|jR&LH2Mg zpd7fo`1P{=SNtj<$5uAFyN~aFD07LamiddPsd9m>Hss!_`6m7HSo!tOkA8X3`%p&Y z9LV2$Qp(Ffgd|^jl}5jK!pOul7*_gXk3Iwosfxy`7c(L#9JUh&(1!B@lRox zk5qI9{WV4=RNtkB9f902Slo>eI{t0MZ8+e4h_rmp#}L^d%}+0Ia7R)Zj^XZI?gzsy zmF?j2#VPt_(z{CPF67jSD?0G5l*aQAM_sRV=tGp?0`|T3_?R8 z_YRr=P3~e`r=;GtQTX+EE+G9`_ueSM%aTV*izyohfT5k0;*{Wg%MDt@$Hmme0a2+4 z3AWI=p&U5hEE^soXC}zUHe%Z2;BsK>~mzGqktEFk5NK9LqYiBeN8g0 zof0~3nhZ0=qFl&w8GR;oJZ&EiqxInj~+}c7jUw~${R=*8;8ZmrH;k|L4EOS)r#4HCR09L@OG;4zP!+iwE?*Hd!KrESJuo0A{KFZFd0CjD!p-$b-#3~ zOjloSSHsnOb&)K5n-#QR%EOB{k6{3Vji&edoGEj-Lkel+79Xwc>1ugtCeUury0iJh zR*aMnzL*p?S*wdzV6gMuv)@nm`{B*Jrg50#$7Lf2CH?H?eleQ@T}rf}V4zejW}8W6 z@o$HujFb*FYr-Z0Cyoeuvh_g)O}`7+v{)4etw={WVeXf%`NpRp)T&OVe62dZ^T<|? zgmY;mf|Ufqn~8B>nxs)n`*70im~HrGd{y18Td*mK04)rGaQV%m73EMv?Kj_i9QTP& zZ{ugx?tZMxqISmh+R0bSJ)=}CeX~5m)a)Qt!-F(J|1kUTAHe(8liav(8^nTB(gryw zj&=h>u9@6M_%RTa&>P=W&w~NJw*pO7i)z`X)9?FEiNt5hwNWLSzL)^f2hqG>)0oFwA4b~8EQF6ZtF~fUeKQTm!uc0f@wIO;pj=Ez?Xs6*4NCR8yDAaG_g|d$#4*Ttlh1bUpkPe2rflizAAF4#268 z7^0|YCFmLRawU6lME?yt@j7+V`R&RaJ%=ae@D7N+>nD*4uT35!{=G?SeXWnfqHtd= zX&{+33NMILcJloTa0)|C7Chp3v!-b9rVry4Avc??MwM-YVozxNK=(psx zk!hO8<6h}@gDKCP?*b#3lSpeh(Re_crr4Rnw*O6z5crnpApKF?RW<4tv-rIm-*d6E z)Fx*_ef6(ktmcWc(a_tCxV(kFT@T>X1*U9STVv9@F_W88&q^MJdEJKGyUq!!{}`Mf ze*Ro4Qk4iC1UCk{U98t@eNTy(XYtMsIxmO5!VlFHz+=ZINYog6sK#FYRTGWA z05j+x{c@B0?)rm|1qa^>AshuB$gkq)#{rjbhQiq=)762F@PgEd-cmDb%l*6nX5m4I z^K>AS`mR_buL?Du$mFK3X@>F7fxaz;P4eL%Fb({9t{QP(EurZ~2$0rmA>=e|!R!o6 z+YZ6-Fn*D}5L>etdvmE6_?nu;=-=DlIqlauyG2n_<+c=#Jy$pZ_qh=2+?>9EwkRUA z?{|<EogUuPhW5LvF(>Y|JJKb@02 ze`UCKyAW-)r?l||zT=O@6#Q}@rLZF;+dE8}#JBI$s%cztyC5zdlwjk+623KfTUgk>S4ud@6@j=`q=?K&(?Ca%@4FUNstI77X>Hx z?*+<~?XWvw>y_f3hshAgu45dk!QgN>zB4kv`(={17lIZmxT#k48G(ZA>utl>&G5W# zb2yx@Mc&~=%M&G+6i-mCa)&ZAOJTlR^A@8rMhYqSIyu^3Ut)_B$5}h5E zo}&UuelrSHq}K)>BRg1DeND6l@#Eoq8KHmlgGX}`*xOf9{JuUD3^Q@kWFbo zK()iUrv8l3ZF@)fG#17;z~xo>4*%CBJEZds(o}B>B{yn}hXSVm%Xs<2T=v(HU?k-- znB=K5)$R7a{h;icg&*sqZeD0N?xtB&=aGLZKHh86taTh#Z&?~oL|npN9z>?4@T za~Du9syB>87qCRw;X;ghei2L+k_eL*kkpqsS`fAz(fl@O zArggo#4tcQTl*A#V7@X$fr5Xnun}Upvb>R5Yc&@EBrJn-$gYP~_ue>k9RECb4pd-v zS^`eTajxz|?eq5Sg={9BSjrE^CO1Zu`sKjsN!b+(>j-%hcJW1I(jN$s?@69)Uiylo z;fBc7Z4S~6sx*)-O9iTJ@lvcfbv7PN#wRo9H^ljvc~wl7Pq`xf&=9^%+~-MlknWVX zm%9AdK=a~C_@O%=gSO=q^-_=A6q(P$nSC9+_H{2MA!_UqLl=s`;ycuo3FvmU9M#Ps zHJK%t7voWhrqyGA3DPAD&u+C*hAnm=RQpR9YhLT1IQvWE{H{9@{Q~T;J&9fu;(nt; zjYZ}`BVS}7BfB^Mag|45Yam~~?t6GW-!9a(gvz>G}pt>CeX zQ=tzs7(^`um4UMeQ9ChqKD`=)Y#H>apLkm&=@$3;ar>p}+oY$X-$dl+kMR!PMoTK2 zOs7_Ns>xqzk-Jabhv3x}6L3)1wx}1k=s3Ance;I807g3RF{<&&zaF>l3+9b_WFEt* z@^9J6ee%6GXciaQiNESEbV!0a=$YKliGp@@em(Z`qF@HWuU7n`pqNx~QWO0Y(KZU4 zYEEo2*jVTo5BWB}<6Ru!>G72a+Pszk<u(!%EA8yl5yubLrP8RB*Gl`FBJu0x$2u8tq zVc;9C(*W}YuUBqMI(x>E`!?_#0%Qk9dx?>0F2lG5xnjdSp z^IMReq9UGwTH}K`lLIpdQ{TFFW)WVY_OpLw?ynxHzS9>C{^;* zn$>WdAZQOjkNfvtfF1wq-Iwh`1S`H7l=gz6gT6+2l^h#tGd-9IsZGzeLFAQUkjv$| zopNud2&iEMce7cr9<-Zphj59F2fOHk&Az-&3?81ZDP>2-ax4v#&>i zp`b=?erY-rKv|Rh>iC^XQa)FHOM4sLt0r{l86x}kZ^!4wT;-ecRvAxckHh(nJLpdJ zV$oQ9lCoWN$Sx66GHEPw7mRs$qLTQvc3(Py#gsA?KdeBN!7ZE`49GAvs%|rTRA&-H zp4>1zeWZ}?`wj4>;0}jfAd?Fh-UfNXF-!6**)4TOHTj`!1f1QZ@mYNmG#b)uq83d_8`?l1-w$c{!V&4X#Fd(m_BTTlV88p>RaAj) zdcd2FOUzEGo@Q8HheAO%VugY-+?f5FS>zfcUymxmuVaZj;Do1Sj2qMe1yj9i!`tx( znM7p2wkuPeTZ5k;->u|(C9ZdIxYtkg6P9bra%gUdSx8{6ua;E5dC1S)72DSv2}prQ zGI$L$hU$6HpL?3);{|v+@$1|$Rrn7OKb@kF;ywP1-F8n82#!szL9`VOIa+!5PKQpV zBkmH6kmat2@2iv>O+e!kN0vD}FCdt%Cv<^ObyTo)Ue2jvVK+k!^w-W8JJ=w_Js(fd z5>Ac-KCN*>BkTs@2!U>=C1;XuWk6U>nixwWW9H%IGe^`(Vp>tx)BP&=8kQ|KGb9fG zt*y>f?U~3xK}p*Zpt^6oiR3vS(aO3%MbV~;+YC-E^BgWhg5a~2f~t3>*dUmEP1Uxb z;qfL%su-u~zOY@euF_2-`Rt$DTGUs&9^Rjl10RoIxHTqP9?~%E{661IfV@Bw14jG@ zKP7fU14Y3G5JGHS@TY5f%KPa}c7YW1c*vafvt!l5OV+IIk2*rWyo8y`z9${1b$y8_ zJ4C(p9YTkO*lVH-Huw4Iryy%Vbswj#Kp&Eb@A5X*5&w=b10MYxwbNRwP))yf%eEe;zm`(bCxg4|gvyYe`B?Cj&KY!Ae_D zCqs8Cq{oU%_S~#n5lTA<4yoYiO?<%Fi9n9mBHPK>?F4nC{{mAcn;Z3S+!3A=f>i7z z_7-5)fup8{g8mDt5Ma;-UP{2HIL*jFShbqdU-boR4uZWruOtJukX$}b!tj>Im0*|Ei$ zB99J0zkxp1D-LDn0-c1HX0pYD;f8yl$_bRle@L{xsQzMT2XIYBQ_CNqM)HXxi_Xw= z-y)U9#CEm=h+zm9i$q)Y^oo8B3kU6szsT+hoi`2lGL|YvN&RlhR`F*SOVRWVwg!%n zVDLNi{>nHscj}gKx*k%e66;{4TZ*0w(_S0Vw*5jX?x6T4Yldh!xMrJ3FRbaiyP6_S zy&k;7^a%8bno6%6(Zqkwp!ChpP7H6NE*~*@>oG3pCd>K`qW5ecD>u6SujjT4{nX!n zNG4G2J4+YJCNgxcZcTvih~}Y92C?25xXSflNX%>iFL;Ztqt#7 z&kJxRl{|jgU+Br33i`rC^11&w-#m0(&F?GRu>&p z4=r-czxj89S}1OQLe^R!#&P)=Bd~KM`{@C_5fqAFDoONlTQQYp#Gy{!d;vR9t zX76ypcvyD)cvw)NLBt51!9}5x zbieDNS%V0q;Q=Q=X?Qb|HaLpWj#FuUR|loEJdctYT7T)ZIDv0t`ESNA&6HfjHG+;H z(d9&lC5MzE;b8 zp**CQCBX$_OVpBOHkt#iv8XwPF3sSgUh>C2uFluj-`0*uz+5qiOQdujhayu#di_Bs(P;Ps zIYUi9yFY_^M1uLj(Nwm#IEj$cTuA#-V~E+nYGxb|%icv_D6#eGDrjOK#2V1`;ISTQjS)gJ308yNC{$=a$=cR6$< z*9V$Q^?d@{52#ocp<^x&%a`VeMIS5@4(b@x)7sJr%-BEe#IZ>CWGto=w4_$?TYmEg zO*y)$EkH~KM8n9&QgdJ-U?JYvZ7|<0z^l;bh@#0`=qp$$dI&a9vV(CVNYgvslJ+#0 zyyV-4!;tyvb&XPDGwOF`@($969j_OmOdF?s?mU_6-=Q8*tr;)evb&Ctk1k2zuZ&9q z2i>*XW2&y(P(bU0s9nbZ=sDRcA;pKWkoD4_a}$g`q;d4&Mgn;hNPae8|3`M2w=IR8 z3-&SyptRi}0xK`J2;cD*oWt;!%5A}WUQa4T8DaIj^xq&}2RJ&Hy3GNEKxu5BsN1%_ zIA3zv8%jUJ0bsA_Bz?Bn`e4k&hHWJ&BVSB!UR*>r!15IoEm3Ae^Qy}}OHeX3t<6v( z>=PZ^xO4~oi9BN=emF}nCox;2>fR^gO|^L%$@OJ~rh{LRCoMEzBpO?ch?^XA%D|*I z@76RGZkZm`9Su%JXT1;cDyxzaKqbeggVPdwNZ0wFs1Wx)9vh-C>Q{-Q25)pB_c&+B zW2-giXOx?617(=kIrp%2E!t6D@mly<3XDJbuL0$aP!u&MDnjt-HS`1qgBY}JsW}V;6=?YYLC3D?ltaN zBH2x9&1yQlg%KyspQ(1O1_|6n2BNV++1Zm?#q06q` zg>YOw{g}~Y!w{REqPrlt56M-J#4G#;4WyYCKW{x``GKZVk7WyvcYwjf*@xb4Kyn!4&5c~O!xHE;=PL1P+eEG;R+O1ee33zI3A$)a8*F)Rk7n$75DjI{(w5E%+-2wR` zge4}|;hfG-wnoXkMYS+V>jvJ!bB7>baykCq$2#kS#agl!s?(!I04i^Qw&c;2uc->Z zLIYQ0lACbGoU(C9`)@NPV2x;^C?EC~>pHNA~qcuL|k`*L;Y_jkjCJugx zQ;s7%uo1;x@?)&$;&rGDp~go)IHU9}e-{)Y_W+l~YQmAfCMoF?&AhcVVv%)6KDf$4&C87a+EK3TW^WD>Rkj zLvq51V3dG>&&Uedtlz-d2yQ8WP8>Jz(;p`rFJeLBf{JBJ!lF}sZg!*+N((4#ZHFs| zuP&|L_o;u)*He&`2&n(;ney=P7g8CX@Mj3)>vvi@M8bn%pOh*s&6I{2Z5kgzm-2I) zJ0q?1%$Exeyj>?x-T8(>e9_9SbD*!LKhack6{gQip54sBuYOdJQ`dQqksZ{fiTk})j6?X{twvg`k&?p>#u;8^p3wd#jcb-a>OUL z<~ijRc?DDX;D*T8uqe>8$||a_m%(Zc?^4?ViNu`75>0WnKpgXmBRS~``GTlCKe@P} z91b1Yr3*R|csM5enZ>37_qi#2I)#8dY%%?df=h7Sl$IMHoNugWo7G*BG5{ox8LmEO zia$lCxV8bE*SAa8ajr_P6xiv~B=k;mfwk$|Vu{vN0mczklYE0@Y%e{FXaBTM16t+J z9=z{gsJk!T9}VZL+Te|3dI(9Wh7qTFS-!;!1Iez!Vp)?a1Z@0}T0!hkwWLb&3fvtF z#JPiJhyCX$aqJmA_u)eiWY*=`DpDcGWM>BPRHOuK?q!PrF>NevfEJbpx~SXhLyg%Z zCXjoYCS+KNh37@ebX2M<_(AWMw6(D1Rlxog%UP4kn^YMgUdWg6|MA<_9m~k^+^0>J zhG44UXv_Zt^rN6RpU^(q6kZ*qeq*6Lg2mE$HYLf#$AKYedr%gv;mEv&QJMb6QdRB40$^4A*Szj1sChWV#TCd|#mJu?~}y&w@KI zuRXCggdzyep~xwUEhT>i4hA&rF||R~-885s;PvKQ_OZ|a*P{n!urq(0hunM4v58|7 zRU2ZNG+x8|p{A5x!dG40dQ8-(<9zhZ2O@nBoOd63i@5sjqVu)wiVk-}Ur+Myq3v{4 zzn^*P$jZ*`sCx}fR_1&DEWLR65x;~jQohCBt?N=2W5FmfOE}gkz}RV`&B$>9N(zV= zNhI5l@!!W{r9%N zJ=l&FBP)1tD-twQ+YoVY;{8G@dAtL{zj>?IF;^z|+Edl)SEAa;NS_`*S2Rn7IDEcj z(;auaD3$l4f$JT&>?-SkTw+Vr^~yCV)%06}gC>?xi5OaCj!dORxS^~Yx;)oB*`Zte z_1(^Vra3FLJL8OlTc?DP1I@ZyC3U#v>tb&Tj@~ZYS7^`_q>Qw}^-<;#EwBydQaW?f zZAgFNH;Ao|Q`pHL;~3cO2~o}%jW~rfaN~9kX=4o7*5WIqd#sqbLUx{xin`}1Ro0u& ztxUt`Pdt8(rb4=MY9q!{=6m;8M#oWpF$z-_u5h~Bv2%pWvc8-lTE0qYFB*@7KqT_a zvUUIBuqP!VRdzJdtU2E3cfG;LMF0KmSi$xWwC8Tzik7Grr3K#yh*uUk;}24u0*i~A z8&n#%oA$~5(1$TR1bLM+;WA5ZspI(;DBS8gHFco{DML`aj;_g=SsE&JB9T=ocH6Zt z_`_vdr(seUn?H%N19yil+?z(Pt0bu8iycAsy>^ps*YbQ8V(y(O<2*yHbcm~>;X9m| z-hnf&Fe?euGo94~C)}JipEJxA_ECqKn=&I;fXJKj>bVVveR7_R(WNw_kB#Ul&dWUd z9hwA#jFe7(@fLN(YR1Ecrgk%P$&C8n33Gu0$>FqXKH88!CbF<8wd(G6@2Tb9`o`#g zdz_oN!I&oL8aRDErO^KQVKw${`9EBH?CPQk$45g9jhrna5oh!=`uGIAk{MWcTjQ)!Q9+dn+@=7f+*(^$ zaUuW8!B_Mp<`XN z^086bj2!&i-I7~NrrhT|bjg)BObqH13%*)%<+BRZW|UfqRgITj*;CJwr6_~gu$X=k zjOx*sr6v(;iDj-!er+XdK`)u!SeS$dw`dMx*zfxR@!S(43^|G0lkM zWu`1w59|hus;kA^{I((9BH0Rd6-;ot4Ym#a@p>{xml_HByu7?BBhPAxp;df#L?|2M z7hu~JxwPVCDs}pGvq|B`bp^%gCj@suFtx1n=T#S$=U}4B%OSc^2>mU*E5c`?Sit*$ z8dqcgTukAASPr>waX$I8v*p9Y4@HQcqo(AFM?F$dr9`UG*P3qWX_Ha0jXAp^CehG( z!wZ=1rcY-6falGCTBnyEn}@Y{l}1hst~{~wh$~_Rz2|x5J3+}g?c^Og zVG+y?Uk#2WCI(>g(gNh29#B`lTMWEHf-+U|X8^jlIGoW$G)zU+y?x5d(?!snt$rRX zfp*!eY>WHs=#bvhwW^@8ZrP{4^6rAj#%DVpImq10W4y9ZX!t9E)+tICW&?PRI+`)i}ulAV^|xdW;m zUs8+kFDVtJDf{S8Jua8;XS9++_s4r^g|5Dj*@$bc+}$;`DI9- zzTvT1ntSX-WDHzI((Q!x?lZp9!o8|hq0&wm^Cq3PawD<7qh}6J4ZHiW-Nw*Cvu3kp z@tV9O2!U@_c|?AGr~XtTCXjiRzo#r%G&Mh21~*QA{gnCERlrd%#|L$M?s)f9y%Zra zJm{oT^4roK_XI_)t8S^eA1%d`U^RmJw&DpOaAZ1>8FUH7n2N*>Fv#I?pnciw=FhjX zb)jA!dJ^rKoYactm3$-#O>HHB{{%5AZ7%4E*T_tgpQN|eCSQPkrP->NgZ9)*)yXEj zWO1_JU36h$A+$W%pmK1$e>vzxl@~$Ls8h*tL&ARnH;}PR9Dl*@m~l-qy`w zbh@qF7KQiwbq*gf92N}i9s)acLw%(SWKLuxCMqV;yy46%eS=!+aS>T#IA-2}HQd%v z&bTsr%|oeK%|(g5q9h~o7_go$upU3Ko}Cnjk5>QVym<}l)gjlJxKfR3y)BP8$TKQ0 zaSPKO^tSN%W8tqgsO6PnGSw!DJnMGqW=E&q@gRs$^G4%W*+}V28;8<^=}uI5t72~e zMsDN+#(M`rs+Jb!I>P>h&ztT6g4vJPy_r0Z$id82ck8H6rWJu1`))&d&=_0$$ExbdxREdEU)yw^O z3lJt#R*z{$N6W&7jI$HXuIkT}x?7eeDRRY=Z(wLa?qiy|{kr*=hq>kW!s%xhSo5c3 zZAkqcmAP?2i&Wt1aUaUG1d(IPh`L~Ln2-C~`s9BLqSLmVbF3s`d;Zhh(JSF?RKEBrG1F!ofkqwu5h zLX|)(xpzT+xzFRkT9Jd-weU2lg)iJ(-s|nj&ybLN+%Ha#uDIgfJp5QM`6{EfFNlii0B`NUSpJWfdw1wQ@k<|)UG2))3lQP|Sb60l8 zq8;a*H|5q8X1!i{dUU$&YKIdBd;mqp`{ffEXDLnzg#&BqNsBmU_yNyTk^l?U6zb)F zd?nx?xyL+SD<$2Xgq~o&au$wY98!Lo8iCSHwmLqSg>Kn&t<$UbQQ-}rIa|3K(wUPC ze7zn&osA!{9*qp6O#dsbz)S>%y7X^{czrt9zC6w0Hnzmc_LU<^i?44FxVx1+t0;?C z9d{K4w|d>4?IU(PEuhK~*e-r^X{zKrw9v)|w%e+3Ju~0VtK_hafRTd1tA(k2jdOP| z)&^_MtV9xyeR^80x6r&e5Z8t1nYH~m^j7(fUWZI2Qu6?@C*RU2MC0b$Gp}Z*P*9g8 zD+^Yrxwl<6?DnJ?t46~4jA4@odOb97=GvU7$nCi-`*7*eRLu~sn13Qx_Sc|L>c*x$ z&`4H`{T4qA0AjVw7p?qHC->$0!jIAQxNYO^t2uR6K*HW!eE^BXc@w=BeY)3)CRQ zw%oD00|R|_qFcBGv-2dP2iBz4;v{1Z*@@5e!SSP-8||o;QNNO~+S2E~H^UH$9!9>S zy$e0?*sKDH*mH;cZw6=?5S)uIN8A;Hy1so}yxY~HfLxW=+kctp5;RbzgOp`vD~2Gl zjd%LzmC#p9HJz0RrK1;vWgS%#oNq9wF&7j|qLNWOmO@`yCur-#%^~*#Fs;4%X)Ve; z0NecUm!N)r_OpocjDl%()Vys{unsCwc0*ubc0szF~Za%_4iQAzMIkwS+knG8E0^9KjS@ybBa#m@&!TPh^*qzeqC|HOvEKtonG zo6n+CRt!I`Nkg!Y;jqkf94XuSlN`s9tUzugMB>e2h5QkLRvEk^ISv|{-SpN18 zY)})f_%FJ2r3_=K1DKyTgDKwPbF=h?PxPgmVYTj1NByh1qY_&6D;NCxFT<>G8G}7$ z)g!hImtpA8{Pon-dzzEJ`rgegx2NLt^Q0Y7A$c8%r$76N!xs&fdJ!f5tLS32gkCbt zRa#Q!4k-PT&iqOCK}#1@;GY3+vFta?(zZh3M>5>7VU+%Nni4DzrHeRcam4&aJz{N> z2Le&En2g5IqLgm1W(So@VNLShC*@wZ??S6Qub}#~ z5e-{3JnFYEpnlU^O7JAN338X9WO#p1Xhk$mu3$J%(has&V=tap=7@5x)(Oa^tp`V3 z5QH(hbQkjP9i8+`VacI2E$vJu+rsYC%rV*vRkEM++l%U`$@4xQ`DKN>Euh^e0(zhK zOt|~hOQMQ+EK|NQuU5UD+e(HvEB~V8&-)lDia zTboLfbKeH(zYMbMI1WpZ^5?4jNL;km@59%ywPx*r2<;${vA&Zq)L(NN0BeUc^-pBS%m|0qQ*PlFjElRql z*HbtFm-s}lJV|t|wxN39fa^vKCR|wj1lSNo=E-v#4q{B2TKTcj>oeIHo_Chb2Zh%< z`HX$PS&6zP$&jm^h-{*T(O7p*cJii`C7gCr9o%si&C2@l=3&YL^D2EnZH3t?Q;Vb} z0{XmGp{2~WmoczcBqw`4UR|2$dZ<+}bRCN`ivmFsdjkU>Y5=jtV1k{fVR8T8rOpVe z2u={%?F;Nps*RNI9)>D?p}Tiv4Hsd-q-Imhu_-hc#_y5=6RloWDEuQv>@=hixiz*am(Ge)K` zV?m)2zZhr2e^;`$!L~!0L8F<;I4E4lAj77B>FQsXMQNeCdO*oF zERgOwnmB$2WS(~?2^{$QRQLQb@Og;$dDO*A%n5_o&T9phTfjAm{*^=@X>*P98W|X2 zVe~K+YlBx0V5og85G0+(-aM=jqMXW`q9~0RX0LlFd4UYXu5--9=NCxBLt`nVe(lcz z1tQ@nwiqlm7LupoXc6y7Oi28YC?m>-dcj3?9aV}xxw>iQnC2?E+HkYlX$MWZo{)KJ3W7+X;fAK~O%rXac=kidmsFRcbze>b*c*{MeTz?|OX2ul1-`o36YF z6#qa=Ww0r3BA7DAH%7Z-3~c5$Y05#~niQhi7eb(SV`*Hu$Yrf^;`5vs1BO7^Tk@Je?Yh!75FDghgi`E4rA`3 zmC7)+>dcimXmwp-Wk!VwGbrkCVkHQRgyi|+#z9~)IxpWWnb5Z&q;L!8#~fgPmTXDN zTys**Ib29NArS(RIp?6p;fqYG7G1n>sb(NVftrLP>U|H0_7AAjHxxvb-v#BYEeq~D zwK-PSUtNci;)P7`rMKB}m#9%r%^XtEu1D#Q*8rqXDhN7t%;RJMI3z7_7w9$m@oH%L z*4I5*P<_tNt_>Hj(4PHyJm>+nQz@)&ZKA+?MK7w-7Gf6EF9Oxd6T^N}mkDy6T4%i? zfL#wNV0)nbxNUZx>8!8a_uW8Lr_2<5_NnyS`{O;pE=Susj(g~QC`Xa5X7`$5Ma?-y z6kf_Qh0+v((hLNWjX_!rt^}^772odf(m5`rR19S1dFtbPnujmu2w!mCVL9$0tYrbT z8r4X#H51-}wNeU&@wse3woJ_aOtGx8ji*rv%mAkyY82asFt++Qjvlmeg5CVE7@LrS za}qAUiFBT>*yoyU`H7ch{bjfiHWUSxqnI5`{NHsHANu(nWFm?CJas?tp-B4TxIVS5 zc;X57s@D9Li^y&I#l672reeg-aJq_0-=}z9OR04|6@`{$H|2XS}hPd-I zBLNz$OqL|%c$2Q_fPIgj0M07OfwSrltB=y6S4Q-R9dAY2u_wuU%jus4TzOLqw5{&0 z<)yLHV^|F1o49y$?dD2r@JPNyQvvifIaR~c)!(W&Qx%!zx^xBkRj^D^>4XbXErj*D zU!qakZMo9_nqnt1)4~$lN_3Pp2=VKC7_gR6806&#wCLTrv4&O!s_*AElr@gi|J2vv!mAx2&ZNLKG#{ja+liM0X34}6_fd2{1Xx#P>id3k z-?7N+{hBpdURy5bngrmB_>OYqpu)Q#XXcW4=;D#qp-#ZNbFGSwBejh#8u;jQ9vfjybo%%L@x9^FMEv=6h_l%tC0&h zI1W{9EsGoQvDHad5jINsBu7&@>VVC0H>xIwA(zL7+I$_K$G90~EnG+_D$Dcl4RZ38 z(%XJGt+6pt&)aL}G^_gB=2`$)a<~|=!jR&Gv>#Dt>I_{2<&XZ~73w{He0;EpxS5A; z=z*J`|57B*sqqtzn*N&#eI8jMj#!%G*vVZKJGnb$Qz;N)%6Qhats5r%5<(6eZd!bctB);40Fi3%C#)!Mz78A zfmzznKgnYZNVvK>JP5oV>m|vD+aJHkE>r5utw=#66)woZweSZni-a$n0IDg%-MH;h z4L^@qz)0u&>RHzz<<7c&l&z2Pdh6!CpC1|`_@Vro=W*f(yIRKYYjffR}88P(hb1z$LfJC zy5MdiMbsbU;Le>7gFaa9TcqeQQel_-oUPbm+`obsncCmXu29}?uW|g4r4~OrViUf9 zD|0!z-%;?)n5$+C4>VsvMY6c8-^Qk_R5A5~qi<1>TlJe3jXmjP^;t~1qj+U1o#4KI zWHm&Z>4?frv@qTGcaiy_ay#D{k%Qvr0w?E0ML&EhldRSB{2Y#8KRJOav{viD%@kT4 zp0i1--6wuRVH;%b)nhsLpKaCfi?`&lg}+Cxp<;V5TU4jnWoabfKP4fxUbp(_{`wMe zHfb2hR0@Fz_BKw88Ah=MBjmCb+pT73>Qy!Dn4%l19Mb&;9EcR$R64U$^XJ=rv3jn{ z&hbnaREW+25dZsNRswn2=X@v;oga^nb#Ux%fHi+M1 zU~x6UMe@!-(BOG3$+(HZ%kb0?G(EkgB8g*Ui#RIuc>a3N6yCKg^$du3C@%k-qlMU*e8^< zT00=J{n6KP_2L)WQ3=R%Q_A(9bYwXwz+&{f-&I#408WBXd0jX>Xv z$woomQ6R|!xs4{)5ajE%`dviwRio8B|5*L5OA(dUbfVKic?7p`X&)%5fvvlP3~fr1 zpxN}FZwr}fQy*nTulUSoD8SlEi#k+6q)Gocf`wve=F6g{0t)XmKNl@$G$EFhQ6I91 zeC-ZrgjG*v-@gs2-s|e!WtDdq#C))Ibw};6tA4~4CB?qJ0D~?J%-#7n*lFhU!vO~4 zdX{3ll~ux^aY=jXJp)BoUv${W3mw$}oOvR``Tz)(*E)FVR5-Hvj&E7u$TCpaLAuXI z2e&5(D12E z^C5N>NM>_3asJ#}t`~^|8`f4E#psqfuX+|Wdy0{ejYn#_USItlcknT*9`p<#Q9^JB z+cmS-IN7XOeY7Zgg^|Z{A|^VHs*a!eF7;XFstkOuMA9;vq(S>YD<7qKw9#I}$tYo* zEy0x(piG-#r;~8d)u5}o)7fRJ(Bi9ue$$tcM-OT5>AMmDCD|cp748YyGpV=Nea7O8 ze6oFS?=&eQ{ax;Z+pCyVQmJ@cy&S3Oxt6Ok!ANLLYq?FrrA}4x?<>w= zT?qZl>Q_jEf&v$ZXIGmtxfGgGHRB$>sBaZz1q-eUC>l^j_kU$SIBL1Ukk%M3prDq~ z)VdieO`qawHGrJWeHs0pY}y8(tqEiMfRV7=kqFT3c}Ea{Ha%x?MIur9y#NF<_LaM}SDrCa|u>jEf!bQ5sJ|HWw3S*M)`E z1d$E}sZyS*+>z4^OY`f+GybQrS7t_#Q|A@ zK#0q7`t5yIi4H~!ZHkJ*7PUjU&86A?t1TE-?fH#&SDDVuyYchOT2H^DGm!Lw)@D(M ztPP+u4N16d5Er}2uAhC(mN66;sC=vrS+}T(eB(S;sxiui1_hWXP(O7LW~jW=yoH#z ziBHL42Ep2%V&y+%BKcxSw*J8Fm->J2!P26?Nb*U+G zp?6>?kNkh_eP>it`4(>+3o3}+ptP}K!GNd~fuJBVCOcWnz2|~w(FQ4*~ZMa#n9EM8iXs-O11p-Y@qpH`yGphFTFKRF{s>Z#<;P=av}d1 z%xt=oV}7*_s3lAatFhGks_;>9K;n>9$EKy05=X|o4)g zoxz~AaLtxSb9q}Cb@3B)gu@Lb1z524H&u{*tH?CzO`GjY@da4%x55oL##bWgfmxMfLuUhdxrbTsCgM#V{F^ zz8MPK&1Oe&a|sfn9xrgnMSxE#u%tYYKTyS+~C)SIV%X5v1vLwGMWsq15A92o?I zkhZHF$;#Lg#;n%|GnOM+yVI4kbE;iWwX1?zoUVH7?vn0!$JSBE5;X5Bi4)$OPIC13 z#w~nnp;gRRa>M!>-2ojG*`c&Q_7V5n9DDUD)2-)G#m60sd_Dv4(=~gNP6+;Q%Yfz&d7u$MFw=$O)K@Kj= z2?2ca?L5tEYrcLox_JzDsuK2%T8V|R#odZL*3eS$?mtL1lpQMYF(==oCtTvm@a=e$ zLWh(?L&N>T%%_^x7NdUxN?q&&nLCFF&{w+QKHA3C*J2Op&j$)xHj~^0v=j}0!^C(& zMc^Nw(yMeIs7-Fxi2QiX8>devlyv2B~|0*qM>D!{borcXfbTn zI>mJY5+(RDj2HfP7UAli5J))G-lyaL(EY7V7kXRXX>qxYUHrl@tY$O`#~&qM^Jdeh??p_ z7;5T$laQVnU%u)0yN(uH-zdMx$7!1pTvkq?9k%TXG3p| z{y`{AsjNtVgXF$q@|o(E|;B_KPX0YD@vTTy0SI>jXHfeoA|Lt zr9C

n*3nObE}nxgNX*BSq5bgatRDP&x;#kaqqQRk){*DcTJ=j@$sGq%Zrr%eZyK0pJbF3*##nBZy<$7I zF}^BT>=^!!isdq@j(|VjzW>!Z*85V<>XO1sKYIZ(EzP1&OIEysRe9hwrcq8ncT~yz zOhZFj#f{2D7)qprHdiR!kZ0od`GuH)pUytln=f`ytx) z3^xn|SGTUGSYGzVNf7CW#}=#k-nv}dswQ?S_Fc@q_-HBZkmp-!h3$`~HqYpdgt?}g zWh|%0pGl7;GydZCS~Ha$-@rUyac+y5*Y6S~9h1~Ojix7by4N~auvkiz1Zs#pjAb>j zge@FABEZBYgo(!zv;zVHA?J7N6Ixq%O#OEcHevg>U`Vlv${Zf<1zFVgi&k>C5#U*v zdN&6)V^VCBCWrT3)@fgR7uYTlUOus4^@W|uIhr<2|5)oe`f+q}%OhRpgdfmbyb^Af zg-UN_W1fkNE@y1IohVns&Sq-MV7FDV5e6gfSmyXRyVK<*mii{<$`z{_NnV0ek{)}v z$#BeZJW}Rtu-GEg+FVRdAYZo4kiNQU?s|@yWy`D6h9mB|oVys)i$Qa4dvr>r4HOE_ zu_|$On%6RJ30o+xqKF&^HzR=I+P)48FNy zDzNEWLHSODgHWP#NM(nb$}}N!6mc7DPp;3HHLQRvyHv!7{^hZYJLa*khVbdWhH~?k z{n4F1_mkuzi$iWm-N~6KL==Eh?GK*eG}R0-J@w0YH;%2jfpr*+jWU0OULnde5Kad; z@aJ(T?xK<@RkMQM}!D)$Rg1FzK^{*>WPOeL?GI^hwk;!+XICc`fIeE6(qs+XyDi}B34s#WU< zO<%R{C}-uaVy)Ulwi08eaeb_#2vCOktgn|x%)^j3+WT71;B>mAO?Od4ryn^;1?Eh? z`?43sf7qRi*zsblRNvw(crv5UKzm(rfGp?%gn>bwwui^?CwPVlo zW;dk@jF21q_!&k&q$sOHH7E}secH7mxcu?BTcG*&g8d*zVgW8oX^~4~4NQFuCI=md zo;rT;^MT%#RHmKPb}&m0y+$(FIbR?YY-w`n8C$j#;pudon)F_W%kn*T>2_C{D4XVB z+VubcX7#NsWdGi-Z*>QX8|+u!5g^LV5{`M-22hVPlJ=2&|!r%RX zk;>gajld=~YXp&`h`D%&?vr|KI)7;25e(LOvWiuad~FRwOtbq1+wDOpkQ$^aVCRZ& z+kOfk?QXfbUV3plY!&Onl%i9&V!OYYxg@Ao|HYAEcoZPA&LrwSj0lWes%fy-gK=wu z)`S1eDh%fARS+CM5FE+8;_&obQz31lX;;|&3TQW-lX!G|B>^9HtTtl+I?`2_8yoW` z(^Bz^C(mj#(s(}hySur%HcKcA~7RGij>bFwr`WIiiv`6~ng??I( zDLwnh!09|nBv4v45Y4VNb33gf(Cq1ttm8wf+2el|;oCo_$$VF@fU)u()3=VUD!qd* zaKG2t5QXifbFSJ2MVOJZ-dxFjty07K`}CdP=Qk(5x13t!-o0t*F4;4Cj#-kN-|;&$ z^Bk*ObV&qj)Tfhgrs;-*MSkNFW7Fyl_HC&Va*NIt#QWT3CERDzY@Rw-b(d9%<@gtEjx39sC_)f7 zQLrBWr~5$|$C*6fRl;&7YUwg0$$x`^s%YUDCi2UEtpFd|CaXsvl{d(noqfXY4-6|? z*UKEn!KlwqY+5s4;#Xlz$dAHCT))14WFq=ThjaDrIgQqQhl*=OIbqbj>a9D>nqDm{ z3jfhjq2u|v*=-%ai=kPqv@aLz*6U#-aAXf0mccglc8D*ICeTV@ry0_T@sCeTrsD@l zoMfK6Tn}#_nLPWjo0z^Wr{6h^yHKY~I`=eTcse|0QHxFUj}L_8yR4in$4`Aa`3E>D zMdirS78KyM+*f#v>-JPaKUaB_MceZmIFJo4adujgsSI!v!zZ| z)xEy(XTx2#l-s8SPF$=x!tuhj|HT#PRHgPPe%Z=xJKRfu@vGHxULSMS@LMFM#k6lvc}m;Y_m!f}WQz%C^me z?VF(leAWXD5O7P5xC&-Pe;sZ|=00|Fu8McraUV@MD|Qo=c}2?bYy`Cpt>)EIl8Y%0 z$3nqLJ1&SOQ-jqKJ&isy?{xTX50)J;xeVKU)!Wz+?5XVXY~YRl80YRZGkIn;fD-R9 z$_@~-xl+%Y?hKnx()}@>hi1cpAIeZ|D;qqWYs1rt+-*M+eo4&goZS zXk^|`G;Zwla28)wV)k@P;UD+EFtlv6@W>|lhK(G*omH8glhfUU_u8xZ_3lR3+pWVH zjTkR4-<-)i)}fE9$|ZJZSuB)Soe=M!8AFre_uK*Enkn{5fX|T@y>uPAG2rdDXXpes z=b5lOzfh^eS8&WP8usD|m_KlR47Tp!{IZ1<&jPF`;o<+>yGirbl}v9gY~)?mqOWb@ z9RYEC_jfUjMnVJz$Dgb$kTV=fI+0(z*+5`GoY5*>v(6BZ8w*DA7XQ!xHrrgJ*?X_|lx6vZSx zV&BIPKNFUh9M|#0?#$fBNagx4fyGgtX_Zp`5H{Z?bC`|rT)%o14BPFU%I%5NhcZ|W zs#@u6q5D9vf9|{{FZBVupRQjmA6>z|nc#5K(tRs)nU?7=6R=q?|L_JOi`dS&)=y+C z~|nlKV;XgPEXYzo9DGJHQk_A6_=6 zvH~HSy_`ntWnJ55%@^8Qmw4d~j0jhUJ-(T;uBq2$wjSMOz`}lNw?eJ0&pF=vyQ3(> z0*x=(>WZyC-QB3zD?DI<&HvTz4xD?`U!VmL>j3@KHY0AEBD5dg1hYYbcH`%qfvx zKO_jhfb^*T<0JUm@k6!G45KSS;;vx{;L$U{ipH?eJkYX;rI}Ma%OP@aHLvjtTEw19 zUHVh;5iq_H$8KopFnX9hl{dTQ4V{kz0->nQ z@enmn(KUdSwxij!fLxW0E3EG+=|$=bM$2Sl=phW(6W=5=DC!ei6^8fTJ02$$>(@dtf!trmXQYCwHeJy*>n)f56KUDAN~?E%283s%@_guC5H)l@D6{L^ zz@6Pj-xHQMQXFf%a0`O_w4@gOW)36J`w$iAn~9Depi9ra^&&wA>*ZVELpf3Jn4q!x z@{GL;qg!2KZctaEn3?D1cbApY>c3g@FvIAreIb@b#Q!F(-i@wNAoSI6MZKUK#axq4 zpMhJRhE}~U7a=se!ci{KGwL%Fl=8JB_#?>+H-!b8R5M@eN&5c2)v|YH+qfq-d$(Gx z;bEEk=_!;mN?x~&LO-i-{mLxy!%A>xSQtpLQ!0>jQ4OSo>ChxMwh~{Z$zU@q8+eEo zd@F}`kW%M{L!;Uoj%tZ0;oQZ^>%*Ksy<9?i=R{C9>t=H)p9&E4{uhTpRVh_#dGnOH zzT8~y69iLQETO+Qh@>1Y-xTp-%SIUGtVZW#x=D7(Ux!xFd#K5d3oEI2+8!co;EkSj zs$O~GM=Mr)*}bNxPA=f)gw9j`nR{C6gtGo1CavB%cWs^--@C;V-?U5i3%ik}sFeR= z(0xNONDc6TPN$3ks3jCT(#XA|`lsR5)X!+%kSuW0J7VvS>6NJI zLi6@TXWQlFBHqo*L%RH9c>n%=Z%a!(=_W5Ac6hH&C439GKjN*l+-kfT*t1;()Y`N- zmYH)5A@6(gLQRo&KzJpHv%+&!EE|m4M3{MZoq6K#2&xy!>{;5!vp`{)7?0+WShOCw zFi-H_Z>rhZ(C7Jv-C{6X(m*leF3XW?M+{}DgpPnk6Ysa~qcQ5mIqnn^h=*yLn6n*% zNPw%7cW_PfmG-nnr^2V2YZsQO?Iw1b%klgzvL>@a^@P5Z4;V zsO+q7ICmrWc^8%DVeR>~9-q<17hw|96&OJaspO*dgx9GFwVo#pP8Mxh>~9E}U07Z+ z(Q=!cv|7dX8&+84U8!fUhi7C-USQHPBeIZA*6wtx-Xo38X@=>9_vAcrQ{Sv(9Ni=I zY31&upfYIOe2qGBCuUDo-{rv0DPr_R90#6RrzwryGn~jC%i%mIZA>tbT;5SSKHQR2 z2wQTJwQ_AjZiaWWWUo7tmEvo{-#T|DZA_nHBA!1NqPZbrWm|Ik!_?F~iA}1_vva{g9-e8(OO_bR`1s7MK*4*7GG^-r z#pY@~pD|C=)q2u4LJ8#gAvB3TYx}G+`v5bjZP50PG&Yf{E;}fF6-FMs8)>TUP1)il zRa`UNKQbz_Y7NdMdsk|nrluIXYI9{zWTfWoK%>iOT8Y;9*Y%|Ojf}lEv0W!10%1_c zB|F_G=v=!}*)gS`(1s*n5)atKE=NU@6)kyIR~HN(eHW@3QC#_|D|#`Flri@{sc^1$ zq|j|*xX=AYk)4!YwEz8`mzVO1K}qh@P)!d%mOts2R4x8|SY4wMpSV6d^b&{&Jhbr0 z19+=J0bRT_s`>_u2g}UUoFl5rNwC>FiBkuL1{Yteuh)o%*VhY|$YjUaWxSGB%H&)o zxeS&talL+0zE51cv$BS4mqEv>T1^Xdip`SlyqTsRhN&a9cL)`dD{?}8xaYnn?xlZKuqR-^ zA>>h|u^WevLN{^1fR){;uPUz3{3UH-v&{8NN)lxb54aRZrESf@U<75*=J0r2Q9r~Y zzf|$N^Dd$?K`EBi=<@?yAwf94vux#w9^lxDH^;KB4cJH+%%+49<>bwaXRt^`${Ka- z6Gxyky49sD=>16&qjBK__jK(sn)Z8 zTKL8#=%X+Ff{ObWk^na9&tMaBud9}q53OKAwL}DWdm|`o@Rx#Nd7&Kfd&D%f#*<{3N;Cx`^t^-K>JvpOor6-7)S@&Gm6An8lfX^Tqkg*NOel|l7 zrR-JuiTl8;!xL4tEVbNn4Zi@pHtSwuIfgzMYjmX@L)YRjo=G4@HGV00qyM_og*FQbG=uN#E& zpY^!~a^5#hpVG(`9@%qy5AR5x5yke#RGR~jYas1FmCndy9MPiT=)ZOU_49lKLJG4Y{~3mrGI7Eg;2n2whM&z_><-FXcl;4F1&Z zM8R96bFj2v7=-k%Cb3IovY2)fK=S%>327|y;N!bcX|2DWkcVJzN(y;c11_j7Qto(7 z=nf*18whI4u&`6hc~_$XpUpYoJBES^$%kYI%hm?uix!ci%57Iu;~IU_J#ks8s_*a- z-2b{vRhq~VI&*!)cB7L$BTjx5o}*qV_%lf|9XNN z{ReY55I70}Cf~)K+|b3*jtD>E{s8nn1ml3g$)bWYCm^}RnaQdNKCyti0|XnDZUx-s zXvl5s`bk`0DIgtzR8Mr0SrI@BW7JcrhiZO56}c&2bWs7gEpia9Ej2*BWma^Z4BP)^ zK`(0Hani>wQIe2H5=LDX@|+tXvbCjCnxrp`1Z4YW{iN12{)|z@IIv$hF=@_)JH}`y zxcd)q>%phd(G$Ob(rxgiy0=e0u;>7Do%3`##&*+bzkuxg+>0HVS?0Zt{7%m+06o4g za5D>Yd)2R<0J67NwVZfyGJY7GCum(MHg5)`;c<$ZfBlR}wda*vpCk<4c6K~HYCU>_UZ*w&3vLFNqXVg>zd^z8a?;V`RBel7AD6_Q~$0|)icyv zwimW95>&(k#yS^8O?7Fr?p5#0c49CwPthDi9R^I(_VH~np$_#-oiu=@7dQ~X2{~&q zad4CImnwLO${HdWo!X6iceGPw5JgWxwGzMEboW#|0IxhV4^bn@q)_nFtH>ZgF5nJr z-xA2}oprm`0d`W+VT@)xhd>a+I@?@|O{&ZKAK8ZvcxT$%h@CLWFg zw;h=monW$#A~{jN!_P>r+MUMDNS@MERbas%Yl5k|%kd{r#D z_WkpIrBlaC)@#kQ#|UUxDQXU>SltMEcI5ugUVyKs@fwvKb7T1v{NGYd5_jwHmaFde z9~AE}Ou0^ZTdfgHec$qSAZ~9*=9|<&M|-#8CLvl`SR&MQg zJg1^kH&FYK*dEhUzPmTYdif9`J8^hJyK_{AhjqbgV#;Q0hx_ z-|RiSqlo3Y8c}hUjw62iVYJ8+V6=j%dc7sV$DQo7L>fWnT_fgi9Wtu;-CgRHZFuwv zUi`8#gVi1+h!a(UEbdl%;{F0ncQpebBmD*Q8L#dGUqi3Pzp2T@_INC7NZLpq#pgR@ z)Uu+17siA?$Rr__Rb*Xwux~>W^@vUPci70*+(M&rAP9fKRwX)3lF6kzST;{`4|`u$ z0~4@zqF!w616;BrI20x$*~DjvH2?5bF7>iN7?c_34IYOY{YqpkYuPSn1`9@0Fpo=W z1AW`Nnd`z^{_d+@acM+QG40TU7x!S>)kdD}FvIr>98o)MUMD2(fHORrwqEYrEnm11I4x zakQv%lTCs&+2b@Vc@i`T4QYVqI6-|qODlRGr4s!rm>L&C&rZp98qA-N_~uG-UI77E z7^Y%bxc9&B2LCoX9uzJ=#@E7aDteIoIao_FSC-Hl7fel|MRAf|j1uF+kdsZXoUG|K zycLtIQVD*G34TwHWccvWP(>Q(R;=ib>Y zf~q{JhB6U9aJW*y6L_y21iY_Dc?r$~;`sIhC3{SjU#Wfx{%ZF2dT$&zlUiv0h|Y1V zLsoUKKUKUVD|JTWQ)*{spsVRZZiXzWW+dL}+4YP7Yu@TUDn}O$(j=`U_dpP5=)M;~ zb*QpTL#ceT?K;-BmQKNvga|jp2@2m9%R0hqZI_j!m1MGkkmmw%vG`mO5~s~7L7a9F zbPja}um?N;560>jgN|jau`1=hyP_{(s&I)2enTH;C&{ z3%CB0gJe>$)|FgcLa!c3kV^`f37C=Bv*mr^W<(l@sYDXBSo%KDFhg_D1>jruIv+fYH9!IU#J4eFkWgsLxyDf0}pN!VTM~B1H3Z7YG>=d(qh$ z8i2o?v0}JS+(>?;w-Mz%gIldaEtf9i&UB2r=Di}<{Y!P>R^CyR?*NAQkiicjlod%y zGUU;d62CZdfia&1{*(@HcZm9i6JaIY@!|b=dd3 z7+;Av5U=01=bv7G7!|!lV|h!1DhJ1qBe~f9}ZS?bq#w z?o8z(Zfz9Pb(WilZ(hDbDt}A9l5d%oS<{O0g6SH`K}^J)18EiG?ei}CLSsT5|F@3T z7qK-hb!Ma^HF1HC(et-_9qqNqS|k?vR8}M^xVM@<@yuj$|=i78mck?)3RDgE%( zS76dNN`<87;fN)~iGHxx)L03iX*J8&FOEdK8X1Ai(Z`c}I%&iAjh3H_Bi6q3HLCS^ zU5g|T%mbND?d|{RMFjVp61Xg-eZ30o{0bHz@zI&c%-+M5qj1rAPbEmn45DAOS*S&7 zlUDPnS%{40zIJ6w&(ysY5B}<)^f|)8c~R!m%(#N6SGHH#z+dGw?AUzy{jR7TsnF6J zhbjm$R#kn5f$tB9IJFzE4f%uhdp0Hwi93~vQMI0KBLgna&S)3Bp6_beY@Lt}fblpC z)o0qOc8DApR2AgjIATtSz?+i1h%K5C`17C68WYMT<#rNl-{XasoI?j`i7RpT4O>WK zNzLnytythX)cLc5`>Oiv;OPpAMu|!Y&aq{#oYf9|6?xPQsG!hyp-<_s z8|#^ZT#cnA5kZ!XaOkfsma`B^W;JAHrJAP1C0kM8xVh;kA&2}3^|((p4%r7T#OJmb zthfdbaHkrPz#H)J@gk&zIa_FH5JTQ`eGDt1dk@T$+@64c07VBYROEWxER-J#S$`U1 zau;qRE%m3ZK3;PmLN^cwx>042h#nF;ORuA7Gr4fN`(^N&y`VZ;5RSQE9;$iCN~F@c zsIanGU?tn?-Pv|IZ<_{XFtXx~2d#2rKDBF&kd>SY9 zq2uV#PgA@@yF~N_%^{rl!f|Q>0<7LPImqfbJ!?|2vdcOXS2Zocu1KU)=kssO?0|{p zsGH|K9^N>_QV}A|*D^Y#cq~sDk}B`?kOVGL%BcrQow^}H$+Y32jNDJoSfN1($PFn>ht%)k2l8FC?M-D3Gs|8m*4y&%s6uP8p7yF>3)oK4UL@@{+Eyc2S?hUxrPKu>AlChB zVN;!DS6wD;z+4yNq^@JA_}wMyperSoKjWA?ZTxrvp_%Zd)Lkcz{VHi`pBv8aGn`Vi40NGW9Dw_+1iTN=uTR_YN)b|bM)1owNgpBWF7 zF%QV88!Wfj)2|?A_v~G685B3RtGTzYvKP?S{qp4N##sJ!uT5SXyChc^sZ4@7;UwwR zy_Z<`ocUsamPaY#CcSus__IlnSm`kD{bRMy|m=IK3=8=~5L(a30Y_h!KAOk50RtVB- zO`veH*7k3T*tin`m9d8K{Hurxrtd`+^WE0SD-SU9^kjEb!e_2k-w{9?C9{#BG(lM#( za{|Mko1;-B+r3h7TB#0Kgg!W_0R2k7D|I8AHdr52u~$Z^B&fhM5{U1QYHngqSLxGE zIdr%Ck-6q&yIv&kC^DQ0jN~31>GGzWz((7nLj6fZ2e$Vt z;V$#$7|9SI$E~*+eBGa=oQjX`0!S|1;u$z1Ecd{W>lC6gK=3&Np6`aF4BoNgHkPVhVw6@MJP^) zf!{snKt0Gcy--c5Vm9$gXA|a%Q*|9pU;Ih+a_W(5j&to&Sq&~cs*&;--oYZUo-p_? zr%~!ZoyOK_7n=oIV8XI|Er7EEYQ__jsIsF_knvq~I<(p`Q1uyq^&^*K+IkiF8MP#L4qO^R5mY~yBQlLm3wA^!%$qhi$=-E~KdE2x*h;%mMaPoz z%44JUfM6~pop6W^6#NaFfRzxAN7`e4@ZML-$}VDY<);>?%K|ZRxeBQV#Y7j4n0>D3 zc7Y7i+;!kqw-kWfMTihTpyHB_P|aF_yzj{m6>nweyN=CD?TLzm-T_@+&gCKnn!W9| ztnoJp1-sZ#DX35n@nCU`cv4{jV-aeb${Kvo;sD6@qvTKDK$sanb*p=&*~%jnHHTmN zGIEVT^5rtDd5SAkX_?>tF3E#7B>y<@fX3YBn20iY_@W?jK zaBe;g-Bp)QouI<2VW4pZxD!$+i{D*XN zQtTJH0jfLuS2*=QD&jhfXGv}NO9f&{iH%IFM&h&;oxD&>;Wqh6lu-L_@ zEkOJ+Q~>;O3OcA!d+#ohj+&hm`R z&(5;eVFS>4z(fGK3Uq%(lgoKG&2vkgVORgdYG$Z&KwcN>V;+9!PxM=rN~%HdA~<&) zMdKTw|6u9|9JCtf%^m-;-=_P0&=b#+%0^_CE-G`u| zzZ@^Ta6=3v;d=i3Q0`>Syd=Wy z%^!hquMN2OKeD-{9yqp@U#AW`LRX8+_fl)gly>I>{sr;9U=^UV2xVwK#^d5CFM%(R z+sK0Z&SmUou{iataWd-tSnmOS-GlnT<^N%mm1C{DS&dRRQzi6cR(=Z&YKT>6k&wY& zmfn@|Sx!zG!N7;89etSKdFz=nP$=^S<6J~0kjR5n=M7z?s*ppy5;)Jdm$gz(j_k<~ zd}u)3osGGmKPyBIYQry5u7`~oMngB_f4exJhj|R9Wj~eGO$Q-{!9yLLq5HF4LQN9h zu{tLSEYZfIJ6{H39_)4c-gmK_X}_Fr)?mryE!Feev0Z{XXPxge*0pXGwX(ZEwQh97 z9|v^O6@?!4X31~Yct1H3DG~6O+wqa@?xR!gCFikGkNf4Y=0c`Q5L{!~fD0Ij{IXJh84GM_tAGCz9( zrb5htGCHf@!GHhp5nWxKKpg5}rLTYA>Zjy_tMiN{w@w#DUb4|0Y!j0^{EbLk&FcH9 zOux$?eru$Nic~cU^f$P<@vo>rat*C0XYEmmR6$>Uh0d?~ zT~PkSq|2gT0BeG8lErG>Qk7;)6V_6->FyV+^Sn>XpK@+v=z2P8c2^)Q>spUWD2#aB z0zuW)L07WO0^yf+0tbQPjJ>8au43oMAl}=jEL7pv>}OFa)*Oy6vzP{|74(i6F*_$% zXGw>Mf)-;6FIXFH^S#~HB%)`{_!H()Z z?>_OVHgyeWqLf>sQ{xw8{F@fP zAmeYe_yrk%C&n+x_%}6vLB_vn@&7kuM7Vz|SiJ{M^WYpq$;|(b@|te6Y#wslC;L$o z7RXmt5707+$Tw&GQ8P5iSD&_`re2V*#LCc;fXFw$%l*&jyKg;OIt2NV2iLDdA#{Mx zFHU`@!!PmsNrzuL^>0f20*Zgp;ulc-B*iZ~^^+36jPFlM`~r%fl=$UQ{EHI5fZ``9 u{$GG%|0i=<`2BnN^XIPp|Ln16nTk)@?j4-1^fE!nAuoIRe5$n0z5fFkngNmk literal 0 HcmV?d00001 diff --git a/docs/mdx-components.tsx b/docs/mdx-components.tsx index c6b9d079b..9d30df19d 100644 --- a/docs/mdx-components.tsx +++ b/docs/mdx-components.tsx @@ -1,7 +1,18 @@ +import { Skeleton } from "@mui/material"; import type { MDXComponents } from "mdx/types"; +import Image from "next/image"; +import { ComponentProps } from "react"; +import ImageWithSkeleton from "./components/MDX/ImageWithSkeleton"; export function useMDXComponents(components: MDXComponents): MDXComponents { return { ...components, + Image: (props: ComponentProps) => , + ImageWithSkeleton: ( + props: ComponentProps, + ) => , + Skeleton: (props: ComponentProps) => ( + + ), }; } diff --git a/docs/styles/ImageWithSkeleton.module.css b/docs/styles/ImageWithSkeleton.module.css new file mode 100644 index 000000000..eeedce8e9 --- /dev/null +++ b/docs/styles/ImageWithSkeleton.module.css @@ -0,0 +1,15 @@ +.skeleton { + animation: skeleton 2.5s linear infinite; + border-radius: 5px; +} + +@keyframes skeleton { + 100%, + 0% { + background: #000; + } + + 50% { + background: #333; + } +}