From fa6f9d193051ec806135566fe1d3c23d876f61c1 Mon Sep 17 00:00:00 2001 From: neil Date: Wed, 14 Dec 2022 09:30:56 +0800 Subject: [PATCH 1/9] partial oauth related strategy/impl --- packages/gui/src-tauri/tauri.conf.json | 2 +- packages/gui/src/components/Auth/Auth.svelte | 46 ++++++++++++++++++++ packages/gui/src/libs/api/mock.ts | 9 ++++ packages/gui/src/libs/api/tauri.ts | 18 +++++++- packages/gui/src/libs/types.ts | 7 +++ packages/gui/src/routes/+page.svelte | 1 + packages/gui/src/routes/profile/+page.svelte | 5 ++- packages/ui/src/types.ts | 6 +++ 8 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 packages/gui/src/components/Auth/Auth.svelte diff --git a/packages/gui/src-tauri/tauri.conf.json b/packages/gui/src-tauri/tauri.conf.json index 9b417d5..ddbbd56 100644 --- a/packages/gui/src-tauri/tauri.conf.json +++ b/packages/gui/src-tauri/tauri.conf.json @@ -15,7 +15,7 @@ "http": { "all": true, "request": true, - "scope": ["https://api.tea.xyz/v1/*", "https://github.com/*"] + "scope": ["https://api.tea.xyz/v1/*", "https://github.com/*", "http://localhost:3000/v1/*"] }, "shell": { "all": true, diff --git a/packages/gui/src/components/Auth/Auth.svelte b/packages/gui/src/components/Auth/Auth.svelte new file mode 100644 index 0000000..b26f89d --- /dev/null +++ b/packages/gui/src/components/Auth/Auth.svelte @@ -0,0 +1,46 @@ + + +

{loop}:{statusMessage}

+ \ No newline at end of file diff --git a/packages/gui/src/libs/api/mock.ts b/packages/gui/src/libs/api/mock.ts index ac91c9e..f15f08d 100644 --- a/packages/gui/src/libs/api/mock.ts +++ b/packages/gui/src/libs/api/mock.ts @@ -322,3 +322,12 @@ export async function getCategorizedPackages(): Promise { } ]; } + +export async function getDeviceAuth(): Promise { + const deviceId = 'xyz123'; + // const data = await get(`/auth/device/${deviceId}`); + return { + status: 'SUCCESS', + user: {}, + }; +} \ No newline at end of file diff --git a/packages/gui/src/libs/api/tauri.ts b/packages/gui/src/libs/api/tauri.ts index 3747ae1..163652e 100644 --- a/packages/gui/src/libs/api/tauri.ts +++ b/packages/gui/src/libs/api/tauri.ts @@ -14,16 +14,19 @@ import { getClient } from '@tauri-apps/api/http'; // import { invoke } from '@tauri-apps/api'; import { Command } from '@tauri-apps/api/shell'; import { readDir, BaseDirectory } from '@tauri-apps/api/fs'; -import type { Package, Review, AirtablePost } from '@tea/ui/types'; -import type { GUIPackage, Course, Category } from '../types'; +import type { Package, Review, AirtablePost, User } from '@tea/ui/types'; +import type { GUIPackage, Course, Category, AuthStatus } from '../types'; import * as mock from './mock'; import { PackageStates } from '../types'; const base = 'https://api.tea.xyz/v1'; +// const base = 'http://localhost:3000/v1'; async function get(path: string, query?: { [key: string]: string }) { + console.log('path', path); const client = await getClient(); const uri = join(base, path); + console.log('uri:', uri); const { data } = await client.get(uri.toString(), { headers: { Authorization: 'public' // TODO: figure out why req w/o Authorization does not work @@ -161,3 +164,14 @@ export async function getCategorizedPackages(): Promise { const categories = await get('/packages/categorized'); return categories; } + +type DeviceAuth = { + status: AuthStatus; + user: User; +} + +export async function getDeviceAuth(): Promise { + const deviceId = 'xyxz123'; + const data = await get(`/auth/device/${deviceId}`); + return data; +} \ No newline at end of file diff --git a/packages/gui/src/libs/types.ts b/packages/gui/src/libs/types.ts index b4617f4..8a8c272 100644 --- a/packages/gui/src/libs/types.ts +++ b/packages/gui/src/libs/types.ts @@ -29,3 +29,10 @@ export type Category = { cta_label: string; packages: GUIPackage[]; }; + +export enum AuthStatus { + UNKNOWN = 'UNKNOWN', + PENDING = 'PENDING', + SUCCESS = 'SUCCESS', + FAILED = 'FAILED', +} diff --git a/packages/gui/src/routes/+page.svelte b/packages/gui/src/routes/+page.svelte index 091d638..4fec90d 100644 --- a/packages/gui/src/routes/+page.svelte +++ b/packages/gui/src/routes/+page.svelte @@ -9,6 +9,7 @@ import News from '$components/News/News.svelte'; import CategorizedPackages from '$components/CategorizedPackages/CategorizedPackages.svelte'; backLink.set(''); + console.log("test", window.location)
diff --git a/packages/gui/src/routes/profile/+page.svelte b/packages/gui/src/routes/profile/+page.svelte index 21855de..fd6c7ca 100644 --- a/packages/gui/src/routes/profile/+page.svelte +++ b/packages/gui/src/routes/profile/+page.svelte @@ -6,12 +6,15 @@ import Badges from '$components/Badges/Badges.svelte'; import InstalledPackages from '$components/InstalledPackages/InstalledPackages.svelte'; import { backLink } from '$libs/stores'; + import Auth from '$components/Auth/Auth.svelte'; backLink.set('/');
PROFILE - +
+ +
diff --git a/packages/ui/src/types.ts b/packages/ui/src/types.ts index ca1dac3..eac3436 100644 --- a/packages/ui/src/types.ts +++ b/packages/ui/src/types.ts @@ -34,3 +34,9 @@ export type AirtablePost = { published_at: Date; tags: string[]; }; + +export type User = { + username: string; + country?: string; + eth_wallet_address?: string; +} \ No newline at end of file From c539a2c19478b7fc7bbc715b511e2ea6b90f4ca3 Mon Sep 17 00:00:00 2001 From: neil Date: Sat, 31 Dec 2022 20:57:30 +0800 Subject: [PATCH 2/9] fix auth component loc --- {packages => modules}/gui/src/components/Auth/Auth.svelte | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {packages => modules}/gui/src/components/Auth/Auth.svelte (100%) diff --git a/packages/gui/src/components/Auth/Auth.svelte b/modules/gui/src/components/Auth/Auth.svelte similarity index 100% rename from packages/gui/src/components/Auth/Auth.svelte rename to modules/gui/src/components/Auth/Auth.svelte From aef7eda9f665d5b41cb2e1c954d6d0302dc1e18c Mon Sep 17 00:00:00 2001 From: neil Date: Tue, 3 Jan 2023 20:31:59 +0800 Subject: [PATCH 3/9] #78 implement auth state change in gui, after login show user --- modules/gui/src-tauri/Cargo.toml | 2 +- modules/gui/src-tauri/src/handlers/auth.rs | 5 + modules/gui/src-tauri/src/handlers/mod.rs | 3 +- modules/gui/src-tauri/tauri.conf.json | 14 ++- modules/gui/src/components/Auth/Auth.svelte | 46 --------- .../gui/src/components/NavBar/NavBar.svelte | 8 +- .../components/NavBar/ProfileNavButton.svelte | 36 +++++++ .../ProfileBanner/ProfileBanner.svelte | 47 +++++---- modules/gui/src/libs/api/mock.ts | 14 ++- modules/gui/src/libs/api/tauri.ts | 13 +-- modules/gui/src/libs/stores.ts | 3 + modules/gui/src/libs/stores/auth.ts | 95 ++++++++++++++++++ modules/gui/src/libs/types.ts | 2 +- modules/gui/src/routes/+page.svelte | 2 +- modules/gui/src/routes/profile/+page.svelte | 4 - modules/gui/static/images/github.png | Bin 0 -> 84884 bytes modules/ui/src/types.ts | 9 +- 17 files changed, 213 insertions(+), 90 deletions(-) create mode 100644 modules/gui/src-tauri/src/handlers/auth.rs delete mode 100644 modules/gui/src/components/Auth/Auth.svelte create mode 100644 modules/gui/src/components/NavBar/ProfileNavButton.svelte create mode 100644 modules/gui/src/libs/stores/auth.ts create mode 100644 modules/gui/static/images/github.png diff --git a/modules/gui/src-tauri/Cargo.toml b/modules/gui/src-tauri/Cargo.toml index 6576123..5320252 100644 --- a/modules/gui/src-tauri/Cargo.toml +++ b/modules/gui/src-tauri/Cargo.toml @@ -17,7 +17,7 @@ tauri-build = { version = "1.2.0", features = [] } [dependencies] serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } -tauri = { version = "1.2.0", features = ["fs-read-dir", "http-all", "shell-all", "window-all"] } +tauri = { version = "1.2.0", features = ["fs-create-dir", "fs-read-dir", "fs-read-file", "fs-write-file", "http-all", "path-all", "shell-all", "window-all"] } uuid = "1.2.1" futures = "0.3" diff --git a/modules/gui/src-tauri/src/handlers/auth.rs b/modules/gui/src-tauri/src/handlers/auth.rs new file mode 100644 index 0000000..31913f5 --- /dev/null +++ b/modules/gui/src-tauri/src/handlers/auth.rs @@ -0,0 +1,5 @@ +#[tauri::command] +pub fn auth(package: String) { + println!("installing: {}", package); + +} \ No newline at end of file diff --git a/modules/gui/src-tauri/src/handlers/mod.rs b/modules/gui/src-tauri/src/handlers/mod.rs index cc9a312..5ce0e78 100644 --- a/modules/gui/src-tauri/src/handlers/mod.rs +++ b/modules/gui/src-tauri/src/handlers/mod.rs @@ -1 +1,2 @@ -pub mod packages; \ No newline at end of file +pub mod packages; +pub mod auth; \ No newline at end of file diff --git a/modules/gui/src-tauri/tauri.conf.json b/modules/gui/src-tauri/tauri.conf.json index d5a16ef..fdf6b77 100644 --- a/modules/gui/src-tauri/tauri.conf.json +++ b/modules/gui/src-tauri/tauri.conf.json @@ -36,6 +36,11 @@ "name": "list-packages", "cmd": "ls", "args": ["-R ~/.tea/tea.xyz/var/www | grep 'xz\\|gz'"] + }, + { + "name": "open", + "cmd": "open", + "args": ["-a iterm"] } ], "sidecar": false @@ -74,10 +79,15 @@ }, "fs": { "readDir": true, + "createDir": true, + "writeFile": true, + "readFile": true, "scope": [ - "$HOME/.tea/*", - "$APPDATA/*" + "$HOME/.tea/*" ] + }, + "path": { + "all": true } }, "bundle": { diff --git a/modules/gui/src/components/Auth/Auth.svelte b/modules/gui/src/components/Auth/Auth.svelte deleted file mode 100644 index b26f89d..0000000 --- a/modules/gui/src/components/Auth/Auth.svelte +++ /dev/null @@ -1,46 +0,0 @@ - - -

{loop}:{statusMessage}

- \ No newline at end of file diff --git a/modules/gui/src/components/NavBar/NavBar.svelte b/modules/gui/src/components/NavBar/NavBar.svelte index 8c483e8..1beb50c 100644 --- a/modules/gui/src/components/NavBar/NavBar.svelte +++ b/modules/gui/src/components/NavBar/NavBar.svelte @@ -4,6 +4,7 @@ import { searchStore } from '$libs/stores'; import SearchInput from '@tea/ui/SearchInput/SearchInput.svelte'; import Button from '@tea/ui/Button/Button.svelte'; + import ProfileNavButton from './ProfileNavButton.svelte'; import { beforeUpdate } from 'svelte'; @@ -92,12 +93,7 @@ {/each} diff --git a/modules/gui/src/components/NavBar/ProfileNavButton.svelte b/modules/gui/src/components/NavBar/ProfileNavButton.svelte new file mode 100644 index 0000000..54d4f0b --- /dev/null +++ b/modules/gui/src/components/NavBar/ProfileNavButton.svelte @@ -0,0 +1,36 @@ + + +{#if user} + +
+ profile +
@{user.login}
+
+
+{:else} + +
+
+ profile +
+
Login
+
+{/if} diff --git a/modules/gui/src/components/ProfileBanner/ProfileBanner.svelte b/modules/gui/src/components/ProfileBanner/ProfileBanner.svelte index cdd3d36..d487a16 100644 --- a/modules/gui/src/components/ProfileBanner/ProfileBanner.svelte +++ b/modules/gui/src/components/ProfileBanner/ProfileBanner.svelte @@ -1,23 +1,36 @@ -
-
- profile -
-
-

Authenticated with GitHub

-

-

@Username

-
-
-
-

- Country: Germany
Wallet: - Connect Now -

+{#if user} +
+
+ profile +
+
+

Authenticated with GitHub

+

+

@{user.login}

+
+
+
+

+ Country: {user?.country}
Wallet: + {#if user.wallet} + {user.wallet} + {:else} + Connect Now + {/if} +

+
-
-
+
+{/if} diff --git a/modules/gui/src/libs/api/mock.ts b/modules/gui/src/libs/api/mock.ts index 6a6683e..9b16ae7 100644 --- a/modules/gui/src/libs/api/mock.ts +++ b/modules/gui/src/libs/api/mock.ts @@ -328,6 +328,16 @@ export async function getDeviceAuth(): Promise { // const data = await get(`/auth/device/${deviceId}`); return { status: 'SUCCESS', - user: {}, + user: { + developer_id: 'xxx', + name: 'Neil paul Molina', + login: 'getneil', + avatar_url: 'https://avatars.githubusercontent.com/u/7913978?v=4', + created_at: 'xxx', + updated_at: 'xxx', + country: 'germany', + wallet: 'wallet' + }, + key: 'xxx' }; -} \ No newline at end of file +} diff --git a/modules/gui/src/libs/api/tauri.ts b/modules/gui/src/libs/api/tauri.ts index e141980..fbf98dc 100644 --- a/modules/gui/src/libs/api/tauri.ts +++ b/modules/gui/src/libs/api/tauri.ts @@ -19,8 +19,8 @@ import type { GUIPackage, Course, Category, AuthStatus } from '../types'; import * as mock from './mock'; import { PackageStates } from '../types'; -const base = 'https://api.tea.xyz/v1'; -// const base = 'http://localhost:3000/v1'; +// const base = 'https://api.tea.xyz/v1'; +const base = 'http://localhost:3000/v1'; async function get(path: string, query?: { [key: string]: string }) { console.log('path', path); @@ -29,8 +29,8 @@ async function get(path: string, query?: { [key: string]: string }) { console.log('uri:', uri); const { data } = await client.get(uri.toString(), { headers: { - Authorization: 'public', // TODO: figure out why req w/o Authorization does not work - 'cache-control': 'no-cache' + Authorization: 'public' // TODO: figure out why req w/o Authorization does not work + // 'cache-control': 'no-cache' }, query: query || {} }); @@ -170,10 +170,11 @@ export async function getCategorizedPackages(): Promise { type DeviceAuth = { status: AuthStatus; user: User; -} + key: string; +}; export async function getDeviceAuth(): Promise { const deviceId = 'xyxz123'; const data = await get(`/auth/device/${deviceId}`); return data; -} \ No newline at end of file +} diff --git a/modules/gui/src/libs/stores.ts b/modules/gui/src/libs/stores.ts index acedd96..b2571d4 100644 --- a/modules/gui/src/libs/stores.ts +++ b/modules/gui/src/libs/stores.ts @@ -6,6 +6,7 @@ import type { GUIPackage } from '$libs/types'; // TODO: figure out a better structure for managing states maybe turn them into separate files? import { getPackages, getFeaturedPackages, getPackageReviews, getAllPosts } from '@api'; +import initAuthStore from './stores/auth'; export const backLink = writable('/'); @@ -170,3 +171,5 @@ function initSearchStore() { } export const searchStore = initSearchStore(); + +export const authStore = initAuthStore(); diff --git a/modules/gui/src/libs/stores/auth.ts b/modules/gui/src/libs/stores/auth.ts new file mode 100644 index 0000000..3ccf368 --- /dev/null +++ b/modules/gui/src/libs/stores/auth.ts @@ -0,0 +1,95 @@ +import { writable } from 'svelte/store'; +import { BaseDirectory, createDir, readTextFile, writeTextFile } from '@tauri-apps/api/fs'; +import { join } from '@tauri-apps/api/path'; +import { getDeviceAuth } from '@api'; +import type { User } from '@tea/ui/types'; + +const basePath = '.tea/tea.xyz/gui'; +interface Session { + key: string; + user: any; +} + +export default function initAuthStore() { + const deviceId = 'abcdevf'; // ideally randomly generated on install + const session = writable(); + let pollLoop = 0; + initSession(); + + let timer: NodeJS.Timer | null; + // TODO: + // fetch session data from local + // fetch session data remotely + // update local session data + + async function pollSession() { + if (!timer) { + timer = setInterval(async () => { + pollLoop++; + try { + const data = await getDeviceAuth(); + if (data.status === 'SUCCESS') { + session.set({ + key: data.key, + user: data.user + }); + timer && clearInterval(timer); + timer = null; + } + console.log(data); + } catch (error) { + console.error(error); + } + + if (pollLoop > 20 && timer) { + clearInterval(timer); + pollLoop = 0; + timer = null; + } + }, 2000); + } + } + + return { + deviceId, + subscribe: (cb: (u: User) => void) => { + return session.subscribe((v) => v && cb(v.user)); + }, + pollSession + }; +} + +const initSession = async (): Promise => { + await createGuiDataFolder(); + const session = await getSessionData(); + console.log(session); +}; + +const createGuiDataFolder = async () => { + await createDir(basePath, { + dir: BaseDirectory.Home, + recursive: true + }); +}; + +const getSessionData = async (): Promise => { + const sessionFilePath = await join(basePath, 'tmp.dat'); + try { + const data = await readTextFile(sessionFilePath, { + dir: BaseDirectory.Home + }); + // TODO: decrypt then return + console.log('data:', data); + } catch (error) { + console.error(error); + await writeTextFile(sessionFilePath, '', { + dir: BaseDirectory.Home + }); + } + console.log(sessionFilePath); +}; + +const saveSessionData = async (data: { [key: string]: string | number | Date }) => { + const sessionFilePath = await join(basePath, 'tmp.dat'); + // TODO: encrypt and write +}; diff --git a/modules/gui/src/libs/types.ts b/modules/gui/src/libs/types.ts index 8a8c272..dd9f8be 100644 --- a/modules/gui/src/libs/types.ts +++ b/modules/gui/src/libs/types.ts @@ -34,5 +34,5 @@ export enum AuthStatus { UNKNOWN = 'UNKNOWN', PENDING = 'PENDING', SUCCESS = 'SUCCESS', - FAILED = 'FAILED', + FAILED = 'FAILED' } diff --git a/modules/gui/src/routes/+page.svelte b/modules/gui/src/routes/+page.svelte index 4fec90d..23eeb8c 100644 --- a/modules/gui/src/routes/+page.svelte +++ b/modules/gui/src/routes/+page.svelte @@ -9,7 +9,7 @@ import News from '$components/News/News.svelte'; import CategorizedPackages from '$components/CategorizedPackages/CategorizedPackages.svelte'; backLink.set(''); - console.log("test", window.location) + console.log('test', window.location);
diff --git a/modules/gui/src/routes/profile/+page.svelte b/modules/gui/src/routes/profile/+page.svelte index fd6c7ca..149a3ec 100644 --- a/modules/gui/src/routes/profile/+page.svelte +++ b/modules/gui/src/routes/profile/+page.svelte @@ -6,15 +6,11 @@ import Badges from '$components/Badges/Badges.svelte'; import InstalledPackages from '$components/InstalledPackages/InstalledPackages.svelte'; import { backLink } from '$libs/stores'; - import Auth from '$components/Auth/Auth.svelte'; backLink.set('/');
PROFILE -
- -
diff --git a/modules/gui/static/images/github.png b/modules/gui/static/images/github.png new file mode 100644 index 0000000000000000000000000000000000000000..3a1bfa4f448c1e204fcc4f62c22cfe43f6a52fa8 GIT binary patch literal 84884 zcmbrkWmH_v(kP4sNN{&2xNGpiT|;mP?(Py`kl?PtA!u;-;10nZg1d%6!T`g}$8+9u z&wJK)f8JiJR##V-?CRduRTZtFCXaziiV6n@hoPt-^AQdXp5ql5-XgzJe&Yqc4$#Hy zq@^_!rKPDg++D2g9IfEs6r$60QS`LN3G)p<(lo;%e3WttRluO8|4Jy~kK_3Dy#y0C za%dEV@h8_yb9k~&mZDYo20CxT;VmMWPibBarqYM1s3)Cu0e=p1zQ7XpDEJajI%&N%`<^pksY-w(fp@<~p99Z-NDUpcTzt!B6#uJKSnIz z`xg9W6wknLZwX^%v!iy`?Y6 z;6Oi;K-Yb1!1U{QNV*yYBqjM-BX{1W$NnNK97bP<@! zyu)juAMtk9zob z!!d%URPM*)VnG144mV+Wj7L#Av^|TOQD!7Z@*-OoyPQ0h@n{gKVs><4_;C&tBMK^F zbJlC7r3xU4f^)=vODutENScY>7+l{{-h%?wx_g7jkra$h4Tq^@?JAS&rm|{eQZx4iH@|I!c*vFx+Nr*7z!(tifIoy7{v9~asJTx+_ zqa4JXYS{K|*o997Qr25~I*Pb44XV5M$T*16--k?#*qwu)_qKfBh&~M-#qqk$^!o)o zFpAPQ<51!`dBHEwX= z#nke{SYx{1WaR)@@!5qJylc<&!lZ_u#uK-v-tg#GlAV{mkrY$C3|N*=c39WwUXvCB zjM~670>womVHeTtLzw2r4GXKX7sNVP#H)(c@DBY6lh?Cn{VRPn(kCxIDyMR56 z&-(iGx4HJYoq0V>Pd7;6jW&Fy>V)d4Z+UrcN!Y-0*j$3N`TK7pno^t4;2Ixd_dxdo za?mXaPs1LMTPR%L@j+i--`pRgRYkbJU-~v+V?NUn?@TCI;EV(ZQk78g$vH%@ceJD^ zw(Oqzh%*t%1gUIxFn@*s-XfS$qYi~xa^YAPyj$sbqk_cSXQY8J(Z^FyT8)y^r&Eu2 z0goafCWx#S=CQ-mj_Mrx?0WAR@~x2QC(6s)&?Ib9Dfv4bydm5M`CJ@^z1TN2I0|ej zaV4}QQE!uJd6WDUNE#9J6CEWhlV8Sg4*1-0?4++~DHJ~3AV0>L|6r+%C;hH-qL3Ed zIP1zsnHOwbs5MLLDcE6O@IE5><;z_F3(%7cl2M~2fPQ&2K0S7y>PbhqGgPW_~#I}V#kNr_B{8@_mKBK z?=hQ`HKeY}(@ZR4U&>HD-Z;7e z3mLPOb~d(&wp2?e_6hdn{5|WAEvPNREe`f|i_B*kXKeS;XR>F9XDCZ`KOSr~_^SC< zNsZ$5NeM{h`J5f@?B@C9?d0r^>^YWym-=bmb`UB~DzPfW*72J-R4tR#s0qt`C~rCy zeG+{Vc+&U(CZM@tkW-vjYFySW-=*E9E3Z7N&8S(fQ7(1duGYm-=1@90H#KKm`9u?nOaI9!qgfVG`d=oWYl{A0cC4bTGAnxt=A06l;`FmIR*o1qS&!-sS2V6EWyJFa~wtwdiKo+WyUMw$y1GOej@>0`eg8UpJ$v}QO-PQMvOIf%>#d^9KC!3DYG%3xrHp}G4DETb1U{p^)#9M-`3du!yhRlE95(^Cx`q7kbd(sC zd}0oM8|zhIfCOY7{QOSf-Tc=wnfoD7^inic3PP&R`<6rsA@8Hr$#LZIfrAMAk4okf zf75#0B=>a^&q@CX^jJb_-Yw&yG8*ODa&g=2ffUbD+fy;ia6hJg^eGM6m2<0V546i| zo@o9|nbQ{Wkn(57WcUvu_^r;{{L<%=It5_sP%@({j{cipJN4-_{X0z-QZivUHzbj}vvpy$YM5(-{@ z-nL&-)}>SS*-qkLpcl15G#=j5rPEXS&tDp}Krwqhw<$;b(;u<{HbKXnG`)*yKhhPH zoH?&Q*W1zbXtdXRB~KQ4#rCA%D08L@rKf)j)c<7|aJr(|Tl?Z=s`!+$TzaMafrE|% zkG-qqx69)+K{jiQj%O`-Q=>D1h4yKsPZeWLkKUC*j~#|ryr=5(dQ=O>IomS3;e%D+ z(NhiqJi!-M3|1oTpw+%@SEpjw$hxXr&V)eV7TfOt8|AT#PL`_5o0_2-B*Ow{<=@`W z4@WLbug}UiCs?O+b8(=}#q^PV;@O#TL|4XgA^&{#)#kpB$tGTV`S<1T-jkmAd`Yd~CSdxvJtE=|1si4qDsRx+y;@ zNUwAJOz|`ctIODG=r*pSuS3~l3#x*7kBY4Ls0PjjCT<<~{DEmaX~OoW)qklU0~iB? zmI3!@r<3b-ttMo>;lM9kNg`a-M@sEC>hS0Sd}0*AA4K2^=@BI&pLx#&hoS1uQRXu& z@;d;tVMc|7cmb?;`U(XXUR(guos;Y1-ulQTIH}Irz zNUs?DD~Q9B{RfwWXM#ig7aai(F47L}&A)lnUi*Jq(kuKU^FKXeN(3Cr>j?K1dvqVA>w~@o@6+u)lJ!d-yqfn)$Ljd(i!llK-Pe#>&IO-Okn1&c&Jf zAH8PgE?%Buw6y;i`cM0x>$LK<`(I1W9{+ah)j`gGW;nSyxH$i#`&Cr*AF8m1ov)Rn zzKosI>zcjV5a$u%6a5$e|26Z!7XM39?|&tExp@9t^1o*O|B~7sR_@X+POm0C#s7D^ z{w@69lm8YJ<^0F<|5}OvS>}IHU)Nb2Rh08TdnS%5AxF~px{c&^GU}gR`+shMe_HA* zF#WrK#lKzCDSANR;3VJ_Wh6iO!e0cU6w+%a|Mg4d{ngj^D~Y>rhLcuu(<(ly_Fa;3 z_;9X-9%4*YR4}}xjGGsRjG33FuFUXtm(o0c18rvvb&&!xQUnPD7ij9sEpS^`yIlR@ z@_GIz337nV(Y;W)ns%VJ*MQh&TbIjBD22Cv!E&8?1!L)f{@JPG%a6N4%IHI=o0zF| z2yCVJ0-dSMjXH(U{|DWD7>?-dd-oHieTma=49$sQjnLmR4R6E-uvnHtWx+fpeez^e zR494p-+9aXuR|m|9P3?cMl3M4JD$F4i4SIA!cJ{=wEp-qIX-cUHZMVZP$aB*u*kQa za48yJW-EU1gZjA=z;OUPw^>~Zu)U=r4v;3o3<5s~7!+D_Ox z&i$*V0Z;V%A85tp$zH- z!0zehhQ;K^AW>T;EId&Rt#u=dd_*SJGNlSGPz<@AkST-v9hf-`wufKFYE{+}jEN2B zA(zA4G6)CRZ@Ag=5>%9{+!U+`^%uS_9kuGvFBXMnx+TvzXp;4yqu`}?p(|FeT<_}5 zq6{(S$CXS;UjtZ?cvA{DuB|YLe-wZsEi9YVooTY!HjMK-_OP-)=D-*Z(G&i(WW$Ea zDbGgBTb~LVjyO<+SKsTkHtl#lQzM3;4~^1(pW;iaL9tkYMmlf6Yp!uU^$y9CkddsV zgDe8xcA$yJ%b#6uM(pr))(E5Pp?siuRzKvx)1uvPf=xc6jNZZ1cd@{}v<@c34$3BfjE*NaFS)_O zZGMZH`6Ysd#6>Pl@A2JcB9KAdnX4Y}q%czhIihvfz=}M>>7xUx$n_dwXWZOfvX~BQ z8p`lWuxmixgjfGVfJ{6&Ufr<-1Q#VKhTl6nz&?!VO##jEEmB);Mb})vTW77rm?ZRGQ_UZg;#QOeAX+GZ z(_;Ay_OVjKQ~eacrLg+2Ij1}z1dhf9oT#M!>J%7@4=QH%*p=QK*PP(=f` zdP*4CYQE!#7y{@J*J$kc@AWm#A>cWbN-jqk!kvu2KrBcuX0h**It5^VPdsSApXG7{ z8s)DwuD@}G+s8tbjm17A7BI-nl$TY;f4k1_He`XcS1#h`%gv5!m$V#O-l%PiWtbU& z_5+SYylu>~D2QGsS)uiuM6L}9L0Jy1M+Oz*IzXtrVq>u2YZ~6G3L78jP?a(Kfw81w z{{9#6OkNS1s!L@Vq%@2KfRrmUh={@v3;d%d@S(iWq4F&rsGLJ|ZwW?0rxMJHm0!zb zs33vl>*Fq=Z9~M073BH1Kn!+4C@4f8(a!!o;l{Np<}Y#R0kNMXX(Xamrrz0clr5-W zjJ{{@2%Kj9WyeFM!lNPB#!zw+TCC5LQnz0P6S7%c(S}q2uAk@Bx_Fs3l03apHl`Ru zC9r(E;(=MG&`C;tD-a_g_rAGzG}V40gT@eVb})+=b$FmNcyai#Zz{@nmfXYiJ;>#D zn@_pxdgI817s}TZz0HeN9>cfIR^kIjQ&-eQK*7oCPrV>kxYJze#)rcWsCVGe;y(N_ zFQRE5EE#53h>n5=(st>$Ss}(8jo#HtOu;`h)pH-o(J1T0Env@e^^EZKHdppN@5@BT zr~O7R%z-CzJqSEY4c^CEg7tCkn{a#_!h#{ei;S{5Bindq0h+@_`9fs9>5d6mxuf)2 z3Kw5o_PV@JlacVhijM$AfBdfI4u_f1Wyeno>@`JX2^&Fpo+!X@hX=YT#@6KDH`yEz zzOTXTsS08AaDzhO@!yn4SPy1b$bokz+b4}UR!^Kl2EmOi)Xnk0>0)uNWcIxokPVvN zvU!YNsWaTFK4y55OrqRk>94)5NcTJ7=OL#3>E_)?SXt&T73l}SHS;i(5g#@I{gyay zcdKskCg@a{DU12-=m|lpe;7f^CM^GPXzy^8R9tG$_V866lSCAu5E0b1jE#q~EMaw4LOQhFL?+{9ZO4+inwAI|S z^|M zC#K67E|6HX%3OvWf{($7kt2Y$KB8HCtIEejx#h5^TuJe?k$ZXr@shI;at>p39@UjeI7cWLJ;GsWQGBit8l{a{pPz&kLD;o^ zRKn=n7Zul2QcoHq+qAYXwtsQLD%VyDgY(w2Xa#74%k9xH2gxye>}nGhWgxg=FQ3;K z_WM4Ke#JlfyQKcLJ~tm!A&>f+1v=MU~3$L5H!s`w882wD;@u=(W!qA8QSJYqqsVdSVK zH|L(`Q}zqfi^-#lz;L8&T(2z^@wO#h#7$~COXg`^ADKVt#0+1tyUjYTiuH(O~|q z9&rvZu>djo&z2CNO5pi&KSR)t+wMN*?@l3A;<_*WBfHHxInD{+-TYDE&`*#J1vR|2 zB9>tz>W|i>F)%W5s2o|rJ`N10EBR5K`8-m-3}y}0SSiT&YllxyIMO6kW>$c}9X)bK z7KRT+yqz>S?k|-0VKRB&VtCiUk;I#ZoN8wpzv3ttvpq;QR46PgQq2Ui^Ia+>2=Z;A z0i$btfO+vU^joE|p}P9V1JGt|cRg<8ITgD`f$dX8-%MX74GMJ79oK z=6v;H3=>qI3#Yr~KG@|Nyy zyQPVAyQ%CYyGQA&`4p?k`5XF4(?1P@imbK0B; zKtJ$7g-d0y*CD#F^F7h$B>wljb=1K{BYLP=`&FpOI*4hP)hAjX4l=cL53An_Vn+~} zcC01m9(0Gi4`;j!?(eH!F zbXcw(LFnMPuQklcU^mXc>IKq3uatc@Z;w6C^L$ECh_+a_TF$RGH`>R+(sy78#VD0< z$jWAW?709`P6X;r0%s5@2$d(>j-VBGAO=qftqMSYakkbUw~Ibz`ozdxGGqg#M+$l= zYTanCf3GVm2t@8CZ+x|=QL0{BoT`DmnMFWG&3-(kDER3wq0?Z7cs<5Su;UhRN)tbj zy_c-pGS~khDiRC0@HpdpZ?0+3i9MmWW;HLA?I`CUD!N zuS<$JwM<1Bui@l|H(XI#p^IqGJo?CY!*OKW_M!Lj*Sq_%Od#165Q~TdgVu}X3%N8- zx64X{;}1J&f?^J^22tK1LO7EHcbHVX?nr6?SYbxAHZlvD=+0}WI9b|wAPB$utHiYo zI%(aPPxTSmbZmk>x96Ve0#dbH+Y^iM!k0vdL!}?Cg@`q#!A4cDdA-2bpN+$}BurZL zcGQVkWypgPI5G5cERxr{qw;y8j##DD*d}+#P{E6mYwY_N0@j5y?a6w?>?H5)z?o(k z^tp7C^0}SQXX`hg%f_SKmy43tyf&xo;51SvEj?VRzTxeub(BEzMHwouwg4@R@OA0ai%;A{UJRAzaVQZe z{WP62F2cW=n83bPhM^2Za-0rIg73DScw9p;Hh~u(vwSC}#(z>)?LB$5Z=>9;89HbE z4Vdpa{Zrs0vF@@R*zB-w9?QOPA=Kn{X^Sx067Vf_L{cETw4+q6Niul@nKP5`@za1A zAL#k%X?`FaZK3gSav=qUsGKb5;n{QTP`Atk_NT>8$kyR8iN_*-I4c%hKT@z~X%Q2$ zEEElSSXgk45%P=NfKlSbu)0C^3of&fNq`qXz%^f~=3402}g zkx;O5b}9dwxOzevj`1zWkVQD&v`S6KI6^IB>ClloUFapMJas`%wH@9)~P zVml$fkZM*;?D0aGc0b<`d;-qq$CAQy%Z#~_VInJzw`ca2d3Jpxq1`)^!$#O9`VM;@ zQnjC3NLOZbO8Ki+O3r}~U7q(#y5$=#z5JW5gYlzDD=vZmghjj; z$^>5>iuem98SKRUt7Z;Teum2!$p)UU@NcaD)UR1lX?>LPDT7ytAZA4eg^jxDjGdxhB}@+Z2eINwLOb z*>qb!MiIZE!x6k&6DjNpG0?oh0vdK=(=sA45;6kVh<$WPgqXIjMy$@Fs<<|V=UA>x zXs2Ukgesco*n^np^^og`b8Fdr>wOg?XcFoD(?EXQ(Yt#raI7`uks<1u+2wcFPur1s z+Ejq4r!Nb?P8Sw1Ma0DOJoma5wngv9S2a~fWbYK~Q+m>)M?ToiQ931)b$>?te8kOz znqc%R{G$X<4xKosboKBze23*~ML^dRa6VF9gm*LWf!*%3G2M>*ik}RCxt+F07)Q)} zv^cl{ivhIqi~VHi1Bs?Q9`h^?_r{CEJP8{N-n$pqSP{rjb< zuYP=#WFvAdW`^VIK@;?g#NBVAsj#Hvq( z;2m7?`%aqonS*0FU}_-*WtAgMo2;i_z<69P1nHwxrGQyb@4zU5=VcQasb(p|mh@7j z3*zx~UP1oDPn*(SzX`2{ru>(S=KTZ_+a0^>{c=D8WR3sfwTXiGWAjit%DrC>Us4F;KyC& z4r@xJ9__6CUR1k)pm09ey%^efusXss`cZ7DV{KnWG@~_~lK<6(8&!FJ=s9WA=3~zL z1t;PV^UMfaE3y`&yF5S@KiN4{i{Z$Gi$^}DeH?f@O?pB6J19POi5dwJ-U;_?8Hwe+ zIyl6jbOT&8&Zk}IIV&jWGi97(c@TF1-pU$T!q`q)2U$E2`fH+ys4I6+FM`JL1h^O} z@#Y4BY1C8&$d}MAu@uMtNRF+fi7!9CCL$@LMOnPVd9#%a#lG@88!o#4Wdoq=ej?yh zSO2oUUHZ7euAs%Jj^lH=LsK=UVV6?u?B~ZuA2w-w)ca@^sD0z#!I46eeelEZGiB3T z)PAdG)%afj`^vjxz;;fM+a>2b5)oAXX*UrV=VHKU{!N5lwXcRo%s|Gp7&&iEFTS@C zMwb7h?vlnSNM?DID$u$pARySl*oK!hk$pcA!ZW_Dvfp*8)WaTUk~>gHVbui7ihHqpG?2fI{u6K^Jx!YJrdXMuHst zH?^QjO%pQl?i~pUQrsR3?_n&MT`>x`Nuh^`B_G*4VNZxxK!BXC-)MQB_qw>)bC$X~ zr~fY60&hMD-KZ{wXOJzCCsa_y32GSIA{kln&RpIZ#Mp*m!;Md@!c4rFuCiZ~p;Ab8fdHfBb=~zM(%i{;~0DDuGmq;<;riP5CWT>u3H{SN|#`JOn;Pu!{!Ugikj9>`?LEZuv zTtjHa;5rfSNE}fJ@d=z`l1*E5nFF0%}F&|4E_+sgo720k!79$;ElJ-8T z%RhoAJDZWWgD!6}M@twl8ou~LZ(-t>FD2az`;-rQVoLki^G+xWI9BZ3^voWFFKHVd z{i>X2`n8%Trp)gWG*cSE#V7?22```{K$%0`i&f{|>j$%U)n#GR=XW}TYJMhzT7KL^ z5lyZ*lmzv!ejFf0h*GFSkbw_70OD3y1!KaC4mi-IAov9kzmm}}&Wh{z>mUZ=BGNrt zK+S%TIfj_w{UVe2uxW}HR7iu;Ls{Vw&^q+92>>b4*=hIQ`vRGcHlG!E7Yf4^amOn{z1$c(wZ`a&HzcD)k71RbjcTzW zbsm2Z3K;a+;(SD}pHceC&0pVPcLkaA#e{c6j>n|0)nT$|RDD}+L~GMdX__X4qxfWka`eQ79s>~PfH=aoiWI(LMkY6hkO7{q41dDNLt5QECA)g zh+F&S^7|Nl{Dde-p9t+!)G>xGPn|s_;|{k4@{F_X8^{K9+IO2?{OAy4%fe&h2Mx=2iU!w$jo`%Vrn27iuG^I7l#o!K z7+=pJ2$1TGVl6CvrbGq-Hw}Kj?+kLvjzLK^xm{nei)`5ze?HBTOw7!(cP;bN17lZ= zw=N-$-}(zgQ0+zsIYq0%I}eFTQ`MD#{P126wfU>K}iTn95pm! zl|C~y#IIa;d`i~pVjOQw;CmC0%1y3lMb$XmQK%)Wg{}h^E{XgnfZBdeKI!$b<8WWl zfL6V)sQJBDq~uqLRf=%%ow_|aQ6K>Gj^9DIH1J`KQS6TpN*NL5T~YHsrbtQ6(J#Au zK;#G-&iApL%W7RG?TYd8jD(|54fK?c0)n)h8%0Jf+NHL!M(h+*NV_-@y|$n|&(YVT zR9)Z;+35{yof5G9lp$A2t)I$8orDb5%H#XTr4Le$%swVM%(h%$zZ*jkri_i8JiRGY zo0+7Q8Ot!E*@3+lvOeZw?GB0&!w?#?L8F)$CbnAJ>Yrjoz)bNf?vq5PD~^6N1%I`$ z-?O2xrTaST$^?>~iAUVOmDX}g5=6krM;>@-hKi|juU zY`ORO(r~3YsPZ*B+AlY0*hn+d^XejT#qYZKLj2xY(bsBi-8}F+{IdTi+y43k(%v>;y&66U%>Z3HJS7@~37&PxB`_EDP6|}4*#Qga_ z6YexRC^xP|3~&l3IU#S`Nykk)C6EhDB|@2l29%`*53_tLZH}v{KL$JfX7S*>6rCmp zRqku?g6~x=qcTZTk5HAC`j$gOgp)fI&|<+%v2umDCYZ$WswxIaVI-QR??KFM-o`H3 zUtJ0?g}}3(cii%2n^e6yYVVjCVa6OouQBs}b6l^pumR@^4b$OJiL4(i$7bk2i(w#v zvsniT(G6_Bh_jqC@U*D8tc}XTw8+`^^0=L8v{#sfF2W+t0u9Cw& zVo2xqX{i2yI2yDf3}ybjHwr1Xr)v7SDZO7H@R)=bo#h%TEsD7GCyb~LgQ=p2T_q$#Myi`Nupz$`Gh%+{GjBz7796iI zh!gk>mg}3g8pp(Xn4vE5q@7SFufznQGc^B-^9}2!jyK6MQpC zz804gjR`jv5cHhVF8CV{8eJxa)tZoCr8vX^S@x66yKW0VQKcZir6s;L(WY=ps#06q zK?`7!ieX5%fVzF(H&#pAHF?iN7tW$BgI8*gH;R2tGjgwj&9+}~1PrMQk0p*l%>1RU z=2lyfuYmH|=%P%DCDooycuCfUKREHJow5i{;P{tN%aQD?j62|~^R8j|h4nX`kL-XX zpPJv2bArvu1H+N!9e?rEK5=<_yg z9zRGMUrT;CADS1G8A5eOQ>-Z>itoroGqam!)@>mq?pU2)m%{Bjk+tABk{YRGN^}kg z^7!>Z8-m=X{_|$3Zq$$^qlARldTCTt*hG5uIkfG9SzOT7`82``c{NO+=<%3Nh2;lT zII#zrC~Sa>3MRlhwKbOs^d1zr>*!a7c~y=XBG9@TIW`BDqKD6x@i)dbt}*5j>T-t~ z(9hpLnZv$n#_9}{3n!`6Mqo)d2j1)4ya~b-9V!x~7Ps_!P&^cCU$anRc!%KG0>%<> zBZQ(b3^Pw@ZS(~FwCS$=Sa$n#Pob0e>S+Ng{Yj#*MOpU! zZ9kz(73H+|g@~tr2|^Nqjjm7-pJqj$3mMFks9@hhex!np6qB1MB2L{{ItwO!N98lU zPf9fFRjA)Ml$Vn3Od40~ZDgASa^$sHeOzPRRms=e&H--OECWriI6va-HHID=f?NYAffs1^yt}K+L-O;! zt?v9#h=2xWx+!9nI#Qb8A3=TQnTWB974X?U75d+8lH_pg!&?ZV_Da`lB!`2AAkGyb z&f^`E=*yj5=>qi$y*vfg8{z^(C9#+=#Z1^vxD@R=KS$JQ5h?zd4*8_Z=$IPC%Wn*v zY#5Gd7f4n6mzxCdiOPVKJ`q%6g~eV~n6N>c@37-t>z)>6C-SJSf-ne&WsTjHni}=5 zD$_fX--c76&d|C)f0UJpI90#w=IOcs{<5DU%>X~In@_IQZd)D#e^?pKp0N*bA)e#A zjFCv|?VJ9Rd`pT_Il>Q)YfFkMy5WXQ(L*P%_o=rb%WVt#$GLg6&r=w73>=JcD~E5q z)9BB)GlA9mhJjEszA&Rr-wCZr=UdJZd1`7DmuK+9W4xyIdAvknANX0wr2_fB{}_;Y z&qOwAA_VK)&8hQ(y|b>k0$fD75IFgI?9oM|jhI{8vRCfeUkXl;x3)Et;HgF(3Xn&T z)9_>sSXb^E>c40E^i&q!+HC4b3Yh?2o%n<3uy|crd}m`nCvAZeEEX)h*OrVf1tUz7 zMWjE`eY0SPrsjpjr&mb#4)=DD>o~$=ceKgy-*5-Kv0fO3wHmsp7l=Jy+|~Sn^xjcl zq3oYG*~wk0XP1Cpv$b!$4bqV*VFxv;e7Cp<{l`=o@D}+%jU}G($Ow})6|9qi9q`Wi zb-}>>BCm_M8i5@vbdK1bQBp$iS~#IryWy8{hQT-z$(#z!IXZ#II}5kH>G=SGO;H27 zEThO&IV2M_X8d`u=FoAXz;(0RpYHt3E%3-nIU<&?T6PnG3w6!MP2O3uuX5UREvrm9PH$8^qY9k5B4xC3M)xb5DlD6Z>)OhOB+y7nqr7mlYzux2E-3Zu=xk;Xhm za<@@p?E=h?3PwGfk4O+Y;c== zZ-xTG4(y~4Jl%_RyFGi2S&{|OVgep@rT~BHX%bbvt%QKQ_ME|%mDZ8JIwcqU|_KkkPJ2b1adLW-u$E+Sk$k|mjZxZGcRvYUSp-jM2M0`y0e>aztdx=7!4c9JrDQ9hJo z?=QV##^2X^xQ`0X55Vg?j}O;Vz%D^fl-Vx5==QfmD-GN}nH$5R@o=9yzM2isp}q-v zO`1`uWIG$pjfEj4y3-mo`BoEuyO{0C+N~Syn)tTw1cxI25bSxQ$XLpF@%ToRTui&w zN9605qh61Sd1lRhE8cf;rL^a=^Ic<26cNJNVhwwG^P zC%>$3eE&;L$UnT@uH@w#Duz41(l81u#U zRgGedag=Gu@2m5I`_$4f-RNOvV%_haO-_S?I#P~J+PkmCr-c>}I7t#SKJq6W#_@ z3H)*v`weIv=ENnRQfl|Yh(D_q$>RO~8>*Gi$!=%Ky#!!gZR zL8A9zRK7s}Gp&NX-u!)m)~7#CVV2Dy8R7Iggx`aH5TAQ4k6e4ezF8FWYUHJ{RCCLU z_{mfdi;z%8fN#G=)xI3o&7-Ib(HqCwP?f6{%;^!wfH-2Sge``ULOJ+HfwRoGxD$iG zi4Y0W)RvG{9$3e3jkxH^-0vNtvOGw)SY6}y`y0o-HQXPi2&4yADvGEVg|IRGuHZw+ zyU5!%*5@n@)jnx@qt&pn=4OyN-ZNCC6rmjUHEYQr=(FZo?IC@M-k@p==hAy2H28q=oz^aYLd7lDPd zmAjqgA$3Kw778i-MkRG*Hv?WeHzZ2to0`AnP%jl#Yuj&sL;smCYAUe%%|9jVM~*cO z!yRLfqu=wpvXP)jnjE2;w-d(&yyu2cVpuNOCxzWHjYT54T;%sUs@X24%gp9cRzmh} z6pi5+;wyfrV>C4f0?CDsSUo@A;wlTzA|L&P7P7fDYm%d_{7n-Gr?#c7u%9r0Ny3d< zzlu&_nD^$RbE+^U-~TlAm0SkCjIvHEnMjo%F@{yG&@IQ&8$C`vl7Cx_D}`SC#GMfR z0$X^z?Ni-g4W^jy@0S`EKL`H}!|jyTKBT!alN}C)&uHcc&D|N*G}&}BZ2VH1%rX6j zjDGA<$tWJvHLpY$zAr7d?ElY1<@qAn*!e6f*ox;a5>cT5jY;#dsF{dXTp+7QGO;BT zbjqj7Vmn)6)6L?(=s>AOqn`x23J92w?dy! zr-ZAcf1)0p-g#`_jH0Q*ZN|;riCHGt<{o1UU`hOncHQpHWix$o*ZP4fH9`0$zP&ZP zpt8JzK!wZaAjAcMVv3z5TdB&QLzd=7ttHExZIeXAFgvX>Us*FswAhOIN`!ervYq>9 z$R_CrS;g!WOU2KizHiSIK!}^~@-@=mDq+V@EHBiO5fWUE?zoLR?{&4Sv}$UEk8}v! zYs|+C)<*bVD{~Wu0U)zW)>^Qn@crGwb>#`5bX@DgdTAOo!@bX(2qcpy*M|J8n*m@4 zwjVwceQgDOJEoFnOdE!*bld0=q>Y04MK022TG>1C#J#_yF!rp;2TZK2P|arF0yq5H zDa^@rWVR8q^Y|EYxe{V0I!TW5U*h|jYXs+2t#}~_BZza1kVyXZ6Qy70FtK+yertbF`bGoCX2byw?F!xI< zB>l$#8yjxx$-I)@Ia;Dy$XEZP?>r^dc!$E`6tw=bQ$IVX32KXHre=?`bS5ajY_BzME(b_CXbw5H`-VpT)u=>JIZ_;EN#~`ozJi}-0jY#f z|6UEyYX?vJ#n75*FS692P8H!2k0QZWu`XZyY&#7rj&WlLUP9OC6f z<-Er#=1Xxg4NSVm$b9IfTS=YJfoxD>;Q7+W45pL#pwm4rLf~L z8tzTcq3vm;$iz2k_xVA^L$_|@`{vF(bM~6e&7(pfUw%GG0ax>Nuu6D758-)nRBx@1 zsy}oaz!?a>!#XeTN2ue)`ojWojN&CCH{k7vh}IGCWTLEZ*x>-Xa}y2eE}LWE)i^To z8MwV>rn~;hOcM{vznQRg#02%8*LKanW6aO&fpt$_pRa@M_(=7X4`I8^=tWL#|==9-hF;( zJFDS_;gAM;ufxrRug6)C z*m+K1{VV*nZ!gs84P!U`Rl9GB?MiL)`Cz!`hTYDj5-2+t)RkrK+S$0nd_PK96T-<# zPI*E%Y|;Rs`Kj~hb^032_gVMe@M{z*b4`!@)&qy)IPEm5&o&os+xC4kUafSFumgU{ zfy4;1qadM3vielB{StpVXWf*nx;)s~*Gx<3ToSx_k-1FxiV1@<&src9xB zL_?t0GXSjhw#{Qo{Kq~*+}|{D%@{W$%UmTRMHY8tqlG`*o9EF%eDV$GSguxxd!{N_Qd%V9 zhXIjvM3ox+N?r-~r<{5}w|s6;=1aFBggw4{fu9+;ZXSuqVo}?N*d{O9RfS-&4n|Ja zv#!5cLXa4G8~Ru1J3rPq$;Fj*GK5bF*eC7M`v~g=#%SVc8Bes!Mf4(+M@EuE_B_ub z#nZgE?2h$#$@^W;Y&Wl`=$f?Uma+1b{y)mzGN`Sv4cBdFQrz9G zxI4vy6e#ZQ?of&q4esu4f#MQ0KuC7J@9cff*|X1|^LI@q^JXUVu4ldXbzf_K^Mmxp z)s;>qHb>C_S2?=m$jN@2jHUH|Gtlw(%&*dB1}}@2s$`O9)LNfl# z<(d_HTCE%?#3yrSUh4@;qDOl-R2^G(X)j=&e57}Wye z0eB=imZVzPxTI_f)`t0JP?J(NGbw+ z)&cbFxxBZ-$eqdiCDKsE;n#QLUUvFJoyH2y+gZd535iqMkom;8ouVkBE*&=f;`f99 zO&)b%Z{G~`4btQ}bv&H|%I-T6dpEaE29b6~ydI?u760-k_?7;~h#-ptJp(^_G2>sV znBl(|ulxL#n1X4)v6&$j0Iz=1GL(znJrEBUAWX)6`4`}sM?xwWk|MPFH>9Y2d28WP zHYzlUWt`E32s*zIC9-?J=3D1JI5er?3$Wq*Bm9L!sHR-qQ2!Vi_)$kCCVLRMjGnb} zh1IDLL55xIh(77a_3FTy`qSt}b{dvpcY+|<3!f#(Q5p!|1UmXj_(manG2J@3jzK_z zMl-UW8)43qkvx)it!#!Ldlu*ET`eD|_d3x2C$!mVZuAAiZ=-t`o6!39H5=ituf>JB zU{O_n*#F7JmMT{?Dfq}D+~#FanvU1t^WjyFfZ$m{uHZf_)szs~!*?Pv%# zGa8aP1?>9B@DET{)_5F2(r)l!1Eqi=?*;gwzsy6N@f?Ui&>|^I@p5etVlLCR`#wNuvyiA#V zE>~F|dX{^ouk?7fzh{F-KD{=HNcKo4;SZ(j3CRXbwmpG88u?xTytiMOjfeDXBve6>uxE4~^0uh8%)&N$nwk#a9q!>*-$)pK=VN{JhmRW6e6B87XjYJj5O5L}yp`AKc^UK%W+iF<_TvF?o!WwT zLxWJ|`1AS(#2l`D@>5a|xmC!1)_!k`M^xSKGZ=3ei?C%hv(Mb?$`MDWG5tXjO{AcO0`1Q($Cojx9)4m#ZC!j(T$T@*AlBsgBjX_qw>F#j`VV-mF? zKZi}Z{mn+t22uzi>YdpG$ukG3@KfKCk-E)OgWoyDzT%=_2x6O3Gp74G9eE0?V^JMfL zBLpi73GK;O|5A>?8h$9wg?~cq(0q}$fM08TL@!7Ob)M2s!YP{`2N zi{BqPA}5-Ovd}Z`Ve^@@8wZsJ9c%`xbf*oN-tBOkQqp&5(tLr-iN{3GS$y*U5h?k9 zADAZoQBd;#Gl}w-8IX!1DHEjj&}bt700kV#&uj4vvzPnQftiPy-RO2@;V>D2loW2_ z0Xfmd1JLUrF$KRImRb1n5?P=FST?R-S=MkRyrsvShC=77%gjdkHVMtG%MUuMw=~Hy z;)cv3FB*2X>rM=_?p9ACju;LGHt|;DG}tibq}`&_~7HG@V*Aq3gK0 zs0RIp*MzNZa5scj&1+NHz25b}2W8|sU7!AK{j_zN{aBb$QnV=J$R1S9|8kzI*VPSe zFI%QX-oIW7wMPqZP{H>GBk!9+rVxieav;jcZAQR-5T47)J$9kpboFc)gwJM|HJg*B z0cj4Zv7(J0{}`loaVNQ9^-!la$Wl1xPC(e&2P60u{p_ldJv-O=*u#*vK7{l~y1m?G z8~PnTbPIAA72bpO=(E z{9hCFE^&sxo-nb%n_ArjG2cbqBMZ)F>2)2!cfEb`wJTgfir(^@YP(eh#Yyq}>C0Sk zy5wk&fH0buY~bu7jRBD)SGrf>DONT_a6Rx8MH6S&-pON+xflr_?vkAl0wW9PIe2?H zfgqp};pkZW_DvtLCTZ&@B9qp=5U2T#wEJU_(E-bNKRxi}Pd*0vFE7w$=`bU*yMQnBXc!QB6H zApSWlPaJb+T6l*;mk}u$(0P+fUrp~)vCCqV!^lEQ=_i^o z`5jBY9KG)V&p;Gx^F%*wRf2@$YaN}iyN+sZq8KU@B;;AeGR9J5dv7HsHhl;~A=04t zUSZ|mj2gWTDf*-_9qhetY;~nO$ZO0YG=8uRx2exZhvu=efQJ>tVSRo_Xa1q30K#q~ zN^VMEZC784%+~kgWVxA4U@c8{_lsR5h^1>?W}N9;m?5_aM#&@lEp$X7ArNSy$6$f- z)ou0*^x1ppF1w~#!79gJ$>)wYFJTbOG?G;@U)_vepjxA&M=nR;G_#E|sWB_n9dtho zgJs&?XuvnTDfUV9?Gr4w`PHv+V=FdM>{ctv71z?(a{lac^0OvT zQ|XWNdLh&0T5Rk%3^s3o+whB_TUt1~ewQe_;hzue`psTNaCuw zYTbrel70v098Fa42aXbPf>h3&4- zYcDD+^-)81ie@)A#XeVFCgA0z8a>XY6^N#+r;ZnwFZ^2k4xKf0_1Ku;BTl{jWAOEP z=^m7Z*Q{4*?9!+tT3%WDn8GB9>05g3A(>ThtY`E&T9sSFi zb7bpA*Bxvp@ z%Oj9DpbjE$+)4%_cPHRjtm^~2681P!;7kHus~c6l($`Rx=fgN1Oh;^7B4+_K&muMy zSzZrnCTW-LLe!8SX{;jMB!qFTL&Y7>y#~QpoI2k=&qtxY?oLqBl94XEdM8^`X|}Bu z6J1=^cvX;cG~x95QzxEahEi56jf2!5EyB2umFOR%wTceYA^NM`Dgl)lT5`gi7C(Yx z+U7ObZHNO7&LwDICXdS*h)AlP#of!Zs*0c&#x+$|Uv}OAc1o4=GMh6*1UsSm600s>w{wIs1>6-TH?Jlta6M*hn56`GPCDv( zx{w)5Ws@*)Af1@n&2=GcR2gty^8S)9G{P8tA!`hql{yNv`rN)qN>2quGKUy6eq8>0 z^j5{!oUmZ~@w$NXbOfbV7wUdnAcQZr^&eIoo4L4K*EWDucr_i5vNSp&Q+3;{{NW-k zXL5>Ee$A&#rt>LiGblyjf2wOf+Ev$OL*IC_TIgHxV@^17RH zq?h9Sh@|k#JuK{74X{Pho7n=EL=FqK#c|Lg{7hB zk7Lf2KZS7fwkZp=2Dm$?S z76xr>PFYvO@Jg9SV_~r&E+E!vkW|!V{1wd{UVVETX3NgH|5M&<@;iOAd%((LCY@xp z5CHmeoc2%kkRHAyj@`6Y-H{^V3K`G3c(0nTHri-<3x+_qpy3pAYjOV4ZFgy)#oDOB zfdk5kJ_3}MOFUx#w`m9bX-w>b(ZO(vP`JK?8%&+%U8_JjTS+nlda*8P_}Ul!c}sT} zht4yU!38ZEENA|moYT@ocD)?~Quikoee(iw{Pc(HqU>_f-_f$7)H1Nb8Ev-ELK?mu zRyq6rJm_zco{dhcZEar!ga*Nlp}wneIC8AyAV8vUYlRw;V7LSAvC|@5)pg&hR9HeX z$-Z0ib^a4}b3$E=Ey&WEsL4J7?0_{mdIC~U;cGpBwK33fkn3CAdABLpxi`S6(0nXna`$NjV8=o#1uzGk|(XgxT0pWp{|SH*)e;P+`uB~LVe@n}@k=ZFljuWIMn zmG92lzPbFA5@xD3`W1Yx8<)0pTX!a}{9`m}4lPeakX`3DmG?I>ILfe3K;ILH6#J%R z3;OLb&5I^atJa`K@bjy0!p+yPI`aK+En&xBqg>G51qYa0&{Y;I?a&AsppmMG;PHEe z2%BR(pO@eBQAYcjpX&+8(Q_uN`Yi zUX%G4F1RP3#->!~vru(enaMkQy3$axg%*~RV%h3u`I~P6vKDB272Ab^J$Yp1$Cu+V z+3Gn%HmlBH#~4DRtgbt5z3GB{eOZ ztMtl82_>1&)m$@N40a3kgJfp{)I7dY)UFk!sl=t#(|R7&+~gE-|4%w*hy*r$Lj`wh zuV|j3Oh?yw2*0-5MSZ?j#@HeF3q0mDu<v|0Kr9}UP~?KS)e>>9(0ds z_9ces7}>hWiVp95R)Pne_M4Do+pB6W3z3?XAqI0ywa zVAyur!$<7YCItK4H;Ziy4ZbmC6)NxcDtj#!fQXCk5jA(wL(HJj&IbR2T zE8ibXNha+725^SgQO3nB9S=1}scVjP9M$csy{d;?yDHCRY;T{O>43z!hj{?tSD(?O zd&O`nPj4Uc&C|9ffC{w=m1k1-piIrbcD_Fej|l6Yiviq|e_4p+uG=%Gl8c>r1f#*& z?wUIjSbz5q;@u!7>li&1g4LPuw#xW<)O|HvNzu)6YK099>_H#j??OC_PmWEBLPk}dS=dTfMo-j+Bk29Ps%QW*sYfJ&!3> z!i?^ev&a9P6#jHDCwuYqqU(!}K4R~u$s8~=tqQW|M~iLLr8X|hrCeuYFve$D5a3B!y|DinCu7F!TNtLerwQ{7b`v#T`!3(rxRUMzUJtEG7<$pl)On%&99FkI!|?`%OmX?>nFEJng0+; zn4WU$jIOa=H_%jc&DlXq6=wCeogsBQ1wlJ9SWZwbJIE>pw&pJ+&ju<$9$oll17$s4M%pF3&Va~jc?3?Z-t~_al z_&<)gtzlnuJAD-O+G_ym8flviMvmq~Yb z+s!X>jg-50MND_Ui}C?p?!UHqf9{Z!NhVT)BekMn&pV&~N&lD#?zb@&;OX&+Vu^_p zbSzE2CCX1T3S|->bb5z4=H+syKqUJ+&-fqxxiAhpF~InxdL9;$ki}XfZGJSlyfRy? zacdA6e30gMdvY{PzlE#}UP;_sf0m9iH)QC^&~GvHR0 z*$dX7mo&FWYt#!yU2aaC71#KSjcv3)znC#x!mIYW{f#f~Knj^k-GIR3cpQ+@D|-la zels1?BTt}4yJ+W8*`ztNUMXIy`9_y@E&US&;d)_=Od>i24X(Bm68(v_F zCg0h!maPP2qcg8dXuB!niDWY`)f8e7q`s^P4b<&2W9SOf3-N;2^}HCs;a0iFKPT5_ z&QHj_43{kfR{<9pcYJ2P8wh3uqeV^)LApBFo$)9xSn?vQlz)T^V>~H|Tp*j{>)aE@ zzh9J%UiXMlNxaFk-6Wy2#s{PirUXSpGAa|1NsyT$VSit`B3L8v*-wlV|);>9{d`&`99|$76-NwII)y z{WL*Ff`+s@sHrT>cXX*raW9aplnu}3HyNx@2 z4E4I~RrO%oyNwL!ZoD45N%Z9jOC{cNcBEe%xM{Nqmdz>CBRwBXtc+Y?=z!<`rDQyRJggb%Fe;jI}342eU`4G6NMITe2=(m zSt=RhXn()qzeFX(e>Q+I%wk}ypR!mjzf8A-hassZQ4}e=fI#A{hF`yK!Sl8508eX= zdEn@noM%o11Ts!Vg+JFg0=`Xt1?Xlp>+${9fG6{G)^5Cta6&Mi{giT`^mGK*Z$}R) zu_HxJJSlL%&ov5;wnOZoeJ!6q6E2Kf=(f9=L8_xoEt>F{Lbe^QO?NT~&7%mEYrG5*HMKF>helE2{^0%n& zeA&}z(HxJhUMU<5X2_fjT&7S{)#Ce|PS?_N>Q`<>eZTp=CMWL2t$BCA@fMuD6XoLd z9}zEBKk#wD8zm(yWZ5_s^M96&6R|xk=L4eaM)8EUyZI}Zb~5E}nBW~- z*89idv%Z`DD9v}$yVB02%SU9V^M+44Z?sJ5^!^?O-E{Y2%;tD)C2)XXl{d(VMs&j) zjB^#^KWxQPc67V6=vB0UAjb$0{z`G33a1%Ih@B>F;&nCsectIt%?-uAIxxGOa5;M6EQ|yuvG^#;U6^Id z&8jag9IJl2X!Cq$v3dSmd);|qoQo@bV8t7dS;Z1Q=UbG4 zLb;<&3>?H4O+S15(tVz)`rVfoUJTJ(d=fp9J)#<-O2hSDV1G zU=DA5#8F#J*wVgOoNv7tBtqE+Ll{kvZ*A8`+Yu*Ei@QK83NQqKyaRsAg_I#E5r1oC zq!e^1JDBGltCz4$%zAWifc}|c7HW?>cmeUq4zqUCK+y3xFo~}7n>vQ31KrYR!K3PM z0r8HkFmjTg)ZG}H3DO{8LyrYb8q1*9~1-{$s{f&MIokBe#cR{Bf%=Ze4{zFqH8{|O%)8WW>?`*=8B%=kOh zJ3!75khvV(kfXOU4v|76tZ&)Ry@2{v9r*a=R}VQH`~O{Y8*Kd8Ry!!$4DBiLk>^lm zKY^mWw$}K&ec8jm8nWlTQW^_I?k4J_h-Jhj_GCCBiSe#jp7Ysqm2?X~E=sxsg=k%K z28Rx(qI%>*IcbeO*W#{_iMdE#)TL|xzBZh;^WQ?9DkqOvw5&f2hYzumhpf}-I4jV; z9a2BH8?0VLYadrk5-YXkyn1}nqKwbG{#{Zdr}MZZnzWPEuizt^JwbS6WB9_R(; z=y|wCo{RAL?~ccTr8%9Au~)JB4FnYTXN2V8f0}e1U8^?V8zhdp9_mNeMFJj1fbukh zMKW&9tEGQPznxGJ;5lFN3L@C`7SAF}KU0r>gTH+PBmsV`a>od{*0o%;piq?jv}l4c zmW4r|u$3B1=7}CIFVc&BOWd^^W>BC~UQ9q#DoFLO0SD!;UJwjKKQ;T54g( z_YpNe6%fDSmot8-;gGUnug<7Uh5~Ky|RRF!lWu< zLeUIfpS9HXvmLN_|5E~Q7FW_H5uH}n^UMRy{(n0}MAae$mY3e2RB< zcI`QQSdKBmTKaL^RE-(>3Ep|XnT90${QpirNp+grNxwqw7B77xvE6qIxm&~3Fr;gn-5jJ1rp{RQmg@woNl+iotO4r3{*Tb zi9H;-_XDU()1WvWFdK#M{|xY3Ke-nr(XYN2tnjIsm4tgN4;Z;kAhw&-!pjz*-+Xt4 zIv&vt`KO_CX-@SV<@)9tF=_~>&IwTym5&H$ih$b(M>{EXG>kTM-0zcgk&X_uIIz2J zK7EJFB-JXe<5_G=!}syQ0e&fPl}``-gmY_Ka8CouL4Q64;ow%2n^g0h5cRr0e`mpR zO(`zEy)Tcd?JD-j-G@LFEw4MymRrikI6!Ko4Fhq_rHB;j!7UG4Aow(<1PicT22w6zDrtk>32@M|lkim~toJRSTVRCP?{QgZ7r~@vY+Q8#(c=2eiDmp}+b}kb+A8 z;cl$Uq5O{_E2jwPTV+TCeL^9kkGUZjNB1M^)xfvJTi^tOP2)j%Lt|343{U-d?mY^* z>>C`3uWuJ4UZQA1OzPDqR=?QnE;$sNgmPY^sqNqiz)|z`h(y%Y`dXS$YnYv3po5K} z60eSD9mI6)1E@(%lYmU^)qPUR`Bqt}Y$!uBVA z4^es9`z(pX&Be;6iznVQ>a(il`nWU}o`_3%e0on(#%oRi!B&%>*;RJ*(L*I}sW7a2 zdfL1X!YiK2@uE8~AL7>#z(mau-qx9)VSwASoE1kv=k!9LgvM+ei!|c(aeti)*uK={ ztIlW{6-~QfwV3g|O=e55e)0D;r>w0OWk>w;(U3$n;jAENz)ABiWv1Z$fvx~ELyyBp z*&cKlC44;>o4T*2#XZ22Y+TY(0pN}1%&Fbc6QH8aTL z(#;G1MBGC=t*`FyYdRcid|otJivA05tG<}C=s3`PoG;!Y=02S{L^(W&w>FLV{P!O- zHTSZhqh-?y51AOohmB+qcMyJ(0AgUNJMJt+vViTLwdUvZXG|?#xWqdk6?Bt08ladu zgBk;Lo=KerhRIm&n9M2DC9}+pehD0UHV!#yuLEw_%^lIeRXj3&PA6FZTC*rl+^%Pq zr8{Vr^`AiLrPrn{vu`UWQzxosa-yk-N~mbBB`*qL1&+j=G%L ze5aQlz_uOdCD>r-_7X$s{buEmlhucxmL~@4;$i{`!ybuJjA)9j7-SabH|8d6x*c3p zh}`?#1?r*F8t3bLhQpu5RPtD(462I%6J3Fpn8-*vX7AU}zP-v2Bvor8#9nfPtnNRZ zKk$-ph=!Ck?>sm?($iMs0N`!1q%WQN;&5<_Y*H7%NTFaIm1*^YvQ}eHh3p#?L{W~O zFtx_{E=X~&0BqO8^x`H3tej;23VOOS3smHa(G1nESy2s)B!v@3LbI*h9U3pkAX8j* z1LHsnBU$+7eRg1I)cxGY_y9?M_0iyAkKm!Ljwa9Y`|qE0Bh>bKRQDIvnh#t#iru$5 z?@N;)u0cRVuhbpEt0o*VI7SrkKdMplo8AEL0Yvv)`7S?)|7g;vuF8)y4|<|z?XFY? z+LgA0>{%(@#f*aJnr%J5+3}3egj=JAKWSp2B0ClvttRg+l~F+>;ObT@^y={62e;!2 z{6cey{^gnH9oMxtvp^qVqy4BnuAw4kVVpgHhwWY}FNWl{n>xQWY(&l|xOJlPH>C}& z-<3B^F^aWdlCjIOhLxe5(~?7V2ZJNV3~aqKHiD8Df`t%);lYNbBjeWEZ(0pdZMKV6 z7Z8q6-QYx-80ZQ4Qu}7boK#n>zM~aB;R@vtVB_(E=9#$@j^or_q%MEf<9+YMd~KYg z>&NpCB5j(5c`j;>&NZvsZ~U$Z36y6n%aodE;F_IgI}Gr0od5azsF_!_XE|GB4d*~AL&oJUBtUB z7WlRPR%zCi<@QU%N235&3P&%*iIV%S{&!a3Ko8V(!ko#;8W#RjS+ot!ikbx09pk5t z3=tBXUil%tTgmE5N<$q-WCq~f+xO_%Z|j%_Xo`nVYP715yiJnwe;V$lWKchOOk*DB z%^wG4Hqeh_ zmOMuaf~GX?r}BpH1HaLVal}XW!F91|C|o;Kw`nWS{9YB|o#8|vj9I$|Ii9#?E%6bX z9;|bq+=r2yQSB~+dzVm~Q5)7FiDJvohwNjz+KX%MG zEKb*6zLpzD$2tD>Hjm2pJP4z-LG0P4GcvThX}VRX)Z>B3S$>?&O27~&MpbhXRqF3_ z;fq#ltq^`&7cxxX+W^SE`QI@F*eXCF4wjDE%NNN1R@o*TL$K+1K)4o5KPmg7z@^*SH;v z1MNq^%PqicRn+RUmFPImN(B!@)tU;?cL-!R&_KSZ!kT1s5r?_8;f3lDk2VeYZ$Ybf zNyV`;UsVOcN)JumON$xa9%ogTuEL^UNL^w@`{S2nrD~W-PU%_0YKO7eJ=8RPtsf+g zt`U&X8_y12KY;)h+FdEtYXQGnX3YqPH?+zOD+SY4C?sVr`GkW>=;@=U3WHmWuZ-7+ zmArnNXme<0^pYp7Om-DdF7re!Wp)SaodaLDCZ}Qa*EtufzgLYE9Y=N>UN*gXofi;} z7;ZpJ=cn}9@70TAlYdmW5&h=2U9`y$*KGWd0|}yYIkcdehQD8cu-gC8p@<6u*!2Fr zS*SBggp<@A?TnEOs2oO4ll`{||Np|4jP_XTID63^y}GV*Y*47XN>NGpSt4X4scWj& z+@fp~IFi%xKEa_u{qQm$6PKOD>^^dhl^K%{oav28)3mgyDzZOwmuY7)_4)nr7KVjJyU`L zEtk)+akv1YQoIXj(n;S}^n(^`NJlH`zc>ch^$UXbS#e30c94-MT@xLI^SSb}Off4v zzJ-3%&=LVujpY^a@hJD$qpGYWm_wx{88{*l}&im^|xte_tA1f zi(C5E%w19*jIZ-BKcs2kpi>D}%^fFURfe#wUl_^|&)RuP^UBN?-8cCY|Aq)rNi%rK zZb@xG12ll05pJSjQR6z7G(+*cV0a`5PZ+;<)ERX8DZF|ryXL_2MDOI<*Z~PGLWc2bUFre!L|1c2pO}7zKHpRS z_1ekwzw5EmnkXHz=ehW+{Cn_fk6MSvmG2h9@e}^iU-24}k<%JhmDH3B6uIwe9N$NF zi2m?l(GP&&ElXuZ5WTgN0AJM2*^#o-Xm!lMV{!5iAVSor4H6$a9^Z6hZ zLQm)i-^IzUS}JW_v(IvT2FJt~Xvrn7syYnmFT{ln516!k8`4` zDa6B6(uH$uUGCzI1(v8&lNjca5E!z)x5Ph^nkV1FZ3x01dhyKJE>4Qd5W))kQoyo{ z_YY{`hYyOd4@5NI;~DmbBLoa=G9D&98ye<-xVHgkweK)t;m+BiD&_t#ZKQH+5FUcZ zp>UAnX7p+I7yXUTvAwqH3t!2(^8Qz`$PUr*m|{LDfvN^lI4-w|(!drLseoF5lNa~> z^Fzf`8DRU_Nxkf{1udR=oec30q^G*q5M^2aL-M8kKeZO9HW*}8)#@$s>breD^c6;s zSIKdKslcqYwt>awxdXa&4GD{5(%D>uQ;^V8^;D@g=y)L|hag`o=@ipxg_qcx!{hRR zghbqFZHj;Nl-i#$q7@bvdGDMO@t%@vA>?$CMN`FGqA(JmFYm`LPWuZ_+&u;E#svXXuI{*4 zT05&S9od^uz=e!{(R^I3RswC8zY(+>{z&T5S4J(e+lx;3&9K5?{FTXLYu704_emSg z%Q2w7v_fbDx!DGg2h$jvMMEw_G==S}-%VAF$T~Fa_YM2FYKN%jY)nYFG(&)Vb!?c{ zD24$bS|^m|-9z0)fXHWTr%If|785Ndt^a@j4{WU%SLgg?tOH zllk}s$))B|+p@GyNT!aALj=nSz8oR$cjE?L-3nOF)^q1qya8<1)*u? z0l^{?uW{AV5?Sy$vl3LMLdd?mH1Nf(9Ryx=o1)PGs-26Mp() zCqi(D5*7BxD7CXQlt@6IFt)MfH9r;<*tVZ~^9?3+;<1Fl1>yXnxD-;wLWIgvZrh>E zd{2E#=-&n%?dOVTzb?X0O7Dm!%nFGhFP7j-yXM)yysn@8nj+C%W;@FJ%@Omh(6o@v zGVRmDNI%aSE!{i%0uHqapk41YT8PUeJR)Z#0ah@5rCtBSbK$iRCFLv`4MAfDIqF>6y$OYgXC;6|u?IJpb z+G&;;pN5*5^>}Va$|Dfv#GCw}$)Kf#Ofrj3w)Xs_R51IXG%^>tc^<1(05kC{lmCeH zSV5d(=NesWuK6sIT$!Rxunp1BE3k`3ejF^+RGZT3phAgkJR?cqjSt)TLW{Lcjopc< zfMl({%tte7b3_mf&tInH0{m8Oj?#n_h(t9};$EvX%wHwpAS=F#ZPLG%+lemwk6>(uZc>601E+jI8*I|z)J;>z_se>mz) z#{*xYf@TnhJC%7+P`nnz+HRbkfp<;Jr}&}>)60R#)VCS3ArtLVi_Tc4{bMMXA)!m6 z*_uAqJTI-bNAAb!{)(R6K{w_nLtM0urSdtfXX``gqCDB>C2dob5@Ib0!XmcT+BpoP z^U{zt<+y>0-473S9tmxyUD|xSQ1z(W{^?yn*i_G$m`xn8DKNy8 zJ{rLThkYJHv=2E7JqdB1)elkg$ZO3so5q4hDOf{&-T9v?<&qjoeh^(c4Za%=n);!n z7es@(Nrc?TV~w+y%HEQ48Ar3+9}2yvJ+LNhhHtAAfA<9|@{w1`7i-#Sm38L+mVP{n z0~TWAH}}^sJS5l^eE3*qO&?@Yin3)}cxAHAp&n_8Yd&k(@}v9}co^c;^QV+q{+4F8&N6hTwW#vqz42<| zs4pD|6J;!>$1QpXw593W>evP0#&u3)@QV2FMbFKB^?o!v{_bnQ_z1uw^2}wTp!?4k zBee=2(Z8F+G~JP=1xDk969xtNh2MSq(R3PRW^;C*^bVUtH6+a`e0%ppQLEu#F%QTO zqDH|PW)dD8W{nL#ZiU>`ohTzI(!n_}Hl(+H#l&W9gD4SIN*ekFO*zzf7+0lwJ{A`~ zyFWI2Fo`hubUUvO0pk(E0lwNOHQJgv%I||-5zFKU|H2%rU3j~yhQ@+vs+PZMTVh76 z+A~TUVuH20i*HSDPKz26qxB9&ElRa2nQrn|m08snsx*(+wF8M*C>cgZCJXRUO4TUt$-g8<6xj#Eo0RgCtHIYE_p~Ou;${I8TJMjQ3@e9U&RXF zidFCGs1ewHl$D||pN38a1;&zZIS{=mlBQu6N8scc|3jWT%0Fw*yr zBhb;=Eo_JK>iMYySk9w$$}6PE+9KcEQR|*1X{xF8K$uKO1DXCaUe@_rKDx?vf}(z!tII6C>sU#`d7I5#So)s=HJ8YA3%^<-#tJm%pP^1V&k(xP z=7tRWtGf-T$=z+<7@6Pg-RxLwc&DP@@uf~Er+6+~fHtiCQkI_Nbk!RA&s_w50$H9K zyX0OT&^F2lcxrLhe-)xvMiMY#CM>>DT9u0$qo?mg!euP@4@U7$7s)k)Z`=tvbSAo$ z&CU#b25FqZ-v%e)_g$$W1M+Qe8v-p1H2s3kb`SCQBIyt9-xwgrm5b6~#UJLn_%^SE zJD^FFJ+c)^nKE z@3=(8*33=mndj1>XK?8(*`2s0gkntGav@;6gbWcWB+)kvuA@dcAUYY$Z0{!*hC<&m zWAnH`o0AEZgv9(Y>%?fu-f-*`EU8Lj@Pj-_qeB=5~w096y>Sex8G2T6eub0md=r0 zG~2a721{(}wx0ZdS4$;)M3PbBds2VPzQ2D)^A&cGt2j_2dhb+F+pXA$WY)SG-H&GZ zaOzeUKDH|%h~Ke4s(tle0pc1FVEuBeTpxy{-Pz{OdpDNW-VfbJhy=l%cIV>nAUl$< zxaAoi4#w$~cffncS-7$vOz>H|yGk(v1GN8}nyKkW*GV0OWv}LzQR7$GnPyd+^$aU_ z^$)gt*VSaT|Jok3^cED0^)EMlFBE}4PV0}f<3#lWQ0{d!R_|zl=14~jY}sgw4cyq^ zkDJ2#5Evox5}@~+)od@gE`oG$8=V&x1~{EwIT{_%F3s^;(bY2}RQo4ii$?KdI-R!( zlJk@8!$(b9#Y)JifScxU)BE_Q#34S0ngQ)_K-V7OkwQm^-P4)X&U$JqC7^c|o;9)9 z)>)#(;R79Uk|P2nQ#t;H>Zg5ffOKx@y3+XlufZ5MHe zd9A-b`0HGeE0|u{G?*n&F1;y`s1yReIt}U!63pVf#HOAPS)n1+c_=Y%@l<4MC5!JF&DY(zZRep(D!)kI~LDuK2e* zjz1wZr8i#>dk%085SRDYvwotpd=6DMS@tk+*?Y%u6BRpbU9Dv9eUp0c^~*SF$wa~U z0=6ZtkG*m7e0qPr%RV+Nb&-Te>EJVv#`s*Li)gzRw0w;sNc=-A@GW;hoR%;%6nU}w zH&W*3j=Ndo-=~<@Tl5)Pi8qqVM)?mQVRFEKI?2W^M;ETCaG*q6R3f%JOgR$2?l`}) zn7j68fW3bWBIr}1-_UniA!xr%JlMSyjP-@;_HC9Y{gSe=fOzQH-}x$l{}?&Mqj;Dn z@rY}~193ffJO37%*`$-r(DzJFSUEewW0AodLf7*_ZqJr2#3f3g#rv@XTrOwjqA0nQJV1M^{$DHRquwct_E|`dS zK(v?d%!gRi8{_1VuQoAgr_ooPB;jZ>!3n`XyoG7MRx~X=ud!H zVMpI}i=y%4RoWc2@3|?9A1k+gxl(0CSBgT4L&!q@?Twtw?N}5?%I|l0@SL%W{%3)@ zrI?T@Q$M1we#!|<#0iJt3T7%jV52WmS1R#-V?ZT79LMGXV20&xJo=TpO2yy>REwrIX<7>K5{dDZ&9NUpv zQ2lpbd|l}lw18Ap-Pf*$P*3W?U1hPf{7>-3=IwCf8ARi+OP-fmzd!>h9@Dw~hPPE( zVnNCQpEH}cVyA9qN#t#nI_0;7U><4+_ZtZlC)&SAVYm8aCaOzC0?MW2= z5KcZ_^Tcn?(h>-3?3eL-1Ok-6AJ1RVZYi3?IU* z?`<$^KA@x}y@+K{CD}Mb@IL_NKpDRiq1J&H7dtiy;-L6<;j=CG@U@Qi0!C;XIupm| zAmR|>f4L$=PU~j>Genx8bcsx)LHP976-xK8{`VVy#Fst-d+LXeYb=TjNbtmHvmMJaU(yDhfu1R&d zXo`|?yJS|aT7~B^m!xygIR|rRNBPii{4p*bQ2Ea~?w(R#1X5T0{fH~?S0JnPO+mAU z>>?hdTd(qp+S5A{SH7}59dO`*w%0Hv)izv>+*r+8B@Xm5 z-MkyKa4yshQ0_;kSnwjZrp;QyA^We>{`>Er9>FW8c^NVM*HM+9!|C$hf{a*crqf<% zR_0}TqnHs<`yb@p@s|qB{yP3+;Tzc4__Qlukg4$F))-o6X=3<#ZAtYrQY!*uF%JJH zgFkHi>96g8ZIsDAS!w8sQ#JlKR{Z&ss;mE3ty+zj^1UaWKlg+9>=!>k!T9rs73DYI z_z&+Vg3q7z-@fObbigZKiG^!c9{(2W;m5z(&}aP3+6gzHMnD)G+ckjX<>G-#Rru;q zg7)?#X|MlyhOn>x;d!?l}UY~Y*(TiKrZ&vHRDDiih z2Gjcz!)%!GZ^N;npb6Xs0f%k;8S}?K`bj$S=%et+-(z_1*fcx1!B2yYHU9mGi$*e) z31nv25rHn!+icly?H-FQ(b9EQXCunULj8 zsoQM5b(%Ntf^@<=-huW_Z-|zYsn69Yw8>E~*3f^mI@$z&)C+1U1uy5lO2i_WUwr@D zzx&&C^Ua@5({Y}w#6O}y|GVNJRx*m#iZRwlj497}LqrP~4_oyGVE=-O<|eN$p+K`u zh2>I9O&Tk#;ZK_F#QX&poS#lV{d9a*oJT5!hf3cRdx1uX1Y}LDSZynwVL(nsGp}JF z=(g3=cDarJ!yo-99rK1aq=z2*Wtxh&KNSCM5^53A2?}Z=2C_J@Bz$hXQxq%I3DTJm zW5u7b=F*0L6dyDGj+^n>2moxX#0q6l*GVweyAtsud|mj|!XZ>GI8@c>f7BcCk6}uD zl(TGYTd~FP8C&~;Pt*SzzbpRGQyiFp|Ixh0M@+DQ3_t$c{?pH{{wKY+AI$vH|7%B9 z<5r?SPuJp+xvg;@BwLW1w^l@*2^H0$yFm{g=!6}RO8D5*E?nudVzsS!{qWb}ai)d1 zm+OOgoM{HnbrYmdYWv^Y|2~A!UeFlRSh)C85sChxlq))>v(uLn2B$ts&|s!K2PG20 z`RvtIix;Hh@KFr8Zw<-CUmcLD&cS5f!QWq=~XN+nZe)_?x@E$retF8sj$=@kj3CPkI{oKy}!HkJj2DMEpH&Y-}Nr zrK-qwfAEXE=xr&N|A>|$&K^)ik0bvx4%8zcE{~@h>O+TUMoZA@gHIgAuF~2 zHnmKf;gb@<=CPF7Rq#WZv`BWtxZ=+XCX7Ec!l+(+;sw6Oi)4&KI|t#TC3Mo(vHPET z>`2XzF{oL|@M-6!@IT_;#<#fBfL{M?Oq+dd2M>8f3j1VZPyD%a0w*RBd#M2lRMA~(r;Yn+;&%efHp6+uO- zbITO?Us}FAop#2V>6gEJ7}vLWfvdJ0wMP6gMiqbiS6BC6 zogRN;McRsY{c}%&6fH}k(k%fDWCc5%Law%~Be5rR(<=3a3`l^`J#{_tr!wuHtU0!9 z8BIm3H_*Rv@re~a5Y`t2H@${dxq;6;X4pPa|J(Rm+W*aq&#Q}vA9e^{3w1?$=}TW) zy1j4w5ibo8@0qro>Ou6pne~pXM*olHe=q)h`1;Sg-~H}%|M$O-7m4yd$oMW<0q#Hk z2ls#Zspv+=v}(AhIfQ|W-$u5_F)16$-2Y&YiiK{q61uD&|$vdarSdL@&-P@2gV zp$bxFqYx62*SshfUMU4Ha&dat6#@8stHsqdf}B4 z>5n|}NIL1HlhT*)!1YwTbTjZb#`rG_SJs9CorqcMmTB@fV(k?$c(QsF4_ESp_QD01 z<1=LC##1)$Nl+h;UG(rsX!_q<&yCuG14MHh)8B>v&_fTU4}9Q5>DueA$NeYUn=-Zo z%vk=%;$>%I988VEM&_PSw0F?k$!1X}8UJp4Xs%!bp0u&?eH^e6b{EpRc_6@P|Ky7gwH)JJ6?R^GgAa#KP;uUP_V9CHjw5#CEosS_*9? z?Ru8%Wz>{at8sPyT_>l{f8mR`ScfC7NDvx({6Uz?n2@)}9~Q3P5S!PHc)o<=j6;n{ z&wgE~zj?JdUcWg6MrpQHeK-O;=d_n)e#phRnj=_sK=U;Y7+D^|e zvIDBbZed3tS+OD%qBE@zH|P9YgD-Ypf~ROMyYvdYcoP@;^7!XZ2khce*HJiZ9X$Tc zcDf{gQMDs3YRH%O#m;k{HLcE&!Hv*qY8+joOd+aNal@18ipwugZ^AQ5jn$P3`lZ|$ z0#s6^U>T{ZRmDntV#Uyf{3)D(z5Vt((%awmHk7##6qCY#1-j*b08>7ec$S%Lk7hLs z7q_NB^#B<%{xv?!G?H1QqP?bYNeSDEgqlwR-#R^TESJs($tarwU$LO#D)qysi1D~B z@z=RUF|hIRpF@({uz=|fz;^t(0}gpeDK+bcN`{rVwPSLQ72=c8yuAiAB(gT(O$&dr z-@a+d$CsqtcHJK%Bh>%^7oy5L=Hwt4smIyd8h_!^|CVJA{H)gehpfgiI~f79^qgvvHUZ z)PO&}s(IR0Q`1d1-INYK=wSSwjVWwq)J7Pk!lGe4DOyyF4wAT{SIk_@g+>ti;g8_v z*~>1!B3*LvrD-d?mYIu=1{Of*HqWc`om#Zqwyxj(rx0Tmo#A&JsjZ!SH=lL)1hr5J z`w)qm>WJy+1t>y*9CcckFxI4!CN4^{)U2YcjSGCNz_d`7_{5D|G;D=A>S}yy zqW^) z<|58~!l7^6byqqTZ$w?Uo(r~(Lym*+Uoj({G~_l;%zw&=NIr{Xl7RnHX72bKm;*Ra zBMr%3ct;fxC*DCrg&e3sGksYv+COjGY3bHmZ%upcwU^qK4RyJ4Gp(>xvI!uYP_Ly! zFldpJ9_7eGwl}XO>T*aL{wjRE=froOoW6MbZD|{S%*Pg!vHj;DqeT{U(@P}1h9g!I zk~Qfq78Xxy7x8BsyGxv<=;VSgqOn^3n;!9fL$T(K2q0AW5y7w{Y_IX%Qem-ezy1&Z zyYTgsKqIglpLX=~Kk&yIfBo?72~%H5Xk3T?3hWY#Kg#4# zzd}bTl<}XOiQ%&u6u2saaVNoX(idMgvK@_p6q=8$S(!dEZ(e#2zL=hkHNzk?{uJiW zF8VJQrN%kRvJ^Nqoq{z_4F_(1@Pi+u*Wsew!@qn)=Z)D~x3#0t8Gi}{hKw`3_WFY( zE`AV}fwE+da4*jZQxYe~2K2IizyMKuUst>apCy`o&;hvlbaDDk+;bARmUBpGsug8f zpdz)3W^P3Up$>Gx54fsD6qOH$fB%1dUvF)^|9;$af=jne|6xCLZO~Xkf&XC)2O<-< z@!l*WATS)A9Hl7M{@Yjvg*qh6AhKjRw=6gDL4gS4&xytx?*`*T1qFp)`)}GgF?7zx zvBDBVrVR19K$H~t?0@#Ay^G8|AjSN5d6H!)>*k5+;ucIOvkMe9j(YLyR#e9LW70#X zjX$)&E%Q7@!Ia@xfP@BTr~l+5IljaxujDx17tQ#0;e*DYm_^9?)Jec)c=t^E&I1ubEkI z1~P6`BhPXv{o8G~rL)g|Z+Zw1hw3H&@vK_7(a?_y=weYy|Ew} zwafp(_%{F6tX-X6eZ-OJ^7)shJ@?!*Lp0)*sZj{OB6oUJBhUWRk}Ccb-$?V1&-`_H2+MWN|GMX4qaRhr9z4+7&uMHW>D zBMC`0Ck+*U9%X2PHSrlAz9W6(|xc?DEbM|&N#G50=VWHrvI zl={(+Jb2^UrK4PNDFwD@6tw#A_-H6R9{H-+7oQi6{$Q`Y)5rhmV>%7PmR-r!6jqDS zs!C3@4n|Fy?EHJ|vB%Q<`Io18ADO2|0u@xZGS(BuxsHFHIE-(f`DZ8Rp-5|kW*Jr3 z!0_%dtcpiEowMGvh3le=F2+x-Q`3wY{HhPz`<6Z4jy84qVnj71)gdFbuGeL6(Lstf z#=>?;{A)h?(R9{XXW^^ccm)Sm9P`itX#W8JWer5NfcT!f#@8N%zWBt~hZr;)%n!+C z3@%Ref>hID1S_*|f*WjU0lPoGX&M_}nt)LEKc=IOdNv1s!PqkXcj0eY|DVE<$CK+v z)7QWLwe-jP{IPXVY|Y%Ld2YnK9di6z-OUY8qC1Mx>jM)5Y(Yto!Kb8y7Px1sVp zAC|1XvLby-$@x76ZLBcyDLB2ry8N+yqie-%E3KIfeG;pW*H z4h?)RG_cL?G3oC=_Z&<%-BD&0rq}|&GVLP4cv=T2L^{J9dlfZ|_>(^fA7~JnibI0_ z_(T;z2fow$;OpE2-}FlT=zqSOYXi#GPq3T+h0i4h1*Bg8DaI%u=b=mGKliE}cN6!& zA3hwi02?m1ioXn`ks#sN zxTlMW>Y305DBD(qM%gIZQiQxb$0{B+#j}P-ek5CpQrzqPv4wg|GL+CmMBhyMzhce)#sk*P*3!11Jf z++-JngbQRoB|O3S508(50)y!J#>M9z5Jyf`A4LF~{tw3Ic|{$8jdT2MdH>=0Q2jsH ze<;BqLGN_4CBA-g-*Jo z*kr%VJXU>Li=c5yX>}e+W}UXw0~X8F_$)qlEMts63;dRjzxS1OrFt(m8>9c9c2C_LHm zuaol(Zk}|oQhQ1_#&{t5j4C{F@NhNW*0}2~>1v!KI_%IxdR!<@cO6|-;zh6`dXdKU z;P;AkQHt9B_>bX>K6B?@kUsjce@ru`W8s2p^o~hhcH)a;LPb)ge58Szq3T2mj=C_w zX;3Q}28gcmS^Q_?&!ND?oD0{o&wef)b>xw_Ihv274WEV?|I$_jdzE*N|6Z{!3e_&Z zb2+}@a7y|WK3zDiW8u}X4}9dqjDP>BsHS=1m?CIUgtUn{CEG}eqli&FNco#D-7{Ue zXdylXd!X4)BO+PzsCn*Iwv22DDOjX*D)8f!MvGDzC;p>&Z_wPi=ckW-;^SJlh{&VN zVf-(kY=l2G4k{{IseF%|$?iBX^oU0^^0v?7KO6sg{PA|9Wy?OBjymc{|72MiYB8i5 z`8dZv$6HTojsG@3hI*T>dJCV=E1q`R>FK9G`?SyucxP9pjf)CK~^6Q zibol>B^w$zAVA>vDb;ZvNvWu0_52=AiZT8X?7+{1nmotWIPOaQjmsK z3qtg=TH2uCL)Z1mc-If*=t|7q(ba3y%l6$TEn2uB{QkQfFxm-oN#cc^9V3u9%;uZ-Y;U*Z!lz^LvzwWUaBq2%mzF8i>ktG8{;Lyt*4}1DHOoEzEqqQ?it5TIDpN4&d+^Dp4@?<92qaqHi49{r`yWiw z`5y4x|5O2e^3PX|27d6_mSwMNRZs;qB^pI0bP*o|Qg(KYKgijeE-0%e5anWv#Q4*H zH8vg@ZdwQ!KsHM&8S5Q%XITq7Zo~>&Q){zhIkl-~IPt z;W{&Y``h>6sy*M;S4%L6s59<;`oDAj?J#R6JUfeSP|t8UaTtUKTFrn%F)xd0fT50w z7FeSrBkAS)zAP=q!nOC_T)1kZ*uI%ESA|@wgo4JLDe&nas=;m+t6C)hYCC1F3RW9g zyEa{flk*o{d37({yd)bNw!||2)Mqu6qnV0z{K>#~K5;w5Ew|w0 z{GT3e=ZK7K(30RrhE#cGGzuYQ;<;AI1dTb98>fCoHQ3E!RjUL*WxDsi`_dUW;`;VI z-$~nGe)Wz&V4#_evxrL3qq*SoMfe>5JIv(51z|lz$JRh%Cs7yMO47DuMY2KqR9cIL z>##!)NsAUON_+0PXRwuX;@ORD))~1y^hO*k5XH!bf~wLj5!A@51}F}TKe}!Nw?bT+ zF2sjyr}IHj8fS)iUTOt_G8WB<6)#om>0`D6n>z#g&j*n81(VoqBQ83(B^8j#@kc{j z5vYL`&r8iF0LbFiA0OasVso}@;&Y1F>x#&sVcq!jLu|MeJ_WM%Alpa6WqC||gL7Na zDDXKtd4HVwkDsfwjVp}g2kN<%#Js$s%?H7M75$YSav%`NL?$}MTgr=Q! z{AoN%7F)A{gvM-=O!!~-erQ`o`Dq(vvCm_~URV zzO6qTcvQna_5%Kiatd3yeI{a0Kr7IUMN-uu#?s>qo ze{w3SGN~>!*twDmwPF3e~aQ^Pz|WxvbkXGRE046s)3Iq4^ksd8XrJ0NHjWBiQzB~ z|J_&G#pfUS=m*oJ{2wd+z_FiS9wP<~sSf2(_};DxtLqqt{{V_PIUf8~Sh#qCd;k6S zH{)B|us_CqpvP9 zFSK$#AjVP(Cdo)zxU9&U31Eu~e*$5f4Zb_61o6#wcFFkrzxJO;jO^cb z|MTrDci(+i+HYT6{9=E?&fyagOkO2yy2gL#GwITX^agDL_zyn#i*y>kZhr@Ei`m5#z}MlV>dQx4(W(2AyIMi1_nolpat8KjP0^!=MwNiXbo~ ze#T-mbF_g^RZiY4`1F^*8^iz2jZeHB6L)-5`d{}ymsR#W{a>+iW%|}#-%R`N_wpQn zbrIOs|H#8IGJ4WLW+h$8J%X$&7zL;)-?6BE~J3a{aCZ1g|pk09&(+ zM-@1cXe<2&9C6{~{9#Avs^UxbcnMn~4RR-Vk&o3P4!iF0*ko8$ez@2jewo;h=F+Pi}O_U@hTu3XjCJ$X*g)Mb|KO{phYL9-Wac6+?- zn5Y0Psnguqv(nq%_O^898K~;T9+Vv*4T#xsg%L zMxCO&{y+ZV_vw>+?UR0X+ihv=*zrF97cc*MrY`ee)Q{3;1|~2PycZL#hZBl4UXg=y zYxbO3Y3;Sw(Zcom*T0V7hNP-*8p^H6ePi%|RAH!Efy;HBr7JkdO3eWartkmY`)R*@ zKb0Q(>)+DIkt5*))1ZI<6&4Rlgr+WA%a%*R+U1fh$w(Qc&h;Pt|A{~IZ_ex)Y15B> zBpv^`$hp2z4uPH{o)sC{8CG4 zW-V_1YvHn^AWpDFn1c9+8Q8lBqS2t)mO@s`Jsmxuh5y_mym76y(wS$TnburmjdB-Y z!H6S>GDeMd9EH_FRK(Gm#kRo72=!?+1atMs1%LtS|Mjnbo%YyskM#RL{3(qZg@tQ? z{vPL86#dUkdpd20h3or2_;DIDYLpI?D6c>N zbs&X6aH;lVtgOFW>=(f(i(S|k09rfr_z#n>cQuK&(g~-i?bq5I|x|h7tA1#2_XZxm_e{jO*L%;crS<+E?k(V zEgn0#f*>@(C_x-MnT7B6W-bnpw~q;efo^_ zsr~j(SAFfPy2hn=$ZylD>wHwAQ_o;zT)Z%bG}VG;vE)J^9#&|N;L;`nt9d#)5(^%L zNS_CtaSbXq2&SG9RA9tzl)-heKMc{>ne|{nk#JPtWui#3*VF^>LUc!Px#A8=Hj|Ax z0Q?Bs%d5>Xr_Ea6D8q~Ff@F%|Kk9N`?)1<@3H`5sY|gFmZ{U(xAp_*b-j`eHQ6%KtPf7wS)&OHn((53TW zP!7A|h=$Ts=X}@gPMF~#nAOkS(fvx~EXUs?^opNeA`Q%fu zR~Um}TEdA!!NCSWX5tdVDDmPcBZU+dL>OhhPa?<&eudA~MXW3DV5R%7_=3Qamq&4s zO$HvaA;~%Ss7+f;kVQHgRyQ`NwG4?D9SttUix;fMO$24b2O{yOMG7^|g0c& z5l9Z(W;s;)7#d&1A0nlPQe+z!8SxO}{$*Z+kw{nR!XOzep*^@-Sv#mMV6I|1*mG3c(#S%MV)+Vmq^rb!cUM-c;KS{OUKrY>6Q=T6e?=$L<=|1th~;gU4) zYB0cTD;;WRQPQ%eM&%ckve=ZJ`Rp_4iYu;2n{U2ZAE6V2ZNS_M3&Mp0lkx6ddp|SK z3JXJkIw656>K6U;=Fdx4U3pd7XPX}_*bhI z?WpT7{nwt-?F{`iQ$_mChYSOPxye;urRItrnS-q z=Uj-K$y)SK{_U*M`=11uFEg~V%mDEEhWj>X^X{GwbTG) zi6Q&y)S@r-%M&@3CDt1uA5d!+08&O*H8%ux*MA!>%x}EuCTY%``Les|zXUL7CddNK zK4QcpAJQvEB!D_-QbPm6*?=xjqx5JA`tsFA3n;Esu`5usBmRWOqUED37b%zvKsWtT zgws?-fTvWVN1wL4&FpBg;~vp%qK+7UTc98TcpbvS7LvsROX=j}Dc>T^d=hXcip4Y^ z?)2?H^~)yusejxJ&|VfQGe6ZN1Rz7U`|m7HNB+8g`l8Dt64O2ZnSyq7gv>!nLCxj0RoI+dV$$^M%xfHx z3_AxA12?5pTAe{GeJ)u?WK2ku8P85j7himF+V&HlfVNO8RNtFW5_Lgc2Nk`dS&$E{ z8M3_o^{;=EKJt-G)1!|+nMUFQeR!h1BYJc_hsokx(<^!gS2K#JipW~rS^(8|y*l#X z^)L3lglX)y#lH|8EL!^F^vr;L>*s({wgxskW}JQL*Vxlo{I4|B+XK;`7ak^7ANoT{ znSTMx&Z7~wL|s9mMNDV>>3`2ixa0Xunc=@U5F^bIbhyWtqDqPFtl&%mq6m}7Ou^=*gTza+9_$$#L0l5gkjcOylu#ex{y`}6}_Ta zkauq)E?@ZK7j?&e;^d`4*B<}2@z!?Ckp`vJpC4Ga06=^}Ao4JuKsUVe2g@*LdLl32c z4mvn}?dq%3#EFxfPbmimuKw-*_aK`sZ6OUxG!NO(B39`N{glE}cE*&2Rm7jQNwfHy zMx!nDlS?`|>ALE-qX_C?3H|E0e!@!qrq3sl2yG))SnWjiP<{d4EeO(%c;^Xc%z4oi~|Wb?Iu|C!|GTgbGYUC54IG;ka#j+hE2 zpcXdM-xhyTQnvQd;KiJAo2p2fNA3D?i5QcoyZ$PwW+`Qr<8PK?vTAU!oVtF(Luz08 z!~c8(py7Y$@0Nd|U%CqaX^zf5X|Kn~TIhHoJoHD@EQd{MaI$XGA5`R}tlBI?*YrkB zYEh9=rA>c1{*;=R;FkHv1#XV_KOA6nb$pd_wr2d(+Pq~_ma zk3E`>KjB2&U^pG8ic=5*k7u@}J^r-Le68l6Slnzp$A!C!@JAbvT5h?6;Q43gtNG^ia+3fh{x_w^~VC%9RDzr@qDiIcZ+{sE0?hU-SqqLAtex; zL5%f~uT<%s(7)@m)m{x)5&_CqD)O2_I0@dPxp= z%{>^)92}{vxyBpPWtU!(R$FbgDz-#xu*g>yAxc0;yMqFNGSEzv`d*^oh^A^T2?N*v z^Pm4B?Yir3>CgAxlg5r2o9&{jZT{0QE>k1ur_EgRpDU7Il0^_j=kie6K{Vgi!3_>+g+ZT=5cKeMHF zcM$T+@mIUZ|2F;k8t@SPe`fkKX~*rhOGh7lRC?hHUnnR48Trq6vd|~XMRkX)|Ic^- zDQ)?&ZPTCs^v5&?j~S^TCe@KwWS*mppx^w{H7;W*Or#ftbzxACo4iEoneIb3Ll>RqR=+YOv9u&hLlMgrbY^4LBI$fyrOV%LcKUDoyoa*|y zL(rW=G@AYkhj%!YuxLxZ!hcGM_|(R80REHLPPHYzu^CwWhoYaR(dvQtU*03@ z%YV5`e>_&KrsGYHQ%^ZXugZ+{hk#2bYw;=(YDZk7c7o_eEl*^b{K@)BK1}oP_rL!` z`rwB?l%9EJI@Sx!iD4T5o+(ptstDU@G=pJ7;w}Kr1l9t@Huo~1p{w#;FnXEr*7w-- zjq9&ZZ+g?443LA<+7(bF4LTx9kS>P$p;ZYtsnxav*8nuSVic?eap+-(r_X=>v@{ym z7--Bu{HGX>32OxihhZ2ejXwdFXr(fTIcRa?KV1506)$vijJX-;_z#zUMles||4;QV zShy%HHEvwG_@eXEh8t|C1)9TAW)J&i>A*DrjjmV)YeAHt#hZV<=@-AeJ#D=4CTZsE zIhqAFIjDZ|^1o*)o}8zl%2c(Ov?er%idkIXEV&4CK2)P|YIMz7XpnCTTLO@=@WS-~{HJ;L43ACw zQoj~3`r`|~?ym7vl05E4Q%CGXMDZW}h?PaumQ;&QEhYYq;y(|Q{2lLlN4o3_m*8d> zP7_tkfA4e!4M+Z0I!c{o+bLQ=rTzsA=cjL8e*f#){{A=JZ203J?oOldQ9<+HzR^WL zWGlpRO&-DcxUIeqF>~k>W%D?U0cN3oo!LWIUGUf_&_@ekkoia+#%&h$$-^!cfo z6vq@t2ewdSrQf1P5TBp1qbiOs8T|u?6v;%Re;WUx`XBlsujaqQv4Hb+ADu=>f8-wn z!*EeQZJ~WMm|{@FwleE@EC!BZja$*nJCRl+X`UB)-1PT z#3u5p#G&2He?!xH6p1$-5(AK9T$|xU+t5FE&YX0?MHi>T4mkwR$>D*A>_5dqiWVNP z*wr~p+xSCAZ{(l3Vb{2r*h)^DJn=Y$SqO;;oLx*a(@7;I$^hMCOLOtc%!S z{O1IqS@fR+fj+XDeJ&Zqu+2%u!U^wgp(BvNeQTVcZN?vo3_O)rRbnJi>tq(j1d$EVidwIww z8TWwm@m|%3H`pMZf5CZa5^j6e3hAgkM}me?E2lyQHJ-q+$2JQU*D67|F>n`TPysy{ z{q*V5OTUoz-e+%}_7)ebASe8H`$4NC04)xokTC6I6>tWrcO(W1k*1}xT9W}&5im*; z1Ce&$7d3$Z2*$y6PVBWt@F;+2&?x>!M2PVLNp`;j4Jz2 zTTMUWNnOE0c`}X_l&Z32PAK&4=*Z*m^zt9{;*i0RD8-Ne^t8vx@+xjB5|b1`qdMZ8v}Pi1{L+g zM%R?N$X!B>+-0f5Hp|fTPoFV8?YhgZ=^Nj;A&ne6%G{<%CJ+km`YQkEg~p9F{unsH zL`LJ)l^LL8_;7K4X;gL?P9E~3Lb2d8QJI|DH>&NzL`Vjs<(us9!h>?>UvPd}am5v# z$STSc8M`LD0kDLM@i(q&TjQ_518&v$2dMucd^_lW@O`l-pMFMqHA?#2}UURGuu)Y6f zM=x1F2)W3Ze&g)W52TBA$q+^bQBfuPMXBqDPY{s(7cZGjE`8{#U-2sSyAszY|Fd2R zRU{u%iyN*`<)Cm6B_@eOM`|OoI zciiXlQA&&0nvVWDHGXzjXqbv&wXG2bJ~E{0543gv{r9Im_t+!-0R%77iFu2Sh_Fc0@181!X^f+QlbdbSXwgBQi&bB{#|z4Jza9qg?Rl3 z?};g*Wo&2#rAM*8Acc)Gofh*b2}i3OxMmS&7>c^|(Qp9rVm`)Bg9QN`);9f=Eq>Rd z3CZ>V^ao$7e)qq^b?WyesjeTYWow&$$<#Eq1(70AXs$QSO9V0e=u3aZBm4+ivS1+k zd0@+Vq;awU%F8nUGS2+3Y_-00q8a0CcmSv$*Gu(mS>Ye^N{hJ*8U^`Z#+O#!|Ni$; zl$BCHWe0o!b!Fe+^FNCpqW)WNy*2H**C*3Gci)#r!mnEX(+L_EB@9Jfjj{Qf*B|0M z{ymehaPe9PrI3Nb;#9x{RAHiQ7D8;DR971wiHyW)%=!2=5`Nw$mx?`uq=Zr$MivCX z0V&>A0rI&W11VuB1-25A0Em9{|M~8_)2mNkr%;9gEn#!L@(@gF%PuCnV?y)5EfnkS;wQ znv{r!e&vMg3jM6hLRHEcDKczziemaD8-%)M;rbaJ6$!AWB`e#8Q%nqH@o`M}BosR! zrx+G3iPWWke(FdBVBxAvaN{el+L%J}=1ycx17ya|* z%}Hymv1a=2cfM_xTgX=EXD>>qihivoGKyqGCu-+LWpg~>Mco+x0;A?Y^j~?^SJUph z?`|K85YfLWZcqf>)-U@OL;i`qzwtsw#(btb3*icZlq+TQe; zgAPe&;61Cc{K!B2);G5r{)gNu(Xn?$Oeszio(S?pBpGiYEH;<|jriLl(HVbAi zzgJ#$RoV={>Jx=N*mw})y#PiX#JM&^prdY}y<1?5X3*9_-V0#VL7Z!jX-emucV0T+ zQ~Ree$p@o%F z`9~-Xj#bXw>ofnTg#I&mrHi6b*rx5Q%{8@%@>2CfKZ$v_UZ;w*gMHLx{yW&@Izco3 zR3PajM(Iz#oCeXnx%2QVJ`>Y@_xvS|$CpC;DrUWH+vqwmO-R+xt!PBuCfH#{(w&f) zr=EHeKk{*GI`6#m@!l^VkMe*>M(6k|Xf65A>#@4l=n^PfnkVB_(K1{T(PR?D5E15W z-xX``pxf+`W58>4da-cL#gp@Er7vD~Sz2|~RZU=Ho846-_X?_jv1Y03H>(X3l=WU6 zYPf2fv1;UAMUWK`hrJ+vtYB}Pr+@j1tL)JT#-WS<*;d(HiF6MHpj1sNO;Fcg5VXag zFebPr_7L<}me`;VR=>EYS9W4ENdK3#emlbQSmyC7wN~wB{I!7g6aOXcKWE%5d^-F~ z_-@sfTWtYj3xlGas7(;G*geth4iOW@TEABk24J~c9-EVM2FE&o*_XkTvsB~Qd2jrLAJ(O`o2%XJgv z9lxFK&^?`x*2qt)+f9{Vm$coe+il8$t4qFoA~Sr^NC?wF2zpS!r0k5@X~h{r;vvVV zk%}XShgjhwzj&UWX%MkVM>T;^(UR>_6B@NYIv%jJ{_$T3H2B`s zt&cy2>U%cN4?VReOP`j60 zvwXj5St|Vy`L9N&64C%r(};|m_P{Te?AFQb=!niteI58IuY(=KpGaXqXLX@Fi^kve> zji1kZ4CM!yCwTx&BqmcawIZ;spP!B*Ptzc2ZunJ*zr=$eD_Ab{hva4Q`IF-*2n3#w zy+CHiYZQ9?)lq*hz4in0?O@*0iiMr&s&Y&GQt~;iNcedB-d4tneY2 zb3o8*cW-IL$cGA7U|OFbJmKAhtrM1HjDx9Awo}Zhz7Fji8h zrfV+^fnM5MA@ilnM};04mya`6O|QYeqR7<5yAv9J6M0jIGSfBZa^BMz7TCcA0{Dc; zhpbv}obcCV6h@~YXnV<9iNop6hVgjS^{&g`&X8}uGhMNsmxU7=B9@n{PZJ)Kc)Kwq zpAyvFyBWpTUMeAF6bIxmI)bRIQ!QUk(e14;?+RE&tlS#N;HV<9JdaU%|BSG>s-)vkZ9r{Sek=acvez z0#kZT1c*^1-8wO6q^ztC@`@JuOG)lH*qs<$SCJHt=81l8cTn%4{M)}+v5U{+N$2)U z3y)<+RP6icjp{5qDm^@W$Z}`~jYZXf?QD(wl2^CPlnDImtaNdODlmO%rXY4@#X(Y1 z5+56eG6QPO&u&S9UV3$?u=emQEP6dFwk~Lq9m;zQIiR!L>9N6`Ug2Q$Q7Sm~zbDe6 z^>|trbxdMDEHgXp#G8CfmElt(!u}2X^0hQ22Jgn#o5U^O4;(n~ZC+NVn&_)JXz_I$ zS}Q&^4QM6b(mq9_bTX==Y-V zwmTtC=mmS`A#l`&ST)+U2xG9_D=FpkCT(q#e7tpHyF8mL)>N%k%Rq}@u&J9(lo_K? ztww-jE}Dm`_Id+*#m{WY>%ToJ-@=okUg>wdxv#4!Q7whv)hw^}2MAkIS6QjM;o;d; z8izz>Nu!N7tqa(=Xwk!6N{FX`SeX{Q=Du9CIXFdg93!d(7c%cY!GFZOz{3J06`7Xr zR@;3KUr>{++P&n|Mfp4^18%s>GRLEO>0Br?x_ZBCplP|BV#X==9*QQV?si^>Q?$r6m zL^FIkE_Oa)<0F;bxx4%Kv4JaSCv-;1TwM=8!j;54-}y_9K~duet+c{1W!CTH@)X7o zq_AGULmj2+u)iB@10B|4o+CeN@%63@Rz5dw-6v0ucIya`N>E$-N3*$B*8NlMR|Q%{ z^xb!CF3m|^6#R#W3Tv#N1y$9tQeDK_8|+kzCQ=Cte5w|2YXW3DV)7>gbxT`=Q6Pxb zpS;H}PJk3BZ~;Fj`27ViPF~7fwdDK5Ek&qw$GynI@M*>=CT~!rQ)Eg|7)`#8{eKGb z#Z`nZ8D0h+U$>bvJo#?Dr02Tk#BTk}IV3nzD5u=E(tDY2KsPIOJo!su@0;rEBt)i% z?VA%6owwJ$o7lJqhudcj&1&XL|9*hQbg{Q{Dkg2X+Melhl;a1v#C4vLmJi_LOxrBY z16KBkS1*IG+@#4{ntM?hJ_bofs|`r9fxGs*hD5j}oEb)s21F@|j+cEhHrL5P(<0oj z%wkoyuS=g!8%J>kiC~O}tPiFWz=a0+{>(@RvAbo@G^>eAu{J)_;tNe!+0s7X^!pe9 z&nVnGNx%X~c6W-9xzmeV6uzG?5oYRxq_|bL&Pm|~?)(}xN$8tk`x6hM$Ie>pnEgEG z{CJ!#Z2x;Tvjo)YG^_c1(dmU$WHqWYDLp?YSR8l(D~9Qm`76Q>fp76Tq46`aL(FJ# zLw_TB{I3X~RIs{rzBF_H%N9Er?(F{c;kNM3EQ$BSlv;~`o~frss>jIZlQF*079GLha*(Nh(7;`aRpwa~w z&fo0pzY6&WD?)BBj|FganUF35{#f=5Q%<~fCKUf>r5U)LP4mBH+zBd-1-y!sb(Mgu zi=}nc^p@m`Yd`?x$=pEU+~Q`fvL;)(G{|Gl{i~SYk@}D{y8xyK*x!!&iDIrWZ#zus|x9e3z!oKQw>_;7=7X8up!PO4k$|wt%%w3Ha+@%)f|a4!Cp z#Ob!iYquv^Eo!rbF%K{iT#Xe8kA@z+5^V{BIZYo&N9RP&;UcU4E zMPeOpK`JzBARgB{;B6bSK0c)vWVHBuS*yKVxl=tGlbpg`Jfel=Mb=$GZDtuhZ|eJp zWAJ^co)%2%a`+;q50{YY6a$ycS?f3q)l8&78znq>KE-BvUWqyUwtg3x z_r6U-Si4g#nR2JGZ&X&!QGfr!uIhf&{ReAnq&FYeXMLs0QwT-FHJ*Nf`e!yAd6jq2 zQ%|N$gQA!>KX$CmRCG@WEmur{SlugE@9&FVDQN3x3|Mcy1`Zn0)nmutV~k?B{t*>f zuVbS8>*7~ul^zadE1VEHBSieBr1PV`a~Z&`$0nS8`TG70GiWKZoe*}wFU}7ufH?77 z%PzkS*nUg*ep1%u)FBtY;qOK^dDpAGj_fjZleK(E_kKS)?8mCJUwU>#0PNOh`|`YX zP92LrlwDfAN#6;s1Z`e!Jv)fi+;e@TI3t|E{Za^-7>+dx=VRyJ7gODkl_R1$2M1Cr z5crX6s;KK$+MvI^*qR~~*!okPbo)VD=n% z@5}!i0f%A@sMuUQp=x7{fL>{L#ndsGN^j3DxGvg|fD%EXFj8<-4&tO$n^En=Db#5; zKQ;+s2DXJRy5!^-#YxIKwCQrCChjV+Y0Jh-*!8-Ed75xcky*4=h)lnC`yUkT?ms9R zFv;p0d=P6@YoG^AAjJ<9dDaSXebgG1IUp3+$weA^3&D+qI5#Jek)7;ii4`V}Hj~vy z?}$F&%e!x-L`*x*6_teF7FyM;?%e~XoGR?!rk`y`yaTGyXNObJ{V=ITUqPZ^_Z*uf zjP5z7n;?4lZs_f-%Wl|TwSU_n;N|CsMTd@JRc#^d>GuKGPVn0{<_Rk)=D(Q^_Nf*7 zLPBW=)R0E^tBTU-u~1`knCE!ey(ld2ZPU+T58dyNjX5l&A=^iw4~adW4*-sBrysST zvLDwUVj$#Z?m4MI_*&bNs(IUFj7H9jqmF;__QG-bZO--_ZhqGViRvt&L?0{~B^;0~ zPw{sR5qJ+?mpy8tbmQQQR|Fa2sx0it5HInLu#-kjGTG0*Dkpn)iE`~dp?fMk-Fy`r zc`Xh~=674RHXBZRZ=T*l+T-U-gIjo3e*1IANVfOHW>BTXO^B?r@NCHH>0niVQPd-r zs6gS0gFoVte>U^%X7Om9omdi_pBudITU1s^iY2uv>lPc!P!PT}IQ;aP7-TxeZ%t~# zx%d_yFe-~f?i&(bPY>GFGT=w=-s0S@+DaV87Fvvy$p}AQrbQpTl114RhsWe=9R3Q| zU0S!B`+^P=arx$Ew(AfKW%3%)hv+Kr1JksoXiOQ;egIz4#7W1uENIF2y^&Xv)*e4= z5o)Ld9uPV4P|N2L1&)2u`TUbB2mUB_YYd7eJn+?WswR6(daGZe7K9UVHqY*bp}3+U z^-R{_DtsD)1gRp%R_4)j4oS>ER3ir#*R3cbulh`(+qeH?N$uI6X{F#$YC zo8Qo1?NXi9c<5>E?a|wyM%45MB!#Z#+F&YY|+N|?QWQC2{|u;*Eg3Qt@3KY zWZKdBCw4vh(mB?a{}B(hg$j+r$hT6hUx>@V0WH9WHSF$CZ~6RD7~>1JQilv*as&(o zgZrJ0`yv;(^aGC5kEDkz-8u$3cQdKSE(Lmt1-%zZM%{M1GMyn(Xg%R3gFk#24(wL% zmC)9O6XzgT3s=)`*y?3!GzK2k6!o!R2sD>fBS>GvzLM1`zq>6hr8C7w%luN7VModL z3m^7*KB+!iM&j<-d|E<&;LU5J-ykZ`6#A{X6cyr^|1V7=%MT6^7;;{01YUeosx>ok z@y$yO6mrME_4Qz{Tb9bhMq1Vi)?7a(? zVWmZ`IHLeD{R}-H)_k2djAiewYYX}^2xFde#9X+@W<M4t)_W7+RQByuy(73cYdrTj=V z@sm-2dBQ-+JUhZF@=fdbMDCXKU@lPxZDxs*<_Na>1g$zSckc6iyOIRxN z^iM`P$~YiwYB;X*1u=++J?^IvN-P;2oon{uJQmeqJr-}Ufee1;Z{?zkmY59nyh^+4 zbn5_nHx$RGbitYg92DlDt(uKV%+yEO`mW!^8OM?OMo(w(LMgs78zBLsqslZ)Rcqoh zEdgjNd5F7?)}9JGxo_BiuGtAB18oTcE?+i#Yy9*cBQkr)H`kYQAdSq;CUX3P zKh49=Fk2?47MY)HKcO@Er@k@Os;y7@+x0MoDn~7I&eDdOONU-tL=17S%#ov~y#<;5 z)Y&oSy5PJtTXE1qf(vU2>#u{@*g~JGU8pOE9W{T$fz>)|+w$g4P4Ym$6w4C+Yetp9GRW1y2|3`0vvZc-Q2ZjkjE#=PeI(Lo-X?cOC<_ zYU>6-#^dGgPAuJvQ68uX=GSQXNR$g~CCi0Np7piOIXj!c6Ezk-0RRbw`Q36a(}kY2 zVF9-i2Mr-LJTyimi$6fERV9cao&1#_KrVAV@3?q|2nten9K{!ELA;qjRJTzNgd=>po>J z&GQb2V|l?#L2%4dr%ssEY#~rIg>Kan=BtV)VI^(nLi&u%`2td?!ISXA<&<+kBrF=1It&XKr<78f_Vc`5ugC0j7#I@PrkeWC36C-DMtJ57pbyJD_{%W_qP-_Z9y4Z zDAH?5P2RIwx7X`nm*tYb-;dnQ(MHRm(mL*TC3Z_RFsnpoeXA8Nc|r%6i$lJ03VS^$m4(6O0_ zTP`~>rmsa5Ct~AKUxQW|QYQ`K*-?|SK>i+dORWXYe%dGt)rdtUM0x3Tp|I~e>bEZd zYxWF+|KfX0mJUF315Jr94PP#CBkKQyD7AbFDpfd)TiT#w%qr~s+LMq|v+e_`^eZk` zQN|t}MAj{DJ5%B3aWGfZS!~V|l+9i2;A+_5UcDejPw`@^iFetayPB^J z;$T%=A5~2;f8m>^#MJhL>t)DK-hZybx61VvuadrBG3}!c@F_#%&R21Ut2MbS(Tbp= z*~cu(Sr6lLjM2)kKmTQhK4JWa8Dc3ftw{qRo_Ciuf(}Xo=^MXanr@{~MOzUMmy1AW zSE;D1?%JcZzsCcm7Q_~eNe#EAKICD&cr;hH;(Z`w+?uj3^a$`LIu_@+2-2!(-W@{*dC zFr&MLK=)T6B>v?5KTF8~36rQfa997ULI4m!%ooXOGQ04(K;(m>=~3$gEn*V*o8n-; z*CtzNty=ku#lVf$lz#HSFIoU76>|b0z+T~WWB z=jn%LU6n!UNc|V+z^NRAeq6_L2(ZcN5vHZi# zAl?!8s8+Iu7L-7Q?%0Sk*UVEKX8#KKMy~K&m~Pqwm+RSK)594x_NBZHUa>|inHpel z0Le0+1`Z&?4n&`>2Cn+=&hPU73ae|l5!;3G{-*45G5=Nld_S%6 zFg0gMLn|_x9R_9Od!MqI=m8h(YuMeI6!9N~NG{|49gM#Mc>hk)WgoN)7VF?a>)z}2V_A2su>GMI4U!Y6*M-u13aUl&h=6wM}dI)9$}@x24d zv|Yu#1|@pOXOvP>MMZJ_#4CdXWxG6!K+TB*#bunQcF<7WOE~kC zI`86NqDw$Q=a7lzPR}le?I#d$Bo@MU$N5$e5`t+=lSikeh zFzi%qnbQ*fzK^nJ?P(|c#W0Ph)Li*3Aj;fk_-Mo zXoBGTy(@Ef+dZO~M81cmGyd6s7gln2Bsw7Oakr0uEs0xyknLS@gKW|fF{#qVO2jPI zlVv)~L^Z_G?Lg-{NF|VaQh3&7YmniE9MrTu>@-{FBn1AC3Usb~LEU`}IK~ZZn_TR; zuW?$k@4czShznHKXXQ;WV4SPHu;tlvU6!%$z2Z?BPkQ9CjieWxCHZuCHvVf^dhIe$^l~jt9G%{ zj}&M1d#<;Zyycl+3zE^&UJ`8CVJ?hmUIf)mef5|4Ah}?2I(UzOq=8f=&%5M%&Kh>X zFKz6dp!)imt*BDMCv;eQExwGvjV_zOR+7wo0TG%Eu_si?N z{rh0|6q|ts2o_7Bj{Y8?u%GsHLGqT=>CPM_$Ty7OGU!IxJw9_4eu`@uGdP?roI2SKhXPG3ZFFrhry2YV8OAS65RNp*M?_@_J{0s)Qd_$ zs8Eg~>skB{584PsQZPjXNlo;F^wXziyQP+{qn;z0-DD#}>D(PiYA1NpmE8TY z7x7K0EHRcP3Oya_Yp*Xu7ywQASsdDbsQ?Yoh?N8hUvx~#=al(eeC$6|juLm0oS z9Q#v9D`QhEOL&<`dJJs;b(!H7S#56`I=SLwck_N3+stRp!D_L|lSpnY^Jp{v{i+WO z_#EIHychX=&2#9rGz;v;3}p83sTNCJ!VYcA;O!o-6WvFL0PmJT9WHyBln74LX3Fxy=~avcy?0mC|bC;GFC1U9SHxl^HM==ezyQE2buNH}dsg7z7no zV5g5PH1@_GZZYr1Jt({t7qsff=Lu$PPX-8AZIR>rT48f8Kg6WaQ1eMe(;tE6;Ivpg zCG&-^w`wYig#NU2l&Pu1LX?wZyw5*S4jGq!lB8fwroKsk*|ku2Z2d_&$ouMMX5f>^ zx;@F)UnT6Hy(rv?PmKnskYVHfSeL8lk)p5%N9e10v6BevlXkDXk3%_fCYKgFvIPU) z(hb}x!%B#MYD!2iQQ6(cyIM|e@&r$wzxl;K;)fBBT@b#De5Yl*ptz$9C3+R$5L&?U zEKsEraYG@dT3CN(D53C?cngv|PPmqO6f+9YB19dtGRT7qK2MSaP^Uhz{Fo?((spiS zetMn;u%afq$k8Mzzl95bWqVtjpYoc}le=^s)S03@RpTcVX%)XLWm#(4W!(?K8)NE; zF`6}0_cD3bIDLC%!P`e?#b+FRT19f@emkN1Q4(RV-CRz!uO?iN8|7>mgIf3Je4yLo zhQrV5o9g-X;ja1Uzv;$M79=6)8Jw&nIe8RRHeVGp)@FFSyJwU0)0S7J1D?KllMXgJ z0-lDjy6(T?Jk7@F`5URw8t;4BBIK~=g4<~@O|2f>th4l{P6k7@?{z|f?&OF7R%h<+ z?dAQFxKnA4Vc6pg^E}^};dqPIW3l3s#Lx@WOu!l9hZBK%=N=l&*}Rf6VJu0CBbna4 zEn>m!pK?-k6~$HR(%d)TUx?o@&O{Aat`&W?e#c!6P`|zKYRmB*#jDp<4NLhB6^qpf z6Z75gSXQ=uWCL#h2BQf-v-y}lp4cGtFSB$9 z5M2YEAtt_k=+k3P0^yiXm@@;f`zV3$dhb@Mmes6!T>k^PEYs|^86szhE!`z~*GKU$ zDh0Bl4V_GWKxfc4W6@!ab)~BvB4gV>Lwr`+Ni|#D6m9$mh|E)a!al|^nc62G0Vo6q zgX)-K(#d>|c@~dYiO=~>bCm|;`<)K5B}D53{$CfsRPNjJBLxB7Finba?I!$o&38={ zf@SldSF5;>=LC@~()Ah-*s4+4jdKc7RYKeN^o+*qPiHuyBzQS^8X zfdBekt{+!>g+Ip$xgBwBzsY3#5v+*yc^wBE3@UfeuxomxoFFgsC?NnIc*Eq7xKnVY z=b~1Rj8gHGYea>fP;|$CzmMR+oF>YOBM3LppmdOK#zhO5;*@c;r|e<+1O~vfc}CBa zLbD=k-UWa$e^?{=7BA1uaVs@#^*=mMkH|y51@SDOXyAK#dvj~*=+$9jN8FF`(|}KWQcL4}MZQ)+)#ji64~^2F=y-!DGPNi2uV*B8fvj0n(CmHh zEsuIB?A%E>#-Jtr3x`iPGMO7>77m?jBce2*qb-j%U)(4Qt$nxoi#SV-oCY+BVlj^) z6`_ijic>mbTg~_3rxV3t!yGfEs$3ApQZ%RcmSC=;Dm(fZt71;i3q@Nn!N!X-5MOb? zM!s?fg)$(jWmw5;2`>t|ipH){=rN zNL>0(Frdzla4JE0#EQ7aOKYY@2nJE+AjcE6-2=(COUj~m5K$IN9M*4V^Cp)c${yrF zf{2HQNsjuj$={bLssrKwB)Pms#8w=wP){QCN&iE>sr`MosoX;nU|W#>rPOROzNftP zoLVJt`2V|zJlsAQ@-K+=fkN$(icHXXVAtkEsa?I|$I$FmBWM!jIK{QWAs3|DczK32 z4ip((zJF`C+|kgSIsB9BVchkGD*C@%P zK>1@FI>A0N7H>m_+Q1jw*zEwFBB@s$+e`*N{TN8ds$NslypLe|oG_R0jp>{C-ujCr zWl7hG_k>(nD5wP?UY5O;cu-8T1}|L{YD<(7pjSglp7_;P>$TwF1AQQ%N)MQTPVH|I zLGY&hqaR-RtqQFN^jZn1sRZ!X4~|Gv+uNW>;|n2*x9l6m5@!^pzfxw`qI%p~-Tw#@ zx#(SAEYTZw0Sg;hRTB2UO%=Pl z2FD3GN5BJJi3Bl7o0llFmZ0E=%_v)N8s7-v!t+C6xbmRV;ZqVw52#>`C8YM~d!xcu z_0!NyBX~yR6yZyU0QtiRrSG&iTxY&rr{6W6Z<_)FOSiEl$J-sCXSb!@!;s^4Zts>& zE%?~YDlN#oXyRYj>tu}Vk(dQ4JAMNUtU2tpCR=ZBTg8@W9+|eM9-Y@r_)ad>#Djam z7^uA8EK^q_q4r(SU8={tKFuVZLs;(36x67DEgwZ7+<0G9=IDe~@db9k){}_~tKf zC;XtJZJ9u_YG4aN!A!43Jj=C&F>tb|^AgW_;b<+YFhn7m!mj=&C0pJW&YGnvqklI_ z7>~Ksf*nr2JE1-(MJ2flJz2?^KoYvpMxkkQkR?C|UnNa%wsbw&no5!IQR8Ko_gcvp z!WJmosV(|f5ZAhAp@0{M9W>mB%KNgVj&m@hf`sH8;mN)G%}E$h z#-xpF$$kXU8f@6v3-4UVmtP7dP^3RbQzP@+376G;DA*6RO-a{ne#u}5-?(dXKoIZy;?7={;;_H@r|l2x?Mrh3 zSrYdlVy06mJqHXr_#(=P4+YPYObBHqfUkQG(Q3>%ukcU+BRyz3bzvGbc`SA#wX}o+ zwtAR{I@5vTu*GOhNa`4v`=|||9&Ct|_ zjPL*xQdUl`9W9B#WvDg6V2gDXlngAdw8C_K!_a85_~&p(TsRcxy53Vq5}ZWy%n-$v z>OKXteJ~x8VWH|n=BN;=mTm-Eg)$5cR4Bvr<>Y4 zWuyckNJ7De$JHb*l$}K!ub};tSmLS?@5AFP$_S0liWle#P3P8B#`g7XFS11^-C)|uFH++-@SjWC(lVZeAjc;vt`3% zAe6e6*$8P2Tl(jtAc?E>vvbS}wMGo;fLMPq`NNkfthtpBg$Ar81P@ZGon@;KhRbZY zL{H5Pq{*OhRBE>6e0MKg>rHu}5pQZJO_)gVL%pQ+YJPP5DPOghY}>+-;A*h_n$s`$ zNwCLRh=sg1*D>qKN)cfZBo8jW3Z*DPHIJ_}*;HxFoJV_G0*n-Gm2D;^trbCVUqV7^+L%$bE%%N%XCw9)#B@1IoJxt zT>^KRz8@7dR&jU2jZIx?OFg2*UP|+RA~6~VwrQ7gdyclYJ*4evXO9CY6z+>fCVy+2 z-GxH!eklGZVn9W3?OwBoeFNya)J&ljJT-INdmDU~k}hmcZ;6-HtQbiBNJkI6m6n~uN z3rhL}e*QdV0&J5$$jSV&^jdktI8;;}r!WCqlHhl;WIBAzIQ|eItQJehZ# zR{jQJ(NQvn4XpS>+q-gfC$Yj4Pn=*=t6k@eQWN7X8Xi-v;_!g-B;v2W$L^ChA19Su~KcEID8mMs1{jPJvOe*YKTM7x=lDBaKOfy zI|4%5{_Cu>sp~2UK^%BuJ)iAuW`Wbqww52m7gULz_^Dpr;G@1yqbb?9P9%D_{ePf$2B!6fD&GQ%St<+nPRuMk1@Wk59h%rm zk;4+-GQC^d*)C&gi-%CX8q)t2Q^1bR z^888z-Pvp}#-Q|F^!z$YbVPg#s%huED6ID=bRiP!G*I@ji)i~mnNQ-q4p?jVBz3j@ zasKs#oB}nyi3?O^mn$8oXtwqh>66U6>BFD0%7G9@*~sz!_=SHmJYg#mJQ z$wqbCV%0=^a{!SBy|{YlSdm;}N|TOTHYPwrPySN+ASl3iC|rg5b*!cg5|Me~>CQ*u+3X$DTp!Ng#WG z43-Lxam&-y=xSi+AX_mUK3N$ozAf}!GvDa~ehjQAQ~A>&$Syw(ywr5Za;%J}s{Wox zX*^|L!Du675!Svuv74`pG zr5X(CxcX}|^d$x6yqX;Z$Ks1GtDZKRIS^;fzFdKm%&x71Ao0sMoId37YM(gaZNM%a z2^=z_FKk7` z-ZR6?qX78HM;Dr2D{(wv(4i^z6OPwv>%tIwU8V#uO;%+y$x__ed#zTQiklYBE zT#+x(%?k^{$HZIh0PM1c!P}O-<2hu12l zoOj4X7~<3Wk!n$7yU*7Nw_bAF2{j)o0@t@v2Jv5CCiN0H&MzJL&a|q?FucGT%sn_ zEF~x|HJDtOW#y$>D+5$Odmm(Ly;`()-@okV$}1yZJ(W7sZ$fk@Xxi$T-!FUccK4r* zd#?JQn;+IB!xC+P@Y`S_itZHYULOg{`MAEn{*5DR`6EmEwSv#MGUWqpZ~s@B_UiyW zzf{^9feZ=Avxba4f1(AJ`K?F~K73UFdFVuN4<1Ni`(_G-0KSA<@>22J>i7IU0@R3p zZGIOsDZm}`tNa(u_=6KfQT|Km#1q9nvTWW93y`|)415wU*``iWV^Jr|hf2{RT=y${ z+5}o?RXFN#(9Bm?w@^QP#&2-6vHf$27T?u&t)8u@X;(RA%g7<7{D6O#5tKSHXTC@g z?K8gpMKP!+45>ZU_(=agKHNqT&6Va4qn&{S0~t?eEg;U{47dAu9WdWm6!vTV;UxjD zyFA{?Jh>w$`@CQ^C>!!Bzu*&s<=HVev7= zmya0Wb9rk)+)b zD7kVL6qooinP1fP=(=tO|7f6JO!pN^gZSyA6P8K@F@Z@o1vu@>MV(twq&rjbBEf3LOJ~^8xbY)aTiVtY>4t$#&XNCAlyg?*ox0-_gydIY@HdCC z{+nXbwYt*3YY%#bZ)ezyYct>a!x+-EOAe^}PLIcI{~phl77~cxHThw{VOlbJQwzxgai^_jPW>T)L=DamyiAql)MPCC?cyLE&$mJHZc$e;i#d{CA?}|Lu`1 z=*W4kpep^Z$EXx51+ zgGY541TZh(y!)8x2+xRoZ#T8HNbIiPPw_Z`qyLBS>BEEh((^7N@(#aO?w1pTFXe0x zd!&H&B4+{S<3a%g=N~y$I{mvuM_K7MR(t+=(CyhS(nh+@5BnPkYT|8^F|DgMgU;*; zhC;#D3j4MS%9GU7(3-CzFw?GD^|Kd3dfk6ZoDFbMl|Fuq9et5fo1p<6Z78!R!aR&* zuof1#XT^7&)~6{{?(xnEu^uHA2==)X5cGiVYk2pa6+Mj-I^y6Cp?sk-eKR7X<0K+t znxu0>bE$VNZVeAQKgp={c~ThShP!!FVp$KVdeYbEa)Q>8!K}9hQ2>%KlJE`~c+)-l zirORJ!_{CnPS~gTFaj8NHGS)}@K{N;i+~d@wK+lRx5Z4yFeMhTI6Y?Y2+)ebgh8WL z(lVg)TDkIK#$j2$H@%*fse58@YHe+K@}Y-rJ@I?*)qvYLo2$EQG=98T_X?$_n=F3NL$-8KP{ zT~RBWRn%^I*{L3=I7~s2KW4WkgE^I}N`atG$xFs?^qOCGk1$ZXPI_|N@26!!n*-*xh<4&4{W3QZ z#|FGOrW;fvp$H{C#bM`U>zG$j2O3mq1dY+kC_d(NAFM1DUoAvcu4tK@mk*hha8<-i zoTt)nXQfI%QHJWdVnHvrgBE+fxMzKm5Gnr{-$EBty=%86>$BC2C`=uVF0z|Qsq=g< zlWaRoZ7VeCTCM>!$4?`8d~~LlzTF<|_H{bT`pFwI#<>(w`VjO))G&1I_C=3XOM`?h zdE$)=SD;PdPaXo`%kSC)s8g8!8-nwncacA`|Ac&w%$%;`X>Qw1a97dbwhd+S#g)eO zFzf%Vj!{f^DFE|&$;eRG9Uq+C`4i`=$7Hnpkh7bxRqo<-&HhOV8jqbJ-1YzQgsf6f zOCt}a?s}tdU6-{&PDSnJD(5Y?7zl8Ms6C>IypkI4hcxTmSgdtOs4i;VUbbth=yXJ% zbT0$(_$4T?&_j)k@Q5pugU((N|FEMa1$}ypW>?euuJ8l7TjV!<6l^MKlh8Y2m1N9Y zwW`ShfvEOJEm$JY9lLo6h?Z?*1mCT%K0YTEQHp;oz^opSR6qb1I~kkT`qs9T_+a?7j_hHE6WZgdM9JpxDM>I?WFAl& z=w(cTcPRJl}e! zIZV^@%q}q{`VP~8-e}U%n166WMG-Ec?S4mJ#e>+dZD4C-00fjR6kb4*RX&(C)|Dl~ zNH4?nQWG{qPeFBK-dQ z6l*cwsyYm<%iVv**g@b=jOT{!82=XmGHsTkY?e7Otk&5rXQ{lWd`aM7^si90-$Ph{ zzo(-^5u)@Ga3{|%-l0JnaUpMzXOyaEf%K4lD zUTX_e5K{2`vzqx_x^tr^#de?B8<6kTLFOZ5(0TID`qTJdkNCaeW=VSGJ|sG=N7!%5 zF9lx~y;QL-9RDO7PC-;7RtY&x=YNnp#SS$r2$2rw1@Y`G9VfkHdIUF0zw5OlauXey zvlCV$c#sD_CjrHkSCQ!Fa7My#vvVqNqDX<(v7L%;`Ve5meC{q5pRGU5s9sa?O7kVv zSIXkC@r}_)z)!}>6?_z#bBZPgEQMZ8`M^`)bMooAxZtuC0A3#+UnM_qm+xn^sgwT; z?IjAB*8EOz0$@L#H29+R4>_U~>j@CLH*}ZV*)RO|aiuNPB59`p1X*4g04KjHmGXTc*~nGrEYtW5c%$4(GFUO0QH@Gzpvzt@DSSn?!;o$(s8~ za3(}RG;voY-EU5!2?YF$C)w&DYZxnUa!6_L(8p|_hSX5tw>5SDrQgT%o%SdKd%|i; zezbAAs>&sJu29M7Gxfa{q#AVVhu^p1^$X5p*;S_Z-;|=6Fp?*;H-2(r8udqfc- za1R@8QQ@h+**!3Plt%-L!iHR4r8KNGf;n4XGLwUZ>|L)#plk&789QY9TR7OJ^`~ar zh_Z5jQmwQRgf^CO5zq8cx=UMfzMwoX)Y?7$Yp~qLOA)D#9QezYxQVQqM8dasD5*Iy;|?Y(SLXlq&>brycCRJYq@ORd8b;jwdm_&ATlRb73KA{6uk$E|Pa5Ri z<9oG-fQ<$4^<{|B@{OTUkrwkcHs(&$z^Er=4tqf!3I#`gH$_IGdmUK)$v z@UvLKM)_Z<%S(g?9(egrJgf%Ht{sq@#iB@33atFMNQsK_bNnm+i4z;~YU0$2s=(IgYd}B2BL@6X-Po~9=}V%- z$nX$Dk??5|&gr`Q4-Dw}`5yg-C3#$o8ZNUx|EaiDe>46Rj$y3gZ;~zkKsNQ4F_s2u z0UeE2K9Ij0e?!x3$tv}u9UuQ2ntlrPJu>|$Y@@R7{@cPf3)i?Fe(1rp(uz3ZB7a#Z zi#~M}_cz1Ke%W?{7LWn~g@(d*81m1wwJ2)=^{1ad(Z>%7@YCfSO@)>U8ZpjmLg?rg zf9=)iCqvqp|CBi_`3E@~Gprx92g>vSYTm2MdTJsP8!kFv(BVBErS^2OF{iB{iQC@B zK?(rLPe)W?E2q(6&ZAJd=m-aFDEj&9F8o5{kAC=leOi|96-ueJN=>za8sS=#6&TnN zdsUM`dRmV{UKl)k_FR4T=GfzoGa#HFoc|C+{rrz+yZ;OjPOqgJn;d_tjK$o<(5~Uv zPsK}W{QLKxj_dTY!+$zExcr-qmxUk3Pin2W5{|gQuFYbMzu87PK0K%?HkK&D17huB z`#jLkU#PnImRs}-;N!;NJw$!H0EP{5{tYbuEIKy-p)2Qq0Ux4%JPyHYTyy|`njE%R zDeOuhv{2i{RM4o)1qvE918vpzV=$X@oKc|Qf){rnHOk_);pNs&2tYeT{qq;hORs*_ ztJ8%ST#(j!<62sLWU`qlyIp0i>Od1fUm^`V2#ozNc$$8n{q{>g{Qmd#E6~ri{|Yv2 zrO(er{GWUO;XHD!&Hvf6W~2xI`e0g_M_i54F}wr}VEh|mYTcU5TBk;)P6v7k>*s9! z6+Tt7<4!xJKm6g3`05Eh!<^@zR*vV%{O8VzL*Wt9WF~+xE_McIt7kl(;}V{$p}2T> z?#`fPC2-6WoGd`Fi`JTBcNZ%f@=#`cN`=H+#O$3WBBe+M+KDA$fPP zES#vuwmJWvtNh0i*F;!qhi>#I)-S@e#sR=nDXoQShcjNoCyt&f)M^wYgnL>GN*x@m zNU++_4?#bNel~usXV;x~PA8mr0)7;9a-rRtHM7`Zp_ti1oHKa(!PZ)z^J)cEQw#~1kUF8r^}f7nR)^Kt&`$$7?*D`!js z9)d+&4F{xqRN;gHQ0fYog1pMwSK$}7K$_W_Sg|GlnbNo%7MZLf6lE}Y->VNXdC(}u%oRUsF{si1q zif02mEvCGGwfXO-iZVSf9Oei@t_W!pYl^%kq&$ksp@>mptpdt8EY-phU=T375G@{h z+QG8xi%N?H=?A8t-^m__2RA>1g=?R^_pUxAW9+UtDjG=rW=1=S8{+zdGwRv+O6#}2 z`OUQZ9($x|)288h7<{_M#i|w|B)k8HbZ#AXQvdMzFUfuA*U@tr-_Xxk=$M;*jw0n}@mySD)gew6ZUG z{rn9D{?6pl#~yla!jdYpsDLZ6yo~v z7?aH(!8-K^lDhcG;)xR{;LD#!r0uucL0@sCT;jq;7gGQVY|#{52d@(Z9qL5uwoq33X(a7+W6`iCL9~0;%vrd`g^Tle0JT9T6Dqy}TQnsQn>xsQ0gO6` zb8Uz~N8Lbsx4;(7psj~4*lWHMd(p+0rX!9#GR;ODl#swh{^<<^1)1XrAskE= zZ#LuaqXvG_MiyPj#R6!E88QQuvlJ10^m?os^=T~ReHd7sXylb zfX09P1bj#k3r6IQ?FBKETsbtNY||SMi4F@8A9Dam3mClBG#%NV^S)(v0T%Sb7 zDJXsbC=7**D4hX?`gI|q00{blmVWBeV;7`{Z4k`o!lq1}oQ^&AxU|j3w$}N*3-d{j zp2&?Sa8?J5HH+J#T@1Q`t~c?V*DQQ|@V<1(B^Rgfe)q<7_uYSnFC*}S1Nd44L_}Cv zs}JMt$#Nj6!V8!8?7viN11u&wn*5RiJ{@cRLzbq08Gp6O4ggw-0lmH+$KTKnvCr*~iXd#wR>_d90~Yps7xd!ON+d#)r% z1o2=`%$$E*29^C~m(emO7_$mB$XXH6XJITL(4io| z9Tc``t4q2#eHE>$I}X#0`@)CF_{gP%?7*j<#gAj#`-Tn$h2X#E z^yyD~s@|c!Gx5bADn{Gl1EWMQ+ApT4-rDO7Q4jikl$ZJG67n*AMd%ZHfA`JbyJ@&X zXnb{w^T#j|zo_PbFS5U6vM(=~Gu0#7;eUV2L1ca!-#*uv{x|>2;QjI!2PJ?1P&Ce7 zJA$xv_!e6@wHH+Cn&5Qkf1VFk(yA}~uPgvxKic8=8=tY1BYfVh>Pu>9pmqF71~65^ z?5sGe?6+~iifSA^M4Yny43K2pqBAbONc>>`;!;e8lx$k(Q{jYSw3Zf&pBt^-+D{2M zh&sknPPNouG$P+>d={0&@g^T|h`+_5 zu9#rzKu`JG^9TZLW2@fI&(Tf(6^-`Dv~k22n6RI|5uX9Zk*B)x)xI;&3>}Nmv6mel zv?|{0*nRXd5+f3XP}6@`tHM}xk8+Y<9HNq1A~21OmoeHS!$teLoHTv*H<^|ZqD|l9 z;}rfc!`B!NH$HNF2pI9XY<$?mPF65qK0IB|dL7&Sy0NixBk{mQX^mE?k)`{h#C_#P zZVvygK5_igm%ik;S$z64pBnhB!>d2>NxhCnU$;Q_lBfn>v*KsYNtzf7sZM^;@zZI1 zoyajtK6F<1uv_o)IzcZy{4qUjdE!a;A1=N0GQF}n6GJqdm4uJj!<_M=suD<1r_tln z3kx)3g+?_uh(C0NFCl?nycXj=t3?xh??8;+rT7|X@kcho{SEf`#ie>2Vrn2D(=sBd zzcpHAO1z*|lzsg1VJk(@I;NG$aBH;6lz2hwX64$Szw6KazPf9_@@3_b-YmkpjtCX| zKhILLD}3xgvm}(KO+NL%Xb?5IuWB+fH5Q;+RNDO0NN@gz@$d1a%sTn!g)22RM@$q< z;m(q}YVpf+CdS>#Y61c?heFP1jD-xP-RlZ9D(Vxxe-}->P&GP_YNPQfzG!?l0A-xB z8J|Nn2tB^K;y2eixnko@peLMg!tk&3EXxaC_<~`V&b*x8g*meiZAYCMp7d3A&hRa3 zat6lHkWYEOeC@Tv7e4oe;buM6{kLEHnl3G`8LqkJn&Gpb{fytcRoO;Dl>g<_SdewM z?*R{Zpx%h_qq_Wg@Nn|U5AoT={qJ{wKf8A9amVT@@dx?i{~vqM$>QIqvrPRaC1v0G@fQoGp=`X7lE%ik*dO!r_24QFpRO)L_ zK&AXB0ErZ&*5px3WTd7mH4d*z!=jNutuNcT^ITgO|4#kZ-f_p>SHZo&Z&2ko;}(~a zKH@h;lA)t;Oz?yI`hhv&^Ml{lQIdCk@#z=u+~T(ox$(qtz>9OT98NOHGhAjKre9y- zWq~~QakSn7tGCzcu@5c8!t2)&&Yq9dm(Y*o`)DK?XKMC&&`tbrW{ijh!(-^5`1Agc zm^=RDknLX!W-Bw-=vs;&)JyS`cdza_j`z4y7-K6-N7t&YV$Qx*Ync1` zfjNwogB^88*Q%{Dhkwg0dxwiJzSz%deeF8E3{bDDw%_`LS`SUoCn!TA>q=jpY{KXUx>lgVD%_UiZb z8XxyDx|(J=wfPn>_g#H`lvK4CT|_fkxI~V7x5fV%OXS=C>~fCKRppT3%NezRd*R9_ z=h0)qy^{-0UEwj=(ra5({EQ6a8vU!rBlZ^(#Fl#xRfZ4RMP}0 z$-As0-wO`(Ea{0Nud}Fah_5pa9t=AWd>&Fg_L$xN(aRU>m9@wCQHjLYE>($+wv8iB zEVrd>5o5z5u4VlQt+CqEH}*!W-)Gucey@FuPFp=kd8VUi)mG^lRA1H) zS&h{`Sf{P%tC5%)BgOY`zQyl~zwp)ndAR9&H_O%a$O9b2;=uh+*jNEUi?TudJ(mw{ z{Js9{KKf|s2yo_FEX``D+sPj4*LHN@7=jq90H+Zhp-=a`=&6=I9i7_|;x6bAu}%2< z?%40wBR}`KdxrDRKYut$KUTpfZLKtQTBQxmR;CnXe^N~b)kwR1R19}7BJ7+x5ikqw z_LO48KmGA%=xqQW_2nXjcPIZJs`&G}me+BQi!WJsd37lKKOdZ}i9fdxZo28l;kSSL zKMnu&4R6qI5Zp2x;nz8VSneBEP!<#RD^Kc)1$aI8m#Cux$NRL+o zYl^=O^N&mu$Xz-Ay>P`*2m^KM%|Cgdp1~l1xMW;#P*?=|copTnv8P~C6YqJ$shf&v z88dP8&1`#o9t%LwcH{Hu1RwF9`nbpW2==5WJrPu_5AB*QWma@}+l_hD?cV+}Py^VX zBCB_HANJeoEx|wYNlzZGxZ67Im}-&Xm*T~VQipLj*d#igJB>*9}RT+FZZ zfoEEM?Cj}GPd}}5F@wIl%EE!Q{CW97S5Mlkq(A);dkl=0+(r0z=o7t%KjIO?@4Wg| z!&y)MnPKNHeOa2)bdTn=BYiPP6O3*7YvZkwV!C#TpWV-q^c}15pZKJo9^2_~8Q`da? z+TlL=5-&dFeaz%%2{vyz(PX@|r|s4A z&X2L2b7i?SBh-(#daD$1*Wqfk*-|QgBkEY|ID@!tM;XQcU43%+woBeNyz0VN4PX80 zSBE3`c{-7?Y~GvZ9~NzP{qc(gd3K0}Cq7SYp3HW*G2E)LR_W-d>XIbZy(FmfZ!^UB z_*r?;2v?_OcL#hfO?T;?MLa6;vX}j9J%z4MqnZt!*-P!0jg@is$D(#IkM`T`MOwq~ zQw|W{mx>?xux`%hr;3&(<=V3fBmUjR|684Zd{^-s-@JY}@x**Ln@uhUkM?he|08zV z&gH}U_}5>5{qWy(1O8PPzS<8j@6b(niz^WZ={EQ9`M25l=cS^&;Zr9)_8{+24gYv; z*W#k}P^VLj;XIR4m$SGp<`ZXTfCt3MH8{ORm_r;bTwJjvHQB590X81HfX`duX)hTT z%_A6+6Gt5JNFk3WPJA*bC5?d{p}XY=xnmxfzOyGB3eky=zmdHkahj)n2E~3UO%80 z4XhOLT7VnXM#I34;naimBhoW4MWruU=i?BiC8|Rex}{i~>?F0V(3*g3t|Y~sak=PW zNLrS=!A1pZ^*9-=&buZ{u6bnc-0jj(HWP16an7Z0>15!k6dg+i_gVj6;{llW_Z z`Of_W3ZxoeKmI`qPW(KfrNkWOa;g={x00H5v-plbw5fEz{wTk^c$zmzcI?`{+mcyC z{FVU*v-n3bSZ1?$k~1z2@7S9@6GmS0S&;gi%x(w09U&Qc27E+QDnfx_!`b0~FeAK2b)8hM$42e(t@{!5-g7z``^723X z=f5#L|M}1J_X3TLh$>)MX298&>VT%ky=Oz0?92Wd_CO3aeD{@sjbNtI35aTJ{Wyeg z&g&~e_($EIsH*#GQci^IW6WB~86qTiE8>{O=gd%4DSy&Sclb+|n>fybak>vk8i$_2 zJ8`<|oK5@4D<_y&n3k3PPX@#J>n0o+jn9_+LPofqeK6-3vcMM2t$OR{zB`!Mp=UT< zyz1C)|66%BrJwg~mg9d@-!r`EqKk&#dF^Y48*jK#Uy?uE`MjUgT;@uZw8uM%tl#Hk z!DbdPd%XSt$G8aXuk`n<|Lccu`uxY^E}DOSi-ZJ)_MJS$mweL;yV_<~9JFW^K7)=; z#-DuX<6rpbp6F?RWn*Z7JlnO4GcF|bD{PEefa&0s?+kku-IK(jo8O4)M;OpZTfaI#mB*FwPf8q=;RVa`p_7j=?`jYfNe9A8lFaC`e z4`)2_3HqL(zUNqqS-XSSGQ@*Ty^>;(j)e&^nj{Lx?l6C8Cw+^5A^k;|H{{Cx*x9N8b5YJmedKl-uIwDPp zU@QoL_TO3wANQ(^JyB!Jp@_YTecA+vKVqce6IY)_&GG zKJgDZ;_TL+&=MYMEKia&i_gM^Xs>H6`NFt>1Xe=SVB#Yv#nDTrz~clRIFdME@Nz22^UCedvkj!v9Tg4Q>>F)0z&v(f^~|bPbpyUKM|i`siC_v-x+s zE){vun6eOG{ph>66h}9@pv$A~?*?17RTkpoe|~7?J@0k3I_vyy$G>O9>fHd#T0?j zk5#?)!5!N(&Ny?p@~SKKIK+LL|Lvho_4Q|ts{Gkth=NKWbI$X3;W(XMx0E`@6x+y| zBi=QtP!6ir)hbIN|Iss^Fo`9Rqa=+vhGteS>WAqxiZiKo^S|+zy6JzC!S@c;PgkG+_Ottwsl(q) z{A2!W*%H5R%^>F>;*TvoJ`18>-5lwRQ_@!&=+?>Tmo57_8WK4EOA!*3!j@m;i0kd> zh({FhYY8m_EW>J zz2Ny;!1n0NuE8^}Z9|?`N<`~b2eB_MCT*>kK|6BnIqz48x4!*t(ut$^ z*4jTCfArxnH5>n}@PA!C-~*YlR{o(6zS(=*-eJGuw9x)-_J0%akc9vFirI%g^r7K( zuY28a*#|CD4(-#s)%2!PfA|Gql!)*0{G0VZTq(WlfB*m_eMv+?RB&&F|G~EZv_07Q zzZLNhUtr;U{B^0w;}96%EiZ8R69HB9e{y7lSOt1tkB>f&fgFva$at^JN{H59Q6ST+ zBPvVrbD_3WSPE`k`~+%n2ZL`VQguFoMIU|)_HjS?lf&y@|N7xkk9t&+pk--mL!*DL zyE?+3ljXf%nNn)Mo5ZUhP<_vyJ^sPkBaYagVf6m}@&_cVu?AWzS3zrDXjS~^- z=OaxoP}Digk_hD5O!tL2+8iM%PIfI$F*)d|5Sfb(<9SujuC2mHoE6*vzv;9lJ~Hc# ztF!j=(BO|g@PWgB`1da#p7M)N8BTn_iSmWK0b!QW^6E(+E*R*$SX}B-wC^9KM6Dm& z^Q$`Jx`c-pkIaM4)c>JY9#xZZyZn!KhK)Yh}E7w~}Ie?dLT3-ZcMMQ~LGC51=YGl^x->ca zX-^q`37!g_+#IMojmne5;N=|F}7SrygbTQM72vvD@tb8+Eh&BYKYR;{X0f!~b~mCBsqN z$Kv-5@5T8~EPDS(YHGVp`KKR*)#DI#R^`B=0TpckRgihgm1~Sl7b&RW(8&*p#W@%p zP-rm6W2Y^N0s|dlj#Izv=QOP@OD%yzh5Fd6h0l3goa-&aw++UZO#Y+0<*UM?+Uy5- z9ee}`P2}|eU+Am*Uy`+Z_s-$zPd{h)7r*}N!$0`(pU5LE_9K73^hb3xi;}c7QCRxU zjJO@WB{%4N#`TuB__a38PN>1>zpAa@_UqwY9bMeFq5Yyl4l=Y0`&CH|ErTX--f7$7 zuR8w|KXOaMy8p8=erLZ0^!^74(PRGY)dQ&Q=DhGip`fGHm#y+YUl+SpKZ*9ni{7M% zN&jfL`KFuXBi~9E91fY30>w011(z0DGQT7YslV^?HmpJtPQc62T)1rF)Ix)$Eb& zmPIp$VOKReG#qut^xKNT2Y(VffU2u !>75g(x;p9R++0(hd80-?RAyxdtA@Io2u z6ZR)A*4qABxZ%M5G)`Ec`LY+G6!nqB#~pv%@Y0vOba?97PaPh4$|HxJx>Tr#3n7Eg z1=Z3~t;#?nFxAQpd=yyrocCPa$){Kayva<$u2N(_borTP3XvS~}@C zK>wraZTgDXm%s9r;e#Li!0>yo{k`FffAd9u-HLZ+`D$6uoa2V2kSn6H=!3iPw`V%d33*T%AQU&)AbvIp`&;JJ~0!T*YMuK`2QB2)qO#W)cfB1?&1CK|G;qN6<7Jw%p>)I4by?5h z8P_hQ^|;dc85~DDRyGz2FUVSAyl^o`D7ELj)t7qeqK}Amg}}wJP@M!)4U)wxJan=0 zSsb)nhQ!L=;rmq5gMrb>uPU&ddHT$$I<;^3CWyB2ol!~PBaOyrYJ(ZHlEwP4So*X! z22Ig6p<3WuNE@+z+|%O*{z)gDH2l*SzGyh>=YD=T?X**MDW@+%hvl(FHvBVXN%suZ z*xa*6H|O8_7JuT2xaNQKRNIfOaD;Wy9{V*A{tu19enrCZ=j;Gx(KTVoo&c6hS5ok_vBBHdVw7~UIaJVuCyvr~YPrQHPI1Z>7) zj35jiaNP;7y6jcekjI!=J(2`;v;mQ6Y9dd?^lW5*oq?Tjzxxd@__gQzDg0AUJ#{!v zzp#B6H*Z65F!tMp_&ve2{QhAx*?y*vjGFU5YGYRrs**aVNK|U} zQ&0M^7bZH{n377wnV3=6-yFV2aqXV;&kxW6`K%*!GkHz_gMJR+zGj8{+StJtggS4XRoFSI#x zwLYrX-0JW`+zNd2X8ytFWD72~<}6U{$2pd;ef&iX{f?cxbg7t5DqTX5Bv6S>4Y^5o z$(jVA1BWw+qchg+=#7~oDKfx|*(g1@P`(Ma5)%sJhx8PfyLIp_4uHgWaOhND?L1U% zI@?e)i6s)ZxuXKH4!$_<*ms+59N#(oy@x+yc+6uTGd$~=&m126*vAg1Jn|IZq(-WP zTk_p8-4xWccNqRozi#uO2R+z7G<$eHfQpVw{g3^diN63*%l6NLqm&ZcgB}xQu9PeB zo8v>E7t$6FJE15_>T>)b_mlHHp?=OY&IzHDZF*0;ev(W{G-z2nhOdA9>%(7Pef99p zcm3JGS9Sj83;Y`SE%_Sdj;rivPeFLzJM!5>_1i#=k^hVG4_0z2@exI}v8&$v-w#00 zw`qW7jGR%X(Wdg>Clkp;?9}fwt#$Fm(#kS?>Cxg3lr2#O`#qNU{jTtxn^UtO(><(VNLGA^&c>?e^ic z(@*#1oKR9`(3mJd)X|N0RVcsv-S6nJlD7?i_O5pgAG`Xmbq4p{;qb$BcBN8}^EAQ8 zOa54-@Y#I+nTYtyeijHXZ1G*58nV4%7`_SJLv&|<;@SRYOX%P?tw<(3_CNaSuStR_ z=O1|pmdB&o@IC+F%6^o=|GiSiw`{9#IWcb~QU96VHc$IN$#{4154|KriCXfEB;d(Z zN2Caxi#vB7twlc_gig7XV+eoyGWmt;wsyJNOEk%|&(i3wxWzckDmGdpnX=KDl#uXH zCy7>GE_~V~EI03!sxn9oJ1+36ZwCQ_zbn=?@h#Vz435Q^!uI%~Qt?{_*`FVjx((#M z#IMD0}RYupiLd_ueKubULj_J@0wX8=n2_XX}&5 zQ}oXChv?l*M0qU6x8RV;2*Kp%xXwE3tl?{V>%d_gNj;#A^sB|8c)|B@`d{qh{iR^B zvd#ad4*hKx_-TLdf25K^etCvSkQ+`Ib*;8(EB?|4Ipu%2u)6ublM*R9k6#FeRAcw9 zox>mgmp>ey^{i*ghq2%wx9}%5G4TxIcfS3d;ree~KU{LjTZTXQgV*UH(wn@-AFlh6 zT+Ul(F)qqK#*D2!xkFiMf8ER@p|D$wK4|3pOZSfXAL2r$wk%7|Kk+MT++X;#D*r4O zT5DeV!OLXlpr#Rsgi9BDR6?Yux5lxR65H5=kCA+blDIL}gc8v_CJW_)%UhJSQyri* z7ZK`5#D@45upWK~+p5d(OVPU$pMc(}w@?ry&c=9s&M*DaKOP?c_|u1G#pAt{Pta;@{MRk9zazk-TeuaoNy*lCUxt5s_&EsUWFO3EtvgS+*el zi!|5}U)Id!pTU;kugE{%$Muj0KWKQ(YhE*)t=DmTvZfgPh7sJzze5kIe&XYw7~b)Y zcgT-d4wwJchxMuCUaQX;R-9ci!HLU^{Y&s0?Tix+$bOVv=Km%5GqA0Bx4>u3taan32Hl@vTHyscO)8-}#?z7Nvb!lur1O`wovj^|axFm%VIw z^kW{Q#a|gA+S_lxb$G|0zH@lfMQ;ZwhH$F8UHBlE8R+4LD>SM(#rI1U zm9@+4N5;e^$*H!5s!{d_LTvfrhdcPvFl&W53ZF@M=WvvN(MKNHLjU*pM(u;9j%ZHp z-%5NZdBf=|XtNo7y)8m#P|i_pn3VCtK3Smuhv_xRM{2=$S>k_Uv`+k2+28K>%!sP^ z+n?KrkNum?KXjrjvmb%nDzR^UR;UDBk^hiTdbwr42iCOT3zr!zO-ZPrYO5COqyQXf zVDd><#yMhzDK&?zi9d}HH`MS(#ZqX6JT<-0^mHE8Ml*IDd|!+^3MmwRf&ReY6Pq3J z)sXhV%0bva#_Qhi|2y^N=Y6_P;gb7s-PG}1lLO-Deebv53ye0*(iV5-59J;-|0W9; z3l=81P&qBCFe4Lvy3`XL561#B~JX5ESb&QbwIg^ z_}aiH<9#+5v$4ZRo=SQ-YzXbzRy_^9p zZ4uc1=$*&M{vKb#vxNQdg)WQjH~5nH8yIFgE_Rjw(al)+-yn(1E^LVSm+ls`ApWvS z!H@W3A-re{B0F@9R@fi0^ytL@pGZLng&&et(zIw&Ry=UT9gM&T$_ z01>U7QGnW8L)<4E^FUimG)_7Ye7VE25=Ro3<1-eD1`oRQ_`zxY8YMi@v)KMweDt6Q z$M#3dE-^Hl-hMw!qrS2~>=?K3Gv$~0AABXReH*gFiXNXjupxDdU-mNrBDFjYInXXd zW)(j1FWE3qpN+q|8clD1;m_J1ZKR>ef#V||T@X_`uEGy}N}KS)B7FHn;&khOgZ$ep ze&|@5V*O(K!AGw?{^TpR6g17b-;lYk)iIdIVy` z7jN?|oRmfJFRYp~C|7+wepnFs#}>_ce8dZX=dPV;nL0$`0E1tvAl_1Td7Y_bMZ~oF3M#VQ_OOM&t1D{wYZ8tb?KQ!Ena^Nh01H=3IQiF$*x{-;*K02);d?yf*~DPh z`Fe@ZENHto=1A7r8DE3Ay5T$N6Q4zbwg`;x8$`$wx8)>00xU)N)Xl(Hg1HZxu`uLM zO7&?IQ?B82hUkB?zwpJ@?6*j5yaz*r*blJJIcVu*)4>vGjYm48|&n*Gwl5crh*Gru;N>Y%X)giXf3?C4D<;ETxfPdsz;&vL*}rSc!8XcxX4CX9ZnVxiz) zsxAJABL2>a#Mh|tB@_JkRMDE#Q8E#OH@pfNGNy0tmR@Ql#!ugW1FbWp)@4p?GkmG3X0W6^s%c?l->L;YbL@NdTP?p}!3)UJXs`kJ+qI zur`4&A@MaPapFQNjAE`JuGv!1-p}H1!!3o zo{7|dp!Q3`1m7?-_yTG;rGxBfYaKciKD22UJQl~W`kMVELwm-R^JDzYfB;v*{*CaV z^+%@8BHSvup??uNlNqU}}GOWTE{%K6(%c$=qN5r%N>aIXUaOgJt-e z^?#2~9E4>2-v5d#C|kVx9wMjrNCV3 zTPyyv_-aq`&*Kut%E#G@5LV(>{x8FC@h@4SKtI_R;;)l`TWx>Z5dM_?i~KJdeBb zto>xoX7YbK;%}YToPP&{Uw&g>^Z!8RU&-0R`8O_H67F@RW|<~?v}12yK~pD9(B&Bv zmr1pF#b+j>qcoY(Y+H=i>Gff{K?9#lqg91j4nBop{Vl{t84awBUl@|N7CzYU1WcS& z_x5iVU!q(#gAc=2*&pbZx3>L1Ncgt3%Rl1pzPm90R^cDW{L6g4r^jCl7te7qKedQx z!QfzmZIt-9zgt|~Nq^9=zChg0fP7k!0vLmiansS@vM?4JU;jf2rbzh#)gIq{jB%Q0 z3hgN3v0QeR8=Xi&mOqI}8q=vBbb;?rFl=Pn>OsU#@hw$jcNP9-?C<@L{oJ-8M%!&a zm-xhk^R#=C|0BuA_>(Su{2hDx6o2kJVqGf`tLdHgq*At8{w?x zek_Tij*vwPgaD5;Cbc?z_zT9e09u0I;{`^qi%~*EZoy}wG14X;h9!Q;fhSb(xLebo**;}()0-y_101DiCJ{hB9}(&Tma&-;I5Y4okD zJkaa2Jpao7u=n}b$G_dC6`0j(ScTDbWCW_G>_;n#?WLOe*UQ5d4DrX?7x2Fq#8ONH zMGsAt;)`~~pE@*!Ps{Dj|CRqx1$Au$pB#ay?57E7?z~rzx!F?^#eI=WP?rIsEvU|Z z_~_;j9!k7@0&p7IQ9Vj$TtPG@c_e#(rX>|bl)8%>3fv&k>f}`}EC+^D+j^)cKcCb- zjEKD&DwPbbn=3<^Zfk}#yZKs7$dp&|5WiZtX{N4AoMP4wW( zaBNY=;ue91PjqS5C@uOic6_`;ef*c~-g_aHq4Ed-m9|A$6}uZY?IP@)fU z$~Ob2ypR#`2yIX^{0|zE>bz#uvr&c=n--&J36G1wM*piP@gtr|qFwncEFA5pzcMwb zN~5r{d{Re$vSq|q&G<;5(57pQbI1=V;enuw{7)WpA|WJCJr#ZP@kft7|FKvSB!&fU z%)hWBrHCgq4gY7|lEUtwLzA-KQZ1LbLe-DOf>!zG;buQlumzNw*AZv+Nfx?NkXZ35 zjxqlX8nmjyLXQ@%qjZHP#_a43N)}J-_-Gdeg1J`)L!vi?GFIbthNZ61G^{s8@wMlk z=ygKZ1T)hFKXeNDg<5i|4c8PuwT|dBtWxgM61WNbSK)`;*iP}2YX-l(wXXkdRDvMC z>@E8@iw~a@>mFji4^mrbKOV#b6@S`snTL17zfkyPor>K?_3?wG*{ zNsxh0+o#|OFygDjXE5wdsLe+9OI+f|u|r=|f*JnOOL#Qv=ng$9EwX>=e{=|ymis^O z2~T)qBm3ny9_X{C)9f1IhNv66*5Hj4k$emLY+ttc!i zc+mGlb0X7Y6M`&T*e?|FxcY6(y7)*{N&6kSmHEHie()Wa#7C&J7S$xb_dmH4Ut>w7 z6W=@=;3JH)xKO%}zl7Ki2wT_w5#K7{iv{?`luS!5Xt#R&RH^yjR%ZT9?YHih6T%{& zvp$3G2T2~C;j5zFE8VC*QE#x3<8pyM+H?~UKcI!Pq90lp@j0Q@ z2#Fzwv2fICd@6LhG^E=Cpqietjjz90!5FuKmvX&i(_% zk2E6DqO6B6AIZis{)Ag`c5+G%W4vtA56-TNe|Z>(MOhDjKK_O8d_uW3^N;uw@zMbZ z1^4|ebK$zMe`jl4d<6BCH&*aZ#BmmgTn3{jszX<Zd<=2CxbZB-hXVPU ze}@YQfBR7)XJ_Co!*_qpKkK(T|G_z6|F3Jm^*%8B7p*_-jLZIX6fhwSP50QzRcDO4 z^({S8dB*nZk}>#kh6Y&d2!PpQgkN9T;WtL4Xm%bidU2x57*z?V)*LZh1`^zlO=6MO~{Ybwq`;!>g7r5hs@%b?QuqTcYKus+&gKlsq9pHHWJ8qB4H z`{-A(S#+Qy2=M9;=k;SYY{viaJ5keq_|1xp4xhSwy3+qfhaUm@1H8lc{Ut157+h_j zVq^Ptq_Y07K}4(f{}Ozk-N#Wb_$@W~!7w2D(~t~fvS>v}MttdJd?Smh>{r`$ac*e8 zcznMooQMg5Z^>$?UnJV=ul7_c|I`^n+LCknBC=g!{>(paJD{HUTxKxB!jKXKQMdi# zGG8v*DPhD%e|7p&UUhzBlbmbzOBvq05SNS0D-WfTAi$3VO9>k_XC=^M^oKo(oIY4+ zzwqbcpZGmQC=qzZ2cXZt8T@!0LY-dK%*_lyA#DIfNejpiSVMo?#A$E6?!p`bvm4AG zxNh6ZWYky$4EgFKsh8mkeTT+)%9m?Qq@$L_)1}G;-xNs@q@fRd{)@4t_$(4k9wr0A zu^*ejS7%J-4e)EBNjFaHXR+eH##;X>`^*2m{nA7t5a7%1!|+e^I8l9{34*fUHbG2B z;?sm@k^fQ7{EVmleuYu`AAFB{cw_(1;>+HJ_RBYMk1X-6-;Dol^d|AkPCG=37k=r5 znU#Mwtixx~nT`Ku?eFo4Km5J_S=98#lBM&n@GJk}cYcab^_BULZRD~2HWPnrmEHUj z+e&=#I{)`Ch`;nOzA>a1wAh=FvD213LkBSNzp9h`EBhUj&i@j$aQ;h-E*16aW+yPx zfR11ZDHOjK?#71*>lU2h zp!9(CO?=ZKJ7j`y3}i{wDh*$ba$wiBKQ&*9F94wM3DJpXb*L9IV>9+w0?pbFOYvC* zx-PI^SRq1V1qHrnoBv7lMfQuqpHz~-g)dnC4X u$5r^^jW>^ow#N@7*loAAfKUA|-v19M=gUl!c@G=_0000 Date: Thu, 5 Jan 2023 14:26:16 +0800 Subject: [PATCH 4/9] #78 store session data locally: ~/.tea/tea.xyz/gui/tmp.dat --- .../components/NavBar/ProfileNavButton.svelte | 4 +- modules/gui/src/libs/api/mock.ts | 7 +- modules/gui/src/libs/api/tauri.ts | 9 +- modules/gui/src/libs/stores/auth.ts | 90 +++++++++++++------ 4 files changed, 76 insertions(+), 34 deletions(-) diff --git a/modules/gui/src/components/NavBar/ProfileNavButton.svelte b/modules/gui/src/components/NavBar/ProfileNavButton.svelte index 54d4f0b..d7b53ed 100644 --- a/modules/gui/src/components/NavBar/ProfileNavButton.svelte +++ b/modules/gui/src/components/NavBar/ProfileNavButton.svelte @@ -4,10 +4,10 @@ import type { User } from '@tea/ui/types'; let user: User | null = null; - const authPage = `http://localhost:3000/v1/auth/user?device_id=${authStore.deviceId}`; // https://api.tea.xyz/v1/auth/user?device_id=device_id + const deviceId = authStore.deviceIdStore; const openGithub = () => { - open(authPage); + open(`http://localhost:3000/v1/auth/user?device_id=${$deviceId}`); try { authStore.pollSession(); } catch (error) { diff --git a/modules/gui/src/libs/api/mock.ts b/modules/gui/src/libs/api/mock.ts index dd5b2c0..bca61a8 100644 --- a/modules/gui/src/libs/api/mock.ts +++ b/modules/gui/src/libs/api/mock.ts @@ -323,8 +323,7 @@ export async function getCategorizedPackages(): Promise { ]; } -export async function getDeviceAuth(): Promise { - const deviceId = 'xyz123'; +export async function getDeviceAuth(deviceId: string): Promise { // const data = await get(`/auth/device/${deviceId}`); return { status: 'SUCCESS', @@ -354,3 +353,7 @@ export async function getPackageBottles(name: string): Promise { { name, platform: 'linux', arch: 'x86-64', version: '3.40.0' } ]; } + +export async function registerDevice(): Promise { + return 'uuid1234'; +} diff --git a/modules/gui/src/libs/api/tauri.ts b/modules/gui/src/libs/api/tauri.ts index 9b0500b..e9d99d5 100644 --- a/modules/gui/src/libs/api/tauri.ts +++ b/modules/gui/src/libs/api/tauri.ts @@ -175,9 +175,9 @@ type DeviceAuth = { key: string; }; -export async function getDeviceAuth(): Promise { - const deviceId = 'xyxz123'; +export async function getDeviceAuth(deviceId: string): Promise { const data = await get(`/auth/device/${deviceId}`); + return data; } export async function getPackageBottles(packageName: string): Promise { @@ -188,3 +188,8 @@ export async function getPackageBottles(packageName: string): Promise console.log('got bottles', data); return data; } + +export async function registerDevice(): Promise { + const { deviceId } = await get<{ deviceId: string }>('/auth/registerDevice'); + return deviceId; +} diff --git a/modules/gui/src/libs/stores/auth.ts b/modules/gui/src/libs/stores/auth.ts index 3ccf368..bcbfe21 100644 --- a/modules/gui/src/libs/stores/auth.ts +++ b/modules/gui/src/libs/stores/auth.ts @@ -1,42 +1,58 @@ import { writable } from 'svelte/store'; import { BaseDirectory, createDir, readTextFile, writeTextFile } from '@tauri-apps/api/fs'; import { join } from '@tauri-apps/api/path'; -import { getDeviceAuth } from '@api'; +import { getDeviceAuth, registerDevice } from '@api'; import type { User } from '@tea/ui/types'; const basePath = '.tea/tea.xyz/gui'; interface Session { - key: string; - user: any; + device_id?: string; + key?: string; + user?: any; } export default function initAuthStore() { - const deviceId = 'abcdevf'; // ideally randomly generated on install - const session = writable(); + const session = writable({}); let pollLoop = 0; - initSession(); + + const deviceIdStore = writable(''); + let deviceId = ''; + + initSession().then((sess) => { + if (sess) { + session.set(sess); + deviceIdStore.set(sess.device_id!); + deviceId = sess.device_id!; + } + }); let timer: NodeJS.Timer | null; - // TODO: - // fetch session data from local - // fetch session data remotely - // update local session data + + async function updateSession(data: Session) { + const localSession = { + device_id: deviceId, + key: data.key, + user: data.user + }; + saveLocallySessionData(localSession); + session.set(localSession); + } async function pollSession() { if (!timer) { timer = setInterval(async () => { pollLoop++; try { - const data = await getDeviceAuth(); + const data = await getDeviceAuth(deviceId); + console.log('dd', deviceId, data); if (data.status === 'SUCCESS') { - session.set({ + updateSession({ key: data.key, user: data.user }); timer && clearInterval(timer); timer = null; } - console.log(data); } catch (error) { console.error(error); } @@ -52,6 +68,7 @@ export default function initAuthStore() { return { deviceId, + deviceIdStore, subscribe: (cb: (u: User) => void) => { return session.subscribe((v) => v && cb(v.user)); }, @@ -60,36 +77,53 @@ export default function initAuthStore() { } const initSession = async (): Promise => { - await createGuiDataFolder(); - const session = await getSessionData(); - console.log(session); -}; - -const createGuiDataFolder = async () => { await createDir(basePath, { dir: BaseDirectory.Home, recursive: true }); + const session = await getLocalSessionData(); + return session; }; -const getSessionData = async (): Promise => { +const getLocalSessionData = async (): Promise => { const sessionFilePath = await join(basePath, 'tmp.dat'); + let data: Session; try { - const data = await readTextFile(sessionFilePath, { + const encryptedData = await readTextFile(sessionFilePath, { dir: BaseDirectory.Home }); // TODO: decrypt then return - console.log('data:', data); + data = JSON.parse(encryptedData || '{}'); } catch (error) { console.error(error); - await writeTextFile(sessionFilePath, '', { - dir: BaseDirectory.Home - }); + const deviceId = await getDeviceId(); + data = { + device_id: deviceId + }; + await saveLocallySessionData(data); } - console.log(sessionFilePath); + + return data; }; -const saveSessionData = async (data: { [key: string]: string | number | Date }) => { +const saveLocallySessionData = async (data: Session) => { const sessionFilePath = await join(basePath, 'tmp.dat'); - // TODO: encrypt and write + // TODO: encrypt first + await writeTextFile(sessionFilePath, JSON.stringify(data), { + dir: BaseDirectory.Home + }); +}; + +const getDeviceId = async (): Promise => { + const hasLocal = false; + // get from local data + // else get from server + // GET /v1/auth/registerDevice + let deviceId = ''; + if (hasLocal) { + } else { + deviceId = await registerDevice(); + } + console.log('deviceId:', deviceId); + return deviceId; }; From d542c37ed5ec63344355c984bd1b8e6b61bf4cb9 Mon Sep 17 00:00:00 2001 From: neil Date: Fri, 6 Jan 2023 11:14:00 +0800 Subject: [PATCH 5/9] add node --- .github/workflows/main.yml | 4 +++- .github/workflows/release.yml | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8a4fe8e..09a1f96 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -130,7 +130,9 @@ jobs: build_platform: ${{ matrix.platform.name }} run: | aws s3 cp ./modules/gui/src-tauri/target/release/bundle/macos/tea.zip "s3://preview.gui.tea.xyz/release/tea_${{ steps.date.outputs.unix_seconds }}_$platform.zip" - + - uses: actions/setup-node@v3 + with: + node-version: 18 - name: Slack Notification run: ./.github/notify-slack.js env: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f87c32a..5121603 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -88,6 +88,9 @@ jobs: "s3://preview.gui.tea.xyz/release/tea_gui_latest_$platform.zip" aws s3 cp "./modules/gui/src-tauri/target/release/bundle/macos/tea.zip" \ "s3://preview.gui.tea.xyz/release/tea_gui_$tag_$platform.zip" + - uses: actions/setup-node@v3 + with: + node-version: 18 - name: Slack Notification run: ./.github/notify-slack.js env: From 7d100e620928582fdeade8e05877cb3e26d86d8f Mon Sep 17 00:00:00 2001 From: neil Date: Fri, 6 Jan 2023 11:22:01 +0800 Subject: [PATCH 6/9] bring build_output step --- .github/workflows/release.yml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5121603..55ee181 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,7 +20,19 @@ jobs: container: ${{ matrix.platform.container }} steps: - uses: actions/checkout@v3 - + - name: build platform output + id: build_platform + env: + platform: ${{ matrix.platform.name }} + run: | + EXTENSION=dmg + BUILD_PLATFORM=$(echo $platform | sed -e "s/darwin+//g" | sed -e "s/linux+//g") + [[ $BUILD_PLATFORM = "x86-64" ]] && BUILD_PLATFORM="x64" || BUILD_PLATFORM=$BUILD_PLATFORM + [[ $platform = "linux+x86-64" ]] && BUILD_PLATFORM="amd64" || BUILD_PLATFORM=$BUILD_PLATFORM + [[ $platform = "linux+x86-64" ]] && EXTENSION="deb" + echo "build_platform=$BUILD_PLATFORM" >> $GITHUB_OUTPUT + echo "extension=$EXTENSION" >> $GITHUB_OUTPUT + - name: build tauri for MacOS uses: teaxyz/setup@v0 if: startsWith(matrix.platform.name, 'darwin') From 3a00459b1556a3f118b020c22502febcb1dcebff Mon Sep 17 00:00:00 2001 From: neil Date: Fri, 6 Jan 2023 11:34:40 +0800 Subject: [PATCH 7/9] fix release tagging upload --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 55ee181..3ac9726 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -82,7 +82,7 @@ jobs: aws s3 cp "./modules/gui/src-tauri/target/release/bundle/$extension/tea_0.1.0_$platform.$extension" \ "s3://preview.gui.tea.xyz/release/tea_gui_latest_$platform.$extension" aws s3 cp "./modules/gui/src-tauri/target/release/bundle/$extension/tea_0.1.0_$platform.$extension" \ - "s3://preview.gui.tea.xyz/release/tea_gui_$tag_$platform.$extension" + "s3://preview.gui.tea.xyz/release/tea_gui_${{ steps.tag.outputs.tag }}_$platform.$extension" - name: zip .app for MacOS if: startsWith(matrix.platform.name, 'darwin') @@ -99,7 +99,7 @@ jobs: aws s3 cp "./modules/gui/src-tauri/target/release/bundle/macos/tea.zip" \ "s3://preview.gui.tea.xyz/release/tea_gui_latest_$platform.zip" aws s3 cp "./modules/gui/src-tauri/target/release/bundle/macos/tea.zip" \ - "s3://preview.gui.tea.xyz/release/tea_gui_$tag_$platform.zip" + "s3://preview.gui.tea.xyz/release/tea_gui_${{ steps.tag.outputs.tag }}_$platform.zip" - uses: actions/setup-node@v3 with: node-version: 18 From 721c278fd4a42c1ba21added9407feab09fb8851 Mon Sep 17 00:00:00 2001 From: neil Date: Fri, 6 Jan 2023 12:45:13 +0800 Subject: [PATCH 8/9] cleanup and lint --- modules/gui/src-tauri/src/handlers/auth.rs | 5 ---- modules/gui/src-tauri/src/handlers/mod.rs | 3 +-- .../components/NavBar/ProfileNavButton.svelte | 4 ++-- .../ProfileBanner/ProfileBanner.svelte | 4 ++-- modules/gui/src/libs/api/tauri.ts | 4 ++-- modules/gui/src/libs/stores/auth.ts | 24 ++++--------------- modules/ui/src/types.ts | 2 +- 7 files changed, 13 insertions(+), 33 deletions(-) delete mode 100644 modules/gui/src-tauri/src/handlers/auth.rs diff --git a/modules/gui/src-tauri/src/handlers/auth.rs b/modules/gui/src-tauri/src/handlers/auth.rs deleted file mode 100644 index 31913f5..0000000 --- a/modules/gui/src-tauri/src/handlers/auth.rs +++ /dev/null @@ -1,5 +0,0 @@ -#[tauri::command] -pub fn auth(package: String) { - println!("installing: {}", package); - -} \ No newline at end of file diff --git a/modules/gui/src-tauri/src/handlers/mod.rs b/modules/gui/src-tauri/src/handlers/mod.rs index 5ce0e78..cc9a312 100644 --- a/modules/gui/src-tauri/src/handlers/mod.rs +++ b/modules/gui/src-tauri/src/handlers/mod.rs @@ -1,2 +1 @@ -pub mod packages; -pub mod auth; \ No newline at end of file +pub mod packages; \ No newline at end of file diff --git a/modules/gui/src/components/NavBar/ProfileNavButton.svelte b/modules/gui/src/components/NavBar/ProfileNavButton.svelte index d7b53ed..521d9fc 100644 --- a/modules/gui/src/components/NavBar/ProfileNavButton.svelte +++ b/modules/gui/src/components/NavBar/ProfileNavButton.svelte @@ -1,9 +1,9 @@