From ed122b845a730c008ae000f04e322a2fce06ec2f Mon Sep 17 00:00:00 2001 From: Daniel Ehrhardt Date: Tue, 20 Oct 2026 19:04:24 +0200 Subject: [PATCH 01/18] Device groups: shared types for stand-in, browser sign-ins and phone peers --- packages/core/src/remote/devices.ts | 23 +++++++++++- packages/shared/src/devices.ts | 58 +++++++++++++++++++++++++++-- packages/shared/src/mobile.ts | 13 +++++++ packages/shared/src/remote.ts | 6 +++ 4 files changed, 96 insertions(+), 4 deletions(-) diff --git a/packages/core/src/remote/devices.ts b/packages/core/src/remote/devices.ts index e937ba92..6d881025 100644 --- a/packages/core/src/remote/devices.ts +++ b/packages/core/src/remote/devices.ts @@ -263,6 +263,9 @@ export function primaryView(): GroupDevice[] { latencyMs: null, activeRuns: listActiveRuns().length, conversations: get<{ c: number }>("SELECT COUNT(*) AS c FROM conversations WHERE runner_id IS NULL")?.c ?? 0, + standingIn: false, + fullDiskAccess: null, + runnerTwin: null, }; const others = listRunners() .filter((r) => r.kind === "device") @@ -279,6 +282,9 @@ export function primaryView(): GroupDevice[] { latencyMs: r.latencyMs, activeRuns: r.activeRuns, conversations: r.conversations, + standingIn: false, + fullDiskAccess: null, + runnerTwin: null, }), ); return [self, ...others]; @@ -287,7 +293,16 @@ export function primaryView(): GroupDevice[] { export async function deviceGroup(): Promise { const role = groupRole(); const defaultRunOn = getMeta(DEFAULT_RUN_META); - const base = { port: linkServerPort(), defaultRunOn: role ? defaultRunOn : null, ...failoverSettings() }; + const base = { + port: linkServerPort(), + defaultRunOn: role ? defaultRunOn : null, + ...failoverSettings(), + standInEnabled: true, + standInMinutes: 2, + standIn: { state: "off" as const, since: null, takesOverAt: null }, + pendingChanges: 0, + browserSignIns: "own" as const, + }; if (!role) return { ...base, role: null, primaryName: null, primaryOnline: false, primaryError: null, selfId: null, devices: [] }; if (role === "primary") { return { ...base, role, primaryName: computerName(), primaryOnline: true, primaryError: null, selfId: null, devices: primaryView() }; @@ -321,6 +336,9 @@ export async function deviceGroup(): Promise { latencyMs: state?.latencyMs ?? null, activeRuns: state?.activeRuns ?? 0, conversations: 0, + standingIn: false, + fullDiskAccess: null, + runnerTwin: null, }, { id: selfId, @@ -334,6 +352,9 @@ export async function deviceGroup(): Promise { latencyMs: null, activeRuns: listActiveRuns().length, conversations: get<{ c: number }>("SELECT COUNT(*) AS c FROM conversations WHERE runner_id IS NULL")?.c ?? 0, + standingIn: false, + fullDiskAccess: null, + runnerTwin: null, }, ]; } diff --git a/packages/shared/src/devices.ts b/packages/shared/src/devices.ts index ca3e4412..d146214d 100644 --- a/packages/shared/src/devices.ts +++ b/packages/shared/src/devices.ts @@ -1,8 +1,9 @@ /** * Device groups: several full Godmode apps on different computers that work as one. One computer is the primary: it - * holds what is shared (agents, logins, settings, the task board, automations, My tasks) and runs the schedules. The - * others are secondaries: their app shows the primary's Godmode, and the chats that work on them stay theirs. Any chat - * can run on any computer of the group and move between them. + * runs the schedules and is where the apps of the others look while it is there. Every computer keeps a full copy of + * what is shared (agents, logins, settings, the task board, automations, My tasks, phones) and changes travel both + * ways, so a secondary keeps every feature while the primary is away and stands in for it: the automations, the board + * and the phones work there until the primary is back. Any chat can run on any computer and move between them. */ import type { RunnerState } from "./remote"; import type { ID, ISODate } from "./models"; @@ -26,8 +27,37 @@ export interface GroupDevice { activeRuns: number; /** Chats that live there. */ conversations: number; + /** It stands in for the primary right now (the primary is away). */ + standingIn: boolean; + /** + * macOS: whether Godmode there may open the Desktop, Documents and Downloads folders without macOS asking first + * (Full Disk Access). Without it a command that opens them waits until someone clicks Allow on that computer. + * null = not a Mac, or not known yet. + */ + fullDiskAccess: boolean | null; + /** The same computer is also paired as a runner from an older setup: that runner's id. */ + runnerTwin: ID | null; } +/** + * A secondary while its primary is away. `waiting`: it takes over at `takesOverAt`; `active`: it stands in since + * `since` — automations, the board, messaging and phones work here, and what changes here goes back once the primary + * is there again. + */ +export interface StandIn { + state: "off" | "waiting" | "active"; + since: ISODate | null; + takesOverAt: ISODate | null; +} + +/** + * How browser sign-ins reach the other computers of the group. `own`: each computer signs in by itself with the saved + * logins, 2FA codes and passkeys (recommended: Google, Microsoft and others sign you out everywhere when the same + * session shows up on a second computer). `seed`: a computer that has no session for a site yet starts with the + * primary's, except for sites that bind sessions to one computer. + */ +export type BrowserSignIns = "own" | "seed"; + export interface DeviceGroup { /** This computer's role; null when it isn't part of a group. */ role: DeviceRole | null; @@ -49,6 +79,14 @@ export interface DeviceGroup { */ failover: boolean; failoverMinutes: number; + /** Secondaries take over while the primary is away (`standInMinutes` after it went, at once when it said goodbye). */ + standInEnabled: boolean; + standInMinutes: number; + /** Secondaries: where this computer stands while its primary is away. */ + standIn: StandIn; + /** Changes made here that the other computers haven't taken yet. */ + pendingChanges: number; + browserSignIns: BrowserSignIns; } /** POST /api/devices/invite */ @@ -73,6 +111,20 @@ export interface DeviceGroupPatch { /** Primary only. */ failover?: boolean; failoverMinutes?: number; + standInEnabled?: boolean; + standInMinutes?: number; + browserSignIns?: BrowserSignIns; +} + +/** POST /api/devices/retire-runner: the computer runs the app now, its old runner goes (chats move to the app). */ +export interface RetireRunnerInput { + runnerId: ID; +} + +export interface RetireRunnerResult { + moved: number; + /** The runner's background service was switched off there too. */ + uninstalled: boolean; } /** POST /api/conversations/:id/move */ diff --git a/packages/shared/src/mobile.ts b/packages/shared/src/mobile.ts index c1f8e60f..afb83bc7 100644 --- a/packages/shared/src/mobile.ts +++ b/packages/shared/src/mobile.ts @@ -106,6 +106,19 @@ export interface MobileSession { * (`https:///gw/`) while the computer is linked with phone access on. Older cores omit it. */ urls: string[]; + /** + * The computers of this one's device group that take this phone too, this one included: when one is out of reach + * the phone talks to another (they forward to the primary, or stand in for it). Older cores and computers that + * aren't in a group omit it. + */ + group?: MobilePeer[]; +} + +/** A computer of the group as a phone reaches it. */ +export interface MobilePeer { + instance: MobileInstance; + urls: string[]; + role: "primary" | "secondary"; } export const MOBILE_DEFAULT_PORT = 7787; diff --git a/packages/shared/src/remote.ts b/packages/shared/src/remote.ts index a8e10f09..f7a9b330 100644 --- a/packages/shared/src/remote.ts +++ b/packages/shared/src/remote.ts @@ -205,6 +205,12 @@ export interface RunnerInfo { /** Digest of the config snapshot it last applied; null = never synced. */ configDigest: string | null; activeRuns: number; + /** Where phones reach this computer (a full Godmode with phone access on); missing on runners and older apps. */ + phone?: { instance: { id: string; name: string; version: string; platform: string }; urls: string[] } | null; + /** macOS Full Disk Access of this program; null = not a Mac or unknown. Older computers omit it. */ + fullDiskAccess?: boolean | null; + /** The computer's own name for itself and its hardware id: the same computer paired twice (a runner and the app). */ + machineId?: string | null; } export type RunnerCheckGroup = "software" | "permissions" | "access" | "system"; From 777053e21a1ebb7959225ebb63e6e18d202c784e Mon Sep 17 00:00:00 2001 From: Daniel Ehrhardt Date: Tue, 20 Oct 2026 19:16:49 +0200 Subject: [PATCH 02/18] Browser sign-ins: never copy sessions that bind to one computer Google, Microsoft, Apple, Amazon, PayPal, Meta and others sign a session out everywhere when its cookies show up on a second computer. Runners now get every cookie except those sites'; devices of a group get none unless the group seeds them, and then only for sites they have no cookies for yet. The receiving computer drops session-bound cookies itself, so an older controller can't sign it out either. --- docs/ARCHITECTURE.md | 11 +- packages/core/src/browser/manager.ts | 21 +- packages/core/src/remote/browserSessions.ts | 129 ++++++++++++ packages/core/src/remote/runners.ts | 30 ++- packages/core/src/server/routes/link.ts | 6 +- packages/core/test/browser-sessions.test.ts | 211 ++++++++++++++++++++ packages/core/test/cdp-integration.test.ts | 22 +- 7 files changed, 411 insertions(+), 19 deletions(-) create mode 100644 packages/core/src/remote/browserSessions.ts create mode 100644 packages/core/test/browser-sessions.test.ts diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 879bbcc8..4941061e 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -1675,7 +1675,10 @@ A **runner** is a headless Godmode core on another computer (macOS for now) that its keychain). The runner upserts by primary key, keeps its own columns (paths, last use, status), never deletes an agent with an active run and rewrites changed agents' CLAUDE.md. Agent memory is merged three ways after each run and before each start (`memorySync.ts`, base in `runner_memory`; no line is dropped), and the chat's browser profile's - cookies are copied when they changed (`runners.sync_browser`). + cookies are copied when what goes there changed (`runners.sync_browser`, `remote/browserSessions.ts`). Sites that sign + a session out everywhere when it shows up on a second computer (Google, Microsoft, Apple, Amazon, PayPal, Meta, + LinkedIn, X, TikTok, Shopify accounts, banks and payment providers) are left out: the runner signs in to them itself + with the saved logins and 2FA codes, and drops their cookies when an older controller still sends them. * **Chats on a runner.** `POST /api/chat` with `runnerId` syncs, forwards the start to the runner (without folders, shared screens and VMs, which are this computer's) and adopts the answer. The chat keeps `conversations.runner_id`; its messages and runs are copies under the runner's ids. `mirror.ts` applies the runner's events — only for chats @@ -1743,11 +1746,15 @@ and see everything it did. the link (`POST /api/link/devices/join`); the primary pairs back. Star topology: secondaries don't link to each other. Leaving (`/api/devices/leave`) removes both pairings; the primary removing a device or leaving dissolves it. * **Primary → secondary** is a runner link with less: the setup copy (`snapshot.ts`, without VMs, which are machines of - the computer they were made on), memory merges, cookies, the mirror of the chats that live on the secondary + the computer they were made on), memory merges, browser sign-ins, the mirror of the chats that live on the secondary (`mirror.ts`, now also its questions and, for devices, a chat's folder and shared screen there), and forwarding of what concerns them (`routing.ts`). No Godmode updates (each app updates itself) and no runner health checks. Only the primary sends the setup; agents with the slug of a copied agent (each install's "godmode") hand their chats and runs to the copy's agent when the first copy arrives. +* **Browser sign-ins in the group** follow meta `link.group.browserSignIns` (`DeviceGroup.browserSignIns`): `own`, the + default, copies no cookies to a device, each computer signs in by itself; `seed` sends the same as to a runner with + `mode: "seed"`, and the device only takes the sites (registrable domains) its profile has no cookies for yet, so the + sessions it signed in to itself stay. * **Secondary → primary** carries the app. While the primary is connected (`forwarding()`), `deviceRouting.ts` sends every API request there except what is about this computer (doctor, computer, VMs, Android, folders, logs, phone pairing, cloud, licence, voice, devices, a chat-less browser view). Settings are merged: `server`, `mobile`, `cloud`, diff --git a/packages/core/src/browser/manager.ts b/packages/core/src/browser/manager.ts index 5d009326..f87145ea 100644 --- a/packages/core/src/browser/manager.ts +++ b/packages/core/src/browser/manager.ts @@ -17,7 +17,7 @@ import { getAppSecret, isUnlocked } from "../vault/vault"; import { onSettingsApplied } from "../services/runtime"; import { resolveUvx, toolPath } from "../services/doctor"; import { hasBrowserSubscribers, hasBrowserWatchers } from "../server/ws"; -import { CdpClient, attachToPage, getCookies, pickActivePage, probeCdp, isUserPage, type CdpCookie, type PageSession, type PageTarget } from "./cdp"; +import { CdpClient, attachToPage, getCookies, pickActivePage, probeCdp, isUserPage, type CdpCookie, type CdpCookieParam, type PageSession, type PageTarget } from "./cdp"; import { clearLaunchMarker, findChrome, isProcessAlive, launchChrome, readLaunchMarker, writeLaunchMarker, type ChromeProcess } from "./chrome"; import { fillIntoActivePage, fillPrecheck, type FillKind } from "./fill"; import { solveInBrowser, type SolveOptions, type SolveResult } from "./captcha"; @@ -1077,8 +1077,15 @@ export async function exportProfileCookies(profileId: string): Promise { +/** + * Import cookies/sessions from the user's Chrome (profile-use technique) or a cookie JSON into a Godmode profile. + * `keep`: picks what goes in, knowing what the profile has already (cookies another computer copies here). + */ +export async function importChromeSession( + profileId: string, + input: ChromeImportInput, + keep?: (cookies: CdpCookieParam[], existing: CdpCookie[]) => CdpCookieParam[], +): Promise { requireRow(profileId); const { cookies, skipped, source, method } = await importer.collectCookies(input); if (cookies.length === 0) { @@ -1098,8 +1105,10 @@ export async function importChromeSession(profileId: string, input: ChromeImport // (Browser.close flushes the cookie store to disk). const rb = await ensureBrowser(profileId, { headless: true, transient: true }); let result: { set: number; failed: number; total: number }; + let picked = cookies; try { - result = await importer.injectCookies(rb.client, cookies); + if (keep) picked = keep(cookies, await getCookies(rb.client)); + result = await importer.injectCookies(rb.client, picked); } finally { await giveBack(rb); } @@ -1112,6 +1121,6 @@ export async function importChromeSession(profileId: string, input: ChromeImport }); emitProfile(profileId); bus.changed("browser-profiles"); - const domains = [...new Set(cookies.map((c) => (c.domain ?? (c.url ? new URL(c.url).hostname : "")).replace(/^\./, "")).filter(Boolean))].sort(); - return { imported: result.set, skipped: skipped + result.failed, domains, method }; + const domains = [...new Set(picked.map((c) => (c.domain ?? (c.url ? new URL(c.url).hostname : "")).replace(/^\./, "")).filter(Boolean))].sort(); + return { imported: result.set, skipped: skipped + result.failed + cookies.length - picked.length, domains, method }; } diff --git a/packages/core/src/remote/browserSessions.ts b/packages/core/src/remote/browserSessions.ts new file mode 100644 index 00000000..534650d1 --- /dev/null +++ b/packages/core/src/remote/browserSessions.ts @@ -0,0 +1,129 @@ +/** + * Browser sign-ins on the other computers (owner: remote): which of a profile's cookies the controller copies to a + * runner or a device of the group before a chat starts there (`copyCookies` in runners.ts), and which of them the other + * computer takes (`POST /api/link/browser/:profileId/cookies`). + * + * runners get every session except those of session-bound sites; they replace what the runner had + * devices `own` (default): nothing, each computer signs in by itself with the saved logins and 2FA codes; + * `seed`: the same as a runner, but only for sites the device has no cookies for yet + * + * The receiver never takes a session-bound site's cookies, so an older controller can't sign it out either. + */ +import type { BrowserSignIns, RunnerKind } from "@godmode/shared"; +import { getMeta, setMeta } from "../db"; +import { badRequest } from "../util"; +import { baseDomain } from "../vault/passwordImport"; + +/** How the other computer takes the cookies: `replace` overwrites its own, `seed` only fills sites it has none for. */ +export type CookieMode = "seed" | "replace"; + +/** A cookie as read from a browser (`domain`) or as set for one host (`url`). */ +interface CookieSite { + domain?: string; + url?: string; +} + +const SIGN_INS_META = "link.group.browserSignIns"; + +/** + * Sites that sign a session out everywhere when its cookies show up on a second computer (session theft protection, + * device-bound sessions) or bind it to one device. `name.*`: that name under every country domain (google.de, + * google.co.uk); anything else: the domain and its subdomains. + */ +const SESSION_BOUND = [ + "google.*", + "youtube.*", + "gmail.com", + "live.com", + "microsoftonline.com", + "microsoft.com", + "microsoft365.com", + "cloud.microsoft", + "office.com", + "office365.com", + "outlook.com", + "bing.com", + "apple.com", + "icloud.com", + "amazon.*", + "paypal.*", + "facebook.com", + "instagram.com", + "whatsapp.com", + "messenger.com", + "linkedin.com", + "x.com", + "twitter.com", + "tiktok.com", + "accounts.shopify.com", + "stripe.com", + "klarna.*", + "adyen.com", + "mollie.com", + "revolut.com", + "wise.com", + "n26.com", + "bunq.com", + "qonto.com", + "coinbase.com", + "sparkasse.de", + "ing.de", + "dkb.de", + "comdirect.de", + "commerzbank.de", + "deutsche-bank.de", + "postbank.de", +]; + +const BRANDS = SESSION_BOUND.filter((s) => s.endsWith(".*")).map((s) => s.slice(0, -2)); +const DOMAINS = SESSION_BOUND.filter((s) => !s.endsWith(".*")); +/** `name.` followed by a country domain, also with a second level (`co.uk`, `com.au`), at the end of the host. */ +const BRAND_RE = new RegExp(`(^|\\.)(${BRANDS.join("|")})\\.((co|com|org|net|ne|or|gob|ac)\\.)?[a-z]{2,}$`); + +function bare(domain: string): string { + return domain.trim().toLowerCase().replace(/^\.+/, "").replace(/\.$/, ""); +} + +function hostOf(c: CookieSite): string { + if (c.domain) return bare(c.domain); + try { + return c.url ? bare(new URL(c.url).hostname) : ""; + } catch { + return ""; + } +} + +/** A site whose sessions never go to another computer: there it signs in by itself. */ +export function sessionBoundSite(domain: string): boolean { + const host = bare(domain); + if (!host) return false; + return BRAND_RE.test(host) || DOMAINS.some((d) => host === d || host.endsWith(`.${d}`)); +} + +/** How browser sign-ins reach the devices of the group (the primary's choice). */ +export function browserSignIns(): BrowserSignIns { + return getMeta(SIGN_INS_META) === "seed" ? "seed" : "own"; +} + +export function setBrowserSignIns(value: BrowserSignIns): void { + if (value !== "own" && value !== "seed") throw badRequest('Browser sign-ins are "own" or "seed"'); + setMeta(SIGN_INS_META, value); +} + +/** What of a profile's cookies goes to a runner or a device, and how it takes them. */ +export function cookiesFor(kind: RunnerKind, policy: BrowserSignIns, cookies: T[]): { cookies: T[]; mode: CookieMode } { + if (kind === "device" && policy === "own") return { cookies: [], mode: "seed" }; + return { cookies: cookies.filter((c) => !sessionBoundSite(hostOf(c))), mode: kind === "device" ? "seed" : "replace" }; +} + +/** + * What this computer takes of the cookies another one copies here: never a session-bound site's (an older controller + * still sends them), and with `seed` only those of sites (registrable domains) the profile has no cookies for yet. + */ +export function acceptedCookies(incoming: T[], mode: CookieMode, existing: CookieSite[]): T[] { + const known = mode === "seed" ? new Set(existing.map((c) => baseDomain(hostOf(c)))) : null; + return incoming.filter((c) => { + const host = hostOf(c); + return !sessionBoundSite(host) && !known?.has(baseDomain(host)); + }); +} diff --git a/packages/core/src/remote/runners.ts b/packages/core/src/remote/runners.ts index f3cf6c9a..3478f21a 100644 --- a/packages/core/src/remote/runners.ts +++ b/packages/core/src/remote/runners.ts @@ -34,6 +34,7 @@ import { parseRunnerView, } from "@godmode/shared"; import { getAgent, getDefaultAgentId } from "../agents/service"; +import type { CdpCookie } from "../browser/cdp"; import { exportProfileCookies, resolveProfileForAgent } from "../browser/manager"; import { all, deleteMeta, get, getMeta, insert, run as sql, setMeta, tx, update } from "../db"; import { projectOfChat } from "../services/projects"; @@ -56,6 +57,7 @@ import { addWelcomeEvents, setRemoteViewHandlers } from "../server/ws"; import { HttpError, badRequest, newId, notFound, now, parseJson } from "../util"; import * as vault from "../vault/vault"; import { remoteRuns } from "./activeRuns"; +import { browserSignIns, cookiesFor } from "./browserSessions"; import { canonicalKey, fingerprint } from "./crypto"; import { loadIdentity } from "./identity"; import { RemoteLink, type LinkState } from "./linkClient"; @@ -734,7 +736,7 @@ export function syncRunner(id: string, opts: { agentId?: string; profileId?: str } if (opts.profileId && r.sync_browser === 1) { try { - cookies = await copyCookies(id, l, opts.profileId); + cookies = await copyCookies(r, l, opts.profileId); } catch (err) { warnings.push(`Couldn't copy the browser sessions to ${r.name}: ${message(err)}`); } @@ -771,15 +773,27 @@ async function exchangeMemory(runnerId: string, l: RemoteLink, name: string, age return changedLocal || changedRemote; } -/** The sessions (cookies) of a browser profile, copied when they changed since the last copy to this runner. */ -async function copyCookies(runnerId: string, l: RemoteLink, profileId: string): Promise { - const cookies = await exportProfileCookies(profileId); +/** + * The sessions (cookies) of a browser profile that go to this runner or device (browserSessions.ts), copied when they + * changed since the last copy there. `read`: tests. + */ +export async function copyCookies( + target: { id: string; kind: RunnerKind }, + l: Pick, + profileId: string, + read: (profileId: string) => Promise = exportProfileCookies, +): Promise { + const policy = browserSignIns(); + // Each device signs in by itself: its profile's browser isn't even started for this. + if (target.kind === "device" && policy === "own") return false; + const { cookies, mode } = cookiesFor(target.kind, policy, await read(profileId)); + if (!cookies.length) return false; const digest = createHash("sha256") - .update(JSON.stringify(cookies.map((c) => [c.domain, c.path, c.name, c.value, c.expires]).sort())) + .update(JSON.stringify([mode, ...cookies.map((c) => [c.domain, c.path, c.name, c.value, c.expires]).sort()])) .digest("hex"); - const key = `link.cookies.${runnerId}.${profileId}`; - if (getMeta(key) === digest || !cookies.length) return false; - await l.json("POST", `/api/link/browser/${encodeURIComponent(profileId)}/cookies`, { cookies }, { timeoutMs: SYNC_TIMEOUT_MS }); + const key = `link.cookies.${target.id}.${profileId}`; + if (getMeta(key) === digest) return false; + await l.json("POST", `/api/link/browser/${encodeURIComponent(profileId)}/cookies`, { cookies, mode }, { timeoutMs: SYNC_TIMEOUT_MS }); setMeta(key, digest); return true; } diff --git a/packages/core/src/server/routes/link.ts b/packages/core/src/server/routes/link.ts index a197b508..aab8d8c9 100644 --- a/packages/core/src/server/routes/link.ts +++ b/packages/core/src/server/routes/link.ts @@ -3,6 +3,7 @@ import type { RunnerFixResult } from "@godmode/shared"; import { importChromeSession } from "../../browser/manager"; import { config } from "../../config"; import { logger } from "../../log"; +import { acceptedCookies } from "../../remote/browserSessions"; import { readHandover } from "../../remote/handover"; import { fixCheck, runnerHealth } from "../../remote/health"; import { forgetController, runnerInfo } from "../../remote/linkServer"; @@ -74,9 +75,10 @@ export function registerLinkRoutes(app: Hono): void { // A chat of this runner moves to the controller: its Claude session and transcript go along. app.get("/api/link/conversations/:id/handover", (c) => c.json(readHandover(c.req.param("id")))); + // The sessions the controller copies here (remote/browserSessions.ts); one from before sends no mode and replaces. app.post("/api/link/browser/:profileId/cookies", async (c) => { - const { cookies } = await body(c, z.object({ cookies: z.array(z.unknown()).max(20_000) })); - return c.json(await importChromeSession(c.req.param("profileId"), { cookiesJson: JSON.stringify(cookies) })); + const { cookies, mode = "replace" } = await body(c, z.object({ cookies: z.array(z.unknown()).max(20_000), mode: z.enum(["seed", "replace"]).optional() })); + return c.json(await importChromeSession(c.req.param("profileId"), { cookiesJson: JSON.stringify(cookies) }, (incoming, existing) => acceptedCookies(incoming, mode, existing))); }); // Commands for the "fix with Claude" chat on the controller: its agent diagnoses and repairs the runner from there. diff --git a/packages/core/test/browser-sessions.test.ts b/packages/core/test/browser-sessions.test.ts new file mode 100644 index 00000000..fd6234a8 --- /dev/null +++ b/packages/core/test/browser-sessions.test.ts @@ -0,0 +1,211 @@ +import { afterAll, beforeAll, describe, expect, test } from "bun:test"; +import { mkdtempSync, rmSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import type { CdpCookie } from "../src/browser/cdp"; +import { loadConfig } from "../src/config"; +import { closeDb, getMeta, openDb } from "../src/db"; +import { setLogLevel } from "../src/log"; +import { acceptedCookies, browserSignIns, cookiesFor, sessionBoundSite, setBrowserSignIns } from "../src/remote/browserSessions"; +import { copyCookies } from "../src/remote/runners"; +import { HttpError } from "../src/util"; + +let dataDir: string; + +beforeAll(() => { + setLogLevel("error"); + dataDir = mkdtempSync(join(tmpdir(), "godmode-browser-sessions-")); + openDb(loadConfig({ dataDir }).dbPath); +}); + +afterAll(() => { + closeDb(); + rmSync(dataDir, { recursive: true, force: true }); +}); + +const cookie = (domain: string, name: string, value = "1"): CdpCookie => ({ name, value, domain, path: "/", expires: -1, httpOnly: true, secure: true, session: true }); + +describe("sites whose sessions stay on one computer", () => { + test("Google, Microsoft, Apple, Amazon, PayPal, Meta and the others, under every subdomain and country domain", () => { + for (const host of [ + "google.com", + ".google.com", + "mail.google.com", + "accounts.google.com", + "google.de", + "google.co.uk", + "www.google.com.au", + "GOOGLE.COM.", + "www.youtube.com", + "gmail.com", + "login.microsoftonline.com", + "login.live.com", + "outlook.com", + "appleid.apple.com", + ".icloud.com", + "www.amazon.de", + ".amazon.co.uk", + "www.paypal.com", + "facebook.com", + "www.instagram.com", + "web.whatsapp.com", + ".linkedin.com", + "x.com", + ".twitter.com", + "www.tiktok.com", + "accounts.shopify.com", + "dashboard.stripe.com", + "app.klarna.com", + ]) { + expect(sessionBoundSite(host), host).toBe(true); + } + }); + + test("lookalikes and other sites are not", () => { + for (const host of [ + "notgoogle.com", + "mygoogle.de", + "google.com.evil.com", + "googleusercontent.com", + "amazonaws.com", + "box.com", + "admin.shopify.com", + "github.com", + ".example.co.uk", + "localhost", + "", + ".", + ]) { + expect(sessionBoundSite(host), host).toBe(false); + } + }); +}); + +describe("what goes to a runner or a device", () => { + const cookies = [cookie(".google.com", "SID"), cookie("github.com", "user_session"), cookie(".amazon.de", "at-main"), cookie(".shop.test", "cart")]; + const names = (list: CdpCookie[]) => list.map((c) => c.name); + + test("runners get everything but the session-bound sites, whatever the group's choice, and replace", () => { + for (const policy of ["own", "seed"] as const) { + const out = cookiesFor("runner", policy, cookies); + expect(out.mode).toBe("replace"); + expect(names(out.cookies)).toEqual(["user_session", "cart"]); + } + }); + + test("devices get nothing when each signs in by itself, and seed the rest otherwise", () => { + expect(cookiesFor("device", "own", cookies)).toEqual({ cookies: [], mode: "seed" }); + const seed = cookiesFor("device", "seed", cookies); + expect(seed.mode).toBe("seed"); + expect(names(seed.cookies)).toEqual(["user_session", "cart"]); + }); + + test("the group's choice: each computer signs in by itself unless set otherwise", () => { + expect(browserSignIns()).toBe("own"); + setBrowserSignIns("seed"); + expect(browserSignIns()).toBe("seed"); + expect(getMeta("link.group.browserSignIns")).toBe("seed"); + setBrowserSignIns("own"); + expect(browserSignIns()).toBe("own"); + expect(() => setBrowserSignIns("all" as never)).toThrow(HttpError); + }); +}); + +describe("what the other computer takes", () => { + // As the receiver sees them after normalizing: domain cookies with a dot, host-only ones by URL. + const incoming = [ + { name: "SID", value: "theirs", domain: ".google.com" }, + { name: "MSPAuth", value: "theirs", url: "https://login.live.com/" }, + { name: "user_session", value: "theirs", url: "https://github.com/" }, + { name: "gist", value: "theirs", domain: ".gist.github.com" }, + { name: "basket", value: "theirs", url: "https://www.example.co.uk/" }, + { name: "cart", value: "theirs", domain: ".shop.test" }, + ]; + const existing = [cookie(".google.com", "SID", "mine"), cookie("github.com", "user_session", "mine"), cookie("account.example.co.uk", "login", "mine")]; + const names = (list: { name: string }[]) => list.map((c) => c.name); + + test("replace (also from an older controller): everything but the session-bound sites", () => { + expect(names(acceptedCookies(incoming, "replace", existing))).toEqual(["user_session", "gist", "basket", "cart"]); + expect(names(acceptedCookies(incoming, "replace", []))).toEqual(["user_session", "gist", "basket", "cart"]); + }); + + test("seed: only sites the profile has no cookies for yet, so its own sign-ins stay", () => { + expect(names(acceptedCookies(incoming, "seed", existing))).toEqual(["cart"]); + // A fresh profile takes everything but the session-bound sites. + expect(names(acceptedCookies(incoming, "seed", []))).toEqual(["user_session", "gist", "basket", "cart"]); + }); +}); + +describe("copyCookies", () => { + const posts: { path: string; body: { cookies: CdpCookie[]; mode: string } }[] = []; + let failing = false; + const fakeLink = { + json: async (_method: string, path: string, body?: unknown): Promise => { + if (failing) throw new Error("link down"); + posts.push({ path, body: body as { cookies: CdpCookie[]; mode: string } }); + return {} as T; + }, + }; + let reads = 0; + let profile: CdpCookie[] = []; + const read = async () => { + reads++; + return profile; + }; + const runner = { id: "rnr_test", kind: "runner" as const }; + const device = { id: "dev_test", kind: "device" as const }; + + test("sends what goes there once, and again only when that changed", async () => { + profile = [cookie(".google.com", "SID", "a"), cookie("github.com", "user_session", "a")]; + expect(await copyCookies(runner, fakeLink, "prof_1", read)).toBe(true); + expect(posts).toHaveLength(1); + expect(posts[0]!.path).toBe("/api/link/browser/prof_1/cookies"); + expect(posts[0]!.body.mode).toBe("replace"); + expect(posts[0]!.body.cookies.map((c) => c.name)).toEqual(["user_session"]); + + expect(await copyCookies(runner, fakeLink, "prof_1", read)).toBe(false); + // A new Google session never goes, so it isn't a change either. + profile = [cookie(".google.com", "SID", "b"), cookie("github.com", "user_session", "a")]; + expect(await copyCookies(runner, fakeLink, "prof_1", read)).toBe(false); + expect(posts).toHaveLength(1); + + profile = [cookie(".google.com", "SID", "b"), cookie("github.com", "user_session", "b")]; + expect(await copyCookies(runner, fakeLink, "prof_1", read)).toBe(true); + expect(posts).toHaveLength(2); + }); + + test("nothing to send: only session-bound sites", async () => { + profile = [cookie(".google.com", "SID"), cookie(".apple.com", "myacinfo")]; + expect(await copyCookies(runner, fakeLink, "prof_2", read)).toBe(false); + expect(posts).toHaveLength(2); + expect(getMeta("link.cookies.rnr_test.prof_2")).toBeNull(); + }); + + test("a failed copy is tried again", async () => { + profile = [cookie("github.com", "user_session", "c")]; + failing = true; + await expect(copyCookies(runner, fakeLink, "prof_3", read)).rejects.toThrow("link down"); + failing = false; + expect(await copyCookies(runner, fakeLink, "prof_3", read)).toBe(true); + expect(posts).toHaveLength(3); + }); + + test("devices: not even read while each signs in by itself, seeded otherwise", async () => { + profile = [cookie(".google.com", "SID"), cookie("github.com", "user_session")]; + const before = reads; + expect(await copyCookies(device, fakeLink, "prof_1", read)).toBe(false); + expect(reads).toBe(before); + expect(posts).toHaveLength(3); + + setBrowserSignIns("seed"); + try { + expect(await copyCookies(device, fakeLink, "prof_1", read)).toBe(true); + expect(posts[3]!.body.mode).toBe("seed"); + expect(posts[3]!.body.cookies.map((c) => c.name)).toEqual(["user_session"]); + expect(await copyCookies(device, fakeLink, "prof_1", read)).toBe(false); + expect(posts).toHaveLength(4); + } finally { + setBrowserSignIns("own"); + } + }); +}); diff --git a/packages/core/test/cdp-integration.test.ts b/packages/core/test/cdp-integration.test.ts index 4ff37656..9728d1c1 100644 --- a/packages/core/test/cdp-integration.test.ts +++ b/packages/core/test/cdp-integration.test.ts @@ -13,13 +13,14 @@ import { loadConfig } from "../src/config"; import { closeDb, openDb } from "../src/db"; import { bus } from "../src/events/bus"; import { appBundle, findChrome, isProcessAlive, launchChrome, type ChromeProcess } from "../src/browser/chrome"; -import { CdpClient, attachToPage, getCookies, listPages, type PageSession } from "../src/browser/cdp"; +import { CdpClient, attachToPage, getCookies, listPages, type CdpCookie, type CdpCookieParam, type PageSession } from "../src/browser/cdp"; import { getRunning, unregisterBrowser } from "../src/browser/state"; import { updateSettings } from "../src/services/settings"; import { websocketHandler, type WsData } from "../src/server/ws"; import { startLiveView, stopLiveView, dispatchInput } from "../src/browser/screencast"; import * as manager from "../src/browser/manager"; import { loginFillScope, originRefusal } from "../src/browser/fill"; +import { acceptedCookies, type CookieMode } from "../src/remote/browserSessions"; import type { McpServerJson } from "../src/types"; const chrome = findChrome(); @@ -653,6 +654,25 @@ suite("managed Chromium (CDP integration)", () => { expect(manager.getProfile(profileId).cookieCount).toBe(cookies.length); }); + test("cookies another computer copies here: never a session-bound site's, and a seed keeps the profile's own sessions", async () => { + const linked = manager.createProfile({ name: "Linked", workspaceId: null }); + const future = Math.floor(Date.now() / 1000) + 86_400; + const sent = (name: string, domain: string, value: string) => ({ name, value, domain, path: "/", expires: future, httpOnly: true, secure: true, session: false }); + const take = (mode: CookieMode) => (incoming: CdpCookieParam[], existing: CdpCookie[]) => acceptedCookies(incoming, mode, existing); + + const first = [sent("SID", ".google.com", "first"), sent("own", "app.linked.test", "first")]; + expect(await manager.importChromeSession(linked.id, { cookiesJson: JSON.stringify(first) }, take("replace"))).toMatchObject({ imported: 1, skipped: 1, domains: ["app.linked.test"] }); + const second = [sent("SID", ".google.com", "second"), sent("own", "app.linked.test", "second"), sent("new", ".fresh.test", "second")]; + expect(await manager.importChromeSession(linked.id, { cookiesJson: JSON.stringify(second) }, take("seed"))).toMatchObject({ imported: 1, skipped: 2, domains: ["fresh.test"] }); + + await manager.launchBrowser(linked.id, { headless: true }); + const cookies = await getCookies(getRunning(linked.id)!.client); + expect(cookies.find((c) => c.name === "own")?.value).toBe("first"); + expect(cookies.find((c) => c.name === "new")?.value).toBe("second"); + expect(cookies.find((c) => c.name === "SID")).toBeUndefined(); + await manager.stopBrowser(linked.id); + }, 60_000); + test("idle browsers are stopped unless another CDP client (e.g. browser-use) is attached", async () => { updateSettings({ browser: { keepAliveMinutes: 1 } }); try { From 1e5958551142b1b36a56db5bcf57fa0f7d47665d Mon Sep 17 00:00:00 2001 From: Daniel Ehrhardt Date: Tue, 20 Oct 2026 19:19:29 +0200 Subject: [PATCH 03/18] Device groups: shared data on every computer, pulled both ways --- packages/core/src/db/migrations.ts | 33 ++ packages/core/src/remote/linkServer.ts | 2 +- packages/core/src/remote/mirror.ts | 91 +++- packages/core/src/remote/replica.ts | 552 ++++++++++++++++++++++++ packages/core/src/remote/replicaSync.ts | 201 +++++++++ packages/core/src/remote/runners.ts | 23 +- packages/core/src/remote/snapshot.ts | 7 +- packages/core/src/server/routes/link.ts | 37 +- packages/core/src/server/ws.ts | 18 +- packages/core/src/tasks/service.ts | 16 + packages/shared/src/events.ts | 2 + 11 files changed, 963 insertions(+), 19 deletions(-) create mode 100644 packages/core/src/remote/replica.ts create mode 100644 packages/core/src/remote/replicaSync.ts diff --git a/packages/core/src/db/migrations.ts b/packages/core/src/db/migrations.ts index 3d2df1b9..2d0d33f1 100644 --- a/packages/core/src/db/migrations.ts +++ b/packages/core/src/db/migrations.ts @@ -1606,6 +1606,39 @@ WHERE key = 'runner' AND json_valid(value) AND json_extract(value, '$.fallbackMo -- site, no address, mostly a quoted error or another agent's report. Nothing can be added for those. UPDATE missing_logins SET status = 'dismissed', updated_at = strftime('%Y-%m-%dT%H:%M:%fZ', 'now') WHERE status = 'open' AND service = 'Unknown service' AND url = ''; +`, + }, + { + id: 99, + name: "device_group_replica", + sql: /* sql */ ` +-- What changed in the shared tables, for the other computers of a device group (remote/replica.ts). One row per +-- table row: its last change here (seq orders them), when it was made (at, where it was made) and which computer it came +-- from (origin: a runner id, NULL = this computer). The triggers that fill it are kept by remote/replica.ts. +CREATE TABLE replica_seq (id INTEGER PRIMARY KEY CHECK (id = 1), n INTEGER NOT NULL); +INSERT INTO replica_seq (id, n) VALUES (1, 0); +-- While a change from another computer is written: whose it is and when it was made there. +CREATE TABLE replica_ctx (id INTEGER PRIMARY KEY CHECK (id = 1), origin TEXT, at TEXT); +INSERT INTO replica_ctx (id, origin, at) VALUES (1, NULL, NULL); +CREATE TABLE replica_rows ( + tbl TEXT NOT NULL, + pk TEXT NOT NULL, + seq INTEGER NOT NULL, + at TEXT NOT NULL, + deleted INTEGER NOT NULL DEFAULT 0, + origin TEXT, + PRIMARY KEY (tbl, pk) +); +CREATE INDEX idx_replica_rows_seq ON replica_rows(seq); +-- Changes that came before the rows they point at (a chat, a ticket): written once those are here. +CREATE TABLE replica_deferred ( + peer TEXT NOT NULL, + tbl TEXT NOT NULL, + pk TEXT NOT NULL, + change TEXT NOT NULL, + created_at TEXT NOT NULL, + PRIMARY KEY (peer, tbl, pk) +); `, }, ]; diff --git a/packages/core/src/remote/linkServer.ts b/packages/core/src/remote/linkServer.ts index 06050f6b..10f4f460 100644 --- a/packages/core/src/remote/linkServer.ts +++ b/packages/core/src/remote/linkServer.ts @@ -351,7 +351,7 @@ function onReady(ws: ServerWebSocket, channel: SecureChannel sendEvent(link, payload), close: () => channel.close(), }; diff --git a/packages/core/src/remote/mirror.ts b/packages/core/src/remote/mirror.ts index db98b538..c6b0e43d 100644 --- a/packages/core/src/remote/mirror.ts +++ b/packages/core/src/remote/mirror.ts @@ -51,7 +51,9 @@ import { } from "../services/conversations"; import { HttpError, now, truncate } from "../util"; import { getQuestion } from "../services/questions"; +import { liteMessage } from "../services/liteMessage"; import { clearRemoteRun, clearRunner, remoteRuns, setRemoteRun } from "./activeRuns"; +import { primaryRunnerId } from "./group"; const log = logger("mirror"); @@ -178,6 +180,8 @@ interface Chat { state: RunnerChatState; /** Its folder and shared screen there: kept only for another computer of the group, whose app shows them. */ place: { working_directory: string | null; computer_target: string | null }; + /** The other computer only mirrors it too: it lives on a third one. */ + elsewhere: boolean; /** The columns that stay the runner's: written when the chat is adopted and on every update. */ columns: { title: string; @@ -218,6 +222,7 @@ function readConversation(v: unknown): Chat | null { archived: c.archived === true, createdAt, state, + elsewhere: typeof c.runnerId === "string" && c.runnerId.length > 0, place: { working_directory: typeof c.workingDirectory === "string" && c.workingDirectory.startsWith("/") ? text(c.workingDirectory, 4096) : null, computer_target: record(c.computerTarget) ? JSON.stringify(c.computerTarget).slice(0, 4000) : null, @@ -396,6 +401,8 @@ function isDevice(runnerId: string): boolean { /** Adopt a chat the runner reports for the first time, or bring its copy up to date. False: it isn't this runner's to write. */ function writeConversation(runnerId: string, chat: Chat): boolean { + // A secondary keeps a copy of its primary's own chats only: those of the other computers it mirrors are theirs. + if (chat.elsewhere && runnerId === primaryRunnerId()) return false; const row = get<{ runner_id: string | null }>("SELECT runner_id FROM conversations WHERE id = ?", chat.id); const place = isDevice(runnerId) ? chat.place : {}; if (row) { @@ -422,15 +429,53 @@ function writeConversation(runnerId: string, chat: Chat): boolean { return true; } +/** + * A light copy of a message (screenshots as links, long output cut: liteMessage) doesn't replace what this computer + * already has of it: a chat that comes back from the computer that stood in keeps its screenshots here. + */ +function keepWhole(stored: MessageRow, row: MessageRow): MessageRow { + if (!row.blocks.includes('"imageUrl"') && !row.blocks.includes('"resultTruncated"')) return row; + let mine: MessageBlock[]; + let theirs: MessageBlock[]; + try { + mine = JSON.parse(stored.blocks) as MessageBlock[]; + theirs = JSON.parse(row.blocks) as MessageBlock[]; + } catch { + return row; + } + const byId = new Map(mine.flatMap((b) => (b.type === "tool_use" ? [[b.id, b] as const] : []))); + let kept = false; + const blocks = theirs.map((b) => { + if (b.type !== "tool_use") return b; + const old = byId.get(b.id); + if (!old || old.type !== "tool_use") return b; + const lite = b as typeof b & { imageUrl?: string; resultTruncated?: boolean }; + let next: MessageBlock = b; + if (lite.imageUrl && !b.image && old.image) { + const { imageUrl: _url, ...rest } = lite; + next = { ...rest, image: old.image }; + kept = true; + } + if (lite.resultTruncated && old.result && old.result.length > (b.result?.length ?? 0) && old.result.startsWith(b.result ?? "")) { + const { resultTruncated: _cut, ...rest } = next as typeof lite; + next = { ...rest, result: old.result }; + kept = true; + } + return next; + }); + return kept ? { ...row, blocks: JSON.stringify(blocks) } : row; +} + /** Store one message of a runner's chat. Null: the chat isn't this runner's, or the id is taken by a message elsewhere. */ -function writeMessage(runnerId: string, row: MessageRow): "inserted" | "updated" | null { - if (!ownChat(runnerId, row.conversation_id)) return null; - const stored = get(`SELECT ${MESSAGE_COLUMNS} FROM messages WHERE id = ?`, row.id); +function writeMessage(runnerId: string, incoming: MessageRow): "inserted" | "updated" | null { + if (!ownChat(runnerId, incoming.conversation_id)) return null; + const stored = get(`SELECT ${MESSAGE_COLUMNS} FROM messages WHERE id = ?`, incoming.id); if (!stored) { - insert("messages", row); + insert("messages", incoming); return "inserted"; } - if (stored.conversation_id !== row.conversation_id) return null; + if (stored.conversation_id !== incoming.conversation_id) return null; + const row = keepWhole(stored, incoming); if (changed(stored, row)) { const { id, conversation_id: _chat, ...rest } = row; update("messages", id, rest); @@ -454,7 +499,7 @@ function writeMessages(conversationId: string, incoming: unknown): { created: st // An id that is a message of another chat here is never taken over. if (!known.has(row.id) && get<{ id: string }>("SELECT id FROM messages WHERE id = ?", row.id)) continue; ids.add(row.id); - rows.push(row); + rows.push(known.has(row.id) ? keepWhole(known.get(row.id)!, row) : row); } const kept = stored.filter((m) => ids.has(m.id)); const created = rows.filter((r) => !known.has(r.id)).map((r) => r.id); @@ -639,7 +684,8 @@ function onQueue(runnerId: string, e: Raw): boolean { } function onMessage(runnerId: string, type: "message.created" | "message.updated", raw: unknown): boolean { - const row = readMessage(raw); + // The copy of the primary's chats is for while it is away: screenshots stay there. + const row = readMessage(runnerId === primaryRunnerId() && record(raw) ? liteMessage(raw as unknown as Message) : raw); if (!row || !writeMessage(runnerId, row)) return false; bus.emit({ type, message: getMessage(row.id) }); return true; @@ -1050,8 +1096,9 @@ export function forgetHeavyChats(runnerId: string): void { * or updated; those whose copy is behind get their messages and runs fetched; the registry of working runs is rebuilt * from the runner's answer. Chats the runner no longer has stay as they are. */ -export async function catchUp(runnerId: string, api: RunnerApi): Promise<{ conversations: number; refreshed: number }> { +export async function catchUp(runnerId: string, api: RunnerApi, opts: CatchUpOptions = {}): Promise<{ conversations: number; refreshed: number }> { const lists = [await api.json("GET", "/api/conversations?limit=500"), await api.json("GET", "/api/conversations?limit=500&archived=1")]; + const since = opts.messagesSince ? Date.parse(opts.messagesSince) : null; let conversations = 0; let refreshed = 0; for (const item of lists.flatMap(list)) { @@ -1061,10 +1108,12 @@ export async function catchUp(runnerId: string, api: RunnerApi): Promise<{ conve const before = viewOf(chat.id); if (!writeConversation(runnerId, chat)) continue; conversations++; - if (stale && !skipHeavy(runnerId, chat.id)) { + // Old and quiet: the copy keeps the chat itself, its messages come once it moves on. + const quiet = since !== null && !chat.state.running && !chat.state.paused && Date.parse(chat.columns.last_message_at ?? chat.columns.updated_at) < since; + if (stale && !quiet && !skipHeavy(runnerId, chat.id)) { try { const path = encodeURIComponent(chat.id); - const detail = await api.json("GET", `/api/conversations/${path}`); + const detail = await api.json("GET", `/api/conversations/${path}${opts.lite ? "?lite=1" : ""}`); const runs = await api.json("GET", `/api/runs?conversationId=${path}&limit=500`); if (record(detail)?.id !== chat.id) throw refused(); heavy.delete(`${runnerId}:${chat.id}`); @@ -1094,6 +1143,28 @@ export async function catchUp(runnerId: string, api: RunnerApi): Promise<{ conve return { conversations, refreshed }; } +export interface CatchUpOptions { + /** Messages without screenshots and with tool output cut (a secondary's copy of its primary's chats). */ + lite?: boolean; + /** Only chats with messages since then get their messages; older ones keep the chat alone. */ + messagesSince?: string; +} + +/** One chat of the runner, fetched now (a change of the shared data points at it). */ +export async function fetchConversation(runnerId: string, api: RunnerApi, conversationId: string, opts: CatchUpOptions = {}): Promise { + const path = encodeURIComponent(conversationId); + try { + const detail = await api.json("GET", `/api/conversations/${path}${opts.lite ? "?lite=1" : ""}`); + if (record(detail)?.id !== conversationId) return false; + const runs = await api.json("GET", `/api/runs?conversationId=${path}&limit=500`); + reconcile(runnerId, detail, runs); + return true; + } catch (err) { + log.info(`could not fetch conversation ${conversationId} of runner ${runnerId}`, { error: err instanceof Error ? err.message : String(err) }); + return false; + } +} + /** A chat of this runner moved to this computer: nothing of it works there for this computer anymore. */ export function chatMovedHere(runnerId: string, conversationId: string): void { for (const [runId, r] of live) if (r.conversationId === conversationId) forgetLive(runId); diff --git a/packages/core/src/remote/replica.ts b/packages/core/src/remote/replica.ts new file mode 100644 index 00000000..e98f8c90 --- /dev/null +++ b/packages/core/src/remote/replica.ts @@ -0,0 +1,552 @@ +/** + * The device group's shared data on every computer (owner: remote). Each computer of a group keeps all of it — the + * setup, automations, the task board, My tasks, goals, passkeys, cards, paired phones — and writes it where it is used. + * Triggers note every change in `replica_rows` (its order, when and where it was made); the computers pull from each + * other what changed since their last pull (GET /api/link/replica/changes). Of two changes to one row the newer wins, on + * a tie the primary's. + * + * The primary → secondary direction of the setup still travels as the snapshot (snapshot.ts: it carries the vault key + * and the settings, and rewrites agent files); everything else, and the way back to the primary, comes from here. That + * is how a secondary keeps every feature while its primary is away: what it changes meanwhile goes back afterwards. + */ +import { join } from "node:path"; +import type { EntityName } from "@godmode/shared"; +import { decodeValue, encodeValue, type DumpValue } from "../backup/backup"; +import { config } from "../config"; +import { all, get, getDb, getMeta, run as sql, setMeta, tx } from "../db"; +import { bus } from "../events/bus"; +import { logger } from "../log"; +import { now } from "../util"; +import { SETUP_TABLES } from "./snapshot"; + +const log = logger("replica"); + +type Value = string | number | null | Uint8Array; + +export interface ReplicaTable { + table: string; + /** Columns that stay this computer's: never sent, never overwritten. */ + own: string[]; + entity: EntityName; + /** The key columns (one row = one key; several columns are joined with KEY_SEP). */ + key: string[]; + /** Only rows with this value are shared. */ + only?: { column: string; value: string }; + /** Own columns a new row can't take the column default for. */ + onInsert?: (row: Record) => Record; + /** Part of the setup: from the primary it comes as the snapshot. */ + setup: boolean; +} + +const KEY_SEP = "\u001f"; +const STAMP = "strftime('%Y-%m-%dT%H:%M:%fZ', 'now')"; +const PULL_LIMIT = 500; +const DEFERRED_DAYS = 7; +const TOMBSTONE_DAYS = 45; + +/** What is shared besides the setup. Tables with files on disk (task attachments) stay on the computer they're on. */ +const STATE: Omit[] = [ + { table: "goals", own: [], entity: "goals", key: ["id"] }, + { table: "tasks", own: ["repo_path"], entity: "tasks", key: ["id"] }, + { table: "task_events", own: [], entity: "tasks", key: ["id"] }, + { table: "task_dependencies", own: [], entity: "tasks", key: ["task_id", "waits_for_id"] }, + { table: "routines", own: [], entity: "routines", key: ["id"] }, + { table: "heartbeats", own: [], entity: "heartbeats", key: ["id"] }, + { table: "human_tasks", own: [], entity: "human-tasks", key: ["id"] }, + { table: "missing_logins", own: [], entity: "missing-logins", key: ["id"] }, + { table: "notifications", own: [], entity: "notifications", key: ["id"] }, + { table: "passkeys", own: ["last_used_at"], entity: "passkeys", key: ["id"] }, + { table: "payment_cards", own: [], entity: "payment-cards", key: ["id"] }, + { table: "card_purchases", own: [], entity: "payment-cards", key: ["id"] }, + { table: "messaging_connections", own: [], entity: "messaging", key: ["id"] }, + { table: "messaging_users", own: [], entity: "messaging", key: ["id"] }, + { table: "messaging_chats", own: [], entity: "messaging", key: ["id"] }, + // A phone paired with one computer of the group works with all of them. + { table: "mobile_devices", own: ["app_version", "last_seen_at", "last_address"], entity: "mobile", key: ["id"] }, +]; + +/** VMs are machines of the computer they were made on. */ +const NOT_SHARED = new Set(["vms"]); + +let tablesCache: ReplicaTable[] | null = null; + +export function replicaTables(): ReplicaTable[] { + if (tablesCache) return tablesCache; + const setup = SETUP_TABLES.filter((t) => !NOT_SHARED.has(t.table)).map((t): ReplicaTable => ({ ...t, key: ["id"], setup: true })); + tablesCache = [...setup, ...STATE.map((t) => ({ ...t, setup: false }))]; + return tablesCache; +} + +function spec(table: string): ReplicaTable | undefined { + return replicaTables().find((t) => t.table === table); +} + +const q = (ident: string) => `"${ident.replace(/"/g, '""')}"`; + +function columnsOf(table: string): string[] { + return all<{ name: string }>(`PRAGMA table_info(${q(table)})`).map((c) => c.name); +} + +/** The schema only changes with a migration (at startup): applying many changes asks once per table. */ +function cachedColumns(table: string): string[] { + let list = columnCache.get(table); + if (!list) columnCache.set(table, (list = columnsOf(table))); + return list; +} + +function exists(table: string): boolean { + return !!get("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?", table); +} + +/* ------------------------------------------------------------------ */ +/* Triggers */ +/* ------------------------------------------------------------------ */ + +function keyExpr(t: ReplicaTable, alias: "NEW" | "OLD"): string { + return t.key.map((k) => `${alias}.${q(k)}`).join(` || char(31) || `); +} + +function triggerSql(t: ReplicaTable): string[] { + const columns = columnsOf(t.table); + const shared = columns.filter((c) => !t.own.includes(c) && c !== "updated_at"); + const only = (alias: "NEW" | "OLD") => (t.only ? ` AND ${alias}.${q(t.only.column)} = '${t.only.value.replace(/'/g, "''")}'` : ""); + const note = (alias: "NEW" | "OLD", deleted: 0 | 1) => ` + UPDATE replica_seq SET n = n + 1 WHERE id = 1; + INSERT OR REPLACE INTO replica_rows (tbl, pk, seq, at, deleted, origin) + VALUES ('${t.table}', ${keyExpr(t, alias)}, (SELECT n FROM replica_seq WHERE id = 1), + COALESCE((SELECT at FROM replica_ctx WHERE id = 1), ${STAMP}), ${deleted}, (SELECT origin FROM replica_ctx WHERE id = 1));`; + const changed = shared.map((c) => `OLD.${q(c)} IS NOT NEW.${q(c)}`).join(" OR ") || "0"; + const name = (op: string) => q(`replica_${t.table}_${op}`); + return [ + `CREATE TRIGGER ${name("ins")} AFTER INSERT ON ${q(t.table)} WHEN 1${only("NEW")} BEGIN${note("NEW", 0)} +END`, + `CREATE TRIGGER ${name("upd")} AFTER UPDATE ON ${q(t.table)} WHEN (${changed})${only("NEW")} BEGIN${note("NEW", 0)} +END`, + `CREATE TRIGGER ${name("del")} AFTER DELETE ON ${q(t.table)} WHEN 1${only("OLD")} BEGIN${note("OLD", 1)} +END`, + ]; +} + +let ensured = false; + +/** + * Keep the triggers in step with the schema (a later migration adds a column: its changes are shared too) and note the + * rows that were there before. Cheap when nothing changed. + */ +export function ensureReplica(): void { + if (ensured) return; + if (!exists("replica_rows")) return; + const tables = replicaTables().filter((t) => exists(t.table)); + const wanted = tables.flatMap(triggerSql); + const digest = Bun.hash(wanted.join("\n")).toString(36); + if (getMeta("replica.triggers") !== digest) { + tx(() => { + for (const old of all<{ name: string }>("SELECT name FROM sqlite_master WHERE type = 'trigger' AND name LIKE 'replica\\_%' ESCAPE '\\'")) { + getDb().run(`DROP TRIGGER IF EXISTS ${q(old.name)}`); + } + for (const stmt of wanted) getDb().run(stmt); + setMeta("replica.triggers", digest); + }); + } + if (getMeta("replica.backfilled") !== "1") backfill(tables); + ensured = true; +} + +/** Rows from before the replica: known, as old as can be, so any real change wins over them. */ +function backfill(tables: ReplicaTable[]): void { + tx(() => { + let n = get<{ n: number }>("SELECT n FROM replica_seq WHERE id = 1")?.n ?? 0; + for (const t of tables) { + const where = t.only ? ` WHERE ${q(t.only.column)} = ?` : ""; + const rows = all>(`SELECT ${t.key.map(q).join(", ")} FROM ${q(t.table)}${where}`, ...(t.only ? [t.only.value] : [])); + for (const r of rows) { + n++; + sql( + "INSERT OR IGNORE INTO replica_rows (tbl, pk, seq, at, deleted, origin) VALUES (?, ?, ?, '1970-01-01T00:00:00.000Z', 0, NULL)", + t.table, + t.key.map((k) => String(r[k])).join(KEY_SEP), + n, + ); + } + } + sql("UPDATE replica_seq SET n = ? WHERE id = 1", n); + setMeta("replica.backfilled", "1"); + }); +} + +/** Tests open several databases one after another. */ +export function resetReplicaCache(): void { + ensured = false; + fkCache.clear(); + columnCache.clear(); +} + +/* ------------------------------------------------------------------ */ +/* Who wrote it */ +/* ------------------------------------------------------------------ */ + +/** + * Run `fn` as the writing of another computer's change: the triggers note it as theirs (so it isn't sent back) and as + * made when it was made there. Synchronous only — nothing else may write in between. + */ +export function asPeer(origin: string, at: string | null, fn: () => T): T { + sql("UPDATE replica_ctx SET origin = ?, at = ? WHERE id = 1", origin, at); + try { + return fn(); + } finally { + sql("UPDATE replica_ctx SET origin = NULL, at = NULL WHERE id = 1"); + } +} + +/** The last change this computer counted (local or taken from another one). */ +export function replicaSeq(): number { + try { + return get<{ n: number }>("SELECT n FROM replica_seq WHERE id = 1")?.n ?? 0; + } catch { + return 0; + } +} + +function ackedKey(peer: string): string { + return `link.replica.acked.${peer}`; +} + +function pulledKey(peer: string): string { + return `link.replica.pulled.${peer}`; +} + +/** Changes made here that `peer` hasn't taken yet (it says how far it got with each pull). */ +export function pendingFor(peer: string): number { + try { + const acked = Number(getMeta(ackedKey(peer)) ?? 0); + return get<{ c: number }>("SELECT COUNT(*) AS c FROM replica_rows WHERE seq > ? AND (origin IS NULL OR origin != ?)", acked, peer)?.c ?? 0; + } catch { + return 0; + } +} + +/** Keys of `table` changed here that `peer` hasn't taken yet: a copy from it must not overwrite them. */ +export function pendingKeys(peer: string, table: string): Set { + try { + const acked = Number(getMeta(ackedKey(peer)) ?? 0); + return new Set(all<{ pk: string }>("SELECT pk FROM replica_rows WHERE tbl = ? AND seq > ? AND origin IS NULL", table, acked).map((r) => r.pk)); + } catch { + return new Set(); + } +} + +const ackListeners = new Set<(peer: string, after: number) => void>(); + +/** `peer` has everything of this computer's up to `after`. */ +export function ackFrom(peer: string, after: number): void { + const acked = Number(getMeta(ackedKey(peer)) ?? 0); + if (after > acked) setMeta(ackedKey(peer), String(after)); + for (const fn of [...ackListeners]) fn(peer, after); +} + +export function onAck(fn: (peer: string, after: number) => void): () => void { + ackListeners.add(fn); + return () => ackListeners.delete(fn); +} + +/** Forget what a computer that left the group took or gave. */ +export function forgetPeer(peer: string): void { + try { + sql("DELETE FROM meta WHERE key IN (?, ?)", ackedKey(peer), pulledKey(peer)); + sql("DELETE FROM replica_deferred WHERE peer = ?", peer); + sql("UPDATE replica_rows SET origin = NULL WHERE origin = ?", peer); + } catch (err) { + log.warn("could not forget a computer's changes", err); + } +} + +/* ------------------------------------------------------------------ */ +/* Serving changes */ +/* ------------------------------------------------------------------ */ + +export interface ReplicaChange { + t: string; + k: string; + at: string; + /** Deleted there. */ + d?: 1; + row?: Record; +} + +export interface ReplicaPage { + changes: ReplicaChange[]; + /** The seq to ask after next time. */ + last: number; + more: boolean; +} + +function keyWhere(t: ReplicaTable): string { + return t.key.map((k) => `${q(k)} = ?`).join(" AND "); +} + +function keyParts(t: ReplicaTable, pk: string): string[] { + const parts = pk.split(KEY_SEP); + return parts.length === t.key.length ? parts : []; +} + +/** + * What `peer` hasn't seen: every change after `after` that didn't come from it. `setup: false` leaves the setup out (a + * secondary gets that as the snapshot). Pulling after N also says the peer has everything up to N. + */ +export function changesFor(peer: string, after: number, opts: { setup: boolean; limit?: number }): ReplicaPage { + ensureReplica(); + ackFrom(peer, after); + const limit = Math.min(Math.max(opts.limit ?? PULL_LIMIT, 1), 2000); + const rows = all<{ tbl: string; pk: string; seq: number; at: string; deleted: number; origin: string | null }>( + "SELECT tbl, pk, seq, at, deleted, origin FROM replica_rows WHERE seq > ? ORDER BY seq LIMIT ?", + after, + limit + 1, + ); + const more = rows.length > limit; + const page = more ? rows.slice(0, limit) : rows; + const changes: ReplicaChange[] = []; + for (const r of page) { + if (r.origin === peer) continue; + const t = spec(r.tbl); + if (!t || (!opts.setup && t.setup) || !exists(t.table)) continue; + if (r.deleted) { + changes.push({ t: r.tbl, k: r.pk, at: r.at, d: 1 }); + continue; + } + const parts = keyParts(t, r.pk); + if (!parts.length) continue; + const row = get>(`SELECT * FROM ${q(t.table)} WHERE ${keyWhere(t)}`, ...parts); + if (!row) { + changes.push({ t: r.tbl, k: r.pk, at: r.at, d: 1 }); + continue; + } + const out: Record = {}; + for (const [k, v] of Object.entries(row)) if (!t.own.includes(k)) out[k] = encodeValue(v); + changes.push({ t: r.tbl, k: r.pk, at: r.at, row: out }); + } + return { changes, last: page.length ? page[page.length - 1]!.seq : after, more }; +} + +/* ------------------------------------------------------------------ */ +/* Taking changes */ +/* ------------------------------------------------------------------ */ + +export interface ApplyResult { + applied: number; + /** This computer's change of the row was newer. */ + kept: number; + /** Waiting for a row they point at. */ + deferred: number; + failed: number; + entities: Set; + /** Agents added or changed (their files need writing) and removed (their folders go to the trash). */ + agents: Set; + removedAgents: { slug: string; repoPath: string }[]; + /** The keys of the rows that changed, per table. */ + keys: Record; +} + +interface ForeignKey { + from: string; + table: string; + to: string; +} + +const fkCache = new Map(); +const columnCache = new Map(); + +function foreignKeys(table: string): ForeignKey[] { + let list = fkCache.get(table); + if (!list) { + list = all<{ from: string; table: string; to: string | null }>(`PRAGMA foreign_key_list(${q(table)})`).map((f) => ({ from: f.from, table: f.table, to: f.to ?? "id" })); + fkCache.set(table, list); + } + return list; +} + +/** The first row this one points at that isn't here (nor coming with the same batch). */ +function missingParent(row: Record, table: string, incoming: Set): { table: string; id: string } | null { + for (const fk of foreignKeys(table)) { + const v = row[fk.from]; + if (v === null || v === undefined) continue; + const id = String(v); + if (incoming.has(`${fk.table}${KEY_SEP}${id}`)) continue; + if (!get(`SELECT 1 FROM ${q(fk.table)} WHERE ${q(fk.to)} = ?`, id)) return { table: fk.table, id }; + } + return null; +} + +/** A row's last known change here. */ +function localStamp(table: string, pk: string): { at: string; origin: string | null } | null { + return get<{ at: string; origin: string | null }>("SELECT at, origin FROM replica_rows WHERE tbl = ? AND pk = ?", table, pk); +} + +function emptyResult(): ApplyResult { + return { applied: 0, kept: 0, deferred: 0, failed: 0, entities: new Set(), agents: new Set(), removedAgents: [], keys: {} }; +} + +/** + * Write what `peer` changed. `peerWinsTies`: the peer is the primary. Each row is checked against its last change here + * first; a row that points at one that isn't here yet waits (replica_deferred) and is tried with the next pull. + */ +export function applyChanges(peer: string, changes: ReplicaChange[], opts: { peerWinsTies: boolean; onMissing?: (table: string, id: string) => void }): ApplyResult { + ensureReplica(); + const result = emptyResult(); + const incoming = new Set(changes.filter((c) => !c.d).map((c) => `${c.t}${KEY_SEP}${c.k}`)); + const write = (c: ReplicaChange) => applyOne(peer, c, opts, incoming, result); + try { + tx(() => { + getDb().run("PRAGMA defer_foreign_keys = ON"); + for (const c of changes) write(c); + }); + } catch (err) { + // One row the batch couldn't hold (a unique name taken here meanwhile): each on its own, so the others still land. + log.info("a batch of changes didn't fit as a whole; taking them one by one", { peer, error: err instanceof Error ? err.message : String(err) }); + const partial = emptyResult(); + for (const c of changes) { + try { + tx(() => { + getDb().run("PRAGMA defer_foreign_keys = ON"); + applyOne(peer, c, opts, new Set(), partial); + }); + } catch (one) { + partial.failed++; + log.warn(`could not take a change of ${c.t}`, { peer, key: c.k, error: one instanceof Error ? one.message : String(one) }); + } + } + Object.assign(result, partial); + } + return result; +} + +function applyOne(peer: string, c: ReplicaChange, opts: { peerWinsTies: boolean; onMissing?: (table: string, id: string) => void }, incoming: Set, result: ApplyResult): void { + const t = spec(c.t); + if (!t || !exists(t.table) || typeof c.k !== "string" || typeof c.at !== "string") return; + const parts = keyParts(t, c.k); + if (!parts.length) return; + const local = localStamp(t.table, c.k); + if (local && (local.at > c.at || (local.at === c.at && !opts.peerWinsTies && local.origin !== peer))) { + result.kept++; + return; + } + const columns = cachedColumns(t.table); + const count = () => { + result.applied++; + result.entities.add(t.entity); + (result.keys[t.table] ??= []).push(c.k); + }; + if (c.d) { + const before = t.table === "agents" ? get<{ slug: string }>("SELECT slug FROM agents WHERE id = ?", parts[0]!) : null; + const res = asPeer(peer, c.at, () => sql(`DELETE FROM ${q(t.table)} WHERE ${keyWhere(t)}`, ...parts)); + if (res.changes === 0) { + // Already gone here: remember the deletion, so an older copy of the row can't bring it back. + sql("UPDATE replica_seq SET n = n + 1 WHERE id = 1"); + sql( + "INSERT OR REPLACE INTO replica_rows (tbl, pk, seq, at, deleted, origin) VALUES (?, ?, (SELECT n FROM replica_seq WHERE id = 1), ?, 1, ?)", + t.table, + c.k, + c.at, + peer, + ); + return; + } + if (before) result.removedAgents.push({ slug: before.slug, repoPath: join(config().agentsDir, before.slug) }); + sql("DELETE FROM replica_deferred WHERE peer = ? AND tbl = ? AND pk = ?", peer, t.table, c.k); + count(); + return; + } + if (!c.row || typeof c.row !== "object") return; + const row: Record = {}; + for (const [k, v] of Object.entries(c.row)) { + if (!columns.includes(k) || t.own.includes(k)) continue; + row[k] = decodeValue(v); + } + for (const [i, k] of t.key.entries()) row[k] = parts[i]!; + if (t.only && row[t.only.column] !== t.only.value) return; + const missing = missingParent(row, t.table, incoming); + if (missing) { + sql( + "INSERT INTO replica_deferred (peer, tbl, pk, change, created_at) VALUES (?, ?, ?, ?, ?) ON CONFLICT(peer, tbl, pk) DO UPDATE SET change = excluded.change", + peer, + t.table, + c.k, + JSON.stringify(c), + now(), + ); + result.deferred++; + opts.onMissing?.(missing.table, missing.id); + return; + } + const isNew = !get(`SELECT 1 FROM ${q(t.table)} WHERE ${keyWhere(t)}`, ...parts); + const extra = isNew ? (t.onInsert?.(row) ?? {}) : {}; + const names = Object.keys(row); + const updates = names.filter((n) => !t.key.includes(n)); + const inserted = [...names, ...Object.keys(extra)]; + const set = updates.map((n) => `${q(n)} = excluded.${q(n)}`).join(", "); + const conflict = updates.length ? `DO UPDATE SET ${set}` : "DO NOTHING"; + const res = asPeer(peer, c.at, () => + sql( + `INSERT INTO ${q(t.table)} (${inserted.map(q).join(", ")}) VALUES (${inserted.map(() => "?").join(", ")}) ON CONFLICT(${t.key.map(q).join(", ")}) ${conflict}`, + ...names.map((n) => row[n] ?? null), + ...Object.values(extra), + ), + ); + // Nothing changed here (the same row): its stamp still says it is the peer's now, so it isn't sent back. + sql("UPDATE replica_rows SET at = ?, origin = ? WHERE tbl = ? AND pk = ? AND at <= ?", c.at, peer, t.table, c.k, c.at); + sql("DELETE FROM replica_deferred WHERE peer = ? AND tbl = ? AND pk = ?", peer, t.table, c.k); + if (res.changes > 0) { + count(); + if (t.table === "agents") result.agents.add(parts[0]!); + } +} + +/** Changes of `peer` that waited for a row they point at: tried again (after a pull, after a chat arrived). */ +export function retryDeferred(peer: string, opts: { peerWinsTies: boolean; onMissing?: (table: string, id: string) => void }): ApplyResult { + const cutoff = new Date(Date.now() - DEFERRED_DAYS * 86_400_000).toISOString(); + sql("DELETE FROM replica_deferred WHERE peer = ? AND created_at < ?", peer, cutoff); + const waiting = all<{ change: string }>("SELECT change FROM replica_deferred WHERE peer = ? ORDER BY created_at", peer); + if (!waiting.length) return emptyResult(); + const changes: ReplicaChange[] = []; + for (const w of waiting) { + try { + changes.push(JSON.parse(w.change) as ReplicaChange); + } catch { + /* a damaged entry never applies */ + } + } + // Not counted again as waiting when it still can't: its entry stays as it is. + return applyChanges(peer, changes, { ...opts, onMissing: undefined }); +} + +/** Deletions older than this are forgotten (every computer of the group has long taken them). */ +export function pruneTombstones(): void { + try { + const cutoff = new Date(Date.now() - TOMBSTONE_DAYS * 86_400_000).toISOString(); + sql("DELETE FROM replica_rows WHERE deleted = 1 AND at < ?", cutoff); + } catch (err) { + log.warn("could not prune old deletions", err); + } +} + +/** Tell the UI what changed (after the changes are committed). */ +export function announce(result: ApplyResult): void { + for (const entity of result.entities) bus.changed(entity); +} + +/** Two results as one (a pull takes several pages). */ +export function mergeResults(into: ApplyResult, more: ApplyResult): ApplyResult { + into.applied += more.applied; + into.kept += more.kept; + into.deferred += more.deferred; + into.failed += more.failed; + for (const e of more.entities) into.entities.add(e); + for (const a of more.agents) into.agents.add(a); + into.removedAgents.push(...more.removedAgents); + for (const [table, keys] of Object.entries(more.keys)) (into.keys[table] ??= []).push(...keys); + return into; +} + +export { emptyResult as emptyApplyResult }; + +export const REPLICA_KEY_SEP = KEY_SEP; +export { pulledKey as replicaPulledKey }; diff --git a/packages/core/src/remote/replicaSync.ts b/packages/core/src/remote/replicaSync.ts new file mode 100644 index 00000000..4462cc76 --- /dev/null +++ b/packages/core/src/remote/replicaSync.ts @@ -0,0 +1,201 @@ +/** + * Moving the shared data between the computers of a device group (owner: remote). Each computer pulls what the other + * changed (replica.ts) when their link comes up, a moment after the other says something changed, and once a minute. + * A secondary pulls from its primary; the primary from every secondary. What a pull brings is written here as the + * other computer's, so it is never sent back to it. + */ +import { refreshAgentFiles, trashAgentRepo } from "../agents/service"; +import { bus } from "../events/bus"; +import { logger } from "../log"; +import { computerName } from "../mobile/devices"; +import { reloadSchedules } from "../scheduler/scheduler"; +import { notify } from "../services/notifications"; +import { applyRuntimeSettings } from "../services/runtime"; +import { getSettings, updateSettings } from "../services/settings"; +import { ticketsArrived } from "../tasks/service"; +import { getMeta, setMeta } from "../db"; +import { groupRole, isSecondary, primaryRunnerId } from "./group"; +import { + type ApplyResult, + type ReplicaPage, + announce, + applyChanges, + emptyApplyResult, + ensureReplica, + mergeResults, + pendingFor, + pruneTombstones, + replicaPulledKey, + replicaSeq, + retryDeferred, +} from "./replica"; +import { link, listRunners, runnerRow } from "./runners"; + +const log = logger("replica"); + +const PULL_EVERY_MS = 60_000; +const HINT_DELAY_MS = 300; +const WATCH_MS = 1_500; +const MAX_PAGES = 200; + +const chains = new Map>(); +const hintTimers = new Map>(); +/** When each computer was last pulled completely (ms). */ +const pulledAt = new Map(); +let watchTimer: ReturnType | null = null; +let pullTimer: ReturnType | null = null; +let lastSeq = 0; +let fetchChat: ((peer: string, conversationId: string) => void) | null = null; + +/** Computers this one exchanges the shared data with: its primary, or (on the primary) every secondary. */ +function peers(): string[] { + const role = groupRole(); + if (!role) return []; + if (role === "secondary") { + const id = primaryRunnerId(); + return id ? [id] : []; + } + return listRunners() + .filter((r) => r.kind === "device") + .map((r) => r.id); +} + +function fromPrimary(peer: string): boolean { + return isSecondary() && peer === primaryRunnerId(); +} + +/** + * Pull what `peer` changed since the last pull and write it here. One pull per computer at a time; a pull asked for + * while one runs waits for it and then runs too (so nothing told meanwhile is missed). Null when it can't be reached. + */ +export function pullFrom(peer: string): Promise { + const previous = chains.get(peer) ?? Promise.resolve(null); + const next = previous.then( + () => pullNow(peer), + () => pullNow(peer), + ); + chains.set( + peer, + next.catch(() => null), + ); + return next; +} + +async function pullNow(peer: string): Promise { + const r = runnerRow(peer); + if (!r || r.kind !== "device" || !groupRole()) return null; + let l: ReturnType; + try { + l = link(peer); + if (l.state.state !== "online") return null; + } catch { + return null; + } + ensureReplica(); + const primary = fromPrimary(peer); + const opts = { peerWinsTies: primary, onMissing: (table: string, id: string) => missing(peer, table, id) }; + const total = emptyApplyResult(); + let after = Number(getMeta(replicaPulledKey(peer)) ?? 0); + for (let page = 0; page < MAX_PAGES; page++) { + const res = await l.json("GET", `/api/link/replica/changes?after=${after}&setup=${primary ? 0 : 1}`, undefined, { timeoutMs: 120_000 }); + if (!res || !Array.isArray(res.changes) || typeof res.last !== "number") break; + if (res.changes.length) mergeResults(total, applyChanges(peer, res.changes, opts)); + after = Math.max(after, res.last); + setMeta(replicaPulledKey(peer), String(after)); + if (!res.more) break; + } + // Says how far this computer got: the other one counts what is still waiting for it from there. + await l.json("POST", "/api/link/replica/ack", { after }, { timeoutMs: 30_000 }).catch(() => undefined); + mergeResults(total, retryDeferred(peer, opts)); + pulledAt.set(peer, Date.now()); + if (total.applied || total.failed) log.info("took changes from another computer", { peer: r.name, applied: total.applied, kept: total.kept, deferred: total.deferred, failed: total.failed }); + await afterApply(r.name, total); + return total; +} + +/** A change points at a chat this computer doesn't have yet: the mirror fetches it, then the change is tried again. */ +function missing(peer: string, table: string, id: string): void { + if (table === "conversations") fetchChat?.(peer, id); +} + +/** What the written changes mean beyond the rows: agent files, schedules, tickets, phones, the UI. */ +async function afterApply(from: string, result: ApplyResult): Promise { + if (!result.applied) return; + for (const gone of result.removedAgents) { + await trashAgentRepo(gone).catch((err) => log.warn(`could not move the files of removed agent ${gone.slug} to the trash`, err)); + } + for (const agentId of result.agents) { + await refreshAgentFiles(agentId, `Changes from ${from}`).catch((err) => log.warn(`could not write the files of agent ${agentId}`, err)); + } + if (result.keys.routines?.length) reloadSchedules(); + if (result.keys.tasks?.length) ticketsArrived([...new Set(result.keys.tasks)]); + if (result.keys.mobile_devices?.length) phonesArrived(from); + announce(result); +} + +/** A phone paired with another computer of the group: it works with this one too once phone access is on here. */ +function phonesArrived(from: string): void { + const settings = getSettings(); + if (settings.mobile.enabled) return; + try { + applyRuntimeSettings(updateSettings({ mobile: { enabled: true } } as never)); + notify("info", "Your phone works with this computer too", `It was paired on ${from}. When that computer is away, the Godmode app on your phone connects to ${computerName()}.`, "/settings/phone"); + } catch (err) { + log.warn("could not switch phone access on for a phone of the group", err); + } +} + +/** The other computer says something changed there: pull in a moment (a burst of changes is one pull). */ +export function replicaHint(peer: string): void { + if (hintTimers.has(peer)) return; + const timer = setTimeout(() => { + hintTimers.delete(peer); + void pullFrom(peer).catch((err) => log.info("could not pull changes", { peer, error: err instanceof Error ? err.message : String(err) })); + }, HINT_DELAY_MS); + timer.unref?.(); + hintTimers.set(peer, timer); +} + +/** When `peer` was last pulled completely (ms since epoch), or null. */ +export function lastPulled(peer: string): number | null { + return pulledAt.get(peer) ?? null; +} + +/** Changes made here that no other computer of the group has taken yet. */ +export function pendingChanges(): number { + const list = peers(); + return list.length ? Math.max(...list.map(pendingFor)) : 0; +} + +/** + * `chat`: asks the computer a change came from for a chat it points at (the mirror). Watches this computer's own + * changes and tells the others (`replica.changed` goes to the linked computers only), and pulls once a minute. + */ +export function startReplicaSync(opts: { fetchChat: (peer: string, conversationId: string) => void }): void { + fetchChat = opts.fetchChat; + ensureReplica(); + lastSeq = replicaSeq(); + watchTimer ??= setInterval(() => { + if (!groupRole()) return; + const n = replicaSeq(); + if (n === lastSeq) return; + lastSeq = n; + bus.emit({ type: "replica.changed", seq: n }); + }, WATCH_MS); + watchTimer.unref?.(); + pullTimer ??= setInterval(() => { + pruneTombstones(); + for (const peer of peers()) void pullFrom(peer).catch(() => undefined); + }, PULL_EVERY_MS); + pullTimer.unref?.(); +} + +export function stopReplicaSync(): void { + if (watchTimer) clearInterval(watchTimer); + if (pullTimer) clearInterval(pullTimer); + watchTimer = null; + pullTimer = null; + for (const t of hintTimers.values()) clearTimeout(t); + hintTimers.clear(); + fetchChat = null; +} diff --git a/packages/core/src/remote/runners.ts b/packages/core/src/remote/runners.ts index f3cf6c9a..d8548508 100644 --- a/packages/core/src/remote/runners.ts +++ b/packages/core/src/remote/runners.ts @@ -112,6 +112,10 @@ export interface DeviceLinkHooks { deviceState(id: string, state: LinkState): void; /** A device went away while these chats worked there (told before the copies forget what worked). */ deviceLost(id: string, conversationIds: string[]): void; + /** The link to a device came up: what it changed is taken before this computer copies anything there. */ + deviceConnected(id: string): Promise; + /** The device says its shared data changed. */ + replicaHint(id: string): void; } let deviceHooks: DeviceLinkHooks | null = null; @@ -434,8 +438,15 @@ function startLink(r: RunnerRow) { name: r.name, ownName: computerName(), onEvent: (event) => { - if (toPrimary(r)) deviceHooks?.primaryEvent(event); - else applyRunnerEvent(id, event); + if (event.type === "replica.changed") { + if (r.kind === "device") deviceHooks?.replicaHint(id); + return; + } + if (toPrimary(r)) { + // A copy of the primary's chats stays here for while it is away; its windows see the primary's own events. + applyRunnerEvent(id, event); + deviceHooks?.primaryEvent(event); + } else applyRunnerEvent(id, event); }, onState: (state) => { if (r.kind === "device") deviceHooks?.deviceState(id, state); @@ -481,7 +492,13 @@ async function connected(id: string, state: LinkState) { l.sendClientEvent({ type: "deltas.patch" }); for (const event of subscriptions.get(id)?.values() ?? []) l.sendClientEvent(event); const r = row(id); - if (!r || toPrimary(r)) return; + if (!r) return; + if (toPrimary(r)) { + await deviceHooks?.deviceConnected(id).catch((err) => log.warn("could not catch up with the primary", err instanceof Error ? err.message : err)); + return; + } + if (r.kind === "device") await deviceHooks?.deviceConnected(id).catch((err) => log.warn(`could not take the changes of ${r.name}`, err instanceof Error ? err.message : err)); + if (dropped()) return; await releaseChats(id); const catchUpNow = async () => { try { diff --git a/packages/core/src/remote/snapshot.ts b/packages/core/src/remote/snapshot.ts index 2a6d2166..8985e865 100644 --- a/packages/core/src/remote/snapshot.ts +++ b/packages/core/src/remote/snapshot.ts @@ -34,7 +34,7 @@ const log = logger("snapshot"); type Row = Record; type Value = string | number | null | Uint8Array; -interface TableSpec { +export interface TableSpec { table: string; /** Columns that stay the runner's own: never copied, never overwritten, not part of the digest. */ own: string[]; @@ -50,7 +50,7 @@ interface TableSpec { * The mirrored tables. Every other column is taken from the live schema, so columns added by later migrations are * mirrored without a change here. Listed parents first; applied in reverse (see `apply`). */ -const TABLES: TableSpec[] = [ +export const SETUP_TABLES: TableSpec[] = [ { table: "workspaces", own: [], entity: "workspaces" }, { table: "projects", own: [], entity: "workspaces" }, { @@ -85,6 +85,7 @@ const TABLES: TableSpec[] = [ }, { table: "vms", own: ["provisioned_at", "last_error", "last_started_at", "last_used_at"], entity: "vms" }, ]; +const TABLES = SETUP_TABLES; /** Settings that describe the computer they are on (how it is reached, what it logs, whether it was set up). */ // maintenance: how this computer keeps its own tools fixed and up to date — a runner, alone most of the time, keeps its own. @@ -92,7 +93,7 @@ const TABLES: TableSpec[] = [ // android: the phones plugged into this computer and the adb that reaches them. // phone: calls are placed and read back by this computer only. // power: whether this Mac stays awake with its lid closed. -const LOCAL_SETTINGS = new Set(["server", "mobile", "cloud", "diagnostics", "maintenance", "selfRepair", "android", "phone", "power", "onboardingComplete"]); +export const LOCAL_SETTINGS = new Set(["server", "mobile", "cloud", "diagnostics", "maintenance", "selfRepair", "android", "phone", "power", "onboardingComplete"]); /** A runner's vault is opened by a sync, not by a human with the passphrase: it must not lock itself in between. */ const RUNNER_SETTINGS: Record = { security: ["autoLockMinutes"] }; /** VM ids become Tart VM names and folder names. */ diff --git a/packages/core/src/server/routes/link.ts b/packages/core/src/server/routes/link.ts index a197b508..2e8c91d2 100644 --- a/packages/core/src/server/routes/link.ts +++ b/packages/core/src/server/routes/link.ts @@ -14,7 +14,8 @@ import { installUpdates } from "../../services/maintenance"; import { checkUpdates } from "../../services/updates"; import { runCommand, toolPath } from "../../services/doctor"; import { HttpError, badRequest, childEnv, notFound } from "../../util"; -import { acceptJoin, adoptPushedChat, deviceIdOf, groupForSecondary, makeInvite, peerLeft } from "../../remote/devices"; +import { acceptJoin, adoptPushedChat, deviceIdOf, groupForSecondary, makeInvite, peerAway, peerLeft, releaseChatsTo } from "../../remote/devices"; +import { ackFrom, changesFor } from "../../remote/replica"; import { isSecondary } from "../../remote/group"; import { callForDevice } from "../../remote/deviceTools"; import { welcomeFor } from "../ws"; @@ -140,6 +141,40 @@ export function registerLinkRoutes(app: Hono): void { app.get("/api/link/devices/whoami", (c) => c.json({ id: deviceIdOf(viaLink(c) ?? "") })); + const groupPeer = (c: Context): string => { + const peer = deviceIdOf(viaLink(c) ?? ""); + if (!peer) throw new HttpError(403, "Only computers of this device group take part in that.", "not_in_group"); + return peer; + }; + + // What changed in the shared data since `after` (remote/replica.ts); asking after N also says everything up to N arrived. + app.get("/api/link/replica/changes", (c) => { + const peer = groupPeer(c); + const after = Number(c.req.query("after") ?? 0); + const limit = Number(c.req.query("limit") ?? 0); + return c.json(changesFor(peer, Number.isFinite(after) && after >= 0 ? after : 0, { setup: c.req.query("setup") !== "0", ...(limit > 0 ? { limit } : {}) })); + }); + + app.post("/api/link/replica/ack", async (c) => { + const peer = groupPeer(c); + const { after } = await body(c, z.object({ after: z.number().int().min(0) })); + ackFrom(peer, after); + return c.json({ ok: true as const }); + }); + + // Chats of this computer that the calling one took over while this one was away: they live there now. + app.post("/api/link/devices/release-chats", async (c) => { + const peer = groupPeer(c); + const { ids } = await body(c, z.object({ ids: z.array(z.string().min(1).max(100)).max(2000) })); + return c.json(await releaseChatsTo(peer, ids)); + }); + + // The calling computer goes away right now (Godmode quits there). + app.post("/api/link/devices/away", (c) => { + peerAway(groupPeer(c)); + return c.json({ ok: true as const }); + }); + app.post("/api/link/devices/leave", (c) => { peerLeft(viaLink(c) ?? ""); return c.json({ ok: true as const }); diff --git a/packages/core/src/server/ws.ts b/packages/core/src/server/ws.ts index ee3fbd61..151eb618 100644 --- a/packages/core/src/server/ws.ts +++ b/packages/core/src/server/ws.ts @@ -33,6 +33,8 @@ export interface WsData { androidNeedsKey?: Set; /** A computer at the other end of an encrypted link (remote/linkServer.ts): it always gets this computer's own events. */ link?: boolean; + /** That computer's controller id here. */ + linkPeer?: string; } /** Chats someone has open right now: they read what happens there, so it isn't unread and doesn't notify. */ @@ -385,14 +387,28 @@ function congested(ws: HubSocket): boolean { } bus.on((event) => { + if (event.type === "replica.changed") return deliver(event, (ws) => !!ws.data.link); // The windows show the primary's: this computer's own events still go to the computers linked to it. if (forwarded() && !ownEvent(event)) deliver(event, (ws) => !!ws.data.link); else deliver(event, null); }); +let linkSkip: ((peer: string, event: ServerEvent) => boolean) | null = null; + +/** + * Events a linked computer already has: this computer only keeps a copy of them (a secondary's copy of its primary's + * chats), so they aren't sent back. + */ +export function setLinkEventFilter(fn: ((peer: string, event: ServerEvent) => boolean) | null): void { + linkSkip = fn; +} + function deliver(event: ServerEvent, only: ((ws: HubSocket) => boolean) | null) { const before = audienceFilter; - audienceFilter = only; + const skip = linkSkip; + audienceFilter = skip + ? (ws) => (!only || only(ws)) && !(ws.data.link && ws.data.linkPeer && skip(ws.data.linkPeer, event)) + : only; try { deliverNow(event); } finally { diff --git a/packages/core/src/tasks/service.ts b/packages/core/src/tasks/service.ts index f97080f4..794bfa19 100644 --- a/packages/core/src/tasks/service.ts +++ b/packages/core/src/tasks/service.ts @@ -16,6 +16,7 @@ * Descriptions are Markdown and may link files (screenshots, PDFs…, see ./attachments.ts): the agent gets a copy of * each and is told to read them first. */ +import { remoteRuns } from "../remote/activeRuns"; import { existsSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; @@ -2324,6 +2325,8 @@ export function reconcileTasks(reason: string, opts: { retry?: boolean } = {}): let restarts = 0; for (const t of all("SELECT * FROM tasks WHERE status = 'in_progress'")) { if (openRuns(t.conversation_id).length || (t.conversation_id && getFollowup(t.conversation_id))) continue; + // Its chat works on another computer of the group (one that stood in for this one): that computer finishes it. + if (t.conversation_id && remoteRuns().some((r) => r.conversationId === t.conversation_id)) continue; // It waits for its parts: it keeps waiting, or continues when they were finished meanwhile. if (waitsForParts(t)) { if (!openParts(t.id).length) partClosed(t.id); @@ -2349,6 +2352,19 @@ export function reconcileTasks(reason: string, opts: { retry?: boolean } = {}): } } +/** + * Tickets another computer of the group changed (its copy came over): the board shows them, and new work in Todo + * starts here like a ticket made here — only while the board runs on this computer. + */ +export function ticketsArrived(ids: string[]): void { + for (const id of ids) { + const t = row(id); + if (!t) continue; + emit(id); + if (unsubscribe && t.status === "todo" && t.agent_id && !t.archived_at) void dispatch(id); + } +} + export function stopTasks(): void { unsubscribe?.(); unsubscribe = null; diff --git a/packages/shared/src/events.ts b/packages/shared/src/events.ts index 6dc1d518..436cc901 100644 --- a/packages/shared/src/events.ts +++ b/packages/shared/src/events.ts @@ -170,6 +170,8 @@ export type ServerEvent = * the primary's Godmode (or its own while the primary is away), so everything it shows is fetched again. */ | { type: "devices.updated"; group: DeviceGroup } + /** Between the computers of a device group only: shared data changed here, the other one pulls it. */ + | { type: "replica.changed"; seq: number } | { type: "entity.changed"; entity: EntityName }; export type EntityName = From ba592bbe8d6094dffc6917ef2e4d329a9309f6b3 Mon Sep 17 00:00:00 2001 From: Daniel Ehrhardt Date: Tue, 20 Oct 2026 19:26:02 +0200 Subject: [PATCH 04/18] Device groups UI: calm device popover, stand-in and sign-in settings, Full Disk Access and runner-twin fixes - Sidebar popover: one inset for header, rows and footer; roles as quiet tags; state in words (Away since, Takes over in, Stands in, slow connection); Full Disk Access chip and runner-twin hint; hand-off as a two-line button that is only solid while work runs and hides when there is nowhere to go; no monospace in the sidebar row - Settings > Devices: While the primary is away (switch, minutes, live stand-in state with pending changes), Browser sign-ins (own / seed), Full Disk Access note with how-to, Use only the app for a runner twin (POST /api/devices/retire-runner), copy without the old read-only wording - Away banner on secondaries: countdown to taking over, standing-in state - Places: This computer name from THIS_COMPUTER, runner twins after their device and named as runners; Runner tag in the Run on chip and the chat pill - Screenshots in docs/screenshots/device-groups-v2 --- .../src/components/devices/device-parts.tsx | 126 ++++- .../src/components/layout/device-status.tsx | 222 +++++--- .../src/components/runners/move-chat.tsx | 11 +- .../src/components/runners/runner-chip.tsx | 43 +- .../src/components/runners/runner-parts.tsx | 9 + .../components/settings/devices-section.tsx | 490 ++++++++++++++---- apps/desktop/src/lib/api.ts | 4 +- apps/desktop/src/lib/places.ts | 37 +- .../primary-fda-dialog-dark.png | Bin 0 -> 29735 bytes .../primary-fda-dialog-light.png | Bin 0 -> 29829 bytes .../device-groups-v2/primary-popover-dark.png | Bin 0 -> 37980 bytes .../primary-popover-light.png | Bin 0 -> 36819 bytes .../primary-rail-popover-dark.png | Bin 0 -> 42782 bytes .../primary-rail-popover-light.png | Bin 0 -> 44902 bytes .../primary-retire-confirm-dark.png | Bin 0 -> 15928 bytes .../primary-retire-confirm-light.png | Bin 0 -> 16808 bytes .../device-groups-v2/primary-run-on-dark.png | Bin 0 -> 36152 bytes .../device-groups-v2/primary-run-on-light.png | Bin 0 -> 28324 bytes .../primary-run-on-runner-dark.png | Bin 0 -> 24748 bytes .../primary-run-on-runner-light.png | Bin 0 -> 24879 bytes .../primary-settings-dark.png | Bin 0 -> 214925 bytes .../primary-settings-light.png | Bin 0 -> 233255 bytes .../primary-sign-ins-dark.png | Bin 0 -> 28697 bytes .../primary-sign-ins-light.png | Bin 0 -> 32001 bytes .../device-groups-v2/standing-banner-dark.png | Bin 0 -> 45186 bytes .../standing-banner-light.png | Bin 0 -> 45345 bytes .../standing-popover-dark.png | Bin 0 -> 29593 bytes .../standing-popover-light.png | Bin 0 -> 30561 bytes .../standing-settings-dark.png | Bin 0 -> 209944 bytes .../standing-settings-light.png | Bin 0 -> 222103 bytes .../device-groups-v2/waiting-banner-dark.png | Bin 0 -> 41839 bytes .../device-groups-v2/waiting-banner-light.png | Bin 0 -> 42549 bytes .../device-groups-v2/waiting-popover-dark.png | Bin 0 -> 25410 bytes .../waiting-popover-light.png | Bin 0 -> 26702 bytes 34 files changed, 722 insertions(+), 220 deletions(-) create mode 100644 docs/screenshots/device-groups-v2/primary-fda-dialog-dark.png create mode 100644 docs/screenshots/device-groups-v2/primary-fda-dialog-light.png create mode 100644 docs/screenshots/device-groups-v2/primary-popover-dark.png create mode 100644 docs/screenshots/device-groups-v2/primary-popover-light.png create mode 100644 docs/screenshots/device-groups-v2/primary-rail-popover-dark.png create mode 100644 docs/screenshots/device-groups-v2/primary-rail-popover-light.png create mode 100644 docs/screenshots/device-groups-v2/primary-retire-confirm-dark.png create mode 100644 docs/screenshots/device-groups-v2/primary-retire-confirm-light.png create mode 100644 docs/screenshots/device-groups-v2/primary-run-on-dark.png create mode 100644 docs/screenshots/device-groups-v2/primary-run-on-light.png create mode 100644 docs/screenshots/device-groups-v2/primary-run-on-runner-dark.png create mode 100644 docs/screenshots/device-groups-v2/primary-run-on-runner-light.png create mode 100644 docs/screenshots/device-groups-v2/primary-settings-dark.png create mode 100644 docs/screenshots/device-groups-v2/primary-settings-light.png create mode 100644 docs/screenshots/device-groups-v2/primary-sign-ins-dark.png create mode 100644 docs/screenshots/device-groups-v2/primary-sign-ins-light.png create mode 100644 docs/screenshots/device-groups-v2/standing-banner-dark.png create mode 100644 docs/screenshots/device-groups-v2/standing-banner-light.png create mode 100644 docs/screenshots/device-groups-v2/standing-popover-dark.png create mode 100644 docs/screenshots/device-groups-v2/standing-popover-light.png create mode 100644 docs/screenshots/device-groups-v2/standing-settings-dark.png create mode 100644 docs/screenshots/device-groups-v2/standing-settings-light.png create mode 100644 docs/screenshots/device-groups-v2/waiting-banner-dark.png create mode 100644 docs/screenshots/device-groups-v2/waiting-banner-light.png create mode 100644 docs/screenshots/device-groups-v2/waiting-popover-dark.png create mode 100644 docs/screenshots/device-groups-v2/waiting-popover-light.png diff --git a/apps/desktop/src/components/devices/device-parts.tsx b/apps/desktop/src/components/devices/device-parts.tsx index 4574c9a5..1ba6fb1c 100644 --- a/apps/desktop/src/components/devices/device-parts.tsx +++ b/apps/desktop/src/components/devices/device-parts.tsx @@ -1,9 +1,9 @@ import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { format, isToday } from "date-fns"; import { ArrowRightFromLine, ChevronDown, Laptop, Monitor } from "lucide-react"; import { toast } from "sonner"; -import type { DeviceGroup, GroupDevice } from "@godmode/shared"; +import type { DeviceGroup, GroupDevice, RunnerState } from "@godmode/shared"; import { RUNNER_STATE_LABEL, RunnerStateDot, THIS_COMPUTER, THIS_COMPUTER_INLINE } from "@/components/runners/runner-parts"; -import { timeAgo } from "@/components/ssh/ssh-parts"; import { Button } from "@/components/ui/button"; import { DropdownMenu, @@ -13,10 +13,12 @@ import { DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Spinner } from "@/components/ui/spinner"; +import { useNow } from "@/components/vault/use-now"; import { toastApiError } from "@/components/vault/vault-utils"; import { api } from "@/lib/api"; import { useDeviceGroup } from "@/lib/hooks"; import { qk } from "@/lib/queryKeys"; +import { cn } from "@/lib/utils"; /** Laptops by their name, everything else (a Mac mini, an iMac, a Studio) as a desktop. */ export function DeviceIcon({ device, className }: { device: Pick; className?: string }) { @@ -35,16 +37,62 @@ export function deviceWorkLine(device: Pick 0 ? `${device.activeRuns} working · ${chats}` : chats; } -/** "Online · 12 ms", "Offline · seen 3 h ago" */ -export function deviceStateLine(device: GroupDevice): string { - if (device.self) return "Online"; - if (device.state === "online") return device.latencyMs !== null ? `Online · ${device.latencyMs} ms` : "Online"; - if (device.state === "offline" && device.lastSeenAt) return `Offline · seen ${timeAgo(device.lastSeenAt)}`; - return RUNNER_STATE_LABEL[device.state]; +/** A link slower than this is worth a word; below it the number means nothing to anyone. */ +const SLOW_MS = 300; + +/** "14:02" today, "12 Oct, 14:02" before. */ +export function clockTime(iso: string): string { + const d = new Date(iso); + return format(d, isToday(d) ? "HH:mm" : "d MMM, HH:mm"); +} + +/** "1:40" */ +export function countdown(ms: number): string { + const s = Math.max(0, Math.ceil(ms / 1000)); + return `${Math.floor(s / 60)}:${String(s % 60).padStart(2, "0")}`; +} + +/** Ticks every second while a stand-in counts down, rarely otherwise ("Away since" doesn't change). */ +export function useGroupClock(group: DeviceGroup | undefined): number { + return useNow(group?.role === "secondary" && group.standIn.state === "waiting" ? 1000 : 30_000); } -export function DeviceDot({ device, className }: { device: GroupDevice; className?: string }) { - return ; +/** Whether it stands in for the primary right now. */ +export function isStandingIn(device: GroupDevice, group: DeviceGroup | undefined): boolean { + return device.standingIn || (device.self && group?.role === "secondary" && group.standIn.state === "active"); +} + +/** The connection as this computer sees it: on a secondary the primary is what `primaryOnline` says. */ +export function deviceState(device: GroupDevice, group: DeviceGroup | undefined): RunnerState { + if (device.self) return "online"; + if (group?.role === "secondary" && device.role === "primary") return group.primaryOnline ? "online" : device.state === "connecting" ? "connecting" : "offline"; + return device.state; +} + +/** "Online", "Online · slow connection", "Away since 14:02", "Takes over in 1:40", "Stands in since 14:04". */ +export function deviceStateLine(device: GroupDevice, group?: DeviceGroup, now = Date.now()): string { + if (isStandingIn(device, group)) return device.self && group?.standIn.since ? `Stands in since ${clockTime(group.standIn.since)}` : "Stands in"; + if (device.self) { + const standIn = group?.role === "secondary" ? group.standIn : null; + if (standIn?.state === "waiting" && standIn.takesOverAt) { + const left = new Date(standIn.takesOverAt).getTime() - now; + return left > 0 ? `Takes over in ${countdown(left)}` : "Taking over…"; + } + return "Online"; + } + const state = deviceState(device, group); + if (state === "online") return device.latencyMs !== null && device.latencyMs > SLOW_MS ? "Online · slow connection" : "Online"; + if (state === "offline") return device.lastSeenAt ? `Away since ${clockTime(device.lastSeenAt)}` : "Away"; + return RUNNER_STATE_LABEL[state]; +} + +export function DeviceDot({ device, group, className }: { device: GroupDevice; group?: DeviceGroup; className?: string }) { + return ; +} + +/** On a Mac without Full Disk Access a command that opens Desktop, Documents or Downloads waits for a click there. */ +export function needsFullDiskAccess(device: GroupDevice): boolean { + return device.fullDiskAccess === false; } /** Where this computer's running work can go: the primary from a secondary, the online secondaries from the primary. */ @@ -80,45 +128,77 @@ export function useHandoff() { return { group, self, targets, working: self?.activeRuns ?? 0, handoff: run.mutate, pending: run.isPending }; } -/** "Hand off to Mac mini", or a menu of computers when more than one could take it. */ +function targetLine(d: GroupDevice): string { + if (d.activeRuns > 0) return `${d.activeRuns} working`; + return d.latencyMs !== null && d.latencyMs > SLOW_MS ? "Slow connection" : ""; +} + +/** + * "Hand off to Mac mini", or a menu of computers when more than one could take it. `stacked`: the action on the first + * line and where the work goes on the second, so a long computer name never squeezes the label. + */ export function HandoffButton({ size = "default", variant = "default", className, label = "Hand off to", + stacked = false, }: { size?: "default" | "sm"; variant?: "default" | "outline"; className?: string; label?: string; + stacked?: boolean; }) { - const { group, targets, handoff, pending } = useHandoff(); + const { group, targets, working, handoff, pending } = useHandoff(); const icon = pending ? : ; - if (targets.length <= 1) { - const to = targets[0]; + const to = targets.length === 1 ? targets[0] : null; + const unavailable = group?.role === "secondary" ? `${group.primaryName ?? "The primary"} is away` : "No other computer is online"; + const menu = targets.length > 1; + // Nowhere to go: never the loud style, whatever is running. + const look = targets.length ? variant : "outline"; + + const content = stacked ? ( + <> + {icon} + + + {pending ? "Handing off…" : working > 0 ? `Hand off ${working === 1 ? "the running chat" : `${working} running chats`}` : "Hand off running work"} + + {to ? `to ${to.name}` : menu ? "Pick a computer" : unavailable} + + {menu && !pending && } + + ) : ( + <> + {icon} + {pending ? "Handing off…" : to ? `${label} ${to.name}` : menu ? `${label}…` : unavailable} + {menu && !pending && } + + ); + const cls = cn(stacked && "h-auto min-h-10 w-full min-w-0 justify-start gap-2.5 px-3 py-1 has-[>svg]:px-3", className); + + if (!menu) { return ( - ); } return ( - - + Continue the running work on {targets.map((d) => ( handoff(d)}> {d.name} - {d.activeRuns > 0 ? `${d.activeRuns} working` : d.latencyMs !== null ? `${d.latencyMs} ms` : ""} + {targetLine(d)} ))} diff --git a/apps/desktop/src/components/layout/device-status.tsx b/apps/desktop/src/components/layout/device-status.tsx index 27e20f43..c5ed8909 100644 --- a/apps/desktop/src/components/layout/device-status.tsx +++ b/apps/desktop/src/components/layout/device-status.tsx @@ -1,10 +1,23 @@ import { useEffect, useState } from "react"; -import { Link, useLocation } from "react-router"; +import { Link, useLocation, useNavigate } from "react-router"; import { AnimatePresence, motion } from "motion/react"; -import { ArrowRight, Laptop, WifiOff } from "lucide-react"; -import type { DeviceGroup, RunnerState } from "@godmode/shared"; -import { DeviceDot, DeviceIcon, deviceStateLine, HandoffButton, useHandoff } from "@/components/devices/device-parts"; -import { THIS_COMPUTER, THIS_COMPUTER_INLINE } from "@/components/runners/runner-parts"; +import { ArrowRight, Laptop, LaptopMinimalCheck, Settings2, Timer, TriangleAlert, WifiOff } from "lucide-react"; +import type { DeviceGroup, GroupDevice } from "@godmode/shared"; +import { + clockTime, + countdown, + DeviceDot, + DeviceIcon, + deviceState, + deviceStateLine, + HandoffButton, + isStandingIn, + needsFullDiskAccess, + useGroupClock, + useHandoff, +} from "@/components/devices/device-parts"; +import { THIS_COMPUTER } from "@/components/runners/runner-parts"; +import { useNow } from "@/components/vault/use-now"; import { Button } from "@/components/ui/button"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { useSidebar } from "@/components/ui/sidebar"; @@ -24,12 +37,30 @@ function useSteady(on: boolean, delay: number): boolean { return on && steady; } -/** On a secondary while its primary can't be reached: what the app shows now, and what comes back with it. */ +/** Ticks for the eye; a screen reader hears the time once instead of every second (the banner is a live region). */ +function TakesOverIn({ at }: { at: string }) { + const now = useNow(1000); + const left = new Date(at).getTime() - now; + return ( + <> + + {left > 0 ? `in ${countdown(left)}` : "in a moment"} + + at {clockTime(at)} + + ); +} + +/** On a secondary while its primary is away: this computer keeps everything working, and soon stands in for it. */ export function PrimaryOfflineBanner() { const { data: group } = useDeviceGroup(); const { pathname } = useLocation(); const shown = useSteady(group?.role === "secondary" && !group.primaryOnline, 2500); const name = group?.primaryName ?? "Your primary"; + const standIn = group?.standIn; + const waiting = standIn?.state === "waiting" && !!standIn.takesOverAt; + const active = standIn?.state === "active"; + const Icon = active ? LaptopMinimalCheck : waiting ? Timer : WifiOff; return ( {shown && ( @@ -43,13 +74,29 @@ export function PrimaryOfflineBanner() { >
- +

- {name} is offline - - {" "} - — you see {THIS_COMPUTER_INLINE}'s own chats. Agents, the board and automations come back when it's online. - + {active ? ( + <> + + {THIS_COMPUTER} stands in for {name}. + + Automations, the board and your phone run here; changes go back when it's back. + + ) : waiting ? ( + <> + {name} is away. + + {" "} + {THIS_COMPUTER} takes over — everything keeps working. + + + ) : ( + <> + {name} is away. + Everything keeps working here; automations and messages wait until it's back. + + )}

{!pathname.startsWith("/settings/devices") && ( @@ -121,43 +174,92 @@ export function DeviceIndicator() { {railed ? ( {trigger} - {label} + {hint} ) : ( trigger )} - -
-

Device group

-

{primaryName} is the primary.

-
-
    - {group.devices.map((d) => ( -
  • - -
    -

    - {d.name} - {d.self && {THIS_COMPUTER}} -

    -

    - - {deviceStateLine(d)} -

    -
    - {d.activeRuns > 0 && {d.activeRuns} working} -
  • - ))} -
-
- 0 ? "default" : "outline"} className="w-full" /> - -
+ + 0} onClose={() => setOpen(false)} /> ); } + +function GroupPopover({ group, working, canHandOff, onClose }: { group: DeviceGroup; working: number; canHandOff: boolean; onClose: () => void }) { + const now = useGroupClock(group); + const standingIn = group.role === "secondary" && group.standIn.state === "active"; + const subtitle = + group.role === "primary" ? `${THIS_COMPUTER} is the primary.` : standingIn ? `${THIS_COMPUTER} stands in for ${group.primaryName}.` : `${group.primaryName} is the primary.`; + return ( + <> +
+

Device group

+

{subtitle}

+
+
    + {group.devices.map((d) => ( + + ))} +
+ {canHandOff && ( +
+ 0 ? "default" : "outline"} /> +
+ )} + + + Manage devices + + + + ); +} + +function PopoverDevice({ device: d, group, now, onClose }: { device: GroupDevice; group: DeviceGroup; now: number; onClose: () => void }) { + const navigate = useNavigate(); + const online = deviceState(d, group) === "online"; + const standing = isStandingIn(d, group); + const roles = [d.self && THIS_COMPUTER, d.role === "primary" && "Primary"].filter(Boolean).join(" · "); + const work = d.activeRuns > 0 ? `${d.activeRuns} working` : null; + return ( +
  • + +
    +

    + {d.name} + {roles && {roles}} +

    +

    + + + {deviceStateLine(d, group, now)} + {work && ` · ${work}`} + +

    + {(needsFullDiskAccess(d) || d.runnerTwin) && ( +
    + {needsFullDiskAccess(d) && ( + + )} + {d.runnerTwin && Also paired as a runner} +
    + )} +
    +
  • + ); +} diff --git a/apps/desktop/src/components/runners/move-chat.tsx b/apps/desktop/src/components/runners/move-chat.tsx index 51db4ae4..a6b149ae 100644 --- a/apps/desktop/src/components/runners/move-chat.tsx +++ b/apps/desktop/src/components/runners/move-chat.tsx @@ -17,10 +17,10 @@ import { Spinner } from "@/components/ui/spinner"; import { followupWhen } from "@/components/chat/followup"; import { toastApiError } from "@/components/vault/vault-utils"; import { api } from "@/lib/api"; -import type { Place } from "@/lib/places"; +import { placeName, type Place } from "@/lib/places"; import { qk } from "@/lib/queryKeys"; import { cn } from "@/lib/utils"; -import { RunnerStateDot } from "./runner-parts"; +import { RunnerStateDot, RunnerTag, THIS_COMPUTER_INLINE } from "./runner-parts"; /** Why a runner's chat can't move right now (its run works or stands still there), or null. */ export function moveBlocker(chat: { running: boolean; paused: boolean }): string | null { @@ -40,6 +40,7 @@ function PlaceTag({ place, active }: { place: Place | null; active?: boolean }) > {place?.name ?? "Another computer"} + {place?.twinOf && } {place && !active && } ); @@ -78,9 +79,9 @@ export function MoveChatDialog({ const shown = useRef(from); if (open) shown.current = from; const origin = shown.current; - const name = origin?.name ?? "The other computer"; + const name = origin ? placeName(origin) : "The other computer"; const away = !!origin && origin.state !== "online"; - const dest = to?.here ? "this Mac" : (to?.name ?? "the other computer"); + const dest = to?.here ? THIS_COMPUTER_INLINE : to ? placeName(to) : "the other computer"; const move = useMutation({ mutationFn: () => api.conversations.move(conversation.id, { to: to!.runnerId, force: working || undefined }), onSuccess: (moved) => { @@ -129,7 +130,7 @@ export function MoveChatDialog({ )} > {t.here ? : } - {t.name} + {placeName(t)} ))}
    diff --git a/apps/desktop/src/components/runners/runner-chip.tsx b/apps/desktop/src/components/runners/runner-chip.tsx index b2277f51..4d0b3bbc 100644 --- a/apps/desktop/src/components/runners/runner-chip.tsx +++ b/apps/desktop/src/components/runners/runner-chip.tsx @@ -11,10 +11,10 @@ import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip import { timeAgo } from "@/components/ssh/ssh-parts"; import { toastApiError } from "@/components/vault/vault-utils"; import { api } from "@/lib/api"; -import { usePlaces, type Place } from "@/lib/places"; +import { isRunnerPlace, placeName, usePlaces, type Place } from "@/lib/places"; import { upsertRunner } from "@/lib/realtime"; import { cn } from "@/lib/utils"; -import { RUNNER_STATE_LABEL, RunnerStateDot, THIS_COMPUTER, THIS_COMPUTER_INLINE } from "./runner-parts"; +import { RUNNER_STATE_LABEL, RunnerStateDot, RunnerTag, THIS_COMPUTER, THIS_COMPUTER_INLINE } from "./runner-parts"; /** Why a runner can or can't take a chat right now, in a few words. */ function runnerLine(runner: RemoteRunner): string { @@ -35,7 +35,7 @@ function runnerLine(runner: RemoteRunner): string { function placeLine(place: Place): string { if (place.here) return "Works here, with your folders, screen and VMs"; - if (place.runner) return runnerLine(place.runner); + if (place.runner) return place.twinOf ? `${runnerLine(place.runner)} · older setup` : runnerLine(place.runner); return place.state === "online" ? "Online · the primary of your group" : "Offline"; } @@ -74,11 +74,15 @@ export function RunnerChip({ value, onChange }: { value: string | null; onChange {current ? ( @@ -98,7 +102,7 @@ export function RunnerChip({ value, onChange }: { value: string | null; onChange )} - {current ? `This chat will work on ${current.name}` : "Work on another computer"} + {current ? `This chat will work on ${placeName(current)}` : "Work on another computer"}
    @@ -193,7 +197,7 @@ function PlaceItem({ place, selected, onSelect }: { place: Place; selected: bool /** The line under a new chat's composer once another computer is picked: what happens before the work starts there. */ export function RunnerNote({ place }: { place: Place | null }) { - const name = place?.name ?? "a runner"; + const name = place ? placeName(place) : "a runner"; if (place && place.state !== "online") { return (

    @@ -233,17 +237,19 @@ export function RunnerPill({ place, targets, onMove }: { place: Place | null; ta const { inGroup } = usePlaces(); const [open, setOpen] = useState(false); const name = place?.name ?? "a runner"; + const full = place ? placeName(place) : "a runner"; + const tagged = isRunnerPlace(place, inGroup); const tooltip = !place ? "This chat works on a runner" : place.here - ? "This chat works on this Mac" + ? `This chat works on ${THIS_COMPUTER_INLINE}` : place.state === "online" - ? `This chat works on ${place.name} — it keeps going while ${THIS_COMPUTER_INLINE} sleeps` + ? `This chat works on ${full} — it keeps going while ${THIS_COMPUTER_INLINE} sleeps` : place.state === "connecting" - ? `This chat works on ${place.name} — connecting…` + ? `This chat works on ${full} — connecting…` : place.state === "offline" - ? `This chat works on ${place.name}, which is offline` - : `This chat works on ${place.name}, which needs an update`; + ? `This chat works on ${full}, which is offline` + : `This chat works on ${full}, which needs an update`; const act = (fn: () => void) => { setOpen(false); fn(); @@ -255,7 +261,7 @@ export function RunnerPill({ place, targets, onMove }: { place: Place | null; ta @@ -278,7 +285,10 @@ export function RunnerPill({ place, targets, onMove }: { place: Place | null; ta {place?.here ? : } - {place?.name ?? "A runner"} + + {place?.name ?? "A runner"} + {tagged && } + {place && } {place ? placeLine(place) : "Removed"} @@ -295,7 +305,10 @@ export function RunnerPill({ place, targets, onMove }: { place: Place | null; ta - {t.name} + + {t.name} + {isRunnerPlace(t, inGroup) && } + Continue there with the whole conversation diff --git a/apps/desktop/src/components/runners/runner-parts.tsx b/apps/desktop/src/components/runners/runner-parts.tsx index 465af84f..fdeba8ad 100644 --- a/apps/desktop/src/components/runners/runner-parts.tsx +++ b/apps/desktop/src/components/runners/runner-parts.tsx @@ -43,6 +43,15 @@ export function RunnerStateDot({ state, className }: { state: RunnerState; class ); } +/** "Runner" next to a name, where a runner and a computer of the device group may be called the same. */ +export function RunnerTag({ className }: { className?: string }) { + return ( + + Runner + + ); +} + const STATE_BADGE: Record = { online: "border-brand/25 bg-brand-soft text-brand-strong", connecting: "border-border bg-secondary text-foreground", diff --git a/apps/desktop/src/components/settings/devices-section.tsx b/apps/desktop/src/components/settings/devices-section.tsx index 697c3737..6a66d241 100644 --- a/apps/desktop/src/components/settings/devices-section.tsx +++ b/apps/desktop/src/components/settings/devices-section.tsx @@ -1,9 +1,9 @@ -import { useEffect, useRef, useState, type FormEvent } from "react"; +import { useEffect, useRef, useState, type FormEvent, type ReactNode } from "react"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { AnimatePresence, motion, useReducedMotion } from "motion/react"; -import { Check, ClipboardPaste, Copy, LogOut, MessagesSquare, MoonStar, Network, Plus, RefreshCw, TriangleAlert, Unlink, X } from "lucide-react"; +import { Cable, Check, ClipboardPaste, Copy, KeyRound, LaptopMinimalCheck, LogOut, MessagesSquare, MonitorPause, MoonStar, Network, Plus, RefreshCw, Timer, TriangleAlert, Unlink, X } from "lucide-react"; import { toast } from "sonner"; -import { DEVICE_INVITE_PREFIX, parseDeviceInvite, RUNNER_CODE_PREFIX, type DeviceGroup, type GroupDevice } from "@godmode/shared"; +import { DEVICE_INVITE_PREFIX, parseDeviceInvite, RUNNER_CODE_PREFIX, type BrowserSignIns, type DeviceGroup, type DeviceGroupPatch, type GroupDevice } from "@godmode/shared"; import { AlertDialog, AlertDialogAction, @@ -15,7 +15,7 @@ import { AlertDialogTitle, } from "@/components/ui/alert-dialog"; import { Button } from "@/components/ui/button"; -import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog"; +import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Skeleton } from "@/components/ui/skeleton"; import { Switch } from "@/components/ui/switch"; @@ -23,12 +23,26 @@ import { Spinner } from "@/components/ui/spinner"; import { Textarea } from "@/components/ui/textarea"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { copyText } from "@/components/chat/copy-button"; -import { DeviceDot, DeviceIcon, deviceStateLine, deviceWorkLine, HandoffButton, useHandoff } from "@/components/devices/device-parts"; +import { + clockTime, + countdown, + DeviceDot, + DeviceIcon, + deviceState, + deviceStateLine, + deviceWorkLine, + HandoffButton, + isStandingIn, + needsFullDiskAccess, + useGroupClock, + useHandoff, +} from "@/components/devices/device-parts"; +import { useMacPermissionsGuide } from "@/components/permissions/mac-permissions"; import { RunnerStateBadge, RunnerStateDot, THIS_COMPUTER, THIS_COMPUTER_INLINE } from "@/components/runners/runner-parts"; import { useNow } from "@/components/vault/use-now"; import { toastApiError } from "@/components/vault/vault-utils"; import { api, errorMessage } from "@/lib/api"; -import { useDeviceGroup } from "@/lib/hooks"; +import { useDeviceGroup, useRunners } from "@/lib/hooks"; import { qk } from "@/lib/queryKeys"; import { cn } from "@/lib/utils"; import { ExpiryRing, Step } from "./pair-phone-dialog"; @@ -100,8 +114,8 @@ function AloneView() {

    Device group

    One Godmode, on every Mac.

    - One Mac is the primary — keep it on (a Mac mini or a desktop). The others show everything it has, and chats can run on any of them and - move between them, also while they work. + Every Mac has your agents, logins and chats, and chats can move between them, also while they work. One is the primary — keep it on + (a Mac mini or a desktop); while it's away, another Mac stands in.

    -

    {secondary ? `Synced with ${group.primaryName}` : `${THIS_COMPUTER} is the primary`}

    - +

    {title}

    +

    {secondary - ? `Agents, logins, settings, the board and automations come from ${group.primaryName}, which also runs the schedules. Chats can run here or on any other computer of the group.` - : `It keeps the agents, logins, settings, the board and automations for ${count === 1 ? "the group" : `all ${count} computers`}, and runs the schedules. Keep it on and awake.`} + ? `${group.primaryName} runs the schedules. ${THIS_COMPUTER} has a copy of everything and keeps working while it's away. Chats can run here or on any other computer of the group.` + : `It runs the schedules for ${count === 1 ? "the group" : `all ${count} computers`}. Keep it on and awake${group.standInEnabled && count > 1 ? " — while it's away, another computer stands in" : ""}.`}

    - {secondary && primaryDevice && ( + {secondary && primaryDevice && group.primaryOnline && ( )}
    - {secondary && !group.primaryOnline && ( -
    - - {group.primaryError &&

    {group.primaryError}

    } -

    You see this Mac's own chats until it's back. Agents, the board and automations return with it.

    -
    + + ); +} + +/** The live side of standing in, on a secondary while its primary is away. */ +function StandInNow({ group, now }: { group: DeviceGroup; now: number }) { + const name = group.primaryName ?? "The primary"; + const { state, since, takesOverAt } = group.standIn; + const error = group.primaryError &&

    {group.primaryError}

    ; + if (state === "active") { + const n = group.pendingChanges; + return ( + } title={`${THIS_COMPUTER} stands in for ${name}`} className="border-brand/20 bg-brand-soft/50"> +

    + {since ? `Since ${clockTime(since)} the` : "The"} automations, the task board, messaging and the phone app run here.{" "} + {n > 0 ? `${n === 1 ? "1 change goes" : `${n} changes go`} back when ${name} is back.` : `What changes here goes back when ${name} is back.`} +

    +
    + ); + } + if (state === "waiting" && takesOverAt) { + const left = new Date(takesOverAt).getTime() - now; + return ( + } title={`${name} is away`}> + {error} +

    + {THIS_COMPUTER} takes over {left > 0 ? `in ${countdown(left)}` : "in a moment"}. Everything keeps working. +

    +
    + ); + } + const other = group.devices.find((d) => !d.self && d.standingIn); + return ( + + {error} +

    + {other + ? `${other.name} stands in for it. Everything keeps working here too.` + : "Everything keeps working here. Automations, messaging and the phone app wait until it's back."} +

    +
    + ); +} + +/** One PATCH /api/devices, shown at once and rolled back when it fails. */ +function useGroupPatch() { + const qc = useQueryClient(); + return useMutation({ + mutationFn: (input: DeviceGroupPatch) => api.devices.update(input), + onMutate: async (input) => { + await qc.cancelQueries({ queryKey: qk.devices }); + const prev = qc.getQueryData(qk.devices); + if (prev) qc.setQueryData(qk.devices, { ...prev, ...input }); + return { prev }; + }, + onError: (e, _v, ctx) => { + if (ctx?.prev) qc.setQueryData(qk.devices, ctx.prev); + toastApiError(e, "Could not save", qc); + }, + onSuccess: (next) => { + qc.setQueryData(qk.devices, next); + toast.success("Saved", { id: "settings-saved", duration: 1200 }); + }, + }); +} + +const STAND_IN_MINUTES = [1, 2, 3, 5, 10, 15]; + +function StandInGroup({ group, now }: { group: DeviceGroup; now: number }) { + const patch = useGroupPatch(); + const primary = group.role === "primary"; + const subject = primary ? THIS_COMPUTER_INLINE : (group.primaryName ?? "the primary"); + const m = group.standInMinutes; + const minutes = STAND_IN_MINUTES.includes(m) ? STAND_IN_MINUTES : [...STAND_IN_MINUTES, m].sort((a, b) => a - b); + const elsewhere = primary ? "" : ` Change this on ${group.primaryName}.`; + + return ( + } description="Every computer has a copy of everything, so nothing stops when the primary sleeps or its lid closes."> + {group.role === "secondary" && !group.primaryOnline && ( +
    +
    )} - + +
    + {group.standInEnabled && ( + + )} + patch.mutate({ standInEnabled: on })} /> +
    +
    +
    + ); +} + +const SIGN_INS: Record = { + own: { label: "Each computer signs in", line: "With your saved logins, 2FA codes and passkeys." }, + seed: { label: "Start from the primary's", line: "A computer new to a site copies the primary's sign-in." }, +}; + +function BrowserSignInsGroup({ group }: { group: DeviceGroup }) { + const patch = useGroupPatch(); + const primary = group.role === "primary"; + const value = group.browserSignIns; + const from = primary ? `${THIS_COMPUTER_INLINE}'s` : `${group.primaryName}'s`; + return ( + } description="How the other computers get signed in to websites."> + + + + ); } @@ -502,13 +677,129 @@ function HandoffCard({ group }: { group: DeviceGroup }) {

    - 0 ? "default" : "outline"} /> + 0 ? "default" : "outline"} /> ); } -function DeviceRow({ device, removable }: { device: GroupDevice; removable: boolean }) { +/** A note under a computer of the list: what is wrong or odd there, and the one thing to do about it. */ +function DeviceNote({ tone, icon, title, action, children }: { tone?: "warning"; icon: ReactNode; title: string; action: ReactNode; children: ReactNode }) { + return ( +
    + {icon} +
    +

    {title}

    +

    {children}

    +
    +
    {action}
    +
    + ); +} + +function FullDiskAccessNote({ device }: { device: GroupDevice }) { + const showGuide = useMacPermissionsGuide((s) => s.show); + const [open, setOpen] = useState(false); + return ( + <> + } + title="Needs Full Disk Access" + action={ + + } + > + {device.self + ? "Agents here stop at a macOS “allow access to Desktop?” question until you click Allow." + : `Agents on ${device.name} stop at a macOS “allow access to Desktop?” question until someone clicks Allow there.`} + + {!device.self && ( + + + + Allow Full Disk Access on {device.name} + Then agents there can open the Desktop, Documents and Downloads without macOS asking first. Do this on {device.name}: + +
      + + Apple menu → System Settings → Privacy & Security → Full Disk Access. + + + Not in the list? Click + and pick Godmode from Applications. macOS asks for the Mac's password. + + + The warning here goes away by itself. + +
    + + + +
    +
    + )} + + ); +} + +function RunnerTwinNote({ device, runnerId }: { device: GroupDevice; runnerId: string }) { + const qc = useQueryClient(); + const { data: runners } = useRunners(); + const [confirm, setConfirm] = useState(false); + const runner = runners?.find((r) => r.id === runnerId); + const name = device.self ? THIS_COMPUTER : device.name; + const there = device.self ? THIS_COMPUTER_INLINE : device.name; + const retire = useMutation({ + mutationFn: () => api.devices.retireRunner(runnerId), + onSuccess: (result) => { + const chats = result.moved === 0 ? "The runner had no chats." : `${result.moved === 1 ? "1 chat" : `${result.moved} chats`} moved to the app.`; + toast.success(`${name} uses only the app now`, { + description: result.uninstalled ? `${chats} The runner is switched off there.` : `${chats} Its runner still starts there: run “godmode runner uninstall” on ${there} to switch it off.`, + }); + void qc.invalidateQueries({ queryKey: qk.devices }); + void qc.invalidateQueries({ queryKey: qk.runners }); + void qc.invalidateQueries({ queryKey: qk.conversationsAll }); + }, + onError: (e) => toastApiError(e, `Couldn't switch off the runner on ${there}`, qc), + }); + const n = runner?.conversations ?? 0; + return ( + <> + } + title="Also paired as a runner" + action={ + + } + > + {name} also runs as a runner from an earlier setup. + + + + + Use only the app on {there}? + + The old runner on {there} is switched off and removed.{" "} + {n > 0 ? `Its ${n === 1 ? "chat moves" : `${n} chats move`} to the app there, with everything ${n === 1 ? "it" : "they"} did so far.` : "Its chats move to the app there."}{" "} + The app keeps working as it does now. + + + + Cancel + retire.mutate()}>Use only the app + + + + + ); +} + +function DeviceRow({ device, group, now, removable }: { device: GroupDevice; group: DeviceGroup; now: number; removable: boolean }) { const qc = useQueryClient(); const [confirm, setConfirm] = useState(false); const remove = useMutation({ @@ -520,7 +811,8 @@ function DeviceRow({ device, removable }: { device: GroupDevice; removable: bool }, onError: (e) => toastApiError(e, `Couldn't remove ${device.name}`, qc), }); - const state = device.self ? "online" : device.state; + const state = deviceState(device, group); + const fda = needsFullDiskAccess(device); return ( -
    -
    - -
    -
    -
    -

    {device.name}

    - {device.self && ( - {THIS_COMPUTER} - )} - +
    +
    +
    +
    -

    - - - {[deviceStateLine(device), state === "update_required" && device.version ? `v${device.version}` : null, deviceWorkLine(device)].filter(Boolean).join(" · ")} - -

    +
    +
    +

    {device.name}

    + {device.self && ( + {THIS_COMPUTER} + )} + +
    +

    + + + {deviceStateLine(device, group, now)} + {[state === "update_required" && device.version ? `v${device.version}` : null, deviceWorkLine(device)].filter(Boolean).map((part) => ` · ${part}`).join("")} + +

    +
    + {removable && ( + + + + + Remove from group + + )}
    - {removable && ( - - - - - Remove from group - + {(fda || device.runnerTwin) && ( +
    + {fda && } + {device.runnerTwin && } +
    )}
    @@ -593,42 +894,7 @@ function DeviceRow({ device, removable }: { device: GroupDevice; removable: bool const HERE = "here"; function RunOnGroup({ group }: { group: DeviceGroup }) { - const qc = useQueryClient(); - const update = useMutation({ - mutationFn: (defaultRunOn: string | null) => api.devices.update({ defaultRunOn }), - onMutate: async (defaultRunOn) => { - await qc.cancelQueries({ queryKey: qk.devices }); - const prev = qc.getQueryData(qk.devices); - if (prev) qc.setQueryData(qk.devices, { ...prev, defaultRunOn }); - return { prev }; - }, - onError: (e, _v, ctx) => { - if (ctx?.prev) qc.setQueryData(qk.devices, ctx.prev); - toastApiError(e, "Could not save", qc); - }, - onSuccess: (next) => { - qc.setQueryData(qk.devices, next); - toast.success("Saved", { id: "settings-saved", duration: 1200 }); - }, - }); - - const failover = useMutation({ - mutationFn: (input: { failover?: boolean; failoverMinutes?: number }) => api.devices.update(input), - onMutate: async (input) => { - await qc.cancelQueries({ queryKey: qk.devices }); - const prev = qc.getQueryData(qk.devices); - if (prev) qc.setQueryData(qk.devices, { ...prev, ...input }); - return { prev }; - }, - onError: (e, _v, ctx) => { - if (ctx?.prev) qc.setQueryData(qk.devices, ctx.prev); - toastApiError(e, "Could not save", qc); - }, - onSuccess: (next) => { - qc.setQueryData(qk.devices, next); - toast.success("Saved", { id: "settings-saved", duration: 1200 }); - }, - }); + const patch = useGroupPatch(); const value = group.defaultRunOn ?? HERE; const secondary = group.role === "secondary"; @@ -648,7 +914,7 @@ function RunOnGroup({ group }: { group: DeviceGroup }) { htmlFor="devices-run-on" description={options.length === 1 ? "Other computers show up here while they're online." : "You can pick another computer for each chat as you start it."} > - patch.mutate({ defaultRunOn: v === HERE ? null : v })}> @@ -679,7 +945,7 @@ function RunOnGroup({ group }: { group: DeviceGroup }) { >
    {group.failover && ( - patch.mutate({ failoverMinutes: Number(v) })}> @@ -692,7 +958,7 @@ function RunOnGroup({ group }: { group: DeviceGroup }) { )} - failover.mutate({ failover: on })} /> + patch.mutate({ failover: on })} />
    @@ -720,7 +986,7 @@ function LeaveGroup({ group }: { group: DeviceGroup }) { description={ primary ? "The other computers leave and keep the setup they have now. Chats that live on them stay there." - : `It stops showing ${group.primaryName}'s Godmode and keeps a copy of the setup it has now, and its own chats.` + : `It stops sharing with ${group.primaryName} and keeps a copy of the setup it has now, and its own chats.` } >

    - {secondary + {standing + ? `${group.primaryName} is away, so ${THIS_COMPUTER_INLINE} runs the automations, the task board and the phone app until it's back. Everything that changes here goes back to it then.` + : secondary ? `${group.primaryName} runs the schedules. ${THIS_COMPUTER} has a copy of everything and keeps working while it's away. Chats can run here or on any other computer of the group.` : `It runs the schedules for ${count === 1 ? "the group" : `all ${count} computers`}. Keep it on and awake${group.standInEnabled && count > 1 ? " — while it's away, another computer stands in" : ""}.`}

    diff --git a/docs/screenshots/device-groups-v2/real-primary-popover-light.png b/docs/screenshots/device-groups-v2/real-primary-popover-light.png new file mode 100644 index 0000000000000000000000000000000000000000..062ee28d419d6054697b19473678918adc06634d GIT binary patch literal 139015 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
    @_xpqe3R^`8WCrvdI>*6cA-=muztK6$tPRTpvY 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

    P|%KdKBe!UtXa&6sjH;gwmM6ysN#_!bw z!1nM&7a!kMX0AK3QRVaGn*BC+nA+#MRD)dl1GU4e3wTkzQi=OtuN(}eF6fWpKG$Mx znDnX`Ik7J%=r>$cHd5dUs(%rChxQpRm4SM`5On_SUW7k5IGLQL1qE~B^ zoe?_+et``{*`)%`nr4!^7cY7Sp3Ob+4}&d!{4*i#>!LB(nfkVrgfms#dukJE5a_UM21S%0?^;&2a=nrqsHg(i3#O+8O7IAM+}B!0&9La20~>;oEP3 z?OT!L*FJNm(%jIabCOvzYf+UqZ9h1$B^)()h|0_Tt%(48jH*BP2%fG?H`@^XUg%?X zco<@+gCDQsOEFoiMGjF z2{{M9#u*gYWHjtMM;2jR?$Mj<&OWuOz!KS=+rVs&Z)>)rOd z%iUR)122(%(yr>x0$D*1ylU?wT#v*gzp1I874t0CiDRm6YCedB)#cRpra^3BsGK9} zC0^8*_$yHM=n}$l2qwZFZlzZQIKv(xMRcoYN4e$C)@+G^0?sSSRO%EQ%pCj6{H7EN z;#)!~zY@C%^Gk5A?=O?L7Sb`qC8hb$SE10LTL+3Goo%&u42RSq4FtZeNd^6Ju`12; zj;}}`{_hMKKo_UC>p<;9^`6+Gp#D7@lTRKJe#;4 z`2Ull2HF|I+TCFEN_2Q2wy)w9GCNmjAs|CClW5Umnvb z;2?MMJqw2}dfDJ$wDd&mr#Gf)%NopW{NAK_aS#?T%1feN;l^Hr7(if~>GDnH9*fEh zYm-ng3UD;M_yHtII^XsxQUJ%Y7KJ>*$&bmVcNhg*73=h&cDdh6^&SSpRk8$`c~G~u zuvH(l)HeSxirk>s!3O|nLHBzBs-8h_jdw5O>)lJOHV?X);WFxqYNTIfA3N13p2|Mv zqtyOeC*^OJFB3x5{vpb(Sf;#sf($%IELrS^eyPyf_dXoLMgKDV4gAcc_dP`(2_krK zxsV{EuTRq-UHKycAnnn5VoWPRDP5jJ+syLHG_o+p2MT@EVQtZK7kAV%fvZ?PZO%&=OvsLULkIN z3m`?3&dF3wR%CsAr8`*2n%nd2{a1p6fd4VL0TkyDN|+crLf(8MBJ%+MSzak=-Ak;X zlOt#~6XpkET#wE-%{Lgd{trB~Ze#xQX-R;;KB%17gD}#CfC-3$3|np!B(&hzV~za; z8l|WI`~eveZ!h36PibR6TWL{D`@ZsDutmuML7@9Ke1MFBRiF$h7!SaxYvP-hH(WXA zdvz|A`fki&PGdBJ8#t0I|KJp9^k6$&kGw~5wgZ?Sg11GS!H?jXH$wrc#8eM-kcQuy z-(d@`fUpJOL_pXeC|f#`g`|b#(bDAzP^lknpgWG@<5kQ*E4v|vc?>`abz#TU9_QC$ zhp1B$G?qCQVO9!+#s8rkkm~1QEQZk2(UpkzuGlzLf$s1}>?A2y^e;O8ua1Zj+jw>S znPj0F!~Eu9fuaikg$iPX9Zp@od@Z>+iFKXq{~fPEpbCy!}HG)Hfev= z9Sm-npk*{vOj=cDep$H6IgnTwj3REocvp0zBUTf1SIv~$-~cs0Qdt|^voF4)+zxMF zy*fK6>3ulj+^BBu+_y;w#XNlf_^&yJMSk9P@;**0E&aa!Q~LSO&KcU+*995I-hV=x zk4JfgGSA%G+(ywRJ*O-Vrv3I8`W4M`sE)NZWO79bZ03sfoLL#`N9Hc3uFo<`a~f!+ zuD?pIdE3l|@9O?^*0z~n%NlxjrgswSb~%+<+EP4e)ljnSw{X_BeWb77(>ZE%pjY5# ztanGZHj%;wH<5C^qa6#Vej?XRtrt*987|m4FYME9A(s0LTY9x5{O;=w+J3g^)}*XJiyMh5)}O;*Q%+`6Ry%qL z8BW8Qx->O;MBH3xhGH}44-Vx4y%2SVk2FI056KGaZqWF>{O{g1PMQ1V#=rfO*Fm{6 zYwscPJJeBh<=k{f0l^Wsu&mvtO?XK)wa zV;$obISXv*0HeQUX8{w^&eG+9zSh5K5kFRAt{;)KAS{3MAyK8{HGtm2pk@{T=iViR z*K@~I*BlNYkL|QOk6;K8B!OF_?S9DG+RJRW8e7W1Ef6L=erdQqi&Cu`I?e z{bj4gRf}#zsoc9Dkgbpf0UR|ZRCPxMG$a9VCQeGr%-egy{=LI_*{HqlyW#qK zfF$5Vs^sd%{j17T0}KSIl~N_3{f&>SQu?bKFTlKzn67)m!1tc>;j1{|q`Q}&7cpQr z^x6i%7lDwVz)7n+e^)o>)x8tIjDsw2(bfS+4A^qeI2S~m}}tB&t%y(u>8 zRn6X4+YP|4pKJJ)(eh86(XKq8aWp1ExCR9I#h%B_nhob?Mc9IjDd7EtQqYYH9Z&g0%BSEW{Q?SMQW zUG*Q)S-OTg2MfIRZ&?Juo!@nlJf*mOe1%Ycu+rzgep3^|z+b(cP6orHi>A&xreOZP zI8J2U36lzvWN#a`5Pg>A{-Aw`J-d(ShQJ!PI2(f($+dDk((=1wCPY$ArB zq&r4tyc~mui6KE$sqEs>CdHTzGHG!p82WB-=xS3t{u&xYw(Udo0>k{MtE1$hfeAtE z#{mIW!BUvS#6}BCu4chD6>qD!$`BI#k1eVRuQN0ji;a##wW!pK`*ShNr&%XzKNG*c={J|BHEuLei?wc)mFi%PD;MYy%gPFTs+H(di+ zyLha&u05N`*BwqoX1#mDuP|%h2N2fxr`YbiWmK5ZwVYsiiS@~^gVE!5u($5c*h$Iu zg|<@+3uAIg6os_c)}*Q5s&%5Hy;B}xF?h2KWp|VWa2i;>ZEy!4ghiC7;P=>2jMQ5} z?~naq5p37Emej-zTidY!nqw~sk1p-qK@>MO*WMHXAeNDBXY{=>5Q)vK_S#QigxQ?= zqmX>u$!A;OaIPY<+hVn=8UaTv^thNq)NQ?*er?GiMud{skOhJOmER}JVmRA0c zn{dyRs(VCdNXrU#`1UCTlsHpnNQxxjuJo{q(lVK>(L1sSE1QYH;_%b)EgTM)py}Z@qKr*PW5qt9c z$?%T|?Qu;9C&7r@ldxxA$8FjvmnBweE89rKXSV~+?!m7~6RWr!HqqJ|IIuC8R-h=o zl;hz~UICWw=*3jK#~&FU>{Y`uZ7z>OR^iO%&J~g9k3Y@-Za`dNu1v z7+Z7I&K^=cqi=OGQB|eaF#BhSomh}FyFYETKgxhDv7z7FU(zLJ=y5XeY8DBhFFqo% zU;B~?5QJqkZaiY~a?uO!v;DUF%{urL=h(!_uXzK2m#C%fo!6*!_a=kl%smZAP)$^AkmT3 zh%3;M0vM@5uu9;oyy{#XJ^Zoze3?}maYp9P971AKXfCtNi7dkzQMK@SUg|BfT?;Jy z;|-7>Ig6Ul?V-GetsBO7A0G4y^^gmZ(2XiE4-}H#wSIrGBpcY>$d`sHh@>g;=~r&17#>E$~G_NMnN1*SBADW)bgb z$k*sr5~^4JtP2Kr9cKcNmFbL{zTUC|THe8d{bRfxuXD4b$y128 zu;+aM_TU!B>#ql1sv6`fj)~BEG%jP&47ge+p9m7a?alz& zH6XTw=!sqvLjcF`JBq=5B5VHR>#5k1w3#)px0}DvLx_y_A92Yum!%|j0WS)Y@hR z0}qxNL!lwdncli8l|`f&2naqsKi&9Vk-qmU6U{?cJs-xVm7ibN_tp)&o_ z=E$r0h6)1M)2zQiwa(u?`1Zp5mq2Wew_J|r{FM=!hbm{@i$>nAx7g_w{xO=zG5v%w z@3v)v)Ppf?)n=uA9AsCM0W>mgE12+LY^au6G@z&O59GKhAqx%G3bbT3z$cCTx~Vhu zb*Y=fWgLpwGs~jBS+Pq(eiX@LbtYM0)K5I^^JUL@wDP{{jR7~Q-%nf^K?@bJH9Uom zFrg<)D~%E&LcLS@b2-9|y?GBn@IyLhAadZVr9iMSA~Z=WQM9<-4y;aKms_HfdAUVD z_8nd}_$FNfI)p1g4+wC>_4Cl`0H-G!OS|owl!z8(<=C#8!8LZ($Ky#@%j*Qxf#Q~= zduahu>f-d&jG|pgaA2yVJsN_rxboi1^DNT9f-cu{yh1vj-l-ql{7J+_=xbZcJY!FCP6S1wIqpsm=Xs8v$N9ux*?~Ns?%Wm)am&-E{R-dQ({|nkAgD)|vPg84c_Jjvq(AV^s*N5pRM`x& zHR>vyfUESXeIj-H-5?yi@3MU#;l}^O0%;1cJ8j93*+)yZlyW7&8LO3y@uzB`!UUf} zD$zV!oDkP4R=zBQFBb8HV#lmPO1g#=ad2e$^Bs#<8!}db(sy>yk_lE4@6iJP6U5w z7xlOnuW?n9p>gq~yG|$#^}8bDZ5bMccbnwj$F4R_*XXU zzxih3-{xR#8`ReRGWM&N^4s%nKfpNJY{_)Q_VAHU!%F&yZxSEASSJ0^CZ%xQz04Qt zge#U=$X%$qN%=~X9lp0c!1)EzSiGvCRz_Ha-Oj}ezZ;Rnv#84n<6TpEdtDSqWdHC| z=h_Xj?N|OCbg3-{)ej_hJ`8mk=&M{;y2*auo{>w{bp(3}4cuM(d6>u!@11Q)eELF1 zJ=7)ZlWdU=pFEbJVYfY2v9mr8oWOa~&}oYIy(h4f6f_U3)Lc_`nxW)^f^5zBU8Fc7(a$8y#Wf^+Ytv5Jm-70Tw)BP&5R7`-~iH%#A15@ z2IX5K3OC8d+2U1ZivpLb`3V85;|1W{DJFLA)J^M=xBzMj0`gd#f={)l?sY%Ui+S^q<0g5TGca=j}Qwllag}rLpp$hL=oYEX3 zp)RGu)=6_wyBEY0Nfk&)j#zP|cPCXqbUmJp@AQMFIC}2WT+x>)(~d6arAzDKA~lO9 z<~0lDL>Wr2ipJZN$nA?M5PUctnyue{?&}FY%|-*E&v^eDps-qmwSK@_3kKR`B|Rv0P_! zdwJNqw5f+QjoH1@eiilt7Hx42h3D=+K|Ez`8D1L>3J$6M;P(@jcAI2p|<)@$G z4wk*cXAd98hIA=%~1IMlVvp?5|3GO7;vkx!*i$e(yYkiCgz&Cl1nI z@f7DiQz{h%^}^3^fY+<32BWswg1L&Wg5PQ#m}*Z63v6+|%9?zwUk{O{OpN(5=6S#~ z9m!crZp#-Pq8@sjxMJQqKJ4}^dsXoREa1^%L6kazL8(yTWH7pFvt2TQ2YUdv2YQOTI=U|7E+DRsCC1Bn9 zDc<&f;er#)^UEKc<@@ocZL#_N2us=SPhc+A!>yAij+c1Q(MZOZTo5P0!wer}*P#yQ zEbJvQ)AQ5tI%@yS9V!>HIiEEO{!wt_aM~;={S1buDbB%3ox4DjC8V>hJ( z^_(X`2(fNH)wxgE-6)_NcfqXsA9$$mxX-()flxRcM1FF&xSh1FjEax-XjfG;Eu22{ zc`}5SH^qIHWYws^7b+D+j$6l`FA{=2lh!!o*;B0VNJfn>);|{JJ~ooLpWu(M za)kzdtVzX+UwG^V%cyz{&w0@69}89w|J{9Y)-zHrtq ztLa_MwSf_|VZk10f>-wfzjuBpt!_o{axXV#u2Kq5sn2IDMt3`t2MiZ`bk(olMc>j$ zfs4cvdsPpU`(jY;tvrl{=drB(R0&lBOjr0gjv})Gi1LvwEbx{G=X5AfiCN>Ki$Vyl zuGWVfN9YZ8wL5}jkK$E`kGZAM&}meL2T+7dnp ze2`wYCwn8W%-kl8&^Ep@b8gXlBo0h(jQ$>p1!w{9TE$+8rw$GdR6n`cZHs|OU= zC`Dzatj+GdNJGJ7L;qz87BjB*7 z_H4}(seC{^d*V=i@;<=gcw4UU_|4nfwIxBhU+GWe)NdI(+m41j))S}wv`_YU?6(Em z@Ke(oEMPmRk!PvH>SY?uqCKzSe%I8r6+BXmXSZ;Y)+zmkToS|=9ymr;F{Im@3vA)a z5XfbY^xE@boJOUv5AV3(;)E^Ld)n^YQ$Qg_?kWGz71gHK0-%5#Zq{S!(!-L6V_K@$ zD3sKmoZg1a=oKy#+~oxm<|T?b1d|7M-V4VrPI!D15Oj~VBHT$4=k%{p?NVXYxS+Xcu50!*@I8^7srC0a@3{Rmhi2$V3?cU`?kMO5X!+d(9_t(s#J3S z_nreP4w69MN8|qQ&-*>$e=(;C-v7XHKXn_&MxjsfA^eTQO}^7k=t%zu7Q P2dAu{AzvwL8S;Msr-hVw literal 0 HcmV?d00001 diff --git a/docs/screenshots/device-groups-v2/real-secondary-standing-in-dark.png b/docs/screenshots/device-groups-v2/real-secondary-standing-in-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..d2e4c8554ffbc62c8d7f7e56147aab2d5499f593 GIT binary patch literal 145278 zcmc$_^>WE6%7p$UXvwJ%L)J> z0<_fhUNJJzQBjhUk`S>lFXTk))^~OGQZ`z|TWZPb(zIC)*!yZ)@r8 z;S3J(my#4!SA87`4ipy?=Hy@%6BSBLie+SGP<|!Pz(^Mw?Egv;L_~-m^&$8}Sb&PM zVt}9L=hV0_*(vgJG6lJ5$q7-aDoWg3?C*^A<3EPW%1AIVGFV%hG6`@b#zuTjOVrg? z&&f;{5fMV)pK> zi<6C&g~@wgcMmrQ3p1mv^h7>hE=dW|kU*cH_g=#b*N{sRMaWl}H;I%97IWxre`Zk71j`13x#{muH}33-eI(7y;p^JULjIR5jma#d>HI&ZzkN3A7`a)_ z&khwJ{^O%Vx-AKB4RyIJUbC~YO2^n)Tbc9oa&sz)DUGDe%}f~m$`-cQ6!S3nbkM`A z4RUjJbet=;T`Mm-8aM1qmy!@;m*N+E`-<;JsPDwLmuZ>v-A+!BFo!swiLn8nnzW{- z+LwkrRuOI<70IxHuc@sCm0JUUPGMJTnL9fxu|FaAOCC-2-=F5RpP!!ct# zD@@pO>_j=11gjJKbUlVcrmgqAzk`;<8708`QthB;8|*Y=R$Yf>=cui zC}VbNarZ=I9|v3Qm2Oq;-27DP&dT*;{_a@eA7x3{=1u~W67_VV3g4d2!8dBkvoy{@ zep+MVlc1J*FnkBms}*VQ^d%I8&XDVfQ)!4xu%NJ_7RmahE zvP`}5MFi3KqeIXz*-=Fj87~gmi8QIC-$}x`r?nwlQWntk(r0HWMH-Sx;+o3@p3zx0hWz`KGKYGNr^7aajG)|#D&@GsDjfcKb6XU#6Vjf zAt@hyH(tN^uFb}r#8Ak7g}&^hY3EWYOR+w!KgN@dXyM^oV(4{6LGrVhG)H%^n!o`C zv~u&`Jg5(9Z2?Vlx9->x=Vt|>ywjDU>zujGGLBbSV|zT;c}ZmYt3R0f6`By*)W_9w zf!v>Gc}x!nWUkZGh3TJpy3NuNl`be_A$`1h9?^HoBvoSDiZrOwlolvE?p0C1{L1KD~bU`EG=M z%?uZo{T7LK#=LRVta|P_-94*ry|HNCaD$NHPyhu72JAFHowCDP&4>|;-KRoW{_W$5 zO%DJp{tCVcQjL=p|9aw=Ib&o2(zMM1Ymh>9%O~d;`>h^PsM=~v^31#SO>?PQi`U!j zai~mjVR9jxAMw`iF}ta}91m=mhCat1>%@%w4Bc3L*1>gXRTgs4QvLpYv?%ysB_oY> zg>d|zbDN1!-rQ?Fb#=$!tehpIJJ0(TW=P+~pOi<0K;xSATP&ZqxUe;OsidkFGwp`q z3t7#vaMdGVh*-1MPRaAO!jqmH{XD^E9n?l``cVFspldKr9CjCPd~h|cgbv31KNFCv z@$bPr<(f={fuWKJfr>OTpUgoU=H{N3Zoj}Z!aS&}c+iFM@LXi1tDPb+PSp`dJXm99 zvK|so1U>r))E1*xL7ff7H`#V+`w&}Dx9&0608{J&+o4G#z#-(ajt1&KpXu?#T2;(S zH1(N96(sw*E|Sr&zTgTR3JFWT5IFOo(oz+Prb_zS&rF3%m2|g_bk+V3^cOi!36AYM zA!{`#SM38h4$eSe)ipYPqHNs?`P7aGS$kb{NgkA!!3WJ#{EneF9a!bo=J{)}$?4U{ zhr_2u;@H7gk!DZnd&O&84w{emhhji%0N_nlH_^kAmH6JZyD#X75c>PnDpLe9XRYyh zoYm>I(R`B<}{Q5Xx z%h==Y(hVU8i~<1EWUL%mvC8b~khk-` z^*N^KOUs$BW9sjvZ(XArA%Px#VwTR5RFKDV2-H^Ae>G1dNLy5I7~Rx$arZ;&MEHOD zp9^->0DWhN-Bn>bIEMq*O7eTC+g8^uwL;gfi)o;9^&y!uUGEj8GfcWiE@gy;pTyn= zyi#mHZq${2d5AdwJvm3O?)6v+)x1%Cn}w@WS8?WZwbyC8G>I| zWOFglRRff~OAR%idH49)3)4QIjPy2yAQ4+!57C)BWPktSbu)NA7_-irk+4qk6{UZc zj0;lZ{4HOz@@-$eDPqW{e=o#6nsYs8`q4soozsLIil}mc4u_tc%MbXCU%wl;_ID^K zUFQ)CHiqZz z(&zc#-ak|jm?Cfobn2UsK~+l0M*>icxiw{G?q;q9nKLr^ z{Bhd|CS*l~f1IbRP1H@WcQ?75_0m5qd8YmwE0WJ|6rXu?*cdQz8^x!x;9o)l0%baY zV$voAEEpl?CZM5*?EkimMY($2j7)`e<%i3-z6y)XhD2C|yKBAlO zU*?j>0P%*|BeYd!dOYs5&`#fS_a*P*@Q$8+*^x=T&)LN6XER z1bJvk%QGF<7k8H?**MZ6b*z7a=H36~J(`QBc<8i>JJ$)3hsjI-%@20(s@tGy71Pf< z6$%Ia9kcL`6P>He+doPIZGKOu-Cfo0u5;5$}<+J~H!aiB`HTR}D;qgkH@XMrNda9M zA)H4Hy^}T^FQUlek4E?3NJJkak%C1`n9fgLmR!aildwjfY6e^EcIU$|9*~bkIit}i_{rq}>G{9A+q1W`W; zx3^aA&AkbVi~Rh#&ldael^8uR9{Jod;sh^|4`qH64+a1dSW_a%v5l!A+<`$we35tz zjbie5)6vJTV~Nnek~`wO{x-&(6ZWCcz&GQBr+p2W`YHMM_Ga~AV2xSl;pzR{QN2pw zZ;ec^eeFVv06r6w#8i?Nv*J9adj9<-gh(3aCGEHxNTL5NqywOJK{ER#I^MllV_y#? zMH+8OqgTOdeYCZb7DLAAVPotA^*iDAA3qO4O>aozdan0T{Cn{ux)ZM05gV zZx)+NalRd1q2fZlSI|L}fX)M1>z2%J#HXX%+sUv8`}>W_ot^G3PVloPgTM6xfEoll z%?DhGyKG-Qp11<9w#oIq%K?e=ntuR^mOq#TLDoNcS{wjE6i`%H+GfP-=#h4`9RDYx zxX~_hkO}Yu3f#t13Zf6WSjLwjfCD4>?m;dJG?(~pW6iRmnUR8Y$1h^)FVrZ4t zsX@8w?iaYFSYQ#r{Wlbcw2?vt7`_J?z?F%ylLoR-Qd*F*Q17rm;@1oy;pHBXp#kTQ zc7*o1V@rN66#FmIxrHSBv5E7@&<$`q;%yz!7joH@cWY0bzDKC=rL?!-S9< zfo)7bH4W#VoW9cGLRFY4*d>W^X&KY|rv!lwJfIEBY)nBFaDM5l^`JMva0}Xadfq}( z18iX*=Z4~7YHs9d0EP3&0wT=V!-%)1*cH&oyk~2?N_2W|H!>A|riV?=RKuq z5jB|DW0%|!=)h}qoUYApC0F!$c*se&-E#Q#rFaH+o$PXAo=rRlFn%X8TESkvqGg5D zbgbzab*j>JPSud~eY>U1C{4LaqA%Nei5qle7Aa0{V60)c06gJ2>$gCJBwqbS6hcQa zGLE-$$OV?SWUWhs7LJf0*x+?%@bl9H5-etChu0q&S_0#4Y<%@s{!23ZtOHMux#AIJ zi}HK0nbP0IN3ocBQgTob4cC_bp*;Eb`5#ft)`UZ?D!=bA5`GQvw)1p*?W>Vw z*&t%g?=?vq+!YNyloy-Q*qEQmb-FNB5PsmtFR#M4p?t^_g4k}%mkRH+8+L{U5zQWWxX1$SL?4bb;Exgcb)xv zfxeYa`FJDv0lEOdH{jYO#*QoO(_mOvS^6;{gq?QX`ZVtHcu_)Sb?P!YHG7>bg~G=< z>KA3|!j127HMoG5*x*0|731B8n<}+bw zd0d^t+SgIzr&|M_VRAok`>P?sSQM!XQI`|;Oh;cP9B9xG0pj|`_x>v}>BWU@;cBuFR{6>D?H19rww3(4sxjFqKd8#7b40|O zp+iSI!YbEdgexj}APvOxNq1hjQBfR~u`2=*R$_aoL<5PphenJ6@^)gJdZuwt4#l$Q zu+p-w_@H{~y(?GH>$r){PQO17z}056GDeru%?bOb#?+Tu*N>N7m|vBX=LQ%DIFhW<-M_)D|LmI%8_+5Zpmc(O}sOv zhZ%7ox*Xp7PH|L-wAa)(`+Kv`gY?+`uXXCb-9eUdR?u(a8}IQbqrHE8(+2Y-hFWX| z{;>{-F&rYS3|DNdr;!knAV7s#^ZeO5$6}Wrt|+8f3;4p(^;K|@%J(YUSM&Awo&%%M#_tP z`@O#?P`i%QowxPmxx9)#eQ%OCg0L3P=ld>oDg^iFCEbE#q@gfoFPEDfdp~55a%^z+ z9paP$B0L;a5F0J>HOF$kVcK}D)3tnZ^|p;d2CDrvFmQ_6;pFu8ISC5O=_m=sd%0%M zz{CE?o%Z|5?K}t>HaJEph6R331YCvDcIj{4QppqlumrGHmt?>i-It`_s6>)Gpz0vqR&)3Z%a~V7l}AVvXN|E2jG^$C zKRa6fs{wrwawcv9P9?Mk!K!xcqKJopQm*^40Q}0Ea&=yv9NFwWk<=s1_$nuvjEe^NRf=48h+1$1K_gGL`N|K3_DV4 zcj-cw*!r_Y|f8X z&z7A5`pz{i&}$?PV8X|CBVv$=wh;Woz-%*8RS(g}$#&wMddl%THtU)r@6PfkbwpUt zbNP(`F$gzqZ>|J{&!Q=THNlW;@mm`p+eBL`$C57wo4H1EhP&CC#6&kq-fO4dzL`Z( ziDIwZTwX}S;XPY%8?6Iq%k&WqBJw`m5_$+Q|NLPlT=TP9_-nUZd0M^Z<>j`*J0eKy zAh(PdG(V(DnihvSH|IlJt=_gcQfRTNYpB?)6K4K!R2mg1K4rA$7)RDOmD-D!W|CbR zn};C2ew-ji#8;e7mQzNg8PTWc?IA*o7to5vz->t?#l?H76HRyU6*6>wlkN7;IG8tn z^!BqWp=H_F{4BG)xl%+x!8u9;ziaraKtx}{RV<=Vc0Wl*#y&3Bn`j!7jJ#AA>jRm{ zd<=Q+{Gp71%iu@D^1vt|`ghzkcqU!XGC*TqKou&KMCIQ3@m5vkUiUDdhV|WQ3D5Xt zB&CV0eRkOEFecjWv?AV-QlpD{!h#l&XzBGxC@oWJW$fcdu`FjnSV|FZ>VfCIsH=kb zb1wi!4ZKqQFrgB<&JUV7n;h5O{RW_xD@!F(!j~u?-0V;%@d=3=$w9b^BnTmne&Rf$YG9vluEI}-N>c+>lV^S(O$zt;xOA4JnQZxJ&mXOd!G_;Wk z+zf^yU}!LM&?CuuAX9x&OfSldH4-AEvM-#-Vdnq+DPR%Rd@%El_x)nfM5k~2X;n4J z8W*ARDWbaJob=ySUHy=-zq75S3BMv+qiNdL&wfv&@aErfEP_yR+eg@+ zzM_$z3ZO%T=_x>$+2o@d}jZ3EOrkT!gsgq)!VE?-vn37DPlv z3)~xcT#4BMC$^U{VGjvzz}`;u`VwkL*lt-R(C3WNd-MPWnnv`zsyJ4P=p&FMjsWV~ zN}y-RmIHffsC(qy(hkNBh|BQ|Kt>EQM}6MVoo(p|(i>!bQ?$clxED@K2zM)qY?Dgv z(ZQ*4pY4sLrri1hnK)8Mv;iz4naxVk$1N%|A7>fF4pl@+^ z#Bw-3`2u{jM#P7A{ewqZxeZ>k>=d37OgTMSd|n(nkddotXI4bS0UJm#(AO|W6kMZA zEb-U-n0=%g{>)bOwfXB;ng^)_{}ut-YVj*W*Ac(zro9t7QXj;z`^ZRk<((&a7sA^; zg~e}IuOm#;Kod);XOu!c*AgwtLD2?zcddnX%LB^7)(sLao!#EHZjl8ckHNi#sl z!#-Its^III+B0g>uYqRAfV_n8{d4V4nzHuVIKRt@=3PoS#wHz!9#f>TRyf1ngGIJW zVw2w^B!sk3Dp_yLEWR|cf6)|!&NBmZ<`QHJ`hTbfFIVa_(9WhkZpZ4+1cz+e?47;GBd&M-$vZB1y_4FotrbLi372i&!ez3sRpE6y zG6~X(^BpJ>)pM?^EC}(0L^GuHGj1>zpc73?`{x^0kbQVntr^#81*&m})}G-`A0RL> zdK`O(Dh=Qo?k(qQ+JXS3e6({I;3A@en5*NYq_q_g=wg|uNZ;=yH&^z2f4!=$xX>%pwm1R1l%P?XFy=RKp(HZyT~J`0{2P!6rdO&4w~SaHv{*xWK|d^RTlZ zzy0l^;l+02z_?-t5)565M2zF1*)giiU_{I*hx0aQCn(3war=cDVmO23QG^J?>ZUcW zUj^K2ao=)A$Cv&zXGvm1e$i^Qp?XxmlExsst;6DrD46?cayS}(p4y-gT6Q~z0MiNy zk&dt4+5ThK9kT#wv>h`Xkiu_3;A8oj85wj;b{iNsUf*=yB|O(^s}_|Db~7DtEj87>rKFdhV4L^3El!%^+39tX#baa z^cslraVd`OzE%55)PToUg2}6>+tK(BxuyX^?XGUHB{dxmmnAh_vPsA9($Cg4#~HGG zpp8=A2iu8?EJvIvFa<#$CyFd4IMh*JDxc3#LyW`MWT`MLpw{^50qCPFf$Bp6?n0KH zgB~G3jYR3c#H_H=DRymE5};YXQ<^9Ln72zu)&D062dsJ=fnAmHqlpb|6m2hK2b#tV zxT7%ObPCs|1SQMeLWY{nKVvu)^Wn*+hhYIihNB?7w9EQnktFJep211l^ueU8038IM zeg7XEe|q*Om4(0}G&wbxo)dTdoWM3a>uY3Fw-$DWSek41~w=QT^vQ ztRBZf_E7!;V}jvKO78Jej%*d|oLy}}4p6B?*7qX=+sJpHq{+G|;F#^$d0OPuLgn;851+ZNOtE#Pz-eGiqhj57vf#LOnOZh1lNKKCd1fHjK zx7{#NvOmTPc`K1qTB~X;P`U!<9`eeFe55$_o-8BJ#*Vu#Q;9HcmcZt#?%Zp@RS;c% z95)yF+I=hPAahY2ueFwq0$F+od~6s^VXPR@i#idRA+lqwi(M+V!0o;HRSJM=vTJzv z2o2~8YYYH;dRKz8b^#$hLWI4@e@7QCq=I)h zD>f)d%H{S+tQSJcZuhNojiyJt_IBOsd4Y>+DCsH3>j4$9(Nf6eoQSN70+hLFnSipS zH3)2T4VS8K5jDhvkX|jC^P}+mAx5Mx_|WQmEAqL2zBi8uFn)!v`b|X9rh#Es8qlWr zCQhr;#|fNoV(E)Jc)s3MVZQ}a*Gebtdc8MWt{df-){kp-^*59nvH_{ee`0&%ED)MA z_u~@=B;ExL`Wpwj6iRNk9HrT83J9b?FAl74m_UcR5paEye5>Y&Vu$IE2KD_j2TuV+ zhzKTBz9AG2dODD7ECY7<1&aSKErZSZBzRGcYSLT92>`W54Z2V~8h+A}%`8I($v!mI+3qSTo5fbK_b8AAeQ(zD&u@fpGm;36 z>p!N<2}<4(jW8!mPY2QV^O$B%@$C`C@(SaX^Hqaz+Pxo2vOYad?-3xuisYiI+UQDO z^_vfGQ`>ug0G0^{Tl)PPWP8uj`P&}{ssw2yPxEi2tj6H{7ZNj7d^4^5?#b|&U#>fUd8h>H8LSGj&@xjjDg-7#NO$( z{oMooOrwEhZmqIrOj?U>DE@#iiPwKQUg{hNNA#sm$PM5sCA1UI zOccHiaM-D9O)a(As#Oa9;w_7Z$>|D^-hZE4uHOTL96i6vb=?k_7*e}fjv9&im*K%04TM+#DYkh@fk!U>y0vR=DQHCYe zMc9&LOMytWR8m3xw^Mgf;$h|$R_7b)5n~fBO;1HOJa0l|&$=EarSfqmHV~Z{UIIFf zMOk6`yW!r{X)W|N8)}0xCZl5YZ$7*_MX%?bXzxE|-W0#QqPclD+XVQw8UQ#i zWmVz=i%zh_ks8@p9u@W@%Oo6-=zO!}Yb%QcU_5%vdv9t8dUo&CP_>$n(VXfhSua7T5|b*{hTj`}ybJA@umF-cs*Jx@Zdc*~GP zH5V$`PgVQU=(s@Wt;*K}9V)Cg`V#a}5kd9$R1McftWF=_vVXP;2m%HgYA5NMO=OrV zA|o|BT*!7#3V@$WlgK23MiXbr(#qG~7j~h8Y5acC``~P9rCXM+^T0_?eBQh!z(9k+ z<nlFy4|ljr6@AKkVzC$_T5>rZw-Xylvr8;4aPWY}~!N6=Nq z(E$-86RA?fKHZQZ*2Cfky^|TcuFBA7Y|ZY%x9qSu5!HB{jgrRmw{(M#7aCZmK%b_3 zdvr625mb6^+!Cw2gaJL|S$hw~fC`fDjfT>nWFk5&D0t&oR-e$O2lnCSHw@6Ec9 zz-a7`W3Q&y;{z?kHoLUTPGvlSBwR1{c$B#5+2Bz?B06f?JuZU*z1TE0T)A`p@NV(? zEF5*UlpVBz%o{W67NLDkS2{3uir063Jk3slSWPK}Z}b%)4XU{MwQ}nt*Pq8!H$+Om zcOmdW8hRCl&?w=N6S8RSH5TjH%aS`nNK-1oV%RY#1+`-T+(HCFj7zO5x_>*VTUfM2 z?Pt!M8!tT$ykb}wARd@T`&uAjHnTW+g1Zg?W!j$r@4)~ZW|Py|C912;bTzaSEJ2X+ zTPMhrU?uHq0bXxx2jw>$kT&AKUq9gTOU(C!Nn1w)DMVOVSWv9-{Jg>QR)B9P;CB)sY`0 zdctm$^P#~Otd5nSSb{^n@^!&Hn{Ebsk7j)McVm1wi<@KMUP*RBUU`}VKnQs4HnE=V zs|+@qWW#MpcNqtCb`4B3R00yeclEDf4+A>yF+}yL0r!vj^^<`6-&c+KH8Gy2Zzh5y zR8+Dg0Hg9)w{G4lEBaXl{D6 zmd0mDn(b8HNDd|43(CUGY6C2quVedbUERIBI$|sol3Vw>O^Yd50GC!_Hs%0J!YZvtnkUUpT&~OOJ z7fZ=}e`?dD6o!vNy)WSB(=aIV@r@=*J|5rM4ZAsvWkh<+{yqZGW-7H@rE1f*T5aKHRu!sJWa5dVWH@@6t6lbhsMC8l!DOhG9e`XMGNQ0=1$DmF;{)5mpX) z_Cl(=Fern(I7bHbbjCyJfL@QL_&@|L;8$I7@O)uo0)_1{WI|U53DyA!*^bdXxx1SQ z#(@{qZ-fHEo*w@`yqjABKouL6M#j*<27+;3)#XBenlAF{BhCt&jBNc6Z=+=G(usjF11K;s3@5Xyrv4r03JRoqD7k!Fh0^~r(D`UUL?!-lqN7u%`h-wm zjC2g^UUaBP?xP>VBgZ+ao0YTZI1eAV3x%E|>F75Yd8{s@1=2Ev4=JUKU1>w?3_T1Y zaV6&yzxoNP7C@rT;*|c*MDA=lvmMQhWLZBw*e!}Kr>3p{U1rDG2Mbzj5H;)AOuY4) zV3|+az#p2p^GE8Vn;fyqxP)_7j~DN3CVf-s0NdgJAQ6fsKFzp`@tHubw&9NjbciL^ zWF4zftvxbrvp&;<;RKHGKl zjM?F!N-neEykl6>tv}#SG=9G2y)kRd4H^t}18XdfE>i!TeA8QABZs!$GcY>913y{$ zAdzA=Tv#*-Lrns93=yJ`#(YFlM*1a#$Rht&l2-5Bsl_4z(JR=~^W5jx=v5&)$p3`} zJGa{_F1)&Lj(4c_Rv90HdjtBG+#TSe+jS>)#+-%=`F?$Qs5*xPjg(z#X68c4dCczl z)UFqoG8v|UNN0U`6}K&4{cO&KQ~u6mA(|L6#{|2JQPjlRh@lMm zq&9xfNQebl5C)8Iy!k60O{Tp__9_YR6pPz|?Me|@gMe;C>?+Q;^!KM64<3TKDpHzW zsnhy)HObGTv&PL>$*3UKwYf}+x^p$W;HiMku0OVqD+o&5iDZMOxOm4&2=6fE-3{GP zY-U8!oT2S@3E_TaW34mQ=t& zTKt6d?$Zif2NA}o3I1}1qZ);RSmfj53y%vP_lHuOMHQ&fe~>L6w@yNlp_Tv;&X7br zYJv`}*6u|TdMb0t9C3y0nc|G7xBr?zeB~&N;G?K5;?V6)#6OnEmw48GEB$z#3xF{` z{GuQ2f`7D<%=!4GtOXf{{_*oiY+ar-+N%3-nzwjz6uS1Wi@dnsCHxeSB(bf7&c>{< z0xybqtTP{7M}oYyf-DFu18!dw22aCqps@bfWQ|}O4pxjGHWw`T72e4oH+)&0@FMmB zYdPa~yn6uSL;{I%Mb6Pvdo<8D_-&3M#NP%4??L!CGV#7;39@5advVM;2WC zx(dLuLW4A%cT9&t^VOJ?xj}uWuQ%I+SKMMS?UzYWlnA%-^G)8_pVZJFEobkM@46f< z_&N1&m#AlKB%Ou~+klWMT`A3vjT2;!i(l(EHQHIm&amXY)Qx#BRvGFsIfv09lyfV+|ExG(iTYs+vRs2+8 z+UTA-Qx&=^d%Sk$PIv(P={XczO}gS`wWJZ@sVBfy#b($^^2kjPyTRF z9;-6yQ&ZVbBrz-wb%&g+{`rdeS@iN5i_vu#j+zQb-sm<%hl)=+>MNs9q(OC(FKC{} z2X!HJ<4ez>>(KpJ>Y;=7hyBOf>SI!=iuDQCms|^$uxq&(>rTG*qIq3jY}oNskf2E^ z?o`s3U)>54yrDn$CXMb8*Ns1tj(acRLt%s9XD{oWhF~15V1ulx$MU*|=iR|O-Yy!l zTSH5eOj+UuS?U$Ue*>v&C1|vK0gsxXi@FG;4pVtyZQmDHzqe6Ti2zT0!^2-7pUhAlS0meb#D< zIp`F~tqdkd>oW2pY;avCe(LI)LzS7TN!2Xeb&_Cyv>gpimMDmwR(LwIYMwIe(F(k& zWqFZX{u(1mdRD>nLvqABz~}32?5UuMAqxA;)_VWb?M)1Ukuh8F@|ofm!^%EJNPvuv zt0P+j@50KlQ`?_Gmg`^@X{Wr+Vy*U!~1Go#(}LCiJ@Z-88;L$eYf-UkE<#AldcXl{(jhLGg=+$2r>5jOSliA<}$* zq;zSZNyoBdO3yQc1Baq*FT0-4`I#|PC+H3b-<0m}QvSHTD<1tK7FNw;i0yF6Fqav6 zKR-*Ss={VnijBK3T(kM}^E6i4aIaPDslj;XoMT(P9R{&h*W6vS6QZ=D2s+A`bn z6m_1Re94oJd^LKhK?v<#n4d9!BlQGaK|Y>$|15bG&ilRMzIvV$xK=q}WA^qsweDKR zziEQ9GWU`;RP0;DS-rt$~7N?xRIO?Dbw=uG1C_rRt$DaWyh!AY7 zPySC;8u&(u!ASDP`wr;vUxT$OpmrS*E{AUgx^R8UKmK&Bt=z$}0kms0<#lxjoYDG^ zt^Jb)XFpj^x!x!@_%qagzail9j_!ZVri|`g3^Fzo{B852g7a9X-h#Si@C|+D-2eb+ z{Rh7Q?`+?o{>wlX`~AzL(D{tpez-q}IIx~r^?%Zw#xc3f6Dpr$EZBIg90J8Ps*kx& zY`q(tRs6ZmMAlI1XIbhoBV-B$!u`w1Sh)lzo{LhnEq|lbzK=n7n5Bm9Q{hC3Q^Bia z*y9{fP~n7RLu{CZd8)!cj=F!gpx6f_Aqq5@bPpf~E)s(G(m;TAN)MSDCQ91$Ncc}H zL-sc=V#7o@LU_=Sh@QBJ zC>IaTqJL=OggoVo-L3vcrv7`2?jQo!Fx38a)&xDYeo{IR)I>aGg)BwFLu0*$8z`Ms zT+sd%(h%{#4>Lm6_+NdMg;!d`iSFufp~~^oG9EPTU1YW7#L!o^w11%n8bu7O35p6m z{j31xJnj5XRXpPI(hyS8sW{Tw5I+0`f(=j`&36bR*Syh;|0CT1RAIxW4h6+}Tbl@D z+w$IyMvWLse!&hLkbVO)=^JAEXGzN+l*~??sf9j7h#j8>70K%3R{}Ml0|DSp^HD?z zGkhrfx0r=`ZS%FlCE*BXzv-9`sO0cte0csEgUG&PK& z!6C%LI5ia}g0Fwcac6Y-KGR;ki}X zSZ~$7S6hg(&Z&0pt@C&*MlyXJy0sWj+RN|GwcjMvyiJ(QoMt)oR*Zr;>GxFG#M{e3 zn@Qid^$A6z1|oLnO-vytzvfX#vRtUss&h#e{H-Oo>gz*N+!`v~P^q_Foqz77x{m%e zTACQW!3B=U*iSwO~I!;PTT2hp%A?PuGrreK0${gtu@<>Um2#*7|S^*M~x8yU} z<23Q)iq^bX25$Cl{I9H4A{@A!9B$tJ`uWz{+MvLBsXild#EiFoA={;r_$bart$E#e zO=Eb_W`%j_X6#Tzr&;}TqR|@a@QrvqxVnp$6RFXKmbG1T>3RMFSdSh=>~jqc{U!j> zjqSHAK#mbdag7IuMu6RdKxb(#V+i>m6U5~`k0ln!L+8`HUxH;#F&M{Wt@X(A{KP77 z22o-^9zDW=xs@TQ(m{vH-e5<9Se<`-D2LcCBabB(F#O^$m{Ad^XH zl~TRSLt&JV3P^I90!ot^13vu)UY9&v$A?y1NqH+fPfiKDO=;c!3MJ~r z)hP{CYCL`7Hd&g*HCHY1kE~2EG96l$>13Q;|4m)bP6ZsfX(QGZLokK+TgX`Ap@-rl zRkz>Zz>S|dXDXGa;jZ4IQA)Tk%R1wDG)1jiDyZmPiV9yqU{ifu*i;^nT7#+308xTN z7U{{s$?33f`sFd;(0^YRwWMU8`(XQbdAY9Q3@0Kk&8e#El_x+usA18-_5fHB-~}^v=WgrQEfx%Fe%MGW5@(vrdN( ziD?;=?ZO2#-7?y13%3puzF|MSywrKngrebi2mmzDBDL)y2h#1P@lTGyl?!uEzS1-Wnd10+J7Xmj%!N16STpcLy{cv?j3JHHPt4r!s8;beEY+j zPBEVT9~{sb#er9Y^WKkhCp^!S8gKJHm-h0=Hu14do0>*l)L)aQ2v5F@s2G`( z+!dTVct#2De*jtkOG5yB4{{I_Zs=L-q`>FRb*ecGpP=x#?ei25qjQ@`80nw};ohV` zvw-TALAEEmsI0euHVI6hrh9<)MfK{_=o!Pp`o^xKVkrSv-C*92ycqx3`F%1IHUjlO zeX_3%hRFAg3i$8n-Gj)2gui>uAN+r;HdJu*1wmaHu<$%%ZFBYL2=*u>x9N=-0y*Nj z)(M`>v(GKYS$bI&PZ4zOHHQx|3ypl2E2K`SrwS5GcYC=wE6sl`^fA}u?BW_0?a-#C ziQ1xjcb__sA%_p*A;6upxQPI@yoJ25eWKLSr(o{{nP+lNoFG#$1acR+jJ7;#v7eKr z*{$l&L|Mm`75P2q{W+Z>Fg91?2sd~@q#Ye_-*5cRGG`b|!}qz|CZx5wgGnd(d!MRe zDTTM(zvTlz@Pu-cz!ntUcM;rU-&j_G%;_j>PQ`%NMk$Sw0lgh z0Clsym&D!E@v#i7=w9A&Gn77J+}b+)J@&ZAT{ym6ImSssZjzCJpXUg7;6Doh{BQK4 ztxeVF7iQY$>miT=ZJz!T$M~u^R>#8lgwFC+fRv(M#mVznfouGDXlAFz3}d~!lFW54 zW|D#NeukoGTfTSuuJ3Z$ILEn!7u)>*W88iSd7f+OiJ*d->lxZBgpdLl*XT^WL%(M( zG5h4eU#clzVs*S$Yy|c6Af@!{b(t)KxL_8Jh%=7$lQ?9jsi<#ak{3D{KEmH4X-}ot z8m6)^5#YE1|AjZ>!4e*-n3}@EL-jbJQ8HB^Z}+Zlx*Kwdfcx?owyJw;ta8|g%Ft?3 z*tDW%tQRQ<`F+VWav`fgR?XtW%WW>E9tFX;MD^?NYP(MHj#>sBL)m+CLoYc8 zlfyE`OAj)VM)Trwn~XN_O|1ztt`FmR^EE{FFGvmR z@f@(=iOxT38<>sL_P@tjqUO=AENm4DT(JH&Yd{t#PYr)?Qx2)0&lIT$+Q-BG4_$8o z6;&5C48s6YQi60!h@^DG&`NiQG)Q;HkV=Yl4 z(Z!gJ`A`m2VZO1GiOE&OsBCK2CRGbb9n>~Q0IO2Q2!grM2cWdQ5>>~JEE`kWkg z4A8jb)u#`e1zfHs6#e{mF+xX+?K^348~e(s<0gVM#=hya=>fv6D&>c z{n>J^YnH$?5MubzZUls(fOcG{MwaNH_7~L$LlE|c?M&K~+EMM%d@5r+-bWGD7IB_;TfNb4bdfl zNUNPiG`+*6C6nhlzCbd@1|db>v8z8@;Polw)AawEK>&OP`J#hF>b~XThpdp%(wNkw z3qp!y{x(|V^fo`8ug|TWOS|@6HaN?@*xP?4ifqV`#{g?M@(!E)*&X}a$t5dWe=nr+ zQ|`xaEeO&i7?|yYKI2-~)75xnu|2RCaJ3Zu7+AM;y&lXVnIPr}E^+BUx@4AW2K^BsHRvU>qNmX3Hr7UzC41?6(=HqBgK%%qp-FDAaGB>2FUi1G=#ao)XrqdJLmnUw|LNMN|!`NM0r8C4v7-wsyBz!<@s%pqW8b>wJBhl7IQ>w#X z7PkoLGwnB5Ad{!7t@3(-Cu9hK88aTJL@Nwr8893M5!)7DSySP;$7tL0^9ho5&`jAt!eQ5=2 z%V?LU;^#fQiMH(_h?+HMs5b-I?5)uBSqj%s&?=g7;^@Yl7XETpI^CqDhZJ6JZw@OD zH=tGlJ$@lKmks3I)o8cG&&rYsA%H~DK=&hjfJKsRyJBDi%KTXf4`#gvIO}VER(EVz zERP{rGW;VyVH}SkhH2sDd2cy#Gv7jK3Vq0%#Wzb33?0sRyXGT$2K)qL`ysln@Eo2v zdi#LD-owxWU`Bfms%tqhodDtcV&JLsTlRizTlkk_m9(0cjLqC%^V=HM z!`F#UQo-S$g~XDah~!m2rcEu9ZB@J|ZsbEHTM{_{NV0QjHmr0sD$6i$PCr+zYO| zfBKI$J&FLP?B?ud{IdA=@d%Tob~=X!l7m>U3Lo(M9%}k4$OddnqmD-Qi6MV`rnnW! z|A>MufT61O40x0QWJIN#;qS`YWUN1Qn;pu@M|$@B$$!SiX$Mf7N#G1-hYM{10pD@s zHVQW=>k8xRfHjGB+n%NCgIf15&R!C9yXCe5)uz(PuVu98Lsep<-A!Sg<)2U*e}liW zK19>xmQX9r(JA5cm|)UuOIVkbl%%WKC!Qe@Rj0)3L;d%Ls`|%yt=<%d_w1cYMdI9d za=gB1jSIhwMnw1;fOdum5Mf^%4$-e(Xx>fOry5c;^%XL4sB|z^V-l%p7WR0^yS|#c zhzNt9k2yp?)1Ei>l3OHR%*t#l$C+Hcs9TmzPL_2<-ij2<$X=kZuT3u(%h98}EAjR_ zO#xMU24G-g(yC{e3H|s-4!Q-w6Ju}6^N0Ofy`9R7$D>|EZF;<|z&E# zb?K#CFwCtd76(uM5uAO-;2d670qg$8DM7tYM6d^*{brb@Bqehl8xmI1eUn~?33Bs2 z^aobuD~On;txRl+g-9+&oC48Lk>Xfm^(FS|Qhz_qLWklQcU{Q1u(9va$4KM!#8Nqb zv8$_KIll%qe``^zi?9>Xlvn>KfY=V8a(_2-Qv19hDc-~njs}4SlCtLyg`E2ORtiVT z*Ij65nGG{Y{`=xfSDp;UJc9%5l){{Vwr73^4SI3!nqF& z>vVnwo!x|0T57aAQWR+KkhtqxTCUg2&4|4zr7~|zQd+w8A0YkFX z&V;gpP+!<|m;1Y^lXqo3Bn9EJgi=qen9;ajhr!2Ixtn8x;BN%Ch!G9oSDrWbBx9G# zxo=EmaaF66-|7^{p+*VGeCt@Y?fWXKb%U&TK+kZ>cbQy1sLf!}jdu3F6vte{f^Z%4 z^jn7wC>Do}N6h($_R{a~R2@;{Q_dtnFz6LL?iRE&qXlwE>zQa$$_)EDRb!d|9;XBfFmhqodjRDer5Jex4K=H`p=!ayUIpm@;i@N0H;O{3I`#{RQMZ0o>3Ap4%1yeJw62Vk*Ii|0_ zL&C!nOpucGcH~9Il&+zQYF@?{37(hB+CMYypH8%9icRdDHMYN~Cg6U5s|ucyDlbuP zYcC$pyV5L6tLKK^GfcQ`cVztK2qpe8+dgpT*R_}W0S(Nc0(fXA;`^4 zxMrfez;na7lIWcjxs~`FLn+Oe@hVn#z9R)G;G+Ja!my9`^kl;(WlMMNG&6f<;BwK( zEVgpqTKIrlS!atR2|on$DKM7!;r9YXa2tCW7nsByGQRjl?EK?*M(yzCcEd2vhiCdU!6fcFP z+_|4KUBv{_XrA3mf6BwAt2%K|={h_lOqQ(4&890ZdEqgO*s&Wrcs1L5S5UY(I{M?M zU8UH}ObctxFnhgszdL2EMZNcoe>Tpjj~ymgtox7_Sxs{K`_hI7Pe6Hg%3w^xK?oc7 zfQdHl3kaGUDq3w*be`DkG7W%2NDZWAGvxsir4ZZKQfX^U0Q$CXF+7#-AP!J!sB}%< zmEzF&-d^UX>)g*2Cf7+Xg!f|aszyI>hWBlKbWSO7J}1ZMhJMyXY2J21^RxY_lwg9W z8Ys2|8js<|nOuwJ7D$HD?2VVJ2zEs~vxUmHX-D2R)vUPaGN1M8^ShZy?zd48}R zvU@ie*b|qyB!52EwKCadQiwaB)3C=%zB0RPz4FZ>SIyyuYc03dMh9MtfUeetz}}v8 zg?TSxtT3K`PAj@&%wg;}&2~4!KDsQ;e!;li&GznF191U`F>_y08|~V!r4>OOy=qAt z_)sFrN$U+2nu?&pu(f>@*xf+~TJ4G4MnmB`&9?_%&_O`QDKaeeyNu`~zlQMPLr;rq zKE7G0WZD#QRA_AyR_4ymAMFd0pmXMRrvzDIz~dHR7)2h?v!FRI-u3HN|8E1jxpNqy zHFEmDGL09c)Q11@s&NawDf}pl05JTIED$mWQSQinL-scnka5f)m&vvmCpL3N98c3`Y34FUk^^e>iKHGO z2FUfVlz#~UiRbL}f`#;QXcvp@?xX)}VTAY>=jLjp5Pg&ydG2?y2Icm?z=ZcQN+IbH z{R^unGQd6=T<4d?BmCWv;tmsk2@W3#Nt~2xE6J*O@InLSgu6^ zsgP414b>?eauiY}hQCjTi?P3uL;#WgE)?7n{tE&PBskFmx$d^YG0xyi)OtH~FX}Dz?Ojb+k*Sv`?PZlF+EP#xe4r)U|x0q{^x-E~Cj6 ziIf+s*;*QwBt(vdo4VS6@jdS}dR03&x2HxLrBP9E&;||0g}tcs+n`#F@@25Gw-r*J zf0^K%9w5qIn^l=spO&_KxHhp&_iA3r+p;Os%5u&lMTyWe(+fOX*F82ocjT9T?vt`9 zVDdgIBvQfMh`ADVc$b|tj=93~P!C)}GoVmo*)NznS)4P_T>5omfF6pvo#|}>ZSZ!VX_XXmr?M> zOsSVO^x~GWbU#^W#`=Bev$D2D*h>`L$#k;%7_-eldgC!Y9F zKww51iHE(!=3Y^&gdd z7uEC$DGVRS@#-Yy@=b~>L6K6C#ZKK&IhMXfw@aPLj^S>+bZW$0W9DueY zh9Mdalt1zQpXGql-+xQaX^@Vp}i%36fhG$lA^%eK~;=!D z+c@K#zZg=h&pH`$X-ZsmF4TVHW-YBsUrTtpm#2%RVC?j1b)T#KdrJLs1@~;5oR;*N z$Q_uvVZ(qPc!1kBuFUFfmLTKqma}xBW~HVGHS^dub2XJaRaqPl%3LX5{iNe_5&#yO zoBrMGLsY%~Dm`Q%xZr1Eb?LzPc5NQihYxj_g-O+XNl`s7p@2>>?bR{Ci;v5?N_h#h z&pNpJoZaB(fX&@MF5d`q>-q+Gw5`pAyS`1@&OY65yw{j%DN%w>(`y!%#oK@Fw~@xN zmK~k-&rt+j?8Nw5JTjTA0eI%YlkzK&N|^~+Fzu{Or!TMStI`_8L8JJ?Az<z<=rP+Py|H+JhI_jcr(z5k^7JlUMfoe^1Z zx(d*S^Y&nb8qUiA|DR9i0-LmM)8zyTbAMJh(~>tc&!p3m_gib&hUT-v*_q`%Wh@8Q zqH#+p=Y+F{8EN6Fb2=@y`(c^UArvpxa>f>Kd%O!*si;uRgK*TZ5uBqTU=%umIUw-Mp#jJhr$>{VB;BWVR&V1YU zztKv8DWSv*?!oyQrs#tFp!O>rpVRp`O2c;dt>RLM<9}?`3fOPs6=@ut#*~zl-0+N} zB!yX(CO2_&*LqE&z*bu=V(b(g&X$v&_+$LxHnbuj4y6XTa)8}Tdq(U!0yn4reHycb zf!an5Gc!I-;@aHK&gjAN)Rf*Jz<;mG!oPjvRCXN9{*TR)MGINg2m*+(cK73AoViss zuHLulWIE`AQR{D9>0Ab@3oB^;7&j|KP|)~2vS5n`9SUrwf2`y-JegsJ6kzDL9S6*5 zD2u=3J=dM4N1h8b<#^1%0N;Qr0U|HDe~Kc*GI1|G(ayZi`z7p`nFMcOGjqJ4ina=e zn$4F}N9bpEHYV?TUdvb!%DG~J0`}s74~?$xXtk>fajhR#cpn}38_+1=E(*6}PZB&x z6z0`p2;P!AsNzs&{Tas`)}=hmu>!y7tmVsxb*(4+4+W+qE$Q+xlO=Jh;&U3XuJT9g6sXIj2( zt;DMo*mZUoc%94}P|HlC6MVnlt>$b~%r7Xg9qYt0LbP><3!P6sAB&9<)15ZP`&U`8 zPXa`~wX%qj7#Okbzk>8CUdFKk?qoigMagfRN}Oq7@fqp{eiU{t&Fz*jSYG&1V?@)= znAEXNxGJL#eqeDB&AKw;o~bLsl*nuqJWgAf-PbkSAEK}sw;IWO6=CwhOkD8vb~~by zj1P}(no#+Q1`?8dZoP%+sxyu9ADPww_5~GC9!Dk+J&t-EIb{oce>LqiME4n|d5Gcm1rAK6a`tjVYua_^`o$8MWfKr1fJD{-^+$gY~`omm1;>xhA-q#qb zfxSULHDXMEl<-~Yd`L4~ezS4i3{*DWU;L%rh}_Jpl9u{9I(|%UTT>kl%i`&Z#a?@D z+5Ke$tF9K#pV{MjfGBroQv;XO!HX7Kfip|xz?|DXii6!LL%jYb9?t^ZdyeAtWM}A9TpG}C(Qh!idTBSwdmZb>n?bNb1hcZ-4aA@!#>#H(O{+_ep$c6k~C09_# z&+*~V`5hXRB$Gt05RHRHyqbU&uHrM)pK?zmaF${Cs&4(x$a^`9(j4$Z&@|V zP5&If(~%)mhPImrtc9NsZ*ZZgyBDa}zX!7PTP7GF=QlYH`%f8i4{@x(yXWN-MK6h< zmvj5J5%!Hv9g7FKR(}k>&0s9SHYf< zBf`7c>pGhgGwZ9e6q57cdLs?GA4a72F|bhPYy z;DFdD4vB! zHJq&*M`av2t<;bl&*5IqU$SSzgvAXpI%`v2P9ABJ^QO;*l!bx2xOm^T$|JH zWav1MPy*9QU0XyGTFZc24NvQ5n#G14_vV(3WWla_tTZkW6)fyDHgk$!~QD z3MyEVs(UQg2VO*RVFIj@pNKP=M~&FS+HZEfv$-&Z*;Oo@%LZ=gja^tB}Hp-mu1k>rk+;W`nqGyhX9Zq8`a97#-Eto5+1X56}IoNnxLOJoqGEgBuQS~Ve zejfwuPEMACX*5yHc)JjvKa}?A3KV z$t+7ZmvIdT9cRn!Z7p{{?^-vg>Knp6H$~d?b1ZuCtOqLt9(HTUa&GOfZmk-`UGX2i zweQS?)@wSp;gKjX>Lzh`cp9!C5DFE+d`DZaovF|i9SXW#}WKoOp!3AbWs9*teB zf7~%DxY_yFHTyrmW1*dKbNW4w3HKjy;jYsk8UM#J{j(DflKE#+j}9bsHpr6$KK8#I zDUtq)pIYE@pJnOR{Yu-naUqT-u^ebQ^Pi@0&tWX|H>AQ}kJcJwsAJlTqtFp}sqI@TP_ zwfZ09T!R|YN4g-ZvriEk6YrZV_E9{iadP*ZtnZ&V9TPIlJcI|zG?PR2QuZ+Hi`8>j z$*NHoev|0s=dpQdurc;h4}8*YV#Jc*I96`0ri5=LH>lcVm=$gBczxgVDw?ej1KMOu z>80|2+=`lO^IjPw7gw_=a#;~dkFdn#O{NuW=P^g65C2R<0Wryke7`O_t-6ILHrb6!YJ_37pbQ+2y4 z{2bt4uB$7G7G#_4r@50%qlv|(rYc|!zZQwP^@XP|>(<*dm; zR0=Ub->R29mr}Gdb>9f#QYG~3TJo+6v-_e_1GLN~mvzMom+Nh4k3WGH6J-4Om7L47 zQe-{Bhsn=-*G!<~ozL~t(&8FbKz2elNO@Tpkcb_^cvd>Ig?`Z$KW`CgrUpu8k18mU zx1W>ut@kKlqgQ&}wQ`?>V9eL0+Ph)2UtqQE;<1rWtQlv6wua-}KsM^lE0Ry88Rtpo z`g)0GIvZSEVr3eW8G#oYjTg&_Ou9+p@In~lU!nlQBQ}&s|LdQ}n9SqN|NELv|1SkU zhI@RTHsX*xvh)AJ%|U-%ghyBTFI!{%<(bDQrby8d8^a^(Bf_2dKY23$kLwvrXG`jz z=+5IfX5amPK8BW%{(qxL|IdIER3Pj>NdN~24%A~n>hHBQf9lx_Pex1K!hve;;Y?iu zfg0{eHO*-|nF^L_{u*i(3maUP=4wk^?yUJU|I3+EVJku}BNZ>gzA&qR&sQU54CW>} zUT`{>~+|-R6UHz5RQpib9#+k1Tbm3uhV!K3n_ovAsBjsI1Sr=F9yyfE zeuvWR1Tu;y#3Zub=N+`xfD>vw5Hn3pVpZzpA426^cZG57w?C)X#twNEDP2r zN=X*9-trsM)ocDG0q%?VcfDf?q0>F*4^^J`eO_Y8IKpQ-T2eYvzm~DFH~4Ya z-vt^R#WhknWLtf1(hrtq<%g?ux)Npi`rjn5@69MM z^{X0hESNf++8MrYyD`^czr%R{oUc#-;rmlSTMuR+Z>hL%1DrA$Jv~||KKBW&;phaR zqg`3GQuePb#c+`Yoe)}Y*s?23lzDY%QA4~57w*zB^;K z1$jt!1X-sivFEX&xn=(rG*?lB8SJK;v}^94dkLf2SOV`PecJXM1=mW#B#@#5HkcvL z-vBd&Pz(`4GH8e!0}j%bFas=iUSm5;Y!O;!#&rbZy8%sbxlyPk*Op+b78pGB&w=iS|K}6Js$DKh>;5zfWk7^0)R5SZYyC!VtxerxWhD`~7 z$@9!(gv1PBAOOVM^7uJ|xe$eJCn`ix*^{R%hGT*7*1G0hl~)o4|1P487#epFFomNL zo5W6Zq*80Rrh;TNXY_U8Dj+d z-=nXs@t->nH8MLdJuU+~gu@w&Bb5IUy$C(;A|?vie>V!7qm}S0Bm~zBsCFa5QQQVR zB;X1nhbJG>AP23!1YcrVzyV4}VpoH}pGAT!SkJIRKBx%ZAo{q{RHeV)Zz*r}@&FDn zd}XOSkln(*C<8kN7$D5jT!Dhs`GZ4BZ!hN0b;GS1;=bJsJ(wNGf?l&b9?ZSs_d|+rarnHzU;9ed&5w2q7ON$gcpCmIW9Qc# z(P!ES`&UEhxozHiQImn$R3WbP&w~4)<_?;WeWfptYwkh>?L$GYy`$RpiIa7~1}q*Q znUEn90Sq1ZHAQ`L<_%SH^i`ianrwRTKfNJ{kbL#EvcA`3a!Z9{uSO4ZN4-poUf#G| z)mTweGiGH=Qcgg|gpgP&tx{uTOJj`Z<8yOmz7;zJ&(n9 z%50FRdnRYHa_RAHUf3lZu5(Sz=hJ=d9Mby!qZlM8h4Ue%I z=qRr|#Zg#tCXNOtSiqe#@?2x(FC<`j{Ob#R{ae6KFZdU z{zjEPF&e0it_dfRx&b{6kcSQhJuRdzw(A+?Y#+i)qI0D8L$RM4@Jec&@~CLd?e0d)OMUfmnyVFjxR4%(m!YAyN)%w zY}JE*c9Ww!x?6Mb+P)@*Bi9H@)-$MC?!;{s*W@TBJDbtRQC8!blH@i;q?K4l_Vj_+18@-T$cK@=gaMW_Malv5h&5EP}C<3Q3mmMb+lrPR&H_YsFBB zhS~A>ig2erH(xdI#{IiSvw_MsXSXJ^`|oFr+LI9QB>!_cLvycBU1NzKjkOI^pL`CR zF8a!M2=R<__(En^)DrS)?NGP{Qng@)qj)@h-|ch@DgNrQAhX^Ha{5H%rTnB=lmO!# zE!b~IPEv9;lfA8-tVUw~Bc$RI+a89%8OuHzcKLKJ6?hq%oIw9NLP8d+ex~%fxITTq zp2U__?gj-9N=@y&ybW8Hpay|ooOKSC>4@VGB7i`*+iIS1gCCg*ddPNgIs8COxr>d z!+R?%s)nH-ZdNZG^4^GyVI?2xl&O zK})cCcpa#I$F2T;1ka&Tqmpgkd?~N4PJL0WO_b&%8taAD zf(a%sHsxSeie(3hb5l()$PNyedSQDr=64wr($L9XRT)CCU@1#(iIi1jxrfJ%6FQKD*?>^ah{#H1ti|k zu$3Y^vTkgu>}mglw0FCCOFvE)F?Sr363SxNq^f`3w6JL72{LoUQ+$V7DSFKNMwWBJxGB!q$aT$5R(j_HS?PPRgQv77NmMF}gc5viRd$`D=EHif%!C4A(Ci zY{C2I-DWLqAa6%oPVwCxOD1pjrjKSUZDkclrs3c^1%<;fZ#@OpoefME3j@uI@a?m` zi7bLm^gUNU9HQDh^Qm<+zl3YTMxQjU2DQbnTKC6o6;FI3M^4scO|>h4@V#j-pN2PMq!|e^>`+)m1Wz~n+A;4} zkJ(SI<2v~Hn@2_djx{OC;m%%TnjI4JWeS4s3neb?`VE85`$qJy1uTvIK$)XF`eMv0 zQx@4Qq82FI09%t{^B3tu^L5Tojx%b`B7{osj2m&j2{8cIW!Pq!Y|n_Cy)1{Nle98H z=9h7F$IG7>;lB9wL5raWb3Cdpg`Ai738!qE7O$_HqmNho;njK0EGs=`^OWkaCQ-`g z48dVu_aHu{6FL_;aK@X`cMhlWHXzCwCeE`6k152~lvYZ$3NuuL^fj?pg0GV8NwGcY z-}58Lh^eEUjc~`QbJ-CaDO}Ysw*RDt6sc!*)Ht2N4<;TK6?4a|^{p$M61l24)}k89P_Gn%SxFmqQtWCqfh78;}oBnlK_<;qL^p3hgpspRe~! ze^#XWL@)AtdlwV=M5L-oP_Q)-%du=5L=pSwD5GD3OvFSyD=JwtNIzk(&#j`cuSDs| zobQ^<*a?K0D}Yb&)mCkTr;p!$}kHME8Cmxy3R9K~SvEcQIUu z58(>dgY=YoY1((C9=B&!%Q^?uEUn95)6oFj7}{b92;5|o*z;Wt=nFMe8Ul_s=QC7r3gnjL3sy=IxEw-?(IDE^CVp0ZCI)tp{(+z{C z&v4eI4xf2us9^1QfnyN#z@mGTI_Kn_!AvaB=?;3mH)U5MmT5|EF z!T=58icsvX-nZ&QzZE1K2S1pb@3C6mWM)A732iit(1#JI{EGfqY2s!lOmoBIvoxaK zr#y<#@A$cXLDNd*mH@|B=uWd-T=MN$Pnr7&P-?7mm=os{0 z3_Mw!NCE_1h|s+BzgWLH;zNU=K^O_-sKDi@JDLcFYP3m+-nPr+C{Po3&*%MvS8in) zg$fb;PcT>szy+aplEkJ6B2V(i&u`mVPCxaRB8dR(h_b%D_M}CH{E*vCM4cQQL!r!2 zD7%Crs=rtMKnRwUD-gK0E`Xh~^BSYVI;Fke))eRtV}X)r`n|jr@qE&GXGz8t5$6Vd zDVa8H41<>XfD68|?)aQQ+afJ4P|6A>eG9yzpP;~b<5F@zIdFywh>40(cY`Q6qoqi&j?T_9Nd)18ZvEf<5i{N6q!&VC3yk=L z_~{)#w>*KroGFU!he{Bl+n#n=Y7e7#H9bYXhM$mx|F}28BKGT*#2#j|ZfIpyHHP?% zCGC>on^0&}K1t86LcF);?*m6zn}nSBms7nby(B=fprotIwsLLiGTHE4}!@ItKc*x`9L;v6iu`Dw(!kKCdR z9|XmBqpsy<92dcewYG%M?y@-EOhorYlLZ%#Ab002xMaS?lDK3#2eM1}9IJZzd_#IR zX@mO#k-5G@mPzGrPVw{ksKV<6`Jts*Lq!N_?KahDZjxVooe5<87l^8m z<%_AifBC%L19|bIeR3g0I173ou_Dl%9EvETPD^Rs(!Bk_>L&Hb=V28Wxa@<{Zrp4F z?efCiG<_{W_-bZL9^vB#<-zbs@QoG|B1>NuDrD_9$+i%S0Y#{k)q8Xe8z&Snk9uj= z_b+4>EWIX2pPxc#f))zjEWRM8()&lGc?4;hN>wEy*`Rc{ATvJ^u{ zrH^mE?&jpLcA&ja07Wz27qQQSqN5OEXpqD7Ql^}x+M-kvg4rPQ;zZyAWsy)kUf>Wj-C_)a6dRAHS`c=0g0^=TCg`4+b`zVA3ll%6{cHGwLvMqm zT=CPDryvtFm-@ubh=sC@H^0*}gy%h@$)Zw<;I9G-;S?Q#AU)f%52J)O2?r5oZrR*n zzKLm*{)w5XIAK;{t||01Vw+ypDwHhbdrnp(E4r!?h13qXfQ!=#Lj)3hc|u)dCM^8c znDYt@#)$BEf68$5RNUcm?^o+nh#DVjx5=j<2eDNkD(WA_bvCDuSevL@IeXkU2>H4NyKD|kXhT10} zmR(<@Ek!tzoaw!cki_&x5h~1ENK&kr_YRv`-BpR?Z1Kt4AAhoSChadR7x1-6O9(Xb z@ym`fwLyeXICiYRFYcp~N<#tLVq`&{Ah4pbXNy`!-}*M0S_P1_Ou7ofmMJ?QGSBZ0 zd|j2(}NvWn)4AsufWTXHi$5Et@7@Ed-cKIl_GohvygEUu00-@BNVI>R#Gn* zTlRIwi8z(tD4EqsrSE_>+jZZ7S6ji&!z=YI-B?Qukq9P&?hoX%0X$T_f9HSNQv893 z43QfH(Pswp(MIsZm@~QS&hro_qJ^Fu*SvOy*Nv)dvJ?`qtpA!ibkWyWR8)WZ`G=?I zzB?%cSga~91PMMrZv?%sANytqID+Bw{!!v@pjZd1F~28r!z1cbjCQnyzq?Q39tu}+ ziSVv3sbUb|e-gO^U*C7B1@oe?W-`8!=nw|2470qi*Fk0$rY`2(NTYYaQ*52H7OMFqPO3BB;%8HnLr% zh5=2WDSTqzA(k)p8z!}dUL(eIO^psADB?Ch384VgHig}MQauzyv3H;3x#CXZS7G1< z-jMD<{&ZW1PcNt!H&`Mm3rvwTElEfReZUE*C$H8rMaL$n2!KO^3_nKBI4M+|{;c-h zD<@~L0(AKsT4K)FcTm?9+&~HY!@NEX1l%;xIm!0htWd^;;#t#Uijs0Eq(}0H1NKPX zh7{CuCsl=opL^3u$uc5iXZNN1NcS&#KlhT7;SiG5@Nxf&ip6_QQCh-eQ&v?{GWKro z-77P!=g)f%3)VSq;`Mw*=J*w2MsHY?eOkhE_JhA|9MYfM+c6%)xAmuT#D0v{E>aV6 z6U5OJ^wQ_+%(y|QWk|b6)yz(W%5eTz9mvqET$giGCR89F9!WF_qP>|7rh$!_%#1BH z(?+JIW{+odidk8(b!i{;Wi6B#F;7lw7#nY{`@l-Cqe9KFbL2?GxYcl8;7dnXJ2hR99zXW^Wu za_|TO9^mZZSIhDY?+8-R+H{&nwc8gC(H`umFBGq22yPcJr>fo$V_Q0hB>XNIa=_Hh zB+L|Ws2Oobdz*F0Bhug=o zxK?HCcvSLqJ`159q=Fe1Vs8B70vQzUyVuvUA|JbdRosm>uk(yWvXYM+f6@@7oQxCu zao7a@=>66vL&mGY3EUYJ;LF_;N@!F()_`tJoeG0J`*_tawc2xgb&8gDd>i$#yWcDL z5(glTWqr4RmPTSkyX6LG<}iptH(ax(&s{qfuen^5T~jx=B36hI^J$nNkM3i>9@?4# zO|hpUmP?;_b8@wwTz`-O@`YZ~=MO6aw$4&FUxd2FL9}~2f-Eh>n6NDFw$KND4@la?W#z;Q}R10yj9^gNrm* z#hbU->KhD27+ja@RWBxM8?IU*Mz-t@f8((whB%P6S#J!jJ-?ev=dKGE@oEefHi@Oyb3Ij$(oG{sg?f8hl%l3jVt@Nb#EG zD4IlGpYXx@spy>okm`diJn=y1PDL4L`@=zkRx0zQn+`4b`H?6bFQrsF7*IL*&G5^> zY;@~Fcmlf4ogW6&MG7Zj%;e41ipk+tDjX(iQDR^-- zcs(_!1G@EKE+<2jmJMWp(Da<6|1jk&Hv7wEYK8A1;?n`0p-vsoIFyY#I-z^>zWCc; zcKrtL7)NyFPQg>@K?lLX41bE`A)lF`S&vpl$E)gJxzipYmiL{d4iHzB;&w&Gxob;T zuk%!rLiV#U&HGyRtW>j5CmxF&0Z4t_=j&2`b&Xx6?ih=B&Jtp)pDZWZ_o$G{GsU7< zXUH($FDEdKs%qO$d~#S(S-_yb3Gu*;_1wOQ4YFJL;MPNkT_N@6|H7}zvoUo6oL3?e z|DgMq$#_k6DVE4vAYaH|v`0jx34Ma!0A11`!Iu~aq^b`{CglEa0sOySIIiz-zWsA> z=lhN<@JDicau{`ph2Y^W-ToYqfEG%yh z15EwgIvnF-`+hFfAO8Ndw?h3$wt55*%rOy5^UH@cFS8EEKzdO+-@AlTvOjg7HiJBZ zykh*J5TG;O^}%s@imFcRuXU zk&(sIzb1nOs~c|GsT>iz>#Xl+f^q(f65|MfPYyl=HS=*aUFTv?RsKkv_lW-W&?Pp5 z(uG4l)yw1$N&+29f%Fwm8<(S>cPs8Rt_0nW7?s_c7DCrg3+)~Knr`wY6{0(2XE1At6XhHw+*kB`V$BE!{&%NC`;SAPCakDF`Sa3?SV-v~X)yGdGC&KK*} zul+riIuw^}mN!reCvS-!IItmse4ghv;Iyu8NL~5=AbqtIvcI2?4(9;+UN=vt?yjf zEdiS&5D&6>Mc-vck!;<->Pv@oi_V4kF1T& z@e%!Jc0TX!@#p^2iMRGly)oO~G-UAY#F_GOq)W~*ky-aWC$;diVu64s<7h?3?DIKM zz;^+T)2HO(J$S&{zclz}Cnow`sTdU&*ss|;OvL1MB=$kU*3Ym{TDRT~s^M28*0W|1 z!@KWw*p`hS-s3lrJOmIDUjf{DlmAtLf8wPKE6Q=g7L`A(_(V;Rr(Wwt%+ou@gV^rn z_~u6BpD4$+k52I|Wg7`|XrzwBS6y|uSH-@FT4*bnCRyt!n3DfUG4_l}4K=zaJnU)A5C6eDX>+C1tIejfRJxv^XX`h!b;~Cs%Dr)02M#QQoK=-c z191R29GC6FN7K9^ks@m|9`DFF1765|P8`w@pC4?Tz^(r@As4>Fh~zzZ>(3$w1Oy5f zjJ+F`&(sWw08TE=9v(kZJrG*PEeo%6RJx=jzeRTypu#W3uv&XjH!Xr+1#~sT`ZR_G zd=KF!C#XN0n%DOhoyvu@u7f`V)MDLCgY5Jy>lvI80!7KkvaMjTw*vgXVx?&tJq@CcGAr_CV#~n#!UU=bd0dLga1_z(Z7HJ zN4^ABPa2*+KX7Y3ycswQRULiQuW@0*TC3=}K-|rIsKp19cntIVRtxMQD)E1Xg&-e- z8oc`6b{u?WGE+Zb`*1=@XEIC-&iy9~xI&t~nQYqhlW86O!;9KsjEl%jrkk}74F5x; zhk=+Q5he6aI~vMNEUM2|MX6ya1Gdu{odhdDauqjE&}v>nikJPqL*&S5-cNWDfixtL zC~hNuJ%SV5CrB8dCO^N~EI$&(1Cju6blv{a@7b@C_jskh`?gT+5*;7;Pd6Z!aDsZw zaNkCh*SAuI$3sZ5e;=q=h~2PVq}bmVhA_CHNmTgUewU1nbe|Cn?*%34=Z8YYF@U^4 zxX1OX@t6-EtB1Yr^k_;YFg3cR3Z5Yc{`8bghHX3U1Ye1_jLoruD_ny| zZoU>hw?57#FJ|D5C0ZsowSe*qyl-rIVC6SSsX!{z^%}zpgy(jwVj;1unTiRzr?T}} z(pKuY);eq3+OTy~LcMQTFw~tCSUp^qi{7%lp&9to*kI`T10*AF8i8$gX=(2(-GAS_ z|5rzMVdNwyj->VG*F{5*N-7a_EcQMjqD6sF^xn>wZ0FKnHrOT(VEru|_~bEe?C=mh zzN}6Ua#L%xHdyNh10cuU>!?nFHrAh2&2t~`1`o&4cHTy|Ako6B)u}Qe?C|rg3Q&ZVk#-CBM6u>p{h0) z$2S-~$@%3!KGUUpepBr{a4OV)Jd`~)IZI=RVRi4kC^hyCcvJG=On41n+R8OJ5Lt91I3-@uuwII&MpnJ1|o*|R|!bJ4X{PVp2-s5})N0cDQf9p?P z7B({y*BisM`p>DF5>xqqia+;%yR>GgqRA?H2k0 zHYlz~t$TYfR^3W|WOl}Zc!*d8@Vy*Cpg=2)z-%%blP@SxNLAFwe# z-o6k`3E#*YzrFQ$v>PEutQs*KhKHj4b!8BVwU~teTh@^ylP7mf}Ehxp+gaRduYIP|*X;yCi3SJ|_o!Kezz1FV5OhhU;;)uYy(h(O?jO{>sp%VVudTd^ykxW z-Z#E_KJW8me1=XkC>fe%D;oLZHR^6mg9Wx+8dq*M)4I!DN5_+uUP!w#>YUreyCd$6 z8D72Wcfr!s#o61)P4E@wH={oLiVRV6zM&xXpggOJaEXn@g`Qg<|Nf`JuYQq%h3myCa4b(tW6Y5PLay zOSw%$w!fi>d{c+wYIi7Z1w?ENCL)y!S@?I)WU(wQ&?vyTCgbGtUgt(zo0e`^!WN^r zIn7UjP#T&8?_w&xjdcB7q6u!T-x>WT;$?2W-6JcItgfJ{t)1Gm1wS*_AO6ZCWNM0D zv?V}XmP!UM|CngcFVS|?T|PM0CXMnCPALWIotdAAn;t@bi0u8?W~NoJDAg7y{wMe* z!Q?{p;M4QGm#D7MB`PiItcQD^2E8|(qMB4{*-6yu^yRlt#NTr9!ETtI)F_W8O@xhU zsZx_GL4dH#m>)WObLOa*_AOr-9-1{n#M`m8u>~!AFhv${kQl;W1Qlm|`}lU8V=DQ& zmNZgqnVEw_JlFavnoeB5ot2H6Co*~e;YG#mIdh!L3b^%B8FN3{k?^7=f87kCz-)yi z?BhxD&`43@OzWiD9!Qsh+6G;Lc!NV-x|P9%A)FiTQ4L)?;AXr zQ)svyObr&CNUJ+8o>%atyeGUDE zUT9Z~Wwq-!W$fEjq|9Lx0UZ}tb4*0fW81ag8Q&4NbMP@Rxvu)4chO~ASYIi^@Fv?+ zn`NoVzF*!5Nw^tM`|pt=CeaR&w4YS)zG$WaA;7ZBP;t5?J>}vDLTNY%&L^v*HJl6$ zu3J#?SF7@~30*C`zgt;*n7-<7^gjgqF+P6NB<#%7JldmWWjJT6_6(dUqZfwLQnEYL zngq7rM#DRKF2(PB9}U=uM4tIhV~0trUo|E!5=UB)jduf?q*sI!gl!MtC$dC7?qlk9 z5$H8_JHD#vQ*g&(C|=m=^B4S2+N|8V@v6&_am}9H=PFJP5{COJzZ*KN>aM1?TPON! z0B^y=Mx+`(w+emxS%W(1Xa!vA$EZBr2c=BshDAHvrh8{7$k4%l`b_!xPSOVw@;&9# z2}a?M4Ol{t{@kfAc;B@`UDQ34N@nDJU{|~QmX6!easwiOIzB?nswS(r+#ocB%+?=% zvoeEk>b@7_{@5r~!a`6T9<8P#L;<>KOJY-x`k8X1OV603Q3mQGH0o$Rx#eW4q&`gH zl>3xSQ0?MK-c4kQgA&<&KVbbOC8#*N3#qA(XB&DNwwlc}X1^W}&a5^lddXC8%y6ys zeymsFBJ)z~txRShzm8WT7J~nxmK<)se!Af%=|;62SJ_*mrtpyJPl!?$9pwwyOX45P z>9%TrWyFJyIo=|B+p2%cF1BcVCoMuN`C4H11zL>;)3yww{>52h$nDTPRX4vgHHZ?w z_X8exf;u@qRZ`Upug8h!o*-&0N#l?zeg-qE;~X38M8pROtBw(dMqOF(%ZK1XmXVau zxJ*~OH~TEC)iq&OMkZ!4Tw_XVP`Cu=c=&-CSOM(P?N z=nvtxp*~z-b@Fgg;`$$}0k>BYxmgKWd|dzvAvRng?Vple%x_wV;QI(mkb?mUeA=T& z|IPc87{tWfdEqZHwvg-7FJxYFSL^iF=^BH}ZApvE=%w$V<3+xn~=0`)pFq2>gfKV=g>gx7whzyrmg zAG7xGWgp$ls=AURI7AMn*+W~3C1$Rc;;4EA(sf<%CHzaxXIN(V+dXpAuO1M>L0cN_ zs^Hz%8yCl5!AEde$!s^uEL4EtiZ%x#~jUA|8Km>3GrO}F<;FZA4>;0BuZw!RxS{9lA64{)>J=%{4 z){PFHR1=yL-zzu`I$u$oYV!mp6aw0o3JZP+r&g&;5Cc8CY-9j>@%#5911l21rQ#;| zps0V6)Gws=_KYf}x2wWFW%lzw{P`Q>sjj{p-j#nvpxyEI;!5)@}&Bp9zM&)NTpaf0|BxcHupGP}NF>m#3T7vhr|>*)|eJ zvuDEeXNq`&^2`KjXUo^h{#K}Lt$MFfEtLbW_fR(rPf5KVg94O$Kala>b)x1r(rm7E z!Jv2CQf|5V#-w@L`_o6zNps@Q5k_swLHntr z&vk2s^OGMxS7S`!{%rz~pDb2E9k{AI?=}`Zuh;k%qJH#6EtXWSwY9a2-`*%2_VrN! zOEUyWe~gEiUNKOD&Ou|eo6zJ`_c|$N3~#nd=i0myWZ*W!_2y@bsr1c$)sn3H)J6jT z*c*iV5I)Y)xujdAel^4kV>*1~-8xNbYe@h&?w?V`ED5~8PsSp@k7Mb3bxlau!%a(x zzw`7?nvjC`MGefQDRZ))1z{^m4xg84{&_etJ(%f>24&y%R|M~J7A?10Bv(G__r}(B zIE>ZyJ{sLYhYsHlUiED=!f+;k8E^7R3{5K0Ms6rin4`3pxuT-;0EYqY&3LbaCg@9& ze3;KqQoksfp5!`TRdu%3#>?;)7)6#(y!CWOCMjNX1-b-~g`%;{nH@jUW^y_#e} zGWxc7^=1bFp8y2;?S1L)PGfm?E6|!ku5TCr_5!`rmYNNXm-OEKs z%7>-$19OYJa~iqT-=^YrP=W2;361HFVBcq@WNt(?ucxE5C9gK7@c(LB?*TmG9eTeR zOG?no0rr4hx`{xv`ymP1;w5yDEq1YS6AS6`>-z~7J@h}ro2IM^ES!qM(bXb~h;CvY zxH^g}aC3zn`o9gHpxB^Ac1NDxse3xwKVe)V80mC@D)f7cz7r>*1bfLKR z?Oc+LrY^f+B%irFTjbRHYRa~Q|D{;PaESdW3IHbe^A$ix$Xirb_X(QC+aB2`wf-X! zk#y$b*}1LAPJEmqym|C9Ow&NhyUf+QyyZY)=i)Fxb z%{bmayYNjQpicu1j!)yW#}Nu}>7|St6sIh>uhIT*!1Rz1WC1iaQdfToAJ|?S9ZbLNI|7r3g3yGuzwjL^Q7Uf^~QEFc{gH)sZ?>}+nWR<+nq^aQ^_#d5;Zy8|V zj^`V8-&3J@s977M=!X;tpt$ATMgB+9=SO=4N++TNNa1QCs`4 zPxo2t#&%jgc4l7o5W-I)k3Iwz)rjz*QY~|Y056V${WOyd#SJ?9t6KV4Vv?U%E~K?y zoOM%iC*Au`!x($}!JBUH-R^I!KJB__h9%Fef3rkX9gm<=`~(d2Z_B%qV*FB))YGX&m0ggOYj z?}XnroC#<;;O{-L$3$FqczuVA^#t?nZg5?a1LDd-7FtZ%Lic=z&aGEA8f%9Gp5h_& zC%S*XmbYmWHWBqGj|Rrh;0CEHyM|B1WGcl^VO`97k{BJhU_V*bWkbW8rSK0YY!3dq z;i{SocaZRzchLFMATlpSpB;i_Qp+I&8bUu{MGHU*G?U?~VbOeS>s$5s+o(2~i?kSv z-ivSGhR3k_sBjwlVd`eNZq(hS@CSz0_@(vlCR>T%rR{{v>aDqQ-!N~UIO0S|ZY2TG zfme_8I>BjB=7_XOy7+4OLz^T=essLS=WKetKx8N@(&aK7{(2=Hd%5ZKB#mqyc30!2 zrl*T##hyQeXx}F3)WTq&>wgE#UWHX+;dqh&OqnA>ANSX#6Z;ZfzdV*AF z8(W{fgA_8pw)Y!vc}5p>bUK~2!}}WzF`b9cEqXbYlb~hj0M?6Q?{2=RX~;a<^!>u3 zNUpCoe9Qx!mrDk>Ru|hAM;AN2h(D|CzpUE8jpu#Fws%+d`JCIG^j$;RU8PEtp5V07 zB;ox~*@Hax5vqNS%h=|%nyf8x=Jtk{xHWXR91mHzU<4{2pf$LV`1@{W?x&-=8%2ln z#=!dTH^rN-VZjU>u1mQIUzGzvl}3@DcTr{rP`V?`zwvkC5K9xhHZWr(VYCRh4mTcV zEYotee%A87ViyGZdq+UtXg7oMbRI1(Z6(371=1s?1cb!1jnAKDa;9H?J-xhOYdAYT ztw1cF`MMm6Y^>L#IkcvC-VbFC@UR@ycG(_^|ZAZGCCcigg|XAV($;an-FO5emB@+Q9x~N*$UG518+H7F>Uy9)kBx~K zpY*s=IG)a1?-a2gRjK!B#Xzj^$twrs6(2e3ZHm5`cb_C;`c(=wK$;E1iPVBG7z{r2 zHjArw{+OK2>Elb4;;+aBvrILF?8mf|mWyzZXu_&B{PQpnIi3Reh#cRmqfx)%v{uT9 zNl~|#?M=jR$mb`n{sh7cy_KGrV#4m5Z^kAQ%iS-xk%)=mncZEPnp7{Uq4Q}BmUQ#h zKi&#o9mw$*uHC#n05xxg=l3S8=InShjg>;tSju4S4RK7z-@ns6IbKD4E-I>Adc+}t ztSAA)cOUyn4->$Dp63&0;uLVYP9txxG3Z>$c~wwr!3axu$n{%KV*~PX!KA({XNgXXUNhElTs8oBR>FHiYTNkLU~M zg}52Ry!b119npRVKUIw>uE~oUz+j4j`bHH9)SHu&rNcP*ouQNpiBER1Y-qX1d2Z0A zrVv=HKPI+LLc2x#wQ5_-McCG~&-Gr>nfUCE4+iQn;gYyn13sqT(WPbAnkHckhZC!u z|AA2X@5-UF1=kC}@L0H3C^b(|Qsfaa>1*bQqPV!q3xn{i49Z8TZRgkBo{{a0fJL}r z67r*=3v)8kY5sJQsK5tWFQo4*S#mg|2k1XVdUCYai}Y_e{^9}N<%cC?9aDP~eSy}6 zfUuPij%`i8YyI4xcuaG1UCe+>$5s)DUC+Voiy~jZZ{*Qkcg3)p3N!+-tQ0XSUTwR_ z1i0KxKOfr-A1s%RU45dT!e-dhbIAVa-61JcX!-n()ztDndj3K@9)jV*Y*c@;ofgKL zef42UeCBQ4O8Y43CrhbIJoRJ?@t?~VHgaK}KqW#byhs#_;$B7OE%e0*+iIT6D@MjL z^IcK#`NNQQvd1t2I7p>-M^r@ocDJ;D;;m*VQ)n+^RX`}yVOMdzgIfmG!bONX+MiNl zq73RkKdI;8@#nwuu=GFw*5r1}4~5D?IPu*B!A6&~Kw(FVz`hqH3E=%{;Mi?`HtG_a`r-%o>=J4nbK$I`%C z8(#q;fE0g>Kh^@u23`cz3*BS_s!MtRdInr+_kWdXJ_UAQ{1pWROyC0hAO1A){%32( zBq|zoGYk-EDEPmM|39JFX+cJpnEz8**(-odhe4uAlEML`DgSzt}qIqadaBY-BK;_jFc5o!wIbdmB<`gLnr^JHWYC{B94sO=txpO1KIIt4umUvr z`v@Dcj;;Uhl-HhfL4WcNxuAun(pdT1K)Kji@@1FfFNT?PfseiWRAmw#Uq1V`H#Q1u z-$)JFa+dYQ)(Py#+^(;$Q*~PhYzuk(7Aj>0RG0J`GEw01TH;J7vr5xvx;LI zllMYjzGra*#E(uQ>g(Hb7eCkbl=a?C&g$H`*TNqeievCd9Iqyd^Z}VF^pLz&yfuB+ zg)LrG#Gxo3*{XN z4GqOlSiJ~0&CD$D&Xt$MMr1?vjR3W0UU__2214_GIha_^)X0_qE}dP@KIH9nN{yKQ>d747*C>G3rw_haYy?O$Mq^P? zkM-+qe-&)%ZP-O>9wqA^xI3S_?_|zTy+(1R7)pNU%hvQBN_}nbJWE7sfquLmzT2IC z%boX+TeI-MH1T`3FSfrT^b^`oWpppT2GYSMo-6suFSWm~DvOO?GxqTn7lCOeHD)rX zi08WhV|gq*1P@mOcYvS8lkqHqI&)6f83pL#G6f4G5ZDI=Yz_TGJ#qgFg#rQt!?}phsKw>+deSq0 z@Xw&Cp#u-@c_TJ3p9gNnU#)aSg0m{Pwd;KePd=#{w159iQX80thPVO9Es*qo8&Ox? zHmqf=e%3l1)7;wC@g2rFZQr9hv2a}eZTlP;ZiKuA2JW{8a{?w zNkP6Iy0Vwrv8!f2u)=Va#5j(5-tLjbHlG#>$vq3cZ&um^81lf+rHsDiR4xc`pA9M< zTzBB?7tl=aKV%qy(R#a4vsp|pOoD;Kx!AHWFY(nTw7`GcqXx9c-zxPDGux&hzzLu) zi1hPlDURoX74)wRpw;Xl#jSVUn1P`X(hrcM>(zV8l>648Jzfx<`UPX%6bIM@nm(YU zsni0s{?+xxTI#QJ7r|PJjL6a#Yy$)i!@cH`usar{pXdhvyyRL5efrGrxA5cRI2pP9 zc_K2G;xW#s*qGVCdokrG}SgI1b*QxAtgr7S)Y$DNTBCd?0RJJQjj=+r+5 zq$Z{*tt<>j=?|C`23uDIf&&+G3809}%Jaz{)8D>8Er4$WvRmNc#x(7z}pPpqv>$IferLL(>u7%5uv4thGP)M*TiB-(icaFy{ z1plgn0-C!)brM@f$;4z;;VOheL0J!RVJEl*F#+BQXcmP6O25H47K`6FSVpVR#~P!N z-XreL7wg(U(ObZthNU)t5jHcngm6yc&v=!+wNq8=^^I%NebhvpEwIe0bl>r<>$kZ8 z-y)%DAEW(R{(6rZU|xYeZB&E*dWM4LZGCNqSYD^qAY4#mKg#1<0{*@RWf;VTbCc}2 zX#{C4KUpPy&r_~hWa&8+;*d}n0d0(9~UA;xU2_byY|B=54cs>4xWDzuC>>uAUfJ& zv@{^0ZkZ8%^a)$OrP|=bkDjC-c_ONYClPkb(EZZa+)I$t?Q$B0&>E7a7YC!og9F8( zPp&>E-H0Y{p{BWvdUTKrd1X;!jaZIUa~&Pnwb`WEoYzPw1m*J!Y}v`)V*wCZMv_EY zIY(lN@0Vsb7HA8~Q}QzVh#xw>UBVRSUhBIWyMhWXU03J}CDLXQ=F1E1pc5j}8om*S zTq6(2TWVDGetJLk^Mjs4l}2&~QNVE1zB*pE!k&I(McXHh;6ufsfgH0G;{jHs2L`rt zV#l_p)phhFR=Kexi)pK-+Y0hKEmfNm+1Y7>PHy%xdQr@p?EgA781?7_cBXSvP-a?A zr%e1}ZJuwaS)EQyQd%OnKiNn5`bKvJ$t-I5R0106g?7lJvXU3147-+k{#t9Ze5%iT zYNFepn{x=A>kJo^hyErz{Eh(-lPdE}qbiO@7OQ#v|eG-!uPy^)jev5DJHN-qo`=sx;ARS=Z%Ip_7uq+#4I)4e}mdf%uI z50iooA~;RC8|Ty1l{TE^dm|`rKdSJIRd5E1lfGej(G-`Vz~33ky!ztPfEdH~*|s9j z9|plKDtuKz%uh|)-S3-^H?->Z%%r~>vXDbRP#R>pDpo$Av=%pUjHfB8@L9_X^?#~o z`gNouY97|;#L|S&J%=y7l_2?MmJ;^10gJ|)F?FL~t1KjUL6M;tljTV&%R(4LWK;-i zSt3D5;H9`j+|SDRZ=@*IH0@bK2QrZoeV1zZy+TB9n)t8*E!1zmDf$9sZ%6w1T7GZh zcht@^U9Vq!t=;4SF>gxl(EdjTnvyu`Sugm2jh~SII~4&%20QGHmkrLEqQ2q<8LO=p zff_grQwfU$)41;3d6Ts18$9v+k2pT)^-n;aT@o*AYuF z4D@HM7aW*sob^y+Xbv+N)m_6VdMbb?RJWNS5!I6dy{{emq5S7z=v@&X5p2A_>h=q&MY?RGC zh38a?%(X*bq?S`c6pihXZnQ+d37(kCsF6&}UyM_-#@o51>1BHCcg=iyb#U^6mrm!C z@%YnSRkx|c*skHlX581P{=c5WDR@>nBK!7J7sBmF-rM#SLwL9-SAiMF>vLu0LFEXN zg-0tfHTj#mzYLzKvN84zjAH&FsR~4c{ni%$ru-or`?*V5;gN6jfyQ>V@K+mLF8++E zr{~ThAI~R^3I&bp-7ZjMf1uTi6JPe4tY|hb9Z%MbvJz(%OTjoRg=8%*`|2h5^&QP3 z8yW?aOZh+eU_PWks<__e8Ktw`j4(T^V|lb6<0IfTl{r=|zILMlPs|yd8~**4RirbO z+v=fJG0I?k)n^<*eXQDs4n z>_q{biHS^Qe%wrfN$_3@!1Q;Y(BMM8N}oAZQ?nJPF^|6}Bb3=Q3uYfT>#r~`<@_EK zP(MwcjkBOh_AA#=aM5rf7Q#b2OCXR){>a77fm6#ZFvBr^@MB3e>6D`TyWtIC3KlQR zl<5G($2^r?@2mLW5-h7K?&R45fCp-`*1mwv_GE+K%l%0s>t4(f|@mpCOS8YH1A6A*+t=e0|TjE_YPF z3MX?}l@>~`NPG=@tbMWq=2@g7DEZ+dl&=r#O+{cX@eer^DJv7wM~=*(Q*6iMhfu_i4rNmxQXea+wj1c8gzl zU{U`vOrRFGJ`1Y`0&Ru*AH?JU&*DneBe?c$}QhTS(U@5>Wn3eQYKPnprtLD4@wLO z65+2VYieo|Qa_t7(&g7z#oK6x?rk+mTxz(@sbmVDQ6f4H-q$hRAuU@xSI?dbHWh95 zR@jBTAx>;w6e%BKiz?$*8Xv=mX(4MKkM=CoN!@E#l*>mT<_k}Nus18m_o7NR8IvPN~ z5SpbrKQ>k&=829pjRMgns<0vP@}k6$rf7XpJs|Ap{K3UpJpLfleO;_&%;-rubE?Vu z?YNQtIaqxFJNBz?F^Jt@DVI1wdVTBaA;>#q(8h&SxKEF}u~}%hZ~O)6AXk>YlS=D8 z0nGUnIP^~o$^A{Z?4%sAHo`-y7fr@ty7x)GK4Vap+n$I`InJWeNZ6&@M!^ z99ny{6?5~^B5!J+-2d7rHxV7Oq|HcNi$oaU7g9ZHjh{JsnV5rI^FAT>_)RMqG1n*b zW3_@9YGBGZJHAEyQ|__vv>BfMvPT75T$x$bS92`2NTm{8?q>6pIt=(SaZ)Ji%e01F z5H5{8!%#=&kTU)zpHqP9PT$~*dZgH7o{T}#!75+*|CHjWyCiHTx1H8I>CeK}Zk#WP zmRt7aCE>o7^(BrI_elrkbY!D;jVTG}QgE_1xPJ7B@X?|WG(ocvse5P>@oj(L8jFzR z<>G~N#yhu@0TVa7SV{uGVJj5O^2}zyO>tOHRe$Z3mpzJ+c%6Cvh(hM&6al$Vos!@@Jykp%s;}3BWXSetZE#`iY8YAQ15Why z=krszaDk8>bxI+Ju||Q=Osn9kI1AyEGtD$iizsKus$U6u>o*W#$6R|2rh5_<7tM zXpRZ3X!@d=u~TocK9T+=zzHw>hIbhQE_emt!UI@+s}ogKZsK-M@N-`rNboD7EVSTL z8#njn&M$?9u~qo^TddySILB#m;G}{0MX~L=Q()kuL=ZWV2(oXe}yebDu z?W#1`fVw-w7esJmUFR&Ip$B@0KRq}dnz$OUs!cmKf(HEy<`A)GK4<3xuRf3t%VlBt=_3BC%_2hNeU^t%^Jq}z98WeV}^V#HcquxBZ za7(TCX)wsbW6b_HYb-@g&C6as>{OA_L0>iikTCq(qGersETAzJ$tRU1SD8mSLYI2t z=}R3>vJ@5zT!Qm1QHFF#yo12Gc!#rGLK*hP@C*#NC#Iy3T=~x|&PecaI0R=cBxVbG zf$X_prsgD%KA>oVn}m&g+|pY$!i?0uGDT)f&PuhQEbxbVbjL0?cx@3xQeXX$hrwa;~}HS@1>b3vE+Q_|S# z?Nd1LV#b>y1P-1uIj&0*$b0(m0MF+y@N3lm7>ZZ32pl|YyE%Q81a?xfEym{}15}MoUYik=9m)Mg~13@g<5LS2PxRwDR0JlGceBY0j)hP*d z8F7Nl@z<#`)gl-&Um0FLk*6GVPryxlD=w<0o|phW=hLK;g94Nf_C9W2DaI{PV+Hz{ zh>?;n!nRtjvgtjS{8sZ$Re^<_k?g$Z&xv64<6KNB9J5W<2m|mLIG4@##C{uBSp*AK zOg7lWRyu_ZZ#C*DT0(#4vHtCk0!(k9_bfuR5KA=pZeDqe>%sTv4@$EljNfI}0vvQ_ zXulbuSp9NWZ(6q@x=0dIK(#4g)Yh_02C#SF8(z!862>o>3BvcyyNiZBvUWj8SVQJ@QFenTe(w11vyhjs66v+E- zBJaqOyHcX~KE7n_E!Ut8>|`#or#M^Pk_x5?5XC%g z244!(c3*_leBpR>IJX*!ZFOv7=Qk>8^}_Vs3V9U%5@3W#4@x$t|<&T8jPZ-R#o7XiPsY z0gN5HwS%&Z0AHrdB1lO57oD^nlaWGq6E7V9Th+8RT{p8oGC?I;IVLjii%n4yBGpHN zKLyygS*^e5nWOADHJ%1?;70QO+I|WZ$7}0QzlDld2t1^XI>#M<;9mBuORr=(TwM_K z&t3o-q^tNg{wZ{;-!o*yqSZQod+I?9Sh{@X%+1GR#)ZVVud9)U-zOZ-+F!istIH2R zY#L0TE$7(Jj;Qw&y7KwB%lG5$O>kfHVl6JEhGIf{V>{jIm(E2=bLrJLRq1)HZxmXR z|X;%nU;_&MqH~zA7&P$`ee9I0yj{6fAyL(DNc9An5%$??9sa* zD*`lxjpUF)3=~-s%L5%+TJ7XAu8@vswjZr&e}Hl#cGDs)FY5@@rGH{3-PmC$Ya?{q(F!>7VPX-+$(s1T~Nr&C*UR~ z|MP>cc??YdtO^_a_!ncX9gi``=(&NQe6q^@_v46Y5PD|Zr%FOGWJGsuL}!>65jUry)X*I>cb8M1z(F_$pL zy+MVo9JQIz5PrX2FnjjEk*YD`dlV=-`9u517EqX|y_AfsHA)F_)P}EiHl~jfTUNC| z5pseBm&l&IF|-Z)^t$Kr8Hrtw4o0@3L)zN$1Hm=^fOrrUGFRi!(WSRTw+1vcQb}_J zZJm|Em%3%}sbGd1w2V*j^e>F^Y6`_42QLJa4DatJ=COXVa*yI=yv<}tjs{skg!Hx3x0g>qk!TcmXzQV{A+oy#zX(dHw?u+p7<=PR z$SoVxW__=H$teAa_AUbpPDPi4@94Dykg+_Qe9Isva`$!q;`(`kW&tIp#%XEpxO z7V3E$euFG9Khh={T!R6v3!f$knHE|Fp<)bwFY(Fv%1O4+(dO>m+14L93J+y<#ZD<>3kkx8!I5^xg>?z!*FT%5h+^e?NekimdCMO%boTSG z`aGi{QHt3MkNATZ$d6G6^K+IO+RVkT&ta=shj&O)os+hO+k3lA&*5O#T8dqg#Hk2v zNvJqy(C?E6w8W?FwCwbdfOkuxs~-hYENrhDjE_Efp+TfukutanxSq-zXpDbU$Vb6_ ztQpSA-hjlSvOenR@G99D1#Y`;vZSXw0a7RWF0k+l7hUo>w=E|UFQ0MjQI({otO_qg zplk5fY*(_W>vSMfMG(@ZSqeTry#;I)~EvOr=opW}G_LOU$`NeW1XG!xN-0 z_rhPxh)PZ8`LsUm91&!JEkU|bphOs2_So25o|YC>5{gH)-A)W8F>FG1xKW|-hnN7J z^o%3gN&lNvW0xi~Lo!%_mP>;P8rE2e+dF@rcY2V|?M~yuVW|yX=9Hj0%(SeF_r@jp z3%C%STI;5zTzQSa&Q=uotBMs%3mRYXR3&KL>&C2wY6D!a2@Q{BR)Wst2zwMO-Wo@c z)lA_Rm}%6^W0{8wkTT!aCBl{C_zIv`5LOh?2l*9Xf^fgjVunS2WlsZ%bHlpH-caZ&&WW$ z&o8hH=(l@%ASd5j>*96MU5Pdd=qCLD0zU49q#TdZ@}gFkosn)j+di->$1h7ZuCf$H z<%_LvNXO(wYCpVPTSR+u77`gi$5cFCns#l4J@aFG$y8J17;q~LI3=`=vtOl;sF|go zyk-0>e8u6rZ=PBrcbIw~5yVnPp)}ktF9{nCb}(Sa=NPX5HO1qEsO}NG83fjAv_HZSW;eiHqp^YmFpz7oO zN+6P@5QLe#i9~BS)T|2wkg7!QmDq$qL z&@MGXDiSh^IhN<&vnt5SVE)Xf42=+uL~rJTdD=uqTZ^|PSajmQ`^Fcf3>Hwuz9poV zPj=uDlzhyZ0^b%vFnK90|wnBxI?SDlD<9wcv z#}9ZNH1+QPQTCPrQMFOu@66B*(jXup-CY8MGy*C}mxOe8GqiL`*B~X`T?!JCLrH@O z$j|~q*BQO<`#JA9?>Qe{zRZT%Ggqv2{ny$TYwzEC?z6;6cP7GvPjt>ho}|!FB~=pL z@pLQ~jMfan7=K8!7-o`z|JRlESKy`UQT1CfT$q{FTbu7R)@~XzD2QO}=Mh^F^H+=^ z5rDXs#5+rjGC}m@(yY`m?kc|M_7}!9;57)maiKEQeb=sy*q$wd`j1y&Mw!)<-8!_Vr4$K9wy3{?mnbJ4njK`B8%r6$booiR_SCU5 zZXiJWt;}9pwWfYLejpD)p_JvI@WK8I3UCjEKjm1lJwVI#-a%B<3fZBTJx91u`Qtf4 zaJ~>KT>QDQTsn8TZ+yWd;EQpP;Ukc>-H!AMJLkhPY1sP0k{K>iG_OPAc3;M%U#BXa z9qITJLi;gfP+5$mqmb`S&ysl09Vm?=FTimY624aglg{|LhK%8%PnNo?CfLE-+qxX3 z%aNZ5ZcblWITVOmhU5`uXm0%kY6#QpKQ3wAv?w%*CWnTj!#B#u3KEJUqjlnWL09>@ zPkiDhUlYyNn`mwnI!K7=UT^`pW_-*}8`kc(4}l0n>RLL2S#I(K$1BR*@huHM-AJ8A zbzY5MQ{GNYjzw(G^SrBkNa3LdB40ePjm6h!)h} zzQ`=prmbWr;d++5kGk@_OwE?s$bU(_0XBRv`a7+cNPMU@?@Qd0@>FECQsk8p9m4$` zF6=qlR_zS2d)n)2zs87pH)bKAK5OQCEEq~JH>gqB zU^M>N50?(PXW+bdH}Xh$%4b6m{y-5RCNVusn*7Sf?t4c=6;KvAGCB}q4j@PcLaYkp zM0SeoUt*&u{j$nAY+9$R(Z*d5ApRB%1d1EHs1nfBk{mmTvs)ahJde4BG@A^99k$YvJe^UxGqCEHyt92-7TYHwgTF*l)nD(XdGxbRZkg8<|awR_xwS1`i^(^ zVQrd@E2OJxm|z?-k&9Xy#jqk2_wd6)h}LPumVSO-`R?hM1B$hg^jD47N7qVr(&^3* z4u)as7(~!XLTJH4VL0YihY}PSoUO}TIBupn%LGBaP>u?3@Y`Wp9)8WVQ2_6n^z(th?G!_);N`py=h ze|b6nIp~n8VGoya#-)n?&P?N5EZV@6F<|4X77OR6L3k&*x%ybj=sgZe)7F)xf;G5h z7_g96(=Q)>O2j)8k^&H2s3-_uw$coxdvAL-_1dA0?M;9?lri)x(^Tn*e)=-yKk>DY z9vqY(ahiCMoXSa65Iv_p9Y+QYr>-MLb=v%WT^-Ao_gmO`*_NeEs(}ocHY1D$dv0pa zHS%?kqFbNzQlT>5HO4%W(c_drlL(4Nza7w}84OoG3MmxNQgxOwp?b;(=$f_PI@}yG z#2tKS@bZ*aEA|024~{j);Klwp>_^{s6-Tr1`m*VSD z=$;u^jaA-@hBi7pdj4Jo^7IIe;dRZkgO-Ae&`Rw$Y?a-fo>zz@`Nm!salqs{K5=;7k-+ zyU&f5lEN^iEd5_@maWjF>J9*wVy}%S)AV9+1vba&}^KNl)6s}u4 zU0z_fo6*CBmu9d6=#N(hLc&apZu>%yJUAxrytyVFSCz;3#|R`03bXx>p2B3p4`DhD z%LW%r%SZaI4S43425Ih9UC+v>1`gSRwTrh>9TY%!MF<)+Umu4+Q*+0z;-05%j4tHk zwl(Do5R5=cYg?OJI|ktOz4jwVnnO_ zPTFCai;6k77UtWG+H^gK*H6CPJv$!{+NT)kvf2w**3(#hwXI?C^)$Vycqc#SsE|mX zhiBX=W-hxl#>n`ByUBCwpez}78rUd?(^DnsNp8>9M$F2RF z=#Ak^4m|^0Swua(U$2Hb2(0CwATe>s8Zx#~S@a<>!4ac5WlgM=>@39(FTWo7F8F$g z0{&TBuyDZUPgs^^?vdhYPq);HN2j^3%|V=H+(uL8r4eHSnw}Jx5%kaW!Jh-piJV#j zQyvr8{q%ag!mq!8583}i5X5t*2Z*VUv?yOSI3~q!Bwegcg@BPGPf|jq`tvDr9y+G= z34?&e6$Z2^J8mk%p+HQ*M^WHVu|NG&cDxfPkd_v!SSfpU;*9XfA{as<4F90tZ{nki zQTry`Xji1phe~|)36QmisK`=YI@gCavinAlPym2GU4H^Y4j2IVPaKek|0xyn@b6@a zTfL>_2LKZ9kfoBy9wUGLKVE%#WJoFgJ4qZZBNF$|cOnbV^NbFpYbfm{PhO7@JMzQhltu{9zV@OodLjB!Gpdg{p@BJiE#AA}MV! zUNG@`RkN;Z;+Q2xYjdE?SneM( zurfb-JXAGM5p`$D(r}|B`7KwHc+t!+;qSNfmWer^RIY>pu+{#qnG&3D<8^d9%{E$P zKFgG1ReIje2_)YWkbVIH8*Fq~i)?G5Y-jAJiv>G64T=&WHJaD_)v$Kqx9|lnN3uB; zQ^`LZTg*mMCI?SD;ZxBOiymAo_l~|`8Ahb_-YSHDs2IiZF_Qi!Hr7j~SXAr($AwTA zLo!YM7$UGm$1HkAF&q2VKPiY2!S9gnv8GnFFQQs_>%w+mHQnmZW;>ro8O(iuhaX8~ zjVg}A$>%Ab#sK5*X7@AW{^f?1bjQyGi@$!e&-t*CF!HG1e|~9is%z&+GGd7VR=Z6R z{jMC?qW4PPUqzs+V(~4ndah$|T6_UnumV&dL2&rG`@qsEKdX=D;M?z8%sD~}Fmy?i z430&ApUnCzgV4NPq~`r}D;EgQ55LWJ0b#jg>94S-#*lx6`j_7u2d2&#eJ?2{+!paf z6O^lhrx=X+Q($3!RyXApbcxyt+KMT-PqQhr;n?tGOkC6UQTbah1|;|w3G(|uwyWxM znf+z)i)nz7A_qB9kqI>P-0;A;=!q4I+0PHHZ|hxNBO*<50|Ku337kv};Ki@~qkb~L zGQ-(x->|BG#9S;4_$u=#-(xW1ud%Wx>DJ0{8?QbVn;yEZK`p6YxFp_9al;CPL>D#7 z)>*F`DDG7`$@Fj(Mfq>`cN;UfUn8QkS-yi0RE$Bew+Pqz&A3>y~FAcAwdsJ!kb)@csHAC0j6*gqQ@?W!bqRp|QWy-Gi0 z^I&1jBEt*8DnmVQG4BWqY8n613RfQZ<` z!z1rKn1kl$snVM`LcG_(_kOvuq9J^m!#2mIa6ls=sS*!JjXb&OgOZykC<-xBk10M; zn?r>h8`5Rya(}X>fxrC4JGFH=ZrseA!UZqQ@P_-JLD|sn@4?PWidVGzN}j@oV7^F3O|r z9-zC)O3WHvFKhi_=E5Lo+n3M!f+ai9nU$UzrXl6EQZd-y+|%$o-f+Q^dL znlG||7?Ht$qr7?i+GUk31fQ*GHU-N`E{1=(!PM>CCO`cnk#$Wgtv-G`li=|y9+=Q` z5>%6JvLJaMBI_Z`ojJN?o+&nyOYeFx%_KoZBX<+CJE8ju=Yle`ccGd)b&C+;Kv{pE&B;gkp@ zm{HokS4?fcFL#zRFzv48q2)1GlXpF*$qW?#sr>7LzbwA*vb-T65!>oRm&UEL$nQkJ z!K!NB`G?yWp!T_DYzqBmaX)CWM_1PHfRp>ImfP`XY&JkOezu2x32DoNM zP~+1_ZT(~e-HNtuTXD`R^1)3dSTb=;ANx5vp@F;Yo*raB9zoWvwu^~%t zwuAOZLtRzv^F8PCVf{TNoTbBTNMdNQr4X*f?3W)kg`WyB&9vR&Bnv+3uhqpdz zZ3YfIBu_numfK9wbliofJj9Y3u`FpA3Q=^@6B!s&?G3e(B^d1KIC8ACu>!a}6w3$* zw(Utq!hC+D_^?Cw2I}x_<}2DYruQ99`VNcWVI>i~-(R4Yr$96KTz50=r0hRtq%jE|69#`m$WtgH}> z%YI|?{gmV?+`#>AfgwSs<)MIX%RgW`?4mT+Mboc7HR-LngDWTBH5R1g058XhdD-f| zGMxKfyrClM!u#}GF4c-!4pOZ;GqLvRMqjqq*geD9p=tVHLmoR;mtN#2JayL0 zZ+Z{9*H9IkhLkZs zAY3bJAib@?!btK%20*gE_H7>Gu#F;woagv}c1evHoXM<5i6e^!gqb1ytRdPc3kRow zYtn1W`w6E>oeAc3q18`8X_JFoAaKHwH5yOib9C#G1o)oIBM+HQ5VW6VGsz%^)i_Up z>Al)T<~lg+5uB40>TooKVjucZdB~_9^C?ZI0fak2_kz4jHIGYko?gwZ=7o)dW#2Fr zu$^O?kjLyXbX`L}Qiu;iqrQS1n2Z)dJiHD)}wTC1Sw384Abv zF95I#!7=U7+3Xe0x4BPgMOoGsa3`^;si#gWp3kv*SK!1(re_LxnwlXD2*5|n=uL(C zXk)Lu?TdHrztl{IvxnSwP`%z@TO0(o#~ITUv`ip3Fk_{fwaQ@NF0g!?G+jfGzFaGeAaaP@Pl$VynF%yjx zceJQbExbWZd~lD9PEXdu%^V$bsar=-Lf)@@gMFvO_LsjE5k@2^@F6<{_MJsA;7*_& zvqDZ1>(?>qbvEFi0nXz&63-kw8V)hn{`{J)T_s|@DE}2e{PS>O>~xvMdkGZl zo!D$p;3mpIgUf(X0K=ZJPiBBi4F)u`iPMP^-P*h4T@E6YwfPrVwNRIke0f8IC-+2O#L6lBDDSH2`rq_|55_ zpE%@6BNs#m(0Cd4%+pPma&sD$?{Gh6&A~1R<5nx3ngn8b0v3SELs0XrtLDCRfUFtY zzKLN^_(oPPVe+-I%LY28#|r@jYtphE`%L$v_r2d!w_5ZohtyKhGmB~N@|#50Qtt0L z#;-|_0N_QVTo{QARrpB%i|eq4ifoqwR!kdiiUWJiB(|+G(o_S|NxpwI&Y-yajshe0 z{-q2Rz|7^oS1I$2hX)Pd-d=0Da1UP|Vq+k;?AHu0|J z{szOEJ2#LI7v^G%iZ|Ql_2v=Q=M4VXbqe+2_)dsmd zkLO~J7WrvreipH$WLKL#Xmn7%=D75T#XXKwxOJfebd6k;lf{A>>0DV&?dRmGo)pz8 z>JGprglrFNzd$TW05oMgPF2DdwkcJ}nma+fs4lE;-%zl@gHl{4 zt^4E^Lc7m`+XDq`h0nVDYnOF)>gdkc_8%yrUKtplmQy76x)d-%ywH%txYaIjdeDzG zOOe%vu-D0YkZ(}qo_#v)-pui7={P$644{~7KJFO*NH4VVic-g_S*vJ8N)u0ETB6T> zq_yR!ggi@)Fl6#8o;-S0y5vYy^su3ZBJsovMygr(3&p76Y8`A**RAdd*Y*oM*rJc3 zTLM~*-xbZaaE7M&MQXSaZgCrZrUliXI1z#;OLvh4f4)i6Ptv3{>&nV}Zb81E0w z+Gx)Mb+&6{n*=Mgg9w~3)LQdCDf~=Y$Z2+jPFK`>=)3oMZbhebhD%a_S>^~}kveol zZ?tfT0bKi&Su{_;ls#|yBUA}1)Mb?dvg}^tz#P2a%krYE%Qh$FCT(yiQp^!>mr2~D zJsXw)Fn#NL_h6A`__$4eI*qdQD~JjC=6sPRG2DneBejBb?J2~p=X||p9`!l`GMYAtAgi<`4W&A5-y00%Dj*~ zThZ^FKQJ9Jzmo#)o-m)&XSXyib)-Kb>_Cw|!DqX2ONhh$-$ zUDhvOF^GDt4DJBjEeWVk7cl{pL3@(EX=dkj3^2R8LABdW!)tG>|RR8Go?F20ugivKl1OsLh;Qqm2dXVWm&`DN=Erd9mLAfwVux=W6 zVKj9Se*#p#4 z60}Y@PVXx{L*5Rj9~+27UZn+mnfR0K$WhFS=oF%IbG=TOoNtbGhlfCt~cDWxe$bjeeh)?rMW>?idy^IPe?z<}{-lgKo6;gkRt`!XWo zC>1u_kJWioHI7HoZEJTns%Qj7p&l0Re&5YFyWjz=d5e>BzZz)HWPZ^AbUmMzqwLVZ zIx=Kb3e-^+h!yzhk+B}MAQ76Xkj0IgttE>YEo12aiJtt4o}7*;W&u4tI*7X-Q;wn@ zlY3wE8#v?%_QFu2{E&*vdTMLTDg#1fXJnWG_^YoCmhQ8&4qA z1qvd>B7cq;xc+<}e{D$6^Ki0|6Ye})%B&nJvm%52ph}DZ4>%QW9VJiYVtE9X5L6o! zeW_$I@p?jjY5EYP_Vhb!hd|Uc2uFGyi>h70fGvlxCS_|*AR!PJ#))nn7~ZLa)+*HW z^cdEQw>+^i5t_I-Q@#STJa?QhBUoR8hqUqtrz4;a+ zz{nY{vk#EuMSUDp@clD7)bxFQWjlH3s|?EQel4c+PG)GyYM)Dp#7KX>gdC76XG6?J z>b6S)tms6Q5!X?b!GamZQ3LCa7U$v*D5^QUjL`M5_H`-0S=n39&57J!`!SgS%<2c+ zDIkFmM5tI4`{Ly<{BU?+Vy&t>brar@o6rE!3Mqy@Qr~Z*JtSp)_zf={j70wXq*O(38qu zS;B7{sHfQT;q={&*J>dYb@W9*4=2QN_X2#cJ%tUGQ8?Da5Bl6)&HA>H6%Fx)z>y=a zHq$C)L#MsbnUb(S#|j^Y78>`^A|9RV{u;1YU;};G1{RmW+Nm(Vweu*dQD?g&AH}4d z&HJUydYkj>)&ps2G8DnR0K4cbW*JrI?xx?^l;-q-IOA0Sv1r+PV zhPHf$z*76zIaA@3C?5wY5|hEHz^@>f$OjmGCB8MfwXXSV=cjbR=0$O0XCOAqWd_Oi zc77VWyleXYYgA&>H^Fa5P$4OTc=q|Br_FqtY*YhM-YpP!FD@6$D%Ev^W_4Fe*lI z-!;={yC@FpJp|-pzRN!w^g~MlHrN}_*C+wHRNQ`IzgT@a0!P&zA4(8!OVYP2y84JJkE^q$ZHPVmt*!sO9TixxldHcO8 z!dck@Z{A&H<7nUH(EO&(RFwYf@;%R`!s6czEy^v3Bx?8K=&Ep{LUjxQz7_Mgd5U7>?ZOkcY9|syUfPiaAYk`K#n}l&&;o}u2*tMm zV|=izX6>Phf;J#mtd9YTQlLiGMo3UMSkABpDi?H1mdNsAW<+tHycf^<>rFQLP@~$Q z{WipGxX?zJ+-(66A|E|0?a^So?ouLC)seSn=51S9^$!K636?Codml+;uZp`- zVT0#$lg=nem24}NdgzY5NxI(6y<3qXxKA}a$nGzsLqSGFUpAHEOIo=}Q}0U*Ax%{7 zoiH^R%F3?*5lFZ9Z!8p7PC)LbW}#B}1-BUx&hCTI`K9DsFj$VI`o;Q=U3;0|@^boi{(F$Ok|akM_5=yK1jz z0NWKg-)h#Oz~j0*M-c2E+IV;}jamY(3?%&or#Jmkh{nr)owQg$x*L1q8>x|z7f%Ql zAHa(={`?vZr%KjGCR)=v3aB0~tkR2_(D_~sKSuscVm^zU|2*PY-O$ z8Z=Jn*jQRwDT?AAr|tQ?Qa8f@8!RHY&_TMX47C1zC4E|kM)UB^|B~skJ*vwd|D(v_ za`ot4TiX;&%FSfgY$A^hbQr#xKoQzvI48rT!jQql`tvq$>df z`ch3#T=%cKBa-`@G8oti#Zcdb9C8Z$7{ilw&;%n+UeZjvefY;kc+|4u1 z>JPm{P}2yLgHUXET^F)g_yZBmY%UYHMkziz;zRldL(aE%?*)IcIOE{kuqU^!PKSy1 zd;{Fk9O4%l4d(qZ!B~^0q&0m;c;Wt(jtp5mQC(_nrg^IMjpZ?X@Q=0|r+L%4&Un=* z6}1enI1!o7~wqi2+Ny!0|I+wxw5<1lwp(;4on7924`sTjv(n|Sl4r3 zb2s8e@^@03EZIE*0ZM4fjPgtSKRW&y=Ts^8<>NMlmUAyl&~=ym$bb9D$_4t zLc?hD;yMzNxFuqAn4>+wi1266OFN~V@M$I#M2tqi!u-T*50JIDwEJB8&WIupb&szp z3e3lX$b@c|8RSm?A>F6jY|`ZIZ~y+)pn{ni-LupXgG~{CMGRVf3Z)OVro70gccJzt zR~h~)w*k=IMuRb)%}RbWS%R*NwPD|~|F=qO5)+E}1!Y2C8M57eq2pcS`fXZ0fDV)X z{QKTNN}D^o6Aj!G=D{JARlrFFHkt0sLqjbX_RcefCgXwozM67PY098lLt=Rb51y1P zlNK~$d(VHa8l^hV)hky&b}r(BsB3EWAuImy)lk&VOS3dpiGoy%y0NEBe3xz?ZT%}1 zHHi<>Tl7raj~@l9NIJKyr|}6^liR$CU^`3v$!SWf&kcU)d`?ey7EBBd&0*>;fyenNR$mv9mUONn(a!Y59SJAt1_9K1MIsJc;V(*9qkTw<{|CZcy%C)c7?6J+O z>g)>kryCqa^)&t!EhQU>m8(LNKI!`SHyttPFt+?;X465%`lR4~SLw*WgH>#(X}BcQ z^<(dIK(1Y1T(ZYZeLVr=^~+22dUM-Z%B;5$?Z91OYhPAys1{jW`Q6mt6jpOfqPT)* ziVc~B+Rl=b{i|9p(4Oajf=!pv9KQytUH4|M8KvzX6NOFh&3|Dpvu5W9%NO zGX_Q_0;WtlfbQVhpUhv3PPYdlJF(ua7hnPK+FosaAet_C1-z!v<<};)JpbMs;`gyW z9OdY$&^DCnH{spj>J@@HImdK47YE-w^K-qFDsNTy)=veZ%X*8j%2mEEO03$wtWV$S zN!1#En@3k94sq3tJpgo{Yoh`&t-*=GeT4Ja{HD;V{U|@uokpTd&MO47MZ3OF& zDwQcVMpjp~VQWALvl>LHju= zORikOOR5+>B8Y?AGpqe;`~Gg-Q)be~NdtOSpNqyRf$p)FpGw8OK4!fwYhk!!_O+&( zie&8N+1FtFjMI6*Z|OJb<0Dha4MM>~;j)wl2%a0q&WhStun3=v|3pqatWgCZj*k=JzsV_x3F(hD} zPvObG-aPVwFxz+S1$;5?rKrEi`nb#=#Vj4u4ymIta@N`D+z+o~95sudE*``{4{{mp zeZ)dI`5xz7L}SY7V`PaQwkXryYh}&b)IqOQ&p4ZL(Q5A27eB9t}DPQb$nI0g~g@E;gBG`Cx5hfV5Jv=Kh zE2FLwJ$hTrj&z~RXx~;k9YQImir=r&erk`x*(kQbAL^Cz^7Zq2h9am{!II_RMd(2M zD#75hQY;c3fCq%~g{h`~I}WsaR6Sb7ZbgOrGzU@0NQ8=Y z=(ifMB^fSSw3PCw4h~T@=6Vx46J`oo#ZTm*FUgwSn8}T*Tt1cPG9?zmJ4-|-rdH(A zsQzKRrnNW4)qB5F0*?S#j|Kv)F_8fIO_xuD0Qr|>iMCQ8L9za9)z49|B%16bizJOL z+8f4qDppCk2xa`QU7$vV$?rrCFx45V=YuEmkH|3u)g!pLF`t4l!pGd@m(1C^HN7em znF(MjgA3_WY#Rzas@ywN6@rS)t|fiLk*`;S^RwOjA@Lfs294gUjb;5WwCw{Alm^#- zPYDY8r|*@v$4&0pvv-@wL{~t@1A50|9A|ao|r0$w~HHZYeTm#el9H|Ex>+n81Jcm zB}dHoPD0RbgCJDit~e1;H5K0zh9nr(KVs7!h;5$uS^Ny_#YCoSPxo{GP!mCFy)~fy z%R1Uv$)ia7#RPRTpbPpNm^G{$(B;b(cc(lp*C7giQQE?Lm{|vE8Y23__upV1cAs-I6JYZZH#|x5T<~2<+hqi^NWI!m zq@i~=tC0o)9tmZa-W8nHGn*BXW^Xr(2bqwa>|~V4rI0Tf#dP`2Nq~tnFAjYw?-`nM z*En}iWl`tJ%DLq%7f))B$}g(msc&1-BktgL;zi*%eArfFkk((CWTO;o+a zB|j|jUz9E+U=-&O059MGf>fA7lfzVJG$HrG#M`X$5FGBuuF&yq%aXF~*t`)3^# z46=AU@e)j2!IswXN3~v@@l{i+nszNSkm`D>`xTeckUThJ9Ry81g%pWn(E-F=*t`S= zZiC(i1vGudfY%d3Lk;4?MLkhqsyS)Qe#+SkN<5!@q9M36##Or=rm;9C9U5N$J}ZNDnFXH?A&c*$W8 z*l4ibZbE3PL*JL5v>wR2GNKlb49HkQa%MAw-HcM1ceik8Xs=hVxN(5`%7+r^8&BBl zG7?d(U#hw7ckWvk-}&eqy-5a~$1X>p{aHoGh-4x=)W0eJ9fnCi8BSIMVeB`7kRAFF z+oG0R4v71F-7~&OX#Yd@fT98*FXaF?T(7Q0khLZhR(vGv^c#*$0Bz$0R1Sk z+*nUUT8juo`-8yJk`S6e0sB*Ur3%&71oX`K& z0)WOaYzqWR=Nl5te)OP3jq7vP}G<|oZk zFB$QDSA`e$l3&z?S$!Y=f9n=0LgJGVljYuzKUxiLccV1AaxS;6QPn#e5n745Z|;6r z$m*h2%vBHHM$S`$a6F8~Y!SXlAw407+*Z`o;u+TU#=&aGVgXuTXRt{}ok{FwQ68r= zVgH|HYkySpnc%tOY+w|RMb z95KM==O{>nTI14dmgekFR$jRN-Z0gOKPF&ym~G^<$Toy%HyRGAWuSZLj5bQzC7MkD zs;t?*98}xiI7e*QPqhp5mV8B!b7e9hPo#3X=}N8Z9eWC(DN0Pw2Zz|H9(W{l$F|!+Vco;?Db5S-D6rKm=4J99r@pXluQTHV+J}hHpUbG!CjWO_vDhUk zWR{{%5Fak_EJI?4x=Z3g4dHiDpSP()*YzfT01$XCThU2(mgc>pR<^|>F|OZt>#=4! zQ4n}=9ZK$H_7)oKOx-5P#a6W?7xAFKc*@@QH9X{PlXrUG%y#W(mSm^xM@Ye%G8*SJ zHnU>!3iTu0kM)Z)Chi_aC%J66X9aY@?&?!rmv!#Q|Mp}MLM4UOd~=0N6~{yJ*NwX7 zE3R;VHlstzSejd(^Jn04|T zMa*K|>*gv)@FOeA>x|>xr?Zyw%h8RH`Z3BPCa)}&ZaOEBUiV$NA-zvUfU$q&(#r8^ zlaU17Yd=Pf`OHDyhy|x|fOxu}PgNY=Z)U*tH>|b{+T6y>%@bF{n<*MLJv{?#=I&AA zf#lS!%~6X4?=Dx}Y!gJ&!VAKr_UgOj}EP^sYD=Xg9q7#xE zftQg^fiG_%NFhX((PWGh{Y>sXA;H|DLi_GT;lLBPG6*q5A_)WsHStxf?Y_+JOlY_^ z_=$ncPNB$1i5ViQUkdWp-LU+$L^C+ULm0Mjbd2Ke=nBz(@EjWtdRWhwHhK_61*1Sq zwL~LvWe61)S;TV;@ltP!KZvwwStNLxmxSz`%#1UTLD9PDL3bWfepJzO6IdE7DK zz+N~Ze>wRz;dD0l4vf4orboKX6U;|8v(B5__zd$h8FzV{;I%6$C)LjrJy*s-cM>BH zySvv93my6StVhov8|ORku#T`Zwu9?+5OVY67~nz$~TXam9F&5>IXaebT-p9c-t6`&Q=hSqOJ= z*2As!SAAPAO_S%t2in!??M#b7H0esPv{VYV?L_m$&SD370 z_ozlLmie1&&V=;p{9~9bj=*4j&kgU*>pyT3B*#IL7Ir3q+2G1ubMAIph!x4$Et=Uw zqaPdfbSLhzdvz!qbp1mmuw8|Jw)PC=AGU^54Z3@K6r;nk2JJ+@JBA|Fl$zUx@z=Pd zQ00^3&{SRZ{DWH?lK7|J>|U~uycW%S8cLMUQo(bxu27UzQBlJ&aU92|Rc<>B7JWA-yWQe)`0^XYg>l>?eM+PVz!;1<`t z8cjKSJQx$DOf(`2f=G`5z!M?H9Ppwlh!Zjwc`7i^76l-RnkRcu>Rqo ztfK!Pa8OnX{+G$@?1XTWj%+PPMI zOrIc!_J2oVP7cgHcdPsGVLE+Z+`a9J3Eq7nP>TP($9wzE+~JlO&|=RxJ9n;30(MQsjeOloOmPQ z#7S|m^i(90j{BDXO#fu*xWNty^SF)M{5`ZH9q9h){6SRke&tG{4<$qg++%-p#>sq2 z{8oCdF$MWxByf6k|Lv4p9X-_GaZx=tl!YB`jZs4zxXY$y8HhAA|6ot;^^$+!s9GQP!Gwn-hY1@YkPDxBm!*Mej*alinlEw7$uxq8uc2r+LKGV`6Ez2W^C`5!t#Su6c+ z`L5{Rt28StAJGusCxXU>odgX%xLeraO_0O9_Y=vMzyMpOZb`!cno2oyaLsMj;T%Om z#;9Sn8UUNkTu*tTc~R3%&M@B!LYoVq{vziVyGcp~w$_an5}o3R3J>odZ=4 zD2^f=Ci;J+Lnr!&gUY*eD&&?A9I0UatvVeqoXhy2(nCGnR6W`chVR=}_s!0OjlUtI zPxW{kfu0mf=Vh4i9V((7GHwz>o!|c2HW17A;7Mv~sq&N{6z90{oNiPY9T9%Jw8W=< zcl!G4yi(61(#H~MB)Ic|#tP5rMD9@CQ}#xSZI#pQE{KGsmEIlil`o}~wx|38u1L_W z&D@8M!~u;er9nJ+@J;1n{hw|EDT<^uNIlw@n^RZ(Vgm`VE#0$BN8*rLI>!yUXXu7s zJCeeJtZ&WsIA9IOMh8bh)}*j+Wp3s+vJ?2q#>fz{(43OZBb|SU@k4C>@!}nenl#X; z19ioF@2#hZX`Pm|2p;^K?y&UQFzDLYKRf7|h7Bc53uW4iW8w4}A+q-e4r}wR%{`L- zHk;RdEr9vr$T>xByq>OO_I?*6*lCW|eC{`*U4v}4{~UQp0egrS&D)H-bv$>#ojWA6 zr~N0$y`)o!wKWFbX?T3rQ`K%IB*&r?FMd`HMW8RoQuz0*gqEepb1JGZci6#CQLU4y8a%d3wj3l%&kQ} z{pE|hQNS}H-}XZ6tZhPAQ^oih9!>wV@|b=yp$;}E2BXx=e7OtRTj&3au=fsYs(BiQ zPY6|{iPFmr2uN3Y5eQWQ0TBf0D$=VEdJBpa=}J**1f>`0(gg&hM>?U2w9tDe@SfoP z{GR81-s`)*D}Rt2cF)f2l%1W~nPpe2l{@}NKHTLgzig&VrdLxNP4p?1HU(E`Uyo{= zV=!Ja^WkoI-re-5yNIRaU$5T}FSxG+zoJ1grq}+WM7`MoZ|!!zg4s~4jQ4%_Li)Mw zpA3yRad(mLq2>ZA*ZWx0Y^hKs27JDa53w~~w{Y-IUYrFU^f~23-6Z`k@HujR?Uwj- zP4W}w_4T-?RvnA4q8krOd)JwG!5+OYA@GfG?Kb?tcvpWxLFqM~ zX+~k(U3t$r{vf9mO~0=MwT{@dYqJ^V`!+#N_M`-_S5^aM%u^e}Zlj!6J(v1lM$!g3 z3A4;ZEGtCGmt^$=z-R$#Rg4ge81G-gbKD$rBy|(k)eX&pSf6%xoxBw!pAx^o&ZKq0 zJ!h7OgRNgmh#zg05DVc=Ioxd|ANP;<^lWRLrK4s7zE|?X>$`h{#Xn*xF&34Q!ek_H zftjC4GWt=WL@A}?^v=>5_u?KQmtT3(PLbibp_9#6EAHjoGDr% z!{Fk$?1wzuBj94wGc9eCu+$Jg`QA@4PFM;N<7a08Fp=R~-clV#UbL?**#~K%8&i8E z-(-k%BwiPHatS=kDKFn`ZK{p^x0lNY({Y#Na5CWciCSp6>7u~>KQJUCtxesAD!u91 zu{w6V_(c*E$-AjY*e-F6YokZ?dh{GPExp2+Z*>iaqdftQG&UV6>u-WRn2dyY@bS^K zUS2}kL{3*h1}%yU8jCPL=Z zwHH9lP^^f{?k=%{r7#m&v#@+nSt^6GO=!KSBU?cVN~!LDa@$ z50_bZz%e})!IRm_x_;9I07MfKT)vrxA~||4bBpDEl&{9_b4_zWz!dNlVuh6HX;ca? z6D|WXz%Ljqe=1U@0D$J(I2$G^Y;S$13DGa>BZ89FV`ZyS(%^-T2b-At^v;mR> zaC(HS!zC($+2v@N^GL8^#ao!~04`0Eff7TwHEs65G7#6$NEHcXxo+dZu8bohb+kMY zoE~fg{9eRI58*LyS#gr%(zkI#9tC&}&-Y&9 zJqq>z23+JX;E6Ebp1*+G1m0D&!_tF^@iupY4idqEB9b|$6(OvpiR@{nz=ebLI{$VQ~wk~Wh^>{-guEV;Txkv4zGMi732=m(>iQ9Z% zRMJgmQaxRf8tfO}+SLw<_$3DX9)%bWvGiU11da@lN`Lu<7;aC9gjUI$gZC?4Q%A%! z{tRJv`y)KHpcce3gZ2r7nIoo)=4ZJFc}^hy zBK#_L#m{~tVsAz~sL=|%vcy;r#dXPXpe%B{Zl%J6N07otv#&>H);H9X5m3K7>c#SK z3**vE!3$^vP}JN6(zp@`AY%hDYi;ll7$Yr>jmAwYzw1(kjiTRXlFS*r;gcbmiI%eY zws{Pe1@c&~vd>LX?cAQOZ_@2}LVTAy&&+B^Z(u%)J*VrJ+gR(HuoPtJ;C3r0_1*Zz zoh;wi2-X8=w`kIh8x`m_U6r&nY-raW zNx!ceW&e-@?h;reWJdpDpsdSM(x>pl)OH_w)hXZu=?(EV| zym5!+OJUI*URv^m;e*G69k0hb{bo+b?Fw>V-fl{n(fGK*)=(1TVb-UrO@;aSge@s! zNU37Yx6p7D>iw-Dsb9d~BXl&YF*0}Jp~k)X+wZ$0CkuRkRTKt{S4>jCu$K8EIl}fL zr>k>;2XTwo`WPg{yL!^QAgyjLxJyp?;_uBaks z(WfH#*;=JhdZ9SkEk(<~`yOw#a;C;gN2gB^`NojDeWOPRuYI$6L2GFacpBiOFD0Un zDr=4#|3ppAKv`|Ii5Qe4lPSlX+!TL9rX?UIgd0cH+{dtp-)`($coxZ4hmnB1g znlFC}NBc1=J~hZr!e=*fakuK(0iOuV z^e~>kx#{E<{P>!|s@9Z!x0P-7XO(^$%sOPeb1iRU*Y0++X6Lff1npX3Le@KbX4tyU^&FSljsw#x!sik~3{FAFIUoPtfiLaY0hFGaOx;2$NmgM6m zFmkUu(otJOP+wFpc(KitNSlkh7f`7&HT30a_^gXc^Ukn{wG8y#2@1$2H~P>w@vczS zqJ*sIbN8NPAg`CRdGCWJ=|Vbq$f1>XGzmQ45uFjdM8V(CpJ>ZS*N(Dx|U-WgZgkr=!mvf~FK* z`%(V7hc?{BeIUTT@D`XU@r!C$t+|ix19R;2Au7zmAM2?Xb!YwAT1odKKJVYkmqL-8 zD!0E6zAMXx$|7BOU0ypqqo5PAPW$S#%sU@u?G7|(kh!Q9Y(2a)#n@oLjUvgJsMydS zU;X}}_SJ!@V`l!a>$Ltshmv&bUCzGs<@IvtR%MQZK`8%tl6$O0_bMO)g7?>6a@-D((A5eA$SV3d}5fCPsAf!!n=T9G&LCnL6RSc#rV= z3|_CtG;TqW`_AZlM~olE$unYoTPS?ebH_yGBwze<{FbJFSE(!i>QFo-y<5~?R#q<7 zO2vo|uZW{r*NIZ<%j!KHN}3vb*K z9hb&Z`71IgF!v<8uTwZh48O2_5%b0{ zx%42e`#iETAh3nIGq(IoBd~6|m>lMMbR>n|OoRk+5g;!f4zU1OZod-<>@|RdAUjx* z{rKOjRP4%s+}D3Q@UUIkKISbE(z?E5u}-bGJ$jjhiF`4T>pSoaFE`>EWw7}Xdo)5!F#fg-(`8}Eh8h$FOi4HGe9 zB|kq)?uU3mPTKW{J}bN*Vg7hh1+DlXzMA=XJzb#Og7etjPEyEl_SXX(L~MnS+2F=&LJh)GMzeU;-? z!mG%Rn4i6y`7?Z3=iaSG)2m~)VNB4Tx(*{6av9i+F0>eqx0HZbFPyC7Ue%U^G~hEr zlf!O&K>(eXdf!+sS!PNl{@O^@C*FSKK%Cru9`@UV72&~OZuuul-By9w3#_O@jgQ*& z15Tj-!O@)yc@K)Ys@O?Ltw<=dwf{|xub^!r=2ghG4|zHU`zO~W(>xNxoNmD~;#OQn zM8v}qjIvcd`4L*j&&mV|PWN zffnYhyI7a_aWV;jx0Fdz%N^js6_Q1AJ#UKLgvrP9jw~)X*640PP@z>@Lrj2U%phLV z8r~HD(1$wadj}&l;=QzB+`l8ZUAH^|LxxJX{6nTzqZ()Ayx(96L#lz0{tL9)pyb~3 z9W_`CK8gxD$7MkK%ZTj3io!uS^*&Xn01Y%L_m5MSDXlnhoChb+;ONF_{!mg(pxf2< z9}xJAiL>^I9;oSdiM%Fh|6th7FJ2HwsZQdQ~^Ix(D04qCz>bbeNh!t8+#Ql zzYX2jo273ZUqf(N3Q95*pC*=;_Zjd$(~tJ1Lqr>Lil_Skd$kFtT2cir_?q^{zZTP; zx^hY1jIHaKl3oY`8bTtG72SI{9n5;I2X9!*lxq zf>R*cKcp_!#rYc0*X2)=1jFO6Zg-3f;RW6p=ugRT=rQ-uXatxm@)Os5An5oAcR@Eb zr+cnFo71N_mCB6#lyv1%1MOXboDAmJqVHKsA_Bnkh)sH^FN(F#U6Nq2`!lirAMIHP zZ(kJjy^jyP?Z}V&L7{9)L=&FBv`X9srxeyy%ohJi6mj%dLAS=D&w%4Q& zpf^;Lbly`HvcfE4>v^6Ozl+9iqXLqjdhUGFGZWQ`g6z4M+e%o_26K2D-fQoP1!Vc` zTtl}%$A`!Qny!rz*P}1QOo6DSZ=V-RE1h@p)hwvJ{kgq-YMVY7Tci*Q!H6D|`l5H3 z*y9^`WxG>F;+m`Ocvl&_%m_DIl^>gpw_b!K*pwUMHR5UF!3MQ>2LpI)j@IxHgb-Mh zWt4(YwmAXD(Yk1cuj`d%Psm~Tao+)_(yeeq5w&;^@tnae;)-vL!WlLeToZ#lu+UZF zwsM)aM`@msTsfq@5of16%=sx$2wKFXRk_5RHbR~uw=a#_D_qsr;}iT%XYWRte>>wV zeaUwh&x+f0e8e!Ms2>qecheuRRgCnku|^W2Zo&&6sf0t|Qy(3sTD?x)WfPl9wgg&l z1I(g2mZvb&pY2qO^Ancx2(GAJ((%KObE459P$Y@*>gdv@#Ku-th;`n!Rda0Mi?H8^ zxm7-~Gj>}RX>v5=SI;|09C>TQ@^4)Cj2~;iZFXyYbIC6;TtYQ!&9!h}DM^5wxw=PN zS$Z&5E?&wtd*}Mm6?}j!BjB&-<&OrEkN4xrY62(BgqWsK0HeF2Q^hgxCW?$I-;TTo zy>*?7qf<*z_BGo(Gy@I8pHji{_7KnG{{7>57|04S;a%`4H*(ZUqL(`7rprIEpXf~E zO11h*v8xm)lAW6cDlB}P9^&jUzSBBFbs?u)=RlD%S?LdJ_a_LhMhj&O%hbX<(drEX zn=hPPjo&;V@Xx$vWrBR}eyUYWSgon;_7lk7+h&8WG_6e0Oq=_h%(W}!J+Y5_ERDBo zECHkfH4!S%0>Q-+y}bNVR6*$m`K6s?Ol0GX=Yx-!rs8>C92>L}d|)JIG*TVF?D{NG z`&k+JYm0JemAivIRB7nvbKRLA?;|w}TRQC?7&2Z(P0#9fTwiW{^L%H`OjOJKzzX!^ ze(dMsT>p^iKjI6ic$J}78T2eKHUI*n<_qph7ij}dew4-^M!K>Ja(7c48SA z%^%?T0AgE+3UhX{_{SZuBGYtmwo|E_MlND)z1EGJzs&IQG6dD-9W}6RsQht-iy0{L z8@ zaXl-(&bp*Wk$vY(FP{q}_V;W#`?g2H6rI!$YLQ8&1p~Op65n zXjXt2Jx*u>kl1)O{VAD!gPdQ24_>mwaF$CbQ(56UV4Iq*C(yh)$LzaAHuETAl!N?; z`w7Yv4k}sizv5+cB!myr3@->k&JI%Gs7D51>i{1dAy4Fe4-Xhr5{XSY--9Ql>^`F0Z*Q5s;&KxkDkglU5wVbjbC{dT&v!<)L8Pmx{N zhi$%&@631af;$Q_Bn8xlJ@XuTavMR2vYab-&Dyy&I4}Fj`_Xv^?_|}gQ*~fvKsxW{ zE62j_1eL8^TSPVJWL_sGwzmn9u$xq zmaB)5lY5G=;%<3HPywbS;YU3OaK>g038YQNu&x#p|@l{d>>F zJzf!_l&*qVuDCG+5#-hE_$Z)One%ahFgO2)`JpJAuo1-%y>%l-t5Y7;$q(XupQ{AG zR;M`T+86gBnC3&b6|vyTRtT~QKq)I@@%CsTNQzOyU0y{7by&)0W%otO3i|a@rOSr^lQh0m}F#`-oDLfQ#@*Co>%M$INUJKJ1NpLP!{DaRNwPFR44z~5ObGs>dH*a-r zxDHa=c!&^Z4pf0+%=nJY9)Oe~h8b*5Im19(N_fMe^UD^-KAcR_<3-nnuwWUbP~Z0P z3pDYbW!?;{y-dKZZfC9aDPE6evV%V(+scdlu+ZC4A)n^NKEHlnYhH0Q=E7M+=Q$Ih-{Mi=MXY-T7`IWw6P}2=t z2Y)fN3I1l;&&jMeS-z!YpQhSe*^p3eajXLrGk+UST`~0xJ;;Q4j_5Nf#)lb@p)_!e zb%8L$Lk$z`%|{o?^w}s?WgRoka0Uiw&0_>%_pl;HiyQmZ(+YE|N59&O8+W3YrcKAF z<&90oNAW8rs$x|Su9FWkgy{bovYlc`6eLC70JYfVtmx(e4eatPR}u%jXqnEL{2f_? z&f&Dk3|SJp^}549y_#`pyS;PU``z7T-j>eo86u;J5vsA8&t=woB8c}pb|v+|0$ygO zrlyj zD{p`zSIx~0@%xSdyo3zR%XEnb1-5Pm2KZD+u_}#ZsibPFGU`U0aisp)_7xqUt8(}P zoRl~(weBNn6>pE~`AauSZ!5l(=RO>*N?kxTl2!MHvmxC{QPDcly-b+$KeDA7Z6iS= zH6GLt42S!Dj{d`@KARBilSM1-6VrD|=iAGgHM9;%!cueQCYXKs<8Af&mNYHM-dOz^ z-;tFOLvz?}xy{X!;GYq%0-V-Ib1E!kqEp=hT5BnOSMiY;>&hK$v$s?c$iLD#Fkz)| z-CQ6;hEkx!K*`e+hm8X8eE>V-)wlchr}a@Im>nii1#xuUnXBX7MzX(v=IHEN{{4+_B++K%_cCbKU?!jO9Q53V8 z4DXYa=OfYAkGUEnUCdr=ED*)XaLXILv5=FzyMKTFq~N1eUZ{vTmw5z#LCUD*u~YLg zqd239HNA+N*MW0EQ+pCC!&IsWGv4&tg#Pq;)@rf6h-Tf~P0ZRdm`?+vrUFB#C|`06 z!8lWRqd&WImH@HyX#}dFe&*~;xv|@{K*XlJ+at(&q<_;~#`fL|zm_SP?rAa+K5vPC zB0t#>br&n4^xtz_v*>L${jhd#+GWakS-xhWmQkGbdW!}JHps^DxVhyz131dZ1YaR8 zaGLRv1&13Fbh?s{l0wq4%Pls45(jCEQ`daD;wmjF59Z<$BD^IyA{A`b1eqomEQi;} zTC$tzc~3JNE1itJ&CC572a9FW=H#>?W|8NRSv% zwl!+0Oo3*;o{2cnA(7axy1jL|l#itP18`CG;)#;nt2D=hfDZbl*;D-WWFTCh-|u0Z$3&k5@%0f2PDqs=yaun)*$(^vrB2jB3f zWX{o_XKWF7EEr3mMyYT|0AMbIKeI4s$AD_b_Ylk^j&OW(#_|9n*Fn3Shx&Z-)NB>B zdX`R}eyVV~Ks-GZg@}TU*+B$C89+f&&zr`#kL(O2YUVLwU9o5!v~NnsSw4}b*u=GY?ty* z{hx1_U6OGvAU5E;7+}_-xiVCEI0HcT^JV~$48X@3D;`T`KZj*p8ZAV7;dCh7!WIaU zcd!xKzIST3PWKUF}M~}Ay`g4<#9k= z!gvYZ4t%iDze0!uJW%m}VDayd#VHE#%{avVi&C}hrPORxRF5f8Ys$pn zxD+@Wi1_dD|LfZ&Dzyy%cl$%i0vAduoqeDer^bQ*VxWuuX)IPWffHa#I=wA*POOd! z4aaOW(o?sze$$qXVypP`B|8rBw5{gBPnCEQe)&|(fHS9{;AtKaA}#jW-wN7iUf9%1XQXLc=gOif#Y7nB>;bT70f1xtUQkk; z>KmVP3Pt$;Iuo<^9vQOOG8``3&D7c@i%cT|c?FbykOft{uR9zz!Yz*n5?`{}MJe^S zqSO7yvLrvHj!c1h-Aixi$eXO6g!xUD{<7$LW1d_k4iX8cBRdmST8E?#2#Tc^LO>zEkSSyXQu;Zt{^WR~72l7e&sE3ffQE`YgGocOhU)2B#+8!I^#CI^Y{`cyj z=q8b;L(1Zl@j0g`wSr$1)4d&wLgzGezURA>TY`hd<>iaXhY#hQ&6hf|1|LnEetT3I zm`0gR^8iMqi%RDCQOvHszCdnS7Wv&4<4`U_Lvokzq6 z;(OjL-}pv1dEzitD`AUWO7J~3_~=nG88>&nYjTjWnYJ6JAoWLfsNb}^{<&$Ll;A>n z^a=^a;SHTE%z9N@A?cHzXH3c9uuFa@Q`C~9*C*CbuR(qFmv-PfAq6Y(K5Z@nFA49d zc+gF7p|9T+AD|*r&S@#gfI95c!}EFZvzN-PB))0iZbl9~c)%h$rvA>=^Tc0UA2dHlWwH2r3 z8=J(;m3K44b-kgWs4FXn>T5e2MEdw@@gnm$5dqvY6QhD%%e??f>5+$>vFrDS%A1;- zb4&gHj8ahl;{-n)MpX5ev(bG9Uze*~MUN7L8iMbS)4o=GkcS*Xi7}!MzDOfwDVqXW z3$bA)=65qP$OKruA8mkym`vUG{{pJzvhXb2QkR}a7P%o_~!=2=L*>@_=s}{ zp~!QE>AHF5her-GU(FYOT%?{~h3rL<94kp7do?ANtPX4Ach0RcR}$8SjTyGzuZVky zBX7JkdR3-#C$P{1JgQZB1$E(J{xuJ$kd>9~2K&Q{$2fgJ*(@f&bO&~6(>QQj3Ip&% zR#%h!sc#|ZL#!V1f!Ljy&R*)4s&8K0VGQ(o`yN+U)p;wj(PdYAyRm_TEe z1CX1+mtHa5w98!uwbm%!o`B)EOv@Luj{r=L>oAM-Kc4m2b&q^&Bw5Z^dYkn#(;5>( zOgKUHfRy38Hs1kb@2M6}rh|=PMF$ByjH{PKV=%`c7i=^9o_0uRXwl{v7s82`oc$)d zw7_n^DcOh{9;8Kg}yk+K6d!)bz{1)<@^LfQxn*1*}IbsrD(GeJ>-33IP^tULjXl$0EN$_dt3>O3#sYP;5qgzF7JkTSC8Oo50<8K} znfJ?X>%UqAU5nuGqap%f7xdcfB0FXUL)GY1Nr zX;||ZY4rAgT%7jOqh|Lo(P>9-8jQ#D+BlcNr}olsb0MR$+Vf=%Q&ea% z2(vf=$e9(S)7%@&#Ii7RmZWs9y2D8&Y%NhC(c}Z?`+*~p*H98%FNOt~`dlg3iB=7# zOFjDY5b+QC*c&p&FI;IHoXLZsn2;^)+WolWud0TEAot-zr3ms@MWbFh^suD%zj97w zZ0&~FxND2ZUW62x9HRQG`>QZDedfchW`^d?veBrtR|i~3gWy|xJo0V}awr}8=05s! zNe&+&GFFs%3jW@x7lLK$oHw@N?`oY{RrH(K5cHHm_TqRsQl)G>ub>I`68AqvdVs+I zkIy1!FZ=e~j0_Z9CX!t6cULCEjC%Xnz`&jsEcOlf4=o}| z#Xp(Xx)ljI%Fzm!TD@-=vFKBr$l1~V+^ZYbf@?XTIlyW*XFYF5XvVq@RC&v&;or&cT;&b+UabBX73B~ z-?R{zy#>v?mXRWp;5qgrD`-nK-21zoYxF>2y}#!jRy1c89I^#^ZJzT#HM;`~;oN+n=W<`HO^L&+~P-KH$SfdTDqQqI3e}+^j@HV5b7|p)(e; z8k6oQ);C8_%>yX^Scn7^@4pMfP@eibZ5(>wokV$o>}=fBsS0j&aF*q#5h(i5%}I2# zo`6T_)lcGW_Oo54X?#XdWokxA{D5=6Y_D~>k zBcjF}%!82dLqX%x&mDZ6wlN^LLOQiG!D7arO z&vd)jp4VA|PSoBv_$}~a=2I?>!>MQ~83%WS5PI9S0MalY@CEci;dV0s^G={FRGxK} z-sX@L0L{o0`v!8Pbu<)7Er7T8?&6Ce4h_(1f>&nT<6HU!mQKUU7OoqRgL5NcpmUbd z;Ja%3d=+|I&R{<9@xW;a#nXY$_}|78C^MPFMWfpFeXeyfUT4$8*UKfya&@7$@X+(P z`TGs)kCM4VFYBU@JcG+YeHBkX^}kPp(bv9}slrMXR;ms-7g^P#uYatfXo#v1PZl{m zUI7{e-Db4_pSd$uQpQWzF*GZmRD#{lCZ%Ea5Nzh;ArW}dMhgQ>ca&DPhzK+IiOX}D z;xW|cbJH)+KCh&eH1W8No(E|{a@VEox3GZ`@&4z}(rWq*h%hofZ14%hNI*d5g*_K0 z1*~Ftxh(+Dp&7EflCSV;=j$8Hc#ysKG(Q?{_K_nms2Zg0mBwh3Yx6&)1^-+RPZ~xD z)}v|1`C@F$W7!zG|LZJ(kYF)JD8R(T1m$DadEe>8f&gW|5P9FKrcc+w!BXw!;l}-$ z59TIUtvBWFIA0XYtZg1HN^no#wAYU4VE8D*Q#N;as3e{$M1dl;7KAw)Kz$t8ZXt{I zUsJPF_Zom#s^a#kJ`||+;~GNL%0?3&ApK=}Gar(+Uz%dpiER)^h8D86`K=lUI}E9i zO_m3myGqXERk+<4pL)D1v?+rfW{x{u3`JS5{!S#rluDhZ*cTi7S6MUDKPWKfx*0+5 zFEeOhJ;rl-hp6GSSUwKQAuK0txU{zC>7Lj0ah8MCpvQ?EW4+v7ZM0UG9&O5svZmeS zo$BzQh?1AbjK~C;6PS({WOp(J6ljy2Vutso{uc^vf{7QBPTWh*==w?)k%8 zn{W9upgv~voiQ(V9=@oJhIg}9dk%DXmlkV_zDsH@S)NZzW%62l8Oi^)KG5ih>OD4- z0Hd5;e{PHR`}wf`AhdB}%Iw{?+SBPr1-i@z@ z|2SzwoSzI^F7A!~WBk3Y-UN!F5!4*>yO1WsWP?6<9Bb_}AR7YuY7bu@P}oQ`Vex8* zUcwj;uKaWMU~0&7w3i+vT|z3=$Xn3mxkjEc;DJ{Sltj4sy_*WaTA(AII-jG z1rpfcey#;VaQI|==`OhhvS4$O7R7`0T~Twleu!h~ zc9I6tjyxXB=h*;!i+)4pBaQjT_W;wEZV%m1Su(WToSeLOU8fEGmZyZAPwxg&+H(s0wF8hiqrX!7> z;abE9mP6Vt!@D6ys-}Y<_CjUY7wRe0* zH)^Dx%aerei|j^=m#j40Hzz|z{qnujpc1;XQ6<}TF)2SKf*q`7X&!dXnxT>cK_aZE za&wVqd{1qeH7oAHNc~ZZuym;O-jn&}#gArV)({`X!2Z(2jZbdFYj{W?1jR(&YtsZE1D%ZEJY9h5Mj%D_%#-~dWPtz6 z+3XsiH-Q-E(`w93f1;fG#X*Sf>f(|cEU967pUB3ZJd^_?pmE4)?kU0dI4x*Vk#{Ic zpbIJX$=mq3HZzR2XnpnSTnZulhauOu!Y_4mYnG`a2sviBRZ!|ag=zW^##ac3Fv4 z0Dq24SDp=kU4o>!1EyEjK)?4?Qg({O(u$Mp+`)C~=% zcF10~>_yYX_vE(Jq%mW6k-0UAq=%!T^j*diV_()j(l@#JluH{>i&u8^Hn%dMN(o3; zea=>%ZK4NL(q()+8${2BMAC+#P9t}9n=smP;Y@n0JAM8KP#X?x;nYQGF;72s#*B^` ze@`2y6F`gbAT?+tl6++et>H~XP+`4TIYU|-uf7Cw;7~7_ETy;Cki^B84ERfEv@|-I2_B&}TwymwGWiFPX?d#ZQLQc~+ zjCvlQ!utI`nBIz5i=vx;rkONzKET?Sy%){Ap~m2wJytzP%GyhGv}SnArdH};qt)d^ zKCU@$MQOUGzY&-U5VI!)_eeN_@FuCLmqPJqqz9c%O2O=fWvui!F$!E}Pu4(Shw};u zR;Jt1Y&D=zJF?kFJ^0(!{?bQ7wScEnYjWY)t!Gnn8+`V2OMxN>l-*SQzu)&!$p&`f z?=ha*O{w^g)Y*;wq*#)W2p?S0(ckTh)0^A{;w+XP7Q29a$49uAj%KC2bo~IyNwM98 z@cgm}(}(h&VDcxDb6+k)UG28~1a8u%(wOrbgviB31BeziWhm%kHu6h)ix|rzUfapF z&8Uxuzd)O7D%k$_lq35YL+^3uaOa4Y31`siCD(Q_OI6E^{HqS z-(6(3TzqKm&3*Yz z{MYU^yuZG@zkG~~3I`T?`36M)U7L&Vf$-!isZ4;k&SXRW8q}b>1UyelgrU6TeNfF& z?dzwd;o&yEI8$0#xo39k&TH^I5cs2kDFSpv`()miK}1hV!pg%aFa7b#%5d)-q&;|! z2WJ6X`ie6d&Fd|E$3U?DeZbE3^62Ata5suG;&J2qo`-;Oa@?RG@PLjz_a}cUX$G7x_uqaUq$q~>qM;tVl!4@1Y^}&~(>c4oJ{dL6uzrJ@IGPvVEH0Tk3 z@c56E*qKRu^?KSHn2Xe^O%fx(b!3%DX{+;hyq!pjVuTR3I-Z@AVacD@-I5#K4 z`^=@P;!|U^FP1)BhB@$1dXI2noWF|ne|`IJGF>j@HeGMugB1D+dj4UlfEsspgm=no(vZKNAC=Y7~fUf z9g01F`MhiQYv4&+9&Q(`42F=v7YKg2%f8w3!Yn(d8Kbk{V5eN?M#DU>V z2F>zX1%Q3zEGj+iG|52TyPi_-DoTRcc(^(}gxWI#FM%N+v@?6cX!va?UKTd^N~9zd zJSY7(T9w^`=Obx1A|qlgfBU*7O$AGCvY#oByI(!p?2}mKtA4YlVIvnVhC%su-H0sf zNjwbd&d1x%jklJraUqRWPEJ*(g>CN^DTg?~ntq{JA4I_m69~Xl80+z(9^&fe{v*J8 zlq&s)1ZAdwk<@z#8_j#sJpy&kW|6d;4)ic-qSw47W>2pZk)yxGIa+=HsPv@ayi}s{ zNl`6$*6NzDGr4*t3C2msd{k~qM8*Xj`_<^f?nWuVyvBMYErzPmCr1`Nizxd&oNVS0 z$>K_mc}SLI=O07`0X-Ye)6umsli;rreVnPSZ-m`x--+6AeQDztjKY%o%~B)EjIwV!t12N37<37cxcn(i#4dZR!3 zQo)Gv_!?H72u0Kz&ai6NOZd`waR>Qm`uX3d5M&(8~DW-}=tgK@J zacciPY8Pqlw`p2 z_3*ygB}Cs+S%+J`RSfrc1sj}Z_b~t~YyLR~uyIDE&g)W75-y10DJ7bw?ovqqw1H3V zj6_kIFnJNd0anABHT=D>^O@twpc?xHJRif%UHz9GfcXW<>5wKUsO5Gfwc-7V$kzgE zsBkd8jd=w{%VZB}h=*l$>n~1miY1D%7cUkqfK}f!^fa_<7*Xg*tvRzA8>r9Y#fg1Z z39eK`Vw+NUd)D&b0R&~;Tc!SC*G6lTfrB3;s3*D_ycU+4kn?InW-?0Mx;9)y^*?TBf;osp1NBsH4lBCtaOE7 zBkP}Q4HGkwND~!)C@-$Gwg$!DgT@7nQYa9OWl`gl)EoSYVK0MgsMmM+c0F^M46NM% z{~jZ`ctSY#-IZ^QC?n)d#?=()UHmn@{z`&ckYdE*+GyD&R@K>tN+ zDFvEVFBzKsxPr)jr$1;!{#-@i8xzV}<)#hPsE+-$NcUVxad>S!0S4V_%VAwyc`q%D zXg^22ki`}6q%${I$Q+Xt+b;!UOrZWW(hL@$BttS&OWsYllE5>%sQvgu0o2G>?h+Xt zrmg?shgIi?^~)JM4i>o3>B?rV5O_j;W)RAiH<1)?7*w?Q4blu63=tzMgj!5riL8ph zFdIsg?A71YmV^{l2A}LzniY1kJQS0@^$xRw6XkNS)I>eJ_5p>$XsI?gsJY(|?)kg3 zu_Bk^Yn`XP^0fu*Qt*scbwW$NT}OFO&^m|*Ol}RYeK%@cSxl~nO0QIVzl2n*0_#&A zcpdUY6!EKUHUZphpyk0UitNw-O7>?SX9=K3v!kIH zc2dwGbeyIPKHJ)Gx(k(isiX6(LB8417>IyxuD(c?FciZK(7& zF{C;6Je0Mu>7Y(H4WIc%&ZW%LQh^=bOG< z5TO`mf(lQE?e)6w=qsS1@%J2rU=s@j$;Z2RvDe4S3yA*GF7XwJudbwh`^?_Mny;#p zm1Y00RhV}Z;=en+KEdj@)mdG=Idv+55G*>=Z>#fv@4cHeXMaZ^Mcnkdv4|;rGx}?d zY1UtplUEEjQ;!|qk21dS-um5KWX#COXzuSu0ZSs!XjNl;6XAABC_%mO^q8vFxGJ~q zR#kT0{h5XZ&c7h*9z#!3Hj8J_&IiAn(_~IJ*Dm%p8O^7lD9%SAQEzon=6lY9UFSkw z>upb{KlU`ec=W>Yu-ZzZ>Un``Z*|ekiHTP5rPWXo;nt}ZEYUReZU584l8l7Yhm8HY z3`ajtH{7mGgc z`a_Vq)dzt-t0xl1?<>A%cH`5$jDPek&vYQt={^ShXCvP-Km_8;{|{AP z9T!#9wL3$1hqNG_B1j4hEiGLFDm6&M0Mes^G)OlLAW~9N0s7kWw?!ota z@BQv?{_!XKoU_(CtM)#7KacqLps!P+cA_0@%_o4=N}s|)kN>j!d1My(Adn@HvXxz4+)c?HfYF`r$6 zTtM*slU(h&tvPvE*y!VZ*N)&0>qW8V8f856y0q=@o9#IZC;bT~h?~Yq_?6WXo~3;F z`s0)U>U{+#Wg0Qz2x^YrFuDE39yvP>$D9`1k;xGKV$Ecm8iUg~XXpG^Ued zlJ5!_AT>Wm*74S6Jbq$z{;S34#Yw=d;{qu|*1*S|LGq>Zrx)kUx&8^4mu)xxyRTmE zYI1%1p>qcqafkbHz~V5lNV!zF$^o_PZH&j-93$lkHjaG+a3N-jdzO%`fJR6;spLAo zf)H{d|CwnB7Iv_=R6Ngb~nhB*Gu$!J@r9q7i*d1vwTr9SPSB8u+a2TP?YscSf=B(II_OXqOxO_o$+}Ik;tK$_%ypAsp(5%AM42wr0!#u&?!FT9Da43i=CbVm8KqlvU2ilas)MK@eKOHa6;#1x2 ziC0brnZPn8>-{wJfY`?(5NTBT@eWE~+|_%)%1UKo+B;L*!pgE~rq6}G^`yoyL^eoA z8}qF5oTAC?0!4(jsM(^cMb!A7#8CljIof6AZ^yS(;U=Hvm_p}m;!Ls8>?S8X1dkuU zGWFY+fvto}I)=39Hv#)7wZ`r&I{XgY*`&y3D7*ZyGvkjvS*hLh! zIv%)8io0OC+r0stW`2J9?Rs?fG>W6|G-a~?4*fwpzJoi>^k<8)8!3putLN(C6=Tav z6T*!x$D8;7j<1T7y7XLnA~VNTNgPf=cRR;->Fuej-}twd{Esa)=%81tcG%bmW;x?W zGXWXh1z}`+{s4M&3RwG^eAB2FMZX_p=H12I?o5>EVL3bIlD`k822#XclWw3Trf#5Qy@yiWYPD ziQ6KEWOsPJtb2}A@9Sj_(liCs|E6uK7-+~VNHvn~XU~4Y`JB2)`90|jUvmD(>O>rc zmaMC}n3ME3-+XCkeSUpS!K)R05{6hdlhLkaD%h-h0ogGk%-EmePJbDfzp9%-B2Xue zuQskfTJ;S&K!__U#0Y#%q6ApV)gA|Zss20AVc&(UF!4{4ds|>y^YVlvWIR(N^7_mK%M$ z2n;D6=ZE#y0Ze)00mxQQuI~OkX`fyKxGQ3iAHmgbR1P_B#Ix2Sj-h<9t3)e8CV4M6 z*9tPEO@LOsD@gPMr~6yj+tIhWZf6Xa4!KTmmmtnQZ3r52VpQ%jQ`dRerz$x@xF^FY z4b%F%lrjNY5--}NOy)km>P5JWOg$n$P$N9iOjPAsUbbJEeJ|%h*~sUX0llc^04&Eb zk>5KGPF1*hy;(CfUXjLvx)UP$kXSPs81D?Ovt<6Q53U)!8m*-riYdP49_s$vD z&Z@PAJl=_Uo2<Y3Zs$NC!F&89brTJXN^l!a;>7rXzGxlB2y02 z6F*F19-$WN2cd<$u^KwIRImm3_jzUR#P=x!c%g-zGyKn5?!7f?$kd!5|GZdQ`w$1= zj}sWW@Z)Q23eG-6D(N2jz51vvL{#a|eiX!pO9=fM9vz9&$3{cHiLs7)2pCYna%oF& z`{nb)@3RYt_S=>7F#{@;5nqmwISU;Gi+FR-Y3rD<582*Y7Q{iOSx4fyzo615M;m;i z!V}?Ck(fUe3E~ga7!rQT%2=}WVKgO%e262HS2ItHtvpy%vM3bD;QTCv3&BKGF3CDi ztWCKwO5s~xvCSji*9}tq8Zxp#QF-yXs@{P)W!~xk{D6RL=kZRT7QpK6n#z!=jr zk*%&ezbv?v%A8{-R7(1y#v+G&nhe0NGWtxkgZZhYZXchi=uoly|9LSvzz)$`>d(wP zF&uSua;e}k1-h79q5$((8#*Ho;12?kPqOR~cM-ETO_5LD7%Uh=u9z#N$o*)A7|5G! zA26A#Owj-AV^`Y~-#Nc$R?eEr5~K`~i2?5W9`9juuKp~QY|GWahUcbRtR?9|WZHjk zqazH~G0Z&h8kKgbU~-s<7s6eCr1|jXoYwGJ$ET+aMNvH;a5nRGxCXLur`Zg8rKwbY zesZS*w53?Fe7j|%jl>@2vN&OtR|wn_wCTo*C1mvv>aY8vlqJh%&oPshFx?(yof{v1 znXWJCJS-Y-yMyr_udva+LVKppSB$6+pW0c1)Wm}==FtrSOO~WoG^3+;KZ5B&EpR<3m4vn~A3g%(|ZT#jrY=v^0aZGnGznwxubSpr?r!#?ES z7i~t{Od|J_dOnBj4zJVW#|!-&6UGKczf8XYT-CZ%aoRR3@#a1XT`-U+?-`b+hNlhX z6*3)t(X9H3ke8?Z<5>b>N-B!GV+7g3H378nUqfXGTI@UuCmr%0*wagESihhs{nLov zD8DSUD;NE8+FPNq^aN9?xkDHI1j1w^QnL8Unq`nec1E?=oNbU3&AqGCLgVgk7+J-- z=B;8^p#EhX$6`N#x;Hg``i$~9MPuqrz60BqAq#tQ zCF^ss?)V+yw#%8)2xT%e?)B;v43py_JYhGvS4YeL`YO!xBaHI{E~1{y1&bW_;HHoL zmM4$hF7r&skJcLAF}FklYF{6DDDsltN8yr7spihqMazmZ>6h|g1MD$VtopC$FwHPd zi2_Zr@-!rX{?g|dXzC<^2`wRV1gl)C2feh%kvR>p_8j6k*7NEu4M0Nfd7ma!859u+1XpQNfHjW|1rh#02LJF=CZnx48NX~WMcglZ` z*FUAPB;we7%8~?hH4(;Ai}&wLWVq+=-qEUbh5~Qy22NL5aD&wm>3kYoEtu({U@wJe zPXmk6?GG$WH`IEvFstixe3AX-cYW(Ff#ndtorAvX=K5|Al5Rr9xN|s8jb8fqcI)&n z;=n`wTsSfiu9AUsa(>yD@5-mF3R0^X zC>)QmjSNEa4;XpsK1$Rp*xA1_)2}G^{3hJRyq$#FD&IfT>W}Tt-0tphwX01TB6fsI zxlk-F;Y&NzdRr8Fg6YAJ$+K8-V+M%Irf(lxG*@CMhmT=YaTx=5c{-U8)AK{6%LOFYvSa&)k| zA%pNburbZ$LEJt0mUS!inP$a0aEQ*Wid!AfX=O!vd(09q0t4mHT!hvU|kM!0YL%}zLS_3C?pX7Tkkr=)+2v>asrzMmiv6(aC` zN5(F7osVEkYXu8sI1%yL+Mp$c6;|{13-KULNmF?Jgu?bLc$gDBJq-uBVIahE3Pz-W zILCv9OBXnt+Xc&yhGkzo5p&uvb6HGepG*Wt)b8*@)swC;gZ5na)Tf7kUOs>|=y-^S z5F56xe({X9N#*OgQ%#4BZn5);Z7M8Np<$#f^d3@OE{y3p{Z zCN3(`dN=LqbBkG+)(0#^<*9JDA9!xmkg}6tmkH{A&KlHHS~2GPBDt2*I&^#%jJ6!b24}qnAMGUl+=j;*j5<@0*<5ja5V4gG zv_%zTfaOVg2Of%LlSFq(`&Ds(4J9w-gg+iZ5xCP`Z8p*-^D_<@L9A`610$keUwTb! zKC0F}Jj=8_b}2wwj;rv-svuwn_QW#cmM# z+`)x4**0y+&P~#?%aJqD0_C^u3&QTJ%Do?p3{Ul7d)IH85g$ZMVuSs|NprOm6kS&w zp+LWG?8V_m&h7!DPv+39(R}71I4OgmI`EFnH|X26O3C4RZ{0#(C_!q!tnBCA6F@A# ztYmWb_#9iY_GLBN7=r$jfTYp>iL({z6{MKN8bDnt6`HPOH(93_F}`fvXH_-&PKX7t zzzdyErHtUemP`WL$_I+`qPS}CGIf7uK+sYK_1U)N*)al1dLHIUT2y6`ZER)1irS+P84|dpTko7E@4V*m z9O@|`^jsN|LfSD}srOl5&Rx(!MfLy0oPHB9OR7E~k@HKczIFW0 zu3*=py0l;^JzzruoL0>F3$nI6wzr60L3%&)s}~)+XH#hi#xxdw6gu)Da2mzda)d6X z&BMu|(VDy$gGa4AiUk*wM1@kOEK){Fx1nfeR~i_|UREfeHD$07f1h8v{fGtD^c0a@ zI>TBP->K=@YOoZ)kY=DS3b7Dg_@9lPT;#jmnsvJBl&6%cc`<{zU*g5@P!0X8G}tt2 z;lg3iRYTuZ;HcZ~h3u4S69Z1-rjivAS$b*i)8iU;$zqE>D2{I*DFKhDXo#6_cCoa| zuwx0AOHscBtoiVIW?k!2kO^E~@MnyeiCDjf!p~cj#X-IU`K`|I;AWUICp8ebS(Chy zR%#`KuRQZrI>c}3BePn$*A3_A7SBRtqcU{hwBj=P$;qbFBB5A(`#M8+y0jW};4oPE zIz6goNsghh%RMpo#<}Q=XXF8|>>6h!R(e0w%#&E6{i7geB3=}3k3uWl6={f>LFA=s zLI-Rw(|^`h(vrTAmtixP+PgdRl9AuldK3z;6-7>}Yh~qO(PT1|p6~v9deoGlU&*B6$ONrxe)gD&_484DbSDiR zM(vW68anON(!9&Cnj20BAjHqBjwhDm3NH+Hh<``168tk91padqLrMiAqo6L4L#Q~Q zvl}bZhz5Tov%9h5zSx-}xmC9sj@yi%G^Thh=npu?j<#$pC zICBWOH6puM^1og+FE3irKbrIUnZevyNC1C3(bMZE!0(#NWG#*exLnLepyu&-y7IPrG|r!46&$M9jM~-xYpiL zm@Ze9sv3N$2SEhcr*kltjbs#RNPJGLs>RH6GXxgFPhe_-Apy9enrt8i&~4eUfXVsS z8l{(9=v<3Pmj=1bUm{7ij5pTWUzsT9)XvRJO-Y6WcdrK=Jz!f&zmnErjvjcx$a~K; z2)K;F-!b$*Wf&|ci!YeoQLsm=<1nsqmrxib};>`1O=GUq2cr5NX z!tY4e%wNmNP;Qa{*zmb}{-p!+GZ+g{fD=db;F+CL=V~23Xj*CtE1izdh}Kzu z!Uu*DEYJLh?X#QJZWTdGxBOYReGtTq0cg`FmFKdv^Jaq3C)88K4%XO9gE3zHsr+lr zNJiGhHiZ~#E))=Yh?=;64G$wunAiwEPk#ssUMq-7#}(0lo)3%QK!{&|$oc)O(GI7~ zGwygH;AWgWd@@?m(R6}Xd{C-_kO?z_JHK=$E#hFlapVvBC4y&9U$l6 zGAoG5^7Se5-5u;&%I3ZS>Fi3_zLYlCUYBbjC8*#yRP;c_>4nXU0KfC{5KWypo#_7l z)($WQ`~#^mr3XTF`|ZEgn0}ve8U}ZHKr*_lc?_E$hzVb(Xme_cUiT-NJ#y0zgMn;r zkGmjOeqle?y)bvjk3|c|WU5H`Gat(Pd?f+vT;dl>Xt@S@!^WI!?H+3Gzn6T3ScG3` zPOknjFgic}Akf;Y9*229Gy97(6L=C5Q+R>>`w>kTji7Lz;k%riv@aL^nn8AqDM$ag z9R0QJVwE3N@M}ohr@3;3lIizo((B@)kqMGeR#Qp@6{ug=Uvm(qn=VQ#S}QItPDe*4 z&iYZN){q1?joj=nP)87HD4P`~?JPzlD7RLVspC1D1_XU`O2OK>?P*QNUk;Zpl0A@P z>1bq#8W_sd9zu}hQM+vZGY)c)2u0{D#(dE@HqmZ>m#Ni=4B|!z7T)q@3 z-o14qDG~6z7oo&#I$bbL7itbU#ZN3>34#luOjC5ku$<>j_#e%V{9h$RY;f`l=DO_p z>%C2)?rA6jM389%VLbTw)dPYi$avLT*fn@A_p;V~&7IMTXJ|R-QZm4>*)@SGZVh6**UZbAU z;fh*4gVo8=YaZz#5wXdxkJ31}xUzeSX~H5oT#`S8Oov3?Lg3)>=sr5e*bXbXw6+8Q z+Rr>Nhq3^56X0~0(9S{WWHP3GdrgLc(j9|jm$)tpRI?UF5_jGwJcqBj*?_@d_G{^W zax253d%5m`C!s7r4mx2eJ$O_a#wYCm5b7Mq18m1b{O%xeP)B>H9WFJ1K3B^-;3oR^ zp43o*akA;=gfT3{XTm|LQ=0jQQtGfz#AcjwF z&_hCWTv)SM89sWTVlghy6he=bRfpxid}J*poZUV#gvSd0PY_6~SV|8ehG7D##AyAZ z>)%q=K8!xn(%be=UtQnc3J0}-kFp-aMi7Djgre`^iYolO5(h>8?=n1A(7^zRCz0*iDT>@H3F2X=ow6E4TzI!y`h>2vD)0DT|tDa}mnM2UiYkJ)zM2U<|7 zTj|GWP%JCnt)tMZy$c;uYCw&Ue2)7l^KT^HCyIxL48UslR~;jINwn9HV``x`q$%S$ zIjaI*ULr1>pY0I>R)cDl`H6tB95bTLlQus_g^{9P8U^)_Vb{iWeMd0;Q}{pHPU9d< z7LM(qJ9JaPaYfA6C)<^|I^Js}N8UQ+Mp$T^40ST%z8%Rrjmu*FF}v0hZGCk^L&?27 z@zeYcPEz;c>_;L}Y<73KCwA)Xw=Yh=iGWRY7%pFH@Zi?&r{>C+bGttHwjoB214v5NiS<8FxLsq`u{9&TK zF|fbXxi;35r^`i0X~z6_>FMx2)=div)sMB92~#!awU`}C#>(pz?>cj`u-)ZzloG|3 zHSi9)`(;w=e5%<8b(D= z-N~Gs>&HC2QmxFnJWac*`n2O5FpwkT`)$%__CD%H>6(VQFh>U2`Wulrwt*P;v_+tw16k5+ zNiVG&?`DV*O}!EJIptZ(d`TR_j=H!)NJ^=!3_gYlnb3^aMY*~$k99SzAS~s6dSx$B zL`_ltZ)vq)u1?i*Q3FC#l_J>46f?`9j_Xox&&o;69i}%6HLk>%(^|TNElO9N$oXu{ zIqmo_UBg~%abyJ&U0=20XB-BL!ZSLdC9H#)t{R$aYp^X)#EGW&G$Ls|eP@Jc6jt{% zDs_L-L{DkC;I2CibZ5Bu+dK4k`hHUFe?JakdLrr5Si@nk;yjN&@TXF{jn4lB zCd8r{8N^^0w-fo`Fo~E7+GNi7m-aX&Kj7PBV%H3dsZayEZ*)JYZtr9L13QfG|~^=MhxxN%dokp3)F&D+P8 zk9eRvV_}_?N`g>y@#I+u#+n7pIB3q@VOLsd9g3!;|Bp0&a^Onlc3UKc?a53eBv6C# zFX?ehKL2OqWf8OW&!aL#5Wg5UjMObrM?qY)VRnC(s)J^@uFMHl5%Hns>z=*3Np6hpK zy_n~!$A9*wf*#;&0!<-p(t0fjhfIQy^vHa1fWxkZuWH)LTTibVVX(rZzHR= zhj3WUCDxwpdV9-Y0Qyvxecr7^D8AO+-d!&cj}MAwM9E>@>U#{iVub`QLFfKrHXmlm z#3bV)9=96wyfp||X=69fPtusR%g);Aj` zIT&VVkus;DGP=E(es8Mjs%!RF3cJZr{+Q=W@;&qN!uq~yT%}lt(XFS0StG8qDfqxT z2Xrns8&8G@$}}|3Z3-S~Ym`DUuu*I=UwypuF6Y+5&M#v;T^3T1mSd`eEyHT6!YF}r zzb^I4tpP#iq#6}Q(D^OCME>cez7-^v88EI$GFQZdUL|w zGwSphhYxfgH8*l!N-B!(E^XRo=e|Qm3nG0@MlOY&%6qz zW+vQaKV0!eY>dwcEb+NU{qKrFk6C*~Z9SB50aE+A3LpOww$`z_llgrS%$sKOa{?Xy z<`HZfqIsCpyIgFJxD99F81$u>&R^M4&X`KOyQXG%@ekXbS>26x)j|pf$DmA}l%_a( zABO0K_eB%G3m-@pg>p0IrjqKZz1*XZB|BU8|LCR}=`LUpU?G>?=R8j{D#iKxx7=lZpK!o_GY8rK-hL1X)gX zctDcRdCt3~pI^gLaYR{m#|H^!%gimP{1piozpDDCN{CD2`i)NTj_;R$iI(>sN|SUw z9>gE(jTk!`R^G8#Uq2pv?X4wf)>-fs^xeUvI9cJE=G`3g0P?^x5LgpzCH|+fLTlsS z1ZRn~hFASqK3?k46LJ-sI+o_6YvXh+-~LP|HBr$ua`~)omZVQQ3{m*wl03WICuocA zZJ68K4IikQ?BGKeDNTP5C$XisjQ^ULJz^AJ6JfV7+B1JQf}s^}z-4@P5_DY}NOtZE z-o!UL9=BZx1U)SnIK;a*!06!yp@#x{pW-w>j>fdj=v&wH9FoiS-gb5vD95j{tw%cc zU%eQSDmT`9F8&#hPb6Y>{6g0%our%+3!cvwewK{We2n(KfEC%K;pv&_i8d?5H`fsV zd=^D5sr-n7ZL8^%dxT{7+^dnlulIV5e_u>Gx_nE~j!&7_ly2L@{D6>x2e<`#tjdW% z5PT=OOs7s%oy=g*b=!GipoVFobNZAhRo<Du9 z^H&s}BlPfbR@NrBB5m1)DVg9|)a@V$V&YTK?QNjwW6X@wUuqi3X3oft={H8zY4^Y# z*Q*-Fai0{=f3)jgJyh`m32$?DXbdqWk ze~qJy6w1rFG95WTiumVXnRn4r(1FRvp{bH(Oe8@n)>f9{7 zRZxx$Xm;w#hO(9eCyLsc9O!$QOA!7Yo*VcK__Hwn35 zT-RE+{Vq~P0K4`skIX2(p))he@F7&L;hr)D1nq)}SU7{q?4Q+pb&LN_JHtQ-#xaAmw6%y-R0WiB{T2Nlv@Wa1OndX)Ql(bb0NswjyaGEy*e<34m|jK4<=W2#i-v3LDNZ@e5|`O z{EK?o_T}XH?7nJO%8sYopDy^D;DcF-%kr}gWwwKN9y7r@l|x*kCmr%Urg%FbuojzLb|`zaTTm?ab)EV}mqZt@#Y|JFQx`l-*wFl=v(_jEPEe6ij`r6Q z5Md=h+k7~}E1!!WHOHpzkl}~;RrHWPw{MM^cvOoJ2x~B;nIafX_-mJTov6<4(@`7P zix>7Daw`u8LJl%_g(OKg2gnVbdzowVOUa#J4c$X}c*qLLR4bKXS=fR|n7A0vK;C5p zyhBRu6o)VUb?orhpPxE3pn=wD-UF%2qC@I-sPclfjYdgG3ry5LyCZA$6|CWGg2SxO zjA8iTpF*28#oIglJ6^auffpoVw zQS{XZ3O-keNmww4=FY6F2i#8a7;xblKb*!OqM45=2X2nEOCX3|d|+9X#T(=B_;2N0 zeo2BSyA}+WnUdJ*B2WYhPU*lbGVP2!CSK!ka5p1UspL|!aCp*`_C=QW+mN$w2*Jq# z3KW_G<-ZB7eG%t2`@9aC5ol($yiF2kJA{E&IHN|cB7>ZshQmpnfAB&ECcmG`TxSLa z-p)0pFaQ}yZ7O7kaN`|{SmEG$>V34x>!F>cnh#+CkXl+u;NnwoV=X64gy!_HFDQ** z3=%kcc~FXvX7V#)0w}vvab<;h0x5v#p2{5NguvT2<`)mL732?q0$s@=3EmFE6y)@i zhoYCW9*_Fi)@w$O-a-)KDe$$^Vj&p?-6hQEl{t&|&^u(dFDe9p7%<(!AX;d!l z`{#IIK^F)8ZA(@1U`)&ND<(KAg#tfqk;kDFvleD=6Q4+{hXjC)%iJTF9LmtsTaop_ zJGr0_s$3u&Okce}F^p?~iz!1%%scbm^Yc6#z&hEx-VVPy^HSNlk+y{M_JY_8n2q##H)aj zi2HL%beWlTySNr4Xd*dXq_9^f4M^9qz#7L-ie7>R>2+%~?+nPv{ zS$6fIp|GCw4U2p?{uFMgs9a9PRlR1W110b}aQRixY1-LOD((5jNu6#kizODTh`*#Z zrr4;0WhKYHn#=I!q8PUk(e}@8BN0?HUP;`6^B%}I*FRMfJ zD0nN(oMl95SPy2O`?q1#H60tC68Mc2l{$Wamwvf^DRchk>_gkv`@87BGpa`TaIwRn z-cv_vz1!P+k)ST5Nq{fmWMF+oh+{TY#v^4VPqrW7?wG6$Fx>z=d#dYV>bb~-mgFYA zqe<9(5V>1I2&7XY2N6H@u)#k*#YZ#W&Ue89JJ)n1 z7izqioTyL{%;`y|!5?R-@d-<}0X{|yZ^t@>C9fAhJHq_8`qE4WbP;t=K`kV&w_lOx znd@H_&DO{+8Q+#@Gg7$c8xZIE-#{M$6w~gv=i912y?Ta+R;489;GLciRpK zy$}G$Py$zw+AxT-Y%jy2?)=YHq<1TE_cvrWWT3)BUfM}PRq*V}xH{=x$TT+k_3PNL z__(DEzyqIDwq6g?O|*@v!D(=C&i7^D4`ghRUQhoLze94tqQ-;_0l+GfKsmk^|4V z0C?c+1MF5zktFVN4BL^VJu536QW=_@W89OQAE|g)Fi@}$a_+CYaPhe~#RLUNEf>U@NZzUzdc~XeL*X5nLb)Ja zfGy^E{wN-p9b%B$cY;#t)C?clZ+>{kLt^YK&jr@{PZ+=&&0zx#N=TMyzWv`-yU+hD zDiZ<=QqHhtNnQ&)w52CfQF8CPrVh6pSza;yW)~aPf`OI?heWkcnEWJDC?0DeiCi#8 zGGn1+FyQT9-rUbf{DH&1>Lzsi7(xhw7Gv7|-8~!3^D<13S}){D8Rc7Ct0^Rj*9sPH zDHE`U73P<-g{x7?ZqRNdK1VDCh52IvV6yrBM$82(5LXd=Gru+y+NHakQH{B{(Zpb2 z5F*Dp8dV1!UMP-uq`mPTB?=>fO=MgM6`(zH7A3%aY{Va{l2}8YIBH;zEj!{daY>w4 zoqI8%4j6%@h3)Je4RcfGZv8K~LCN>qH55Q@DDs6`vH+M>xKzZiZgv}fBP~%~z6{Z* zI4$QQwJrTRL&SS;AGDLSP=N6EV3jRh+Uw9l%!}`~Rzyj*H~BK_vze+|GwcoHzxLLZ z6CAZYbatb1S%LzF8fyftv8Eq7zHZ22du@q?1;681x%0a9J-+;e^7};y1es`S6!XiL z4WQ)}#vpzzXol*fS4j2gyz|=f?+dy`o~02EyhBrRbkusSKe^bLSOGRM1j429)VacW zWLNRkE*sYQHr}Bz;e2Wr-l4|ccjG@sc%oS6A4C{wAJD}L8PuYnkl!{8z$R@vR(Ghn zrW*{UK@E?RhoM*jGLR4lC?N`?69DNSC3M+d)|}1Zli(e$^8z(0_=o&h^q@qte~H4L zs+f4DM+8dDev}Yfx|O-3tjl+!yyW?|$3V3P9^Z3XIQUR{7)s8QpcYkLLWAH^V1z*2 zUi6o~v@eA^m;b^M1sM|Y4(X`i!*67BU&_y{|C+mhT?B=EQzM%xUr3Iz@TGU5I5i{lcuqr@V8<*(C!|Y z^_TVcci_3vInc;^)1jzw)j3$9__P4HWX3ul)g|xaCa{rkIx-`iUa9wID`nv!fj~}w zhFrb;VeOMyi-Tw>_n>4nQG$Pk>2ODWE^o=w4O)r2F-j_YfjzAw6~{tljikxHP&q%? z5q750S6!h0@WWsB@*Ve$jt^S5eNp#Zzj~D6m)(TKF$P8qg`PU$bPkF8tEJ6d{_6(N zFx@{smvzZ(K*CxQZVj`HeQqoW+=#+Zn8Wbe_^szomE5l_MSQrQ^FHcsn;pXOrPFYZ1s5(LWRD=(SapJ~*?gdW8d6*Y9rO&c}AJekSn z#wUHwE;NpROs#f9FPO$rx`ehFV`sm$}Yol-w*RO}L;YFnjw9;RU7A-`Jz?OuH zX#DT`R%)8WI|c3Ra=%Bd%klFwtGS02hbwbvI#kf^@~^?2Ymc4Me{xN)lINqrCc7U_ zhcVC<@if}>V@aM+d+^B@Z~TdAYn^=2>8xONyu1zA3Ux)aeANSOzKQJ(BLa|PR>nh-{W(?&vyj1M{Kmfa+tiszIAxdJ7hN!`~${4ZLWl;jsbi1H~A5g*>w zKv_@If79jKO2QeORL92{;MY-l@U}Ig&*ZQ8{x+M?aB9wvtgIgoWwwL`Y`ioW>KhCn zqZ)U5cTlMz0o_N~kve@8Xy1I={?W%Cqivh2wE~stvvUV2><1A=mXy=gUJeVvnkOd@=qemdio5no^rN*pL0!^Bn@v}Wr&uu^W> z1n0Z8?;S*ie6EPvTN;9$igHSlo#OSU)K7bs`%V%9^&pU9n+HeRS9L;dX1x@=FH00B zJuS-3UF8;DeDwTdkB5+z15Fo+ z7dU)?<)@}(xl7s8qCUyuFq+!&PYuy-N(hA8t)plc{27wACCx?QY~f0J65G zFy^v20Q?NKm|fcr(LCq3#zwdqxqSV*k+?hDy&l+7>$myCL}7mFP5o3wn#%@`^UIf| z9uwmkjmldl4?)7Vn`adm5LoA*#kw81#VR*3;aF!L7DU`4`~vc+ihP z0a5vvXLY~ZA|Kd>!y0149~}^10mh)6&@vNaOCrEn=8`ma*aH&sF;~yYi?#bc6y?yJ z5HmhsgSPC`CMvY7fGY)+TubVwDfWw z`mfoJ$Coxz&x3x##6dl zw5O{Wh4(r-;_v{R)AnTk&Accsm_l)w16S!Aj06(}Y-Safyv!uCQ0Yue;B2~ThB_5NP( z5Mc`b>Iq5IYG^(pSrF)8!`dMNey}_GQwYeTEbjf1sQyYPAp4zl#oLCv|51GLiJoJjXu6vs5+;rx(nO=%sku5Jy0i1a!FAuRl53~) z2TN^pjdkwO(3Fq8{p{SqmAVqEgnK}$|87U(h49SMT2mH-A2Um?%={ha?n_xHG0LA1 z9Tq5;UDo1nrhjmjdtU2Laa~Zkw@?AS;$r$~RYq@N7I11#i`;GVInIV3PJG{(QH3 z2n#+-4ZiMvh^ka6;3W|$(kYIV@tGz@U0f6i&W=_rUCy3SOAHFZX{%?ZKh0^Zw%Hr* z2wuTuBcANM{&?s*j_B5&GbF$0+3}P@UFZmwSS=pBIJy&w+xCkt_wq8&TjP)am}2Re z&fIjC-zEjX#q6BZYIyN2G1a*Cf<9-<6^b~}$AHsOVotxhQ)|gjBOCO}?XC?Qf-;{t zl14HkoEvS}-9{sQQ|deW3uokYdq;OiwaF;VanZiwIoF;r5L<&$`}<9Q8H?@g(-6Un z!wkW>xQ6_N#-{MO77Z4LSii}eOxrSj5@Tcfh2ON29c@WQ;#eku~QvDnRrH))Le{+Z#ABWuYkeThEBMor_HvIvgl z=`+EII~;0qujHUw*B}T%P`JwaL~GNld*=h*a^N159VLKGVS*^|*JVe(^!c4M&irTj zXC`G?Td&5CX5S5+(!nms03FL5Ada#%LG>rZ%o`?6i_oM+yalx0xhNybK1PHGWFJZR z7!=#b3{egQ)Nk2?XZl;P(AU?bLUO@RTdP>^Vxs5QD@VCMk-l}|gJ%PFiZd_}8u*Fh z_ZqdKwGDg!pyMelQ7-ac2na4j#A<pF$>)g>fw~ ztfT}jlU+&g{*EslP=9>TD&a3j2gz=$n`4l3UFgNUJ=VW)NmWZMKM}VAS4JofcTJ8` z=sx@Ew2dSidSfk~1=>Obitg=IafP&0>w(MA^f3Qt1ZH>9MhXl>bCGaIHA-^qyMK$t zhgF6+WgGt1>~VrHA0XIW!c^mG@>5qxwz(+|ki(P74@Li`^|=ctRM?}R#u%>32!Hd~ zR^!o@-){eUeb5?#cRMaZ8T-(t;t$AG6p%L%8M^UB_danq|(#@l#QOid{aVaS?a{8Qn{ zg9$m~{&jySI-oT?w?$u&4g=6;U?fUGVJ8Ac?<)AFf8N>@%2^XJSoBGyd)(b%*%NiS z-QBXlfP>&q?;i{mQUZ;(Vi(ulAanq3}NA8dtR#;KoZwLToQuu@|ARAp!kf-(DCE`ku{A{>K zz>685QbD#sGN7ZV+Z6&|M`~~B1Bqt=sh&V%Ku`icTH2_VVH1<|cxs-LHIfjq8KRI@~)o8r*{<>ht>ro?A*h`<2ZhzgL>?T&a3Qo{Y_ zViun{m}*!j#emZyV-0HGN+^uZ@aFMV5Vh#)o_&>JT7r-WWy_mHK;Y>R(Ec-A zI@<4^J`@K5ZQrbKSM}NtpS^{cVaU(0A?y|JIk0^nu#=ft6bVWp1L6_7UK5d92`kx= z8+b_X^vb=?UuwW{Q6BUmxf-$Edg4&fiHHvyf*Adnorc#)U9CI1tIV?0fal$d@vS>B zpWcOaRv&OCN$=N>jiOvU{A=}IPCblrrx;bKl|rF5_Lsz5IkVATI^g)?Qp9)>jR8=Fw3F$m3}f5v8Lq%e)r$-LS_Xg z{3dmDY2FU2RJPuUOkc?_)_vs?CnJmJC8CarKj)2Dzk3=Ed7m;O`#>K9VY}(cOLAo5>p#5XG^7YrpA$w?(}>jXw`j7I|GGpcq*VRl*A>c zl{SXSFSm{PqH8aU;L&wzpIxa7UWiSsZetBSy`lrrCpb;_bE3;iv2ZCl;% zJjKm}EXpgiE;XH~6~v_LL;`N{>Ui8j=GPx27M4*0+g^cFPn(cs04mEr}8TY%zTEVu=?Fa6zn|M)_leMolCoU`xDnLXK^c_-iC-PZYm z*Mq67dr>#%f4hJE-`)ly?=}iZZq5VMjZiAKAPO0=ppR>v{)=rpd!(!KU#sr;9}c|e zj~2wH7zl8q$(b2D_n${;C05(Uu*x8CKZ^gU)PK(3PnQsB%WU~c5cX9zkcfKJ95?Za zN%()1ZJOpJ3!()~6cBb04E?#+q5VIGwj$;R9wkM7fF>$*-#;2zVi6!R80%1amnb-} z<;R^^D;8JTgsmEArwu}0T2i3U)r3K`d{w6O)v{+p3#@f3+%D%||3^Bxng@NIo}wZ@ zvN&6d34evV*zj#@#dIf$8lHn>NpACh^@5OIXevSy(4YZXd6l(V-Z{NmSx3p`VTOj` z_Ma(cGX0h**f2*vb2ovZT~5#!E5tOKRA&ZsEHNUUL)f{1e2ZKW{}GhfVeXa{ET-(= zqpun4JWm+tHpq-CXo7Pl=Si+LjLgi7Hx*TTyw*FhgMT??#N zUog63?D-$Q2iQNfF6AClHO z3cc4Ec<+{tW|SE$jE)jy+uERTzLk}VhaENLQ=uK9_|N-~Tg$J$e8d2>x0#q{4VA9m z(!sRS90~=<{5lvgppK2gKn#7Wj^a7ir@_$sn&cVd$?K;Lr+OT9<rZx=#O8qa`xrcr$7XlKSTT*?kNg7^~O#abHCSD;t4q%sMJ5^pTVOy`0(R zho%Oise?OpzD%{QuGkN4;3qJX5QC(I`LBmcjA&l^1drG(+AbKI&;jU(1-yx%ii)EU z`j?W|Uj+ey!IRd4)8bLm7h9sTe^MB%_A&5%EGA9Xy~IOYmKIK_ILtCUXa}NsEi{Co zid-0GXu36khnT3qPKx{Ui>Qicq+ks3quxzQn4N<2)Ob{@0$5<0;i{4U>(YGv^uziG z`&mS1=ra#TD^Fzj#nYU0(~8Jv-sGlxLdOA2oY8|eUWJAJ+Q{v1SlV+60}WGeY^YK_ z#qof{AgQsrWWi+3U>eM8cAmPw2`=-YYY_*tgI9Acq6pE`$~xi6lKn38Y4dci$I_O4 zBQg~dOwx~mFuwZLw?p%@bnTX|=%8^ajJ@#F{SRDa)tUwDqa0hl&{`hxfOOk{3N*DSiU|hCeGBrLWhTiXfk-^N(qWH zPRmL&p8pIM>f>C_AE(1V<-rH#yX)1Hs>7)FGn<(ue`{kp#i^(iNplohq~7mSGBdGg zW_{d}NdYE>m3Oov>ncBZEKD^lZA*-~4LWw1d`YKT=Nr(osY7E>pBtJbha?+1g;eE^ zN!T*4wd718Zb(p|^;5+ix3w~Nsa&*dJyhf(E_!p7(Ph>~ZYDX5=6O^5y+>h&d8=z- z{JtEukk@{*gZ9|F#V#6aS7(L7{D>;grkM@tUzNHQW<>T5$D7$DYcHxLS$0txI&U9* z0CdT{)>M(7uZd593mEWYzMChyIvns*=F2z>wQyHY8o(3X3LsGZU0EB5v-{n|9phsw zHY4mW%fWR}zwo{e5KdyEn^Z37mR|r)}7bvV`v* zk!d?kL2l-T0bN^}ti_VZK+PaX_$0MdSLz3iOv-Hf{!54iR?s^v_DynWnYg|>vGqtw zr8a}3@55X@JNTWAqLQ_b(|qZj+R{b~*7^NJ6+GuvnPnB=q1Yjw*Ms$&f8w-mY|bv9 zj;QgFg)1$w8jTNNnMv8?ZLgC8DaMk`>ayk8|HT4ihv*nz8b9-KKL3HhQp`~S?Hj0O zPdKiB1F(r}p8J$`Cy>~(zadWWBDFWn`K11{XJL0A|Eq@wg~{$7ors5LTYo$Tg=KE{U*^j1 zrBo1;MbaPNCPcX{07aErAFFpac`lnv^+zOK5igsyWxZbTz}|-8X%Q0~cv`t9RW#DC z0#6goQpoAXC{MX1m~SGRy0stouBwn1OF{*?GnY$dr=dB9 zw?_#s&Y&Fvxs+pCWdkQD4}#&$V=t5^P@rZ266caS6e!u2qDF8C>ZI;nDrNc`Aq}IU zuF-bNJxB+0Ct1%FK=|4XMWD#5Hs(-vWTHg%VQl&JXTPs6Y7xLU@%jc=DP0%lI-l)s zDRB*ZpQ*IB-)1t38Gsx=FxHo1(kp92R4}T(XM6!;z1n{n@z9+ZLRt}Eh4p7~)4#C9 z1aONUm}kLOg3gGMcTkE2Z33)}E7`jNW{`6eSv8dK<1+A;1l(6E$IX>B+GZYaK(;wk z;jhQEdHa$27k+XgBYXKtH6@KZCkxaka8bG?J}%!8CL1)Z#{K;}>9ET;A9R?nrtXz| zqKN1<#Lu-1ozwr|`r}n}-y3Bw|Duy0dfrT;I38&)>G1IeoS$`)ngyaJfxN8&#R|dq z#h_P8iEx;W^fSn~i<1B>=PjOllO3tC2oOR4l{AhyJXeuj_cgkIwkBzdKOqR#uOp`x z70+NLbi2j%8a)*xvGN;N2?Lz<$03}4OMszH(h7jsWA*XYE2a6Jh`&4k=B%ZL>^XZL zThSFY>FzS<8G!`k1fO3DP>sF{Re}5cub!XY$1$a^r9LzNgd-D4PWhs~Zqx8?^*Z3F zj&?)2Z7#|Y9Yuuahguodckq!M!ivn2^qP{D4G+KXRP=QOUvL?yz*T$q#n0XNM)lA9 z`aek`dt@6NYEhOyaq&Po1{1s#I=RNs6%`R#D_i!5g6YO#=T z@fF&w{30LkZc75GYX<8hrY&6c1Wi6dHW+1^vzZ^*Mv1JJl{SLI^c+amRXD~E#oVWR z>6SV3E!CC$R&u~ZQ!KHIW%-2Ch*nVv$orWKR;+krHBu6?Q}@S}?lKP3ar+j?_36fd zNqm}A_!Yqv{@BTCI)Gx+j56xlr+QLy?Ku29yFW^U8)Qkc(JiJ){DZadF*S9H1ZF4>^Ca$ z$Xd<;9_ji;ik?S=&K#klzb`Zb0BQZ-Mk+= zoP3HeflP!()=4L_8Cy$(WdasR)fk`;)5pgk_Uv3*+%@`5kOPBD^hmzMry=x2qa*B zO7eZ|ds9!dBZSkHx(=DnLu95`^F}~ziuad5Pg;Ml@+$B*81RQkQv2B*?(IhtyI;V- zZpI(ZDL&POl-qa`rB>m>K#_2-nIif5<2WSvfeZ*crR$fsH2_n_Ym}-2rI$y5_K}~x z*~#k@X7MhkTBTMY{SC2>rqRK7Os1n-nNTDx8-hqZAfCY#jQ{^Oy zVS>hoY>X&E>992DWp`QAB57`ZfA3F}LBXghCsO%QYFbw>kY5roaHwv1KrxjotLQjv zc(XoAB!8-XltYI(*VD6c=0W-+gK52@AN`Mi*i-!v_5v7ip<9BWoy#e)y8cs1Nn(N2 zH@a8PD@kjmYF-dMa-S#>D*R@9O&Z2d*k4klPz*%1<+@Uz)cLGnz@(H9(xtyvyj-1s z+89afk2_4nnm;_+b(49Optyb3I)8q8Ev~YIH5NHJ@q(tf>Ar#u9~Po`c<&#LuarwW zVezSpsN;EF}i~o%MP`qhC#v9a;7nj8!G(U??kV!pc8dGaf$Co1Dik^ z-aOZR93;WU)N}(r?Cq6l^KfqHzU_iC!+Bkknq-RC?N8C0+v$%qUNk_dEna{{bCEM; zFPlYrzS`8!AiK`0^jbs2mzTb2qE$L8cd!e4fXJ$n!~0h#h{h5bcR))(BNw{3eR-qy zXA{ex+|9FfsTMM)-5)EoOn)X}>ePq3F3iwE+gX}>Pk@O0bER-r$%b~A#xCTuNA=jU z-;hTBxz7}fr}(CE^q?LJJWz*lSS!FYOD+8a%Qdkyh3CX%!@-@UWyQfEp4Ddx_4!+%8Y*ZbwX*)y){twAX6o zugz%R=gj$=en89b^C}#(;YA>TZrH)hvl%8`yY=P54xzg}^^o5)zz1k>C;i~>smGr2 z;`t|)XN|#CgE~BcQZId%W3OJ&zQ0}ov?E^?j;$^JMNr?_<&JY_{u==rMzX{y|rqNZH|^wHYsg`INot^-&W) zFl|OXbXqp$GW^AfA<(;$oD`S2=E1H&D;Z_~W$c_FuSH6&=o~3@N20yjN#(sTq~mXg zmUHi=3Y*fbk*M+^*`xJno%@%r9Y18QK`pekv;V`ba^N!(G2T@XFoz^#{ks=U zEVJImw3c3wM@K~${_G-(PXm;i59!k*Q6AJFZ{x?fEsW^buC8Iiy68?2m6Fr+1oZ5F zSQ9w&qvtP`J#!C;9m8SsI3!!53m6C_=4I+4#^o*KqFt^0zE=n?ttj&%T#jKgdZF!E z`td}DHRM-rdXO%WWXXVv8a;;_Bsx3J5*eLJ3+YQ$mpbN@J>`AzjsdX8o7Uf8R?xq1 zGL`nRW4D#N0plHXaeA56l>!wn*%`} z)nP^mp2J8KmCeFD*~4$rRm!HY5a!!RX&ap^imlv9iU7qI+cCYK zd^R@rjZGV~lyt^8%y)R?hX!>jq51d>DcM|nbdjIs$&ESnsC8O!gEZF3|AL<+A$UL3 zCjV-Eus?^)3Tt>40~z&9QL87a!mRf$eT@wRE?Mr5|3E3Z1)#gpkV8!AUlX?yLVJio zh#tVG#3WONLzwU$#T%Wmk5wQM#jI=_6gKcN^M2*DtHf`bBvA~wF-ULY8=~3C0=nlh zh5|UG>*ZJpnv<>`kQN8O_x)bpp3qQK`tW{tBU^{FWaE4m4c@N7?uDLhE7S~zunWKV zBh^Cev6b=1{v^_6yvP@be4w3W(O(_%GXREjG-Vf&f{LiT2A2CyI=NdPr^6Iwg1 zj_FWO$sS+lxWAmVt9jGAXtj9y5+eJny6_X#dDbrVJDPoG5296z#dm4(a}MO)BdqC( z=2M!$%xo)Rw>30JeFg6av=Ytf+WI4t(6@}MxjpYWBgT&>twspxVhDb>{5Rp*@eo zx!uyMydKhH3Ux)~?2XqA{(A^z_UJgC!-LIoUJi;*52hg+o{nKBTKe}zBEEQJfo*{0 zDO#wqq;y5IF&4~S)A(K2>C*3#;UWt?Zv}qYm3a&fR)sUk$^E0`NT`^uXM~QpO-nMSoNhJ!3es+*m*LCc3v$_5SUb z@2z9qE5-gORlm&^O9QD>3HH{`TM?q%JeeUMXxAu;8-TMwRq6niZM|)5RX(7%HYRNS z;Hnhl{ajg`lH(ZmPJ44lE%2&lU`q3mJUNex?u}*rhS5R)2QDcV3vY@vLg>>Y+fvLD zG8Z$a(ZJnA#pHCckr#XaZ7_uuxj)pn z-OgvO5R13ib<&kxq~&yCV)QiI8H}1ZQNCzkGwbE7_2%AR&pQ%dR!?XMKg;-5EKUfZ z6aQ$fR<*57C-5YSP&hL3Fcg zD%LPJhQluLx;STe_uLMmzt+6@JETP;VLxW;XY_(s>MQOKqQ&{+t2hw!t8%=??vBRD zfx2CZ&!j_1D1FSq>Sl*TstT^dbWrp`pwT&@g`H`R90+RiZMsgc?d3rAd{y}1_)NW7 zKs8N(p=)?v>kx7lc;h$Xge?fXbVR8}*^JK0S)R)7B^z22(#0MrX9CC6uZn|UpX^Jy z$~&n@`ztWM&~M3lK$2HZWg-h@e2Eb-+z^Tax&HzGjicnuRuM^uLojHk8{1TE*WvtOC8X;Lup_U68EXt;g_hq2y%_it5i;&ot*h>|YX$_kH=61LYYAE%sAU+7 zf8_gKz3V=w?I!9I|Lh(+mun#J*RFd&lJGZPwt>GVcrB6O>pRX9(u|bBmY>MF=!b5G zl|A^Q4#62X1wvDV?_Ym<(I-2PdCS|YX-at%tb{37|9tTY$vupU%(^_VE@(Le$R>*W z32XI-MSc26%w8n${EJ2@ORX8If=HwCTSmq->va^J<)%D=~_MRx)a>VZT1`M zf9gM73hI$VmaRmse{?RLo27NBniU_|`_a_nFeJ#mTEu+l-+Sk4SkOX$?y`Z^utiYU z1-S9*itWXVGMNavaQwLzwXLGjDGu)H@Lz5KgbCzA~w_)D_SjQwL)U&U31SM&9aHR*2sUf`KMPse+cR9o_l zKim+weLPq$g{0Ng>B_nUQ^b7WoEwG{f6u1LfX>iT`|O1YG~%*SZn%2PKW(|qHfQ#3 zojPGFMJ}Lyn3plNv*9$yh+EPOH4`p=j27tZdRT5fLK9%i0(Jb z(Mf!rmO4gX%E6^pU#B|`FMR1;zC*-XZF&|^j>$ZJV2X^q4?{<#CUgKp-*?4{yK0h( zFv5_L@yPbbe*phB5O674TLM;?3KU4_P{8ot7l11!78o*%1Eh&S`PaII5S7{hD)Qd} z|C*X({@ecBtq28%mEg!Dx9DKx`2Gp>X8K>*69mY<1H-yoGYB0}sR3c^x4?hRMs%P& z1`LAYGN)y!DQKCKsHSNDGn_Yd;GLEnPNSAr1yak+VlPP;Ln{E_f1*iHrFu&F+2AD= z+}A<{|FuCz#Qe7}m#Zzou^hbkEAYM|lvzamO-1g-F6 zc)WLIOAymGK6~-&#ev^HMxm-Jo&K&TpPm6Y{$X z6#Ku3*x|}AdQp@qw7mRz$7}vvK0dsKb5_>&ThhO?M}aBHAyJ0UNBIf%iaKb=VLK|v zag=cBWP&T8MjZcj(L;-jRvmWp3y9B2MO{NcCru7M*^=)&HvJn2;GcfGyoI*DZM|z9 zPR+t_l&@Cjd1h7_lV{Hzu-A`sSh7^f82P`7A?kVzy|!+cLcI; zaR;+pbtj4gmdruXHj{FFQrfk0x z*p34u*PVx5)?gDhk7vMLkVtY@D^7vFB11(`nize%6FHi`S~?i#m5+MkEzn#geSd%&gi zy6DZn?m`W)2L)nru-$DN8XHqfKWZA7nPDOIAoRo~&|uSUTm~A+7^0}>joSJn`mB>5 zI5DmfM(=fhy>>7!%|(e|4STeE=JG?FMgb&K%WDeF@#`5(rsx~^!GkzeQs)L$afTe- zu)r33uiUhlXgsIWk#6B*z=!@xrSH-6g@b?dtHb7fuwp~)un`$Or+M}E+%>n0zfI+g#@f&enwX-B(Fz zi7R%thOD??Ebi!oGpK>am9A29)k;{rNJHX4JGOoqr;rz`rye4U^DFT*^-JvDCQngy zSo8mOFWSG#fcZXG3Y7B;T8L(fPgVmfmA;Cf9{UL9nPow{#VGqTFTX)MlJ|KZs7z&A z$px2Wp{Tfc>j@)zt5Pe$Db!2|&udJ*=ZSwO?S#2d*GI+&>zubteK^Sbdy!2ElG%l2 z(-jk$RmV@-V|#1a{svxt@N0vB6&F64TvzE+7l@8fD+G1$jUdMq;Dhx`KP>ITsz2dk z9$oTr3K2YcD*hc)&-c-acp;1GQc9yQcT_~6hp4%&KPj$ct)?ZLfv%{Hj+<5juRA6gSz!e4Z447Nwyt@MBgTgI@Q``=QEK(Cy~FoGP~WpL|2-nUJ?$ zo9$~I|V=RgYdit zDqd^qkI11&@~b=XvL0QH9Ehi4^{sz&vuMWf!b)H-PR z^E1Sf?wCpyT(Ysj?vx6qyOxXJef-&Z6MqRNV1iYvThC7gyms)h3~SVN5gGjCP)nPN z(ii`(6>Jw`No6s?gBLat|zY_(^!wFX@<@=uzg635Ui5VhCm+f)QyzfCdVi9wbd)AMb`*szB|rk=9O~Rf<&_ zHg8|Huvx1+`zyNzRjE^w$f4iw>4Cp;bUmq-74EVnCFIy9HV6};u`av0X;N9P#(4Xc8`j4H zm3uIAU7Lc+sk*STz`7a6l{D2bQS~b2sx-1Ou@QF)42`6PQWt_}RpPlZ;v%M`dQe4F z@32chKfm`YEcR+HafpBrcArjUta?{z7^V^ZcjIxMp#WFn%UGe)Oy8D^z?sQ_LzG() z5=AHnT}x-Nn|{#kih*W^A9{Z~4GAW~zAyNbXT`K+KEaq-eT|c)6kb>;DLGvA-wH1q z58PT$Ns8(fjaR=Uwnv?zn~q!t)`4lp?vJ19{XzwGSp#Spr0Mv4$$Sk*We;o;-R(A% z*d6}zdqkq8zW@5h;So0?M)2NK3`bhYluB6%2#lNWk@h^@M7$t1iDGF{A|-mNgsN!+*M`?T7p$KqLxpbgo`ml?1hvw;NG46V+M9!0}$>J z5fPny!gB#_&%k*bH^W28=F~~HOrQJwA6rmiHky{($f}58JpV0qxDiT&EO-BWng-qr zdWzje`A#8pxf(jS7B-Ap^%(^ax=wUSWr0{^ z>OZj+dRP-}e2P`rq9IEotT+ zV`9PNb+ZKYNNCghxWL+6l);On;N#vr0vnk~F4_~!03(E2w^T+Nc6<`KfJOQV77|Cq z;y)aJ0uTx50-*t-GDP1k#BYX&(*;IA2p`9?9GCdyalA<53)1((w+)uM%?z|c0Qj_5 zqD8Hc#}~HkDh~(r@BMSs3dzIy0L{6kxUWq;W^z+D$=;vxZG(f)0a<-6xUk!AKG)dj zkwtxFuo>`#yE-HM0U1jp z@Dz0stYF)IBzdz{tOl_V4IlJv-<(8MJW=$CeSdNvyZIu@IQi{mN^>4wsmJr*N}1rM zGp+Oc(*Zzc>uPmd*|=kJ~48O)T?GX}f+Qkj6J42^j9znJ-$ zY3+{8CM5^CWALHN=ztt9f-bM!MTV*g075hc&@T3-5B~rh0f5Q_VEGWtf$Dp>TGYcR?$&}1}E)(n@A2-`>V)PBpM|STAyN#A3xsTAO2f+x)c53L^WTx z3xl={Lg%2f1h^H3Q0p8(cj{3coT2b0HbTxBfacemtDSK!aXFe`(Fd20N%C?}A)!39 z6e_GfUJN9&O!qe(EH;%UnI-uEL>Pt;n1p`oCgCu|hHm8x5L~m%F__JBeJWN{IX-2w z{!v@%Gd(d>Sn&7w@^gtmc@SLm_ru_5yW{mv7bP00pQ%>+OcnK6G3jp|)Un z9N|b&9ivJD*O(8#4yZB5VSynDYLVK&L~`>7MgXed(`#$O!X0hn6$ffATR)2n!`w3Zw*+^r# z(=zAtssPND!b$fEkJ{L_R^I1Q`)WxHUydg`0ZsLr&kRvScIZESZcVSj?)a3tZBBxW zdICTxh_9_d5Om-_L&?8FQAUNO3~x^taY44z1a?aoy>?{rGB>T{Y5*ceJ?!4k54U_N zGi%K(yg#5*{=5~W5CnUfvwm9aV8wzqf61~L8dz#XnH1_7elDk^+J?;Rt-JuV!~349 zVfW63C3@B!%fAc~k%jEeRJ70U2mZw0nL@NAo{Lyx!m^z+Bq$jwv?e#3LcQPM1Ee0q zeFl(*`yW_{P-rZ`R2;P`J;36w+;4C>9uEiI*%7{{>#`!FLsY9;uy`aR{$tKEg^r@C zMs4E$dqK5u$Xgpn$HLsox$fw`L$MzVo(Vy=#)Bs2GR+k~{gHgT^i2OJ9_dTw0Ei7t zbZ8+Pl5qnF?qNX%P$Lxt0)iEfuY6G&oG=5etuU=7O>Wa;C@sEC`haBGH>3zelL`&+F@DN>cXnv{rV z4eiY_p{2+Q5TeFHnOTQ|)#;ol4Owk@ z(Z9@h2@uB0KMpStFUXE<^`vmZ@!?FgvE;y5Z_9ovgxaG~G2+7P>WKBm+3efH_R{PD{-Ttg@z^1aV-|7sRR%UmQ?Y z$2$ILcgY{mj@TjEKt4;aqFa*A%LiXu4+WFC zmJ8t(nrcqxZf}Y?6M|_D7n05${CJn#MCDzQPXG&0uDMD(VdC;OAHH5El>Zwu-iMD@ zbWqXrT*Ze{Hvo)EvluhgF6T?2eqO)HOknpUTX~vrV|>=&i#m9H_BV}{V>Z>wzq*lQ zvCM}jP3eCMHp>;A9C%b-sQns3H&Wwvn}`@v)_rb+3Of*yIJb^NRTZtW)%u`43^R)| z)%R@(+cHO(?!^x+;LvRCujofV?-%w4X!6%SI82FsZLSW=Ze)9Rxm0BC-_^u+uZM0gYxRoyL&qndLaxQ|m%E>)-G;v}O4C46bA=UCzIxp{~lM(EKZ~*H@pNlqUDjit%)^R9o)^ zngd1s6*Hz=-xv<4fi30%FQ3oNb-VHr#8K{c+iIoEQ2*ykY&(uY$x@$ZSOeWs!9q$x zjL6?*di|{BaLa>oovfx@HcM+R_S6N|W%RU6;jM3#n?ZE}=Df;xo?)}=ZwfRUhqqI;zbIKkSPR$Z*d&)reXJ6gli89iBlV7e<(l+{O~9Ho0j$5nYL2TF-b_blYS&v3*INGnwvJk)gjDg|of(zStu(%QU{Ic^~-C@Bfe2 z+mrz~9CpHwU@1^!;OJyuT7W_AmafH**`;`2wC)4d-7kihbc$P)z~Oy3gln2Am{I1d zYemd%@)U~@cC%2CK6jBrX(Avq2Ymx=)QW|B&pJ$Wxe-BgC&=J)@J?zm8}kOVz=Of-t5 zF&Rb&lqB@*giJgyF|p%KP87F~H{WZ>v{sb2;$6i{Q|C)1a2{1x%lc?hTo_!GO~se- zw9#!Gi1}PrD04&G8b|OE4w-Q}X~(^-N_AMxUHCVj)IVgQzq;RiJO_Gr<=YDyoqzqV zCabmnV|Uvym1awgQe99$^~x_y%<-G>p%ML(5->gBL@~R_f=AN_-jmG$+ncH}$;bKe zvTeBP$>0@h43hQb)=_%!cC@^M!!1*(^X$Omfxr=&P6C}t{oZEJq32#?{{W#%L=1%7 zLEd6iiE~jeCT}hJ@7KRL8riHPSza-B_&%vDX0InL+WF$>0v$REw+Af50v*mdHlqLy zE%Xl}5c(RhRMTaJNd#Hlj5k4V{cmeYG#>%T(X4m`XDz6a5c_}^(6%t&b$wcmU)J|$ z?C#ltRQl_mmMSTx1=6!R$SMaWLD*nb#yeLRdz3fJWi})PyUk@v(i#Btb0t|B;VANB zCIw0>ot~t)_7Hbv8%S;-qvq1>$LMR$GBIt_T7QN2`F`Xs0+A)|-Jj}Ib+KXYjJyIK zp^-0bvC!NBZW~bmCvvQ@FZmKAW z&WYxmldO^N?}JUtT&^3Xp&Q0yH-)osQY z9Pl9xk>cQttEicMnbjZRoB-TlCnYFV%rnfFPJ%6HVQAHM72-m3@{Hde6rCzCoMD+> zC>Pa#HB+h}e3GoY-U9AvDMcR0SMf}kpdHC4k%#_GnPgug&awH;b;wMb@Wy@77Z#LK zP#Zh`6LLR4qrVPh2fY(-`$nI};S=PSZ&M|}XZOm1Qvj*-(dTz zpGyHKB46O;*HTK^@HK8)SXQIM2!K7)>?IXh%gXJie)G5Cp8+ksS#tn~Nhim|UgJ*% zj&TN%hmrQ<~6sZZ#qoN6vh2)TqfuubTrJWM;IfCSEqynbbSO-$y0dDzz ziA;aPpW$pblY!64?`yX7>2Lc}PD44K1mS1tnwjmb0EDe7ueMP~qZS{(kl_Czj(Cd6 za2I?C0W60SgN^(TKnqc}k^ENS519y52X*j4vB;M`z)D>Dn3#w*aQwSrM&a2s4%GG( z)#1k>uYQE2^yh|P$!f9Jv!%kgRRa8CLxdX73}bgemTC|yLP0=E zTLZMGY9f0!04J|;NUkOo8td^*pdAMAIhSSzN`NhO6?)&vggu>CG&5{zt@r}Hsm@&T zj7P$2srJTxlg{xTiFm^f~nBhi1y0KC;DxKIos z`pbnQRD^3wZ4G4>=g@^zVgRoTv(wq`;uwkbVZ5PHG8X zctFOwOQdu94bMq$`5`Nf`8>*NuiCjx_8u;ct6Sw-L7MLGW*Ru;lvf4HBvOi|h%PG! zkd9s&qVDUY7YO!ICGaVk+bUBcaNM5XDVm2)TVtJ@VB}fevy!hw;p^Fk6|0;A;VA1x zV4^fu+gCcbdpRGK{dK0L?d7Tn>h^>^UgmvX!VUTBggWec?9{F{Ydm%#7-Vicy!y90 zJH5TNV1!($p!%OR{x|iBP+%$+lwfCd$YU!e8N>}7NiqUSY$Lg(K8vCNpI5r&kwIkZ zQrZvIMEh_2mok67Lz0wy=mnR$qDy^3u$MRQI`AYH zDWC9sD2Sr>C}xE`b^%3uDfSaw_&zCVY}%d}G)`&AkU}G5ICg2wYDXJx)8;ygLEhM6 zn-Hvv5{F=_U#2VmWWg#Be$s_6UlaN*dp>5WLw#EhAHMrQ1C@)s03vCIqD=*~ZgngP zp~>`n8Z=+TiSTXztN3SPpQ1L*>ZpkpaZ|?*>imqnuL<8Iz;jH!HIXpk zf@uT+uA9hew`STAYj<2^Xi!Vx+qcJc=_i0t_x@*cWKj15xqw&x>=SONPa}|IjFBUFcS$krh+ai$aiu z((7NWGzRIYqQk)yD7W;yg>UFK9*C0ePEj1p-?FDi&P|olm=Hi_4wuP1Uv**T2JYu9 z02)4}qr;w_XN{-3iKBF&bu^CuBnPo9C9{O|1 z{6z9*F-T%HO|x}$ICG9SR*(t^VDWV_L*tNkHZi^K*$&k!RPwF~LF>7pDcv z;Q)QFiXns4Ea!K?hH61e&6vXx=4G`#bcfNE>l3C~TE^|Y zKmQg|SKWX>K75fp+rZJ9-x&TEh&{tKh7V+p-J9R1&IxIJ18v;?02+u4Mr1d4kmLiV z7N=n}J|yc=#{MlVZ*N%xLWa>VIZzOQ?rajnV&g5e-NsXCe`;{T_fG`O=(kO4$1-IL z0w6bYK+-XcG{1OI(yk4=9x7!A3W5V8Nwuzq4;{@y)7?BDhdj4nD91t3msCw}0}6 z*7FbB@&?CEgmwYzAfH}!$#1AFtlL2ZTKzrV+iMuGmcBN*v4lE$K-B^b!?sr^d)cew z|ADR!aJ$O(vr8#{;gj3Jdm!vB%hr(x#4VK4v7&7f3Kk9ltg;mRE z$PEY!oZVFbTC;pC&LNL9TH3rdr%lQ zpI=rWg0h?E;^-FDp!3sl8J&?QwnD-d8@2DhR+?=10O3?Jg)%76oi>-));h64XTn`p z?x$Q5@CSwXfFaYrV4C!wj`5mC9r2ZJMUFaShiZ<#cY(3>Qh;`4@{NJpCE$XSlhD%7 zO>EdI^aZd_;1j01{cU#rM-}lQ_9F7-XKfaKWdaqAFnnEs&2Q*?EACwG+T_Gs1A)}2 z@a*NKnW004kGDhq9I;l*Nam5ZX&aq2@Y$1c&Ckx^loQcvwV_y z;ivL%{!6hD1%}zR6{av#cT3$5f=Xt0tK&d73t9Z(!L48K*^KIUwx9E)fH zTpPt@U(-&Z9F8tZ`%poL+jCJw-rqGo12^rgMY}4$+4KX5c&?Y@!F+xLGZW+#9+@B( z0M%wdLxbZ0N84bx21aOYKjQ+^_vyh+&R@C({9qhnTG;w;WuhMs8K!IlSu@UXW8k5* zY;c`kc&7&70ex*~9~YLPFMdjM?>q=_kidRBBh-I6xsinTdDqriOzENMmqW~&Su7IY zdUeF;QP_5^c`rGqxL`aF)>uS4|4!omzHklsLEQ21shIjg;RK zQ7EiBtXs29iDD!TW+xF!$PH`TA`509lR{}Ihe-~wpR(a{YIUAI5rf|@WM!iU{d7mN zY``#KhF)gev+uFef2#F3zHD>DGp`pMZg`1%me=GWs8SK|8c6-Fh?0yygm*#Y@lyO+ z)5fqB5YY1n+E*>7LR0o6Y=${8&|(>FjG6afmpN`U9d2-80iry`QIrlVHxNIE3L%zz zX!^AP<{f0^PL-==CW!+po@@>ltbg8ERkW+o!W|}gaJS`g=Kp^^5Ga->x#FRV{B2*# zo!8pz*w-3b-x!XwB|w4iFJBfLb04Z|yA#(c8W!#(sP5g8dzl=WN+6kruAV`TEPkqO z3f$6RzkY3=^9bYDQ^&`k*}z`{kDq{M!D)EDYvEjRL? zo-@&4w`U%PqkKQF!A9QU`SqAO-M`Cfb!Wy{(B5qQS_FVU08qni0#}3DK6OK<>;vjM zy1t^nFIhLbaM=og{7s4Hze{%LC$x4tLViPI0vDVp4^W z|7Bakm8g308fRbuRu+I2pD^beL59?H;La(3b7X^JevJqHWL2er$+8mU(gv%%*qJ~+ zYr#Kql)Euw(X<)AP8Hp$W5xl#kW{wH`kRrf4*Tc09la5xuMB%`ggWW-&gcdoai{g4 z!k}jn6u_*SiCem7Y|y6T=>?ai8Rvo_AHd~0L+grXrVWYH9o*wOy9)O zB+>uJ*L%mq)kST?WAq+1x)3G0h+antqDJo|dM`108=dGq2u6<{y%R)>Hi+J$kDf3} z2;Om*=YD?Q_kN#$oZp;%)>?b5wb$&~=i1i}nX+klF$C>kRFI5@TIPf0Pz*t+nxGJ&SgZjE)rZ3>dC+WZhAebuek@Trpy3ZS+ZKSdL4{12rVa38E*&ht1 zXzeUdI?+kcbAVFq6;+CG;0`H6;uc`6pPpe12p9W=0}Wr7+#fNN@6I3714Hfd=|DFb zI^nl`w>fCESe0J-xbIyYn0622e+Z!>UKKq_b`uZ-;WBLKa>NnB0Rg-Sg1$82`(~f< z1rG@5w34@?wsv_=|J1oKlg(ia*Kv7 zH|RubFiTVxRw8IRl|#X~)1-T>5pP`Frc;rBz+ZBF1H#u_6gt`4aYKja6KR^}(diZ5 zzqlQ(J=XYR$FFQm8EXh{_kAjDHz-=DK@pRrKJqjtjorWqHk&pyr)$OSZ-owTQPidX zD%u~86%TM)#+ebYUU$SI#GK0M@({7Yw5{m;wN6Vc@Vbq6xoIq??KEGhW*0EF7RZGQ zWBbr>*c~}fYM+-LEsN0Rb)B3hQv#sE59N6FhkJaxs2j(62*Vc7e*VU`zro$)k*QCl zJ=h=qF@E`BEBO+7$Nc;pSv8m52>{w$VG(W4Kfd6=tRBa!zQiwlY?S;b8I}LBS@5Ko--9MO~@lPq%Cv;r&tu`*i zl@mKO|M*@SyZgAkRyMBFCH8LXW9#rLT9RAUod3C~hm#v*$E8~rV2jV`d_&x(r6}19>(gxy>FzqFhSSF8RNG<)MH2(qEF#9rOHCWDK zt>>A{V_vlh!Y_RG8HFZ@P(}=R#^1#H=#= zH)Q3kC%^HtWkUsz1I&flFG{87@YZ4WeYB@?+Xo z&jR4jJ|+g0Grgi>niTGsOW=@D)OP{jUdqb*Idg9XJI8Jsvs_qxX zE^#dJs{v^+9+I2jA#bwcIM-yFpMunbRbryvD~Vy+a#!yF5%~^3<1l722e7ITao%Xv z?Y2tnTdUWGe;G03u(HD7?>ci`)y(pWkQS+8$CHFZC-)PMMb+RP}#xVZ^ne~#v|kf$Hm>}ixyK!q}wUdYrbA=z4|jy~do zPF^(I;MHS((zE0yJHo+$PuCsD-#(+kM*(YlF(VHOp(pI|2t@@KZk#1%E;ycatF!YEhXUQ<**Qi=w%{Zz0dUU#1_ z9H-C!<*Ef}0|mUgW6okFx?ubMtXJn@qy>e!LUuNgnT3+oecKX94=ODBaGP?cXO32U z<{JBU#!ngOU#DC%heeDSt6>Gw3lfC!eM zlPT&?9Kd~5!;tS51Tf=2M7_v-{7c#0#pZPmATBUbM;J9}_x5{cUl3RD{Ghp815X8@ zcyA6lcVao?d-lTd!-5|z+ON7zNVS|WDMLjjw};RmCY96h!@)-u*}{Z?_>|407`M(a z5tjF8a$4P6vV~wA^4OmRQRPPf)iPeis3)(LA0=TJ=sce#_*EAxvo1SXVjZ#QV76Vio6biAv=o`go*ug#0HzPK~ z-x3R4X{#HiH|k*Fx%(1CE_z9f({@Q3%0bTBdimJln-2-Y=@mB%kP3|-%hpN7+ALdk4qF}Q?T{_dgS5$^p~4NEkZcEI{Mj*Wxe$>Dr#7)Knq{`mqP`l zyq!nME0BxyEfRqb1Ptnd(Q_mEp*I%Tqk#`P2^b6r;2k&`QwP{6K^2zZWg`$#00mh zd@DNe&)w+|BmzzZ8WUPfryeCjH{BS4_ye*NV-t!pbF`5BD}wKbk*L^<ksR z1GbBsp0Ta>+~BFZ&Tp%2dpYKt9pM40Wh&)27f+E9aK{=h2YQ&gX7W&QvSaY+lJZAr zO-&qG{U?e)GV#!?p9t|gy^|ckcd^Kq$GH`KmnUX{?;Q7^6WgJk{nBKDppq>R`-R%F zI5Ii{|3&9EEd4zMFY{@1ZA2!;KbqU$pO|Nb0C|3d00*e7ojHRS5*`u*350&g5M*IQ zT8BhYKSbZ`i9ZrO4Ot+3=r#XONlO5rp8oIn0095?0|nXOLBbdV5~=-{6Zj(^0RVpo zlIK}h3^w4)A?8CKB5~Cy_&_9~KIA`zL3ex9m zyh@!2RHs5Rl~vzm;I=a$2Mz$~&kPQfoT5CWO|R%&O{460uWgQcr`!fsWg0%jn6|de z>Swu2*gNSSD7US}*^JS9-Dy<+;rs}$8gFH%U$d;iqvuwyt0&x6PgmiR+^!FL5jWPp zh5No{duDE~M$JO#VE;h&Unjp~gGT<5k`(tkcBVp?V1ah;#b+E1k&8hKl}S)VgZR4^ zqRp5WoC0Ymge#=0Q&yO`2Zn;1-!Gn34fdP=rbBWN)GWqA!EZp=-fXhw314YLX~(W&5F?= zs?#ymvD~W4EjW+DRV{*gousr6suXU29Jh4vmce(I8ryeuF{UIZiBQzqM1zxlYuOkB zF)`3vK*w;*^f4s2Uh)G4tXrgk`{y62_hjL(fWD)$xR<)3vmp-bdDO6Qop{Wv@xy?$ zhtY#PPezx%`xmc|)XnXs7B)Q8CLI2)-oD-}YJFyhyiZ1a$Q=!#cUtZ5UT<<*-R9;e z!5~-Bs?8Bbrziq#3>u1S`Wp0E8NGxY zoo=m4+g7()Hg&-8cl0@J)n-p0M!-83=&jeu9bA1kE({wbKu&PIv^FjK-8Qv*%u%Nd zO*AIL)aT62vA&SY$R&R1Ky9JZ+HQ933a_oDrUf$4VZ_Erm^kS0F-4Sda2)Q{#Hr=>7$> zVVv0{`s+-;F3j+1Fvx8lw2^(sw~gMq5J(}ROSAvBGaj-y@~(HuQIKK z6CxP*kM<7_RcnX|db@Uax#TT4s28D$1?S#$tmqee(@4T;l>i7Z{BG!v72yW#-z4F~9n<5WYk=h-4D z<s8?-6`(lyob{2lY`gkDx(ZJIXF z@WMi?ml->0o;-W}J=~@ia#t~`U=brdy~A{~;ut_@dh*6@3exm)6f$dMXxQbbqxb3% ze9_^<>=8)`3#e5`O{!WJQD}ei6@8QO5QWIZS$t(|r&{OiT6Angr4mAS29xzzm)@Md zypDTw$LqP;Zk-J2ayH@NtF-&AakkY#4i^gC(_WRcJ+J44&pj0V`jHI}2XPX^dgot< z0p#_YnY&YYrw!f79|Ls$m|)beDU-l-Uj(iBTWnw6F>$b=f&DmN;I~o6?T|nIo=^#? zP9w7S4|soW#eO^N`Dg!E$=frWjdE?^V$;N`?2iIBU;RZJG{n2#YYGF`CtFjP`|k)% zrUi$#$TuXMdJGsmsoUvzbC*yVkYz>UB7c^dk+tu3fJB(_YgE8&KmmkcusVjD|IY6W zwU}c)kH!uS(W%wshb*g!2F0g7wAvy@dHsjpJFSRP@uxLRtY&0E89j%WQ|Ji7v9U3! ztCY&+pg>SF_M}4%XYKevmeH0MuG<)n?Rjoj`7U~cC~k*+yKjw&dL86=*}Uu>2G}cO z6W?3sG(Kfu%1a)^(>T{mdGbA*$KkSh@e{lz_WjZ#*V$=G+q|;y5gxpjaHip9jqzNS zi!uM5hwGvwrqtdpi2emobUo%xTL~#FVH4%{1G0AWWjmgElk1LVzJ58hxgaR^KQ^P* zFeyCPd_S?;+RvX><<{Y6QyR#J7e+KO!VC6(!J0Kinw(inv!UNAh~8TqPOhYA$EG0u zgb@#TOyGt6i33#o&ijH|Bqi;-H9g*9Zsf>HKA4E zc2>9a7sZv0mzPz@(-%7R4~(=CN6kKfYcG@(o1I55+F23lhiCv;%kH}nKUSmI=L{vF z?|;lA0WbmEb4s;Sys|-h(BJ_5l_AuXhG^3O5Q@c0C+-bP;>aWyr?>i?RMm$Db&K4# z&fnAjY>~W4llH+|-92Hxoo23`5yUgH=oT0Dqs2D|fH-2t>!N=IYA)O+Y0iy6gWV&D z(QU7>qALX}1YDm5pe|O))H3pMCX{HdQm7Y9a`^ISO*XHUpu(F^R_`tXod-xdoiCcb zPF68+VBJx&N6Y!}7Grgse%uCf_>12WbBIuqK!B)~22`&|CDls#hlVf{{=8n;^DxeA zSpZeNOZKBx0;gLg0(VD%5LaQhO&spZhg;MJmsyOh9`E5FYrLZB$qAuu>!}&2K==vl z^nfrsIuQsKez|Lolh>6vGCk+0m^#uOCCN@!3unxyQA2hS zFbt5@$&N^5Ijj329k%H#>9pQL-L8K@9pCPi-Cpnof7JWU<^>tbqL70SABcs3@gr%8 z%kZ22Pc)LqRYFYYWlQ#th1h)?F(yDjjORM^z5Ok#BqUP;bd6Pw9)c7w};;_#llJ!9>K=vxwSy*JZ}z=_J2bXgXi_VwRsb{KBeo zQ;gpR1gKKn?xuK9wMLUjY$-ws9T&spw$63fKouF*u}MIF$t$@6;gX;6tex^jSAS}2 zYdb5+xuz{(1&IWVMenJsFir`58pU6nRz~5C6qcn5ji!7$d%rrOt(}bn#eUK4dlun( zHga~dYnuCb5xUl4D1kG$&8880$m+fS=y+=W`SL8M=d?Z$UZ}ndi1SI^4BV&e+x+Q# zg94{5{q>f6|IR(nh$?TFB)l(Rsw|ca#g{PTs=s}FZ-fza@?|=2*=Y`%H`u=1siFvu zqZ^k9&F2BBKM|u_@~_{BEs15AW_;&dt`a32a9?t6gWM~@sT8=KUgAv&q6gi~xrjO! zPDHw?7dcD`UGLJ3K_B6};BlR~?Iy+CZGilG=O=|>+C)sP;*W5WN1jf+ANnkwrR1|I z9xYgdq(*t!_#5E+>SQ7>h;qnyHKSwW6=|*GVS`PxXN5Yo#}P3orByp>+~DLYrZ*oU zSCYNlXip)g*3Ag2zm@rrK;0pn<~0@eVb?H+SMSMcyaM&wrZ!&?z$7+>^xC?roz?Ju zg_(HX=K%ffeQyIP)TpE6^a8`S$zMr)xzN96%M82tH!lEUEkRNS6Nb@qiasVmx5a^x zLd%|krkm+?6af-9d*xa9SkMJ0Bej&H{+K+jgRLZgJ8Y;yHY|U$AIoS{D0Zc3LxHL1 zYD|4T5haWE3ufyY1rLzFqAR97mUC4Uc?v?ufE!6s|4p4(NFxvEh1Z=|=seF@mUPtb zKoWWfWhBwXdmW5bN_4?~q>{jlYQf2vrhzFp%3xypBmrPFGt~ znm|FH;lh>=RE^2vzZlI^6q`e< zyy{XG2uV_`wUh%D9pMvK>hDHAa`DHpvSJs~){it}dbFV3zOD{g!9og6NK7~^ zu838QwuX?8>M=0~e6%f$QjH~tn4Za;E}55NiK;7ACP%CG_9s)w9G_p<-d5M0U!=e9 zx@AO%1`+0?h#H@w!n8@Ddr!lF4Q2we0sN>9bl0#tV$D9|Z<#;dqe1S7Rn}Wg-_;L2 zX{xTAJJ?QpP0}+A2qHWUEvPj@FI15LLuqjj4d!|Y`wPDuu+*288`FNJtzBK!oNP8L z0yOB6AVx>Ur$$HRf4#Vwwo9NP^l218HKgM6 z@23FxN;t%l29F1nkV+QLfQ>9>x5I$3@j%fR-JgH{G2)Rh)BliXV28#)_E4<*2 zWj3&7F_9a9Ao_e9?+j@InYb!a<^xP{B!1cIaNb4&kQQAO0y@8AbmHab)$n3I*vMYa zi-Mr6DjU?{5gZmo(sxN3(X5Jp6JirH_Pk5g^iK8A_cKP_%Ljnd%X}pOivx2qyzESkSl4MM6%l0@u-N%a_HYu4!zFIbUxkReeRDy;#X)4y4`Ik}N z4H#WZa2f23xp;HS`ReH|auiXY?^fSMvO>?8)|iwdm@=PB?}(}at`$C?7>sZ@YK-@A z=i%sES4a*V&U0{~X_K%CkZ*ReTLCgWsn*Ka9EbsJkdxQib7!CA$yAxC3X26^2`jkw zFs#lSneCm|4lXf7?oz`dR&m)ntKH=79QM8o8(9=x%7&NmOq&S3E6s0qlImj;`E4Q- z($^spzdLN;^{c~G1(WCUe5hU6(Ldu_VOR0X<4l*8k6|g^9ymC9HH0<$pw*qz#y0xX zm&A4r6apeoad;fwd(-Os(5+3hFbRZ5TA<~HGl~yaP}VRd52BIjgrV@uzzu5DXeN-y z!D#rG090Q#b^!v!$)K1|8nI81j0;w1R}Od#A4zVsOPnDnA*kXIb~12b4=R{^ZM)JG z6C#N_wn9cO1}ba8Eh7U&<;<{?z0L83%y~S=Z&&M~QePJj;y_I9Y2}JfXx+;P%7IR?=#@FpZ;w zbFc^W%@R6dHaYR~`{FVDlYY;tYSK|kd6UOi8q%-MybUhbZXY4=1Rg}257Q&+tQDWp zaa>!aE-$}{zPuiXNi%Q0V)RjYt?`l$L=usklbxNHmz|wmj8H+zde4praN;mLDy~3v z%8@ZC*38eaaZYf17V&!uTa8(sxB|D+zn&c+B$fkc7byWHz&Q0Gfh*a}Bj-+`1bEOG z#|qR2o$S$P>cK>t>QeA;Y2Wxsw4bXy|KJ7;%MkEB3JbgkR2^{JdWKO8P1h^V8-EHT^S+m-zE!^Zc?$ zff1A_Il3GcI5_#V%%d1H`B!qclCFGRjVbw>jpb=}QOUd@dK5hmbCo1o`H-`sWenM- z@3NtmkMb7)-IeFqBsC%BN-sN5!8ms4SBv&=I#FMFLo8p|8_bKPbtG2YOr3Fr_=}CH zGkch=ivOa(=(T;_TNau;a*L>Y{S1h_I&q zJh+l@*7G7%K^=!INL+qhI(Lo#{6$-jY^9s6yy9^O(605~ zaMtyso#s2gFaCGtIzra-rHDH@I!P8{X%uKU#aaYd{E_iUPtt8}2IVtHGnbzq!juZ5Kjh>75dq8LW~0xs90)mdFm1QK30z|BMMs(Xe-p$CBi zNfy)q+!yw^N}l+zEDgxh^fAFZ43PrD61niJq#Of z-Dd51O|>|WK8~GZz-JB({|GP%isn^SOsdF3vt=WO-d{3aGTbBC;>dqu*w%SZ<#6Wf zq1t!TS#M_#ehwE0WmtIN)JHuPzm@+|fDKJcOEbMJ4hjVzWWAVal7hU@U|t_BwjkX@{hJ$b%u z3>3;!likwf7`?CyNKAMA5h{T-&8q$;y?l1?P27>Pn5=4=sTBRXWr`QEd{z$LSu_yA zY@xVjtCe-uoF*Vtp`J&c|C&EOJ(38TkG9jW>m;3yp>mRJ1_sqv|JHpvkNTnXm3;6aaC5o?PJscmlkEh)wH^0$|GGoCma1jH3Z=p<@QfzU!ZI+GF zX5;0xX@d$b(mce1UJ45Y${XgsX(N1FW>0SVykz6+?%siXL{E z;Fef5vU6OG37Y6_)2nWZ)gOIXFMLoYizOuToh;fRo|Uzkx}3J2inOuU9o{qaeO!eq zr7*kS7yJWf*tLZm>5ONED&B*KpP<@W?<{(>& zOvy^W1&}B(Wfjx0z9SGN^n}FtqeZ-Ln5h;;k}UyUIW49^`?L121Uii!aO5Z7l~b|# zxrw`td9c5O(Ujc_B52NZ7-{SED@ZycilG|A1SNDcv*Hn%7vy3F4{%^<)W<&2rcG_q z%94aRa3tV$!UKRSTA63rn_d8Hbr(Cr0RhvnPKZ<*PX)GwyuP)G&RM*v^%21ECFIzt zgTAC44el1@hXM}Q;M;t0(`JwJI~R3?33Hg56%@3QDT_qP+LKSJ?Y`dsIbNM}?B9bN z(BBd>j(9jsP!N`C*jA+dhMGI%SfB|Ghs+(fMn^{f%%?b+o84t&1hy3w(^wk-W0Y&F z71MMQBw9DoKX{wet=-g$RLL2@HPGT~3gkVth)?xeo5Q&)>_-vp{gw3klWxyV4oUi| z)ZoF9Y|Z`X_aT#Qr?V(I_n)tigohSi8VK&RR?V&xXq>lgUw)4G`rs?$<|15>SP3@U zyYrNXTG{YXCigk$(t6*)<69@0f$b%)ir7=fUKmcsFbkdcgjT-2!{hijyjLkG*Im^< zyMO?ILep{Khh$aa+ZcOTT}WSpF>(XIZCjUJ5Tv{PS7(zF3Qxl;nL?BgWZQiEcit8rhr2Dm_U z)`o=brMKZ5(yg}Wwx`S#T7C%rD*9t}n?DlrbSdo)_G!8bxKD}4dSn|npZLAAL9{6q zOClFMp8#ITNo$MA%^ajleSz3xz}uM7A=OxbqYo@aLo@2Y22yO;I~<<@z)DJ3pBRgC zCuax)r~P+b_RpU%K7L|5{ZbI1DA#%;=xKtAARBcXs}aM18+1v;L|;hj;j}b6(z1B@ zlr@NfDlUJXV(ZFhhJ>&##{O!eCr}y70_dl|yOG?iZI-G;d<)Np<1r<$4b2zM3GQ0Cn+zonqY$;+(|UJQo3g zox3Y@e+DuTP+EsbE$p-oJ`^l8E^j!S;CP-$n8&q9xFFybb@WHI#3&UfXD``t)Ut2? z4-<+ciUiM3o>Z1j1&(k1|MWcl_VM_UPBWK!Lwqw3ypkMa#;C6+cf#55f)yl&{GR-!UAI_IvUZD_A(7*;-9O+?zFC`gn*q>yyyH zO!a!OOaKVcwS6yE0GJ*QK83-#M}>c?y5Ec!o-KmcT?f1w`xey^fO)@7b528y3MYVJ zPUskR`@t&da@=No2Xj>5TT0`%a^~WT`HOamjlagiz4S;+k%{6oqHY5V@ql!hO9(hB z6WDx~FUAPk2o-<=#>^O1NHn+hSy2q%Bfl#rD4=Pu;S!;U>RNY2QWAIV$FJjl>^VZ1 zQ-FkMDXy>5S3#t?0N8?d*9bR_#r+;Rbhs@@CaT{Hjiq3TQ_jvSGBK&XvS+|=-0mjS z6VRD74rN#^4iAA53<%{!`y5aW$p#y5DbP)?JJ;G6&t>ea4k2m-z*S{gd&;;% z0I;x%%e6%5#|-pPfYWVC2OP&dSOMUhSE3tEq25E&+z-lL@4p1mM~hK?U1*q`ZXW8zN$9k9aYz1HS>6%h$f5=2H}(yAz zH55N*l3@ki6uwa%wfqsgLwalXM)_6}tGoDyYcsHh3sm8T`mT`z#6G`rrTextbpJau ziDarf;Kp``h_<|uftCZ%_9>WKwyh&Y{6$UAqSGlsuvNe(#~z9?JN3Os$~j>SFMgAV zZ~GcOLYHXGeF3c$5J8^W{oo{9V9RUO%tRVufG_VWnL5Wh3#v_CFvf3fbVS1bQ$Qzr zF&sj%dC$w>|4#9v>4~#H?!dB+h~si^(1O@fE=#%~pxt3=xdBZEXSZ+i^{tZ3BK|eD zimYQ&^A#v;dhzs~IYd*V08;~vl${6DB6hNHa_i^%pGWuc_nQj~MZk{aQZaJtJi6%Ta?!8G!g1KszzA>Yo$5vY7x9mep^{|6?E%nYbf8>l= z7IRv$BP|1Y&8xI*C6^;cE2Plwgm~PA=H!KRxq`=;-2_Pf;sE?Pg4=MxVi!emGh0Q~ zQo5rypUr-bQWd0AwI|l4QvIEfskk*|Lt{O9dGVT0kyyny}LY`L4hDYVhZ&;BA@ zLC=BHOgp07r_;ghbth@-+io#IyPSO=C`<5h>?hpD)g?+*ajq`Wj2R~ET2(Gf{2f}j zrb}X1fH#$1`6+PQ;rW@|uk6(g+}DCN)k>dULK{nWoHCXCnoWRCxpFzKKQ9kgM2mKy z6gl7HiQ&0%l6#(On~PITi}P&Y3XI$`GjJRlfhGwvuxbVORbWKogng201z>?l-2v1&vt=5_`>5aEzEx^V&dF>u=F%`{LtI5_;zPGn<~xT(I9v+a0HsZphWt}}yZ&ZSR{A=&NtB#Y>o^*T>LH#5Dtv>)3x zS}o_RQ8v;$6`*bbS9M<)b)WU1I+VW2yc;>*&KNI1xSZ#Xr-@c;OQ5drynFm3sza0` zAEP5Crl*dK?{g8^VWZOztIt{TgFXqEhM0z-$Lg4zV|b~pWYv}#VPzNZ(pu>&+J@Ec zkll#PZmPn}Nju&D^kXmhU8sA`7~0=FeL;L3k;a(7+i7=Rr_BPn7#Z84y~R< zw~u($d1lP@kk8YZQ_9pLY32TUya(>ffaAAZCDX^v<)f~hI|Y*ORuvolS(xpHG=FiT z{^gqMjy}Jk(ikscfACj)Lcar{$LC3B^5xs~rpXap|I;TsnZKz6k(8Gp5+vy1A3{WI z{hy@&rInun`QX1XKwkdEXNeFAZ$!R_hQKlZV&O!7{D1o&hvx7cY3C&2gK-X! zOC-kSpC|sWLits(kb?eAn+NHU4}Mg8%f<50*&a451Wf<=3)xT4fJkT&00PReQTfKJ z<&*aVW?6BM7FcSxV`}K9b?wD6G)oU4gI?UCn$5Z;oOt0N8y%soqY&+fx%GooJ3CqtwTXZtWZ+E2B>S zNgqLkpMKFu;Ic)-e><6teCt@|A%hc`xY&0-e|B1Q1uKlcdWqIXv@T)!mq!Q@w-<8u=XOnbo+2;q%>%xX z!_!7hOak!zPFT(42I|{H&+WPnEKU@ynS%=I_DF+OGQRR<67D28MGk)*zpgt!2o1QM zvM%X<(^?T=9#jy?ED0xv$29ToHlO=Y+D%w?TntQ)9)y4@_M=E~!8f>1WB;>^9j$F; z2tUjD@*3PZ5x56ynEsWh*!!nc9?x%kJof93oNiS<`N)n!JL3dra2FeH+x4|K>+|e7 z1zmVofV+ZhGRM0QQW~vba=jz1<2_#&6((-;EBf_Xk%Xiu4~%QTIpt20 zqrdq(+&L0-BQs^h38Qs?_c*xZ-zuVm)sQau@~V6H=>l7_y9HEeTPm;fq=ncvQ{oIKy*2s@qLprG)47-Bf6xwNwJqtd%~GA*t3WuHdw8~<!{uY6qj!aoAK#8~a zB0q?2U)10t`Gt{xK$CD#g*4IH@lh1bb&U18t>3M!LP*_7A;~YDe83~cU2@wXb|Loxqdh$!EqBwhsjLTE^NEs!DKu|I(C1IB`cz=# z>(W`Sn;nAQ)zy(hlh|tE#aG^vN`WWnY)nBr2dgsXMts{@@_%d)MUFx`PSrZsgT$C+bUg8>9 zDeq0%Dd+uG`^el`DlaRm?fJ(5h0lfR>EM9ZrU%6qPKGqZEky#rTVL;;h3v8*s+r0gp%aODlyOAGTaLfjK_ z_@^4Ipnh5wE47KS>Pl;`5o|=49OsDmGa}mn?uw>c1#ED|*UCMA z6erDHv7xjY*2hDr0ZHf2fS*(yi!lM{*+2Ql|2XWWlEX!y>48#@`B0r~o(-S*Q`$s? z$>k|t?f-%_9XGgfLTzGy1iGBaYJj{JvN`Z=&(j=p2#)A(~UX^d78V0aV)2~BM=j%7 zj;Jk)w#xz-*18rZcoasvO*aVOo?IPov`wt4gDM4+Vb@{*YNmGK<`O`Bqyg9AG!&uzI!qMpOiol(G3!^^FoZ5Q(LP0B#S z0EXn{Z?EQ@iy^w%V`7`<5_hfT5ZxDVUyUC}SZP*~!d5>Hubc0%q(PgTNGYYqzH+8e%|nII9H@D`xxE!&R92okON zY|5AvR%2vQLp7s>QZ@dsqlsYl`FU|6&K&n0FrLhk&7gvxH#f5@sR45dQVg(#y{Zms z)nVfrvdNW;--9;02e($T8q%OVqB#asBpCT;5C%dvDYAdmJzDC7?Drq5-jkfzgbUNw zZbmmAGL?t9fPXtm4tr~uYwy*vv>S-NAt32zJKv#kuXi@qUs&O;bqF_??HM^uWIsy4 zRq>RI?eEFLqwpvAe?L8qVlt46tDyukWBG`VfrLk+BEimWIL489$m>3IG{l@pIO@Nl zYovrZ9milrYXY0lM`5J`qP%3G@Q_1^xiJ&)b2k`!u@& zvLIdBEd-Rv&mv>6;7v^vn2~;dk(eL5|AB7XDBIqc0ka+essF&aA0XEO82@j>9*q3g z1SCZJADA@~z8~>F81BFG`~kGj!&Z%)f%4u2|A*iHPs0OX+yUDr7zOF=2PkV)Bk^Hg)6`Rd*uEv5IVB@JwVPMN-q+HZrE$^<^iGjpsnHyk~Ht1 zYf9wQ`)@@0zrOlcYYjQ-;%?_%!U6s#wt=5SAcy`LhV#W8**UaC?tZ_M zQdlA%8$Rty%l80z*THC*I5;VmchIT1ZwUJ<0mg-(o%qdh1nrYV(Z>^3E@_d9sQVdiIENcF1=Wp)MrW0(LI-s>IOE! z=lgAEhu8s2rXQM3FE(RTzI3)C5xsA@4iBV^=$AYs%unP?Z=*1;Ehpm*{=7VJQNWc- z`Q3{uAJddLc}_U~vrO!UnkFDqg|%Laj6mA|`-=;i`s#$%3l~#$T0i&ri~Q2h_LBCS z@QUl3+u4=H z2LkleMDH9CFNh46oV^QJX+x_+ALi@-D&`CqR668UeVd)q^Ufu{p0F@{#@XWNq_E~&UvjWf zy;Kz!dVHrQERf@jPsJVJdKaQ~ky<=zyEuIo^gFrT_0Kb&iJwK>dyG(gd}_p*)iZcp zgfAg{;r6yYA$G&a9TQR2Vr#;494AQ{O@;|}eLbbI{T(uXbaFCS@^XV{?jrdj2A^_o zUZcTO5E@5Yj}|j)#=<0}varN^tKSihPIU0$cYvy?L6s!e;v0L$8M1V-F&)eX2m08{ zoz~7ai#xtI+~DD;-#xc$p$-Gh5<>j^86=tF7fK8_OMzRJ&b(tNU(kn!qJEpj20I&c zLG~S7=@=t z3#$$g78N!7sciH z<6PxjJwcE;s8v^0mpf){6zjI;?YVXcL=Qmj29U@lI6Wg?PUzdjCWb{&+Az>Zt2g`! z-gS8EuNxvr_M_xph`U z7*bvN-v6E%XqXXp76>lMi6emleujH6ZApEb`S?L^Ikvz5gQr}5o40YnEb8?r_NP~M z^^BS=HiJ@gFXc~nF(Pzh$y5csESE$sNCdmA=_b2~Qo@&qybZrTgMV^YGnI?}TE#l_ z4tk8+rU|Kr3OEsh z0jXKf^v9_((0e4vY;|Dxk@QA=MLBvURmt2y=NI4h*q+i*T_5FE z{+cdQ=IE6>6+h6IeYPNMRk`3LHX=c(sk>Y1&A1QAT?MM$E=XPCF}VLJ42RX#I9C>i zqW~qd>e?bDFp*cXnEcd*G8Vv>=|OvnjY6yPP2nX z2AJvA>|(sQG>$W7v-)L0AsRE4hoMZURbR>DmZwX6juCQ08>*wq3|1B-pA+*bgq|pc z1%t2%E#Tl7MIScX-VoIa<_f)A6zl0chW1tBZ3~qZqvpdp6TtzHYo z%$eD8PLlc43a8TAkv{zy7tFg<=hyegJ%{duYwyk|iN*V?Lr)wH9P8Jyy1Tr9A1yVQ zA^2`Q9;bH^TY9Ox!Xelc+e|l7aq=^90Z%JL)!qg~%JJ`p#Sa%!Z2RpT z=##DRaX*0>>_S(vO)^Qi7-0#D^dL$Sxz3I3>vMIw_ePYHLYp5p0DvD^AKt`e&&RkC z^-*B^7@ndp8Xp{A?CA(PId*xQi>uRE0ci#HZ3pbKi`_p)*=^1<`EuYbFJ zV>B29u0-L*8}4J=P9MoP)D{k{a0WMBQD>f;o@stDO$JeKd3MGU<11Ay(*JQY%ovcH zUs~Sbs)<{%zwk8g&-9Cp{%Fx+At!Bgw{|VoaceB%bf_EW_w;oP7C1Z6ny%?lz&_tv zLuOanM}W030MNp1sX6biSt?_$WLq3A9z0In9}wfW^89`6m&VmxCBI)U{EFt!LZ-hF zW2?&rTvJI1VI%mCq@>z2yy!%Lv`C*jw?#8++p|O#VgrxtOy*PtxnL^|Rtzu&)SFDS zwKH_lmK!FoUB4TCyEDxcPw0p5{dpyOrEV=>7e=uV>w<$Wj#5|{q3^9>eFM+c&S{%y zTQPlXNvV{ky6psSJwpV!+5dKXpP5MBdn^QNfym}LwVOkOi|C|O>oe!=_^vYZ5L5u< zpg^6FYE3oaJ6|@)9l$Hve_EatRulqq_%sr^Gg7YL+8#Lcj@3eI)SjpzOn2zp@Jx0J>rR}g5~5# zGmqNNonAkq4Vr0p6(%E&vCFe07h!wW>__S|K|*QHzbin#(GDV74`CQA#s(X)teH>g zU#bfZe0{6Atj7(T67K){dWBClf%)MFy|y;ASSx>Y{E3J@9p*&6`>_!gg5f32wKu(m zI$Nke^QssQ3A`4pr5)|H{`rw@X{dsuWSmyV>TN3obdMEWEf9Q11k8CFJOHa3)wYbr1x!t7NWCvN9}| z?DsB)7~lHf;M`jG@pp9Jc=%VAS6&Lk?q|lqo{~=j&Pkg-dL?MfLD#_h{FW#AQE0Kk z$lXVaFMo{W`Dcvwq_ZN{($|mwN_Ji2mFiUT_3xt_q~w?HkoG%sYvA({$cBgy@8!8`hhi zV$5GF_f53|$7W}DxcvQ74O06xq4-Vpmr;{qZg`>J0eT-j(KS7SXf>C3mpv+93mgFdu4l1_=P!56V-VVQ1jau7VGgBwiu^YvDd z*ek8KqB9tO+A%A^0V-zEpY!ulb0>L^nzxHx8<^M{7Ecnd#Yq#r=w7$X?Sp6chmcVK zKSgVsMJ}QOb68=TMuaZZ&2|&Dl3r3{*L7%y*TPi`wk<&#?9$NPsMXWQ0UDB`#o(%ctMk* zl({Re4gc6`l^h)S&<}7PL0)c|5t#Y?dtg9-DEdB>xPGDwB+$FTzfST%1%7?Sjq!NA zh*)?u3EntDQ73=?jIT_&dHAM7k_Qzy%}Si2jQ%(|-%{=^^s7L(d%&(tA}S88O_;{uh?hmwM%1n3!i%r$qhMDak!KZh%lPeKR^Z@||9F7>kk5ntYd4pkGoe z0&aA{)l(3Lfs7pNxC)O%q#*sgo2FSkI(xzHoHCdfltf?H(zpKNfJfS<7_{^}q`Xwx z&f3fD!BCn!^xtwDXg#H~>ef z4PjARx2xjB-g24h*)b=Nz~2!IMZUjCDhA(DjVrrZwGO+dcOr&kC|4^?UGL_(@||zB zgs@Z!S?VIPqY6qt{RK06j)#^XsIV9+88-SUHGiXs4+Sqc$v64}PSGLM1_&b$*hQ{Z z9NM)U4o~mc#%Xq|S_41k@==X~{`qpkV5SR-_z65RPx!AdKKkwdN>BnK3*0m<+}uqv zB*+%XkwM)_`7B~i@U@N7y#}4wIKb7KH$eXZS6!j&WU~@6+BJFg&008*!!eqaC>hXd zpNC^?>d{Ry(&X7Uwc#blFxG4(p9(q1r8(xelK|-$do-{Jrf*#&T)~k@(Fd#B^YbH) zno-rCV>Dhw>rXuXMK(BsJCL+|gf8O!ZO(-mI_7yTbkn?> z^&h|AGru*yHK-^Z;$8o~PxZs+pknvYhg>xGf=7GQ(SfC@Saz|f%?^o^E8mj}n3>cb zZNI!`PI!M(PFmJq+b#xu17Hy7bemNX+F>U!S!+J*DcN(!LP)0rrZIF@?bW=ne8cf>wkYk=OF-y$|P|p zcfau4*dLd!apn^*K3XMJTa!S22EWj&)624HPzSY;hf@sT1^?wLH9+( zx$yHT`dOM+D)gsf+b)2xH8X>*V}8Z$1YZ1u$+lDYOI*Is?!oAE3P2`QdNS?Q+7UEU zrXWFy$;MBh>t}c{z0Jbek$8D>$U1RWF&j%35WX&u^3P;)ccs==(Z%xLgQ z=JHC`+UMJ6#{1bqXZJ|AV6;`O{~H}69I6N%br!ll(tLs@nsR15F+ABvk~|Q8<8JUO zI5hWg2FM7$im`MTjyDCVHa}9!(lTIi^FtkD&hmd8=imQ8XF#l4C#k&LKe1C@A&E2= zB;;jX{==O+!~D_&Sf?H))qP>fWyI{4n>?Sqj$Odz^raePbw*4^doY)iLt`N6opi#(~4ugJvf7He^A4MVtcVI9New!yFPKLq{OW1!# z2k_qyP`{FJ+b{-(cV0DNi&AVcdi?F8^22dRrDy95DKz4@wl7mSu3 zCu|cs5U;cR`qNaqaB$xlp-q>ta8umrEw*Dcoy?vbMqInivC`U-0j5yMA6dAnDztkx zWA0olhbtE?aPCZ-6}a)z=USTUor?*+25RJ4NUqc^h~C0`X+aC4??A&03bknJ;OR9WS1i7%Ezm;wup$&;%a;k^vb8Xi0`4PCj|E zy!Q=!H8fsXnk0W|qA^`9LBSNa1lt|rVe6>=lI_NYDd3av^iJnG9i*9jXv$=usqcC} z))E1bSPaFHGu$)~hxx-+ELX?!X_ZM&xcYZCoR9VIFCWFp=0@Ho{6P-*Tk;rw913&3 znMv<9H9WPTnNENK*9OCAdnv1#&vPR#7~>6Q=VUj3SB#5Y ztj~6X=*^)sjUei&C&Ox0t+(RHbIi9AO1?BBPoa8vkN0m$U_;@@CzGt9DHGW4vAltuI6BT*Psx#Loku8@P5; zcpjxyB6D8@)I$$W^v0P4bWso8-r~0W@iXTv#lv_UG^L!yFS=}ymCneCE2k!|)!)$d z2JJsnq)r3jFMgdK7-stf46b54Jyxwt2XTUo-?{nPGI6J~hH{z~!JV)@Q#bc5!B+OI zmdy5#wYyna)(o;~g@viTdK@@GkSr=b7><#~qc5S3(GH?H_TR4)7;z=fmpTjYtKCuf ziRt*~)MW|s+K~9*2_}iB$;E6{QqP2*>YEwzu?MhD!9F^zsJ>*zZO-l1j#z@QGGkFuD4)X_^F8mlJ+@LUYDlses65=hq5Xv=)Q}0Guj3CJfrzMrfxcFe1+5>V zy##`Cw=14s-c`xQ=XkMj(U|T$4@-wi8F#%tb@#8~yVF&rVEb;u{Jo?SErM583{ZTz zE7eu?iw+&KV`&{SJhX+=M_XK&aj3KG#@MbiiRW+I$b#=8E0pKN;+9AV-F<3?V(bO7yS&7?JO_mb4+1!0DwugXI4BOLHhD`SU z7~iYh@|%fh2d6{!gwP`|DiLWZbj&`Uino#l^fnzZN4`tX>}r*Gq??}od*KueNZA?N z;~{7xYuKiX5fx^CJ99dop8jA>c*-f8&vwVP;prbcx!QD9(}ADAu!L*q+xAF-a1Q!- zqBZ~4zJ8P)E@jj0di0M!e@*aV(D6W5D>5(HmQ7!vL!qhzq-oSAqvK63D-f>8;Vr~i z==BMB?QAHKvTta~@ra>m>fFx#amNhM1R>nn07SSFRe~(>5RFH393ci`qHvKDvFLF< zf_kM*3Htmn(zVw@3ZAsuU-!2==Yi=-vs#))YRpzcxkl^0wv?(dWu2v(ktoVZH>rOC zorBTrL$K;mC1cd(H#=hs7KBB4a=ur18faQv*0Eb-_78LcwsN4w;E#KSqhPz>*JTz2 z0l~^(*bOPix3pVBeQ3HrnCU7AxUp_n7dj@a<6?vLs)GdGdtYVN8NImY7N4k3VSpjlAoQ9W1m`%p4)Wp(9h5X5hmz7AFnA_A<#LVvo4&s~BBLUr5 z|04mcz$(|4;5A{e2+?&7P9iFOf36vy1~)G|l7wayMFMETFh9ZeXKDPL%vg_zO!c#& z2Z{fdFfxrT`(SU5FuU6MB;FZK>F`_?Og^z;$1yBp)0gtMT9=q8*%gL)!IYa`nT0wo zYv_;^dbCb}E`s|5GzDY8q09*xx##RD*qd#Zl$iwQf?@GFkFqF(mhk^JrOnhhT&bK- zv6^An@_K8&wI7Hlm50p&?}q;iLNU51i)_Hf2z^GH^qY5d{MSDLS+XII{bfv*=#t=~ z`@g60Xo3YGf^edtQVvw!u^pQjZFbvVj6Q#G^@ZruFINi+tlQgU+UD=0z1Aut;S!>j zSFX?_8BLIrC0{p%VT?`o8rqV$U@~$@`Ur^vE&%}nXaQDMR&FYRF5G>8mySM=)CB~P z5@`Q}`-pG&gpdo{o%{Ep^a%~5gR!#`t-zsEqrCu0a{wp?78k#!--M#k67*=)CH&0O zjNGHl$K#d27f$|vdo4k~zEV^4R1`oLbpKm&A&}6!H_JJKV92le@h6^uq%%ekmJ8Rq zJ9V%xpmMO@| z_-fdvQ~w{S2$eiMw9e%-rSWXw+U1Io&|$V~{hD*b0?1zokndw`fzp@rD`kQd|9_UM zUjx7ltdidOw-niQri|(ny7G_Ool*QyG~6Rbhj9_Sv+L+{Iw|u!iLJF+z1&d|m0ZUv zX3xxgvy~c+kn>(|5H&HAS6a7y*}Edt@gsV2AdlmzQUl#=e;-nE<0?Zxsk%zdcd%~>a>;Cg!EfG5>;|HtIJ1&}dE&)5CzK{)M-E!}a| zSw0cj1LMEr2I#Kh$4!dt<%Qi&BTT3iUr+1AYl{2;7uG^sF;_6uothgeW1IyEY0jxn zex(eF=~l3X_cs{brcK$NuguaqI*ZLper_RpbJ#}7Fz2R@ z+fxck2$6kS``G~7p7nch&O5|we_&cXN&emDUkHi2*y2ZuT;uHNq8d4eCy_mjLza6o;y*!U`8=CCdhRqg?H63nyMcH~}Zl~sr0gc485 zai^7=p8)gM78K^ETV-El^cXW=+~HG+5KA{xgcY-B>S|svxiDK^By7~C)rNNOEHzLt z&WD9RX;>gJra)_>W)1^qo@^A^Dkr5l@2CJ9ZxUymr0g$D45Ywn?y}k4WJgpqnd&o3 zH7NYh7J;m=h8}M`>UmjEA>k6cXiw^A3iE3zp=9i7eB!$TC_}E^1Fyt}T^B^Ab#P>#b*3Y}oRfwa3jhz3RU)sTEBSA75J`?xNS;&C&rHu_4TOP>b<;smT3)A~Z z8WqFIWU0)Wl{rrzS&{F6TdL*Q2}Q<5IRE0pESpqu@S@8K8A3}Lc1BD+Ah{;L)!H7< zNA7BkJX;)`wnKOC+f z0w`yi;OiG<^*hd?y{$&LOWJZjJaLMSD}MPAExuY3G^BxsKKRw%%1jvXcf2CbC=uzo z`_8?topnXoQ*J%;X@e6D`N&I-C^&q3$#THeqp<_qk5xy%w?8$6UKo z!$lTEkJ?d#a)U!p~bZ=6oR|kf&TvA zcka&R$xZU?%*;D`*4ledCTpVKsVZW=AbSA-05IRYmQx1+FhBqRDjFK%lOzVz(8A&n@USfNlr$>$-&0P%0xy+!t_pphMJO; zgouokgoK!oQH-0L^Odusji4YeqZk(vAwCl$Jv9{t6(u=07drzzP2IOr32~9h(Ox=Q zs#k2xEX<7gIVl+_@o~{1{JdOdW=0(BtkAqHIaw(YVF76N=a`QXG&Gcq40KWwqINds z%uMv`uUH)IEGa3-czHPUvXUj1(^8W@%FBV?zLvAMwN!tn{6=QRM!L_RK3bX^d3iXIlM$O4>k;7N8tQB1WF!$2;p^*aWTz)OJ6P*# zt1HS&i;4&s8EA)n@K213urM=>3J+3MdGlI9Cdl7YRr$4zm8k$fkDIeyZf0^wu&VegG%+#K4e)b+LdQT)%huYAosGrC z$yP-}nT79FRYgg8>6eeu;c`lH8^4$R{k%U$LQal$8|tdvTpjjzHyOEE6XHK|a=dy1 zx%Yc}R77Z3NAu6A@$IcYL4m#=?#}VCQFF6XB}I8(3UgPM=9-&oj}ErEXFt_`tFW=Q z7#Zx@+*sol<@>d|C?F~1;9{Gal2}?&psxF#lbuaOMr?O`!_nTRy|qD7L8`X;>*?`c za#Fk%*lcoqXrQmlP+yylj+&8y_Ip>Wt%H@Rm9d_&PI&l-(cylHzK=@_(-4SHZf-^) zG%Gthojcl`FT=sh$5o&qkl)XMNm0niT>q8X8%{e_)v^%&0ykEDSw<;dS1%_f6*2!0 zezN09^sJ2R?8Wa*= z-yzcv6*SH^R=p~3WWr3Gjj+?E(%yCwl{ zP=9VYjlp%@y!C~TNw^!nBl0Lu%iggnRq0^;JK-Ynd{(j5T+ zAZTyZHd(JdLstRe!&pyS`UWTQo?0?>CVBj4x@kFyxZ|`tpP5a4@`|8+QQxFIHjg~z zp&i*nPwjS?V9|es8`FRP7^h@fjrTJi}hI+LosQ0CN zTPss>YGFR@J$?sY?OS$~=BHL>YXgiy)nHpTf!y{@4z-Gt(bW&dq3DQds1qsU=x{A9 z#OgHnxKHc|i~Gk@lK=qJr$IEZQ3IBNbQbD>c=KVuLHGc@rkJ;pkjT9H*zz_?e}R_j zTrbh!CSISFa&l9oOCAm)m@R+myqhe@y~IuHaf#11VK4f?t0xoN7gY!QJ|4 z8LKz(!=4;TZxGeFT@gX`5S9mtF(qR~I;wgaY40ta*7?a4A53(#O^+Sx3mo}hTW(_e zOJ(CF>Vgyx)EwZqmCINOQJZmu2^*YSGlmU2TmEYvg5{Rlfy4X-7*RLk&S$otS~QMY;}woqSms*o^bC|T9{L&ush zO%2^usS;A9#rIPi6f=l;;tKkE?7zdwY99tqOUT;jR;23|Cjv8wTMM-TLfuv~sf%TbZ?_mXPX4H%~nLElDTI4LN%+EKW-~`zlEL zZ)5jU!ypGjTwj^{>W_WDYsiRy#$K1n=1y37C1+W55wTo1X}E;Ti>QC_-t53NixobG z*c$(w9r`I@o-L>z{vVMkup-A_30}e^Y5O8K>lR#-V}C(#Xd^{LSx&v%E{f3f2kTay9G1moeD%kAzp3w0TDP) zB= z1!Rx#_Z=v2ZC-l3n6eeO6;N&9(cZ|M<&b-~ z#M+lO>lK3wBk!lcL{6M60!oyESf8`!HxER=*Hn@jMj(@z>gI2PvYB?PPpqkcNIGD8 z6r;ntmm#Z#9n?|_&an`zuQ4)%lw47e#%&utnC}aC+H+C{fx12)LbNf2YcatMsx4fd z3(iO$!2#%sg*9RH>~d!^KW={_on4!7{=T9Ms>P0lNIH+X5zmiU8DW<(k_Wb~rZtDr zf8G6ijSg3TPU|?ZqH8R$A{MYx0D}j=&7w)n0m*~L&kXaljC^UPLAYw{5y$KYgQow(|J}l={~3;R;X1 zeXZMYT-e`}-<7&1YjgF5Zr$zWzaX#iVOF)@gDd3^K_tE^yPtaVGO1tlb6MyRwV5;% zrQZjHL71K)$W;Pm-8*>WVl6?m?Rn*bJ8BFqLU9r_LFEouo^pph5@oh33E?FEdQNj{ zB^coIn!Z5=?j|)fSA&a_=GNUNebp7mmDln{)QioDBU-+T7)bojC>$9gEGAlj=F0qC z6suwbJd`A>t{2hZqdVHG&Q7f^Cc4DFt3}1dw}?7)be}n)*k!lDT|e}WTUr^68z|P; zVv_?!I4a0Xg{O5E)m^Q%FWj3G|2JPnkO4kSRu8paJ5b8&O-s$sLIse0b!35TtDR|O z?ZRR<5q5%~1Q&#f`Y?1;1cWx5l`yZ~$${Rv`75d|#ybOL{bA1ZKZ zU=35~bOp;=gX~9d>FvPcrh)0ODUm{^e4z^QEJ3Kiq_Y+qnw<#A^5HM$MXrnZLBP9DuR#yY>M ztqxrB3+}nT%yAGF7FxV)z-|W=Ok*lv%-^Rsp>o@VcZ9P~q^tH+fT^Tb86c3|<{{lBnnySkZA zOo|wPe{riT`|@S+4!_mMy8gSL**qEg%ZHf*{_nrm+Q@d2+rP$B*5?W#hf*^K(hvIi zuLVT}f6_8Cio3qLh3^lIN?t7bRde*vX6Vi>wSDcPo46G0fE@;#9n!=cW>R#1ukzkk zy0cpL_xbJYqj)G-i{b-B^y9sMqK**^c(0f-@~9+(_1ORL^;l$$)<1w#NBH<}aI@jL zprY!~{UgEBPLjdn*!Cc_wba%~@HY6b+k*U2#i*xnf1>x{kdR2?1;%oU|H?1wTXAr|50 zaW7|04S#{En^`FLR%Ng77S@L%i)umaufc+X^s%Y`v&>xgi0&Ik1sUYe-3Uc2Q0VNt z*VE97sZVgsE(Vf@8Tl^@;pyQu&;Rn_ns(5Zb+4Zh zBcJl5ajpObzLSJUiwG*j)m{+2^#*{Q-@K9b`z{iY)vksb7Qp4^qz*B5Z!rvSiDwLB zQYHwQa~&%inUs=;H>74BudcT1BzKu2V>bZ&%ng_zg4g-&M5_0XfJIC0yKoaON~kAf zbsFHvJx@S9!s@aEs3h(P$N=2`3dDnnf`U&b=l3770rv;{{s8`P+OSkO6(an;)Ye8L zM;Z|tY?>nW8XXqCJff1ULqBDEWQXX{m=ey$Y)92d;(Eqmz?s2{H+ zQ*HdKExfcx`pck_HqH_Svbiio%6~mD7QXDXk=fip>1qGNg~|PAl;zoFFhOBlA!{;E zD0MqeF?LqryZ|sWrgEx+HKV354tKiNgz#f5^Yz4j@yq1Pt8)G=l zDL7aE>vVpnXor}d#6WFE>|I2iy&f&n6RsqWLo%ju9M@uk7xU#qAA!9Z59D!EP@7}B z^aEsif?at1;P8{BV;Z&~sClWdz^s$Uxhi$2S@Zjas*?Zo16At8JBFk$j$bnWmhNpY ze4_l+DI}0%kJDSdhn~r1i$NIZuRWU3t6sJ8JIuu@;?+>D({s7Jq_*u3&?Ke!eni*ri{I~);fQyN_+q|R+yGRz(2gGs z(-X*t{pMi!_Mgpx0erKXd<)H?w6DZ7p$(=h3t-J-II9T~9hTrlBRA_;wwD zDK{Zt&6^%W>g<95jXPJ5lt-oLfLql8&qB{Igr6AK2e^-ZOcBB!dHmcpeC$dJXKZy! zYd5cpFdoVh+IykTxdk9gwxnKIlZYc?W&uf=tE_*(ay2>t57R(It4bSmh6!#lS5 z2&hH|Dn3$VcCr_MqsYxK>j0$;jvug$+8_WhyA&ocYkbAjTxS&}Sk_YT*-BJ{pCXb@ z3WWRN*0EoiH=&6$%eIA~ZgiX*>04NGP^@KaF8W_rz`n2=cG}ckSKh3bHD3w%_&vr6 z_U}OP52cMsg%9KupmH+zO}md2p=fcG@tb-LUFffSu?UmwOt4s1ne7qQa2MNiF?&h( zz-UmJUTk)8U}3+01A0Psenc2}-olLipIBxGCoH2!0A%(7-@u`22-rKxXi9DfRHIV+<@^-ji z(dzsZ?VibpDOeWl=;l_dKYv3&O}$4R@YV#m&$Nw9BIx%9FY+dy@*LmFdQ-6u*r=2N z8CqD!*GA^bk$d+bzs8VDa%bb_rpXd(uHrqA+dt(%y>BDg>E*AE4l^2Md3!O6tKZd+ zSieuZqyac%lPNl3U*|5pe>?k;1)zTwPA7y7b7S)7=KuvG3iw#RL*L>DEaKh0m_QDd zuA}jg{W@$xk_erb&HdH;!8+?5S%_23B)jJI8{_f$7Y_rXmqP^g83eV;CHkS78rJyY z5;%$ORdX~p9!eLbO7BJ=F_#FIys9^36yrGOP@2ko;ohkOFR(!|%1{71_argIs%~M25J_W!?UCG;Bcqm2^HGjg2Zo zuuMH^1yMs6D_}*`qpm{_2&?=vqaNCXk<3hq5}ao6?Hs>b=hhYX3*vl7#p{9B->}pH zneLW|CwG+dBR^1t6_RG&83xV0<9!*q_x6chY!Irnm5!xIk@L47?*rKV^XH@0thYj0 z)&y_qU1}Fs)Nx1h0pp%dF(89mZ5rorK(*{EASihmA&=6ExP#U}H!#GHS?c z99HJ~9#AhbkBS?>_iOYId#9Cw+*fC>Ijtxc{{KTq?T`k&!DlwsA=C>>?E>!Q0cT>Q zImvf--vKIXc?N|;ionGL9ADlr95M}a7ij{HHdfHUO9Ci$@?JSjwjx|yp@|u7-@Kg4 z*vXQsWGXDX=5%1H462J5h??)uJJnDPC4JG@H9FqPS|nwv6!9321}gvj6_9CX_{&5n zARg!Uw!v6xv2DEr&AoC!No<62rwP4W5*QOL#Sw7UcXM;IOS<<13mX;2Bp&Qzjz2s1lI1zg%HR+I~xq^K-fKc@F zJQ{I^PGuPP9Yfsq3kXF)4rne(7#gYX5`j)=@D=|pMAf!}U&mlW)VoUr?rAiQgZAVS1D4W;50Q!wd zKYu}v3{#u zqsDX&#*zr;a5lbG`QGmBbk8`40%L6WgUPBkbbGJ9Q59tZ`m0Wzwf3`e_wyP?1 z9eEbL-abJNVxVBF%!WijoI>Xo0?bzra;>JG@ckV>gcFd6Q62pYid&n6e1;QY1>o-7 zeubMTBoS8322!kt(MYFIX6a*RBdcPnwjrK*Qn@31Bl7R;9xb6!`L6JAm-T^|ei?(t z+@+fKmro?>wN)Ul7tUL+(|jW7cV(0j*-@eUJEA&fq5?EX%sPKe>yH%x9^v^w{$P?k zvFNMmL5U`?ta#pzFuM|WxlWrwL5~Xx*ouZ|BZr{%fJT3P3PXX*utDJOaw6doUBuE_ zkk*_@ofWl6X(=_uG8WFy5mf|m!>I#+3QwHRy7Gkb^X`!szTGB}fAniipcj>6GGE{R zOQ;yxbzvNE2Fi@k@n>06x|hjHZk?cY3WfQ{HnFOrbU*Md8LNqfI*j9+y4KA4&^gYhb|Ntrf$-y{_8Fz_?6IRKrSChs7H=1n4KyL z1qQ_7%bX5?7vf;uXrpx75bAy6Fc`}@P-FJadjZ4cFidKONbbF08TV?j?g8ZVUTV_8 z3_}+r7?y++-#UC2!SebQ>W&=+jo>9eAv_$Rtt>(@08ypjXQ<0crI+ujGiF2*Ttyc) zJhLJm3r6QvMC3TAOvDwCq8JN#4`lY!q^?LyI5b=mkcfA}0<2$bX(CsMX{c&tFyHcnt*Xqjehn@6!hB%yU3#mR zsK3JVan5%h+M_K%LR4Vo)-Ih-u>WnBKQ1^aH%_htZRQjY8M-i8tT1W)=j*rnjAHIw zjjl+k`sg=LJYWMZ#^n_PJ(#;CuYD=IjT=0ASxh8(i}urn`??xsafHMc)(D-Fp&t(~ z)qa@ebm7nJT!q9$<9>&=<)aCai{;*@$-I_1$MHQ6Q>F;9<)jD6mx9WFkl( zc6-#34Y^b`OC05QD-!6s^PjTr!&R!4a$r4=jpQlms_)nUEwI(rHNN`LALJ~U5xvJ5 z_4m{SrPu=^>GMEd)5(?5-6(f-;n@2XH=j1Fl#7mR3Lv@>wut~uu1Fn-GOP?DfON{& zFbnaJM-m|#<(w_@Cp!QFZ%w#FHZ6aabt49-=L62tibY~`Z89fU$a>*# z;p=e#I2k51rmy5D+_F)%*UC~kkV2_WE)E0q%1ehP!N?sArhNX*0bS@RE2KAhy~^m* zx)(4g3vYuOXtGH|X2mY+4%h4My`r3&D8?(%V4f}$cF>`!4{DM?nmm6u4QZ%xg(4=o z=Hd=Ro58Y9q$UdHutEfL@Gb$0J_Y2iq;c+_MKTo!|wU3lz=-K8U$3SyPKAb-;fz9z* z=X*D~0r4Fb5=Ot>e!>@E>s z8&IkaY2mmMOtq=b?Q{izBQm@GDsp@rvMx%r0-Q;d7h$n^qkvI*h2m~$Po9@-rf4OTnI`nd$Gf&VPGI0(uJjjbzYcvA* zeFL5%#Wps`A=DdS;BCyVLHQB)Z`06ViobM0ZzD0o8)MYAOuOgNum2dJK#7}4K9oqh zn1jszFb%1t0IWkPwnAH4IkjR}NZ#ZwK`aXsE;|4m#2XD}W91|1H^Qmb(S(Tn8WJmZ zu8z&DTk-5RE*WB=@A9+gtPar$To50{}_-( zX_DB`#@xG==BlTyn` zVF}P-q0JRam4SwgFefM)nPb5Tu+kTlrb6<84-XyobdU~m3O3VW{8Ge@3B}lO518Rj z6{+=Zajp)NC${jiz)9v8(YoF#sK;?pZ;Vys6S#@ev_Zixu zm)$Ast73e}Fiz#j#$xKP(V9WbH@|YcFvFDEaXL+HDku;b`!%nVR-opPUm}_-n9>bv zdcxxq12}B6Lrj*6=JEeW3t*YH=8wyX2whPAZSD+k@Rj8c*UGYeA@rv!(5dyMSi*Cf zUj+D#83I8jA$5+Q))8QVzgP>gB>^YGB}0^5%{`$Uvm3pO&CTPvPU)s!_O?Edx;D6^ z7p{8{-RT22f`o}s;CMsM@i7Q6SJ$n4d(SXwX7#aw@T}lB@_pJGBArI36_d?R^5PQzk(4I^#M(Vuc_5d0)WVg&AJqT}5KyO|+e= zIbhOZZgxPSW@57;;eG`2m)#^k*t>}W=-XS80s@b!uES)f40`;DAyrluIefC0lz_$C zbYpQ6bQmk`sq+GFgUM5AG1<09>-FpsBt8%UoCz=E3m$Ydh!}YcoS5Wj? zoB$GZ$DTbvsFD6J8ljaTda%Y1IsMQ}1dsfRyv%YMWf7^{ekuyZSCfPx^V2f);;*iI zC;ITsfrUJFp%hJ_BHp6f-{0V`x0f$}S@f}ycX`uD4jT2eDS}adPu~$v1xJ%@({m+J zbZJ5kl02_>AD*kaUOj7sn697E(>AY2uvzs(MXp8f zmY$0!64=lo=^YMIh*d}q4ktQM1fV&N`015QDvh{ zS^bE@+iC4Ap(U`Eyj@p!P)J9@#hA~4pre=kXAx&{s)G*qgACHUEU~QzF3vw%oa^h6 zz6LM1sC2%6UXVo>w1B%KgKcjRBoUy_RI5e*wBG#k?$hQ_5Jm zd@JK_qQW${P@X(Qk7dL`l?>pG;8>@&AC(j~H2iRFrslBDD0)Ewny0}{D5+ApG7h{c zUW&-IS?91|uxlje-c@mc~c50=K!XnNe7br#~3?Y;!p~;`w(O+dWqc4Ba ze8;&{q0^i)?mPW8gc^_y6OfUo)x58?`pK!|0nFSvRKZh0C$wO@O|)Rpzhb>`;6WNE zgo<^`Cm}klFo=Z+6$R2*x3@9=eOGc}La3y*^|8=pmJ=-;_sL;#AJVbJwuu*|6!uHJ zW1a#5lvsQPN+y^aPvfqq2hU#lv=@6zd;wR0jfJzXo0fet2SLa(I)ZE!IeGFUdhOZHTODd$_rkdQH!hT!#e=#lhvAwX}T zI@C^%Sl$pP(Feq6l3qdACkpmt~$#rgFKVm@FoY+{4av zq*X)A+~ac#nar(9hf6(v!?Bvni_h`0caXt(k_%tmipt8$tWZcC&|{qfl=l*v;mHlj zmG8GvgnD)XVGBV0EBGKW*~Pk|UUlEouZc6Bu84y-Y>6r0=JGZBfZ0ng9-upQ4uw3^H2uVgPWvI9-EU_)9<_ zRe8W`H;C$D@+T-Jj4>+YnxJ2*WF$CSkS3+fJ}4Iprv5VN6gxaQO!s3pPFCw)rb!XN z2nPYJMRZtnkUNr4@CL~ULggN^HBgB&){ZS~l`?15{bdCKu_b~<_|+Efo1D~XrDaS6 zAHzahAM-2(aNoFq-p0I7DMj`HuBpZEesDQzzBWBp>^^_b%3nZtirdkR2GuY5HPd3; zcKj0xa86IGSVNiVE@G!&Ls?h)es3i?M6?VO7J~}`eAKOGq=cs25Aon}unOkccKqhJ z<+gzkH6Dcmb3Nw@z)y6Uu@wy)nauZ_DB^$As!>jcAGOu6$baJaTPc3^qWiUJM6iW* z=ej)VtGb##dyf|1Wi)<&t8(3V*-6KpPZ(WJJxcv;)rzK;cr^MW2p`M(K3Y*a0BUzk zejL4FT3@}oG&dX~yHN(j(NGj{UU<9Xmoh_N)cMQ1>y^u$yqdTnUVx$AC z-_CDDQ!EC;BmEp_lJ_uQ#qRw?f*UW8@YED<#NXlIn8n}69nDIXyfT5b+^H&z%5(R$ zT#_xn1GxEMPXeSLjc9K!2|$s{eJC5eUfhP}yZ}*D$iqUaCtf~*FC=e%_Hd*RN(#DU z#*4;Q2XIghoVX=mi8WF=nL~&q{UKda8ZW;KiqoUre%cfj?g?IG7$GEV2LDN>{k?lj z2H;qhPr(Z=&$LcPONrY*p4 zu)lYd5dWm-Eca)igeIKcnVZ|ZCi;$`-3#Yv9dh@|GWVdU^?R}V^IQ}C2Ed_g{^NK$ zqi9ypyNnZ+X`D!SXr+%$80NL4Jmetz@Xf_`AZD$t{J3u_-k!gTjW3v4E$8@`*F4z7 zjH|Pz&35AL_BT}bYPF+rnvK`M`fm|;Vb?+B*%6*E+z+P9LUQ&|ekIv|e0agQuj`dB z4?~1Iy-M6Olw<<~>T9W6;n|HwFNQng#u)NrvWof;nIoUrATWmwg$78Ba}E>T!~z^8$X%KK$~uImY+MeP z9Dd`qejAz0>`G?8Knie7H)|t=9)d^bt$x`Y#~T}X;*ctAegLXKa^Ft;UQ(+2!o}!4 z4QL-{dTAW9-X7~a)P|`Uc7UzQV%5KB77lc~T5PZotV~1rTX^0A& z>c@UX!E>^2)9*4}+1C1`W9T!TdJPiPsk=EFpcEaqiu${NHd7-@a_Huh%;2|CDh_DeKo$@bl^?cHBjLK1!Mz&=NVgm%ZqIr|7POgdeM28!Z-Yb z@J%xA@UUg?@9HJn9aQjlx)m!2y{o-hj1NI=G}o_YevC(uT0bF;4pre0LxvM|q>9qw z^=+b-$YMY%yP1x206y5ki@-YGT9X#vRS(wY9-r?WJk5J&oxLc-v>rbc^#D{2Sh-B5AzD`K^Rx~pjpty&ZS4x!0A9= z$AIi8^h%mTKc6!t31d9JO&crat6NPyDyN)bY$^uv#67m(%2q~(FqbJl`JeWyTM^R) zi6C`W&)b<^zR5k2!^`U(#mb8ozH^S?UOz5)i?2gowJ)r-WcA|E$(^}s3sJ;6$H?c^ zVc~3ATsXo_tGB%~LMsULXvhK$-du_h^4f)q-lIMm-A1m>GX~Zc2G+X;t8AT1G@>5f zyDw0q-6`BVL-$X*?5?W-x<7&YS?tAm%%@nVyAs+>P2+U}4ey4 z^G^`3+Y8*s2ogHI-`%;s%{UB^`=|E=f&4FdTVS_o2!32)tp5a;|5rzk52Jb3IHG}Z zo~4ujpOX9k+q69g5>&!yJ$u^m)H9`gHMXH$7G$vi+;^^dRt~;f06I2Zp@Z3_pydZy zuANUJX{cNO_^lQa|3@@%aN$Bf@srM2vx>8BO6|Fu(O+si9=+bDvDngW8((&`<~_N6 zGqdEPxnlF;NgS%l*%3l72P#a5U^$xqGq^})Wyw5^h7JxMTI(fv5(R$MEM6#di-HWC zAnL10-#Y$lR?PYHVk_rK6p0QG(17Ku@cgq{OAVeOU?Gt8BYC7q5xm@w%h*GCl4G)| zbnI+(u!WzT^8r;rTR90YO(*C7uJAj zQU9C!D+<_e79AX?Y*sip{n>fl1;|8QNTEm)_%(-tEZq;~&Z_Vg=xNpOf2>^92PuxF zIpzOY&SBFRLhnGCb&-3PA43SS;qyws4yALKo_N$$4kzYmMX&eY%Bf&H&wiQ~A&Q>; z5D3FfnUtTdn}f0C(=+U`@r~pBTiF8Oy^@NHE$HxVkv<|L*b2)J6UpP-Ch@n!KD4Ys#}7R1eJOPVZ(R2daz+jBmfRV$2wMo0yn5wRmc*>D-uosjfbQA8hZE z(`5czP%TXOrY4)Q9cU0kO}q4o#OsUf z*HTYJeY(l!@CBk;gy2k*GP2~=K^N+!kV}9D?_x|oFzQcWNIsZ}5K11_zQ2-w^x0b3 zeZM6jmT@-%@66rH#fIljCJ*25)Lg*lk0OVQzj`lHTKpP2@(Fg*Zok;p-TLd^<}P(8 z^LSM`D70B^FYaF9z6UzkK(_ct3nY&PL_fm~HHEC9gFB!E%gJ;`MJ`cGX&!$uV_}l$ z4TwU6ezpDddnjpQydg*^m%!JYTwyTQe{}}pzX(=Tptinf>0QfqTch%BDvw{iP;hj^ zj$G-@Th5Uqij#l#3$jNK_G3Rq47-Yfwq+ zGOuKDua6|u`{NkH%R<&l;~bxY2Ok0#wXD>!X?HD{&Y7OjS!Aw*zod|3pbTZP%?!03 z^Q_wTG4r$tUt^62`!n!HTNJAe~9IDJbzy>69Q&K88v<}c-@ihs@T)EB9R@2u_Yj896%{j`0d z6Po@_bY7}fFePiJ*-`Pu1haF6yH&N-f|DxdIRt2+qm;106)nT0omcG zSYfqkStIR@>Iu4-H;HR)RsliZ<-<_rb62J!6P9@eojy`{tC72_`qS3-b6=F3dTHzC z5s?bSf@Td=@ZQ82PDwHBFMno)-n4pd>poKs05p0!o42%Voi!?&%8-Imi}6il<&6p? z22LcSZ_)d^DTyy;^R70U633U&Eyzy%#yXVbXi$k36@sqpB38#N|G2+*_D7R#@;rx~3fT)e1{QUqnB-jf(u_W?OYt(NW2Pm+QMN z8J308XL#6J1CQz0aC*|i5!o#p@wMxE|Dc36)=Rx|IF@(b>Yj5R-nH%TuUMY*f}3D` zk^dJUcaW6kjA(_5f6Pad4(ziqOZ&K-vH(R!qjI5xd1sO)cOgJE;V}F1y`DrCjQF;} zUrZ%6X!%9Lu-aMKiLAKGNRj|E`Wc$RyxmFH#+$)yypK zV3-f?cPiDHYX>JJubB6 zXBH_`SiwsrXj5`X^q*<#N=!cBYKn+*CyJWbfR7 zN%zGKYsynL=v>tzg_Gy7iZE5cnGSJP_%mytu7Eg;LE{1@wlrn78cAV_0{g{F+?BS0 zjEIZ(#{NPTfk!wh_FSDa^=$*zFs}Pq=*dY0#5jj;=V$%eirk=RG4sqel>h_BZmV90 ziF(`H7`fcK1I+-9fSE_|B8>{cZ29E$+Obo6YR6at{d0i0dLPttUQtkoIN%%~keg_+I^I>U46`sav;2AZT!dSPnrky1jhU z%iAKem>hWDwtQ9iyQ4U;gz9s_Z2Ba%7SO1J8)V7km+UnK%*!n;C z0RE`;BU=GK{IXt&48Ny?ip8KX+`THxkpE_#>_mox8Bk@npLMwrJLt~qrYlx8vEo~4 z`}eXZ(6`~k=?z3%k&wE6244o*^~n=tepN5MzOk?6?&p^whza)NbZbidaah5+ODt_c z98b8uuXGJa(K*Ql`Q~F?mxs#h#34}(Sl=*A{>&HgbK+h}*4=yBB>+oa5fpZPq92 z5hL;$Q=1Dz(>VF!`6>Wqk zgd0>G!nyFj9$85B0*~1SOP}bYjf5plq!TQtpEDhx4b_7-|I}dPR2yiNLD^i-t=qVw zuZ)#On;}GWCQkL`X>$zthKkV2J^WrYuL%uaGPXP#&}yGmGe5vdz?UnB_WZpfqCSI1 zP>kOy9duX3^}PMDk3L?2?th4ysDd6-@PL$2$CoEFU1K^pu>X8OIx|5!6E_jUs&b9- z-BG@)3UKXP$GR3JJY;r@EFWFUeV|$M?pH%P>?f{-bW(QV(AdRuD%QSn1>ql86>qu! zowD}i*t%~V>Ty}5Xr$V6h+gH6H>mz1+WKn7%;hVeSIe#VKQsXsAkf;D`{sLPZ!%OP zLrxQ>^xhNCczK~qp2-V0@cVX?jeM_7GCt^S;M0C=E3jfPo%-V+s;4`{lQ+V&nWBcfvy+L|^$N1_WCDD3}>bjUqoYXb8NdeXVELZT}CM=5rF zo%UuQ$k#{>TerDOW4lz~O3-fDD^ny7E9ch(t|FJhEIvxAA7Wkqm=Pma9fiP;om)=H zTKs(UBZ$e28CQwDK4%3v!cp;YvU0@m!tosbHFXC2eS@=dh4n+I>OOLr&&fBGG=8amnl`#%dSRLx$L2NmeHfpln5!`Df zPI8PzAxqY#V+-Ga#M`KnVs2%N-FKY0`@DI3`UsoYvNWUy>z~Qm&s>Xm}NJIBfH}7fx;R`0d-*9 z3h%c=-F1=mX>Z9q+5FE8oJKl?|z>1 z+}CxV_dVC)FZiB1*xS=5);eTC|m!H?_ch66HA zK0Sgm7yr&~&PDS&#Nl+QI-6t_XvfONlzr$V$hS)8XfG9Ep0?ud01VU5m}W4O5}2O| zk&Rz?upMGsf$6#RxI~j3Os8)$#j9EVY|!3zujPmv<>`lqk(P@X={99QwcZK_k(p*q_Swozyn3)NDTzKA+`aCh z*F&^j__$Mowu1^`=Rn#k2ImE(bH2&v!OdMQ+^dL6W;pBK`qG#-`n_}T`jyFV2Jyk> z5_G;P3|`HzM618WxEvzJFD5yt)Rnu?<{va@UHjfoqtkrt(%b5{aPa*Q=nc`O+EuM( zHJs1piPFFzfHpaNl|r8Oa6KkN?;af|ymdlg6M*lYLj4u;EY0uqH5~!ECmcZ!gG*O; zQV#n7@8G@7AS+3ey8e#0Pd$K`SV zlTgMy0m3!(m%Jrm6;CLCS<~ZxeB#e2E{Ah%e(7mGGD~az*?%!mr@6^n9AEfUth!oq zO6=3{lQ8vct5q+&n8%GNlM2^Y@ADy9_QAI|LOhR`wRL9b zp=gs^X|A-mo3iBj$pUmuCi4LwKFgv!hc0Y$2R9d}V^>@60zinmtmrjJ`J{;M{ejUqD*S)d zsOeo}LNj=AzX$g^N$@{M-@DaTTf;Hk>0C()nYK}I#n|G^^q>}iCGQmp5`Yk0>q`Yv zvVdq=V5`i3j!IL(OGUuM1kd?>5}2#qb`ScU%9GOx5|5p>a|QGu8zNY0KJLOl<8K0b zi8d`hbLJ{}?tEw{0I&%F&i@Qjnej#UKj*|+p_Y?QF(dMH&J;s_yi!$o_#d2HT5-WT zF1B>r?o~-6fESp{5d~)l zKL1l#XNTLaVx`4wXs4%znN@0a2fu%r==}Ub%@lC5Kl7r*2)yV}aS=2>D2fnq1rI8M z*k%s|TQ@V^)`r24L)1Tmto4Rgy~IKZbvI5$(Y_qyN*3`I@5QGU6cm)$)q!Y0`rrMgb~d~Hic7pZn;2&6WUqx9^>Va0<5lTFcJ+-Z zJf`+yagW%_lr4J1mbBcSGT14_l_{Z_KF`+c!#!gy-KP>oD^iTmgo*U(fPr*be6DE( zkM@xKNzoTK#)Q*UAkLsw2L0tsY-Na-87|_HiGX*}1JrJ$Yulf^np8HWo*t^Y@2$bN zva~)=^Fh^!GMyg_UR!Xsi0}^~D19@6L?}@iEIWIMmmJtnf657zE^W%WmOMVTSsx8# zf-?Px$XNapW5ifuD0+QIiaO`A(CqY{O*LZdbnbSwLF5}S(>lKZkZe zTrhZE>}9H`Fw+{m(2xrB^v#!;yaTtu4>FdPs?ej`(uP9_L5d zqM!s-`=3Uw>Brbmb@{Q$?{t<|-MhE{2b= ze3x@77uSfewpUVsXp21?VzTmQ6K#$!?gQBe#;}YBqTY+#WTscC!J7UFlwXV##J>)G zz2I7YloY0aqzLa*`eccDa@Clx%3|xDXQlJH?yVSeM~J~ zVZ8r6p){nMM@HR@(Glfja7X|_L_`{byJVab*xj@zKJAU|Y*oQEV_6Qgn%m+!Eo$|O zFXU>I6CAyaA2ee25#eWmj(YdEbE@5h45Edc4x~piBa4|3!cefwV0V40n~#G`e*slV zTi1ptmpsYU7c)kX+AzsOcPxXApLeOGVtVHrQWIrWr;@^C3&UPz_k%w?6EwC|BzuPi zj}yFgv)qef-F)27P$>vtILJQqh7*4%gb-AAYa+|pn4jFSt#svg6*kVlYo5vW8%MtD z+3E8-3o!Tu`VCijki)8B3t5^ULPdxW3`9XrZvj$XZ8b%>MNrl3BbPe;X+x2(-jE^R zBPHJsPJHT1w06PI4$Y4%mKN%Z@wHdmoKnPxtII=D*9P%}Zw8V~5FH@^0U_1IFs&T? z!21j7yTd6_%$mr0JJANKftrv7m(tFiJhVom22WNxX#MztaHX0`-JW}@`*POC!Ija> zR{{hHe{@vgYT&M=r#4k{#m~KL8{|@T2Wz_pjc&D$=rdH$0YiUr#-J~|PihLaL#*K2 z)ZAl;T9~}gq2#EIV;h!FF*r-Pt@44pPuO=eHU`?05p}u@{aZiIWlB405P}rvX}Mbb z)@2zH{Qt|ii|_s%#a4n|<3v_*^A423_)@rVIbl1*jthR~`O!06LJ_&t!z*)1+iy?6 z_i<|etz}c@UzS$Qn?PJM_}Nt^*P&&`t-`xydY%zlm1QvFeEJeGhRamWNlsiw9M81v zM@tZ5WS&h;_91Bp-)kX)Y^alkw2Q>DnVSZXTG>x~72K{f@r=+fC#S`dRq{=NSN~Nd z^#-W?jZ$|vbfXTe9eXd5;OFlPS~QiW)Imhb;FVb4en8OvE5Q78OtT=5St1h6DOCo} zeMzAjGrvWl9CR_$_JE%dY z3@F75_Ca1GR*cnEEPgsgMc7+K2(KT2RS`a0V2IqfXF44KwS{;`R|BogyZ*eD{BfdA45h|^2Ns`qU8sG>;kCaO{=f2HrbULYUo`=iEx zYG7RJG@UGZz5(0WqgipWuUI6#_if?1M-XuEIx=@cazRJ(=201cp zZ?rsDJ(JknaMne5feGUd-;6l?aE+`tJoaY4@TOm}o>s__6tr(Y@jJtgp9M;tvuY1v zxvyf>q4n|qFOCW``Hy@Ui|&?T4PI>&zT|e^o^b}betwf75gLWSjuXFI_q03R_np<{ zn5@v*IfMSPXMQSdgIbh}uH0-f!9eCn2-+Vh=+E>^Qf8-*OD{C2?6n!GN-+9T^}dgw zi4dWBFt8I#@NXCOxZpV-Dj>0j1@W?G4=&W^Avm z5Z&)M$wSlK8o2Krl@OWuNM%Tx_&~RIvxJvIb4-4ZxK90@PO(7q+G;mf4`K^bx-|HoL|&cyz|#0m~R+*smwW%?>Ju`urb7k7>I}r zgpxzKNB_I_r`SYF{`;r5)V-to{mD+fBDaT{5HfZN7&c+ct|MAKGgO!__@GogiTvtx zzgYZGcMaDs0yop+b}gbv)W>1Y_gPX}sP_-urh+-lSA-AISG}Efhhn#N4PTPck^cDY zEj}m{d(iYcETt+jen8P5p=Ew~C+G6v7QJ}UwK_YmWX07*pk!=3!a;x{B6VCcbkBjq zGvEFoow3pU3`0Nm?a{9uTMIIU6?{4-`6lOXIuO>#CgWwwy84nxXOEo`4W7d zQ_43gQI@zGdirq~6<+7NZsQ4OdI!p%tox*u?+>89dEOLXD}rhqd=BQHi`waP?ArUz zbXoTX!3tEk*P#t?CT}#T+c5C$Qai@*=7e&Qb=|;*K~g#cG)SE(R3RwymjTbfi|=5p zOcq2HD`5zwO6~T<_e;%!gj0|1WrYsnM&X-Hp!pYyGkw}t|FLQ^Je(M@IezLgrAJisPlkM{FMJ#J^&Hmf9ylg z5#}&V(BF~>XDQ)`$5Q{HaxpvPy`t;g^{g%HU-u0HX|GBM zlCI^0GPm=O)dulF0OGXG6f4;Vc1`k)sejamzPkVx)1O@n>;rs09!@NllAxnI+XfcO zw}H#JHP`7M6}RU%$c;@NW2ISHYI z{4R>)Tf5iH5bOaL$}g@-3L9vDZGe3PU_)=~MxpjOr?a!O&XvHr>uU*%(xK>Ugz1I` z8Xp_((a9rVOTC5WGw~ff!roUpWraCsTC|xe`DlLyPN6wF6#*6p4|`~E*hT3*vunBi z=o%CD9G4T=OUa-0`nR{6pN#(b2y_CLQ-0bD3)x6-hUDX5f;=!&O0J(e$M?%W`$rDW z%#dvd3Y5llkRO6SO}*99?u9@GiDg8dZC#Z`ahgQ zX)Lwz0N8jmF```WuOLj8S<%LMsLskw;((S^F1w*3^qvE90%)Ax_Xih`!gsr~kp1S& z!M2fJq(>*8sSnUAw0RH{7AB>=hU_VNS;bkg_w?+n1y>5qxp(}d245S_XG7r4t&fQw zs`1By(T5-m=cs)3OmJC5W<_OjY6LkE)bWj8$=s8at?GWu=o|9CrfN*kOGxkqp^FR# zJhhJ1_ktwq=JL>hW14ATAQE4{OlYIti(@)D#74oe?#QPUj?n?Qv#v>kjVJ_rIvh2o z+YR~peSf&`Fnd|`Q@`x<8jA3x6bwdAmg3#fMTHM~I8p#6f@w_B9d;?6HGzP@S7_|C z??Bv|LVK?SX@eIJ{#>!qN`yS(4ZbCgb`YB?SHi~uKf#VKWUsTU@y-n~uO#H*7+CI*+#`l+sEKtZ6YKsq5QILSw$etsFOCcuq z{b15a0s|vV7)3UhOG1S-$EG%^y$F3jlXT`I^Dt*1?(h%Z9G-yFmze6RngHZm0Dk zZuEVW1T9I9pjKV=a!5?O-!{i-dO0@dPpRWyB2D>{t2FEa5*1#4t6O_9?xGv{T5GL8 z*dfxDYUAh>-EHNqvgvd4h|TObABHZ$(og0?3qiwzC5ofQ4-C)6*Xv!fl-eeDSBP3Z?B_WDnR_D(c%+;s9Olu|iN|*f}oAPJT z$WVwVJ{-3;DRghAD6%Y6%#H2#Sii3TOp``{jJwtmZQfy@NdZ+BTbx5_{FH#(Rl4wN zMsp2W_Z`UAXJBGJ*It%=^|PXgr91FJ{pp1r>0#L>*sxzc?C&Y`9HNd7JN7xL!Qq1# zN$sPw)kJ~HpZ|m=Az7%s*$NdT-GMA^PcU3*Hyn$Z; z5WBy<3O^s8q5iz5wbw}4LnVU__m<4(sP)pJhlEj$6bM}6Qxa<#dLSldM<)9#pNWL& z^9kFdEcaA#VkTGSCBMjpvp-vm4 z*&8ks#c>ys-K)y7Lpdzo2620NO`C47bbun%f&EL?N~eB_Bv7t$;9jfX@aL`H>1`zf z((AbL-(nXnR_KYd>C4GTpjb;B2$c+Gh5=7w5Pk6IM;!L)4+~l7&H~B{>ZhOMlc_vL zmxypNt50b8Og(BV{AD~eW55Tm*6@F9uB?_oc`N3mK3Bv>OJBSdcX{kK-|^6wDa!F}b+~0@1`$Zm&3Jqp zyi!e@LTgRhtyp_PR{~dQ%qqJrelc0l=JDgo_EMpd=Kky}JpI;Wxj`}8-CcQ>-pe`4 zb-9V$$25K8ePy7f)L5+?(9dO+LDhNrlB>pD#c;t_u{Cm|&RN&s3K%m{#`Qj?dEUcM zXq2|#27kwolp;4)+I;tigv`2L*pHrwK1m0ioXO(JbxfxY*1-;Acx!^5j|x8r{5 z#QZ2e9@WXY7Uh-ig-s3bXTyI{QA7D+oNJiHA?a?Ebz!vBrPmT(TMxw2F=$7HUH$JP zyNtR}(dp%QXgW;6)WQ7)B`D}o{{3JcJajDo*V*8Lu-B}t%hC!eqnxI=p{dsTqiIHc zOWQILWKN+y_KEJHGJZe9W}EyrcJ$n|&oly-_6=NXm+@auj%%JR6;F?6miZdkjH#Vu zmquq4THwCz-@WdZK7C$BEPkv-NFT$O<9=yb>E(Ur@S{xkyCpzQS;h=}{-b$`wQ{lu zhbDA3GGf7P>LWIX-AMM{tv6ze3V#(gF59oK>g!d$5t)1qO8*kO0TMyo8xKO(zmQ6ku zztd_I(6&M7Q%E9{A2QhW?xR5;$8}i&sM8!Bs)^)1r53=Yn-RhIe7!T@^>c#x7YSSU zZcY?u+Rc~EdNDTlpHdF%!U&##!u`#`Iiu8I-4@%H_7(sx=DV~_&3UH@itZh(8To5k zBxcEs*HmgK&e8%_V*;#XScB|Hdbb_wMd~!Rtw;4o#`+(4k4s5E26<}| z5h{>OSYe*-^K?ArJS0~#y9tkVWO9aEg8d0%tfaw)nc(f1J#tu&^wdYe=Ts!;((k#>F_|VXybwlOj zDOC6EG$+2xAXdk07O*82q;q?Ldp+}nYvJe+U}Plyan}r7PEfSQ8xvJ&4<7FG|NIM5 zthcqq1Lyk1$p@2AnR3pf+{BKjs2!D|klly_lgp_s(!U`AW~K+)`zVfMg`4~cMAj{_ zq5&tQ$92GP?9ni&yaiQETOz}bBQz(U`6mUQzMj!)>ii`T9@2!havclhZe&pr$F!GH zvqSb4a}heei^*rrc7hT{$e_%M^B^_yRZ4*6Jukb_m%aIM_RW|nA(DUYJcmaz2ym`n zvYT(z_WyM4qqB& zEA~$@v3(6LJWECxfS)m|VK0a?e)a9+Dcg50W-FRrEmowt&!{DhHE)Sx)X@~1yuZUk zBH*V@#Bh2b-V+kws1^3KCH7Es7hdGnURPrjYL&>@MJx*BPkk(~ICYKw@ZW^ViFAE0 zkFxlR;kt$O?Xovb=Q^M7vUbvdac;jTq&< zkaH*`%Hpab&-}C0!`VYp{M zpSG^Lc80WF7VG@r_2ty_rzR6xXyW4YqIh0I1D(PbjK;|0t|6oC`};w7wK8103f5*J z;u7vyf3lGwVqDK4mowjkv`WU2I5&si+~`g~DlNK|6fBIhdlyl&M6E$lcpf=J9pq79 zyF{7i+n@6Cw!zDaZ)X?^5)V;QqP|dMNvEklb%dB@k|PZZaK4>c(C0?V<&y(Ip-Nu! zSq>E&y1LCE6H|0_W|k-b@0hUlXSZS@k>ap!iiOcWPtS2kx?@4DB?rhE>6TD8Vhu+A zJvK1_#XgcTZV&#Zg?`2p&z-tOVoHaGe`*wqC@lxPj{JQl^{f3 z<|Ag7Px#z}eRSA6fa$X#@RWw(|NN2JfEy9`B+PuO90MgG% z_Sr%CAgh+^ag3DirSSIKm{%$~>XRHKk}l}8%rdGU+xY1(-gR}=E3*GmtF9~*ZMmce z#zPE&ho6VLj;JZYq&|#Dyz}1rGx~y<+p!2R%>@;H8(WaYS@v8XKwRN!t?=~62%Ddv zv%m-KiRuplH```LX?a$`dc_$Ot$8M!%>d{y#g89DS1~(Jm67^Y@;?OFQ02`kxWA*P zgxJXbD#AV=^Sl%91|Pjz9Of4PLP*3r1yMnQgZHBEu7irHTXfP%qhJ_FuFfsI9Hg|n zD<8=?9?uyDJYYEjKS6z9GeHX#R24_<7k_b*WVivi`NlS+3Ovnzw`#0ryILqd%5|my zfC|8Q46dgyM;Yq9c-Xt?k|AOU)&6fRfP@9uwdKkx`g!60D+2fy3iMVQ-xzs_W4O;? z1Xllx{OsjSut=Qo0855LMVRV0!61pzb{NZb9dY<8mkudY)Vl8v2H!atn;U=CPpgEe zf@*q-e9^hRxw$I&DIxREhjj$ojM@8}Cd1mDeynjYcefj6x99o7a>4^FXekE@aU#^v zaIjfg(dPWyYAVwd6JmNKU&K#paN@{@k(7}l>7FEGLD{XH(i?;xxWBF<1YqF{p}`pD ztU-w2w_IGz@3-jWrq#2WZMjUdDN3F4Lya5fnqp#5>UBZSb_{HO{5}$+tZB1^kCKFI z+^=HMpyv!9Cv!F3m>XWOJhk)g5?nDH!h3=SG>Ue~Kn|I|RuV*V{1%PiwJiC{N8m3b>x+r-m#p-$ySI*i4ZX=yCkuJnMPu+iIjY=Po}=K=yDX)eycIfg6{f zu&}H|LJW3odp3XBk5cn$>zhB6uzCIo>fIF*FXw3V&2m!DCXYhLYFt{Sh7?Wr6CASZ zIn!VW<(gd5AD9d{Q5BPf_(w!&OD0&&kP0~1@oIZ)0C(fY`8X)S7a|K8h zMXi@0L1RW0z$0^13V<3qKHx=anm(OIou{hBi*Lctx%7?5CU$Y`-+$_HZlbH=OJ`)v zWUwIpR+RBR-w8t!>HDZX+?3+2$2Z!+HG{$=^a;H86`IH}PIJ2&WcU*Vi=|JZ2}m7; z%V5Ha&#TY_ks<8ww>G4JsW6)X?MEiBSB^Nw5#sT$Am%b+LL(pvky@mb&}OS@;Hnir zZ=>`s?r+<@+KfDJhkRQ$f};{=Vm*{I8vOcCxR4??`i#yMmiGjQr~K-eV54{tJEFYM zZ{>FfT1anS=C&IA8E+H9{lkPbAy35KY)XzfBxX3nblw`d#8+)O1U=_rj-tk)F_j$H4ri-e)yH2Fa^>mvK8KcAz(S7{c;yjw@a@)YED z6vy~T=_PTCk(_fWAj8Ac{kr((lSpDi5-qu}q@Kl>8fs944qN9JtK$&I;8Q+A!KE<`o>nxlaMv#Lg#9Te!*+qR@`{fY*$sL)I@IjTj2Xg~93Gtj*< ziEWJfN=YjTpF4=7XV$_1Y5Z0e#-v`%J4&}lk~2x)XLh0nx%_!}VmGKGaJ7 zAZLNwI52~}Y*2Fp zgQf$B;#Q~?^@MJg#gX0Zp`K}4V}}5VIIAXotZMfBzHqVURT{F-m@cZ`{IjAO1Iv?M z$%(UABD){m&m=}GQX)cTX!%~eRde#};umTHs(Z$XJ(p(l->=F3Ft`kK_AYku{2ozG z25QCK&wZ<`kJeZQxibETMHcs7lXWi>2<>M5V39hh4pxLsn_H*S?}&98$81=uIG{Cm zEYUf*vh!axJacJxW1NUVbrxu?&k|4@HSqf;pZ(5BhS``JeIQ)L^_CVe_fUD!wInf; zRu4SgxhN0&zNwa1hyTlQkV&>p&W4S8!+=*GVctSEkcV77MZ`o)J#p^t3|<~5ie$|; z@Npg1gxDZM8z%Nypu7|_So*MRnM=kv^^krx@KKH6u*IQF~FmdlD`+N#`GRfd&D#LRU=?jhmPqOw*) zEKuUP&HxFum_(i;=r`5L{KA4#_t-0=vv<0RM;WwAkOrA0x{cgaVCwuqSr{j)*5A3* zz$2QUs8B40ugs%m;T>TatNb?6lE)UU)SY!fPyTxBIwPJ3Ev5JTbW(NXez;%wEtB91 zD^$oy_h+3F5ll_&xwfQL4kF0m10xI zq^+)k+Ox2Uo=y8B3WPNR$)AG->PKZ?%EO!r^fOWw{IdCQi+zCbiR08Z%jebo)LHhk zkYAQRul}I(YldN9X>3tMIo6`_`G&;X&gvfiGPCZP2hv4?UE=2VrWJ`b!#j#ZK5=Nm zb;fCDWPL~Vr-6fX@?m8AlN#xSwS_jhnrdr30m8!;gVQmHP@#?=H5h4&6KQ%S3o6Wop_P9WsoRjL~oG*pB$(V0v#m%xcJb@GQlo-@f zVIbz0oY{&E?~8?+`6p$dmdm6RQuB+SINzEH3!8&QKSQeHCf8g|-8mfdrZE1n=bF^{ zMjuuO1x);6XJ-#Vy!ZnH4<#W0)N3hB-lq46WF6-{lPuc)OXEWyYm?8ElvK2b^dLDp zb4mD2Z?&Coo)V8zUgMPs%o#DRKeu2}i}^fM;dW1DcL&52> z@XbljlGU~s>uSpGb%zzl?S)rv=CU_hWV*J$e&?B4J&h|c_8YxjMdiEuN| z%4(h;j-vS_H%@P?Hile{(dxtgfq@w7qL>;7{|j$1tBLD?xLA!;2Q>>@ajK-NbY1E1 zX6C<>sqmw)5R^S}6puD8$6a^W57pShq+4~GE? z+2$5mBY4qRg?E`LUBlCk=wA*G2b@4YjN$*@R#=7;z~*&No0a#(_?HOel6Pp4HodIU z7eI)YX9#Xr`(K2}vLV7CF?mrbkbUG)udnD;`FW(*49bv)Ew|inaa*TZx|-2aGQ&%j zwQLrmnbzP3hCCWU>3^ObPm&BJ)r`lmN^LLwe#!j-Qe#uaG0J59(tmS{DYi&VMu#LZ z{WeDS1J5V!u9`198xMgcwWF0dQ9fCBS7Jl@Xelk(SmLz{F;g@{#VJuj-x60Hm~Br~ zo<^2Bwa_1Qjbf03d^wgoKl%HfGN=}x_l2sOvutQNmzs8xmNRgEr+InUIA*cq99<-0 zm9xQPU6VDYANj*uKDo+D$_0frQ>PYHctQFskW=}MICEXBRI&wKxO6~i`!i{)D1EfK z7L4^OoUxGeB5yi*R>L=RJ<)Dg>lLDceY#%QSiCmcg%C z&fh*$_V&E5AEWvFgMg9{<#=GVA&2JnyG=SM+jXQ~kmoF6Wt|*k78EJFSCq;ZH3Ef? ze$Wuz#AN(jQDxB``!RI-9S4adj}ddU(*D=A?pxLnrkyyN8kCpV&24_Si5i{3zdnIQ;LOh_pRE{*T;~IL~$`n*Zw#^q@Os`%dt1ot)oCLhjTg+V=xZ5OO;LV}2N8U;_yv9?>_ECx7sVCd? zU?q|FW{J=m+fcsoa9=)9tKW^8d@sT?#&D312&^X?Tp!8PuTSqUg()ejkM}~v6#c5T zl>+B5>2ShZD>x@=naoP6%q%qQjs~Rq84bCw={C8ZsSkQ#90I&_zFuqX<%u`OnJkL; zbKrkV$-C!tHnjejpZhxpaEbAp(eXz_qfA-4qavo6{wS=fIO|Y)4D$un*FSy zEJ_1_336)AwTB?C44AxNV5ZFHY72)Y-Wd$5Nv7xdc5fi_RjEIMj}eCeBASE%rrzt4 zy}p4uXDm^pvV*z~XUBv;AJZr!XF%jXd=5oI_F-*sCY6=lOS}kZC;qO!Je#0C{wb?E zQQwb7!pj$b4dL86 z1;Qrh^y4BS#l3-yURFj`G>c#wh)plMJqtL; zm7@1qy2p78U`0X_l=r_67lNIPNcg!P2D(eB!=T!GFX0Y8kzI?K*#9cy=r6u@!D+%| z+;EQ1adT(b@~ep6NRi|;F$w%Q;}Abog}}_K5*Fusl#v&r2d5Yk>wG@<`q^Y3mTP+g z2A$Sw#Wy+m9{#J%PyU{R|C%hvu<9|1dzRdm4@c&Bw zZ(E4iqks605D`L7k3Wba|8x}**YXd&#|Rh1Z-4C05AK=1iQxaajEMIBq^PUtg{8cV zja-+}^rfJw3uB$7_5)TLi0;!+%!&P{!UEAN{Rv6Mxs2=xG9oS+o16*VLUX=pD+Nmh z8<;fZ-3pG-Lqh7I=-voh*i5d3ihG+cGtY9e8NW4;he+}j2O`?w-_!EFd1Md4zd;K; zhx~_+{|Rs4{~Lth??bD9(fYq=^DHEAr+z4Qt&iHv&VYowi>=yDB#p4V4ft3k);PhOeLr6V-)#+?uRKZa>O zOnxla!f_COB&iCNH4VqyM$n^z>RDO2*^Lki?I!G!J3%I?1Yw9b(7Jkpwql)lF!qt1 zPotZWYxE)s9(cy@oaWtEzH>q(_vx9=Ic*9t<<0W8Y(V)XXZDd)`z%ZL3O@qI+u!SG zk=9ze-mm*kFQw)&+$sW)#yKD;F-X%0K!#A1xyHz}Wlo_&r3PJxR9zO41@OUf%M06< zw~a(Lc>Bb&e?-0xioUJgJ4JJjmh+S2j0>HhT&iEOOrUzT?Dk%Xe=8u-fw_BkwQmJ@ z(zcs+Px7#0_XH`)6+lhy)Gl=52oNj3(H~E)`eik;bMl+*iwin>jVe>sgm&35Jw78L zRA$bB{23<%U;cpD4oDk6An^fPGG2{H{wY+?EcT2?0#q;HYXD5;ST28zX+d@N=IF%_ zwN5)SJ7vgbYtTFgMtEj^Ob-Rv^z5-3HPnT~DKkPMh#jq)!6U_Siy2^!L=cH~X~D4a zQ|SDU)0El@rnG^p=Y?RUcUM=QA&4ju0w@h->=T$u;_OI-P5kIE?TryVq*zHHx_X=k z;?}*`VO;ax2*eGbwl5ZZ1H^ZE|C)gmN+~5CG1~SM>?^<=ake`yM54e5QCAx=e*}F% z_N)Tjk>$=URSx{rjnGh}f?{Ye35o0@dxBt-tJf6fjo8)t#R?crFMf`*ulBIliJG@m zEvv1dI%idT6jnEMdi%VW&aC;|5Dcq!yJVi~+5b(84ZD!e2*-uRpNG}WqjWdW$J{LG zGOk?m0SwfO_St^E7PKUT-~I5_K37r~@z-t1dcG2F`AVjX)HzH(K4YCb$?BVkvd6k9XS0+AT%a~B)d zE4#L|pEIiOqY!|^Heh%jU=XG4(tH{cg9b(GvYXigGoR}0TjNZZ>HYDbR4v5cD-1^@ zY7ISoqXw`Ux_^uBvv!5i-#KrzNa5polO=}s?Rc=F-z#6Hh=%!fxb*c_5zKy0@1e>SE`nt$P9Vk)w(w4E*a@4F2@0hAQFSO+)x=WorR6*WOIHns#?lT zx`#M+?AZL^`jN!Tg@-o77B@aWeT} z5qvl${W)21;%46y236o;!j5--g|d^l95-b7-Y|-9{#96pXa3fuWrL80@2q~~ibp$1 z%XWwaq`KVQ$n7Gp+DbRV&3&RpzXdcQfZgXJPKNYr0v~iY$r^p!rjo0_-$RIH#83r0=?-Jo|-A}q(8S0l!7PObK6@H^!a+M~%Hn(cIRXwY+9 z0FNBRcBoI|FdS7ry&vVGUcNDA#>ye@0!wp9Ct zV60b~R$st0_GES2v`%SO6TOo{$exIxlRCM2^{z6xRj_OAjX=5m=f#lW4!T_*SrC~3 zB6*RIr&g3qbjm7h-X3+|e=?9hB7W0P_liFL2g=xq(=H(dt?4}72nlBh1l(4e|WaxZbpRplp@{Tlv9|5v$;79 zMQc`Kn{TQzI@0S&WL??nY1C>5=fWOTz`i%bC6VSIoMEs0y_L{6wL#zvRX}>i+JaWJ zHSnS@feeui^%*W`?M-k-PFdrfqDdN<|9)u_a=|RO=KS3msAsaglUrY+ml?LVQhWUw zmN~5KH5;|rQ3^Yl+E~kN1uxkKo@m}U{BkQTp3xr46@Ha+vu~j*-!}1Tsx3nX9&`G7 zXLl4X&zXsX^zj>-b64glB?>Vre9Q6$FFz#R1EM?wp#G*WY&Y8S2B_Q%&JgClC}Z_G z7Er|B-!|-O_{a@NH(oTzN~GD%)pc8F}+N$rh{OCy4-{Ve+`4+mxR1Y&09MT$nx-3S{S)^s8RpG_<88$-)l;T2ji zU-(cyVxiqWhlJ$L3t8KdZrR&PyAC?WfFB#*Wsf%N_-L1hE@3okP2(44IXcn8p4=TU z!Px*2GdM82$WHgzn8Wq2%PJ_9NHstqW zo4jrEIB68I3qEPUp+ou=2C%VswjHxnChXjDFi7s;P?(B-Rx0!X z@LTclT$cqa(rS^BjzGX^WoC$Z!fvBD8+wFa>hFb-4hN~}(JAYxv-11A-3AAT%#rA= zHNiK(iJ&3vV45no(w|#e%{!N^G+s=&F3o=^*+n56cV#kurA@Z@ZtoPYXJ>bOu1d&| zz)UE@OrFXxRb*j~va4)i*~QtG!m|9z@t_fMbqoPtVUzBUWeejuia5jw)TvL1J$bfC zSR&3}$ImLn~j3Xi>~?=YHK~wU%m%21fh6(wfThnG4n8~+r3+#R7WQo)@oI!B7`P( zmY>Nb_xTd`O{ARl9GZGRF4y>=ZFeI(=Q47eE0%mIVUiVvB7b}jHmR-C` zjP)IJT=z53l>)Y5Q-3I+@>-a5GRyLyOR&n3$n2nTA=+^(Ax8p}p$K#2XJswrJxM`; zI=ul}c}?*Dq497E;EBQw&9VY+ifL{+8?tZB(2zr&7&v}qkI?!^rTX+Q1&j-5_ey3*D9!=T? z@kh!%ZPT@V;EXBiI{aYejA{n)dEpiVucH-L@!i%_`@ZI<@4esKAJ}dMB7obDY=Nn0 zi@*RPXwq+hf!CsF_+gDu!AR=yREE2X4P{;3+Xprb*8x9UX|$Sit)<3{&k+xrc#Ck0 zIo~s+^V(*7+`g9dVqSKL(t)wv7mjakGC~Lj;(;`wFPH%lh0mZD%H-z;?rv+*E)?Nl zK9}^lxP^<-=5%*y>OTUeiYNU}ll@$G7Gr?BM1YI&Qy1os*L)s%P3|6_BBWeABU8O5 z7WOapgdcJiY8mdUQTc>b4ess5tPs~`Y=F%RXFM!f*1YSWlq7&2^v6Y*92;_?LSAyK<>on(3Ro)g{9@7#{>+HG>PWs^_Cv&ohk zq=EZT63B;w6oQDMN2Hk-7We(-k=L+AsIB@ASLrI4ZwI0Ww8{)#J~Yk}@?4&*7`t$s zm}yQVR9-=Ph5k1ey-YYF+p*@hG0%&$;5;$PAtwc{dOG|eCtT3JKTrH27 zP2Wp9?@;xsuuT!AsGm^Pkp_-qG!~=jJRF{xnNei4;%n%8y~ubuUL4Cy*(Y@L)FdreS%L zg6Q=T?o7)RbdEgpS|w!J&O`!#QT4#!pe>X}kWxX?E8hJkC^Rh^pJ{=!i=uX0NJ72j zmIrY6kSA!YbK0oQ7CaNnU3~8TmTM4zfKqg~qlM|xDSe>*y`8&?jXW2ygOVRm@Am}t z8>9WSHg4_-S;0bGTIHrb5$2F@xp_U)Q9M)P+|)0ut&bkhRSv1d$uajXPUJb0mzk&a z*HYM=+`XQEAJU_{b?Y3cO94jA$KlsjEZr#boLga|R!JOm+|i2qht#i|ik4dB=K5u( z$^M(Ov)UVN?P*3G!UkRaDtSL+apUVL`=h?W0 zPr^>_p@yuEudrayPZJ5A2)L^JX?Mo_itGHvp43unQN^F?Y001L!aDRT>Af0Hr_tAj zqeV55g)eoPw7>Z@E0mzZqa--!5w{-#D6M2MfsU=7t5!VIK2gK)=T@7i%lk8P33O9M zg=XZRv}M~_>0DC*i_x!kEJ>{j$pV@8XVe&m92p@JzQED>m)w@6nZm_gUpiQ5p}Fbp z?FJcmu#E=#imv9X9~vbJ&mjhEq@S)ZRS~9`cyLBDLV^+aZ%?;gMm--b_kn}U2+-Ct z+*(25!U}~3>jRmpEaqLCtnqeEN@S@z>=JQPeBXRd?1Hg*ChB$_$J}eAl$O}L1bQCQ zPo)iL0C#lAbD1P{J9$2bQ9qa8^zu)a$c$0k638>32yMMr3b6+GrJO+njiZuJUa-CY zMr;^}QBz(pw-2cgY3jdP`24B_FEigW4h8nR+WR20T)LkD9gch!Of=4IjB|i1)_x?N zsQ>gHuC8ws_rI8W>#(+(=Y2TAU5i_RV#VDdcm;QND_YzkI7M5axCAd!+_gnpG(d4H z9=y228`|gd{k{1s*Ewf*XJ_u2-E*$JXM)6d;~oYJX3}@Q=yDAmYf^+L&5{K^cGsKF zfa9;Gs|OyYg$G%=0#`HMyE8U-z1GTXe5bSshR*9NGK59El>RYgpJKi3q-odJln zI0C{i)U3`@tm|(_lMvR*2Q}gfZpnCJ1IUbc&OPL2R$i}q+v_i*3|Q#BW16W-Aigc=d=s5~rn;F-_4vHoCo z%wpwFT6{O^?SnHsoltxAGVPDRrz5UQS^wqqx4=F@2RfZIgjNrumHNyGW=8`CQ}(vS ztry=TB)(EhnY?LdV0OA@&+7y&NcC;Qi?gU0iOLZsV^i0oj%Hu zx!Bjl2T(@~ZEltpBLi!qb5^N)1o7uzn&nVMYi)>|2Vy`8H2e{!wX1i4XI6-3xh}_1 za}txSK?;;P8Q%2hcSe%CG&$z79v$E8$;|^YRwJ*0qX_u!DnzP<=r|8j)j?a{sF`ce ze4MCOF0WQ^vH-A8q>m79OS1L`J*3E=Smu^iDteS=ZzOn|toB$lBEt$PPb|%_7-g44 zL->kq9i_Es`nJ=f=s~Huw2Y>O?4b(0l#rgi{3&YO4<0{eN}4oAZjL_CFDa(Hq1b*i z^1>^tZhktL1?6F2pick=T4fRSX>M;T;gkdIbNCmX=+}Lc0+Sy>j9X-L+NkK(+^0gl zjH3292Xb7(^54hW-2%Ifr)1*k{m{lIaSS4y_&J;GuvH$hXNk@)dN+Sc<2HlCJN%E`6AWqVq%o+^mPt5;vcm){ZU%in|2z0 zm568k(SNuk_};>eJtG${HWkn19f;6JL*(|>Vm;X#Ls-CBCw|DOWEQZ7_K7?XxQ!#= zWvcoo&QP?MTurx|_T$lhVssO0>Wj{d!rodLCq|j}b*(aX58ZAqt1;}XK~`#z-=@y* z?FgiRbbz?J-%;IlkoF>)FU^2h7W1x>{X9NTg3ooxvz{hgg2taGlxSw@L4GJ=B>+eL zwYw&!VigQF;dw;ZTV&f>&yj>iWpRQ%6V6zh8G|I@A=hR!vFh_FpQtO{N0=-+%f%Iu z-tiIV8Rhvz(MLr0E$^*H;ul6E<~P!}De_U_ijgw9`Y^JUm%r2G+wXG0oEqYU3sEj$ z>VpUge{PXy3gcN?RebbIRb4*6aTf zO$t!ZBP|G%N+cS7k@Qm{^Ig}VY+OeUnR&NUWBH&ZQ&An38GK}eVKw- z4FgOR!x9xx>aHg z(;*z1!we@79wBdyhywnD3kq~@HoIIu2stmcUsvHQfO;u*eYEtXO8$r5e1r9cAu5b? zP^RnNkFfdYOM|j0tGNE_OMS96pOioWoifRnTPgj@W_u9=t#&_Ia9;du8z)1R zf&l#=luEXp-S1S#1Bt-YmS&dbpE=)+vw%1=7L3wVufh=AC+-eN4?s>as1nI?!|Qpd z&{Qm_L}*f^Ckaa}kND^E-@?-O#Vy!#iNJD(WL;=gL5P25aa?5eLDJqcR9ot>ihi?d zklsfom4tp-*;A?Dkt+-Q^!P(C(A@)ffX#a@RcbUjJr53&z5O(-mPzxLeFoaqs@aguJv$@X$*HV~!;NauuHa6z4~p?dzXgj` zLoZY0YQmTKQf7%S?N1Ty?I;GGVnq(G@TxEqch%J?IU+VwGs_Q3+de+o^p9az z_))VAX;zX(Won!KM7Fqg#h_d=$c#vMn#|$Wrux^PI|Bgag-L6C&2WLA!HvvMCf42s zQ-tSv9rLAAX-GypX|XscYarT6p!S+#Gag_%;i(jzM9vaU#~rlbK$#W#0{&E6S7|4m zGrn=C;Fex&6C{8?!BOhn zX3m?B6}1q|htJA%SiC$JX@v}vSKcJTg>;vFd1n zJF&5*JE^#VXKpFxK5l~P7l4}yV5~65{|13gBdZ& z{m6{~i3pc(Gp$ABAYAmj{w@Ro9X;(}7g~#SdDMIN1SS;}UM$G#fvT%Z8(qw_MEr^o z*s@3$mOh;cA&<@K(PXBYfeEV+5yIDx5!_^K{$sjagFU{M&pTR>TeMscv7iQ&CG`-g zU%fyPA1@P2O;UGOv1&%u_+^&(@p^_p*uv-(uST-K=;w^rhhjGEg_LVH_`+^lp$(5V z=Zd?qSuAMuJ6m;zB+AiF_-l?PL)zze2AphFRZ+hZ!IS{~JDB=3Wu5lOP?3JpWYaTQ zPv!2rA>}gZOhCPyUUcoxYS+XGV!0cIYX+# zTGo$)5X3%fBg2WU1LDk2S(eq9YN^4Iude6fWczJsQivcF|83c-@WD=aArA@Sva_g! zu*TYF@l0#GCIf=JARWw*ayv6+9OwhaMZB(V@fz@Kv*dlRT4j&S+b_h+2C3ZI@|{Vp zrK_7>8>HJP+FTeqeeABbo z$?rl3S8`ssykRc%x{fum2Rpvl_FH6%XmY9iCF`0hyj}$R^QIMTC@r7C*$nYfEC_z` zhn=n#Q4|;WsjB zBbjHJiC4#R(+HTc6LSr}F&*en`NUv@%gV8pBE!*A`H@ae_&PD^G3A$ym&bYPxX4}u z%&U6fpzN@6_p&wces`*z?b$JfkUZ6RG`8?BN5imX#}LnbAhdn_ZQ(cv)9;FmjUA$p?muJOI_L;>7H#i5|C4GllaFBd%o*ct{WpkSxZe?f-6H z^AXMpiHhIae7#gO^07p4&%&*swA=bJ<1oXP_S`;bzCz2a=NW{_EOtfO*tqSBW)i`f zwjQ;Mgu4Xd56K_XXo@wttfSWUsPDQ-#D1SX8onl2sblAM7}@=`@dd^Gk2}!zj9?JO zs;2D~0&Ga!je?~S!CB)qPKuJW(>tyM!%5C57tUu;*94n>%OUYFnS&PC|}5NMjiv0lcLLvsry1Wa;;2UBDqYxy=>o;i;j&7IJ2^M z;$8G@=l>j4Un%?go-_^}I+9P36QitK@9`kvm{uiW0ASy@NK$PtNc-G>C~#lP-1A(1 zhi!-W>$I5+jt2z^F9JicgcE>WaQ+sF@8Bsl%oMu6KSX8 zvx&pi&(^djaLmRe7mvLbs{s&ULaetYmbLJ<9Vn6usn&T0adc+oU9Zi z(0q4Am`XAvTG+TBv5tL4;reCa9q>u*hXkI;wq8k^6-$-8TO`CrEgIjvYLqE&0w97& z!1^k+aMxmhF9zkru1;VL_ok=Nj1Zyu(LhowZi)#C=yF+@Msox3yo*Ne!+vmal^XcL z5x=ob^~Eh#J(Dsxa0Y8iyGLl{`w0s=I3Ceq;1!NO^Ec1rcH+nc8H-1u#K@VgBkEuj zY{A2ivaY3iB5Xk(eb4G(W$eRgz_Z3QL&junTD7B)5t2J#>rXb)@!v!~i{|zF5I_gE z)*dk%l}?!t0-vT6f^imx% z_W)q`2uzVfyWXiohKk{2dY93UniGSXcG3n}EO8Pkm?x{9`XVTIJ@vsC62UYezl_3> z`2!J)L9sx0GU!TPOkvyMpCcnl@CARF>gY3&#X&~(Yk*WFfC`~rqj%SnhWp`F77+0@ z*zyPs)5f5Wty*Rx-HDC~RFLxQp_R$G>$MDmZGD&u*D{vscg_(WBV6`tC7Ej$I#GC5 zkBN-w$|VQ7m|T&sy)Ct}(bl94bTQ}XAg`!zSZfO{FO&obNm6M*IwS7k3Ga0KD#?7r zq=2o6o=Z+fU$?NKvP5m$?gZ_>g>>j5J>FwSzhKhMt-a0^&Y#}ZUM!3UvO>XCCyBkjGi#GGbv{i0Pv5wp+l)dhc&OpFLTmDi zKoLn;+cq*~T*ZWT$`cLhA=o;!XvEVK!s9+5;0?I*nW1fN-;YrnD0?S$p)8Z`son+( zlv#t8@O`-Pu9*N(#3gB%a@#tdb8*xR96u5l0l5FP!TKs%&Q3n3f?1lEbu2BYD}f`R zDx(GIR(n#r!|X#(YbGt3Xh~-`-98P;YKQn41xyN`gd->hum(&J2R8@z>bIAM#5uuiccC#IdJ-W#^OpL6W z`+%=sP*TNDDI8(|)e|A6@H&It6I!w{f&VoBduS!RXq~FIAIHZN#sXLSJ^-x!FYw#} z^>^C{u;YUK(h8U6wX#2z zD6O%&_l?jgT6=HdnEZn}0my<_4Oi)^6(R$Es0RexzxKP+Ky-IZqCB4bB?p+lIiP2s z`|gl=@MGcPVQ+bJoqldWZD4%%`aZ^?WDzqjJxFn90!C~t`!L*pQ57!p{xgnRm27K> zQsy3y1j_3}m4lbI$OzC6R6izNgn4jU$VIT~!jCS$(LiYI{5LiIQMJDq#M)T3^`3y3 zGQ8*KGuWAR>1*{z5FsX^qy9~TAJ&I`Dgzfmaodq!{yg`ur5HFW!uLR__YLe>1~?|K zZW8nedYXoAzgHHsU~8hi2o?@AL}&o0lr2JDcd{47`{hAWSjQ^r+6?qBBj>or-U{A< zW-?08yPlE1m$O0ATy;{D<8L00lFMZv|5)BALJHA=MN(MN(SWt5h6;55Z2INtnjc*3 ztCE0ohzwAX-8})I@_#W02ypZa)b6#qg27|X;p-kvpOlAqC zok+WeU%N@E856iK96j@ghxxF67|cpcm^#2-ko%nEV`Aw;(%pM)D^qHoE3Z}N1K^A3xN~@x zy*Q+X<(@S}3g%h5ART9q8(Qhhzn=kZH0ChnCCg3?QpGdc}=ar$P!rY)X90eH-baAL^26$Ld zd$v;p6Q^NZh}QWDGqL}5gw?CLNh}eOU&xSkU1T0d$KY%#0Mu?pL_d#Q2>?1BO{ikX zBfy@3Z;q0n$9&|E@{y@(spi%Or7?by>`AupZ=4FR`XYYmgpq&>tiN2$G{{lKU5Eu! zL28JIH^_j3@a5kqfFZp$Dw7{H-ip?CH`#*-xlZpe4$I5p279`IP@CaqU$LchyzRsv z%JhWueV0E5J+2e8dOeC?>#W~mJveTVmv`mO%`FRV$%shsgC6%_eisGjBje+eL1H2| z3%e!QtE8O!XL*7mPp;o^qG$a4B$hrv&r|O~H_C{RtHRd8Sl#Ya?o9}b>A+7Y=B_|=wJ-H-#$Ti=h{w61J zk>i+4a3!vtvmVE*)=ZbmwJzz71W|}_a>CgP3j55*O=2@v=%rlEcpQ_X4hSQ-vF!!B zPTOWmJx;EY&h5BabS&YS8)jW7j zVmc_rR(QUTV^Mv+n*e3m{j+!Bx3MlYa{&G?y{kF4AcvZ_05m@?~(6&??skw>Vf}h0ec$Hq{ zK9MsHglc?Z=C@PN-Pm&_?u1;0V?2$lZ}&;=`}vla>8SNBo|zKUjQ`4y;0>#A!XUO8 z`71VI6YB?g59;;p`Jh3DZ1fW{RQn@s=V!LB@0Cpy4P9K*NTxMdeGboJsvev=yIJ?> zKNF3FUtN4}?N!V9>XUewd@-z)n=S{@Dk251lfg}og5_@AZcPy~BR(u7cVo8@ z!Lf4R9l^15Ahr`#-tJH+e@dnssvs9Fj_h+_Ib%UM=ynh%dmR2!GYfvQp+yy%fk5lq0fda%}#}d%T>gB5c3`tNOaS=NQu>_4&XY`WbI{ z0s2{Ue)8!ixK_2M1F2OulaORXa)x6mSIi89qw4O!Rr;f?n%hoU$QGP3^6xBw&TB@E zq^wUV#6y%cxCP^g==Lw^0#)RlzkAp^FdoP3ymw#Z(=;;;;?pO4l{tdqHKpq%)mrOL zo*N%-M4>~%pRmJ}GIG=ur&2J#z-xXPlbex)_WtI+{LtMe@c?d#0}0;y(>MXXyA--x zr-ttOf}=+5cZ`<~uG( zc%-+Q%PFcQEPmOvFoLqjpR9$wp&xD)u$gX{xK%D*Cvb``VN*?rEaHRezRLmg2)0h5 zGa8l701X7<@2K}%Q^sqsHJZFAH(%T74v^VDUe33=z;Vhd0@09>l3p2+z$QjlR!*!! zPgeR57@*-%0VseCDqaZ-2b7OG$@<0nz~63|d^9I|AAgUAJTrp21Wy-JS6E=)hJn0Z z#1G(`mz-NN-6|`7Z5kf5nL7t83PqB_@ae;3wu1)G9f`Z)v=<-wk>3_?D0?V3aFx=e zDIC6n2AF6aRM3{ID{HY=p%a1qp6HG_Q(kFS8aM+OZADBb)%+bcBK_v;s_P?|XRD&o zJWrev@Ca1;m!x5^?++P-?-XBu|ZAy6BD0zgrE16Fk0I3*C(5G5nG?UVHaWmI3^g*w(FA{>WER0S6&Kam6e? zV0)I(LhyV8DU)OnO7XEvhwTz%Il`!U6ZJIk2-+OGAGG5K1 z`zXNCK^HUJ_?<(1jehg7HInaR?TO>B_WyWE)kFx6VKPmkt|YbsOcUFrm@!f!yHq!} zRQ|B-67I?=&e>axAIFSHzM9t;eoX(!Hl`G4^*uaUMmPvm7Mu^8@4I4;(QqWTf8RMa z_1rt;WNT@(eTXZI>5vL| zwwm{yX+!Rxl}HVv8jC!R1k&r@TErcBCh5nD7wwVzzV2YJdB@Ma!>k(Uq!~Vt=0=R zF2hPYWX2V5A>P+#|I69>%a58h9J-NLamK|LFI|7L^kRko zBe4@yb4>A0b>qKs`7YeFQEmqSKQza;<42L^?T zS%kP78bX-LOIs7ZY=CFCI?J8?jEge_)IO&aO}uT2+u#0K?qQ;WPesDHOfXd%v*0_O zBi%Wn^3^U7qYwEe6USFIcK4}f2%OGm`_cKCd=CCSyzn}o#(XjCXgC{JiEz7}o)T2l97?SW%$KU!V)U8%dT!k6y7T^2mPUyLJ^0Y)nO&=1 z8wV6O^p_iH11`M#Cj!}X+}E+eDShzc-?Htr_Z34mXA$jMiG0$u>>{m6hy89%6Im%U zC6}rzc{G|;mBlP-nqD;7Q_)USg$9JMHK~`S(o=9%|5fJ?uV5#9&J_RdtRu2~!)cZ6 z-Yqm0@fR7f+Y&P0!Mg1k#WA~>Iy4H})2)@dH z(I?uYDb+H%O;b?99E@Tlh|xwCfy$lH?^410K_Ul1zK`O=N*zJUddS&T}nQ$4utPE5ET$O&ySB!l+Me_Xz#f5|;5l%U2g5wT8etea1w} zI6hkXn(6CJEASuUoSc3aMVT_9KDEKf{V36e5w!6~rw&BO|BBbRHTeJESij+S-3`aN zg_(<2i!%01RO`rf3G52p&h2gDq{1qT-P+!=>La|4;6g5AEpq%i7VWi_Ovp?Wx+Y^V z4r##>g89NTXd@mgTd}4tUpO8`aG4letMq5BRMe*Tgx^r7U%i?YWW2;a5}3OsaS&)h zuX6GZdQ1^@Q!dGt;4r)l`F)hM?`bVE$zLI`k}d8wYIS{x2w`A_tT6XiP|b@3oyp4f zf*Dcxs1z{&InWj$gR*nQ)(>c{$XnG?jYp<3B-zMo)fp51=hA> zin|s(>uTTLa4|rF>ep7~hU<11hhRNEO|dQeq|pBc z&SvIcF=VT&5VbXs9|+|9DnVniePvBYXAUAn)IYfn*|MI4X+6~3sy9oR7Dq^;{JV4W zJN8jHcac)baU5Ncdzoo^lkvYBkPvhC^2JI^P!LNi;E0GM2ebs)%bG@_S0dfv||2~R{5`~LSGFfiE2 zJl>2B{zKslAO;>FhDd!YaYkWH1rLtb(%Ix9^0{x}!V=NAB+!Q~m$*DTCl*@FBpimr zJX4?a3RkSiGVtqw8i$WZgRva8?Wcdf)J|!9icyB>lr9)T4@XR-&*-0Z+#;cOe%g-b2=L(p>ozU zO0GyW3Abw};=s!K7Dg@+?u?)Rog|eND8>`#$nB=p)8b(Jox>)!ZAW|?kriH!$R2~! zUOlw{rvMvpsfI0w-JdzXd8GX|fN1?>iR@T$jh7d)-7C>5bV&}Ej2p58LzpK;aD2E| z(VDSP!!?K%Iz_H82i}h^{AdN<1Dh?b**gjf5q&Y=l+}#ZiuamF(~V(?|&lVL%s679sE@@BX9!w@&4)#M-*ZuO40ju z8`46;;mPESHrYQUI=qby>tHYyPWBiP_18Q>J)@7jh?}L64{`z}NV&x<36nt$(1vO# zM%Enu!Gg*fw0+^qrS%KhS!Tw2V`N3Zgfp83-O<_R1rm(=jT$h2c^`;;WeBQaV&m>t5ftDI)PGW3YvOi z9_;SJK5WNrt?Jk^KZBZ!o~?bLULMT?8-I?eglWfuE2p@)8Sk+C$By961^2tjJd}DB z9G_8%T|%JId%OWQ`DM%w*JpCppswy$>Bk!;scAkIV`7UqBYMn`qoxF=Bj0VLv-pAb z^$IL9;1V__P6*r?;i#ty1d&j7tHJV#;V)*}wTL$ee>CywQ$&;T+Dq3hz7?I>#A)mXM?dsD=D=CAl6d&4v=+m1|U6R!AvS&&IjRQjSkDDqh5gsux8Dyr7LC5Z4( zVXsPRl4NowCuhS0 za-dtlwW?Vi8ceBTP*1Ro?|3XAYU9qEKYPf=8LL;|w!2hn~OO)wsJl;IHv@EdWv8Y{8HCG?MZ%fWk8>HjCD%k(Nc`eZNhwmz5^+d6WKK~4+b4lPg zvc6<{tWlUtOK>aPXmi*t#tnuAljjoX2JV z8k-RDrfT!{Fv6SYfbC_gP)B-Og<8do`xYA|?fR#0bDx>H*1#UZ(lbbak(Kht`(o15 z3WuG{uWw2M%O169#ApKw6#T#a*zbN-sKl}9I3r_tig2&83H^k5OWA? zqSlY;o)r!;BF>lWuU9%TTZF)DKx}@rpNj*JN%NE$jHj{H&SDp6us){;6E_&Ke$p@>MWk(+t9X z-RgUtJr#_2U+VUAFpv;T0?hZcP)E7E6VyNp1#5zFE^p^bB3=GekrA(A^op)I*>pDP zOH+v}@e4?j1%O3GIhAvaxe89ycz{ekFLUGsfwO%fpm?*8R z$3?F4sVM6*h`!D*E6dKE^%dWB##**`2KD7`GPxygrbQ4TWvjh=4#(U$IwmaU8yH~7 z#@4wL**w!*$*!g)*^2SmT1nX23_!xF38Z$DYQ*&xYsDvk=sm14%ZX zxdmv|fZ?C{wH!!rVNJVuh&P4EXV2d&y-U5!?lXj%J-nlb&!3YQayftoTM~D3R<;5K zxd4}5JkswKo1^gAM8NOUp}3EO`x|{{7TZciWI>VUD@+N^<~2iGZB-U;ckS4S300`H zy&Ue=rS9slm+#vQ5;&(VQQTj%H9EC7igoeadjPO*xDo3?AFE3xh9GvRJSX z;6cC_#zaw%w%rIcn2DCc2{gGC&Z+Tw{kcEZZ|d<`=7ZZ>cK_>ZIz3+o0o^{0m{$c+dDTn~-SmrBph*j3rEC=!`-wp7A<=uGfE^dWC ze$my{jY>`7DBC@}nr>Qn8OtVd-q3nmb8;VB7GI2b~p zo|@`-c@R#EHB&&Mum_8M*c%F+e@0-29Ju^)V|5L7wli@S` z#^^obO^R>Ot1kYM6lF_v*tG0g@SLvZ!9}jj%foTMz9BniGU%hKopP6#JPR-We1@0w zU*-#F8Oi-!`R!t|x?jlyXStmK7L2@TSY+JuRcZ^ovW2QO@ejwTR1czfp4?NBvXleK zBWA6&SVa=1lJ{rKQ|s-YRli#IY%_(T!}Ftn?=WC|Q}#54>UC-$gHSu^1ez`#j}!{% zwA-mRSKgt&D_Prb>4cn%{hFpVyUlGx`_!5}#V_=SPHp=7{_j5`F+RPOU%+YdUy9U+ z?6hBg#DFOiUFuC&_?l#iL!3K_yp(VP>`iB)JC0YK>7@iAB?NC8Xk1C^D4HZ=9zBi$ zM2b&uyc=$yRA*m|$ee2KuOy36`laCbUab-~=gJBb1M8&0s6MIgvx;ATXe%4qu)SEiH>qqXpD*Io-zj&%Ol0!W|5A=8% zEex>jF^F>LK)*kw8UaZl*IPB67JWT;`!L;3Tl(u5a8o#|og_mp||H83T zLNyJ${Gfb$pSK%k9A?1?uNZx5NWyJD*U+%=`D@C}-p_xI(uL64Uva&EaoWK@1k!P4 zGN#a^yV_Aq!P_7QG+{~OBG>Bq(85wVT;lr;k2Ljo;^plU}J=qNdg&%Lbt z!WzcQ6WWa66BA5AL;N;?X0IobqO~0W4#+QGec$|0Ks9c- z`IIA#0luXcah0A?@I z56*q}0t`?84vXB^>C~3nQV;kRIJ0{0c^lnwi2u|9>pkUGD*^zS8%;@y@aY2PY3|;R z4S+c-q|%0(?}>UR`ivz%7YO-?(Hhkt^tUrI6Y%vIKvhVj9q9Dp#gl*vgphj%W6l{u z0CQmo$1yK<2Ap0ONA<-N0Tu8p`Qwbi_o;-ZD+jnBg}@?sZ_o%xP#hPM5?qb_joGFE zasY-i+6~f-C{HN2$9Kp9SietL=pTJaqSKxQ5mp+w?yC5AetUwv3u*MQ*q$r!!@ zK%immk?C+b=$U{^(@b+vs9$q#%sn<7wa?5!f>$vt@Q#JiY_G%O;?eo54d`{V7i3f4=2P9$)U!WGnNGnJRI=7>_75lySEii1*r(1VqYcO530f3N21fR#zFe!H1$T(=P;=YR zJU7WGrL@?JTRq)sV?WtlY+k0pwaR+ZI~YzV{#0(Y?|YL7G}~yHq zc6Zv`v3HbI_CfHni@3!mh&VHKRhR8T74^)tOEb=73=8(Y086EwvJP|6=^|ZMv;Tme zI1zY|nOs)Wx)-PJ_Z=N3IJMrib%;BZ=6pW~g0Cxot%qUjMd~Z+2Fcts_tW+IV^unN z$}VetkorTs^rfCCs>lni&^oDYa6K4DB6WLge+H!4X)KC5j|~fK`C{X**=uit#y#yQi{(Z?3E2v_`g;Da(8CW17n+!^?K4s=P7SsL% z4dzCdZ9PNsISn1Aq0Ex-^XqV3Fx<3oJ;ODz2gX@(sduD>Jo4RoS#g<1MD$o+vgXoX_?C;#2N&Ic~TjT=0JQIEps`USzADmMS$CL+1XK0=RLr^fB z-lN^9X0wMN8?&&pUI5ZHL=GjfdVWx)gbPbkY(C0;h7JQi^vwlW^|#GrKiT66VZb>kg}HGl_I9!$bExUjdbD*;_ng^awA$uSf-y5ZKy0QXZje|T>M zTDaS$mM^;Sz5q+G_l)*OrFV}rOExQH{~&y;O17>?ZVe-jukoYciK?+XU zR37pXD(Rm#*?^9@13nd|+2}CclMlZ;SLfTvfa2_-hZ-n*FUa+1pnLzn5sfK=b3T6I z{j^?-<#RScIrZQHG-BbgdJq-N06Pibir0G#vUFq(;9m;BVUVcrW8vAel4(;^K@n{1 z_5TELrG`2Nu$%0+~Aaw4F}bG?h@6va31 ze;z8LhPr#p99vPzfhbE7hyI$IS=yh>Y{Su?o-y%5nzSiF5S}8Q`iC$A^DWNV(?t^f z`GwSSBgh|r!gohI!rLkG6Dle>es7So^YEarDVrD!i=waJq_HQhEAu7+J33=o-|Cc} z^)-b#(^af>D(e@wrZ(y@dyW3S&|Y-IdbQr{FoeWe--49#wClY(QyrEOX!;DjN~Je3!sRlK>_xxRgIpo|CT*ubFrbizMy|Ksg# zf(2K;rTI6lS?kcoqQde;;DM_E76N(bcT>E-b=<7WfE^>)(9CDXvfeinlHb}_&~={m z(R*!ha&jtb{RGUPJHVww3H|=B zFx>Dn#QBE9IX|j;|A!Q-=-5Bgv~&$(Q$BrZ*KI6IZ=Gd)tj}z+uz_En&!45e3RQN& z`oz7X??2i7-z0ezfZ3}EFs!?wOkOZf!gzqZdH1m+=3jBYW5DFft!mNkKY%ZYnl0Z` z+}HeMS-^w3p+S!|zmrIx-}poq%tRVPLf4N2{xy+8harE+av*?Lyv2tu*C{=8;XJI4 z;DaI+)Fpxta+nCpCgs-X{)r!o52e0SL_RPB`IfnLcZ_trAR?)?;e}Xv{sy1h-t}Zs zfa7`nsdJH~DAxXbWz{VpYf4qt+g~U5@8c##I>SOZql*`9R%1jJ9z_gn!r!Jm7r54* z2#L)e0c)2Ev>-q3Z=peYN^`dZJUL)k%_vk^*H#$kY~(j2{!>pK!~)Ok;un}_IzO#z zKh@A9MXHaKMd==U4twQ)gwc=HlMiQ*4DyI6ql?E@iK2vpag0GhWH>EymB&qQpNu(7 ziR9j{Ea+@(iWH|qfKrk>z^{>YJb}w>ivDY z>l3zkMS)b6li?^RP~U8v7@?4=KnwCatPqaAmpD&t>i`|$>sPnWMkt%)$RMeOTGLcQ z_>5GCkCkQb8$5X+>34S+&2f^aTExOsE@p>p31O*7E z@%VN;>C&)@xw*O5g9^^YJ%jhVEm1j4zm7f!%+DqBx3Ck>pG|~*jJ7R_JXbIOY0n?~ zi(O!TW=Do{0L7PiW<`Q35JhT1O@tH+!M71`&_sfKu_y@AK?R!ry;eySD#uKD}l? zfcDc3;QO7{oO^shTKb`5Z`FzQwUiV+g!?-d?ChJN6f?V2$*skOb|m547E%rW<<8_D zFBw$tpqmh0tj9CKO`{15axKQyhCuGUSlf>ZxjuX0BYf{+0;bN*LAKQmp;p*6Jiz$pF6J1dV@Q4BTBXL6zb-x4K zq;55OfXNmn5^YPWm|pX}FC%T(76g-kOWkf=Rbxlw_)^tVqeUc+Ie?Mn1kY6N2A3~1 zU~7A;)Z=j8Ggts%-dIFT98BF${ueoK0oj%fIcrCniO+6$Q#H$f!(wm}S%D%69|>%4 zBk(%$^oP2TgmF!Vu8`qh_ep8Igk?oU#$BA}KGue-G( z@uLio_!!fGj%aKU?9MS=MTQyLWzOK%sC*Fc<}v+M>Xc;=aAaCoU!MuFRm09XAGISf zmTCBIo8Gs6oDfpv6oX_ zK@HsP1EVW!cYfn|Rxf`x6zGHQs5`Y@bWE=pCN$i|P)jqAeWX@y~S; z{k*8R^BYCn`#Tr6wHxlxMcTVwq6PjI;q6+Tw+r%Nlc@EY@iPhASuU;0+-JU{BM2Rc z(999*<(QbOckrws+tUGi?pwoy>wRP{SZ*^8o)Hp?qcd-yt2^!!^=p}|Ms`ex8HB$- zbe|HA-QABH;M;NwSIO6)0+upB9A3S&z+T24+ zm*syV+)&-md_{v=gv!%~_^;s3-y@v)6{uBS7r5X7AFK3=?tBfmIbqSWIqs+pjGu1OKO1*!i{Dt2aaHv{2(3UYIfYPpf)ZF82LHP zVa6Fv89XF+7O1^w-1$|ibzikBsmjE*UiLNE>6y+4XGAXCQ-gqCT_2T+>{sn8bGNyu z+zCpUG(iTBLufss=_1UmX7(aX;x;8i)WE?Ar`7203lh5CogZb*f{sS}aX&-8n$6AM ztIL!?pCj5b&%E+LJk#T9Tm5u8cxNxNLZ0e$2NSIYAJ#)jo@=8+O2ZsOX_hZzLJlt( zO;^Cwl;mVGAd4qQ#D(=~{#g7z81@wbGBq@s;sMS}JpngrCau}2Gvnxge2?t!I3lE51?jtYsGmmeT8ctag0!t&qIb zFNp*+<47VZ-nvf)y&j2Il09JnZU1R_#sOYdcsy_qaq^2{gHXU^ofs&GgJ7S+eWZil z5Y6kI(SKu|aT>;-pQp!#6`ga1BY+lSX@c7=1T2C8fUo0hy+nVPjy<5#(jpnM7lACO z$JkSk46&EIPx2LYncIhkZtgz`lPqDB@=JeZM+V0u=Pak)WrvGqWU`#^X1>cH-2!Mn zPG8`NdB4!30CZ#roZT!1*zU%qypfu{S=Mp??dAnCn4fK$V*dlu5#Y-X;a^X^G$_@w z_Y*_RP@WfjPhrPCZ;{>VF4*JhDJs@wYbMh+AHgJEoxhaB5WjC~1z4KiqD`%fkRrH6Hrc*0&j<;Q=aK-C;!QmMb_^N?#GNE9eUUBYIRHXI5&Z%!^;;{eYO6@H*;>L$5g7;A$?^z1 z4*Xcv%h*VAp|$)7u0lKp!20`TeVGm$lJvtXf{W}Ge#)94D^9`B+X3n4m~dmv>5Y(X z_j=_Lhl#w`4#CqItvd?fMprM8&SXKRqI+A<@8_G|ULctPMIX=rGy!j{{*5-|_BubN z1~(|~oqV_}j5aWw>|~as;*DekB87YXsTU3IF_;?PFYZ;{G3IQK{5pgW7rudnuWg1P zQTTS?Q4Z(0Ne%H1!<~%mDg@OXbq*1H2tL_vCUy;9zLTx^|G4_zSdu1f-D^ z5D@7eq@-KAYiK2<2azu6hLP^>Mg)``x&#yuhVHI+e1387eLws+Gv~0+-fORKoW0jU zf3HmOZwCO+GSH8QFJ5@)yFyii@1sIUcO2g{3INp-+7(tS1Q=w;s-ZS4JZ0dnXV=O-r`s8 zMx$KuPbN3#Rj_G?H(p@6Ypf(uz77?WPKalV_)1`x+>o7tX{Tt&lIJlz+{VNxHO%hh zMq168jO@U|l(8V+pV)EAn7YYX8TgYqQq2b3Y!l`8gid5xER8gv1rwR%T@%iv1Ttw_A z8ZBbLD2@%66+T4H_;Do9)mH1deJ)-I16ow{@Yt`cRoY+dv0RSWbwQsjJ#D#8_{_GT zv5WVoztwwaM-4#;gz~#7(5M{>91{e##e!XOp}@sEB-Z;)Rd~UVVys(rGdHy%@7o6L zIb&S@_|GWf?U@kX`YSmqlepu683AXm0M0)b_~o~Hs~rirh_-9U zH@?`RDSBF(yl7^aiVsVchp}6wGIbW#WS+>DQ9!IM_jn4~^)cY9B}~?>^cmss`FIvbr%4hk z`AtCc%U#ci?*h#gg;rDJ^}cw|zm|x`w{YruNHURf&_oM!@;D4!|4lNpjt!f^+Ta;8 zVlTK-rSW5+fcH@j%tk)A_)hzP@O`y*NCk2dBFkQb0aQUb9?NMj6$mbHBjN_ zv{9gWeeXQE>HR&?o;2oPkk$h;PBKN~EXbxoi>}U0v+i8zhyhfvR#YU(&Q;wiu_O z2u=t38ulmfCL=MObny*(YG#*M|E4){LA*9A7O18-;}NAuCH?1^vtGKBvAxpxjin*?lP(87)HR+jp%~6ZTLr!GaZ< z@6Y&eD+)1X#`X9^^rGPy4IA;+E?=I(B)1$G>`2$-eV|1;q3BelM~wE?bLr+-VMt~o zed=vN?u<4J{Jqi21g_`J3?B^uogvQZxN|zQ`vE2r3X(j|I=fLp5%s03j0%;IjaAKKih+ z(ZE-M3l}8mkjLXw<$!V#7iX+bFWKm!sJM0SkTJJv*#WbM1J1*}`aa{g>7pa>M;+|6 z$BIDi%9Nq^>|7!U-jIDMu7AK4 zi?ZnU_;8>4$n#3(@O8y?4iW6SAYj00@9XK9*<`Ew8^>cBRZ3d@Y0sWa0_He40U(AR zc`QAW{lB-NxCi$d)wA|LahHQuA=Wb-4o{AkW;FvYB)X@T?{m&xJ@Pk!-E5=|;jND8q{~{xJ<3 zzMPLF75~q1ZFx9|_hAQ_S$fvXz`v}Dq*i1CTJgY`hfANy26n}|o?DqOwWtBw3S!2O zC3dWSE$MFX0~(l?ch;8kyprZ$f%t}>9ZZ`$v2NJ{8nlhLStf2*G$YwHQQC%f&)Xbu z0m}ze_EqC?!+PX!zaLiJ)@(5UoWn)cr2<@lF|w`_Ns8#mM52_cdkTM1Xr1e!ydvT- z@wlJU<`np-{>9@5x1$_^#ZutO*VOBDG2<9pM|-e$mj9x0PcDyu{C?%4h~Y)x0_ZR5 zk-UbCmp%wFgU{bKKN@#6*edo(0eJG5D5h^#Zu z89L6(WW{fxKrX(0xcrYvNalG7D~#&8YHP=6y-Ly1{DmuCjU5a6Kl4z)HT&@(CUYCDU=00MEy#UFMC~->$__Y2J%S_WH*C8(he% z*(@*y!F)xHI(kR_P4s_0#{=71H@%b+Wh|eMVtk6#JN`c_0Jsb2zJCd?a(-R1`ak~- z9ab-l7O%tS{`}(u)qj3mVF*?`+pz*66AsB>KnN<7tkr!#dw}H7sQptM6+oqxjjHHx zI{y1x3DfgX{U201TgMS7ux{Hu+g6TIr_Gp&;QLJ&zi zAOBg6qa(O|>?NN|C;gG1Imhk$fn<9>1+?)Cy0ygC03at-iiqI%I*k8LCylZwaU?c8d9@e3o-Z#$#Ta$u#kyz(eU(}rI7I7JB5z`l4P+6fD{8mE&e(*NYXWZO zhBO}D2k_KA*u%uff7v2IOZXSP@i73zsm=B4#aa=zg-MroJktb3(8wF4d2 zHJz{R+>}65h`C|e87-cs%OWFMc$u^^1L|9pLP9B6nv9=vEv6|DSQbgCXlJ(g`Z*_> zA{I)ijK&gBrGK*n=SOri8lmgH(9--JLPi4^JqP}ai13z5m@=y z44d8N@nj;7kO8OwRNB4)mVuw}#(BqI0z{0yp*f)-o`ecJbFZcVLcej+By@GvMErS+ za_&>9YG$(90>X{72sS0iHTfOFIp`CW9FAy^5ix{5&=P?Y-!Ksa`G9=e!~pkbQJ8EW zFq_#<(xMopp*lwJG@lNl$JE7rp z!FsyilJlu!r$L4R$`b#dDer)1N?jk}*g><+Z9>fJf7k&2Zd}1uc!MkH>$FamRFn5) z8jk6ygcA^vQtP)Y0O9Z3VpXzHZ*&_HZ-liwLn>N(I3%ADH5xMf%gzWu1|Y*7ALwHk zR|=PgwZDMQYWNV&b78{kzG~x42UNWLIdkhX?P`t7X2KfV$$m@(^XMdMN1j>0@O^O* zpWv2|3J^Mi&HCZ^RARs>wn%KT(JV_C#sNH8P7MbnDK#!V)`ft(2T3+l6 z7ajg#rgi_v5@Q%4K29YE$$Sm)>>0~wg0UE3e>oOzB+-8Fhp86srq^q~DOoQEtOkbj z`SV&r=UWOXK@bq+uX~8VB;Z7@4Ti53E&H}Z~B$~|Qj|4}`(`2}@^^&2J-M?E~ zdRN=N4r3I*@4u)sVEA}S1B->#*0sFp+?ZYOGMTW1lh&G z_*_aURsQ^j>3SFAr>*{|(%`b(6>nF#ptYOeXr;veF=9*@ykt`F3fcbs8=LF5Ec+UY z*;H(2z>AZuh5b_zS_%~PmU0o|$u|ZaA|LHKof+Zuk+%cV`(lY76aoHNfHp0SBof0L zb&UiY39XakGwocBX%{OzW7Er)^o(DBqK^AUb3px6Z`t$38j@A^?>$tx14V~g7{wdr zOlztHzSeMd4oza%!nY)ozqs*-{Sj-krZoh*naH-D<`?lQ+6rg-Z}p5XwSoaEe=+qC zcIIDwqDo+IZ|aMGg(iBz75B@#d4BR9ow1UkS@Z{;^4ze%*<4xp`!^2B7CL56z9?$k zd4WVnE&lw%c!Plom!yFiqV%2|yS;?_+|UXF?(CE}ppKiFaq`g^=Xr4pFRZ8fr-vP{ zH%Knm;zf8#`@U3Gpd@bXmR)lF>=9h)!5RsCW>OO`@Rie0WNb1RX*gPm^~){1u=2p~ zJXo0^lA&ktaZRSy&YxR4zDK*&1jdP?v|TJ__`i zKl6wMAGaLm2SpufoBb>l!uS443LDSH2D$TWH)Ae5PgW%arz)Ys|MkZNLgd|u{+J_j zC2#l*wF%F{aM_gdj$2)m*+1pBBUW5aycp@@SKO}G2hPZ0M2_i*?687KtuJSuyB>6{FzK}A+Uk5I710?hpTo zHVV8Ec;UjcZGqAts6OyC7TjZq4IZwZuz4E|5cLKu<8_P!5zpal)a5LAIEMB^K=^CE zjc{~}B->597pg+~Rq=l1@w-oM&cUN>7J1E19-*CyOE> zuPjDb_qxc~%<2mM)YU^i+Q0K68>jhVhV+}Zjz0{={YZzZpdSq%-q^7_IuU%(1ih3C-^b}Ntit{$(1i)|SPzS$XA#3B3X|Qb64o`V!O_^@4T_@$v zW8nPkmPMtn4c)Q58|M0dRTxAOI!I=Vw|$L?bDZ4Zl)y95*)M-HW3l<%g3l{c>)GJj zhxr?u1z|?K<|Qh}@1%6Zw%eO!WUyM6q^uJ~CIl6QWPy-zJV|@)45E(s(2E&WBOO1Y4;O*PT z!pPe@k8Hqh(Wk48cAy5HG234#e*8$2zt7{DZBn}FZ&~c>UGHZs0rh9MC82 zm`v$xNm_(#WVupA{%MN&z?*uPLmEpt0qguWsSJYXjTKSDT|vDmk$NW_D(@gB?uB`a z_PW>K-3C6-*$QM{>iG+#NBtbV7qB{;t!;8!;B(vXKrKi3cA9gQLz>UMG{b6irf0{& zORF_rDVMt@UA>H!zAuzYV>rZ=ss!m9CGZsLdFh{IX&I{;j@24#8O6fR<#g0mUS=oS zdhXK)ZSaR-_^flA?5n^F4~4g=G84`+nws9$yj>kaL1sv%W$&twUfVtE{ddWAzH=JYJoTpZ-rEi zGf}~H`-~eK{E~5mW63GTpP}57*^;`0Foou=YtJyw6PYqR<+uF+86u~hzbUxxzZRI|d zI{e$!y48(7Nix&oc0UBZDhOn%kn}t!CwGBS%>X)SZJGelf|uWp|3um?e5HB!!RP~O z&S1JcS>!Lj590#O-v6luNDb(~j(A4N+iZTPvU=x;PmB@(m4LEVH&yKbZm=fIO8`gD zA=2twq>x;FI&f(#s^7D)gFj|gEiMoTx+4F%a&Bpxrg~OUEJuZn@(Wu69`g0;qp$cR z{uouK&@zg)IGWAo+tovYMT89?e#uos7^#j_Cv;YZt#@Iy1osTpV7ysjF7M$qbyi=BJC- zwCcnic*gu2FNix;)sqvi;@U&0A+fWJj=#9JxNd33we^!Y{rW7Lw5y3RAh-^E(^)%3 zZbqD6@%@{&Q7^GRnQkXa9xf8VmBXen{UVogx+Z06U@(ly= zXik@Uslw-F3>ZGo`_4NJ3wEPZ?UF}Q9WgQ`yp1_Dxl2gcx7+n%tSNhA`9CJ+J$YLo z8SP7P^6>T7lo@-C6_rV^U4~<>(K&H^0X0OHqu*P(v3eL@Q@R0`mKe&C>M@!zUU2!w zY`v%=t`p?!V=;>^iG`8P$ysWbw(zbmkGOxK`*Ojz@Yl-)LRq4Y+4}H9m0a2({8{6| zH@q&B_z@{##2|M}_?J5tXqT&X42zBC50A=_?iS=tLdoV9;n`BrDgQBZhhKIuhX|DU z%wQj7`5|4tMb%6&v~Z_|@9XzNGHzxg074tsrs~Yii9a~-s|yRpV_kDJGn#D=ls3h< zTxl_i0P-ZjuogV9KA;P`PCgmY+fjgE$$9(8>%V2#KRH^C3z3-4{p}u97U^2DhyfpV zPV)cOH{x;Al+*D;@|wvI!v7Au`*Aw}A5IdYTa}LSM1=V6{Hg>~cPhO-9t+k=np=ur zhvx&eDQyh{n6fD~wFo@vob1osMGIX`d)VnhgOj{o<*KnfyW_k$q#tBIi(jlzEdjWP zg`ap$-hX7NPSQ zFOP1gmch9G2&76PzL24T=G4pj-=VVok@XnbN%qCQqC(2AWOS@Rlvh^c=5xg%9l;*D z-t={eUkQ9@--2wzWKdqj+C?}8p5aNlVAP<>ERK>6JK0_I4W+{`D8bW8sWB+R3t{&7vdlA z>j(E!wL8{M)J!qS0-ImSuZATy#D5~rK+~+R>~8@XbL=TSs@NlU!!f)VbVTSpLcFU_ z)Qy}iQ#(*(H4o%9u>Pm#6oetGK$o9{9k7f&bujfhgpjwWCTwq2q3!-m0?)MoiD0RR^}1J@Ti?v6 zM5~hb#PTxuvD0k|Kn=I}8@$mN9=exHp-ag{s8b3W!Y~I*)+{7=z0-am!7JCPcI_9+ zxcsu8P&S_N*uelON(#?8G#l0VStWKKB&haR$BqW%{=EAsOuDrI5Tm(WM7NKg{p~L6 z^%e#~6yX2leIyY9Y+r<-Hbj$xc#s(Eb?Dwkq!7le-|&nSCitWL&_?R#ig{Eg+AJAS zEU04TFdQ{0S}bRgW2qqpn?oRxsXquUdh%)Wt|J03=ZU!jnoF8-fOpW03)SYtwJ@L= zenO#41@L*x-_9=g4H!_Gj>2Refl z{Nq$_hX|@Ov|HMZl(dSW(iO~pCF6F>4ox^FJg1AzV5L>cGCiqvz-TMmo<$qrGrnst zsCqQL+xS!V>CCSwdU?gB-=rH&oDt1fQqT(rW>Eq)^5yl2j#uD7@BwY__tKrJ1Hs=3 zT<bWcGR*ifem>`IEopQZ(G%p0T2nz@fe`C@>`XbjR-Fb zIR^8@`h^6_FbX`u7iDE1-lbWD=Y{X*UbGd5b_Db5645zGUJW!KATMBlUIXr-hu^MR z<%Jp>TR&_3{pbY5SIXpQ??a^!ATJqf_3GpCwcmL#EjVAyyvW-p3J=7$tvkm^N`y`E ztoH|3&OJTw%pdAwjL)Z{Zt@Di_j)^wl{A5GO}dXQnoX%vki0@5v`_vB$O$!;S41m^ zi)bl|mj<6%R^`ri%EtXPV)b`ktmji>W;h##;UI_4nf}3w&@n6v(PF}B;F4BPL~(Z` zg4N!52)t6>`i=(5AxDFB3 zj_v}6|0cy4pZ&X%wcdZwCY*LwbZ#KUA*$z=9K8$PGPKh}=CA9QC$SjbFUSE1hsMUo zs{LDun%lDn>o?7RnQ|NhV%47!0Jb1&qX%CSPi7YQ$6kWFO(CTz8jtev*W_@m(^)q6GM-wV;F)OHe1vP z;9}u(_8>?u(sAxo+U^q1!JD<2DNA2k%K#9yRsIZ4GZ4fBiMB=hFjT8b2cW_F6t9r$ z{O!A#7a*8UrPWsa$`tp+mr6fx+TAA3oC?+8f8b_?eC6!J8vhQyFqx1MnvTR9`&&Ov zN{Xi}RC(-^2$${Oqh))4Nv|k5Wm@%R5+N*52ty=X2v=kAgQ!AbuoH3#IJ=lznS{VVN(sF%Tb(Bv|RV zdg=;M5MPA|Jesb**K9Cox@OcKgTOOf`<-y?M4SqQt{p z(mYG|dkRcjO`n7az;heAbkFcpL!cq~>I3UPPEk-061_6sIY%O+yw%-T9OU9qt|MB8 zjdlS_8Y`+Xbch)H*aMwU+wV@YcSdhBER>5)bN~&-+;~+~z`wwgJoFXUU(_-LLW0%C ze|>il@P~fYoD(%IMEU0yh@(P(gtvx(6yHNnPOU*%NNdJ;+2t#1)#pm~ zlr{oLw$nR)b$c(bZz^J)X8-0TMdnfrzGx?1O&cka1F;v$U394ZI;E)SrJhb}}DIc`Xkk?NbtNm0X5=ZWS= zzJ1EUNoYNqM12I+{b2I9zR2me9+&r+@+fNqN_&#si$|1}9f;^03hOMY(TsbSn<~~8MUltk)z*G!mvo+3qg#{f{^^cyBDfoi6xR_(L^Fc)VEc$!5 zO?SvzEH73@_Aa9XfqRl{a%hb0#ry()#UFv*f;qOJDm81Y3Y;NJBh}9HN}iMj%v+H7 zz=6WG1C9@N!&?lmkqkbxwmqCVzM-2--+b^?f>Tn&7f)vRL5A`I8sfBdF=+Q`w$o zLPU_L`wb)RLdRu07jBOozX_dLE_EK(&nYgi@G=QsbB&_$L!tdck-#lUrG zLr-#7UBBxS;HcilfIR~FzCKKBNR&_XDi(8aNSA&%-M!Hdl*SL5B@p^yT~YW-l4jig zlap7dzeBTr&Eh*8WGpeV;>>PpCp|beR>X-gJ1H#2dNGQxFWy-faXHUoeFM-zce1 z{NjUvLe_l$^O+(19dcJ+r5KNg7y+BKd7Ecljc+0`io7?MQ;dvTv6n)?D41uxASaph z{g1TXFi!ruuS&4fRu1{dsfRR+GGVI?LPXJSw0BI9GZ`z%)P3s3AbJ?t)y1y$!R#HY z3BLZXCX2_NZnFz|n@d%O${Nb#--M8S114gmv|@VXp*EIjXX=5Aveq-V7e9Znz=83T z++TOc*_ zTF<5OdR$N4FH_i;hYK{1|Ekqv-tZ zi{*}Rp*{cS|AgR1bn}N->(ItN=A*v?){>uK1p3_LdAwX|5}1JK{IUvzO}`5DW;xd5 zPp{v{JntfJYxB7IuV0ZmZ4xX7JNNM1g6FuDe}%Wg2q9cAdM{}~PUmsj3yky~s0JT~ zIQpK!YjcVTI@z;?Wo`gNds#J~eBC70kL%pm)yXYMJRiO6cXAzA z^RJr3+4Hl6H!&`j6I`yTYgv;TyOI}L1>AoJPIYEU!|>K!Xc*RY9rNe&LmBSRPjQ1T zT(DJ|54r?tITeF0;v%#egI&}pRzNhAgcyOd7q5nyURUD#jBwe#a&`~DCugN;pZiWQ zXc&{8Y*u|+(c!IYp$NNo8@8CU-MO(=u`H&mId-0QZCSM{#m%2RB8J#z;zP#ysw@k4 zJ@sweckO2ry7-*jWvtw`HH0aV=Wg12*>H){8m^CgJnFrk&d*}>ybl;Aggl1Uoc7-i zaE4(yXtZ$IrC7AGA9!fU=9{F%k6n7>drxqzVKccG%M`72{t~J<#lH|yx~hf5TVEjq zqlfAfk^CV0xHn$t$flc)rT8$&$L*xi{|I<6=pLG|7S-XF1W5vQ@&@Rn zN8*+*9PLy5Xm8bcUl909zM51#IQn}Gi=!XS+YZ?crNPc-# zI4|=7V20oeal~D!^!1XfNy0>vUUWY{TA+@6%X;G{AF=Z}hCIiFbA;0OBJ))Z z8TVau(=nIlx2Uol#Yoq=Lugb_wTG?#nCQF*S?PAyYy<_}16nYcE(+|6KZme>p_}f! zNESu36Q3!rT_*7eL(Q15wEnJi*8T)h3H=#6nXDY-{LCPcgF~?Z_;;b*udr{mxD(6W zm{Ea`k46z86PWUW56WJI>qS_GV&&*smH*c~@hQL>>c;i``>tgceQYf?iHEi&Cu*Ea@ z@(yzM9u}j~CB0TnRs5_SDG?a-aD!RdC{Q??X&(irXN?`8dc%4rTv18-2()E0$dsCr zMph8QsLGsQ35@FwQ6y6E?)?$76fCE#dorYEgLx8HbghyQIwMH_hcNcG;np{!h#KUC z6ozddjEnCe_=jSVP5c1Nvj{>2d;D+fX-;_l+Nq<E5FChIF_Wu#!Q%eG8l3u*DX&hmOOE)B@ z8c3eT2dqa;iOLw|Y;TFP!Tqs(Qd~AYx{5Z?2!d!~-_Upl*7-CV!W}MNOrZa7bCh5N z*#ie7CYywtZbLx6+zn24xb_AL;n%V#5}_yM(9S5 zUfPfFUhH5NHOZYN8NQS9Q|m0J`bUcJA5(@&5oA%`W{uRcGoj(c!N%<}!@v(5e{<*` zhjlv!2^gBRK3VjcaplwHX#SSAm3>_ffBSC{N@PxKgZ#y=M2C4u3I7}GzlcO826Fzt z*#SlNSpTDr8HCiP{O>sFzs>-|2viYkC_XiugmbJwVO!@YZdSuR`9tBSjgT`hCfV#E8_k^9yESs*5iqr3?z^yf|rhwZK9e8fFl zURYmx>UN^u@#QsO->JG&04(@Kz^ZKraubs4HD&6Y5MGr>j)JAD) zrj*QElN$ber-Pd%AIkaPw%Ax8=K#{6KtYWj1w)u?$+czd>dui}ITpNsH0IsqTkE?t zA;H{eoO?Kcb84<+H=&IthgX0XxxF||P7V&675QbDCfK@c-tZ+Zj4R=$w07Aa)9f)F zr}xnF#JBD40-~WC!{xzx$KK27@GRTLiPN`7{ba=O*s-RNb&kpz`eQKGG-!jlB*Ce` zQRt^I_+KS5f48_jp-lln_xNtEftFF0m>4i$bc%Gfon=9a0W`S9yVoj|)-Nh4@;U6m zal%E;Mnk{V60{}IXBudQ*FzSUCF>Zqu&*?VK%KbM~iIboOnJhvTv?u`pNh^0?J zL(kb1wZlmwO(EfLB1{ArfBlK6IEC*wV0TmKEk~*J6BA#Z5N@(8^28l)X7C@qZ8Om9UiD={p*{8kq)s>=d@L2dWM?y~ABkw4j4( zjZXm)_s3o5{>o?A>?*fY{8Y>6Ib+|ww+6D$nKjeao0lCw%C8+4a=>0h|Y`d_$0grrp@I)>C7xtcM_4CNd?`(J)tOQ+sfGS5V5dn^3CH;8$Sv-nmqGcB@j7}ziT zkVkiKp6=v6Tj2~hdw(lTbT9XC7&$A(tEL`OhK`aGX&aoJb5}O`OM#5_5ApO2iZK^; z?EjDwvTnu?dA|DXDwFgIDvUpbI_I=j_I6qvD?O*7WfNjQ%2bE)u*Hk2lix!>Y2vYo z(UaCp58g^LtKbaBnRwP7MkZBnF6@N2fG$;-@cD|LMK)|efY1%aedL9CpckNlIsjAK z4ZraQ<0~`3poul?Bf~2$)>H5Ssb@jpdBA$K^@z9nL&`1AM<%U#-M9sRQo#O&7>deF zs~Xpyl7y}5q<+^#$2Ci`#?{P%?g(}_Qs%04;w3%cri;`BzkNci-t+V*@l?BGZNaQ? ztHc_PWx9S2XfqPp`%h?{*}z_$WZLBZ`N&e}EZI=DkmIfH_b5jq0^q*xM|1`%COo0-XF3L#oabBnVoF`M-6R5Lz|2z=m8OOrgM;GP$Ii>_B*?qsS1&iV+yURAW zZv^fd9BU?dZI4ViPiBB^%0krtT^cjkYx_AvHem+fCKb@I_y`dr@#2Mc(e+x{-`df> zO5ZP^VsQe`*1?(OV^U?ZBR- zr$3i|ilBMe97pT-um15Hx3s$&%k}d9sU%@-YSA43=Zu!m!))-v=kO)m>fEJRwxv?_ z(wwownRo1BvGZXuHxcix&nB*c`L1p&G1!!o+UYHZ_`mCLodC-(gYq&U&&{v8^UtU1 zA2z!Y!wP`=TVMwBq}%|0VOy3~vs;7h(fr9l!FR{*mIMM@E-M4xoe?eMSwz>gkZ~vv zT!d|>HTa@>v;qYtNk5Mi6{^=kg5YyVq%6?Dco$5ZH>KbOi?sqSlCQ~yRP>tcamdI4D{`Yi_=N-Hxd)@1inCugDIsx-y9^d1X|!QxRf zfJ-$7To(re$oH@6K3|{@3c^oMJ-bIvqyCZB;biOHI;|@k72Zt;(}&br2L)>%&GUFj zgw@_ntLW3K*TdK>iU@T|TJBV9OvfF@$-FHH!e#L;wB6ToHrr2c)!v}^*c0!GrT1!9nip5+=p zG;5hT)C32LRsUM9D5iy{-Xlv7ldf;Cut5zyMG!!XWo}tp`2sIWYX_z0H=N<cx=m;3n7B*}17LB#m0{=`**7IoY?QOd1<|D(mK1^5Ll!Sr=7cLb z-oCKVNISOAao+W>tf|9+^6BEm40AbjJzU8M$`|XO}(*{6Ey5Qox z?MnyFbO@<4uAh&A^zFRM4qmn*#sSLJtz6|A$k(>_kGS<;Z>augkrPS4vp==2Uug2w z$6l&(+Mk8QhVC7WP`t1q=g+}`MR{TXC_!Kp*q3s2IEjp*v0w2sX~m7T0~R^|s~S@e zXlyC`N8h>06ELfMS4n-Ysas<58oZ^Ac(kiexSWHEij%!+S`lls@0^za)k4>De3^Dk z7&8e3VUwk6Pt|c<+;~~}dOJ!di~>fn?Wqz!<;DfwG~fF~_xe&Q9pL0-Mf=^ljsu~o z?O)VN3On3xl@ghG>6wzU8apOAr!VyO39NEC*~z{9AynbefI%*A`YnruM&Ep+RqrbX zi*UUWo7|X^PVuzN?(UX}&onv0!3uesbO1!&G7uVy>=}R{5&-Uthia)PaD|J6&AUAX zjSegT9+b<}Er}2z_=^h{o?x2k!HET**t?_Cs#ZzZr}NR zA^K!Wkcaq&Y41{_9yWJ)0QsfhOEV5MxZ4xwd>O%24@BC`s06+MFL-IaK_Fuk@xCJ8 zJsq%2U3@=Q6`S(R2ZD|Wr$zL=?wOU#5LG0OkHI)Uh|RKdMuXtj*M=V=KCw<3j<|U1 z;e6*DrLqm-bg7+rz66;q;jiUg7Yu#78KKRxyZctMHp&%xA<{_g-$a^GHN?9#+nK!- zG0Sbww^2YaUeSwJ%(H3I3uI5XAKJ%v!cD_q_}dBsSMLY9hl}!u4FMqJ`$lt@1QD^* zIw3!PU?lds*gHwXSp>W7{fq}MIynQCD+8y>I!|)7D!DPLcf7i>weN1eF-sp z`8{SMBc%~TJR{gcT;7@co8{`_eyb~rO>Y3Fj>C3&<4dNLl-wGw z{RA;yH~rPb*DkgF&o8+rd4eZRN-Y_gS3Xu;-L=2@BVHK+kA<+HJJtL_I3Cuh1qvP+l zP>GZM4@URxi-pfTAxoo?!`UZ!AAT=*G>X(cOBorwZR``6u1AHar|33>AeJgDSm-_F z)vn9&U42&TK(wg3K$!4H=FPq*&+EcJ4-&IH6n2I(;B`zp{YmtZ=-~4LDeQREe&wSx zh_Ojpu(kXgW>ul7k;22>$87t(QdRQeSdVvPh=M0ezYY09N?roI#a9-{oO>IY?aSA) zd~>b>5FfMGLMqUZtxB-d!3xs__s|J^m~g;KBx`RSy~_cWNN+yr4)I>m-MjqdDFHSd zMP6wnh9%%*%R!Rj<^ChIq~6SjD23X)Z^F0GS*Ym^A44Jp?&_#^%=US z^vzqxTTM9WXmlsxFFNL3HS&Au{Xd*=X^absYyIL#=m;2}Nm`--K#=W0&`>TEaG1Lo zW;Pl;kR*m`peW6#3I~4n^~YDf{=+h>yRf=*_gBgX>GwxJr8+v9T+)_>{gb z)oH(GvzSd_qzg2z@jKWp7RB8P$@gXZ1e3b{k z5g;8%@ZH$5RK!DLQ?049x5-m#U`oqzYQI1`O+GP)*)`n$^1;ia&8M7=0OlqEFP47t zXOJ5mq5x<}_+UL~`709HDJV>tU`!sMxw>Po8^rW;Wv0)F8tu@h&9q;l+NY#a!q}xd zZI>JUke^&^X5j zC~>V7Hw8|+Hgz){WNhr`gNbX$Cw;e9n$OdQ(BjZ-j;hwTVrl=ja>2d~p(6-2)H0qg zCuV=-!iLi!q8fMj*=Wjq!x+-$Wij&R-%O7+H)4rAnTgz)^^1G134)3KC}nwX$J##z z%%D6bY(Z9t1TrtNYHcC{i`nulyVzZ9a)^^_5=N+CPjay@9#p-{*#k3fB39m2M^W)8 zkv;vV>kNVjlt5V~Ne~8~?o$B7U(;3S#J#z!{vgfxFr?gq!T&4)|#(04!+g=xw0mA z+AulQNX>O6f&bIG2Uq{|sdgQ}ncEuvF4btZ?6;#tvH~{ds{nRIsS`mvcqdDl<)S&y zjS&bY&vv1$12w^dn*2Yi-a0I*X!{?Yp&O(d0Vyew?hynD>5`UikZu@Cq@|@tk?w8~ z6p$XeL3(JUL*PB=y}$c?|KZ`8IcM#?SDsmCtAU*n`v?#0q4f^1Elx;7g3GdjhIDPwzDL4X662b0l4?mVC1k`l zTs;436?8k~^rq@e7j)|6g#m(b=T5~r{`o~w%%EZwGX1nb=DfSJuij^*qOH&&-@&B@ z`#a`Chn{sIAy`B{i31syLpVvLFj=vo@3=D&NwuD;2s+L5c$2%it>%R`C$DeTECL2D z2f7XaZs#d6Y$IE@2?tuv=##_AhiaXGe3Y(Do2$tN4M;TnFvHqk;Z8AG;ULuSOnNdh?3hoi*?vVx@?0oq|)tIm?Yemt;q2^tn z5tk3;Z^s`*IvE*W_Aa@Ssxu0YPc3twbvYwGRyXiLQ*Ox4Q6U4_ESY&kaVk|G2tc?1=l(uYSb%F^ zYzo1xev)ld+gDPdZx2mosM}C=PHM%UX@r!x7j{$<)!%NmEFY}p;zQp*{*NgYgHFAZ zVs3E2F#3O;rj*U=psd#g<7O|->=RJ{JOA(JNRU+RxY1j0(g$_@&+Ql>L-iV2=)sk) zPLr`OHl5}FM5)sg#^~>tc~`_mO#r&?*jrpwA=;+><}7OCH-`L~X)g>Ch!*K6V6EDj z^2UUX@UcB+u%p?`Py`jSmO)%Ot%<)bnWll#H0sHiOiEKv&To(0KnsT|S0^|KEQv9xzN1 z_|$Ozp*dCTK6%K0P+?ECk!b81=zV2eAJB5a4|t?)VX>K1S3RDpR^iPp`WM0=f6s%^ z2TXI{@IW$ z7@k`ZKboJ(C7M0d@pW|Go=duQaevNlAmtjJV!Tj3>jR#a}$PQrDSFp7NxJ zY`*%!SN>FW)tqIax1IL;+wW3HS3+%?~jyNqNt!lS< zHfiukeK2VY+-A&?zht0Gkk)Fy)L38m#9v;gK6z|<*)NNbM4;HpQvJCIFYkB;uJtnP zQ&rwd^e662Xh6+^o2{P+Cr^%eaT~*SSXBfG4_*8q3ZDlZy!{>Szs31Y=)i5?p|tA7 z0hLa4gr$>a6AZ zxX%qm8A_@@{RO;5)vdD%nNU)=cBO$22zFh25{RaCJQ{DOkeeiGQhZJXXJvqi$1Dj* z0NBb4wcb?XD5uKE%`b}1Uz)CaGw_s6jPK{qR{pW!W?o<21pBLLLMo!8PUmkTvTGjk zE&9rFD-2%G*`!~%2;6hSItZH%aeS@J)zRIaer+&w>Ax0X3q+KesUMa5pzu}3K+kE8 zJx*RAfj08zeSf}!9P+_pbawF>?01$e)9SviSGE0lG5E_8Y?zV2Zs#gN>JAY#$%?mW z^Lt|BzXJ0ud#kQ3h~^evD)h+FAhEU=55YLRY1d@pPm|bky}yGDPDq2w@_-Eo9E3oy zKVEHhD5t~7b00>UuKu{S+}basCIzS}7|vm?OMw?_?w%yQXtFqL*s&K+ME99xN*G%D z<+pt3DI-RO(k>(D!5K+lJ8;6(R*mD zyoaTH#!nMbSa{ZuQzjLEPn^VbWA! z9T=MQH_s{|&F!ppOj|0Akl-OkN}URsNk@84P*2sa7H?@E#hXzf&sn$7)KK}fIUkAmt^iHn8RGhc;L6~cOf?QU5WMeHt0F`z^5CWt|T!IayYh2r}vdoJG7m_ z#xwFH@T}(hGCpFdYCAo%89*Fg99hAbc>X|G0Axt@7OmG2+2;qYbspgXyINj4_MYD> z^Zla0lk4Z5MvvND_alkmF|+#pobn>;F}bif3Z7ynxQzV$6}5VgO={n5H`B0U5r8lsuZRNAh`{GR-w}Qt>mvL{l=+ zs_gyf(b*#w*e#oPSvag@SkaR8Eea9CR&+4V*z31xxGwN8b2M^dd1*T`bC= z&(VL>8|Yy%%iVwatS%XOmQm^LFd$u2p-PWT-`meh5?2d)OxpZCgVU3C4iEfYAQIRKH4dE zeB!SD#Y@LIPcx$`tn)vR8Y=k8{BoWfgzAiJU*E&LoFW6I*4b-*dO;EIRD2iV;8!F&8%y~52%LeFaH{OdIe{?oLvvL9?5GTAK!`Be1`5fe|K!fIh z;&zck(axZv15P@^8LwlVt>-U|mz)R@*_0Th63w4?Eu8o}0WG?uw+^&mM+KxkHd2-x zfCiJa1>&LXHZk7`3=CU$A0P20g}WBF@fItwYDotZ!dV-F%W*D|(c5sOkRcJ+y0?CC zkqw=(5nlrM?=$pA#dugrP+474Hw&#cE%+0F<8BhuI$FT@#PFVyvj99*7z$tiJHl{r zw0&%Ed0_7we)Wg<_7}Y1HWsi09}d6W;PPXbT081K{)E;WD;+0Kebyhjm|&ROm@u(z z&F-weniT-Jza@?h1VYxE(E8!xfWXGO9&8Zn3;r^b8?lkIkiR1WEMClG(qK%WvRg8W z`%Qo#MTm$&ZIs=GM6uh~z!7_lNNbf5w*JAWpd`W$iMIKx*OGtn@3%0^Myf$TaZq&3 z$C1C36s2ye%}78{!p|yu631x|u>7}**7{5!*h}+~J-?p6a{&$?;euF6{OTXUFNu+w z?HVhh?(Kn5Ai%|KLw-{#<$G%#R6w#D2l z|J@3?^^aR{ro-|8+h=2jd)%~*+izCmhc0YNqyU{YrRKV4T3&j zjJ=dwqu)2@((JtEqim}^kL^8?ar=3zAA8@jRsa+XdrB(hd4qa|S(E}yl-#0uR*17v z^!a2d0k}ID>*F92rdGUkTa1@qpFR)a&gG?{0aI8I!AG-(o-wTxlQSGTGELQ$OtH-2Ma_1mkecPvPC7~J{XpJq@r1;1-(hTBK-yiYo#e>b zGQP7p_^)IQ3*T!^m7k>6>YsdhTJWTGpoJ{*=ejz^wBqp~?B{Jj;EUGw=$8^qjGO0! z8YdGm`Fl_awhO7;>%OJ#nap-vmeM_cj$P9Q`<{*q!-FjlCs3lRo5Yo)GUKm zv0Bj!V(z}GJ|)kQuX|?TqkT=X-Y#zrPexeAyuBU87%r$i*=Lwms+wB%85)G^|7kCm z5G=LgZjak$`XeK(j4kc=!D+uDJ1-2~3K)525Re(UY5{J0!=CFyaH(2wT0sbxwj{sG z4}BHj?xeW0{^nf5V*GhofnjP--lCtSmx0P=BXhz}9K>)>VeCGwaPjgN!{#&5<)Xxv z1Eq`)ccW%|9zIWiNt_SQzu1_FyvZCYb#|#O97O0(XMg>t$3xZ7*iiMRRv*Z6WavoR zP{6h!6RZt2U)m&10RInzvBe=T#|m?ex6yjq-QXOu?*Dh1qSPV71)E!SW6X)Cvf zUYA8ma?%Ullzlgagb=`n0Q*O%U|0wK@^<4BzYw;9h?2OBvoFwE=|bpgUC?VuPRPEA z(r1;R)(Sp0V5#`CKoe=P@5)%WC%e~KWO@X!9N74Jb0ejg0} zgzSj64$T#e2af3+Dlv>2-^*G;JoE2yUXAc=Q=Lz2_fauP6XtMiRQ^*IA8Bw|#Z%UC zTx|*Pq9xbmh5t@<;5M|q)e&M`Lic+b@rDU@Tc&m|7&-C>I=s;P=*rm}a+Blj5BzmH zGeAF`*VFxi-hk{w6W9DIk%?OGKOPL274^G-uYwL<_2~AdU6>+*gdFZ_65o@08J&Q@!K2AJ0%zRQh~?Mt5e(*%#}pY-pepLgOPk?WblJ| zFG;YNEmAZ08SnR|Kgd4a5*p8U97Lq!^}W$fl}?bQb?om~7Pa>_bq}#Pqv{4;)d2nq zFr@1^Eb9^-u4Vp#{xV8`VE%z`K;K;f*FAK2?p5m_amKnRZ#1{A zQm?IMQ%i?9`2~)Ssu@Ndp~nAs@g%6DAqy-~UDTZGRkbaoA>zrrpBq zc<+-x3)R8NzZ>NsWG?2*&EPguy4~c7?57P&*%W+aGJWhYGkv`&R$Q1aVy513OYqq@FCiVSlcj1TcS&4z^53e*ATvPS@ z_Z(cWchz4MAUA(zXDpdMl2a#&(!sQ5_i5m+} z3imMDlTnkm9D$JqS%S*yC5E5AlTn zo}&jB`P2p#_&#Fz8V~KCZDwLF&J`oit)Fb-N&*wFfN??Z!TT(=?MZ@HIREbQW~qJV z`}ZrrYp_`ZqksN7kdujLOUe?!=YN08|5b>;rG~(8A)pNJ|9p7=%Cri$wuc6?r-~(t z?iKVv?TJkVKxNi z<_o81Fm`tAwC|(&qdip_6J`lNl`^jQcGCnsMrtju&@=cK=6I8*G3ir{v* zsfci`zZLuaW~i}3_~Y-rte5DciV!o!?nnf{8+la2A9~bO7}lfXf>@XciL;q{AWuAT zzTP?}TkPN)cbq&Ir9ji5PpZB)>ML_Ldwy6vP)~PLLE(`jzShy(U>k{Gf>qTK2`QxA zgjhisSV#3ia>5*|uz8arz$=SvY0(@!OMct%%I zYyDNvd@6j(CoTdYbXk{$Km3RMZ(=CV&|%58k9{z$?LV*nDu+N%FhP4?gO^Cw!$Wf@ z;Y$`6>?imLr-`mF4mxexTSJy7tvgtA=SB^=+*ZRu=SV*4ZCrvGo|6srbZ|viScf+D zxzFbW=MMolURB5c)xi&EP`{3=`2&0BGF@u)YYL;X0ci8pUEL>Ih2 z$X;W*nC-cv?g8mtD!IQt5#6ydLZZ|c2GQKa1fW5)1W<1Eqv;V{$jxJu4rs6;>e#{X zY1-IwpEBmNea<@7%_X6VNs_~eovC$GZOFXY4s0o13md%}c`oLlvAt=tjTD$u^_m13 z4yrtP4=WM6C!vOKB0XIVcl9BxRo*esVSas`_&oR|KQlweh}%L2LZ^o9BaBGB4iBFN z-@Y!&S;#2a!R&jGCOS;|lozxIjJ6_>hNGgp<*{uX^iRlo+N$9>ye(^+oBR{~dnuZB zF?qz(Qb7P70#^ioP>I_}FV=VR}d`Kbg+gq{~fv0Ge za7>I+Gi&L`ri@?kmOPJwt3yg6y!4|(QJ7nd1X_lp9jELp`Isp+=o_7x55gB;yWJ&= zyB8O4=YOW6410F#E1|lj*>;v4{I!Kvc}av{4OZ4|-!a+zhqL7Uu@tP+536<@6)5h7 zPGkgotnhTLD+nF;kgXL8=I8CMCBK{LnGy2W-c{%^`axv9i&wAgd-Trh>?;zDc>rhl zr#zrW_*o7Kbz>qBcZ!23W6e=SB7IIwx>6cVUd{fb4B497bEY%9?NJyR`-SPT zygv1ahFHZ^W%(WQlXIg`4sM~;u79HhYRo_Sl&ZMOeG1M_hU{X`);%Fapn3G!8(H3M zOyyn7;I*|R;*u#bz^6n!CWO1@SjepH@aC&eB}$;bfpfH`K+JIQKp?pnk(GG8q6CQR zqc0vBE>Mc6rKytB*2-dE$X;An*HLP-SEX17Ia<2k%(Pj=Bl)N8KTp)G^evf@6Nv_D z-8bt{d}Pw81PK93{0lbhswm>3K~r`@tU-{&w-=-t`*|0$N+s^{0>1h!gUvqZ<2gis z(vw-$kPP{IC}%$MtHVO<&GQ^5=1ge=JW#uUCbbiGIMzeaxVjpQ1gMKg72)Q7f!aIP zu+~kcU1B)nHmTq9-X^+A>i6?brPbe3(~S_^=x6HaDx;^1fXSbynkk3?lr zJ$~R*BvM;v6FHhVd(hOnuo~v6ZVy(EukrJ9)MZxRM)A1Gvve5>rjcCK=HM!AyCjId zUHPIQsz^ohqA}V^7$oG1#G0cEh~q_adXy+WDM)3U<~ljBU^6VEY2qiw-L12whd|l) ze=5F>RFMqnE>NEyMr^$5nbE!kx=;p7Ab}6xLN!Sc_>bW=M2OZVGDOTsxURVtKTs?F zpW1aKB1F?7aSyhn4B! zkCRbFrbOm=494C;}Rf@Lm+`)2Vdv7hiFT5mHmeD$p{eJ*lw^yskRB?Pg#%=R%)c%Y?Qg=Xh}P? z{jRqE5vzwxe`FchFVJhVVqatvj>AE@(FxDF+@-ZYX!s;+pqkD`GMOS$cODfL5<=!W zbaKstEr@UQG1H>6YmKT0b*_s0jo}&}qhp<5g$-9*o+p+9%~(`qr;(0O=k;1x;DLLn zr1VWXHv5?43mA*~`WcsAQs#>_c_|t0R1Rk}6U4G3$l(E3vR1@7ct#40%rrKjvV3G@PJv&e7}L1)pzI%vHaP z61irCYdxGwrX-87J>JSiyA_T#ei>(IbVWrGp$wn4Q&fhXv@HqAP?Pz$6Up*UZ=IAq zo3oHu){4sO+G76@iI*j!^%MBbp(DPC9oH9+)6;mEG^bI3x5kC{-_0^?&rXzxBhS>& zxh_oBi zWCxDg%--Va*?p&NOPsrza#VxXGFQl^NSB+Y>>jG@gK%}e4*1gJ;>&UsXWgcUpFD%U zJ6~un4*1gr^IP4F;NdKh!%7ZGfpp2A)ve#H?^y@%Ia3bJuX5BzajXAiSuR%pF>fZL zO=P5qc3x(Cq1ztYBJ^K%h^S3m=9H)C*0gMNTx@1&=d^w7U^}ZVB|OKpMUuz{FOxPM zMHn5|qC8=PuYB&Wg!G1HAng}C#&6e>yQ8FsXD6olwImj1IT>xi(BEem&xGLtN-N zGdH|U&@uGEk3A@T2r4UlzEE-AAV2Z_E@g$OutLk_2!S{8=sq6ysj!+(ywNN4GZcM< zin0dGtV<~ZTvr5&c}$vzR2+AZu04udA+u6&waBnR}3r zVr#PnPlav-g7sh(cw7g(3k1gUQH_K7W1YNd!%A~ScaZ-?Kc~ls_OZ3h?tI8D|H$o2 zquhWr>oPVt&x%Qqqo6)6(A-tAy(sm0zXPAUe^ff7n>@s)A+cUDA>*f4(F$ntBxfty z*jio|5)66uED8(Hfgd5nPwi>ZB+r+Wx{$sR^X2w4hhz+6hb!0rd;>M68`D+TGpqW@ zKI5`bY01hIR>PV}QpTfbHu$yANN?fHkxoJQ)7L?r6XUn~4yCDQv%wOhU!dmZ{TPxFaZ z)bXWZVOFj&x4CIwBG95wOaas35-8?;9-+WE6?6bc5y|SZ(n?@?Ch^`)o(O>#37v1K z`RH`(i)Qy2KFV4{WNooCDEaf4(IjG|k!0YQs%-l%gJYR*U5BEbYrxa7l(2KTct@@l zGJjuSbCGD3^YZJS_GGG9NpZ15;(Fzq;SROB#P;7ZhCijX7PAXb`|*8_WB3?TGU9Ry zBZbRlv;yn*T85+#j$KdMS32?WC`=t&PBj&a@4j$9IX2eX@4LP!5sg#4vPhzk7Sou# z5A7ArFUEgqb}0S3;`>No%-#1SfA0Ksr~4oC8D0q|rcQaqOQZMcWZsH5Wg)BFN7l7D z4ZdE=8uxT1KqE8eKh5Ld3*tI{Ia9afKN^N^N2HKGYLC+0pA;d8Q+cN*({Jov4C(?UmO z@tZ4LWd)zs^o;sdq@>z6c6G3$OFIyWqZNZ+Rl*7aIR{$!cmgc0%5-y0`?eze*~E-~ zUNY^il=zc+3kw>jw@`81TOA$*erX;Pg63rGC5|VV2dWWjRwH>#!^S>WzD*)C#!&4= z(RX7q9ZVma`&Ar;MI7>_bh|!6HD1a3H57-UF(~Ev#EOMf+Uu^botS1RmRB!K-`*#S z1A|tE2Z0E#v5UQXqGWqG=$|vO>8g@_L!H8PE@nsCK%RSQH37f<+LXrCUVaKD$GuDM z){*&&f)yqOWrk=7P{Ho|N2V!->4DmD(Cs5a?afLOIFsLW{ZE)nNR#oxW;|i+gj}av zIt_ddyvF%LNpy(22Yl_?E*UVKR65r2?v5UOJqe;*iDt}WbcCOXgQnlXW}&su_K7)S z>rqkBq$5BvF`|~?8O)(nZKI~)n{VOxNB+;qsTJNuD?2A#P5w3^cFG`ugO9>og1e>< zwB1v5X}_sQ^}yuxxtu-j?P$r>OKR(YcVg%j$N3y?+sVt^kt2zlhv%Bv=txA!DnDdy zx=%WBzJ-c>V_nUX`mBlpN3rg=L_Vd<9bW9`Cj9}v)(=og7Ae@TMrw{e5x4!$?t;+U zCu{IVfu~NY$8osSgRi+dzDkf5_S>+-mX~|=qgRf*IFv+BJHr(Y>i#?fUz32ZBPz=; zr-k>31#yoO-{4WKHA{ZV{c#qYef1mah>sk-dM(}+mm)xsLTSCr^Fz3`Nr=_}_g7IB zh|=H<%P51jh!*R}sz-yc*)J{-t|K+qVds|!k*dn>61~H^^grS|XftJ?eGjd-A??p! ztav2ej1S^juho;r-gx+Q|%e4;9keQl=^BCcSTeF@!bE50!dr@Mn^mbW+ zT%)r{FOp2}kXSG=iLt^!O3-|J0m$@A@=_bEOu8uKQwzt_aEXC3C@FTTreuq6LWgZf z;}9cMg3;HnGO)kG0UFD<&6+?mCIGR!Fh9W!I_8~mK6H&G>i9{9H$p}L%Rxp=m0*si zKY^jjo)K>&)Lxc)WGlKA z`KjEH%nGlHmmC)jvF3;w+X?7ZcR?@GPf)`|LTXjyx7G?>$7$y9_7j7hM=0zw%3;xM;-1=)CTkZfrRI`1(xd7Cow}RkP+J4 zrH`EK)S=3wV2Q*!%>B|AQ#1x>?+%~6&L|U@D=M`^t^IB`g!q10L4inn!RNXQ+1G&&18Q)o&}y*Bvk0jQI(+bz&}`ErQDV_!Y!+=+F@wrqcY0 zuT4@mJb7Zbj=+2abI}23Ki?^&IQ|+l*z+jc33cyDKBvli0*L*u8(1QM(Dg5ZU}0%y zJ0Ch^l;%NY7BriF)8Jv102Aa|?Yg)VA{L?LRI2f|@9j;PhzmzoBSX%qzLx9p|nr5F1b_lmZAimgciFbcS7-Zj7}f(k+TfHJf6_e}B3_Q*UpC&P;^KI4Cd)esm&l)3@@I)mOac2uyqRmR>dv{zq@Ex*>;xmdkvHy3__ zpFs<9YUi?{{uoE|bl5ew?NW>p&&9ytl=KWalZjE4l^BT+n4_}^x+X|Xyc9==Yq{VN z^K!nCH$ksGFNg~>P+7QDX#u=nw(kt~ntBZ>vh~d-(3^Va6x{lU&Nf9_6jpaCnL}nb zLS|(h0V*@R#2RrMYs?+2=l;FsP$2toekBllgrbl(C_Mq`RHHQDPA15eAWHBD-S>Q( z-f6H~$mBlDG*aybc}R-C8#XLFrkh?koobwe8x3CEzZ&1<9FB?Ts<(-A29U;>dv$aD zYVg^GhP#o|ZxM-P)k5~WY0iO;gZ4k@L57=X%Po7P&Elbod8SUYm0T5G3~!f|(wk4{ zbvr*FKK}1%N))pZpnPcBrw2YUyf zTFuQL1xAq}pFa7fSAm1{niB`Z{j?xpa?qQZ7$1RlWx0%-oA4daTKoB$#@+rRp`m^*tb*Hg#MaNr`4NmXhd;o? z5LDotB*7Y2Hn(*pO@s#9wJ_|r9^7X8uV+dpjMYj0St($Vh(y`xx8@5SFm1y4wY*B# z=En$KVjpZ|`OPzpc3M13FicyuB2^m-6w<;Dqxj8)#lwyteZ#YEP0y(e&W&e6;xkLj ziFsf7gt-~LzWe0Nu;bU;!Ca6(ma&Wh68+uN(jC%W$#2ewP$30FPnPeUHkj50R13=P zvVg77Lx^B(85J=!;Ol*m8)K&bRu+v!MY zfi^I0_TmK)ej;-1z}|;c5;+iX($mH2eFJJ(Mbl8j?Nj>v_z#!z20LwCzyP&DcE^_v zqAaOWXwzg22puRF+8b*A`F%B3Vk~evNXfemI=q2-JY;ttch?e)bDh!A1U6(E@XA;} zh8jq;OTgyAepmglBVsBGO|-!t8jkAQUzELXkjMwRM^rkGwds_<5`K%&>L=}%vT%Xo zk%!T<3He`C)4;uUimW5*@j@~n zIWwX|g(6_`&ODb6u~{WTr2k0F34j=k^pezp8;c;FVk4)EOW!UgM4@l6J8$nIQ{GGu zS(5byTW0qA!WmyWJX)j3)b-`RaSk?fL%2LW+~KLL4eG(&G6|@Z&_|5lVk+XnLrim; z1J6#mzpIlk#Bd5g$Od|YD~P~881pkR613lDdvoiU-i)@2y>qkH>ZRyRZJ_*?B4FiR zy%_%EyzveBpIUQ20)y26%XN%%tnw_Ej|BhaArYv|U!!F*Vb0)M^cD0D7ZihcPPO_y z+rG`-AF{?;O`SSq@JzJvs+sc@hlUc5HX(J0)~Ef=w`}8B2$le|ZpM@+u#6$IX0EsT z(P&gKjdy1piYV3szj(QO1D`c}bpLVL;42(;^P3(c|8YQ~C^{LGI&`zF$9dNpvYh;D ziv{Js0dWZjqJaSiT94z*L{v{BHd;oI-G0^w)2CAM3~)X zT@HdQb|e?z!Xag;hMv@YNa>5|Dbcvv)x$Ez)Ua7;ZitR4q~=C(Y~RO2YjCbLk;^+q zhr*Xqb%XWAvjXQPJlpnnf0*u~E(nb{OgH>#QLR&QU*$h4_>X&*g697*M!F7DpL9LD zluNjY=5xFF)2Y1<`zk)Br+>YBts~@Qz^TPB!XB-kwuFa-MSfnS>N-!X~==LDnj8%=3-2mBkVogrv%l8 zV4;lQWy*WKfKs+l$k)e@MUYT6leiv-p$w5cqa@^OVQzoMv(yst#)_)ibu(wAov!@ybzPx|@3}Fq?9BfzPeK)mrzQb1 zi~rJ6lu!<=Q#v1iHQPY0vEBOz@CyL&2hAPEp+MAjKYEbwXcw2WZv}dwFEiKLjnSz|2J83xD4jRUpk_x#J-+5jr!&j zvTxp>wQRtp&IxSLj~}T`LPFxM#OS`H@=f^PU5hxOicFFCgMzsB7@5_kQfxihZwmE* zw8o_#%5|I1<%#dV1Dt5V9MH)S*c!p2_|e`Tq1`|Z_y4!>5PwfkdUvt_cU0|*zsD`3 z?Bcn*J`;NX4%ixsNFeH5N(5w@r=FDNk6%xh2Npe$2L%Nw)BU6GY6QEfH5|2p4;!HN zU-OwUjYWFb`?wzY*ak^>TW#(q7m&efA8r7$ybt8?QRWI>Tcwt#8d~lJa5%eUp#G2- zM$#Ws46_SVp@$33=lSbPztekwA^{SKK$iV=9aAzMSX0 z_++2eY&rpTu4%|f96Q>+<|m^ZCko|y2xR&VP1;S(cfF8ak_Q>O>cKXuM*Pu_tQNUB z)IV0*q*odLaKMeOW5RS3jN-$JBEsgtC<3zQegueBNfvmwmjSRaipVtTTmdCk79L|M zhx53p`4*K;_xGJd6raep6z=XfjHRSVxW^C}d+GZ@)Va51-`4)7Uxhj0$K-g<7(nA8 zfzOQGSbgHCAPTbmQ+XIN2P^Ig>$>s_TObWhhtk}4E#w*$VDHfN@5UxhxXYHS@u@|Z z+b2`xA_21W4nw+G%Y!FD*_MNg*OHeUz}aFT8Kr@yIN_7F|GP`1>0~zb?s04bM*<(C z;mV>F-A3TSzDjmj?u*RNjO0F=paS4*tpwKP3@2QOwpZ_j6iG6LkAFF*&=z%3@1zo$ z6-g&Q|0H=RNT*Sxmi&~Ts^jh3y7-^h&dfE!QJ=-^&mAbYzh|lz7)lBXpY(+Ta#_oT zjq@W+dNjX_mzU!1y0M5w%gp6CmHrU~-tQFmEPj!`$#`4`q|3>W90nV)=ib&GoYm4W zhP{gw^XlK;e8eWNr9&~A^c;d-fKcvl-$8ceKxan4n*rRY$xIp~kNd`q!iN}h7KAC8q@lf`o#0)l6y4jfC=j)+mO{x>UHn4!97x=?=i$Qcch7gpTNb<>3(O4M)UfUrC$Xjl^NU; z0BI<+!AOjP*tbU5wdxjtkzBJAA`p@qYBtK9nQ6teG*Zd z*$AE{oNGO|d_Vc0lgl`(*3wV}(GCh=D_bEDb|(Ub%>}ZPt;Ku(m2nK; z6G88~ZN?LXTLFW;w8y$!HH6I1^!O&iA^kHQ;G|r1VKMw^fHy1wvq$K=bH|k@a@-v z5>+(Lj#~k;vRMb*xcZ{6GYOhQW$tpLIJ0Yhen(pDqZFL)vI_;o%Yrl{Y*&h&g*!)o zc_QJ2QG|MpDalqLB=rZSH_cLX?luv3Oi?%Fk8zZdSWeu=v!UP1y|H$!B0I-!hS4mx z(&J-3P*2Tkw1qRv;a1^hz6-g9sh(xQ)}yl)!HkWhKfI>|_oBT+N5~VMC-`A*lbkB= zuKZ3p=!ffvQwve9GoAXxDQHB0`;P?Mne1n0k{@5)h>nze-yz>)J@LS^TjH3{Z5>W7 zadhfsBI*TNcz;rqpU{VI!mST>?98{k?+jaC6$p7^0PlAG)&hu-Rv@EQry1ult!P@R z-ADQ^EH%xKuJZN2uwVIp0I6-bvAlRQyUE@K4|g` zfltUz-!VW#(5wHWg6mC=b6abmEu-F;$hMPW_qz4$>LTLsF?V*I%8(HH70Yi8Y)%3L z3C{N#lh7SP>kI?igy(lJ>>azYe$O3`F+03j*9S0_2&9zag_LLrV>OmvJrDWQ6mc+l zcZ`mv<%+SQ8-=#L@&@ku{l_A9*kU4Q)lan4l9KgjOV70&k9)@b@>&nM?xiCkKTz~s z{oR=+8qz-8nV>0ms&;3AQFX|-t#>*GkSx4(=anE zW0EJYBiFSWTK%rEd$1z(O!u!(j)J)MtcFn3!bYZ6Z<&!*v1{q&rt^|T*HcAKejYH0 zaC+{E*Am5G3!7_|eSK&D{=??8_>Uvi^c49YF|Z;;X5F3U+i0=f`I8f^e{CoWDQJPe7rVcO^<%TFM`oPVGOPa}v3B`A)15@$2R6r6q|XOpMsSdHQEZiv_^wonG^g&s@8yQABT z{qy4hEX5dom9bmG?2j&&q+#YZf_*OiG4QvM5Y~&j^XnajLMQ%MUmbP>sh?yYR9aT4 z;{~&H7WsD$uDp^H@wIIk(|*?)J`M1E!vyc4%X6rmA||tTkFuGQ)4+6R0;60n~3|dV{nbTVyu4EW9HZkz2L1Uitk1;8dE$5yyK3JXj8K%%82u0EXRj< zj?)NH=4{^NlZ15krEOaG_XuyH8?cY*b{WQHQ?4TIx0$X|C-N~rVK%7MHT9{MH!%s! z4fDxp>XC8jwXKz}Ybbe&_R8jyVo7UVNwVw-Zi_`2@0C2QR5Qe#hevIT%i*g>2>lX% zY3y_-lFjple5#HEo&w{J01$S_#ZPMAWpVV7?)uO5@VM*0yE;_4>{6~I$tF!CO_ z6TFHmZz=I@wi5$0E^;=v9FUE9sCepVsay;4Pi~CjqVW*JBK9nPN{;ljh{7zNX?^~- z9#b0O+@e@{GTAo)o3n|QKx=Y6*BnbAQenq}_0C4GmQ*GYv+@gX;RL!WqP606by?SL z6F<(ym9v5J0{L)SP^Xhb{N?1?QS0}+YA#OBmmkT43O3c~& z*m^pfsz1FwE5b%9D=R;`OC|a-WbTsjMpP-iA>%wZi}O|a!u^2pAg@ga7>?V|*c<;HmbO3~9_6-H+xL*bHdp*=aldiVPUiF?Kz zV|qY3I1me#^==Dahcyd#{fj>mHZV3wco?J^c2a_Ik)Q`GMgjT z(P=G`B1W(2F6(42WSCWDpkOB*#_+QvWIvEYKds9PkXa!O8lMKeah{3ZX$PZ37V*dn z5i}8I>aBaIH-MO8Qu~^l?klCttu@pVQrt@WL_?mWv@$QkQjCtw2TeBId@g66>JPgyV(7 zBf(X>Btg6B(JEn&6^C?@A1&45Bo;S-e@48GG%U8uebiby0L|<6vPzCZA2XV#`2;jl%-vE-hr-jYRe%g;dH5eWij~}*|?&$h_ z0&#klIZq^Xk?E9dh=sf4Onv)^E%?SFt{bm3=#=KI5aP&BS4T>*>RCZ3eJIM4A@_p; z3%)Rpcl|9mXbA6bmuoLeiMQIs3P1o*l*3BU3IgOecpEYDWZB}m5kiXPz50*EH?^Oy z0y>>taa5e7s+8dCa#@8l=}3HkCGfjK<<5{_TIdN&-4WLNY{?_!TDBWSuXVXHF#(WB z#HWTI+22hS5yF9N2nFQRpg%W#AcVwrzwri1w9bcuT6uDBOhWr?yGgXKyfEf_B=S4| zmRD(^YWJkQh_gptJ3_Nb^V{R0#(>@Ifae-x%NbE~2=gW1Q6veAK}n64A`Oz6-aZd| z?%=X#Hi~rCj!WcqgTjt9%}$p|Ei$|UZikVc}fDX2L8_aHnj?UqY---ud*5Ic&DK#C{eZJ~%_%)uHRDgO% z)%VH2j18jUZ>Sbed4DudLwmgfu1yg{;YxV>6Ca+xSMs!-8JOAgM8l;2BP(R)3Uiq0 z^aYPClABERR4o|Z6CL|2FTq%H{I%4|ibHqT7}O1IVm+K|@GD!uVz7*alsB{@xE3P( z+_4f%P2L^k;3q#FA3Q=~0rg%qptn+c-)82g^g_0=H*mj$x9W$*`SXfU1+KMGoOPn0 z$ZzgSJq1$mymRa%%eX%0Wp@%GH}o6>i9oss=7L0w671>$F{_9?mFLeV<#l+OELZx# z$z3FCZsgO|Rfj(&B-n6L7@**{uaIlKVeMfZwRm}^N(>BI$-IoBGt}!{%0l?G1(t*6 zj?L;p4%}|S7^ZBMZU!fi?f_qlfafT}%?ga|2Wu)vnFdmtLR4O)J1icyvJ>)P zpljxPcXWalSL9xcUeZETzDx6ateZmHbHcl1uY@#H4jUT+0#XzDsJ}Y#)(eYz@TQ-D zu2-*2Yf*MZhq9uplnYc|y|~oZfaYH}e_^0PwU*_*%nq123=*)&(J`N8Cpkn%aGiOR zdp-944iZOJne-OsEzb9DNkI0Rx9s`#39xCa)4)F)pvM(~DB@K~w!3b;vhgt^c)Q?R z?Dh3vKvyC)3fz2PDxEGs1{coa7lX$QX3$dIOh?zp8%MnV>o~JOO5}4Quzx)A0jIwz ziu|QoFFrEiFx%StKD`DcJ2vZj!0 zL60P2VS^wM`h;^Pqh83$7;7WL9X%2)#8_-ur(Y)Zk#dhqEl6-zrhAGQR@7cz`13uu znRzW>>lO$?+1kQW{aB>_!1y3vwQWKP&vFplVzzQX=q0(+YQ=S~A?nI{@?XD)kD23p zeCRbysEC`5`h?JFm@+&tQ0ve@cQ|xk8OAgw1Z`V6W8Y=uhab*ZJ zl>6C<+mt+ONt~U8` zqBD)>Iu9hCNmSK%F^vPwPF6mZ0PjBdvLEZ8iG3UrK|YVpq?d8-y~y+F7+MpYL$u^T zBC3C%t~esUZRQhZ@*%+~-i6hiF{?s7B)WQOveIV@Ff^I|h6g?F^)Rlb!Wp;hBXfhw zt2W}TB?vTy0o}k};lxNb?UVwD5P`$IgKv3Fc}y7@Q0nRdW>wHV_^m}Rn{X}P0)S_N zNT&)0q~4lk!D(Zel%+Mek}cpH%<2&CZ|ECkU9i5q8K+pH{g~gWV{e?B4m%#|J z8$KU&wAuFMlvmsic;M#X|Btb^j*II1`o(AHM!G>7q?B%kR%xUqMPO(tks1b+mQ+A` zXprs(k?x@zB!r=nl)i(Xc)rhb@9%f-fBSXL%-ZX${a$PBbJpJP4gA{o$oKWQ?f!#` zMhf6b!%Q#94kzTshU2JiX7L9dm5O|Lh-C3+ZE@$lpyQyIc=k?&t4Sr`fH0#{65X1! z8w~zYWOVaFxu^{W%o(D2dT(I+_Paq#OZ>Ich-N8%Jo_M}yAWt+{}^LY{`be!Qrl`+eWuWk>eSNt-(kE`|!b&N{$lfHR4gZ-6Zr~E*idy$VmLj69X*269rlS}R# z!jQe%obG8^6V*X=)#~;9`lH4}kV-5nFM({|0CCl7WRJDYNF-*|mP!JaBVr)Q zOf|TTP|7TG32mL1EBLM`HNc=wmcV3XCdS2ZA2NcTJ`DhUdWb&3s5q3DhOSMq z)p$(t(RxyM;^vyiE#s`EyPM5|pR(1tU25}kp-1eTc58e^^0g%oudF4xZrN{Q!t*(Q zespie*WT~6wKmM2`tH?`{~~>WIA5i)TR6UAWBr{wCdu7?Ius$DRCQNjN|8vxEMj_b z)*9P;@oLG_pnD^DZm&I;P%*GH%2a=wJK$~nG!bs)BPLw=jv+;?>Z5V4z1*qh?rod* zXLFX}5(m0F{I#v;+NNh54d_M#NzVQr9dpo8h_^+69@~jn($#TM)Dt-8UgthMP+>_- z8n%PKkReGO7x0DLrG%xKBk$IhmA-$JBBKh+1SPEr&E&KQfFzFsY-t_obM96SAE5sP5djRc4@L<#a$Sk6)OX$iAS%T{8aOjkFcxL ze$rC(u<*ZXvoAaQT@zD$AR(;1HR@a{cHJ_v+quuTafv+rRg}N5?}UT?BZwKU8HXY@ z>+`hHDwZp0MxQBQmo)lylyC&d2HU+$&YPi4rAc~kch&10Zjx(lVkYyw?Xcg$Xi zUe!Lfef~Klz|;{=@iFuZj-Eia)axG?#hh><87H*JEvUtidgpoX3ou^wk-M=<{W5HU za>BUs5!qPc0(h`k`N5Yl&-&KIYPSKS?+xFsgqugvMia|x>zf49((`j^Rnu7ErAOj+ zvKSlJ8%h)C=tf$P5}TjpcvpAs<62`AC4Ug70~I6QPuF zOeZXD9gJl(oL1qtob3)bNyCouE2X`rQ(M0(F3i@HIS(Bz6hGRKUY#8o(*3|2Fl-W7 z>is!kMBOheY^6Xu6*L_Qjy@~#-X@<{Hd(&D#od&fFhm~}W8s+{@w8?t`s&y+5 zNvlpaS>*Jl%CL_e{x-qQc%gh6^5mwpu7-`jbt_T~%_xk(UjH|P*LYaf_QxHX2L9MS z7L>?)qw}NC5j3HB%dMCHg4eOchJEY}4o6;B&bjctv%wrGHHi9@X$>hFBQnGh{MnXo zVVhoZbTUl76bvqIMD(yPKD{LU(y}ljsIOGHTX@D3hgAJ6yF&@T#4}M}ZDF(Tc~bU6ghLre=#w{(RCzeOoeeP75y-=kjX3_-}G z7F)OP{xdW;B>x!bQKury#?9v$R0Uh~e)CfP z!|Dr$ZR5m?9XckB3^ z|8YP2S4#IRfql%$jmz3@<8-J{QdPg4CwSz(ob?cnC74Pba9c?kQ0km$V+~deykvSi z8L^sTr}}|q=HLOM1onaW67RNNIl@nxwY{M(42W%#CCiMg;@#U!^DDBm$P2VaE%9TM z8qTtzZ!x>uAw*O&Qv?*kR=(0a@SkgO^{}rcD$)%WIbn%Aep3;yTA7Of{yz(4@4<#c zfb?t2c7N|Xpk_Yw0@-;?*FQ3nJI zu)-%HNu$v+{V-|vH%f9-3hg%hZ)b_YxhClbsJR&)K9gnRJBmFyiR6*@l{lmybtDmk zYZRGE<}5lWQ!}0NMAU5`{4zjUWG417e)8zNRmf1pyAb$q2P|-{j;KT)<#c{2qqVf& zC|39l6Im4320x92%7=f2%7@{&Z$A!D|JhRPVPvFpTB2H){GOlQaC2S(B>{90s?)eZ zx4&HL^*llehODv$D8Vunkoyf>p4TGx7WW^Uo$LS7zax+9QF^T~RWh!^l*k=$HdBQ$ zIW;hsk#n7f++g&#^0UU6MnWg=UcJm22$hU|;#NjlqqSO+0Lt)TbRPWVnS0|?V}>DJ z=UvEU4<7w@aESxbN&U4@N(i2<#^NQdgu|MJP=;`iG;0zoc4D5mJ*bW?eFWxdCBpA# z`7hhPV1jQexVfO*D9rU(b%nb}2zpPt-7q$IBF}5?=L!?K&YO}H)DPSL{9}!}W@9Jx z_ZIT8{(88T2`qOuh^U%uENnXJhJz^+J+@a!hzD+GV*HwMmBhyxeeV8RW_X z=D&OM6Gj)`8@QB|vt+V>1ke|Z6@;GM=AUi0W}!Da9!Y6OAPs*%!Y7>6sC$$rwB;DC z>qLkcvdiO)nmdmBp$jIt-%9X?Toxu{02@Gg*3(Ec_4#`siixn%RoO?7h#Gg2%?{h; z(6^uQ6Z4RoL4nav7Z;bE=T?c%wS(OL7K>{UvpsER`_)X%|ClB51JZm?s&>RSh!OI_ z+AdfplXG)lt3mk^S^9SGH_F-&YdQW~I|YkF*Vp!YDORH+DlM^yKg??{Y>~`s8lG`x z3;0o@s!Y8CvR_Foo3LIn(sk*v3o~JG@Y)IGDJaN>@d*S|%3! zvgC;3AMj-MgUUh6TGW@A3(Pag5iuT~T-_Lp=))V+H?$Lq+W2}*~O)cnYQ zp@3iEU=k5M30e~XxIesse}31U6B#(7)dx7SMOG4kH}7=Rs&Df*CVtbRryF7JU_!waJJ(IDI zu6_>{^kba7D@!kP(JD-_ChpBiU#{3MZN%{c3If4QOepYl%<9=Yv3(A4w>hQCZ=bNn zp-WyWg$AY|&!TDFjguoN z@}zo>31!W+${6O5#A!N(Qe9p^I(@zc-9XD(=+bKQb=7uFTe_D1bV~cK(9XZgUkU)K z-9C;idN9ZMV|ky+J}PVSZEc1^@*5Z0VtO&$qmQ=*$ZFcoxX2v6Bi{a_at1ogtvd;| zHs{m6`1flc)5!j>%Vu!VI@Jr5|fWMN^y~hjlYpr?jU)v_FGjhboWPDY$QD_pfnB zP>p0NUcMKL8Jr1OBN;sVnRlzUzX5N(k!`CIFzKpqN`7oc7Tbdv4*Uo0msLnw&KA+Q z3^c^xRAkYy5qx<`*HSXiCl@GAY+Do2^_vs*4>a`|V5s{F1j_KBGk;UCnx!4Ts9@>D zZ%e_Z?*O__Iz*7+KjVwgMMpr-Tpw;ZT&Jd1V%5^g2>gJcM%)W2@}Z_wf!3YyM*89#gbee{_$$> zXMnw9)=z~c8K0j0#)HX_!($au=Sm>}5b7VV&EP{qfR6%ppg;HR990#Wf&Z)pm=u1? z%JL5D?;in@^(L9VcL5qjgha%+T>$uh@Q(^M(uGD@5i0Uw!S(8@>!C}6k6p8QZ(>C> zl$6pP+-|QE4~7k`ZaUcMb#s?X_m@2UJhxH@TE%_rMk2ezC$?&XNtjW4HZV_;2lDNx zTi@D6B1|s*-CXP+MD?5Oz+ObUu9iLFtbfs6pfWs7B6a`Gj%QVWtmZ z{=|iFs8eG445+C$)ax{`cPcKfgejjEbZ)#|Ohp;iA4B!Ybeg$cg_->&OEb?}R*l70 zb9K+H#Hr1xZP?Szl4R+=xGEp;nM(a@mL<*=zXh7V+#H}bfD5+ScXMDw0>iyPV?UXb z_I4%4Pc_`3nhJ+xUw{JJ!iTA8dWffP-zfq&M^qE=Jb?X8{b#w}` z>x{G{@oaAXJHarWO@KHrwiHbcFLzVD2;k4C0g@Bw;3ZTqGAS?+sC){Ic(8+%1{yND zF$cq3o}=tzNYizdDyq?0^7zhJcD{1NZ48D-$VqVo(SN>qd*mPsV-xe}!XI z3;d>aqacB>z+Tkg*E>Pt#(sMYG%}v@It*NondiO9Y11vVN{dgUu zZl$>u<5qSB_{pyKY~VQI{v+-V6UJk6*x&*DBwG6Hcfn#|L|c$H>d3w{Ttf)PmlN`( z$a(AsmEd!Q7%J-x8`kv&K6^98;wCP@rj%DoZ=56`x9n~z&k+`B02_TXP#fwatKwb z$11-jZr$tap@gELy8EMi#0fq2 z^LI@*AwyHnkkRFFDYWlQ`Xloci0fpZ4r0LN`T1c|Xm3g&m5mK0$Y4Se+_IgQi#943=>+G4ToOox5 z5w&H8hBk8{{vL-tUdE4I)$c{+#a#jp||=eyl>z2qH;!3G7BD0Vso7L5u9sHJ1LCuCAVP0^u{ zJ{&nFrZPg=HZ(XOxtRbgMI%n^mgfQw#}pJ04Mq6xF1Ed(nFW6P_3AjdpHn+em24ww zN{h_1bZ;=Hmc4Y*^fqYW7RdP)xDq?a-|^5Z@N|tb8@)KTyAnkD@Edivu#056d0M#J z8t=iL57%BenapeX(Bm6nrK0$^i8N7!&P&pxLI-OXn{SX*&uVvypz%9G*qz7wXiY|@ z#;Ms&vpxc(l~LgC=+Ij#WP&mA1l{4m?k6pcO3)2@Ii{?grAQhiY)Sr}3IBh$?i1fV z-~ej(2^rbKK+Xm4r)xkkGASY(P&Ou}|DP5Ha!T=6NB8qyWb0n9{~?O#U!nhd>po}y zCH{WSjcnaN#s3g>pS1rH`oFh;$f@Wb@nO8!a0b&{V(-)THBailFJglTH(OL95sQh} z!iUD^{^UPOcaC;a|9)bCw*mue{9Rhi!gb1M*&|X*N28FgR}zgKtq(?&TQ5KPKI00U z;JkSE^SQs_O}4>qly4=k!kW9qfxjs)`T4L*s+NAEb*oE5Zjz~@44ISBEpiLT?Yt%X zyVffAnRyzI;>4BrZ!1LKKl{5scPi+uOQ+^>lg@U}Xjy-_LC93~gQiW4lSc2MDf8+^ zW(MA0XuNJrWbf$tzv|PR` z>?j zf0>TH7)-L?1E5+7Q!)@rGC^FmR zI$oKE1y+_iIMHKWDGKYs;ll-yAhD$eNJbzD&e`I{>1p7#pMFS-q@BeTc#=wIL<1XF zJ3YPhXv5`U-W!QKGm6qv5?e68R^^cKLy%(XE zXMq&?={f7e=1L0EXw@xdIwX{}^3shj?55s4+3AdWnezENX&PD0H2X3I)7ll}5JUah zP}rAw_-pBto9CAK-2D{1lLelo=cwK-V0R3 z^MT#P36UwUm7(zCQ6Ygbud13Qf}VGiyJi=ITH}(4;-pV@W!s;|M5cxGhWb?P{O4AF zb?U6&#( z{{-|hMUI;l&{+AX-}XL;-1~1<5#XdE>-gJY!wzQOw z^U>I@scDd4Je+jjO>HkyQ*VF}-Z|IjN>f`%DBp$uijbS`}7W zKe`wb!_$X4m%uD_>#*|7V(Gf(Ve~Zd~P&MG?ate;aVExNl(nyHoaXHN}!csOdK zx9e)1c*2|zE-dV?!067(40k^1$)|m}h9aKL##BFW=_H4W$d^OImDEpRI_NIgL_Apo zg#^`F=Pt0F4bqGt@;6ASTE@(&6&?=d9Y@fo>+#bK1`Jb&h-}N{3_aWHlj3TXF2o!w zXm@-k=2o{@nS@or*SX08vcG73EFJZc5Hq#zXB4{7iE(@kBqy3ZZ^2@M&BRu%B%3is z>hnQt5kBy;0;}L!8%ydzTLB>@dUZ1*FAV_Z%Wn(%*HaS-5N1mXHbVvW0`&K}@9ixIugqFsM-xs2x+pjJ@j9-=+b{&*}dt{Xo zgz~G9F?Jz3^>;H9A!AG){OuAxRsxGzuH|1mNB|~y!mS4*xuK{=rom-qtUw4XI#CVe z_&r{U+;2EZLpwI*NO#us+)620)OpLZ#_p($&<6`{S7FD#VzB*sa__%s+m1qOiPA`6 zVJwQ$!no(<8XIoT5H>umSB}+HIT^)gx%uqzG^$eK5Xa8d+nTo8V3Q~{#8ZRrQf;_) zIzhWHY3gTv3aVoWonK>IbqKpmtq%a9-Fq>~0+KnTbH|{Usg8?P~c#`%nZI%JwIuo=hXA(&pyX*+Pk?K~$Y2k|%VdDu zg@jzgfrxRKCV64YpIzz>?u#UA zDZDnSZCEnHoX57V6kLz@?tms}3>k(&_3m_q|5dAbo+R((O7_7;CMvwW!0pkguvx86YpMn@QJ-6dAsH*ta9N<)2cWhaabHc=cndzs)@ zD}exUZ1{_9ES{E}r+D!ANzKWQp31;U>Ab%zINf^C+T?Sv)N;UkndM_ix4pE8%V2kX zdvyN0jY3Rg@)TH|)XYd%0`%)9jcQX@z2;=vXnXeNE}UV^nH1h5!+Ld*FMtUfp$||$ zpmo4}eR_=uc|o%+m6&5pb{sFwrLv;tzXODkxt+3D*75TDft;P{PNvwCTZrM1!}>?q z+rbm6fNBqz^bbDDlgXkt#eB6mD-Yjvo^PVNi=@8H>`ksxLcLs%SE^~wU6#g%M}F+h z9WtWT0?i*iRrDc+wWNZbkgxa11Xd=NaS&XE%FDFsL*XZTr$`|)HFNX$$uIenWw(sY z#fbDxR@BS4qE{Dsk3;06XQO*x-0jreWGh@OKY=la?~lb zqjG}E!4TsEu3j_JD&r0fdY)5HooI;jLFjcTA532l*2-g~Pyub9OPHI%2}2kK{m`po zt+lSwtjiU4@f_{s1*=w#3POz5Le6lP&zgr8sP?V)-~2+^k-j4w6ccb89yF%9SoBZd z6uS$%HiIZ&HfC#xx70c4PP1%FW%g1s+8^2htltb3ddW1fx5MT0@TIfN6%^SBp^_0;m36_2^o2~;tsR@oU zK{2cw{%-?Qj=TE;wSXacVVrJUIDWg?upe?OEI&xOtoI4rfwO&oB>;CtPPEx1qYAOs z{!mZ*o7CNj-c``jyXT>I%|nULw|3}#FVWE#W!+AAa0c~nr=%zR45_D1)+H84()qc> zZ+8MxP%p&{r5j_b^KK-*5 zUex2oo48y9f{(~Oxn39>Y9z1&;|AAr$q{PfRXQ42m+Kl9{GQAJ<>X|;MlF}N*wu*^ zQ#t~;-$5&gWg1R6na2t`4jKRL=iTWSDBcC&A;wZhJt+=1wt<=^zdD%$BLC{HLr`6J zN|LSG+10K&aTUHVvrN?4KP;Wie^m7@9X9Q)xL@yZ`VzAY`SEM(G3Tc)OqG?IP zT1<3S5SKr736hvQEHulGyCZ3SEibLeHcdI`Xb^?g~FfAnq<1xxzdzyz@nbyzj|8Gqw2e^N`SrQJXB=qJ4=P7Ikc5GP*uL5#rE zduP_x<8f3N!%e?zbou~8aMW4*S&EZJtB@p1^N-RLruFRjsC^u_CHSXdxDeXxEGi1` z%ajy^_MkChGlCUl^Ad2WJ8z@8i3TSFG+=l*zvKamk7EW@*#-fc&_SDt z`ac~P6>aRU_LdswTxZ;)Njxzeif#+MX+HC=0!&QNTECH7q291DT02BgeuzwFf!_YY zWQX1Y@4g~+Aw@Zfz=BIT^QBwNKasHTSTN2f;v%0V$ABr;PM7%+%};X*>j1(IjJo-OXfH*oaZUUKl?>%bD@1 zvRLGFs}E{zuWi)h1Botf&XzGuOe9;OBrpi+G=H#1iRx}FFxso0T^ACgvQ4XDOwP#u zA)`6svylp^v4+l60wu%VSK`2l251@lyjPaQNBKN=moqz6VnyUJaS{(<({E6LF zd{l)Fi{H~M$@y)L+Io1Oh>?Q{O{axQ%Tr6H|75WV&RJo)S}~S$RrV=o*?FuVmh_sk zcg}&l_2rwen2%YPRwI^Fa-MyzC@?XNieqT5ovp)N4dFb#-n&F35hI7*?`V@Dv)w4TSg2|8Qrd)mMd<2Ic9C zQi%YkwltfI`v9_3Cf54Iij@9p0W>EH@5aI0#X#619^-G)D$ICNf!H5nK#0Ze` zXV-tT*b)@7%${S{GOJP0FroTfLyF-}?3JU~*2A6lQ?x}EqOaL&qSY>dld0?L>*O%h zYU$VqQH5w=bZ#^$X{g?r+$X37HryeMbn@WNF!_rs9#n5w?sD!m>xF^%I@epM-qFJ! z?}PrkCSPIzx`o_wiAw6!(yni@tJ0@QUKNKPsr~%^<_TPzhI((5VMi!VK*AfMcd^Pw zU0*olFyU6!Ub~UiSxE+qJhagV_(7|X3<4#QT+Q=+IaB$>FvBBrSyOn_Fu5x#JY@@> z*ZB}srP!F+oMgp(NeA$j6@v2hV8Y=7)G&(imZ0B_|6v*LV5(?YyVq0*A6E-IIqUET z(XXg>e_{0Dpu&&8QY%U!yn%ym)jAb&r%ZCD(dij`JN8W%>52kJ8+_1zJqu|B~9{O%F8>Tm%om! zuHmA|c7er_FX3YAvsKmI+~)Man~ z@#HcLn3-BwO6~h@!fVY)`w;~#ZYx$T-x1`#LZYsTQNpa>Kcib;h<@e%JuIX6q~%VO z)%y0k+odWgVP$0XyTfU*8{@_C$M+eSXnP6hA z<@sfjoJ{UB44@-^$L%!VmXTW=3r;Y_k2`9+Zm1nrH)?@#l9=FqB*sNn>J9*Fno71<&xg`jN_n8ZpxFy+$}h&;aie;r75&kpvCP_gXQqztIY+2 zb8A4N_&=DK#)a?14wYVfLtT|4ssgrra9lrXg~=x z3+$Lc*$-fUNWG|mmsZHb**k)dH)AqTGt$(&4Tp1nO;(>We(Okb;;#Hve}%zlEJOs; z`YYi9A^|trsO~HoL)KLhL=Ms!8B(YTEc9l!FEb$IOM)^^Bwq0&8y(Z6$c+7Gtgzt7 z_i7PPwrM%C$A4u+BJV+!S{492_H-}m%!(?-HOL#cUz@v=3Oo)MkNQqh&>lNgyT4W0 zY)-%jJCa?@8c8dw8%WF*%U4D4rq4o#g~?Pgl>MRiE#h^F_NjPC_QHQ2sUQo z<=wG##CzGB<}sthgnXU4f7UiUsIcY4P}}46-!nk_bX9R!`CSY3&~C*OI!gfD13g3& ztDhZpqmknqv@`IWG3I4GF%E5zH(zQn+)%b>NX#m*=OGXG+%3fuJeB%qCdGOhKLVSY zgz=`9>&ux*Ye}pfbf|v3A+Ch_QP5Q_s)Xs-erre!$sSueVa+@$n9LRsd$@xdlHz9m z@Nb2%;8E4IAZr8kf;w_o<|ZvH1uzx^xcK#1tVh)wko=<>6DEOgWdYq6zI4mo5&GB# zm>YhGMlU*~03`sz?JPq9j-HB00#a>gy02q(76FJou8)Ovt(yB|$GW_zPCih)J$vdi zw0PwH3&_3U(Ga$i78#|ud1$P)x1XD;HsJly!M>y0@`1PZWSN_0+2KDhz~STc(EWC> z1yt|H>tT9xvKIqC8=A^#hzV1zTXg_ZJ)g1B;ru!eU|W$Et!5}_hymbSrtuNoI-pv~ zQ^mC1Iy8yXlHHj$13^zMKEo{vv~eK0)R(C@4+JEIF{s@F6@Tw=bV z$0oJ<^x8sQd`~r1&?rqk|2YMZ5U{qwI;6ycr-SmY-|X=iiFym+lMZ}%IIHYvWilSD zDS;zxPU~lt9qZKi0@)O1$b18F+03_9nT9BCwa3Ncp$S%_U0U|EEaPhX`WB}j+Ff$R z;pkObDiTzQB|5BAc`jFaz~>1<51*WSMZY8Qe2a5>JXMcyEIPPCe-{UAe?M%&I8`Ol zE*bww!cU+eDR3b|mtc2p{9CEuV3U?Yg}N$5I)b@~Noa3LaBgc|wqxt_GnL)~PCJ`- zX-b)j8HEsND@;I=EcYVbyP3nyK(#x0PDl1NSXs|0zl`8%kJ)3Z{=I7VuYJWea+)T7 z0=r+_12!-andn;l>C}#G-s!W8Tk}Y6Xrq1b!={u;a`BG6xv&k*WFN|f#mVZE{bxLj zyQYujmIA1dT=>PNg=asvVob>Lds4^`D%kbx8^6Ge8p0Dw1WfFW?0&fClY?FTyfULz zNBb@2%MGi9R5znOZ*5=Mt#Rg$;;1jLHtgr`IJ%p|LpIoq<( zTm99SGx=yN7{~fC4isE|Mwjtk!6@!vgE$FiB2^e*i;7SC>$Rhe$2sf1eB@=w_?UYH zshT#OH@?9>-f$+l%F#?<1%5g1TNU3SK?ObOb9Y<17yxHYVKmT4rP1LHjsZTo$*V)F z2?KPbAKGJwy-UXst#w079>jzPq^%T!Gd9`BD#o&QJ*wCEo`Q1?VWT-6^rBWu+}_%m zC25r8iyo&6n_XRF=ufAT`T1TGFh>I-azTV&YMzbiu6KGvv(w4J&cT~>zL_2<^p0LRG9IZjoT!K=y zprBRBtJP&LMuSxV9ndA;pjLk{SdsY?9gNQsjh_55mhJQIj*5C5&<*HL5!Xlv>$7Tl z|8KOovXWgLJiMb;As_wHCt5oAjW55TQae8fgraRYUBh&e4`>vs{UkKwy#c6B&io>X z0d`ANI0IBas>|dXABXeD&};?Xrjq3{v`29kq{+Fy+7k~lQcl3M-N0SJ0GqH4)T>5k z?dZXli9h;r^t%s9!yeB7ZACw$&jw)-POt<)Qt*I8rUdm;;Z=ls0#fqHTNq= zkDjJr#e!G4r=qshm=28UO5p{5( z@55dwOfE>`Wh58H{t_?d@84W59O5acFEmdMu5wdzO79eQF?0dw&atdeD*39jdi=N>(}hmD<%2{ zYtXm{zQ#feLR-)A&;WT0x5(u=!k5*Lj)7{tfa(BPE%Y(=SC-oY1AI@zA>VyuU4AQz zTS8XugN~(^%%(cM`L9^gnb)nE<$Z7uXw$sY$}yZNU?kaUfx5H7t3c(W8DG!-)}~6p z6aNqIbV%FYe*W&6$|LzJTA>uZf>Y#u;q~(~8h$+Z=~ELGJq7Vh9@4~DI=C>ykDP`8 z!SRm_0C9jj7zmTc1vnmOgu)2UsE`}qxphuL`J`F&>@~>ToUoo z67Nd6vHkwNfF`y;o@GMev{k*j>qCNYI*>%=>b~pLal8zsw}FR=+2^4xyp05-XjQ2? zzq288jp-Wi-;5P+OrwL!EouR7Y#nhfEA;=24qm!?Ip=hRwZ`gs`(yZJu!jjr|Za|aQ{w` zhq;GzHbshF0eD*bgT{saNkBxOYlEb8yF0@y@|4^U%7<5>I;+uN(38J}BzXYoC4Y?^! z08cQR$DIM@ zBTcnS0As9kU1eA3y4->RcJ(O$EzN%T(eHC&y2t@s&;G&Ys!j~>fE8BpmyIa`7@eV( zr__#w42ZB%Ez4chx^V}&eyG%9x6m2Gr}3lDGqaO>7vajBemBU#JB8dU5bPwPAEWevnA%^WI(pGhC)9 zY#R5?0*+1YGgVro>3e)nY#n>ZKKp1Y8M^|b^yt9QpiJqoi3hGrJ%y+&q4q_e|&QDq| zLuG0DSjz`M;5H+Dx=ssMz`;(lpOkP*@QI#1_CX;g{HE_)U>wam?ue-ZeYMH3G5m?( zJ5vW}tufo=3~44UIHS1I$J$!z6t#M?CODS(yrk$Fq$&&y`qGGuR8~!i%W}0AwQLn{ z+0&mMYJE`H0lM!=zlN;QZe-)`@1wZyWYJkZXP;|WW#%mJla#mkw6X*6^j!FUs_8MB z-&Erp9q2^AN_+*ijncV#K)nk~ihwr6p>PHrh;A?sV8yxOhPqK1lo~;oa+??Tdiu5S zG&QCb!itYZm$D#ejSc#H4uHn+F0M2H{7+1xGXfwWmLUegCwTZR9)m{?)22SbwSH#+ zaVC;qvaaW&JkBSIe3>{feD%%c#EL8CsjDKVVgj^*kW2#%K2-NvrM7(EE&-Z5d~*(H zY2x{6T@Sew^ekiWLJ_ck9h@OJPjUCilHHpkZ8zq8A_w#II2wnK5IgawiJs>VaoP(s zJxUGt57n#nx?l`)i}kV5PJHGrP=Hh3S2{e9 zTkkR^lmKvVTQ~|R`=@)QHOYanDG*NwJ=h|w$Z0K_pO*2aVcy?kG zBku?STpbFA5W=J3Un-7xO@(}Cep$V7Ks~9#hbI{wcQ%UVK%l&ql-G~!FQ-t!cYV|_ z=7c@W#>@6LWTpsFIxEg+qx*IgEFlFW>hgMS%z)AW|NBP9^VCPx!OlTr-flfW&%W|X@8Q7Yv zFHxc0fn&zRip-C^t5SPIFe(J_2qzGG$yCMw1R_t30SuhuE80y@F_gI@fni^_7>8Fp zpcyk3Fc=S79I#}3O*w2psC5nvj;4i9Q4w=r{AEdc&vPKslBZt#09JB_X8~#(G&o6k zW|##{d*r5sCOb?XuH!t7UJndA-Vh#OX(vAB3+fPg!|}Q4J_l|xfj*&6pod;X;le$~ zm`$MM7e{tgx%lu;`+I@-@a9eAoa7HSk)d}kINIVo!h}QywApAb7kkKB3n!yT%vbIM z-RDTfRTmvoi?kQ@-l#wOyv3|V!fQotNPh`1+5XtS{f>#}KxSJ}3*espc78M-$&`Vl zPm?}d)1C@6I>1E$tM6VvlVSyl{0L}*BvH(Z1p3*C)pr0JA9tIoB!7IM?*ahpd8 z6A6pM7O=Q45Mx0VNTWtBVSo9q0ieddEFkQ}s7_12<;ka!)O?aah%$*_0v%X{?YghgkZ*Lh8 zRoAu+&(NI`k|HG_Aksb3As{UvpybdsbPb}UfCxy#&<)ZJqI3=*-5@Y@cYT9i*K^Hr1fW(nbnEknpe$sVB8{uF1n25a`#?eS+xcq4;_8m=p|a=e%8G8F=fKbnl-?h|I9jk zoQpWQY!cr#aaOv9Y=q5Ut z3Gr|j7yW(Qx%@638Kbb~SLS_)mx5eWJRqs$otId|;xAy8vCfz;W@~-Wal9d>NZ2mf z(PAn7C-#G^&rtR^`Ksi=yG$tM@OO6R(HtHi>drDqS}&*Q`BwJqQ@(1;ZN9)u&53x z$rx59G?L898|I~_%Sx%?jby7Vt&D$~&#v#LnkiMyIpwwdlpJhalZnmHh0<({>lE15 zKQces298s=!$qIg-_EL4 zVyU`ce(YL4EZ6l8p(^Q&7P6!;7`@H^U4b&Es$9XBV0TQd=&6rwP#qDf(y;aAx+&3_ zy|IEezt29^J?d457+oZ4rj;V0rSX)F9TcXD1u5qo%-tn z<;Pu^ru@te1S`l^I&Kn4Kgqw;rDc=EHPy9tnZg^Xn7}j4iC5QLs~M><+^{^MrCm73 zof#SbNjZ~cK$qseGUX()c~|NDd{|hrslOvvYz);nBD=Fy-HPQGr=p19B%}(F9^C8k zx)(7fv2E~mQn$=GmuiR{8}h>@$g*Nny(T0V=erhSL603zp<2C8($8SD%;aUS6zeDdVWT@y+-fc(T>C5S5oj* zT9kX@nD3LX`+6M2h3sBVk5v7}`FDN~W&e0uk>D_H8=bg-D%zmOxonMil@eob-iM8U zH|yu|$wh>3FM~>u7(WHk3-%f8PmW$AwJZlsq$%-bPo;I*H*u|`fQkf#MNI?foU~M) z5+T|{vHpB~kB?QQ$bHNlZI<`-^&>d8J5fz@;#~fXBcb;38zMoBhPeqFZDW>F4tVJ1 zfofH3?HB^ny1VLV7Q8xRofh@73%9o+O1}g}lb~UEA$jJe1T6J2QXj)Bs~Y}rZs_Mz zp`p!P``j#+M^nmb@rRM39%kYvElIK_HyV8~)BZh+^tac&?`))1WZ_396?)o@k@}(I zn#{Gg<@$aX{et#B;#Q}7u2ebC+NiU}4e3)NDoj_+GF?Kg^QAU4vM8{tj!Xh-NH$aH z3lvow)QxY`*av@hZhy=yAl$Mp!SjC+r`|#Qt61-w>8MEQyFv|GR}w2t*xb`%Arrgb*@M>J&dO2>S&fwQ%5-~!?V8Cd^J)R7FG!kQI z;p!g^+G5|#K3z8)Rl0q{o-0d!Hju>me8u}2>0CZ}Ie%3i4njzQ4_EkViD%GifX-Ts zri@rZKgxXk%K+=3Nr2An+{=C(2m?PBNjXZ1Q5TpJB~=mM%SGBU7iEVL3Dt0qk}`z< z;q+`vw;k(!Quz}1r}@dKRQ8LUf~x>gY7!Nxt%xu4r33V<)i-iGVb?N8)^Cm$J3S_j zZb?$F@LP8{XZfw0vIc7WwSkluRfE*&G5a54D0NxKRKatT`|o>p1i7^4Bu44CKBl4z zZdRK0QO)?B7`g{`R=AqfKr<&KjUi?63+CjXzEnFlO8ENPHINzbm!8C@PihV5p2@m@ zH_SD9SSYD$RvDkf@%&1_U^v2>SXY|0=V*W z5=V_@y8^APh)s*@*r#4v%I_%ac1mLijC=|54C@xSRBTEfd2gw#@N-nm;QbSrd{4hi zI_e4+v>6>^9!fhzSG&{FGHfk?2#67arQP>f5dlbG2_ghp_Q}GSYM~&F?XH{guj(Cl zm*l{AD=f~4RCnWnRM9gE`{n>&c$sE215zgx{C~j+{vaj%i*oV5UcAT7_^Z!7io^Y? z{_jf=WQOxkL@X?M_N9J5vaU)5`~l{`;wwg?Ffh?l?<%>~lk%;85g`48dxC_exVH=v z9D?{BN+TexYi2rg^xNHH#U*KZ>AOTFtEemXJ= zeKu-dBV<~ML~lSs)aCwXIvrVfJc*He$hzwYI4b3%eKMhb|H#zJM|t@fCZxVj5?zH z(GMA_A}Dh)FT2jR9Ya&5VjxvNak+-nXbOUrd~Id$&>K?YxOP~Oq0sDwq(H=sy1faO zr}y!2(S3tFS1}Md{KUns6*~R68Wb-IuhKHtk8SWRaQ!TBa>wFm@@UL+jeO!@+ z*1$}r3~StaY#tSK?=2(F0KYqkvYc&dOKZw)3w7W0;bk#*yfN3QZpG&^qvgr6dpH!k z09B8%^_dJz!B2Duu#h|_XNFF?vRAF9-LHyw`P|IPFj869k%g!`Zhp`zug7AToCh+#N)PwS!RH+*B$u zRFtcnL;vZ^37?Y@=V+3_x)=EwBsq^8@%%)`?5ji04|;Fi2qzD3%krV!Cf^h0BlhLM zYQz}{&W+6P=5z7AP_g>ma$R~;s@o4fbOAv#?C=(|lf{TazjuyL;ixwm9KqIK8}dhm z%dT?HGIa@T%=rrpHM?wjbW;C1+)Eqn5;tdvo-KYL_>OM&LV@j=f?HxuGunHv!&&Y3 zsQHPW?;F*Oz3`{g%+7byT}GZSW7|DH%E6XuPC*Weny&1|-5Ct<%yHUc3mW4@SGkJ= zKb9;b&ZgL`XZ_Sl4H9|^<}l0eqD_l-QujH6nBj&;{nR;36X<+JNFVaSh+65Jn4h^+ z(Ulv0@l;`wvE2I!y7^d8Spn1F<8WRiyiu|QMnl}!9VJPd;-F=vdhU-(=k(Uqkg!Is zo}py6yb6w)fXz6!NN$35b(e_l)<*ut z1#o?_P=A!uJwK<*1V1tyRE9`xZG8;An!v|~NO1Xk-n8N(vn~h3dcE@UTvqHTVn0Q2 zl9=uI*g}+IcM#G9D-M=(uXwDgRPtM#9PxpBWcdw1^wpd--Y%bx(tNvG&>fgIW7H^GjFPg1L z{77%T@?KvLpTpF`{KF-DUO%0`s`iW?9T}Ee9gaHblnm=Q%UVpQ2&X@Y^+-ixu9fTz zMVOSLx0!i0G~7v^4%XyFn1-)x7mlz+$bfp{On%~a)9I3(GJ{aQdMbP;R>2~F8xleD z;9)fDvsnNG(Gz^M5d4PU#D$+*ta225iDS#0idvd`DK`5D`!9)`D3xY6ugT0U+}sBv z1;^Lcvv}99?d@q}6*K(rPFjzRnL}kB6NA!eKzBo{)A^dm8_p_vtZRm)tFc?9PZ>ww zG}B19mMDL5@zrpnso0@Nxq(+d=GOk=nQE|35;D};TX{GEtb_Cc?doB!6rennC#y>Y zY-Wj=sxDs1D)bPZkB$#mLFpRhlQu|xGDD2-)Wa%sXOnhxR_4v+G}lj0p@U|0{)HA- zUhM%}n;?@meUv=cJi^jGVRK(1@@4_IxuWcHb?G(Prha*C>;#f7%cVg!FXac!pcn-v zl2AZH0`L;==d#rlyW9fthc6f5Q~9QWH?9VsZYH@!xQFw$W7)jJ*P^Xx;^Wyv zU$5=yIgA8Tjv$G`2uDNIQI3BG8p7FLZIUPauEEUPrD;4c`+@6DZ1?!7K9r6i*b=iD zKsw&${R}1O(a7nu7>f5z7lUFI{i+xh_yg}PA$|l+u1In`S^{Gn0Obh@jIm#bTJ+f= zI~lC{8J>cm&{ggmeo+E5!A7$wDpN|o0yh^+0G;HrspNMS2MRpOoOm=K-yau{f+$en z9M9?Bh@r!jNhsTS_`O2TlN;Y~TS?FM6T*=#835l(xo)O4xpv1aBfqJ<*RvYwj-V~_ zQFaLAMLOpbR}T7|87>g!D7OBh%l=y-aV4roQ&g}x)vs1QQ1Y>t1p!{INF92uNrA#N zrm{}!FlrG%umaDnEiAVgK-r6d5TBQbYWs?Y5U!+szGy#9LI<3sa2a0;M9gCD*&sBB znHRhsxdph3h(GI|$$jDIw6gMT4fg-m-=lZC#uNv1#Zwnb&u-T5jJN*slJn+6TN9x9 z{mcenF5T;=&L`paxi@*EI?meLkE*0#G4|uM&>}ZjY@0*(HL4p>MEt7qrB!@aqxV~e zxH457SSy5qOtvhE5hLdLblt^0Blgn2Vh@3z2u4h#1HagNeHr?F!HS5 zUUEwhaDy>ZP4Ezs;qZ9;$#qAm55Sk7Sh7+QRBQUZ{jhMV#>I-`pwHK{2aOabrxAE9 z0E;y?!hMy@_ZAfvGnGEa&IoDQ4`GZwyv0PR62RYobIkHR2fyG+*h^>&c0466>*;g+ z8?3Z7OkX%`2NOQ}_KgB6!ti@;74xU}wMsG;-RHy@LnWUoCpu0B>(Fdf8a>?QV8=s5 zcW=m71|3NL6DI(8I7)JBTl*Ju_#W}lhMf?j+{}5nm|sJKSQ%!+wm|6~A$%YtUSeIp z2MwggsTsoa?Exr6P#i$&2IJct7X}@TOMsNSj(%s8T}2DFoVO89xNHVD$<{~V!-~A8 zT%0J-L6Y&n4t-6`ZLmJTeia453(&37l&k5h6#) z$Ba)_et6dlzvzVl)8#?U1%R79W(JqnJYgXYUmGfPo_o9kx5MW6+-P8SKdeY%v#e&Y zckJLC3SH>%vX1wtyN?0jU=XG02d+s+3B_IEg-Is(sg)cr4H3YPfcuD^!asvRq=%%ZeD4j~2 zP`V#N=^}xZ&s*ngYcNHu+2b+wC2#O%Gyx*dSYnHNG#Y0Do*!OPN(*_MT0<|S03u{f zxP(iug&3goC=TAr%F3wUN8&LNM*uZX0|9_LMZ#l8B-Qg2uc7(+q-mOJtqbm3OAN7Q z{mP}Q1XLL2Wmk$d2dt~h3~JetSpK1q_*{LICC>Yb*2AbG*_SXV5mXj4CwhhYE$4g# z{RKefakK&&91V{AddU;u{qU*77C9)G*z_gwORb}KsP+Yv2o7miPg9s{GqtJfRXa$T zznZ~FbYA7d<5M%OyCUG_2SMV)JR(;E5*MkOwKOb{d*5$Jd`aH3SMlg@{PCUwK3;yh zgyGZoM6Gq$^UZir`_kfTEmt z5yRovHg+>I$t)d17}vS``J)OB8Ul56Qe4OnI?ijq#PuBNhs&s)c@kEJr|?|`2)3lz zO<2eHj_BP-<-N4uhPJ(<9BK}Ih6>}ila=zo0U@~(=P}X~p0yLrH%(#HnS~tdC)U~X zC=T2k?H}EInV_XI3w)|NuK{!6EoT&U7W=FcZZeKj{VnPTFLexiFyZ_y?K1YzQ`48R zk7#7>{61>ECkM?u$sPghyYBKDqw>*6g3=)jab~^=nP><%=o5z_&j*}@hy8;a0K=j$ zGrp&XZ^N_oJ)H?Uo1&&LZICP#YLC8R!@aRRDsp=R9Hig$&&ICm^IHuyfs-b*fDKhThD$}6+^r&X*^uGFd@G{~CKP1SU;N^(n z0BR}ba`GfND?)WH60?2)@l!E@Nl+n-{>1ps`B^NaSeYGoD zbtV93HCLVIY?%G-^9Q-?P%h7>nb9BnE@reuuj#of)|P_2Y*F}l)l;$Ig5MwS&oe!& z?a7bS6zg$+417B~iUq@lDc(QaBmpix01dtIug5u|eqqEaX>^)1I0g=fpIkMQ8&r@; zBWtsO5@UlUtL-5Y~p(CWTj^9v|j46jAh7Q1Ko{H~l0MoQD+cs|)5=sun z)Bz&GcMkY)A$LOzBcGRw)(03EqsYSz4)Bqk&%>$sqMwYjugsh%n&wUc4Z2??UZR6J zA2BNO*^!I<8vLmX;BGf$IoE9$_0wa7vOrm)6_}7naR^4#Dm(385MvH;7K6N@I+v3E zhoo0nA93|XVD11D)tRrON1%1hU+n3bYqAXVk_Lb|Um57G1Py4Y+ZcWF^#g#fPvPan zO*}=a|A`@uu8o5b;v?vPf{PXTxo!sfGhg@*bWT76kU)F! zO1Sjxdh_V+8IGx zu1B(T*(mIUhp>u_KB?D+fmBKO?%u3>KXn&v5Qfqt=NP9c!lN2*!Fe#pu=Jr0&gDNE|E|S5C|8+>L{Mv>-C)ay~L}X^_Z;@%u>O+qxzbfn&FV)*dvz!~FIhy%h-@3k*Q3g0=`^_=+hbRxe&}9X?HuN_TLaxGHsc zUh!QWv8^$Wzj_pt+PS;ryS|VYSyaBO7O~9%BSvy)>VqWDfOA#O*SFj#k%D4(o@Na3 zXvMtISpiejN5%@~J*L~JUsQA18bHg2Q?pKwa4_JgSxU-h?ZI>;M{7kv29d6PO z9u5WfrUOdpIo!rr_hw%Q@yy4KC5QWefDV>!&Iw-L4h*;KsO`}%)YX?B zl(Ew_Pa02jWa0O#*Vpa)Zc_SGM*E`kp-|mhMp6NEG(&X1NFXQd{vr_nUKAEmQg!fZ1yYW~cH^8oIhJg@|KQnj|${AX6S zSD<(n{1>PXrcf*#|IEKufOZ_q0ESAPxg5p*y^9Q<6OV@+qw8{{%=~vc4wy124izk) zg-S9w_0Om@eURFmHd3XX^+wIVvfqH>{hDXCZQ+0p7sj1+W97e>jX?3aED!iVz@vIk zlR_l9Js(QaV+_ct%8%oPP_5U|7>ZAXo{a=9ommmJ) znE%fJr2UZ=8{ox4IM*+~CjG~M_OF;VNc8^^){wEZzLZbJB|87F9@M?-&JtL2-=9FN z7WWZ7Icn#*Wjj_*wn(QVqu*i}9pWiO??acC*hTy^PPi*$uW3ww&UR~&wE3V#XmOJK z@0=#Mh~67bLH6nsVH~f4)sX6+c|ngG1n)3_bM@Ze8Mt6TA~;HtEGhh_mDqyh@*6wE zlKh?%N9IU0lc92{%$A_q{-6WBMEcxGyDov#-%xy-1TCHEwbGXKilQwSH3rv{n5x~P zB3Jk)P{k&IbHlX0)g9bf-mWcGCPx&harnG5#k*IIO?yXiW2^YhlIw&7r!7hITsw0y zPp`aZa<4;6=jSudTWV`-tD4;{5f{x)fojV9 ziSq4vsPx#Fzt&JiITzPULjKm|dHcw6!5TTA1j+K})&h2s;}O-mb|v;9|A>iVqlwR2 z4;Xd0hVTcSMj6{jRdQ5}ZS4$K-epx4oRt((!1E&I&%7BgNDWO*=gMttZMVlFGwR|T z+=U2AoZ$c1T^$YLS@+xl}bD9+f}5Qg74aW2^Fo@oD#1eF8ShBu-Cb1A^o?WuVCaS5L~fm-2>@ahX@^%|M2 zO{NQx$g*N)CxO`OSD>!1J~shSx{!0R#yjC<>aM20>mip0S>A}!t^yus%KEq2nVT zVCs#^shd%RP#tr+OZk;!DJvKA4C8L&^ImCSGj9PsyvxK`*XwNWyq|&lZ@4UDLbNO{ z>jR*JoypvguEg{&zg695j~2|HnQWv0n@@>>&E@<8Og)7m@wA61RQH99?ean7HO_ps zUm7oLVlT1Yb_rxt9Wc?kN|<}XydZadQjQ`rMNH4!Ls&jY{O>dv$BuRc$HfQh-h|_$ z23HlvYcZ4Q^J!tGm1)Lg>Y{yyy7Kcq#%o2=N9f0mJXKG9kD-i4e-lcU05Sd6Wz|TM zwNn3*q0epbjRN!Bg_f5nRlH5d_2E|EmpI*(E1wfEYIIe(^k9uRs#DHvaM7RGqscC zS78sLkJ`&M_Vk>+emp3$m~I5(2Ez7{37hK(G%R&t`_YRu(7H9m`1M#^aeWK_bmh`= z>0J3~5m`?s?oK)5l}j`EmB6f`jz9Tu{JJZ7uly-(89iKdIYxz7Qu(UIV+Qz-bx<%N z0>N3=a3pvt5|qYOY;N(D8-HBd^#@mukqPk7cvCF8m)3d|-p8bHDi1{j+&NKy<Zi#<(R!imUf18uNUA^&UvhnLi6Z<_B73HXes$o|ICvgVicu4=G|Q1bF1m*Cvf-C`bJ>A%W_Gr{smFQ-;{|BBbs0;aM+avrDuRpdXLE5`r6 z>)sdlWBS>V!NHouIOWt-?q3Vr8kSu&+!f_6E?%OO^=27+ex*ka|L)x3JzqlZRJgfC zNe@hJ22?vZT$;KsJUE(ZLt}7#&*(E%kbC-l750iohu9W!`cwUTV?Q;V{@2&w`)7dr z6iU9;m_8oFmAV)P-Z&e6Akz5 zPF{i3_QsEwPXx<+eKS_uXp@p^?!IlU4C~%MFF@}q-Q6Tr%x!4qw^Pi_gJi6ZGy9KC zK4?Sq9(-Vw$vGs0zbF398%Goxf=bqkLGa{t6^hpvM)h8_9eivS7NcX7rc_aqFZ0{D zyn?fQH@btDlZ}wtk1Ldz!pCO`-;KPR_cl$E8`7J78lj-Q5|Bd!I!Cy&#E}f#Za80+ zre#Kv&3E`F>*2n@!^LMS3x$#2yc7JzleXQ0U1VX63!jS)_c0Rj6axGdx)%WqYS~n3 z)x^$i4-khVZJlPhoa`#F626<~Y^5A5w_#Oi%}ohfLopyU6eQI-k}v!b+?yRPpWjg> zGW=QWK%vHeb1irmkaJX~1!8)*_-#3kq!ZzK>&i2w;;{M&Wc+CEa3AMF9p~6n$`{>o zZ$Nh)m()J_K=>#YBuJoh^(FK)A1^=$$!e;ZX9UTbGz6=8$Sc!R2yrzt-E)c~xeovV z^ELr3knPDgHuO2HDgnD9x!sz$gRxw+OHLDD!x%QWWj{3Aalzddw<^Z{m&SBoYrV4^ zY=}T7TzpesA)X6)`bG3W{Eo@!-H%)PVk$)M#YpImjJH-0sITh1wSR`bcZ;1`f`;pa z%h-QUDZzxxpLzU=t$nB9CL&fstD5cz((?du`wNO8vYESHi>^Pur;#L0Z~PmjWZ|*< z#qdM>nt&ZbVsbH-ckg~wjt67i;eCE9*FYA>0DoSRmM@i{|J+>7L+Q}G2={+%xgZNW zc{iP?0^5VDYhu}ee?@D-_W+#wU2S)UbWppm760b>J?}e`mH-56jRHyLMBAc>E7|mCHAx3omVs(T zONS?rVk1QkRVBH}BXU6LyDVm~qTDVn_})eOT5NlN{>y+gmffqc5Y9H9XJ9|bAA0*g zK3|ZAr5Y)fB}w^M>oX+#Q7QF>!1D_4+%)RE3+{$y$-&L(MF)=)pP^rpU-$+{+P|sB z<*V1DeBxJ?n(#1=4c@Xdg6}Owp-w2#isU7@$NdMOd6l7Gu3nvSv$+~8EPRxX#Y(Ae z648dKkk{%KI}Fz%RgGhU#f_k7!q%1jqffZq0$Q@R(w4txn3-5;<$}^#QY*ApG;Bh} zGlIlECujHnw_yEpzabI?$4{IKQ7xla4nd$+^_w=kfYSZZ!h2=IA*2UR$_(&Gf#<9` zQJ4x$+OQ4@xTe|Diz_RQEd7wlN8b2+cMUHso!`KkKYW(cgq`p>=lC}`T;o}J zr?9}$vwpviOQ4FI5TLaBEsbtZHjRGyIazEgk(SAn!27*lFyxcCkC6y!0LJ~%Fn|cL zr;b{()tYRCyw_nP{b*%+-8M>zU_>fo_KMsKuOCaIL)h4}Em;4N&j?T7uoVb6Rln4ui%rcE zJfTI`Z&i@*a@K-XIyYo%h}jF_w7iHlEvb?S!d)<3w>FzNXgTmb@I3vkB29(ejnaH6qzf*rw&oMVMhw z4K74>udK^0HSnmGT-PnY{xG(#DwX?V(Y&SwDOfkoVIo~{VdaM*EwTg$Ay@tcUR{lh z_??0G`b|sDFJXNhn@3Kakwt6FKkG_4sXvX$J{{sr59OV=cf+~j$D5yghPU$J0eE5` z!?Y7qIiOixU9H(`jH<9}s@42gc9KnHy8O8%dBvvz!|`W_;_7}De5v_0$S~ZZy-v`@R>i<_dmd(+&R(caTaj|klfF`H?Vyzy@Iv@Ik*R-o z`a4mtA5<=LiM}K~h(sKfD>HsNu>Nh>80DZJ+wC(}dOq~aQnI@OKksv^&g>HE?HEBW z?+EtU$@_K@EIuI+N~--3&J)NkR+UR2kG=mJ+CI(zx_84FfV+xJkVz29cvX20 zg}mU8wiTc6Ngj}k7xbE${pemFA4YFb(Jg3yWrMdp^B>Uk(YVeIras@aDNDFJDUMk@ zrA~iny|d&*ta3%OHdiDzmStu034bt1>dhf(^Ay*|{ne75)oK|jY>0Te`?{H9sPehI zE_uM|#6#sa(N1HwXPAE@f7?62USJ}{#zuQ1=*jBmJh#%{PYS=JJh`sWeNreARJ-p- zj=-HIxu|7!Dbd~SDc8>(48d8)+4bicHdCBiypgXKPt&LmcQ00m=2nHU*V* zlG`W)cs%QeLZ)$bm4DOJ@hzJEq)QM7Zg5M5X>WGDlHqmc%n^FoE9uL9^7$bY@glcx z97{@ws^Zu7;oF}og(OF}+JUFCbtI;lRf;xXCai5u1r*U42*H9Sntm=3_peT4~ z>cVXlPu{P6QYs|WGnvE&*BGcKG95NVZ_pMedctGWD-g=BoM0)hBVK^w>+P!@nWJ4m zq1gIh{Q|;K9A1;buJbFLz`b;CfCYXSAWi*ln`w9ZuN!C{1eDHY=&!7DY1728<`a<3Z@gF9KT7w0#9cO?LegiNT5L0Gn4tQ#Pz-q( zMOk8H`5dnKrccOi_gQrBa403eatfoTGCNFp6$>1W#rGM+fJjOnr}58e#oEu6wtidL zC?3ydu0aAlA%u(gAa&k#gJ!%&i z2lB*~yAaLiar!-wxhOmL`;3|tHf?tqO$8Y6r=h0TG^Y-1dwc(Kuzv%yDlT^8NhD@H zuvtsGVyvVF*;*h(2Hh5(C`CX|1Tc?Dd%!2NP?q)WMT!?hxAV)7vtR0~f7#lM z9l(K$yNDj}rJhfi-KsZ@QVSgQg+-SMom;?4#3*1F-4VJC8$6VF7|1tkohgJMQYmVi z2`gFQL%?OrB>P@42Nr^t0KppOT&E(v^?izIW%J3)j@XKTEFdMY$C-g_{8uhz<=b+2 zZ&PM_#8s}#78i?r(-hQ*41cejr5F(T@9z5W)X3S1cavXJNr-L*v)t4`Hl}EZ#dtCh62E%MPp< z7rUQ`;nDi}m3_|m-(`2L0IZ_dnrdM+s)NfhMrfciBJ9!)M!K}uNXU6(lMdyS*J+q= ztxxY(dQ{w+75aNw@s+Z;MT+{@2T{R1r&*yxy1(Q#XGI7Q?wKJjgW*KwAF-;hXyrh6 z3N7YoI#W+-cahJpDqpf!1tY&6)|`#}7Br&^~ET4YM2?pDJVY`ffoIght{}$4^gQ>flOe1f{6QKq~S?yenc{i z<9#wfQabeiipVm;KTdmNiK9tax{ z&gCe_$&>)ZOP*O{OoiLGv=*YO2bmiE3NU&r-F&fn8;R6CvTG?qSosN0 z8R~sr#R|Yy(_6l}piYmz(7=6l_2rbU&%lb(L_VnvNdP3h81`*$3-Az#=u|||$Cm){ zIj%t@xd(dOe6YJ;mv*uXc7b{k8r)86KTHtuc6QA>+Oku2^i+pQ$%SFg9z`WCj05Y} ziNHCT?s{?B%{Qzl_otp)o*2ibDLt2~p1^&KfKr zH#4m`dgfLXKFKiH$`_ZIvqd0qa6q{cAup}&^;WQMHEl*K1m+;ye|8q)*Rza}yIh1C zlJ69xVL_rw**n`fu)ughNA;b0&IL}7kmnQ$UoaqP2v?Y)GO6};i8cM5EP6=qp}5^R z%z=w?722{-@@3AM3ltu?&hZU8fQ9!olhmd9$Ff|ZvQ!sd6HnrD^c{A> z$$=Tqjfh|kEuW8vu}bx$%eMmU>+c)4D`-Y9ulsaKP^bcX!ctFrc6Z_i@%KENe}CQi z6J_lH&YBIA`K4>;_c@>S;@)6SI`;Jssg{ipI0LrPOQn42zdKA4(E+)%%LnZi-g;Hd!Qbge9e z%y84F6tO9TyxkGC0uZHS6Owl`5=Cw0*Bg%0p1+v`PuPz(>$iQ=T*SAyL6&g_*s!xFeA+r z=lFUJKW2sGdPtBLV+b=|=j`1!XUEkkc{L%`ec(T+AgC&|o(T$b+r$QN>gFyIdnT#@ zf6e=xJlkY|wk!q=+JYwDuVXr%tf4^Oq}L$|+JkRmQ5q%_$x<6A@z!kH)ieDp-gC_h zAxi-Ym8Jq{l+IFnfgspiA4BA95{wF46)Ns^_9f{gfjp>6Jq7iZT$+8CBLF)N^wnmJ zl_H^B1W2f0SF&3SuYXw5-mCO>P}*8)Z0O4am+?O#t3mmr4SCSYi2=zE%Amaf+~C>w zI1`ES)Cl$iZnQ*=5)Z}9phiqJ_8;SYCWA4#DkDBignmmCqz`mB(38I}un9-QK*Nf& z7F{IFFWRv@;IgkZCHerTKXK5b{bC|sHbsU~M_Xt!V9jvIx4sdE54}x`aBo4aHvUGi zE`fm%fWC99A}!rjXOPSl?E}0x-3_56xOt6vY^w9~X9@rJM=%wu9r;I`NrCf{7=Eb1x2!40*FCIIg$A=%s+&wNau-R9a2bn%gI3mh(DT6rp zm3ge_62VzftGK1kKY2)SvlZosoU0B=u`k^bBFyIeMLnlJUCva6%ypZ4a_nwowth2I ztXSaL*B1cj?;h;8QENLn@9SAsV<2W~;*TMMr03a4w@~&A1Nr8~Q7(U>G&sN6zo;#- z2~AUrZLcm_fLF+p9($}70IM#Ylpl=Od3)X+e4Mz}t;rPp+E`sFIGk_CYb@HpE8sIo ze81Uahq^~WZ~LLA#FCnB)iRbAv+k05v%I{+iq^gGw?93$d5HWeJ1qcN$4GvU zQ6P+g2n!7$emm|xv3ZHHn}pxovW5;4ML{@x;>8Lq@N6sZ&s)@|LEd|7K?My0{2jjo z*@|J`<+UaO>;PaJSdk|O>5^c{7)RP?qNznMxRIj(U@SBgXp3)&+Q!`QEEX%elc(N; zFH0DmUN``8H&E9aX{ii5qfo+29Jv>2mU!}bfWMjpj!SHO>qOH}ephfRzTbHU@S25k zk%DjwR9Jz{i6o#(O(5jq|BU6dxv`BJrfyl~ICxh)hyv@v1+UQjcr~`e1e?yB4_8M<*270jNO`ca4!>7Bkjt&RKvF(@N+yM^7n`~gG|A_t?wfN&xJ9~z1$CLs0u z>w$h>#oS&>@5?tK5A0F~&}ZFoDRr+7+>BDKw_@fn9iO^~Mqb^?k^%VsO!mi*-J$@5 z%BQ(__FYoA1CB>v$q$3?1`C1X?vjDertslCz(Gc|Kl1><-N<&Our)Rz!gkE@4`#O; zl7uqep3yqYp>or^Eza^BBQx|B+A2!bU-vy|L{AmROA$J9uMg|J_p+e!RC`|)Ye@}8 zZ4-nxUHBp+YMZOsyo)obdq zN3u1;4*Wr4jP5Jf!dL09bjQWL3r9qf?Fn^J*0KprlY_TQQe#;k*D;p4} zvAk{Zkz<`lC(`Kn?%M3R9rVQFdD;tu)^RfU(k_%>g&%M%18C;uv2*I(MKs*a0m{0#Gam(U?_RFnmrE`$lfymx=N zMS}*-Du8S(9Jc73tUuFH6D84N zz$?b6kH0$rll)4O>at)d$-tz@Z4dpShcc}w;4Is>N5vnUSBs$YFZ4F3U>(+Di9c_N zHN5M?m|aL;0jP6pTUhe0eiX@&rA;>R_d!BPx|bZq3)o*`fzEY)sB0K-o5#?2N3;5I)}@N3hYNUqB2-;9ivkh1c|St{?s5*%@%mbj zrSQYHr$^=~3e=4V{*&+&2qMHrJnB>zaiTE2EN}iviD2qf-e%++W;W+JbuHcLW9dv3 z09A%NQ{MDCGu(V12U1(*zZPc}`FlExJ%IW5NU|OJB&xDj7djnDjlSo4;oTuQ&KD8sy+58j zB&%;`XyDwDiEfHkakW3}2Gu5+)D+lcFqP8uxRn_-$%aLVkGB+m(}r_V^g3)~{{)S< z40Kuu>QcNpnwCiBNSBk&U9CosS5x1ZHQb@Qdo}u1POt0?)yT8kAL~yLxiE`(>4iNK zIh{I}YV3}jJ4@ysRo7&38Lqm%1V`$F*qm)XD%7;VF%Y@3Z>0__L}B$pB^Bsk!7t1z zJi|*ms>}vcAJVO72oU?US|nvCBCwQ^Wdkx{-;r^AG4~3_y%efrA)VLS;W*T}6>1Je zjm*N-f&iLY46QVdacoR!9re(%Sgh$+ zh(0z)t(Y6?nJR*cP06&cMw>1vkk|;Z=Ntk?+&Q^C+miWa(dosaFO){sH+z2=)+XB& zK>=P%Ogj?;>V+eEKmCbM6ls&J{7)Y84t(jyKvE34N-_6(Df$IQQpxU6u$Vl>8Mk`j5gTdDooH*1BvPCFsqYMf`_K4w^9j#HTzPhIGD`g_z1{C5{c^ z2}RFkbb6-VJ|h$3Z}(AYUsJL;0;1k9H;}`+^ET{DH^TxMhyqOLj0=CkB&m=Q{{`D@ z%;@Wk^gt1G4N~Pr27gHt8gKT~8LPuUUwCNPE)F|v9Be7lwe$Hzy^C^;=JBP6;<8>OwnBYKtWj~Z=U-$rT(IZiSPe`#08x#h5I zN|Tio=4vqRNatMhHm}b=910FLgoUAf*+YHnJt$7^GH|_{=&~ncyWstGOTrV}tF@h~{g$>_4km%`CeceS`FSRf zR)}|`@SNRHgdbhsxP@E6X4;-G8sKhIGuwX1I7k!m68w-h%&HjQ5q?vIA0>kGDld(A z%m&&MJ2bg~Ht!%zyx-0%CL1NUw_z-U@QLXyA8>?@o0fCdG6mi>(T@NJ;!Vp7@A~=R zja11_3JnN!@Rb2cR7a%C)(?#JtOFNZ*w8c3ozYj!IV5k%&Dxf3`v1e!TL(n_Jb%FN zFPW;RFHc5@}EnIJ&zIC8R;Rj}Va*=~j?b-~a(>C65+3x}Njn_xC){zwh0h z*`1l4y?gEK%-xR0MXq#E<7M^r*_hSvQTvDu*gJe-l)HIwl>@eKalpAbGcyxb^;n*H z(XRl-M!_bu)P6zV#r$$_#!tbFbB*nEX@h;@W;|6{aa;Z6jTDPjRqb*!NSayZc2{Tt z$>C=ZE9{=YyCir(b~Ib}XxjeR%{4Wbq|m$tl?V1dGFqc*?#J8e9tK_Not5BdUQ`q> zST`+MSS??Kp_W)A?yoDEeZ)dk`_2Kk2I@nQw~+4paNuT6 zP+Acb2v%pq^AVpcXZmuq*2U6>z{%j>!lwUa7XMIiL|Lq5*gLoL@Np>lvqP|6OUQF# znO5xz`xh!R_mIb@PC2czu+*wK>}^EpA8+3YS119J%+B>d0WJYQ7oe0YCihIrq&hOV(TVkN@f z!Ma!L0GYbN5hdG&f#n$VRW`eLiJZ86%_qbwYpgf}GOxd-o50pIb5G*Dof-DX(7-9Pt0+ozYp7L#rolHnD=5T?>EbKiDN=-CqySQkoBPx^95PKO9Jbiz;i zshEqlmC^;|U74=}+XqrD+RA8NX}`eM`Xk!@;Mh<~s#lY_H&z`TkGZP+2(itZ76Rlq z2+Xnn^ae~TXLjaoi5#!d6-eMRd@uL(Qi{!fWkX3IBCm8X(FYTf01Jut%Wv7LCFYk{ zxhH1!*Wl&*66s__IzJBYU%_=NosxUMA7>4+)wW%JDu(;q=lEc3V7&4hx6)_SOm|YQ zC6&U#b@V$P!3raca$HnPOjl!1Xqw5mJGA-fPuUq<{HPopUyKiv7v*H)ELN&;zL+7R z#d@9R`lZU%m^!8Ve-f2rpDhlM+}z*gDvZQ)z2z9KFc!$Y4YauPr6q>w=n8RV%*tYY z&l7auFU7vp9Z*zS2O(96MCsh6gi76s2dT4;idaVN8D7g^sHm5Q)_)=2fd3)+$xt3n zsd|9EMRueOZfPb7(r#KUb3 zLek^bJfCe)4#)ex{eh`oAaGD4^PLjV)QGuFSQ! zdfBEHZ{%g+noo29cWCe&GE(n7->yMJ{V>DB12f`2@VEI z;7~cze8K`I-@5eBe*XbW2_MY0aS|7yA8B#=0h`+aTcF>>gQx~i*tR=5S)^~tlg-$I ztS@)EnD})d$aLfn!~EQrL7%|0aP0Dt=2;+Nt90w(=ZaVyN4(L>k}gjYZV;&(2D04l zGy;UGdH$%e^YA04*gEe)u2Nvdaq+H6eb2Hrb@hN@yQ2+A&t2cRdkPa_OFGrtCZs7u zXr|>6BuAvH7U03j4K=UV_+sD5PA~rJ+>Pcc{sd>bc6t4KMW=3Rk(sq|NsWI2PUkp1 zI<{D?xc8Kjn~mD8EZS=Ry~__VT|O{$u?9ZGh>dWlV_=zdLPRyzoS78?a&9wtC!UzH zzdj7SA18&$|ENRgMxry0wK9AT=@wAG4Eh=zbq<|BD4E$FhESX_(R+H)<4Nwte=MxXYEcr{~*y z2DnFb+oJP~XRJ08HXyOk`eP!|aopI8IV|Sx~ci>pwIL(;Ur{tpt{5<6r#@GZw=9w@<=ra_A^cYU2v$Zz$Ay(I_4^MqWDc-N zymWuB3fYF|*XRTSa|s(o{g)VYhy%}!h7m2zA=3L_17=mABUh(s?(0I?o4bLSpd z(mh&w0v^93ZK#w@G#K>|g%?8WHN3_CE94&JZ0>P1rw2*ZyU&w!NxzJtoc| zCMoweIXW(%QQwp0Q)^AhPRD10%fpB%0p?ZmEdn#f-l(HBXC&|L^ zyhu$m<}w@NII2EE2-Jco&>AP~v(%UwTII*_i2)FYEkW35pS1$sfORu|CoK*;ewEm zAAPV0>?oJ{`coN~pD7*}w$Ht2vc_{92nHA)R$kvn@5_&?ZehZ$?z``^&z)x4JoOKPzLRo|Yz2DEsR zNkGu8Pawe#navN{`-7%v@OjsAey|3RCmAV+zNDB zv5n-DuupI(gDjq~4tQ-8cB z95pLCJB)!S(UPwsjrF*H|H=aY`J!7dL*NLvYb-8;&n>p_6QwQIz}!Z&QBb>vq*rSr zFHI0jiyqH1zl73L>pvAzW6Gf$=pTDOH4`Q~fHp*qz;1cFT@Dlnik%|k&Hv8%x!Fwh z3HMUZNAVhRP}_6)bws|cHXndG9|il~!-2FD1Z}&3q2Hz&GmbnsAq4GX-Kvb7ezkRb zn&d#Hi~PF%Puq?VC%b??uKT+g?wd0sK8dH&5F;h2jqm05gbfYjnzX!nP#+BM5io3- z4PsMNQ+?2UbnA|e?KrslvQE_{&;hy>=&J2rT^$$&+U77uchHZk?*oBg7D~S0SNz{< z0E^BT#CC6|4=1F3SQyrCRFKzqy!6By_fzqxVSV1BJtjQtH6vXxZvfyubKGxwEPe?r zGIio2l%i_Vxc3ZyO@NX(npg|1soyEf-*jWLsa%MLnjeHh1+)M$+fdX+dq<+hKY*=x_IF1isW z5A1zSKu$Cen_R%Xt2}CeP$mRV%OG9kqAz5QRleFv694=UUV;p(2ivSW+z@)H(Q#n7GCl*gg1S zq}<6VHj?{I?l2C$U2HpvS!4F3Ls1%w;4eXEWN7n8>JGOiQy~uaPhTEuv>a<}NGF|0 zLpT)&yn`Nk;6Q9j?LsSa#e}gH`_ za2pnKXNWIheZHEjm%58?*!V~1K5(rALgDBUY3#|ZpPyPEzd%2 zC{>TzlL!7oyr7Fu&o9i+Frn9E-QjgY0#X32$XxL~_&Xm-T^ki$Oe9ODG{QW!7!03! zkU%4s@5FE__T0#Jyb>?4An<{0d}%4Aw@>D;Hx(W~hjb%aqk-I4Wd0KUH;G0b7m#Wqloh9pH_JxZ_zv@=ytorxO zxf-gTIKnASN!X(>VcJoO7nw>*qT13jS!tHjOc99`5-|DCf8?g=Q<03+(+fM=Sl_ix{0kw@1up7X9(`|u}E8)l!h6rEjJv&z9HIcMI<~q^!1oaVospV-UEAwp;#e0kFrC4sl1pcw53QE7*!bTO?Q-moxVO) z=RER-B~I}FCWa9!*~BsVOVnyTd#>Yyg@hIH&4B__GPRANjpDK|<15NcI$t*kDY`L4 zzf}?5QVE|@`EyL(ZCGyk@`TeFV36P;H<0PpaL6t4eB41Zg3*BV7TDRgMEsn5ElcZTrXfOZ4!Wd_WFFdy`@1kXGU=(zlqo zGM9XRk|m2IxrudpF8Q1)8#l-g8j-l^(9xitYN)KCx#{GbKTzLEi~yJVdr8sZ?>R?7 zXHwB=CIVtpg%6oObcf%qsaV*+{V;Fo_t5)Ii6QZ$ghI3ugXs1y7=^w+Vp4PWDkFl7 z-F`c3TPYm6{T0N3#D#yub9mfRVvq9iQ61^=Vu*TQsJ?w0XjdU z6Hr7)>%Ge8JHLU}$LHtrf}!ALIWE;2R?%s)!8xA-Gv!{Lngz2W7WyGKgtu|xeSs2( zK4Qcqa;s|LrekItpP(tD_JzREQ6|#iEqy>?(kZA-ArK2r6@FH$D<*hOlK~6%YSV^# zX>+=-6Ctv26QK`acnI$F_?Sz)bu%0YPg~dMP@;v5dxbwn6d&IpCNw@mY5=bR+wY0q zLTrGv>hoCLQGaE7obZ4r<02>EYq!Y$N?qN&Cp)}LC{cRXIQQ=$=?c2F2f?KflCLfR zL$t*dJpq)XO$*pUfGv~5EQOr3#|wW$f&IzJ}-#~t!IEz1OOn^N5) z^3p@L81j-NDl=Ly)K626pIjmIasL|$eyHf=9%Xqs3a zRv8Z<#J|>UV(T}Q=h8toXJ1b%=V$E49j)mFzH9%ebTF>|&WDh10Z#KrFKU<+Py5%N zNHy9AyOCRmUb+@ZW&g+rEw7*o@}rVzo|Qqytn!{5E6=*HdClJnDHjSq7NI;pp7-sTr>E#n~Xm>^>} zzm9MC5ZLgWlNtHtndQsiWkx^Bo&1a z#M+k;VDE}e0CbLKFpfP02OqFV-vBNE!_~UdYusVts=g{m05Y6f(i+}-oV;W_19793 z#Zz(oP)w65$n>5&rYhd#D?0Lx2X1sE)%g+AG~Z!Ky0ZyG)S)xQ;U$r;tP2=f)z^>+ zlAgwQAxmqNdX~jBnVO=-Hz#?|=Et?3vQ7TBGoZCDfe)!8l^Gut7p|%n}VLuyLHiddCtc!A&su7}087*}n16Wk@at0PgZ)jUz7jgDH&_H-Dp zeL2L`uIBQddP?t1ZDJ$XjL&2mMV+@xD;jdJZ@6rIS-mNIk?5jX(^4x$Io#3QZ>kw~ z;AVxGt=T>M8fDMrjg~~7v{O&!=juK&4UWC}80EuyAfq-CUeL?)l-Z4AoP6@)Ty0{| z_3KAt6>`HpF<3_F=6E|{{M4Pl)qOm3nd&D@YwnGq6(OY2sv;Ec$hKdyUjaA7z}($r z997s^GZ-3nLK1d*5qwwWLk&(q6kQy7JywjsQRs#Eiw%NV#A~Y%&z6*EqgK)d{9gLO zG7jW>^{E;*`wWjJ8 |syi%R1`syf{ie|;Q6lig{zRN_8({4iuFHqDU}bL6=Xc}% zg$B&KypkJN_=~nvLpfBAMpa@H*R*{-gbiGd8vQ(WZ;roBYqm6``lNGk39_aBh7`@ zw{YR4({#%9to)({a`0q7j;Tq&rOGR?uD;R$2Wg^nFn-pZ^ykxi_{BGteP;B}V+us? z+6uGGwN`}O?ZQ$c!s%>g`69HI+?OO@l_&06w>H6Qy+o34c$HND9OsAS^vUS`VAVxjR4p7KZ)4#tje^ z4uKVn2(oys+=wjckU#3q?Naw1v104=GJR|WLJlN_*4@#2pXEpJeEXKEbU_2dh7aU_ zL~(A;e!qKW1t4$%xms8gm71)WeNs}{M{)oKYc)|tkF=r*x${AM6I(up*Eg=OzgSiQ zXkm;&xAkYu-5Jw&XBaRQ0NIM={jiZPXgjVTxS&V|I0+2BKT^Qt{4~ z{@clkbMoCPiF}qttr?u3Fvu27r(pFj=LF`#Dss;y)xw)0Y2q=L$l2eugb*+S9e|R6 zZhi$IL?kW;rGaSsjo|6>Mu@|T$uyiYf|&fhlPNisq`4}`e)MDPK|e+$9IjTr|c z*l@hr?uUJOY{E~{K`39g+=&Rz{O1R4-dzDbmqU7*G z&Sn_80?|MD*AwS%iqRJjqJb@JZ)OL973d!g%A!;@(T3!P^Nz0)A7M7aexw}We=xW0RbbpQ?-$ul)Z!Tl}kM?fw*atYD!f|T5G$2O`2Un_@A;gQS zuZ7nDYDuRrvBa0&<4LSI!5w5;`(~(jXFDB(`;U-H zwn`qe>_6w*D^5p;h2To;?=qhD-!7xi_74_L&sK|+mdXMOJO(A%rNUm_7HRqZ08r0i zO$QGMDc+{Iw+QtJVk;;}6*R*8HZ9LcFc5=Ym?-?k_=*oYPj{EH-^~fSM5yIdxYf~l zFN|~B>+oQ(2X^h|MTF-Z7%=QTc=QaFCSKNdo*R6<`HN4lv(rZjHGBD9TYEF1glA@b zWbb-Oo$7VKCc?M1>B9+h4%%v2EF$ZIdD@UTFi1@TzhG4xRb@L4 zS9fmk;npi_|B-Y@|8v;F&84G+5APZY!=|tpBrbE~9fSdCU z_WZ5}F8wC)Ihe0q6Z>ep1@qe=(A?>~jJ`F47E^x1XCeq&J>@?KvBnMX<#H|f~Sg)UX*NQ)Q2c>zsrf!>}w3!x)KVreI}_b zwzr&8xxsHH!0tMo(+uj;qBy1__>_HQzC8JOV9U9=V9@GW2kh2gsm&pWK%8v0ul4B0 zBGuTwjAg2(XX!=f=Cg{oFZ}uq7hR?G<{U<4_S?Z5U$OU>uk9tUXjYzT8xZHnNG18r7!aB6wWw$rtt2?=zxvpl<6#J7Eeyk?7Z}y>6?6RZ*hHK zVbqy4g85GCxS?doPG}c@qjIKeZ1J#_^_^d?tuxh!>V>zDrOtLFxg8YX%2eOa<|!k1 zava2EykAfpGa~4lH?@s|K-Fr2^ncyqe|~l?1x9Re^XdqD+(&;--e}O>Zs!$wisA#Q z+qnn!tJ6(B+J0Tr485IxB-DwI8;k2bl0SV|CFj?W2?`u{oHv}wIgyS`<4vE>JQE-H zXbUp29RWj!T1CFM!KOk@$1+bgJ{0=2+de!jc#*EXSg>IZu}ap{&#|X(d)<=Ivby}B zWFfH5?bismyB}44OVo%-$VBcpf~86I0+dU!+_czDyGG_H%}kVMf%`LNT-O7&`qKhm zU=A%j%LdC~*E~->i(?>Ai^amNTJ2A|f?Z3moU30EyrFaVQzj~COEs~!eS5{_V+sH5 zSxx(rSo6+@M2^J*X!F_+-t~ac{*?Beh#juCs;%7bUp>=CdM=Y7G1fyw5atE=<~ioY zPWU0m7?(ucRba#dcL)x8=l(mi0z~0%ZX)7mT~8~8IhQ3@@Tj;O2P6Hsx}ka+?^mhg zo^p>lmp@(A40^vqc6EllG<}e>SidPO)unw^XzV=lDjf&0KJoTM!Mo36G^1vBm^bs8 zEbLV5x5AC?j6@^!%d2N}h$9B>PrM>KPlx2i*v8Gwp2T|gc@=63XWNHFSf7YCJ&Lk( z0N2df0PpY;tD}^m2B)ye1W}`*TgrW$KTdagLI?srF};~sqJIW_cchk zl#lOn`j4zq$vwn+MSq=`e%0NuS;K*Mw*-8Cz{}(6MEzM@|Cm{1S`HQ*)83MHDX!|7m#~l7QsZ9J1b!afj@FHHJ&D~Lse5s}ivIoMvC?$VZ zjzG70l0j{kL`lr7`~Jbq!{uZUo`)-oG;C6jJc%2+zo!Ng@ZMxZGEOq~ZXv2D!R6R? z?Gu%&r1>9Zz#2zyrX#gBtJH+@G_*<)`=34#`(NNYmVFx>TmB`59U96A35u}CJu9V0 zzJxvVDkXv2e8l2*RRJtsKC`O(Lb1#c!+cJvYHu)zV;;^zBAjOuJR}gSI3=(>$9`@$ z9G+q5Y41<}%3aWRO~I8Y5Tjl+iWnaWeZjU=I-`}HXWrXK}<9g+pSULCm%oEyBL zm(1ugc~{yvYW2JM7kR)zM)Xx0E~@d3hylMh7j_K#1qvb-|6R~%vyn1~Dl6o;#;tD0 zZiy{_t#=~({;i~-~^QtD}g=K!b zcGq)VF%u(r)xP)>$uQv|RILlmICNNH`|7WGx}5M-zEjnl-=`<(KlB7_C@G#%DICRB z=pM$k`KsM!fK2s=@(({hlFT=W75=CkNhIzzrAD^Ce`H9lUs$N-0|)Km`JI7f69-m9 zXR+P#*HeDo30zPQW`No#BD>g{!d^1Y0M*Li2DB(>;f>IX`!Ig|(%T;BPZITUt5;@U%|I^m|OISwR zv(M|3`H!bKxdztzu7bk693LEpBlb^pX>4WRsfo#wzn|W1o^8NkiA$HdNU(uO5}*?! z3BmuQ05=QKhpmCQgWi8K+)sb_m2w#s!400w6v-NB^RQs>(bV!sO_bJHyzOR({j~sd zm_^Ie(Ny{`0a;56@iN@S3mr);wgXY$@52d#p6<6%YQDkzq1+YnCpo{x&1e-1fnSvWAi4dj@!T1m}{0?SFtr?W6R z4b&INl}Ehc1Bv2PX?$Ja)u{Dv` zSuK(NA<-nVby^XL-wN0ne{toGbZN!B_KyqpIe&$Q!*7b{5{SG z=s3=Y;GFBG?W>C|!+BMY0nU|6h21vOgDT{~?_$7v?kq@*Ww$!CZ1z(?I8Lu|TdwY> zT*Q?L)Ar)3i}0fsnqEuleGP2n)4`E}BMwCqwEm+NB-KK2;X%42_CYi{+JaBgZ;Ny- z_xD^!b*P$ymo6ZNUpH@_tVLa60A^VlwY6h-%L*8rE~Z)~!{?n)TQ<_WY2&^2lZ z5%PJ9pM7L8`HX%WH(?8{PW9>L{AkoTIwJu$q{xTuVKfvLm&WGYZ!07~IJXEl^#gOz z*oEW*>tCP{_z+k_Fa>B!(~Sfx4E8yy|EJ|R0>mzt8{Z|@0TUb6q^Q|sWp}RPZQXE9 zX3tKyfA{qA*FFG>uk@i@H4y92=6E!k!e;V|-+Cz}M7-kRF3Z9K{%PeGdRSSNKG`2p zEU01RL}?bi0r9)AG@9KXWf^rQC;qxTCyUF~)vp&(gz{ZR3KB zRgYwd>f_#uLxic|UgA#+es)bs zLYC{2p3=jGAWLgzEbK7XK4BwF$mDO1zdIaeX$a-Jt*(DI(jDZHZY!?lx zjFq9rd1LCBYVAMRe~tb#@15_C+bieEz~%Y9u{RC#*+9ez^Z^EH76%A4egEnc+qY~F z;29h2)HB$fXTN=>nDrFIdd|||(4Dq-W*ryu^_w-FbE|l~|7~oQ?g`p2;@zsiEOWsK zF+I;!LFwm0RkLrK$)0awi24M+|IGMs1(35AWW<5CHDpVVdBte6^1^Q9$>5V`?r4_~ zhmGvRL{^8yj?or`alZ{bv<};`2apSH-|HNvSz%rMRsv>at!%(0b(q`jd~o`-RbL-~ zjCEnFed-*s!oX#1>`TOK<9yu9?+H>aFf4p0vSyJRX{90FFz~*~4E?D4B}QL;7tSg! z+>pZY48u4RRoJFpT&=g}U+UY5A)wU0^eCe4J{*+PI$vLzE;+TR2vgs$IQ8vN6Otv& zm{z7ekh3xN*SfMbpDqIHzIR6Esi&-Zr?es$)B&W6-fY(5$c4Tg=zyxp3lP{eF8%qI z6(RV&?hAp(vdjD}pUzrhBb~BvT zXKx4*_g8n6F_FFFP%E!Yv}=vSLBQ9rWky1oV$CGIY6 zm`41BV4+PXLG}FT5|Q^Nzi-#BSOX0n$lm8G7@}P3lD6edQQ$&`Tn|W!hjG&vAJXhy zy=Ge+)#ooPel0nqilvDMM1#-=f52ASb{m*3QmVZ^%IkCqoSef?E&HMS*62O79S z$PmSMNdTxc4$) z)ei=A`o1>Um%#|CFR$Rm5mXEJ{g^004$KWQ`$hqs(;smjLZbIHmy!_WzowIcoLy{5 z|IsX;J4WqEm*K+;b^=#Jn0OvrUadk4OMO2N{%WY+wCnUTYAMoaT{U0~XgKUhv@cQ^ zY-nG`m`(5ka^!dZEZoO}$IXOf@Cy?lu&3JiK@AoMR+9a)Fmd&Ne(wov$^LrxsUuzI z#I5IciETjlkNI*#Z~VbbWyDn>9XwOZ>tJ?*=lCHuLZ|k783w{4zvoZ`6B(eW&-sna zUusNba^V$f&Uf&E_PZX}dx}EG;p=()6ni5tBa;sN`*#zL)GhRd*tEG%y0s=X80uz^gW9B&oDX zpdd!!0Ox$B@!$*Y;qXxFOl!WF@>(0yae~uXIf3m?%L^^e(YAJs+Mi};^AS!5&quwd zw+}Nv){G-s+|s7(F>t#5d_Mi=RM^P(^yAErmi7HfVskg2A#qs9txTR;_2yl6E zTxi)sUQBb%@r)RL+`kkpHq$mzv)|XrG@Wu1cD>hB1N&g_T!l%X&DUBOQEV0`HfwJ* zs+r$)l8&;ECdGg!kt0S_N~+GKtaS#J(?6;*BR!>=qQ`%ln?h=1(`k7`Jz2fXcyekc zfa<9$vCw-Uq>`6TmAH=kuR;rGUKKhhA39FG4^lpVSYR_d^Ll(1^d2I>bhiT;nPlA-Hyuh2D61q)pvN zk+5T;#`X;w3aD6}m^Ybwcp+9_-I##{(!XqOVU#?Q*M0N~Ss@RKn4J0E*FVbDz=hJK zSeakw5G-P$0q6e+n-LA632Le=kO#&yMMxMcd#+;s8dY>ST(zAcUI` z{2o4h{duN5Y#)Ev9i4+lT2C5Mm{pSH+n9hvKVXHhMWD5@YzaBG!Ch2Km4}J5dr-fi zu@%iAM#vX`Z`}%|c<1mJEWl;Kgmh2AYBU~Ho`Af4g!OQmpFKe12>;ExMiBB%8Ve1T zTSlT5M?b;*|9MbJVFwQE%jj+Gv46(_s1|*=fgNRf7b_$%Rw`bJN6JG z^DC#ps`je~5bi0OX_Rn|016MwA2N=RRN)_d;o9J`}igl zj8S|6AnCG_!qk(;)xR}ZigSdq8rbgB{*Ee$M+4jcgu-M133{+~Ho>&p2hOSOOAfht z+;umf^UJ~W4?9&&Kyl;|CW@$Qq0cu4T0)72wf@P$A4B?KNXo6g=>!fU-lcY&*Ct^L zCEjhT=2w6|Yhen8_sCxe}xrp_9{FsSVT z{|K9C*^-UPn-lLnjJX!!xz6_MKv@y&cVEQ{t-#)X(%fB1-gD_h$gd1z`+s;>d$%CJ zVb4q-w3S&pb)2mkOid(g#SQZe%$e`PEYRr2zcpnNz_pgux|6Nc1x_$T=SwX;4Cr4p zYaaI`n3WK-&i$lJZObKa8cqo83Ri|qsJ$dOjwGrG9573-Og!g3*(CU3-%vC{FVK8U zU~gQN*)m>^5g13Zl5IjQDfZqxN#4*%`|PNC&Jf}xGF2F>wo3?~?+A{=J}LjAdaXRO z+Xu|Gs-Ij>$bF{j{IRUR+|yb^)1^39AC`%R@c(T9TQKtM0XN5;_T@ww6*|x0?@)-q z z{*7T0nlCwEiJr>MuZW4 z%#<-J!}4ig5=EY|F>YSUV?=Z`Uz?^hM1-ckm4d5##o*-1CrRE4LWbNkbeh&`2t0eFc&m%)FR;GqF&5 ze=Uxhz99<>$#O#dnUeFEAY8=mA%M_iT;UOcem1D&k13$qVGnfh^dqI}W43E(WF(@m zG}yMw_|OY1vV0sf&Rd-?VSxL;=Yr^v%00K^iAlY6S$^+(SP)Y`e-jn9EY*$)A5Q_z zxqbX~fUAgWXiE8-35{SNtkfnL)>+xr7(+(Ea^wW`=;z=b=WzHTTh6_)KS!^L{6Hi2 zp;qbX=&P z2w*`7zhmvBMg?|yz0G=qo?nu^y?u1q8(Lz(TU}N09zOS35GQ#isC8-e-mM-$&#rvf12}N3B!fTJ&1(--< zywX3CIE=Pl736QiMrYZ9ghX5fXKv-+qoCq3#7LqL6Hb8RJxRbl>BnI~%!Y~Kv}I^H&f57F2jPHC1J(|+GU{{7Rh>OV=n(Jgf&Aje@6&S5G1F6% zzbM4OH)-W57OPf2%tCmn5dSGc57aj7?Eaes@2@8KU$^4J_%RTvZ&3r89fcYbL2W>r zZ*ot3XYC?tg9Mr?zB!kFM~mE(y3L_o6%eMJklzrz{hBHBX0E(V$>(9K@|EPFEjk&O zPiG7#0itd<$soI|+#t7@pB_=hWq-c)J-6xWm{mR)`O``M3;I^P4Rraky69fm6H>+U ziEYsz1(@(S02Ma%8pl@Z&~Ga!MB9clF`S@66+>J17G^hAerwaeK!-*DxaD!k_WQC0 z*626^jIH&`!fwXj16&(~)|N6I?)IA?n;p?UiJjehFvgWo+uawGaH@vLL6_ghq4G*y z#Un;kgh>9A67qbn2DWM2IFXfgK-wPdSfqs^g*^_E=(!vTQ)`0|%D`p8gB$(!%WRa3 z;%zFbhvOT`gRROQ&`q+yD_<3d&KRsHMJ%ArDY{WD~>F&PJ)FdWc&-tJrC?7i5 zx656ebV}Hx>dpUIQ|xgw%{;4mYnF$lT*9JZv6)?lE5)mXl-?2JUo-)^Szbj+9gUi< z@4AR7{}>ZspuV5`4z=q zEJ~!0$@C^fNlDf6Wo9`bt|W194SO>dXHL1(FMmYuYcL(_ejrId`>?Gr>D3=a)J#Fm zDYSZ^Iy|>p2XgS~w_?c8mO4CWYwH#hz3!~pANT~mY}RI8HWF*|_t}-O#cb$yt1wvW zn-~$+W;I8g(aOSa6QsgMO1o^~mwr_)y-Y~62i9gDdnzlD4`PjeBXyaWx>!23 zA%zBRG)Gq@+tmV5$~D{HUJ`o85L#v&OAO;7-^yg>*)qE%DYreX@MAb~!$qESzlHTj z<3n{~#pnUuAW;4hDIy3Lc{g=qfAZmEtSwAbRP)AY`Nvh#-Q}TxEe@*TO>FNEbw$J7 zgHS7N$kokOYRKio(PqCeti*dwU1O*D>l2+%y9)Fh+s{w>Q*qOI+9nFmq#1H=Uuc%T z51Ph<-ciMEbH;y-bK?7tJpg%L~Czv}e? zxzKA#?nGGGalgc%WeUb`Tl$Yc%$WTT5zt;2?DWb?YoW`3Yt0W+7?hACh_x4^j{tOK zc&&c)Vm9!AX)#6Rm+pJ7k});2VZuyPPA?Kgg+W@7dk9R?Q&B92sxyPX-EVelN&er@ z;#dsMntJHZJU4lcgu7J6 z2jhVMu6gC^Oe}sCqKOV^_(oGvc(a|n{6yh^8Gc-3US%U{kPRD+N5A?vWTP6shbY&4 zBq6SB_$UwieXK-(5Kd9(FLz-B!VA^0xeR7 zCntqI3il8)cu4l;mA}hv8W6@NfKElam1NnHLm^k$QnvMW|6?lus zH`Lf$F&8JDppJ>bZKT8JHiynlbK{;kdJ6g&zv6Rx5uJuzxg13q~GM$lNQ8Ireo z{e=O?Tk!sHAO3hS*0V?UN8=bE3$0C3Y&_`GD!7lLgoLVfxP3OSl^F1ga`t;YgjZjB zaB@tB80sdQ7SpFcTh%xd+VpAmK96KYAQlcN;fP>P4LOz%<^?`$y&C;(u_uK4Onl9;( zB8Cp9(e6QLV<7`!$_9L9f0ncxJg_GXAL%ea>`C#MiSx{8D;OCnY>uEicYab6cs=@# zj0kWi=$aqKhq_5J;ro2Wk34NUH``gLF>zaU*~7YQjdd+5zLeU%IS1vZ@jakHXXpJK z0@@Sfvp`4}rL(n{Dk#Yt8OcZUPF~?*1e&j*E{(L~;_rHJ;^S9M{7)k7v#ms)fPl}T zxX=)e7tkNug7Jzb)MK$+@S}jrV;lt)NOP=nuv+N}mArems75~0K}$w}J}sJ1 z9{@foV9Yu78~P<=@I`EsNpxQE!qaQ8&;IE}OdMw^+J+lkm8l2l-TdQkLeSt0hcZi-7NRG!^5_Hq1ArKQv?qMmW z!=9H)m?Uk+xn3i*#+xN?aINduZ=w(qoR)&lMUD&oVGL2Y?=SRd`U}NPOt(;`V zF*75HHGhbW`Y}?eO7$#otyP3`QItJj!ib-E_>eg2A1ecp%Tl^>5;5{Coq?S8n}!e3 zSZbQ(T3*5|_W3Zz-SNzJ4U%tqH$`ML#~*N3Yv`}z>;7@ng=~hBwr*geH0<|Ou54-k z`1ic_Y;OsBZ28z5lIi+GnA2dp``~f68qSGr>%dQR8h=btM;3T=W_nSdc8bR&9&%-Z z=wvN+p#H&8<;q6+APpxx%v0QL$kt$a!@UmW6;+z~KURv6T3SmkpW~gCg4&m(s{s!z z>^wx?CcE0>sd^m8KQUgG3f?ds?~t{12BY(`(>9VK1_Zb=?UpkX1NNj5%iFL5%UtWz z_#rw51Wv43Z62)a;y8rxUG)FR|1gwn!beI7H?^&{T29olzzc^91*&pv{!tTSLM*=J zT4Z}?u{K=>D@b;u83zCu3>(x*i7-h~>KidhL6*T7lfRU$_?EHv|8Jr4@TrY>FT?gf z5~FkynBHdgTPt)S`NBj0nsJfW9~T;B%ftkFvqwOCTN$HQLOQ$NN%YUL(dI^q_&Ej& z;V?;oof3M-5)#LHODnk9Kz3w8zGVe|b5~HJ`>)RcD8%lBF+7L}I#%R{Qr@g_vH!KrT6FP_zcRx_`SvSo z*M_Y(3`&*||E13iZ%#|&>#+WTt|sueeL7I$%uC?)|FxykyII)F4rQT7V~V0HYW>#< zZSZJgM3)fxzmKqOJmeOq(``fFzCfX7a?#%{0f0I;(mL&2;}#cBMQPOk@+U<&Sx3E~ zZ`z9wgmS|1pwAg5<0E>t0AL0;nyqZ;Y~B)VO7Qd4Q8uhlv$|_8Pi~=s7V*dlE&ylT z0f)ouMX1hs0@NYB>nHShRQg*Pn$tLddyI1#d;Y`nHydU(o}dt?*`~b#jlR}RmXnTl zYQ&As33*a_mV~UEg8Suc6L^gqL}V1#uvr{D1;FT(z4pkuHXl+TI9;xKdJURFEabZF z=c|*nXTM3q%{KPpk~TK>Y%C8#t`ZF9PF=RsU{RIFt;y2^#yl?6{q|@-s*7{d@Gj|K z3j@z08|GTK2Rd<|E>Ku;$!X@4KMS;XVL(itK0)k+*w51(fUhb8PYTc#L&AjgECPUm zq}A)3&!WYeN-!1`e`9mPSH03Cw?lTib5k5;;sbMiS&KiRy|3?do!i?DH3I}yN`7cn z>Ji=}{kbiD8x1eTE3JDe_Va5ryGn=$Q}BbX9J{ejKZrSZn0>}p=kgfA+4qH3uHgkY z?a_sHwc1i`JZOvmNq+~-aI91WXwi=pQzg$DkWPGwiBj(zH~m%BV7YSa#L!SMXN~3E zmt*eKu9tcKiFj*yo=39fGx{K>(ov`+y&wc!b&$!{=7cpMyn>dO(|Y8PJ>VXqcy)8@&bZk@gM*UiNlvJ~6j{c*sqPHv z!AD-Cw>M5FaQeI(^D~`U%l;~_m`9Fq{}A8taB?iq6!^SX92#b5iM`oLgN^#|SX5&B zEQE)=ko_hDk34yjliiuw z-FN2fnVnZ$O%@I6iz_iEfuP3p((2UvVOWA(y$BlB+;`pmL*dk1)mv+FKyuMAZ|2-J zRzCUV>fxLT8p$m_4bRXk}1*tYXIGiwby4TLHR9qh0v|pZ7u+fFUX`3IM zlVrY%8mZ=$H_BwZ%0kIn(m{NX2mCHs@IcJSnr#Wbjjb-5V+_2{?d)8Snf(+?R|9HW zGd{rlsM=+0Q@#F2y>LY_6ZOAc5aJHHI`J3%U$>!wsdAcJFr|!;o0+Zif~AD#9<((+@1>lhBgq7;eSXgKIE}}f+q&}t`l|l@CyAx4b5L3MGQ7|@}_tN z7ZDa^A#~0#rN~NC@l1If9eF;D6a>6?#=Sv$6vK4r;pL4hl*MYDWN^Pw3szk!-ZdU} zQ?d_u3JDfZ*&Jt61%L#Am8>wc*Zd_Cu-%W{g{soz@MxL>rel?~U{~LKNM8Y&8kll& z0eX{Z=8p##c`jp=8u zV%}rnQ9aNjjM6%bRKVmDs;Z*^THA|}U94#Xt%euFs<80jhaTYffD+P>_*bZKH<1Fa zngP|g=0vbzkBj6QE_7!!U`2{fd5^c2mSeDE7R7V zH#4JOv?Hb&mHc|@0Pg-5bE7(W1cOTg{=K82@D_#6{~<6cAP-0RB?1(%yOWu zWmX=RtsGldZce_x3(hZpxzSOH8WaGkj|gMXO@2(i*9Nr7WK|I*=KsEJ2DRx9HUup} zgFPPZ8jE{G>Q}#h4$1cn2#|bl%<_M7rJ*DHYOM^n)?0x0A3NPU%!>{HCk7~I0sVJB z@D<8XpQ5g($qY+r#sPwD|Y#_wY)6eoG5%o z$oO!HdS|oer%#K#(yi3x70myyu6>Qb&IcE(_QQz!^UV$auQJXFxiuGe&`A4z-d3A9 z-lfLt&ml)rel_C^D|O|@DduY2S3UFi$r;v1X= z4heZ*;GztNiE@ASByjUV90*8a8%R(37almt>`VBpu~@H2vowfV^w3Tg%^-7)|b@iSevANE9 zl1PeO4%DnLrH5C#k0e1g{J@mas9gIN^^H8Ez9^+B?Q)9Ml$OrqzjexgmBCroX4En* zZ}$t7Yo&#T1C2{>nRhF-Y}15xN#ORxa14bbrTSI3hM;dyPcoG3E(D0SysRu0l=L&e zPMvq(b7i{rVr0qY3v~088>uVETE9i0`3FTK$t0@n{R7`rc5}pKrvLH&oAF2c?@onpWm7tQ#|)JU65x1b~?O|ny+<0s#cIQ47lIo(&tc)U?U6( z5v}6$q$3%l8ULiBtO|{7*3L!u8bNE*ESfZHaWAp|O@854{o}c#-;g*;rWxktLPD#E zI7PE_k|H%s2djT9ysBv*2sUzoGC3r+IxotmW%LLdQr4<5}&je94w&u$;!GJO8sOv&BKb?swFE6g1C>Z%-dH@|$Vu;jtloNnkN(f^k0nGm)z0G$P0fRfi@TBn{w?2k zZwKccq#BuA$E-h&C5@I)=Iv;PIN`SI4_T$Ch>cZ0gFXIH1)55mfgdlHT91JT8cU}7 zIiGi1yp~seT9A{c^1Bm9+hZw(XcA&i&rgT?=G45+d0$LIB9;eE@`Sbnxhz6xYB`#$ z*H<3+(~^ndk8#l81E;IxoSeZ*y^#rTwudCsr9CMR&3D`H%>L&8trk7XJO4YUzpmM_ znYCJ}*WVRg9Mvcm5}G@cU4!DWbHPUN-}oIZ>~40z3|U3|O=QIA-sJQoNNWhatuxjP8x%Uhp#*ZYp-Jr%pW1u4T*`cpae*`US6{`gCgl@oov`?$SO zhOID`%OF^LTX|Xgr{gls#~c0bM8Dh&d9_*m(|6choG1GGhtCZ?)mL_b@YNMf^N8c2 zBkbj+vSqOK<4p(}GPJ4bjvNaT=MP+Wn6$>j!NGxQ1VS-`AO1Yt=eZLjQT2l7zee-; z=wm=as-D1fY#W>i1H8Zm?NheK&cs7$^*NwS3SQ=KdQ9x^APxnlnqf zHUuD>srN>;6|>QUaJo(KrQ8124B;#ty2fI`vX~Rj#P|;QnYwI1UdTx?@b!lATCu9l zvRn%kchcs6!h8J_{^a)hM0U_JTm=;yCXg>2r>n|-1-)8*o2&?2z;mScl(PaD0O94B@ZHVpBC)Ge z`2p>f(cAr4hB=PWG9s7B!~mkVX&na9C=&zVquaahar_U^JJ{~~ohMJf6Oj!7;iGU4 zfL8+*crjlb8}7D^;UeK4|L+Are85DA{(5k-3N`xx`vUkyi{DneY>(yfQ1No zs$DV}c=X|eXMsbIhVrvG=4Z(=sT&k+MwpU;@}dZS^Fg*Cn3 z10Cm#eGlLd68T!=H2#}jac2K%QBvg>QsxpvOvoP7ySDNpNN#`Y9&Z^SNBE0NLyx7@ z`z&tXwI&+FtKzBfk@J=YrPP4AfUthq%iq}Wn}W!F0wL;_K}&xr{5gcm44PMAj7A%i zVQh^9uC2*CSO}WkLEs&+v`$%jlpOWG+i2aA)tBg#&Xw-R%g&i*@X(aTBv~aBG&uDE z$Dd*-lpP=V{S#HW1Hg0$lS(o7S)ioqv}yITEuRm4VoDu6bg9m=u<7{h>cAc`Q58l6 zBW~aN+scQY7i5fh;rpDFi@v>{2d?@`KU@laLVDI+#{fp+nU%p5ufO=wih(Cc1cvKl z%O}S_e)#YK9n2vBX8b!%mS>#>BLFO;2Mz17X<>ZM;#N|MjAti+Ia;_Y4e$IlcGc6Z zgrj|=wx5k#fp9kw!VNA7yl?eHY4v8m110R^>vJfdpRm0H2}*}~;Rw7yCfn8Q2Ok$M z7GOaXv{ZV3+v`5yjZnjG7Q6vLx=bp3mBo1kNsc9jbVOWeYhF76GkkY3DUY*l=GQv+ zZ7wrdPcj`|pI#V&5FsTYi4{uq?d782MJM%@VUc!17$ax6*5^+*bClo01&YmT+EWUS zsP-Io0_etwx)U17`+ad}C@UW{E+b@KwWf=rxll-1JLc8RT{q%@xs*mP&rCX(KC;}( zF-`10?dLo;XJTRk!f^=TuCd%@%@lxzQeT)@MB(@MvD)%s+t0z~J3nZQA!#m0!y;BN za%feA8b|W@HiVUdF0TkE4M5#fK{6%oN!muJ+jT*o>6eb)(GU!}o%>WQsCM)@!-+m6 z2}4CFzE;sZD2J1J5Wvu0i^e)<9hIy+N41R)`{c_?ET&R^cAK*)cqhsk#vm-T0w|KX zGU$vt1HAEmMvR?ZbAGaMhmYPl;tu; z9$;CeveM+>-YM|uj&fE}{-GFHvya(x(o@BMpf|-YGYOT6DEnQn6bs=DzxCcOeHlfV zSVOlB_>vwiL)zSiy_Y1?G?nz1%P5!K^1vQyY9wsWWjjhj0Q>Ul>+EB+Q47Tb(4dWoon}w8Mgn0+jqpDWiv#yutgNg6iF{z@C+I`G zKJ^J+Q;q@ma!-KGoBHl7_hl@pl``706ck8 zegd*#tF9rxKJ`bwII+Tno3YVg*VHYtk3SJm`m!9nF;c`pre5LjZsm*1j%_c{UvAP` zdYK;C5lEIkIdnsk^V0SS^my}uSx)7(JHJ9h@{V;E&lwuhkpO0n2c-aXwgK+B?~`n1 z2qet$h!_aqX*kr@2?O0>SA}VHTzP3zs&^9vfN?1fBLhr>wZl{ccr&V~K)Pp6O!)1u zCs4Pwcxei-!iC^>On!fSK#();>T+E4qQ0`SGQi6UO~`J?{9N%auC4a) zhnR2TH|~^J2zNvS0?D~#K56&%tV-K1-jCR|9t1CYK0`Cr_RWth@qAR46a;#UHANv_r4(U&`$?}Z>_Z^6>5E&uSiTrepzzHA01iSOn)j+07pNcsL7 zoe2F{F@S%!1_*`$u6_=FOzi^Qj4#xV^}Th2y08>|aiuPXnMPDM;m0&1;wdiTrpCn} z8v&UCVU$v>RN#OaDZ;FALIO3;MQC41mNmeuHLEoVx_=4C`I0-CtLA=<`!Di%kOxR` z@M)q!OgE0E00j5?%Id#cg;TecLw^>3L=(DEpfkgTP2!rsL%U)WYyn4IquvHY@O7VM zK!nAPLe+=gFlC!=aCd#Za;WA$|mE4uXc}O#JYD!*x zA+JJ%h~UGIOB@O1&Ca={qk+h$##zN=Aq2TA(~W9w*?Cp~AbG9|+SoxDM>8h%doNUY7zQ{utSvPf4wpqM{vQYNux zgcBa?gMi?R8edCX_!D`vv#?zXGzh~=YbprIX1$a#LIp6zx@9<(PLhB!0PZN7tN!!y zeCV*<-QCqrzmjOP>m7QhI$StU;5T~mK~b(>9%N{aK7uzd%O@&+9hEIA z&oeEj0&Wyzw34le^WSU$y)*_#0A7l*DTUGlh;*a6wWyNwc-;Qee%C3WP#fjkmZ0Vf z0Z;cQP#=db#&L35CHLF5l1C z^D9p6*_a+W6TKqi*RXLYtzQt({Z6MLg;7#S6Uu5vsw@PRyc+ZF}~y{oO**(o*~~CB(|5PXF5P zr?|7GY5>GOpFU8Q?-YsL^W5Lto7T*G$X$)AE}GI#7<0#&X&#VxzCs~S0Ahy^(d+8_ zZB}$qzJVFm&H1FpYK&@6c8a_X4KCBYs&ROB^4b0nv1^1Dy_asv7q!ow8oCKwh7>+N zH*N)hf|N>^CI|u`IqB7L82YP}xeGJ)$dG%uK8zqYioXjqj+_1{q+ZcDb>zItX%uMV z=y;%VEOqZV3=8Q>;VU|qMN!F0M1V|bc|xlQ_S~*hMnp8#>i1~!ocehBk5*_FI`5)n zFAtZzf>Q%^h-BUA)nN12e~iOmqMx|o+~3;*-i6M>Yq#5;jlb@e`u7wkH210fVeq|P zdPs0C|BF9Tn*@7RFi=p>J*_Q9T0iA++2byn49@aIS5)WJIt65>@bz}#`P(MKYAz_a z#ME+G$jpC=gWaAX_haA1sJ+XZP%{m-l?2bC0#T!9pD+7y zBOXA@a(P1&GY>>I>ztw<<*s6gkgC6UOq*V-o31y>C=*QXT)X(B;*%mwkv^lFC+&z5 z-)_-qVMf|z{S`y40pGr|Y`wa*gh8sba}nMdYu(RwNYyX3q=+XvZohMQ(?<7N|Be#L z-jS#<#|9zk&-#PprbMkKxXhS}PgWu}@8}(FX50Jc?vF`~uFm#p)L@1xr;^-X25*!e z{9vkk(xDhelWe+n`EJiu2wmBA5eYSS33DM=yI=8V?+hRx2(c)U2WBljvrF_i%rK@HuPS-A0sytKw z&Np1~&gBDZ&Yzg$!D+SZbN7sGW-;Z5;sz5OK5svhhn&p)#YIY}aJrVF=z@-M`~IXKAjO(?HJK2b|s=UG$TxF*c7$WzZE zbfqUMT_DZeUFq8pv%FF>7fGmX-;6ldvKT8*kw<4?;igcPDeB>$|AsCzelJ)VG|sl# z*6S)NbWBCDWm$HOEu_zb?qy;;c+X@()4o+F(j^z7Ln7)Bx?^UOgX}D!z{nKbs)>Ix zG@h~{&?jk?*wKJ@j6eGT%7HH<)^x;fWrWi7_TF9{ty46<2;C7l@HZG(wbu;7FlyW@ z*@1$_kDTl<22U=_f^tu)+8!eQkV16I$O~UfS*r^VsKK_=i2di=Y$&@O-b^K;1>YFP&;UlK;1G}L>k#1N*ZOWIb=W18ArJ0f6JkCd)vINj>-RF3%*0cj?8^*IrKg^0xwEGLkWEGB0h znfX%1xB990Z6!(Zpt`?h<7OF+v%#{x&)W&!wZU*@3<)jg{%<4`R5PFXNg?ytgeCEI z3HA+=!3yxbr&@IRL+5)zdal1YiOH^Uy06IW9Fr22c9O3FLrH$x7}-MelIuPN0GQMA3om?Eqh?E4Q^^J9q7Sp z*mxsZ4JW$(?5w}Cb<|jrQ~isF1&;gCe$LNT=xc^3slTI98X>Kh5nAlr4GZ z`iJLh1^Ta+jj}Wuxm#F2snY#7kHc_+G+`?J4f1iD z@aMK5X+0FT(y474E4mRcrUaXfLxskM_}99Oajj|#(!N_aEg*`x`zc-M4rbuiJj*0n zJbaiNj#EZW(FjCS4YYb=Z2Qu?1y2=bBM<8grQ!9(Mn;0}x!>B=rf<)bo;X^cF?O<> z=>22q#a4wSVXjaW!xiKlh{J|i;AJnPZ@6N(&wl7Ts1`i;0ZG3Sf%cV8UA;L6mlUae zp7*P8qD-?esaY=op;*G@(m~_w`B)KV_$nYV%>0QYGZ;pAlLedQl4aA&<-9&pL^P8c z_%_1rhX;Seu7{`2a>bSEvY@-(KLsqvP-|J|69W}p;F*=1n;YN?Ka`@V?7IcO5x&GP z))-o(!~+{=}^N}5HzG;K;4;fu`QT*%@-^m(YOU^m))69^uM2hzw zSk(TUDbuYbLoDp|u!v=AXAnB$wox#e|8qPjy7AA;OmzPf_&*x?Q9L0%h+Y2Z zw#P^c^M`-Q4gV;{QTDUK^Qu&1>ir%{^O!;kDXK;N@_$V6{S=6J+){KNtw?zk?ess@ zQ7xsv1JQRR`_|knYqVy=DbLPOb|glqFvCAD$}F8GIM>QR!lUlU^RIoxx-E*>eJ^Aa z+5<)nrL(C)1cR?&B}E@3F?d9QIRY5}>?y1ER@Fg*3Zs;w90x={1ac0{h!=Lmo_EHd z-5?t#=xlFfwJu^07$#|LAB}u4wED|LA*cBnO`!eG(-?+I8gW&1(%X3>X;;)>Kc(3G>0k zUBi|^i9_B50K{9t2q8jQ?#znehK2bh6M)cI%}|Y-#4Q|Sk@L7SV#M-?I@T~d{7}rN z4j_6d0wu7a&+x5aq8k7ZSR)WLXdekEgTKZ0GQsuY9o8Uj;`W@aL2MUoa&+IW)le06 z-2G~+lRZEWZ8}n3&`!Kh%}^b?t=fW}#_aG)wBKk3e2CxP%Ir8S{L~l*c62BJZz>&g(atw7ZT7v%-uWM%i5#o$B|-3v}3QN>UY2 z+JRx=)y!m$C1Uq@{-aU=M{FP<_+o-4`(q@5M2tAfLVs|OhIM0|h7Gx;UJOilO^JU~ zoF=#o-#zfx-E#B64V6Sws+Ym9aqF6^O~J1X7Q?(*4=%;ui9RAlNb77R#p_}z5zPpC z!*}80Yy1~%AbQvwQDp4q^WoB&p_PZ^j-NL_jmDer!yqke+nzt}&d*=b>A(6>vi(kj zADsp|iPxY;+|Ygln|3KVck(5V-I~A-#RMqx_v95?!}Eva6ktP|u=-)Ayv0T3VQStz zK4U{LG9zu54$fZvCk7i7R8aw)4ptGNpYg!C&G6-*XF6f`zzHe58Fj}St|c8_*r@z~ zgB0=59inb}XH)X!8NAQm8xI+Aht4Y=w{?r#!12L)?k+BP;_H!VO%NwaBrUv#;I`~1 zi+Dlq^V>$6bD!M6^*z%g#QS{hJKzhxh;NU)6{8J`tqKb1T!>4|a1CZg%m8tlyTFQ_XG8l~!8-ARPo}sMGN^kJE}ziNpKQI` zXKsaAX|Ugk(@;$-bki}xH#y*rk(#Ru=aqLy4iwZu@u&Hud1I95ncu{NSJK#e491T6 zm=FG7IWyz6qB3%dC7s_H(pCE?-IVKSgA|0Ad*nmwjGq}efA42YWyO5?w5JzH8y^lg zNN3|$1&YL5goRT(v4%--aX7QpY4B$-qwpAh=CkUcv=)@lSLFT_p{wit~>%=Rj@%{G{h<)^SF=g#aqjAI}W9 z`9&A2OMD~sC-5hJtYJf$5(`9pm(CcTaGL_sEbacvU;%5u&EkLXrr!a&-Z%jaEGP=C zE^gVyXL##8odWb7FAUP6RP6&(6s(HwKKs-4g&#U71;k$^v+w^dC7(_k#Qf@8^js^O zY`Gb$2`^^p(-#s`1uAPw!#As7zyfTQM0r~O1Bx59OA4C$Re&P$N@rfsdyRtYp=U=h z!wTPklU5K)m^!U~0`G0|7=#WZX`Fio~A3SR=+(6Af^GMk#~hs*&m&jts8 z^vM2wQZ@o3o1S563GLs2MLdd~O5k?d3&TgG7~A zE4!aa95+}@L5EzPN1-8G~-cT4EXt4s5K zQ$3wHULfohx&{Wq@@R{g2CNf3pR+0FLj|}$0wU|Z zQeQ~|5zovnl30T|iN3)D-T+|N>+dc>oCm#KDr_t5FQfI=Jqq?+3?#XEz>hH>Bt9@x z0h}Y52GEdsUqJ}jY6)@B@lrNNXOU$GEs|Lo0G7DIpd8XZoK2@VMWNDr?}S#Pidq{pXo)r-N|#V$)0 zLrNHc8-C3I_7{szZG1=PL0@f9HNLbeQEg?Lo}V%nTV zsyq9Dyf+XaExZ=Tnq>%mrAza%HLYhEP1w`p)qGRG$R(h&41HZM*?Z75YsI2Y%Xy)U zRf;yrTjGtL?bx+O^6Px_^@;A1 zUwM*ZoVnpHAdx~e!dyaI@RGRAU%^8)#v1Wb?VIeIGM$e4;+SHF?=A#j=IeV&LsKE> z$|acRw?cmw4qOlV4GUt4S1ue?V0KY(uIRcf+>%)bSa?v&(G&se`%hVjjLFZT!)P&^ zOxH2Z{&)%T4qcn?9ZlR(oC@!!Wp0X5yM0m2P&bL>TCycFGXl-d(73G6ZF~xa9u#qq z!Y*U!aN3zity!pf$>;=+mFu)zpZCb@HNFpAQZDD(5N3Z56P zO|Hk(PUCofD}G?Dy?)KbM^-#QcS(5Dm$Rpv!C*tV*xxKn2IC^C2;EjND|HnwH7Wn& z){xP4do&q37Q8X1qH;wf9!;{XO z{Q}Ha#KlZ|82*8F?Evs~InMMauM7P0{$SiYnxN08lb8I)PI{?}DzF8>s?!B<1DktQ^DAI9;6RVc(hH zhdVF)=iRk?uU5WSa^{Ao1Vs>A)-Mgw^wgsh16d;s-Y&B430DJ=Odx_%d%r&z-0!?6 z0Slr%w!?=4NEuR?{@O?+7|&9mj;OnClZIN=|6tY#o<{(mP8>=gf|ZD6c>bh|7JxD& zg)vG~1->4oVBNuL)wBz-BzL-5)YNv6X^a;s+WTN=usgoQ-A3@)>&hLk`J~?LGp;oF zfZlJsmu}DRtFPq|_ueZZ-~Fl~Rb(Qwt4-|07+TQ?=3FfUEP&*YrbxkOg5|8$*QOeH ze?DT!xNr|A7V#6K5-B))E3q8rJIEoBmrlgn`~iol-9~VBxXf&<;|)V4#_vuz&S`9L z)pWMEgsqXQAO%m|Or9k+3Z|eUfE!m3L?^t#v`5B<@zoyHAa+Hj@7^HI$y!ObwFe$* zl}6+p^#(e-)ns`b-7d0E2XQS9YRDx&j78ybu>lb*#T?HCQT#UbYJ>d9q+#8z{EuS< zP+sk0By%-#h5zBWixf)nnk4L@{?^Bs^*;a-7?P4p8`!nc8}hWQr`9B8()0=R|_9^2)O6))U)LLID~)W z812w`Co!dRChpZM;{Tk93PRtV1{}HRIL^tITnoQzv^YwFH^#j;ouz^E@M-?^A45mD zw-g^HTya6A#M-S`-DC=He+@X zpUAMIf6n6z5RM6^1>85IHE`l`iYy(3Ic9>8UswbCNO|6?mD|3cGK*Oh!38u7Qzwhq zD%#Kz;G}iF`gY%+c&Y{MvK&}kuYB6OjhX_|=z|gg3YM7gX>6BE8R3*q>n?|veg1O* z1fB{om>oUHq4}{Znt|?WraU=lXs_d*+}cNSV4C(94;`=H67+woKfl%bdwuj60DaKLg+6$=Kw}#{sjUD<+gb{f;hJOyVwa8lG*atM zkl=_8ad^j`lv!Qxv%Ui{77FsQ_lAVvA+FZU*~2p-Xw#Qd))h+%TiZ7ZZX6i!-hf$q zdfte_lV|b_<&q{9R%z?I5DA;heAdhD(a@iVi698mPbH`D)e0bT@%}z&;LBPq3=45= z`|>#k){x&ib@a;vfJAmMJwFDV9Jr{>0CgD(CIr`uwXj$@l6*j8J)#??oVq%BnJCVY zKaauqCiW@GcWIJ-STw9sSH-|3y00y>9+2LgaL#l(4rXVp%qvx3I~ znZM7)pp3)g!S#vnmw&8yHMX|Cd7;QYmHG*DM39q6{#z;*Pd^+Uc@880hKrm0iL2A_ zsR{gt@WYU7*1_#>%9{DKI#-K{&9RJ(C~Q_5fnB2f96`ICZ0f#}lJ1Kva0M8@K`hTO zM$B>QmQOL8o_w2!5&7ERoW3qV{3EZo8W*Pj2*(5IG7@lv+UZ9&V|i)alBo(vgp|i% zd4AYEc#{64RV+B$46B$uQx*$RFp?s~+#PLi`xqz=LhGJA<#;j(;ZlwnO>Bh+I< zKQ}qSp48e*UDo9L_a2F}Af!Sr0ZaI^SwFZNi(~*(=0@_m^uiN8;6jcTElA&E0{2W-a9lkGOV*;wbahPT0$U4cF&?+slSxVzfQSD1TsQcJ*|`PW&YC3(wx z6nJVCKbG_J5?}c2K#$|5iOiF@{&L52ONzrNzx84vKJ_V3!ni8ZoZq01MGvD372YlU z#YEogV7cFUJ^q0nGf>)?+pK@{|3%i8WMx1W$=px$M_KQ!;*J?NK13^}ri=$dziu<| zI>h3w8_3AwkUXoRfqnwrOQS9*-ck)+8E(!EZVvU3&JNnllf#nC%j(a2E7xxfu{=CP zK^nbXeKrQ*==T7~ixT84Rpi%$jyxqbGW)bqz;Z74{6&+`?@=2Wo_5xzd0W`Eij91- zFD`tYHH%p0C%#vl&^M=QYd?wR;UkWr?gqMWb?;c^_`}ntjRth2_00XV=*c}jAS1!Z zOf24>CPx29{QRYbSXW{FiNJ3gC<%@nH){t}E_eLjAYDPPqOcIv zXvk;r2NvDv7ud)=eptwhc!TzrA!l(^EdiJP(BlX#-+UkRNO9no#hp>qSxVEO0_e~B zU1t4jDYf2~pekU{jjqol%MezB^%F}sz8;};a%d{&IEakf^YvTSAYB^Cx8CD7HG(!h z+-6kpO#u(9-;&PW^;@_mJH&DNy>iu4vsV&hI^&j;uR;3Z;jD1| zx7hGlQ*LmQo)<~oC`j^@6O3CzOQfiCwf+--CcBkEAu!R|U-#a`DAxJkBYU$L z(O;Sz;rT(bleR9eja-e&cNg;N`O36O;0wZnMB=u<1sdmImaQ>b$Di&*V!%q*dZ7Og zi4r0VfU_iHXR%ZNik9HdEg+{z;ugkjRAHR`0tV!0=kh7lEDR^)3h=8PKd&~ zk>C@)l#m2cv^HsI;HFWW>i`C#4$$vqi*F9{LThpvsS84#O54<;3EY*T&z>%NqN$AM ztxoDF>;(4kiT9oW3B3qXDz+qb_T#)Oou{nUHDlXjEs=9T-9wx3lGkS@?@3iYnk zXMd3&p2dfasIe6K#${;hQV^cMB1EkP+WhNwLiEsr2d}pxV7U0EV(i#}6I~k5&mcp! zo&@rzy4cUAh{bI9pZN-8zE&pM__yn_k?46JqJ2Uc?LG7gaFlXF3-?_kLux^*zTdE2 z-ip)|qGcjwASMe{-vZMGSzXJtc>;jNvE8qN%o(44Pw`kJ9_@or?ve9n5Ea8m9 zpMmPY2G;H_A5dl&8`<>*CD4?o!II1N<2Mu8t1DF1v2B4aD{U+O1rZQx)@p)FrO6+0Gr=xiQ;V9k9|tbi;f6p z9mU-W4c1gEauu_KdH()JVmkw%?;32O4t56L+g$5E4)YzbPRy|b>GdX=RJjA2DHEO_ z^~KP_S>wd7*_;}75PExZP^=7-a6I_Y^O)Tn5zz|8+l9qf+EJpx;zYs9T_8A9>s34- z^OpsMu{Z$A+HH?c^m;6R2A}a-M)Qc)+|vj%z&bZj4!J?U%NN}IofE-=%7$>>xOR}f z5(YQBo}aLCEPnWi+RK(v`&?<*#NP!2bf%O4m2q%hXHq%XW@fe&(ORNfEB`CMgD=8m zY>9(dAPV%Hl`)o9f4nknX^RT1M1$vi{}8AbR!T$%$G9m%%Z$~Y7so=HYn;7230aX9 zhoPeFy^wWGB<9Z7yhA8q+w#owxk&o01=AM+tll}2I534DzFPA!U@Ref0(3t&q!jxI z3%`qM0^uKOqKF#Q22vsW$fayB|GRCnvM$sV7l<0PXRujA_lk{%<3I#Hj&zs|+s=L& z;U?z=PiqBj`;)A5g9IuSvVL^fqIqcx?K`GG38M_x?Wqs*Wf+8>YCR9DBl`Qjll;5z z{<}_}uE-kw+}#jdH2++shbg(yL*uN>cm2p-(~D3cM-Pg>jkIvQ7Y4z0Qz^6m9B7u7 zF1y4NxhY;S7AlT$XIejHNAsfJ2(-7EA6bd@OSZi`{x|RcjYQ+dY+BO1!0h@uIX|MH z&0!7=g%?C{)R3I#41jfX3%1jt!9+{b$K#qt_(;<42GS^O^DhU$0`Q9jzmO}BVWWz@ zelu4<``&=LlsppE!+9Is@Z$OF*UzC?ciUoko!q5L1I2GnxL?2x1Tgw2DzqFdnz+M% zvFtMUX8Fm8j#Cg8pEZ48tOn(I$f%yE~s4TqDs=@>s{4rZzteO^;dI!Bv zr-4Z_bLR50WDcjt9Texi+LY42^kKxj(*QG`FA=S)eISC-Jzgu$Fjysm1duB_cV2jNM#Nvw2%D%LD&D5lmeL17qbmB zLQuF49T~!sZkdr$JtXc;59KZ1vXL&0fuh}*;nr8=L%?_ok(_LfHUy!y3#d(J7g=>D zM}T>f`p+~c#?B9_3fyQ)R+6csyz0Ql*O9s^(LAt^=|Whok<1>P1=wm#7*=x4S&H&L zR$-s{i5d3mC)jr{`zap?Hf7yrZEPh(t7xw&3|8^#XDe>;b5;W{Do;q!T^YGrp7nAM z8lIrPXmlr8^8TaQgX<-XD8CF%4^vjI0U+^C`90%Qpx&5p5zi@LgD6mNX!*nD8hWQ} zaMN$ForPD8Hp68#_BM z;Q*mBW?BR@Jue!VZ!I9spexrSoCNz6H<&j2b-N{oA#j0O@ICzj`dQGyD;;uau%uhu zuOdSXi2CycdTaWoE%Xr z{f%`jxNu`F<2_n$Q^4yrZgaOI6(or-v^3m8t6iBxm17e*njxO<2y@J0_?WRr)uQl& z0XA8LZKDGOko+`~6wVI&?M35Tp@nWXt!q5pk!~LfuHDPLr|B~tDYz94VwJxWoR*dT zl(En!bbL}`Ye1~5^BA!>>g7WGdP29@Zl4o%%#UemY9m~0S!Co65Tj^ZuD;2ita~Ec z_p&is2zRUi$6P6g%e~T+5KadZ2YW(y&g-3-mphUdN+KeXFYWPsjfD!_$hM`VCnnsWi0$_BQ$Ka7MCyfO!(S8e6 z{D~@PZo+-r7tRg%lIyGWi1@~N4mJ)+4#{f?jL{d_U*VeivrWZNi)WG+JDo;o$8nZA z*;WLx<%+zB{Z86I4=y}-XXm}e*kdJfOgmMZ^ zi00`LW-?_3p}^vI@2m%c=CnN%;m^or6aM~!^5kx&V(ZUV_s`ogRSloH_Ps~42}5T! zb+7$CzSLx5B)0&E;Bg*#Kz9J+z)UouG?tFfHLqOXSppzE~svG{|nA zfzx_eRrx|SFW%|{ZYd%?;vgqo%wHd;L*1@$zySQ=PRtguf zCUJf3C*0z{*Nn91$Q?{qz7|=(AJc2>9wd6RJ*1-NR(JKw=U~_9U9B#D!>3uwLG`|C zWJCp#zuj5EIp}3i9fZks$Z`LNaZ85laAy;hlhAHVK!vrHhqe2%Z6l?|!EtJ>)X)QE zY2aC`Ldb4J@bZDQi_TPV0SDP_i`zd#Y(pGi##Oihmwy!4|4Y0oC9F zzDBpq1t9&NF!<;g&iai&0N(_KWq>jm=6J8v#>|0XQA9+za6Dqmaj)wAAe)%aZ&JO` z=6%zBPuiZq4gf!RhbUh}k)h^m5^wx#R=?z69zsGm)~W6FS&M8lJM6&O-TNd8alB1* z*3I4Q;qKCs{r)guIf$%e>+F4STgukIVH%Z%ppCysdu@No3os?x_<96rYwj`+)xZP0 z{?YwX4_5(5e2Zp{7YyU&cjDA-B6h(1!EeBR`3tec34#aR_;f)Y1%T(=Y{%Us!HP{q}28|)S&*ZXGBybfjyTQ>DgQh8B>qiMK}Ef5dLNug`SiiD3!4s>fmGIxlQHF1 zkt{75W#eueZwZMP5;sT^@)PZE=xeKhOjXt5wSpW67Li{ijGU5-)c+IT4Z4B@yEx8c znrhC%Q4;^|$g_S)T1|}$wsvtTX}|J+1~w1nC2zeg%{lY@stqMRQlvARZ|K4;1?4<` z5$pZK^IUuvn2U|!f^Co116aoEB5)L>C+0}`Ing&ZClIr&2qgsRVk@kzz5y=SYH*Oj zp4>Dku_0Ssvx!>V);-<>I!WbpzNtef5PHTE(4SS6l{TU(gBawnZ6^_~ZWhC|BcMbS z9{l+U?|Y})1@1Zwh@azu5Eg_GZX$--?DVe|fycRn=d-RE^>d$Qz zGUY3a zT4g(!_W+rOJ~7oB*|ay@ad>vlgo_}ddAh@IrEDYnc2_|&iy)+COX7ddLtFqrPiFb% zGuMWi9J3u-4%9yLc0d!jfCE;@dMb;70D6a5aClmaqH_}I{n1e19BGun?lKy`$x!s= z3|Atn!J8tp*SAbAYo)&*`(kS3-j%=@E|-%t{OsZ~P)i8Y!BVIT-}HS1stjJ!&pmWB zA&d{SI9_2oG_Ff^xuBsR$Z~VVJ8Skd1)t2 z7uqk}6QCY}?aq3H43}+KKgt{Ve*gB5 zwf0|Xs$7(Q{5QVT@FuDklTGKRosxM|{W178u}CU+$|#^wL6PpUyA-JFk!%YaHWP6hiHA`|?1vLRoS&va zAtiO?)pU%5+wS9{VVO}hG?w|f&#azDODJ55NBesk2@r^D4`={0icC0<1hcdgo)f8s z5fQkHHOCwNdHc>Tgn|TyuA&QEk}OUlfM0IkF00VWAV=fYT29hY{>uSiKFknM<5?o~ zLm{7rUN|{SPIWq;%SkU$HjifP>nD~=uH73&EO-eh7ixT?z>@gF9t~c{N<7IR*7R8` z!i;HUSjyB@P~i&o#rxt1Vb{{+J{`Iz) zYsoKt_guRrjeSSOx-7v%xODE9i#323IhHh|t2lf3ZB%ec_3~kV3lBeY!qtS->;lS~jBakaAW7-M!rPjvcW)=qe;EJ!Er8!ddQWim z)Y*tL*gvhBUKzaIv}1-PGIaveREijpCPvtpw7>JczZVOI^XaKxaQQ)YTyBeDm> z+5Yx^1HC+Zq)HE1lji&xv2keKjx%f@WJyyID8sJ&MVthd%vyep6Yl;PCMd=LZ+12C z%apQEKO~_iTHYLBd{%w3QdG%qec@5KmrFf~32pFy@D#h)kV9(uIhMzm-Fvj&3qeE0 ze2Ih!#i26J!?MHO_r#F%lpivK<28^OF?~8Ncn!~{DCgB_DLE`#mOe8MK)CM! zCeqf_e5*`tM(VNPK?Cn7c>69MC&cD>eY=;+;1{7;R*3ILMy8)4+hxGxUVg+*ZABeonnIS>snrgb=E0Ob}H z{#HHU04?b)4?yc0*w;4U4>&!~@`9yal47C5Y;ocR z5%gM~Dk(uts4jty$-Q{wP$BgW~T+s;M{#%;>=&iOFF@=5ADX><_~jb}FC&I(W72zAt* z9z+w?^Rns@+(g2cB+oeckd$e?LvAsr9e0rVYqW*yb!%gz7qpgt@t4y@s3BO@JeNNW zh(Q0!q7P0oIeh5}<}UEyin;7~^DFwDSm*GJJJ={{YGU;HgH?phhs1aQx*Jh!|Yb7#78Ejoe4HLxv3-+s}5ZO)nCv=TW z03$H|2LUu>tnua|K0H6HIhk9M7M}N`YK;sQM$^a53m9+D3#%p_NEi(WB#>1}(A*7K zMO!cjRwl+%U%uru3h<5tcC;4HD**g(U%rUko1r5{Wf~t9+`sN&BkDod4Jy8#vvWXc z8H&A$bU@qVfg2AkpwgwbLV}U2?^3`+EC-!gj9>J;5MKHtU!MWt{E7VVYSjxR>S=UVj zA_@XiAXz$lW=s?zt|UqKcKRW)Dg`RPQSb9j&@wa@k@8RWhaitTp3(^u{`zUKSl2i? z=r{OyYB+Q}SB%fEkUn4)X1txQV-z5%SL2l%CCU7xpHiMoDexLyuK4-h<^sMQ zNRqrV*BF?=KY}l7j|(4WWhe6h!LqT6LfFkBH*oSDF6SJto9w!1*7Ek>Qmkygmd&TD zkzeIVUEn@No#f}<{~{3dOX?p?{MV~1c7TQd2n+*n_Q@M9Qk}z5OehaS;M%ha;0n%f z`6Xp=oYIj$p-v0MWRV0+ZTUV;yx%+OI2ELu9u}ZS9fJdIw+2l1RoOKaXl4ZDRC^V# zxH7X~WdKARE(snp{+lR7dCc;ww*_QmS*PydH=uc_6q2yoD!CR`B``Ref$GaQC-w-EBsr5A^B0XLp~XiBPY0ZB=p~x0Tg*F{?L< zS>4nAl76K{;NxCD=5m|Z7Wl~MZ^QWqhFwc!GYQB{QPZFaM*oIA(0o?$jl{ekICCNh zWILg=6D~|9T|x6ZPUwj_O)H9aF6GI{gT|s_dwphl?SuMBR#C1sasJ&7{i`L$AY9bN+O~E0DP6xbygi7l zj@Rb5T(xN90ne+vGeU!OqBx4skSu2}5Jz4lVMHIZi@__%toD`(GMZYlav)TN^#r_t54q-?hcfK)$%D}S(TFtj)_ zrQv&3?OI;wG4uIa9Iycf`R9RDXO% zLs@$r{nZe*Q%j$JkmFxrr3@Y@gNe$$KAK*XI460wG?%CbT4$|5q>H&=2krf6!bjPQ zxm-?G#Ra}GsBJ6$S#g<}weZ)9;I)l^3oVTn2QtX5UW~_u^@2C>v3*W3Oh?FDfG(Lx zU!6l^r;X=0x+($V$w}HwX}3Efj&EruVfQ&-UiB&*D~>CWL()^W_T5vcUqb5K3>#7I zZ>;_4vlyD|38n+39e`BT2P>uPwCF09^&oiH_>i0$TO zYc&>b(AD;zW^C!V80qL#empv{9BpR@@+*7(qNOM)p3V0pcTBEw<4vGjKd?a|$7a<^ z|3|Nz^pW#vl*J0MqRgf3bfaZpzR^eWy-L=iZ4oqRp9(D_5ZLu~ zJJ->V&%Zj-ecBo(3((G`)GnxNpe~ z*696=TzuS7;Z@oF-WH3YAGbo1F6d@asHg=ysrjzJC+TN_@-?aJMs^5m(XR|Dm-fS)^KH^(fYUNq%4S$WF(DOy1Z6M@Y4l2?>V zW#qA3A%=iTz_ozyxiYW;1YyI4>7<&6GRM@&vKu##{w~>LCE?`~pksra(nja`_2`H7 z?OXaiji0$=2cxa%ilGbMrrQO4Odm#vFkxjp4Fn`bu%1niP@&HIS5wV&gmk>oml7Dt zoze^m!ok4xQUrm0zT$Q^;iC=Z0SjM*V^w|TILzmaTzkFp_%_A6u!2t|i5OjlEak$1 zwkg<@q3Dr^lYH9`i1z$9HkFpATB`XCXQ%+-fk#mRGOJNwl+&^vlEzvJYI@6u$J#!8 zK`J@T&N+>r{PZ^QeJ2@?fB`i)vr~DtrxF?+f3m#PfCkAfvXg#Sdm?dwb|C4Ax3_^E z=%$wsFhx0!_;hj|!>oe=S0@AK@=>FueBYnXd?guaHE|tNKjYgqbArmDA1?J!I1Hl(Hd)p9js5$SN8;f zMB~(x%FYfFQ5?=%>Tm)=R5&!IIKN6Bs3-3;;v7}QCz7=g^tv-rk70xz;HAxK#HvPV z+&Fi#wxb^5PXyRHAN0@|$0~5(=k@)4W`U7Glh5r%1*ry}OUt(nc#L*l=K(r3EXixk zJ2vVX9kAfsxBkTe+BcVLUs@mHny zhN=Xm&bLBrxnJM_4$i^*LSfP(uYQo``_c%3NohJfTi^i?Ayp6=R_3^O3_wK!dcVnvNA-&dNCdOez&2oZPOQ)qs~Y zlG!VWRONuxpID@|Ob5Bw4zohvkl1`;q-RY@+f(4K`4`O? z@Z`cj^c2axc>vQ$5JH~~WdN4^IPuBp?I$JOcLl|)Ul3tXY8s(~cx-rwX!gg_mR`U- z&>yv{DJ#aPk(2OPXJHHYoPxM(n9wx^AZeDr`ne`Tz${Kngu}4kU$ifOK)ET$chFF(JJ9 z@~dn7vZ!&=Z5|+|>g}Jq{yAri%;eF9O45*&?a$?s<53)3vL(;{V)H>NBq!)@>wCPy ze*yX=vZoTy{7*1?amtCcW>yWSy8Fh^4nawBu>u_>tRC}&tQ-l*b+Uq4T+wI%@?{w=$CmPff6Rz71<0E<^mRC`rmn^!kYr}^Ztf&eW}hDDSs=6mf_ zX)HwhE(}2UNtQ>l)x24Bx!0#bGB7u)+XO~*_*M?-0~<&%;KdrIziQt~;uASBXUyaa z{NeS+yl$JRffBQmU)?$^zI^aOc zxyg8Ll;D2X8i=s^QcC4A(h4YfXB+&PG%sw01Rq60W@uJ^(i87uU zsLdFkN$O7Y&|WSbx z@#gErKEKKu#DyzY69=k(=9%fR>km`kk+k=j2L}9s6x_X+uK>u1P(byQze@wnFrU11H)g!|37naAuL2i1 z%m74m%q?dTYSi`#0%)#=zcmjnDB-|JVF!bJpT%4-WHK1hTL$=)LyexT>yd}scF#+;q&TG>8m4*Kk-~j zmm*DF^)+$yq^~=2%fdGUWNPTJg2|W_73GI24b^|uoawc$MdE`6BzuASG(}$?upmJK3j~@xyw3rNfrb zMF)FGJx_I{LQ=M7pXb@r%vR0(%WmEGb%lw)&iL=|F616uJ3i6H9YqRx z*%?UR9j6QPFHCKnf7Nkzk*Gb{UL%ryb2P654{&y?UPnvQ{fk8?M(ZbH@&>MnH@wf) zcge{?i7`cLyPzbvX`+i>AQ_nS(OIj2PUO>IH2(DfZnxUfJ>t?&30;%4D^`hy^-R!k zXt|uoV}M9o0!Wp2jsPzT+ey}m{YFJ>8Xd<+VUVMizy_KN-^mnF|2T`FwSN%U+>JxBjBKVlFW4w*Z@r-#aY48`)XX^uE<4 zzFm>jf^W{cdi|eqN9hr7go|EK!=@CaG5ny=A0QMAOB?Kmvii2U7bo_gHd6U+j)?q^}f*D+iu2y z->boI-fcbfp$SdO4%^k|W_^v8$|T?nG0X>CckgHGXp))GeBB)HN|3{PZ26Ua;b#@@ z*b*n6AevMah=%o*SY1zvpuaKsHtY@kD_!N+gU;`8?DE;2*@0nr8fh49AGUM~u@pd9 zk5R;nMDd^e9wohrWiZc|deePTTvpyzp4ZkxymI7&C^NcSE#KWb*^4_0bh9NCNlsS& zGcY{9&C=P+c<=pOx%z17>H?y@{_2kL+F`I6%bu3O^_uS){)p=b+y$Q)FTW06mQF77 z+J+9~o%GfrZsxO^=88YBt0>Gj6SH-7vmMf4%t0327d4Ff@#!3<|V9 zf0ZZB1ho{in5_sw@o>j`9^YjYDsus*`(F~WPjM~HEuvmk=|ThzgUTxJ2p zrUjkJ;8}tQ3QF*1UYfObk(1IT4EmGlt%5DGQ7P0%$qm*tp1R zU2}`>yHw&-`tr5g?JZ=-ZnxV*g=Af*#E#OyxQ-}@0*`=r1C0qy5xz$nGEuWai6Lnk ziWz)=RBlwgs{ANS6t5xd%Cr3DYpr6Z`|qgl=oy5W=#suP+J2e*7LvW%IUgtd@c1Tk zrBm*CX|uGvEwS2uB5|Zpf2T}as}jaAmeA~Fbd*cgUh2YhVF?dzp>~m=55#dEceYY% zg6oLwgcyxi*0|4M#5RGKv%gfoy1hEM-@hcoxVFGUlElfGJ%bquKs}$cYIquV`JaK~VYS-LwIQq<8o$@b8q}m4Ct|wF%#mTlr*XuB1C& zt(_Cqa8kX8bo&u5wjlQ0&yR=({Uk3j60?)xo~}pk*K=3_Da0^ny|Pg*^|N#{3p|!u zov~ka8L2Bt!{QgMw;L&ljifXGM7i?Ay_DZ(jzZnPf03uqvCbuweGObZ@Rjz^SG}{B z5*n&)@!TXIDc<fq1mxSi3^_VljcqQ;dY_C`>SPb)yBgNZ?G1-%fmQ(8#^q1TV8@M!DPd&?MKG-Vm%HNL+}X{2S-inBK_lKbQ;BKc-%O@rY+oI@g-_yXlm`@g1{K<4BP0R3*MtUZ_y}zej z0txFemxvMi@KW=3^O1Lbz4fOZFf44S9v)qBoE&IL8< zfZ&;=7t03}lTTJ6Xj~+9Q`7uZPZCVBeA(-4tGnyl;zwtbs-q=!(qAj^*9TV0jQs&E z_uG_s&C3#&^!H!jW+P5qwzJNsJe7f^N|cMPr5MmSR-LCMDAL&sYz?q<`ivQq$!W4Y!x!R|lV8@Ih34xfbg)!Wl%kqu!3|=#@J+s3IWr)9GE_mP990e9p zJCFR4!ijErElefyAN&ptmcvzNpIuuNfK}Mw)9JzP+A$B$Ur*IA!J{(lJYJ}CAQ{5; zdAZ>AkMja<$P&mk0}V-!_#ElUsr#h%u^Y4tWfkjE!^1<>`QThHoN_kduh2snRMV}+M#K;qftBf!0vbPI z`eZ~3p}?3peC2eYT!G$JudC-wh8TA31$EH7|N6A>G7}Ff+0o|fPia-U{eF2n-euNk zNt>}=mO-%b68ls+l#oGPbtwnO;IKv2n5W$=uBX}kw>~zW=A+p`Ydq-D+sg>w{ zJ^_uYiQcuJs0eAJuqn&S%CtArnlP$oDle+dVcb8@nwgg?#aeZBJ`&u?WK zuf@g)mbs}XHBrrl_h(n;q~|Fk_6?Nlv#jWs!1vhDGUk19&JZU5eWPCj7&RRIGztn; zo}ql-bE_yO2u~bLKc(69-Za0^?dmm!g@qe_MJs#SD5&Wheiesi@S|=f1#Cr7|B2*3 z7)PZBCMObV>6)FE_SU7s@`8p>lV_O>5x}43()MHeOZK#qbzHFiZZd6Y&B&YlAR!4z z`Zqx=WtzcBAv?~yCz7Fdg!|hZME%SP2B$OX>dBq&>0nUkJMFFd*EG(rto4jhIq{>D z9c6Ega5r{dOVqM4h~=u4ZTebXt6o4lhZ&3X=)u7;8scPQ=bYXE(FUJ zLO&jS^w3VJZC7!S8r>OkNXl=EG5Glwn?uq4OIV)*Y>=~(iAmASrc*Y>T!xpSQj9|O ztiuE*d`53Q1{xO?u!>Ihuhhi2j?;*$rlq6nP`t;f_SJsd8W)BA50)RHWB9S)iui2J zS1a9K6?*RUYuHB~qZ~a%synK^=J)*G6dK-vy<%PeI+ZH}EX-Iq_7!zL{l6Lk$f-^F zCPKGw3NZclMG<-noh_S$E%+0uU))nCI;S1HJgwT2-zLR2kQv1k>YYQTns43 zI14Ux%Au9<@$ERL$+ZJm?irt`Vx`n7{!;*t$PfhFa7hjAZ4D`Z-)8DvwE*p*!xXTm zC?BV?OgWy&&XnZ%kIcHVZ?#XKr@OvA`eeJ0SgZkQ?JoCwFJEjLt~#)Ij4cS(8a8SBEuZHL}qnT!m7Eh>J&*NZYIYPF)VjB}9_hc*coI{WN)2iVDG+I;gdbAfMTy4k+MzS8 zr(fWM=ovN*W6yW9BLW>M5G_ejmKve#_Th_|>q+&;Mcb9Gy2~!OBCebNS!*A2!jH^g zVG8h`N6U2LE!%yK9R}?Z6OilBT>)$gwf^n%!k3%#oLC2FK=4tV~|M$(^ZDU zsyQ!}ti>!%BFRZXwfIb1)=b0buSg#cMZt{)-$s&7s|nOR!bWojkvt=t{_!V-8hLpc87x!8S#??rR^gH?E%&XJL;Jf<1?$Qnw4HzkxF_Lco{b_l=3xtcDGSiI{P6koHW+Fqd z@W45m3dN5O?+1GhtB?qKQ%;PwBDvn4P%=MsK|4L&S2Em6bf z4z9Tn3*FWZ4a%i;p>gqbqo6Sj67jh<1=$@!*UIr+QZu;zwNFO{X8Xv`|Dv~wCDc0n zS~GMNEpIH+BYXA87)+mys}JLXqx8Eu z;kk+6+{+|)#6fm85u>-acay^;8R8BEm#Ok_%++57^u}In`Ku5@#bYau=Z2W+OPJx~ z8eoX?(qJ(@@#nK3TP#ad=J5f z8o8upEdV)E4(rMozqK8F2V4u~J0!RaUO@!(AXGY*__LDb5Y7|?m_)+(!H;V$Dp1&g z;ELpdA5O?(1LLC6w&@D>@tVN7v9Ou4Y{d#@&>j8s+>|G3P(!BwR~M%X(IQ9D_E3)4 zX))j6KM7b6vC@^vUyIO6vcX8*}gj}$_Sz@)fHpxW%1m-g(~ zFKo0ma=h_3(G>dPztbAa+?cA-{d#!V3&CRGX2YYjFQ{;rV?$3~yM$``P^b3QE}*)TQVpY*R?tbDsnV}E5(=NPKNTcMUX$f8&& z`kYgHe=l5QEji@qZt&C1DsHH2dcR&exSGGv`oLPRteS@Qts|8(xUA^NmQ(mnUFKfY zwV|wgzE}V1+F+DpZ?&UELS|Xq)tQ1{)~+PYwMs6Vy5o79guY=CSAo8ZeN0oG>(lBt z^TFrYzqre`Is~U(EL_GSEX8sf+VQnx6ci4@}f*C zjk1%^&xX`r9lVIrhlwSo30~wD2)x9FLIYs35)dnIPc93pmh%$mbj$JLuvm3!|BI%v zD3Q(O;1Q}nF2Ls!?4t1OsZGLUVn=VPf3Q@fTDhfk_M_5{jHT$ zFh?1`ar3s0pV%5X$IgM;akJRI;J8VDmJV&5<>m3Tzkv)dO^0RAI*<)6L=tn2kHj*; zMZO`2jOKojH^PMq#CV0H6e-2@fN!5TpJkn$%F1DXH>Y{len}{5h?^(+>y0Eun}d># z++_Jo$^ad3>Crv=9n}^_HDxD_md6a!>b}Qb@RJ)KX!(b!?kC!~OQ1X4bj%w^CZ2&h zC*mKs6^7Lrmqn$6AwA0EHbI#RvIOSb^g0>!e$TxOg}20!qTyho*jGb8x})B4nnlg|;Jv_@9M@zkZ@-a*IrSTmG6U zgr6Wgu^#UUXNjU&T5;n)Wszjf4tE^3ZwYFXO8CYAgivdW&dM!+i=X7l?KszDbGghE z%9r$99QpG{XE=D?O~(v$kX}N$*+`pXj{@%#cyC-3z7clA+(&|7T^KEj^HzRu>6^Oo zsXxc@x4koUBCVi@#-ePs-(89@e-)4^6qFvNza0gXDKp1m1uBd56H@o3&`UE76F*Jc@#AXag@=Q;}w2TGRqK(4ZgSkd=2o2h6= z$!Jz_d92MV^g|IQO63z}^epptx!s^PI?zgZh3NtRHJOAyY>i3QS5P`<@O_rNGQO;2 z{ilWgM6evKvy{F)4w6-9bfqgj^c@>q?ag}Mtu=6vw+TZsn`b7ide&>6~m^nD;H{vD)ms?jNHxEv3>jkCTked8n8ioIDkz zK%jny-w?M!^F1FfQii)`ktm(%`ABFi=V?$xwOjv?S=fCSIf4lhz;)3yH`3t#2Hwhxdc7JaqqOwPPe2)Q7Mk?YeGp26of`HZPVZqMbeW`Ug)S(|=d6OKhmY2W_^?+5&KJz?M2l z#z+Y!mOy9b?lIO}DPVp=h-yVzPSEMmOx%AD!O z?W7D2`yNwRtl&o7c5uQ2F-D7`xabVod((G2Cw|7ZdQ$pmpdCRS9o1mmc5KL-#0p6X zI(J+o&-HjiWOxR3C}C#8Z3)A%Q&-y4%lgwww$QF3atz7nma9jNOmI8dN)iNmS2LUNo)2!r z73^0VZZxVSmA{XV{yhA6m$vfJ42E__<=p;a&Y`$tNiqkW*@0Sv58YzrV?yIoSd!ccbAwaZc< zy&S}TzelRZEtUkqy*nDg?&G&2R;2(NFTDZg?o~k_@66NS>D*n|0D=`iRO9@!%u0L& zX`vot6mY}m$VX?>L7mPLg+;cfG~3qf5;Ss*FQ?Bkhej9Z41)T4O`_X?B+nVtFvVvCq2r**fgdFiwG(*og=@1mi*-{yf+ox%y|QUI3zXIJEBNNpX89&%pQsHG*(# zvbn4F&G8t3OQvdM)T4tvidE4GpwCxcMS#sx~J0p?bM5HOMWs$ z^2{g4cp)^8WYhj=T;%xw2_F|UNAlrqs?64@=XkY3nJGLsBcq!B5 zXb%~8W&i;U2TU4r@0~0g`CK2*h-WFpbwpm6Gw%-*fIc<+{LPe1$XvrFH#afyJjTVq zMr0G8!IH&Q1@B1x?^hNf6u#~&maM&aaLWSiO*<){@!5&1;xMbdD;aiiNL-@d{hZI7R!!+;_{ z2nfFRMQ?P$WDTc!I35EbX;Qz<&to=&MTn0`oru-)*Jj2yDi_}R#;>5)=|8C9J6qf} zZjrKQntELN)>sU-+|ZTgRh35x>r_5SxM-F4BO*ei=sO;IYR!BJTw3FU=@f7Lu*S*u z0m!g^e46ydlo#B5v!Nn8=?5}(dgQ;j>mQB=oeH1gIW-*+$h8us)*N~|rtm-0YV;`e zYF&?p5<79j>sQ~4axy-B>fm$wGNen=QEUHh`%We#=lS-D32nRmf2_R|V`B)J=gL}qqo^W z<<2Ojt%4RGAI%&F#3|x^Bj!gen2d_nP{+=}PwL^>12l-sfTiB#x&gr=8RO8%r~-IW zU2)bF&#oo*|;SQ>Fp#D+_IWQ=X2vt+k!WWGvl%YD}=kKQQ07 z&Si^e@Yd!9JopF3kLPm%%_-j>bOfwUtG8TunqM;#|7-IUnklU(pi-+;!$KvS>+3ik z!FgdvH#S6z_U(yUkN1~HaMM5DsixKWC`GcDs{2VlznwQ;efr3Y*)YeO$K(d~k1qSp zHVdLArCsU@aeWYXuo_ujXZ@B+-N<}%Gib^L(;8jUkTMII%Q!04c(;n}hHo}Hyb=*f zwRaUoPl0ASF6>Y#h()t}Ga%ts%K^iai_XB@-sRGGt;LB2e+HmIRW>`|E|APM=y$cm zhM>%p@17)=LG72p6UW?DzVPn;nwuC?pF@ka`R@DBxtKQoqwg24i!{Or>8k{iq{Qm# zGbyY3hafUW%>TK3VI}Zn$LM=@HBIH{=3S?XOaQ;lR&VQht6VgkZu&6@j>@G7aY)nB z(1KAxFysAAoFBrJfqHHx+6#@~zwiV?imxXl2liZuboxrd-M;vg3ck4zocP~lc4pLV z{$sq>vwz+Af4l<0|Cxb?Y9Q#a$Ovrk|DUU8s2AveXZ(Xm5#oQH{(ro}29y4s@t=;$ z&irpJ{=K@(2DSOtx9r$);{NTo#Ka+(@Ku*jDl>&~iw=hp23O==r&nVI0h_j1%dHzh z$+A{Ey=bylN3OSJ3ovY+PVK?=F?F2@9={o-Q!U=E}T%u-p#*elX4{?1x(AJuO)vy?s_gOF96azFA zcA%zOXcFDxSv0W^%h#roGKG_T{R6p@Ycmst^-ks0&ftsUwcXvxiKU(~(~jj|j+3vw zgB)K<1UmRUp1gZOzvH{3UhI|`EVGglsaZ8)BIl}sFc6!O+ensLeS9u+ZJ<^~25Rfa zJUwj6N!~nxw#}`+%?L`wYVec#-5{_Ywn9xoX`z3tV!AF(#^?k7&{`^Q^gQn=GXfu7@t+94JW}`MT7~?Rl#obl)@R0Xd zj!7OC$yVq`8@^%2b~N7ud#^c$lddWvXe6r=KATIR)U4Zm!}r1;qOC3ucVbs*eCWt5 z$sYuWo2_!wgz$5`s38Y2*j-{752ztXZ2%xb?+?zkr6y#~PfA@2ra%dz(II#v&4&w) z8RgXu_xI6}ZJ*6=nQ8)b+q}tO1xYMztBDE4j&*|>tlCC~7a3h%z_vHF=0qLwUnDcD zwS>mWDKqNSh`{X^o`zF<3E#7`2|K-wWvaYKRjEO=?PpK~K=3 zYc(=*ew1)|7K5S-DbB7UJD+v{J@znI5XMcj$s1B+&4>6D>&PxoN}S!WboZT}{PL;< zc%YH?=zjC6uKt;aD;k4IVtIe}q1T;l@N0(<6i-YH)qWE8W*}2NQbP#)G*2 z5b$IOzxA%r&oWCEILwR6m52^ZNNM#%Yx z1Drme%`gne9^N`^?8VmcvN-^;R*`G*nG(0}_($`yKk#6w8XImcWFz+>T{Rs9^{Mrc z8%nu$GSAs_n3sez4?kM%j5b z{h|Xu#&9HlZDjl|gn7pUzwZ-sjfxK7;bBm&-9!gTryc9Jw{lJR7T5){0(GGAx5%81 zX}(!X*Neai4U(he70&h^cN}fj$?>%V^Ii$^HODNssrp-cgZWLZuS<=Y0LK|u(hEMB z?S5J9uA4#*Z$7|lz&7>y_PpDVpBAR}T$dKzQju_ybKv`g^ z{IpdM(~sBXRh}28j$L;%ZAUM+TbkCMo#kzM0Lp_uwXE z?g`a9%n&_11a3^oy(qAf9dj)z%}8<)8__N5RbE0<3u^0GDh0J!PM>>DPlNiFfw*RA&1>HV56-0cr-#h7Zv>QLLZ|P43-(F5cBA4mD}YV_C=>-)kfOp9iw+I= zqkn&voGL8LRy5{hYY)0!kNBcJ==QzO0=PmGX-rAroGc9tw2)D0ZO9Ip%Rk@SjVg=k z1YLJ^JeR*+ActRbpR!Fz*c)bY2;b|-u@Qvsqv%<^yZv#)EmK{q`Nu=FGYTe$^WI_5 zyWY&yp7k#1ujcu?Vz)_;JrV(YCduVDp8!CKL4FIlEG;{vlD1#(OUKPucu7%2XS>Y< zww`FFj5Rao#$6#nPXs+%qX&eSaUg-(WtEZ4f~6;f2%;p93Wa=?AHcwsj@Z|(;5h1@ zz{xUS6);ijd}!0)=%9uWEGd1F76b3PXiTDMYm?>(-YJG&`CShVcrK}Z?f4WE7DWt~ zuxxO-e_wV!mPnSph1$jRPuOsE^0|tZf~jn_bkcd|gb?N=`;Nce!K$kaIZWj9tnYR9 zs}7ml-jti!vc>a6^BcYu-o$Khypy0F#f3aH@Vu8nGu=yJ)DVCrS=q@^K0!(TGUCe{ ziC(wRF#$e*qR6eTMV-^CCPd&>1>L_ua2?s?DYBi`a?E|BVwrX$z{)kcyREUX=wy|G zktRTXlx&P9^25&RfNC-PGFDV8hTsPgY6I@jOFhR$iK7thp?Ydhbx(HGAA;!4DKY+& zX>J&Y%@2lGVj$Dg8>d*WiAah0Wfs^OsfYKM4UpuHw0{j)-X06-rvLDhzU|^8>~1rh z69VAO4w8LwXb-q9M`_mEl#Z5~9Ncv@wbj+NoiF-h#A-0J^scKEoYbg`VfnIn#$6-Z zNm?auj_ecKr&p6n;n$ysl8!&)Pj2EtI$tBBRWIC*T`(GCsh(P1IKQwv3jiMIM2dWt z0{Qh;9FoJy2UtkcLz?;}k`zPeJhB!PA`mDILhm=;S^E3lHkSZTVT@?o47 zuDp9~Iy={YfZnir+;{1gV?ww^0J)2m;b!HAsobYs?Bt+Ee=?1*W`R*|ZSjllUV%&* zxjRF&m)0i-=1aa|WYfbt>F?%<82PLaZOcBa^$%_{gGbQ01vwwOIoW|V>8h1W%D_7X z{T~-Sd&Xq-uyiZ}0M@G7wJ!&nUqS9EMFT^d(A$N;$Zxx5TaF_=AvZXcE^=3=4}ye5 zUsf}S?}jphJG^?Xxf?TLEeIgxAN9>R5&I~Vy*Ulyu?>lSF$!c#5Gdw+H_tw;e2$!@Vh~zrN3~H@@qL`V4ysM zmX1vHkZ+>|Rl>KavckMxK;vB@1fzxMa2KM0U zL&NKAgrrYZdGSZg)l&{)LR<0%FVkP%AU}0xj`8tarTfA_k*>ycGu|YRUVOwwS#IM% zNo#jc&`#8e^oArwKMy4M@rzdhZP(gO?|aQN9svloCBu7p%W?wAna)gfNt>jy4aX^U1UC4hAsUeU5=CQ=S+_V{2NJ6`huVf0m%h(4Ue=k6QTwV7*DcW4GipU zybfzQchld0oZE6_1pEY)xw;zUo@U9Zg4Z+0LsKedFu%thWIcPU%uaU`l+emG%3>mf zcAb3oHUEd8tG&_|R@{aJg%U3$86FBQsrv0;#^3D-_z6R}_?zld*2!(`Y}4Z-+=M@% z-LSw6_&Bog+-xk2Z1I2=EFNpMM;X>2-DYZdb0wB#CXn7y=v-xc73oVKl~2)-4wpYg zqX4+aUyjH5Bu^qwCoqtH=W6etaRIZJCntR2ndkLJ;PCwE^@V2Eqe=T8Z?GDQ&PvZD zpRF3S#wi_>F5P~{0MK#HEnr`D^s>MgQ6KK>7otO5<$}2o<2Q?*xGI{iOUsUdF*v^2 zXZS{7+HV}nO4{vzr?yE88v+61kH?74Jx+WFQ9|~3lzQ@Nm`G*0^1?kEPLq;c88knx z`f7Ii&MJbD^e0aBm2DH`@W`T>r{~CR*Ksc%Z`QnIb(~`+o`1gu0DJ`|T-j{<{Lsc~ zIMrK?mLr8T++{&El~_|+kYWUbDw=c+dx2kx^$AG%63+d~@LhCcabG(TA2m0XdXvke1X#3oQiJOH4^9<-ziIkn41Z8i^{j1KsVY5{H0vpYhLV!<^;09Tlia{F3cF~PnYH#fls3(RB9H(iIj=0| zWHJhNlY=$Z%_KQ8wVg7KRnG0C`MvEhJjI5f#DxD(TUQ=WRTs6-b#cw}kU0v;RJrEq znq?M}IYV4CxtWJcG7ph?yp$wE3CWyDlHo|moP;Y=xXAn+@B4ng@1O54e&?LK_u6Z( zwa#A8+51@%yZEl~R7a?c4jFoF20Li&ea*t>=g#fZ+;HW<-(PO)PklKxJfN-NSyOHu z{qM0fEccrlX>_4-F9$VL1qZx{Yh(f+8FCUs3dO0Qptu|t!1nL|tQp_Gei(wP=nx~x z(7FP+peN@Ad)SEyw=c(1^+%BYdjq-;U4tqDK|;`-*SR}?`u{FMBY`SSVX>qzs5=zu zAr|@>@c&&r?;Wb+b1u<81Nx_}|M%j*9bg%#@Hk~UvSY5Jge~(WT88t!=Pu$No{lvi zPCA~sY=%eVHSYr{`iPI7D% zv;?n`%IO`~UdWbxqIg5BGyg9lM`U8;$j47XKtO3C;&u6c!HB9A-Zf;>M8NN>wuD$l&XI^>{i`YLRSKV5`Ox$2CSC?hZ&a? z!!0I+nOOn@yK%>Z;kx91et=#8X1@I}IiM=4Y(9;iV!kR0j$%-p&z|L6# zDBD$6ufLA$GU;jjLI{j%iy{_xt9M5Cj?Eoc^CTjZ14v6R&cgP4c5x z7yS6GiR?bMeH%ucaWo=WCkJTCFqR@7%j6F zRm5KfIRgX4u{PW9bo!n=04@yr0O+eF)w3`9#lNeoH_XL}Xth}d%}Bt}js1tWb`NEB z!Gtx4=A*Xw;3O~Zg%V2%eZ4FS0mDch$(n!(oW!8h{PE7kZ~?xTJSwy|5S~OJj}J`= z^>$0&6-9*T7anLxFJHrz8Rx{ALkm2?L!Dh%kQ<$9n3f-nyW2v_%vtIBHU_fYO2?Eo{XpAy{g+ zk$C3IDi5}%$od{B?(;SYn&e!_IfnWV3`htN+9RoF7+y6f-kb_MOgS9mVN3feT{Ln- zYeN9mJc@w8tl!?`lb>9pA!y8-4tFG&?9)1W+y;H&twZMy z{Cw{Wr?NXECua`Sah6n9Bu*4Mjnttru(_;7f#UE-UGT@z;Ti^EXbz&uF79*j#^cst z;63H^P`@+O`X75-Nuz81D9 zF-q`si*q7`S&rMz;POvNGW_?S4*fk?FP0B@8&xDLaXm(pbKFZamZkJsFbFSub`t}_WZT?8R(t6(CKUap-J)ct;w zkOc&Pu6S$Of-Pd!YRGT<*)NAG_u5MkM7Y#PK4#-T$oRrF*;doe$Tyf~!;4BKLi3dd z6BDjr#o!=m_}f|>W8~UMz4wEiv0(zPlNZO-aYdU zkuLk$bnwe-Ycve7xsIwMht#7e@C9hbpg0aE-bSTVTH2&kHnKlk;6Gt552yNt|73D6 zXqE_7>7U|S30{ZZcDLG}kcl$`m`y@djw{43JUHd~dmVFsGPqf-fKvC?od@Tpq7Ho} zS%={j!rxZnvdzsy%$mirx22DnuHnlW%!}b)zT5_ahgYmIO%76|g!xdck_Q>S$iBgV zSB|IUSrm45QODxs&7o9U!NKEag+TKyY&Z{uN{$NS<`7^RY*M+XaZQ4JW?Z>7_;TJ( z$h8+kMpxI1`XX8w*+v-R)3b0|M3KcEpNEGc-)ocGC7V?S*4|11lz6!eGJcZI(Ha z+_SHC7c1C?{a#$e@dy_0s&kMB38`NWYOMa>F8l#PmMYeO)|c}z8!zL#y=BiEL+f=F zmn|{SYE6NQpd=2L*asPNSJ>C!v*N2-aeh;>LtazKc2hG1yxWlV*D7vB|F50 z>2XM8lSh4G$^M48#mKb>$5b^n9dz9SM1#cRte~3Ln{@K&0TC|I@PFXpw{TpYAg-}3 zZ2xe#rE%)Mfr>I~SH*C0h@!)L0OUw7gldxSYg!0{wMk`5C6SRONsm@?xL}Iaw8(5? z^vb(HXHxKM6ph!-vuEc>Is`b+hN4`c{oq@2qdc1FD{3$`-v}(d;0)pm0 z4BxS12U%aO56`7M7#hS3maDIH1Ra0xUOR1PC&mPC%i0RyOyrem+dxujTdE0&-^E~b z2wny|tO@Vj{0VC_nLe>;83#$A&v)m@xjZ0OUOY}FcaUcIack5?<57;k3{8AFPhu`P z?`ak(!QgsXN1JSI^i(rj%F|qco5c``;t3B2=ifEz zju6;UJW3-Q_{8`f-rd=Z3q>2NElTBzN@p_Ffn=AiL)_X znSSJ!tOUyPozdfC;qo1g-<_7S@je@IV_ z1CZEroZnL%)iFR!n38sf&G37b6=&0hNTT)&#x|(pOjZHKa&JVK9hEHSI#-K7I>3v7 zQU7vkV0R+9ziSxY)@*?_kkO-@yvxzTpY5)_Tjy`cOaS}L%-rDMiU6N0f2_+l1gEex zDK<;9VV#lHO9z;=#qMdfgr(i>}Se5f7cK9o?!h&U9sFga?1_!I|j?xa0~Av8|`~Hf+E*B*BK8neoCm~%|ova z^FE{Pw1b_O1t!v(*sRNEFG}5xTK~pfnv%lqVG#P?*5`MN;;I&QuH2Dw`^H%Ut0%#R z7mmuI0^$=_Z{wcaXcsi7f)n-+Lr$x!^*?nlKMCHK7=Nv+EBSlJI#pRZNKus%R=5?! zm|L2fPg?IMipyRj!=Hv`Z-<*k8p>P?C3GC}C^0OzaZdQdFxqBYT;_IjAtbA-ely0( zGTpjL^cJR#zq=op4(UZqb*<#W*!!hZ#9DMZYzxVZkS39OTu3r`0M{HR?G# zmp|mJ1ERZzQp+B1I&Kti7Ej_oeYnnB^G@b96zDtSWR(O-xY&MWCdY|bMC@(7dTb5~ zjNxFI13`MP&r0z=Gh&>%M<~OUBNQt+UU9OuUc=(ueUHyq;)Vr+pS$49_ojMhd&Hc( zJlCX3Rwrd+es0uBrMQOxlTQy16h~&rHSatWD1F1xJ@kmg<~W!HE5-vpdRyzKaHbrx zd^GZ_sb}lxqnO)|(XqCRwUHBS#EQ=^#_Q6!J&$3#J}=^idH48&G;{h2Dy{II>Tz1Z zU)3(K`{T3pU`w(Xp2bhN!YpK@Nah{Yx<5o;IW68q{F+uSDi5PrAGwvlw0F|JaDR_Q0CRl#L-#{d zmhH`pnfk`QVe(Z&2XIinZr()&{7$$?X4zrMb)&q9t<_x%`Z{m{4!{Ud@=$id-?&n&D8Cf(>=h(=Js1h zEq~%h=S4{vh9*xe{nlnW)8%dyE*n|Xk6+(x%@?9m7Dh-!Q>bjF+IM~0Nw*OiSODPHRm}w829ct z*n916H1`PDIC@*Hu^mVE^ZUAyFS8X)D6uMG@ z6;Whmhfl^~piw)333_`hq6fP2SzRp*U+>|07b8j+g}W?AiyiDH4&w&ehJnH#U1`=m z!=ss^lIC?j-7mx{#QQ%gro{p?xAHD$+I+Eu1(RIQ-WZdQB?kH0O7MT^dh4MNml+gT`b;+=Y(O7+A(I@ zp7ftg=eA}+1kq?OxAY%XK^P>tc*=7=0GVM2*yP&~mv}|hNQPWkUyu&R9r=&rcdn(K zd2O&h{-nO}-I5nAyvq0vUrHskOU%@k+LTdeON&Y9+j59LyUd28*!`7bs*$HNKR91@AJ3 zm}q=wet5Q!3Vv)|xI_~+D=g^Jqc)N>@iJyH!v4n%fBXN$sQ@OEa68Gxe%T#Cm--iS z**g=zG7wbh0royatgRLmuerr<^)%WfQuL{w9Oo8U{rcV~KDV;kz_=H_){;rg?nC*o z`L*GX%7}&%6_ws9Ef=4?6g)>zg@D2IQ5K=E$}E4sLIzQim%D*e5H)TlFyj335>!Y3^yoe+WRg zM>u8ex0(R!_f6_c?Xl8-J#GTQzA^B|fS6T&VV2`#H(&6RGDLLJI<73+)6VR_vUoJo zrSA0|$4drKV@Xlv#CTI;8*GRVBOuoXfJU}Ngw2PHx5UGTNOAjqwlSQw={jy)P4aFzgzKb6efT5q#68Jg}E3TM6if12f-O!Hh z9X?2)Wq9lDjztrFVJ3z_lMUcAfI@|IFvbe9IT%iY6hDz;q7HrfQ9-u8+!8Pjd?jMh zMo}P(r_p`2IC7kr5~oVdvvUhZh}w23GA{5S1&vEp%<_x`&`REfGLH-6Ewgm`a<6Sw z=pZFhV-3i`n@Qj`WjKx(Ag}|6iGPKz*g3(#A=$uJZUnlOthU?Byp70(53R+0Ex~JWW0kve@IL zg=>nPxkFBNA@lRK;b0L{I$}uwaGV4T-3h)W663(Looi%H0+mR`UYR}}6kp`}vFmCG zDPo4+B0`7BSW$%w=cx3}xb)~b5EjdT>Axl}Z^S$GJoM68j{}K{6(cSr7=RSKPXR*8 zAVPW5pp+NDV0qh_sj-NqE0pwM9ss@>33#S*)U@csnsaIQdLDcx1Czoyjjd;-V@4^W z-twV31cD3w!4@7}-Cf?x-}ZE-YID$a-qn;X5l`({iLHQv;ig z42|#7gB&>0#+=%hm1ZC^*qI*{q5DhcIQSB3hsV!e?0rOPEqN5qlLQ=7N;rsQlhh~h zmDtDQ`vlVe;L)t-QztYrjsX4tX*zF!L4V_`aEg5{ri)dAudeA1oxK}&j7CXTl}Rjn zupc&h?KJ}~_2WY_b0R_{Vo-KDu`6R;`!1XW{&fpo&QJSbK; zt|XKgZBTBoeB3&6lOV%^^QVNa_5#EpA9z9(OnbBUI_+UoVl#-7GQT ztCf()j{=9B#zrZx^%>U9&82Ar4LFt;&71ar^DA%rpg<`SJW0EQYtsS@{EmQuR%&l| zVfEAi_2MN|aVlbQ^d21S7cwBphzw~toVi+2II6)!_x$I5+VTkmL*QeS2d0^2gWg@+@L!>P zsABvTLkjSbWaj6hYRXsU?3F2%qUMaT7Va-4TlJHS#A?=FLrIdxx}^NM+jZ2g$!`4s zP-;OWpuFWLW~J1|ja~{|YU1ii(Tc30kyH9qg(vr~ymt*E%}#l;64<>X*FejnLB-3B z)nsWQ2NQ*4`fh+|0e4$bLW1gTdGVBO?lra_#|lBSGU7*>`&3Ds?1Vox6jitB>J?$Z z#tL%c7gV$5yT4u!ALfSRZ@25b%eJi|#+RnOAiJKzX?uOX1lv0+QF-sF%hBZDI+>sj z<8}wnPTa1}d;R%Fb2j;|@v5zn`)Mz!NQJ+bCZ<|XKBe`@cr<(Wb!=_Z52mx4yVt&p z7w?DJ&o@?olo2C|y)$ZrB!bMei?~e_4u#Y{aje0@Spf@fqO;^3{Zs|Xmy~zAEDdux zFoJ1^)VH#|D#vg$>glh5Wwb!LPOQ1?t09iioNMBhg>ffwW%vIZ$DP)c-o$=$cFt~dv&)d_;H`v+y!zTwSwf4h$I@(iuUD-=%l zDo(z?Ejvef;8mqs{2*6)X6!aHFD<72Ci~`M<`v*j5k`o;$Mb!Q_T9?W!AJzMF2ZP! z7g}Oy0s{%&q~A{IxRTlqjz2@6m`bIX{jkp7zqs+k3sDAJis{o5%bTlE5fe6FA*}PG zllxVT^Xfla9hNBwH{Wni$2UOEEQl&jH~#$Tmm_JvmF8zOYAyQKfA^=P_J&Pa00s}}CE6MF_+?!tVNm}78q zx?=X~EgSoe)2^bnhMO&%>&s%JJnvPZFh_~AbI%jV8~gHE%ixQGGEpq;=R?l4)eOKj z@;wpmpeq!mV6#b`Mvv1#f4pZbqfc-TZKhFvbZ_v`d2qZSM|Mv$dgVZ-c&X{9!`XEK zlZfcpkNKho;0OiIOl$sZqUEgk`Jf`rkMd`RMfp=siJi~%*hw`ii7Z9nj+6_Du3RQ` zn52u2*}@-C<;)+w;q!d6mGSHaR+j~|opXBDX@0j^mo&NQX|f zC@dEgUG*%}aa}n&=?We!DHr{wW_R=_sK`aH|8R!^_dpSR9vf}#%z-%RE*^sEJ1dm1 zw8L?8QaHOD^PD7-cL1X~D5tDTqB%mbLkY0Q!%?Ye<~JC)a8FYJ=(OQyN<94y!zG(1 zpqP8cz*|3)LebOQL+LByR}l5Crd+0j(He#PTheVKkhxBbNl&jTD#ygbJT6FBclJcD5=twK|4@52d%j4GYMdPuZWol~tr)}MW#ay~dozK`=Qq(6p z&`d}m1DCBuk@P&{Dl{($R4V=Uc1aHW@M{cp%a%J#C7m5)e|CwAPvr5*>QTx)&2I_$ zMEs7|DL;+8XBS>j!TPTifeBOWIFm)LlfVRqg7r^)rUrWgA;sL@svA`h)gB*q55llaw0M6ACB`ty>KlMG}G65lCSb zd7~&>n(ORbyp$k-WKct;Uh#WkFz)WoV32s}6j}(YJpKzOWQ@^VKjPx$aDvV8g_lK( z1mlhxcte_06hW?NJzM)4w}d{Mg<)*POZ z^fJ-aj=o`8R<(WUXw-ovMOlgWsRL$i;3CR!E6Z8-qY5^>Mp9AP`5~$BVqN7yjmfMW z12>p_Oqm(JF;BV?WK4Eu0YesdJfzm+WHcQ1JD9Wwf`tH^dt&t}VEm?wRmt&fBCt0d zekjJ<)wST*)fFj4hz7*~W!}?DkEbi-K|hv~iX4o@0!5ZSQzFoFL3^!T4wkK&sy!BwAxAHW z@Z1eezYqtH{!~2Q2`km1Mt!;fT7#7yn*F4Oy|sPew#+?4&_tM^cBby4gd5Kt%NK!{ zZCLwqKl>He9VM0ChiMJU0~Nyb+^rhDYlRIh0uRmkGD=Q-?wyoGlJij>`rmz2-a&U` z()!pn(GFw#I_ZVz-o@a(U+kNO$bnL@%L1TYCN z-!jJw3|L9u8M7OQHy=jc56lsL{YLx`&TzD+q4)sz{y4U8<1&x+1yZo?x18ztUoNS* z!dwmt9RD!Gr!ho_^vh|#DA7Y|lsGxAvR{bi>F^!fyB|Y2<6~UhBl}&RUV7A)2>hSr zH;yhMg1(nVyR$u;Q1ETH8!^9%&GNbiH&kj+pv~*qAUJA%N3^jV`4w}6St)Z9y(_W} z_3Ovd3pHos3%4$#@{8U?et+^iKHK|qNZmvJt2q5jbrMA2t!2*Q4;ycNBmijZqMwR+ zF16RCbeu28U#km~(2SfrUV1$QS8A39;uDKT_HYTAB?BHh06?p7Q(eWhQYfORrBGov z89nowiDYJ`Xk^y=>pH91TE&%wKN+K;8tNnS&pBiL``g-9-YI4zBJ%G~zuJM)utXxX z6rY0`@p6B%Ut{aYW(pp5=`kcON(2_)d;LDCnVe#Qb)2QiFBjk zwg*CxvCv|@#+IsfDr1i)OPv3iB6h5;81^=q&8}=Zwj!a|1#&Q6oRy@g`^I-%TsnlJsRIJ9TrV}ZI4qjCtHiUP^qG$188p8Z{4(Q){fco|^dS=ZK|PS_(>4x!?hy5X5GUY1l=jeD6%lwEM~;uFvgi zL0`GZ;-2RB#HJsv!0nY8(!xJt;D#J(mvR?Y#Ap z$Kb+m%0rK7J>iT2?&b-HYqEtLnJ2+6N-YNtJ}*|@WqM}HC$6xRk5~+K6wIA=n%C@i z+w2s&#*}X8E3W?XjIH$B{LJH9C{BVKDHT)6_jvod8%e!b+u^#_aearIPBBNOo`luhBZ*Sc85;F>Zz&5C1n`$hFqWh`ApMiHG$`K&wL@W(J2#%_ zUV=}8T8+f|9rIr8HPWe~ zKxzn%pMG1Ncv|sYd*!0Lh4xwA#w2@DYCiht4UvlHpZ$f>IU?|L?%a*W5@N0+1It*gP zmcd!=^+|7xVj|e&TMBOp*AU78jHNL$O37WAV(R_;;M3x5>QBy=JP0h!lLHvnL(Wpu zZ#Mi#f&}z^2t=+X#?dzrCzCH;`g^c@{^|#kMT|-0uE8;`ImXeuRm*&@p6{}j2?YxZ z)|L1uudd5z1jL3;$uQ>)GPLrL^Z_&!Oqcs6iXeROzr*Fmw7#ZRweFF#^Xaha$2=z3~fY{_rMrs~>| zvX%bu{z>;Ss;y5B1MEXC5zgg02-Y2>OQ|Nk>X(&*S9dUi@nAx68((`Kcf5l_G{F zE_PPvKB-vOVI8P3-sVC(N``Fbb}^3J9oAesz0=NlqCqvX|LX9@>5Q}KC%+F4$I+<= z;~v(cOVvO4mP;D{ZtE}a^jIV<8U7%%d$`0-`)7P?o+j-+E6^--k^Jy#I1Tb9HVY74 z+*?G^`b==ZZyz+Ld7DL@E^8`9mAmmYyY2|-rRj43Ug9v!*IBwSYY0gAl=&cD}DCP-#^}=|bjdPUkD&V2>xa4a%H64VmSqTq!$S9@SucupQmJZWS)DPJWN{Xi!k%IxeCYSv)xD9=o9C=^ zxfE$w8DD3WBG}XKzLeVf(TP;ArS7;>3tDR6C#2R7Q+e3wDBk}Op>c+LDv3yc+?x}j<4j^Mp8q$`$h

    bCi(Yi~RtyB`a9$2~4~$)LF+WNdo3(xN(&s|vs=&4Jlsn!= zxi739sdWg3H2;~~r%L8NBmDuTpX{c4PP}H@c{@~C12wO-&mopagS3hD9SAag<0b#WVrZ$6}&)nen*S8`aHOMbDkjZ;qvF_7MsmR*yZ!sa!uvdC6 zWeST~1GvuQVnAQwtSYA`D!o?{7(P5Czwtfi;@Aq-q7p3vW6i#@$L=UXg1_(6wrpxP zba9s3jm;2zx(3)7cwu7fvXY~zA9lk?HS8X!IJC2s5UKw;`^{S=_Go!b0!&fRVO_i0 z_xg!Slu0qrdVwN!6IJx#{?$iEt?qwv;b>sMaEEp zEf;bSI=MA1hb;mOy2pCWKAk?Li(J=z6F@d(QxhxH(;ab%oI5pvKNSFj4E!>PFp+zW zsy$?Sy4X{DAXy<2A^rG$gYIR7t(C7P!`Eqh3&v>YA9{(ts*?k7r5*(RCfh&NN7l>8N^GCrv{8 zHMQ&0*Re5;{Yk_Fn7?Fswy898Z#-Ea?fL{x{Z{1ZpCwb?lTkzK16fJrJp>eHAwzk8v7^e z%b+Y+fLQxiOXg&g5|dZTQmBHwJ`6G7AQL^X1r#q{lsI*{j%ia<^>g;p(sR6^K;$kq zE`;u?-yixA#K2>xvAG3@i zd^Zs*VU;CLQQT2lgn+}j-S-aM!9u9I#$r?Q3RyUYJ=}$ysB@ie_)SHfo%BTWa^5;% zGwfKtYykafTqeCMcV)XPhhEtkm_b>tGBvLVwO5efIXRBHt0bPij}3Vcx;E07lcna> zj0}b|vizeKGd8zjdF5LRa%>M=0RP6lak z7yDyaNH?$WYi&wT!BY=ST6|oa_l9`8GkG+9QfVTk@@M(vEi24WpADv{eO9-~R zV^?mWC|97gtd4Kc7;JzOs5tT^FT4pS&ZA!_qF?gFTjVM~V{$W{e{o&g=PLD)*nWVX z6ImrkPX)kDiL2|ShcGn%_n`{DAGJI1{6g$0MGLHqg8d&9Urr@GnNl$2!O7Bof91Ij zg)18R`i#S<%jZGrJ|!%Vfq=~&u#YKQ74$h)bZyrr;dwH?(zp=LCbc!&wOg($LNj1{ z2MtxA)W&=3toTniW#SP4}u zMBw}~^L@*kFq}ITLqUSk5!=D8;JX39a)@y(5ZXxsNBT`ilYkO`qSg!2b!Pt?rpkwh z3O8BA0{;9n!#@H&AIYmHsH5Zmvvgy?lcC-s%JD}6F`iBPxM$BY>Y8qV)I9!zBblzh z!SFUmgn+9>vi_eLL48A`aW={i(1XPQt`b0Gs~XCnBRR)&1i&RKF#MUCMHx5BuuHX4 z%$EDh^rMHwsMseE;y*x}8+KWQS6LoaS5K_>D6CaJujwl16>iVQdB=A| zpB)~2o)Q2s$xtL5W~9CvR+dx#cN`|?8QmEYr(B>QDB_%djifCnVa_Tmp1T>ca$75M zFu?5e@w2td5!2sN|8?AOXgCDog{8{B6OsYMX;J$nl`ArRUy;@|&qb<+_aBTjV+<9= z%yEfA$uK6mRoac0V!OUfp*M(57y*JVmNI0{{P37nb=IxZ?ZrKG4FXJi{IS37u`<>E=gH$Tz#?&Ghm9oVMg(X)+Bk28v?jA~uL!r0_FJ9cCxI=Jv3vR*f3w?j@ z`OdknbDn=f=Gonu-MR1C+0798K}8k|gA4-z0AR_>NqqtUFo6I78ag@>T#_XChYU+(Yk-CV;;ihq-lkx@`k>~62QI$B>}oj*Q4UR|CUE#_aq zPR>scPLFoa&yKDxPcLA{$47gY7bmduBZC54yFrvAn&taj>_uzq_@xFnxY@czm#1`KRRM zcz<$icxnY%A6kz6agN%}R@n4nH~CZEbE?S)MyO*a7*tZLBTr?rgd_*>rcc zH`dquDJxo>pMH3Jn46iry}jMuTy?hpdaw`8NK4EHrxxUa<9|gY#zznIwjUns4i5D0 zLO1@lHmu?M`r1%T305`upO>}+p_hK5j4QI!=Jh>8lI93LC#=~$SX zva_?bw>87g&y5ZBe0{tV6XOL1-hcR@3U{icq(psPwYH|3o15$T+1cj$a%)q~%JPz$ z+NZPA6YDP)ii!#k_ji$z;mpiTm#~xNr3Hh9JoDwkf|As$%Zre$W;@%jD#{8v+M1eE z8Ln%U!5#7!EatBN!-fQ=)+R%hCSr9xzdyG_A1#&WE_?v zd%7{diEBFcxc(?9CDr@LZ~W~GubfpanmcJ%a5Cem@dp1ppJhp2HKRX1jbfk-AHFcej3RHMMCrD6w&p+TSma z?}>+yUUy4#^AZ3UuK?qejp%&?iHamqCbmyhj8q#J%aX{{b>G{nzTj+uygwl5kbKP{ z3_i!;DNVJf1puP`8hP3Fc%j!4#f(CBPvL&~8|-WRe!oB}^YD3+fin>Rz(yh%@Z-p9 zq(**kDzBXMLQ~D4^Yi00##Z}8^5qR=mtUwZ7REpFPnX~eGF}5_#o#6;gowg z44lk2r7R(6Hnw!+5{O>sef?a%rm027ZqS4&JHqi>L5 z1H~|IxI>JV=BMJrUqIV$P+_0DYTnEIV0s#FCg0KNi2YUT|8Ysz-P~ug=N+av0SgSbpeLD*CatJkBHv zJ_+vdq`z>ejVBpQgmG~bQ$V7a3Wa$I-DdID)YB_XM^WAQr(Z5$IM4_QwvaI17p{+f+*jppoF=WB2ki#kf{VmR6ulQ&*kSvbJ? z^pniQl1vCr&Al}CNM8mxiauuQlWh<} z{bll%}p{kV5l@X+Yu^hB-uK4gEw;BuGS*X-$I+Q1d>}x#GS%$!qqT-big*Dt&xjjD<8PC;lvmB@ z;9v2bDHK9|*hNgS_LWGVW8<&Z%>9*OAC;nVc?Q_s?P3>NwHlR(a2sfuB+1eEhz!Bk zCJW&ZH(QtqTpo;Co$^71d{rqF6a^Wr1V2aNXxPJI%6A-LO{0m$Zz@v2;ujR>SWsT7 z6*j-t7sFg&dlUlgAlH%wR?<8BM6$0D1x*nUY?I;ivTvRz6|tji{lOa{oz@oVKwvxzdMvoF z8NY_EELmeUcLoUIN2a3VpxC`uB1J2iMrtpoj^Ypp`b)!i5KtG)`Js5zXHlx|vPiTZ z%zIdzhi&zM=#r~(@EWyR*CJ=eC);gzrbqd^#@SX-Te&w|0+qmLVU3fr5Io3DWqaN2 zj#d-Dj;^SF5BthfvqShsLro-z0S>~yPN*&q!*7OPHsvpss9FKZA1J=yMTH=gZkvT% zx?1nI$$n>=DbVWs>PC68WP07w?KDo;wJ_}DzqGH7P>OvDZP({79`(~~IatcdS8L;@ z&K-Z#sp}s-@WON62ASvCNeR4Qqc{8KQB5_(p;*ue6jYe!#Y;PP$puw{vzlgI9OzP| zuZS47ftu=;pJkaFqyAwOYTZc>22}R~e6(}dRI(S%>vZ1=QJp^e)LR5%Plix$ElslC z-CXb?rabSxgL9+AnG80-g_;85Kn$;br1@sRVVXNo?=tE(G0xj&!F+Lb2X-5jajbD? zq>|dyl4ycbop+vmJe$1H8lN3Wm@gCos#RCM7G0ZmcCS0Gy?{wb(3BZTJeg^@p)P# zviXn9-nM3@mLp@89^TCn*`p*Z6)t%C*g|fO_3e`H`i|xY`sMZH2g*8V@8-PXo>w3f z2sEl@bOtVPFuVnu8iJyzAlmbw%Zqa^WLT(gBfB3g5Sr%Tz^o zS)v`ONZYlxUk^qf`5({Ewmy7o+co4tyIa7}JLhP(pAoq={f_iBxwwd5eOJD1v9R9y z>uPwofqIv5_*7P7Z23`gqef#Yp0=~j{j%CM-8awv3IE={bT8-W_x-9WbB~znpWb2L zLD+`xQKtP>j_kud8Yxf^&Bf0D>DL2=l0Gol5Htd}_ky8=@XD{aKKiROQp*%7rNQ-L|50lOSs`CvKsR&c=(!n3GwugM%>N z>AQCOC#x2MwZEdpu6J!nO*@aH%MJI{F}Vo(^teAnZ{9geR(+D$tfVuyppUEIg+-tC zbU9Vxm*Yuzn8wng%X;93oH!uP_M?ZyRN(!b6`uu3eB*rK`4@=lh8}9-sPLL|-kH5& zb7j`6Vab-<6nl_v?|Aj7XphBzYOCyaYQ`uYXZ=+yUfd{>Hg+L34CHw%l^DAcZe1s6 zXm37t$w^iZZnm)vo((uRRbVwQ{i!>UbsK_8?Rw{i6k&r@$&g}ob_0M(Bn|AkQ)^oI zG{nz_p6;6BKscN^fi?hN=)x>zw%gpi=^ zu#w_pa!_Fbe|r6ff#NA`(GabYVkB{J)-^-{wWcp2d4O~GK~}5}ho5A;4_EnT5@4VJ z-T7YON)qtJpIdusU@Iyl#VR|Lp%)j-|Etqy=<){OlET_6k%bEBUHz#Z^_dzPDmU&x zlH7*}K8->bZb?Ii7Phvw)-*&hM&qzC4GEAVH{3EpWA^#_3RYof&Yr&?f3B z0I1f@nH1Vnb1Gw>X^;qV>*o^xwC4Z!2hW%kfwIbLpcW*`XJ0KMTH=A$=IRLz`r|FC z6&4tW9E{_SwiNAKa6w~yH^~d>IkrC zBqHh6*GbzbK>qk!+D(rbFj$-!+0U}zwQ0OrFsl47DTZ&o|9 zOjQzHwYnjaw{o$UAP}=|<^v;vQB9n-EI-Fbj;(t>x+JPN6e+g1Z8bmR`fltLVD>Iy zxu2@lZ0o$^fX&D>M3N(CH|-W`1bGlXCL%3$kZeHlltXk)EJo>kE|(6uv$gAwjxb#T z`cyqK0Q6UGQMKlLj;N6U9i+-*uUS1A8xruT|D5wels3KeJu;qU9n;17#3P=h6|khh zC0p;_ezC3i#*QarM{i ziYEtuH=9r22F@HtTyUZCswhG*cc{nJV(H<7B6T{22C5o&qzXGF4rpX(lnm&92@rX? z`r++bsw?2-4gi82VHuGy4a>=h_w@Hg`L76@S=O`NalO8sI+GPJuE~EiVKwz;7}P@7G->WQvz2vxTa40} zgZA1Fl%-6@(?OWBL+0*PVOI!f#4bT>p3hnyLTH@$%i-!kuo>Zy$ShAr-6R#4O6J+1 z&Wzwi1~N%54l20#vz6iX@#{>!#J*olOY(5!cLX2I)mIWW5*rGX<=r|{Uqi_qMkPDJ z?L20PzZDY%P-Bqq_}@_<^MO=|m}1NSFxuvFL;OIGT7?>v*Pceif5tI>7pH!xM`STi z@qf==q?b0Wki5T9Q#BaOkVT6Hc2)UfpEY^+UDva3d04ULMIK3vo|os}xHS9fZ-JDl z;?RD&xI>9*GH~8>UUfNo%rO+PIL4}cJymDQ%X{6lEjo707KkoHs~b!f>J6@q3x+eJF~NiEsg;6)cLb zjtq>%NpZY@1eW*uYF@I@a=@gV%NdqKEjU1&{oe4qk2rR>l(?{jYQBR@Y*50n7_)b` zzQS3K#0Fx-iW!QP|0uSnAvI7MADsUAtr)MU)=SMyd~hAs`sLPKdk?~`54ubbUnVwL z*7r_^q|tiDh4_fZgkwX8if{UxcZ)Qc|rlHmQ22{ z_Y^3m%RrS`3=}c1h7D0V*?wUi=<{>SAu-7Dh(qFFnQL`S${=WTk^ik6qC&~S+afen)nVA5< z(JX3D2sDug7`&M69ojInGhd6%No9WaF_%Yv8@2KmBT{f)23zhqnWwY@4UYkjUoCM7 z8So$5h`=8OdJ=UCW+{}vvOB!Us;iW=Vr@75?l#Lvx<g&rLi}g;+mzG%vu6C$Q~ZvO+A`BLdNNY29-I$k@gVzcIl*na7e*%?b|K$6(4M}g zi!xf?CT0xyZ=Ueq`v2Kb^?JbRcX_>ZFEo3DLk8TzfOI2^{i3ZRr4{Mp*scP=I5>@! z4SP?8Nx_NyA&c0tEB-MU;NJe&ldu!|JE`A=(FnEp;C}AOG*pOHkX{To0?a0YxdkQP zVeNNzG)nsrD;(6h`L5q)zb-_L8GM@;>$D`bE*AgCIEBRl%Mei!eWM zwcsEN{`dmY*I5xv6T38wF#mGeR#bT$mBR2AU4?T60jMqE$uOCnu2y;ZbZ1>@k1{ z$|~O)U^KT4xZqj1?iGJzkk?AG?6nV#V&1)tR9NdqXf&$PY%#fOQm}5((9+VJH7Beq z3Ml-25};Z0sps~+G3a6?J>Lb?3drwqiR`1?D%TY**^V~}6g5CeReyi8DXm2(bVRen zo1eid0ZM$VuSIBvBcR55Cad}~9zoD0jQNEdrHzG!@hKMQUyjn>k7D&|lkTwmyRUs6 zvGC7IJa4iMjg0%G$i){R27y5GJo3S$79o{>sWGJT<)_UzNIsL^U4Ry1F-s(Kwdcu@m{p9*ZYsFXBZvowywl?LTp)w~EoikIb z*D^8KkilQwZeJgZs8tbxD>Nmy+%d+WwM;?@YsU=-fG&qV3O-b_v_OL;e;E@jd;Rm4 zsK-BRE6(;{eYE8Tx}Tnr(bG1PC-VBFzcV2kGm-$OTRuGN+Y=PexTcbI=R$%BE}JKu zSMsx-O*m&&2hA~1f6Du)Z zp6ShDeFypJ-^TXMt7*!89dBs*zX#0)C<8dZn-ifTa|f;>XVa9>P^Ye$(glita4_zo z5&T=->r}4lm(&y10l;+ovl;z#nSY+dMJ7X_)q3)`Q z54`dtmGH>cUSx^ctE&IYmg!>A)Q@^$fChAMTd~!ipk@l`*jbNw)O|n1A7B}kbrUi4 zTGf=5im4VbjI)zu%=4w`QB+HaDa7rpupIzO+p}2M&{5pjnb9w1Mu(jp_-52Jc>TC( z`N4&4-9`#lZZTWPAbEMpMMaO`BKMo?E$`kpyT_Hx)$UIl_W%x)Y|jtSbT@^d>T$sj zjiut&Ga10U zFoTa&qvMl}J9!j;3HXh5{e&@Dkw^qeJ>W&HsrTqY3cxU`!x)Rj2e*t_O=7M-3;-a> z@wh@Z+N!3~02fo96iVcf$3rGu7slL>k%&$NtIXzKn0`?g8yg-gy$D{8KVMGNDSqdH z0u0)uOeD60<67}PE!hd=p# zV_eJ+-z^P;HtgcBTMGDP@%taROYNK)#CfK@8^JWigf!eM1MJy6P#bZ)%Jle+0R~h+ z(IxdPC3r$DgtHSE!A19ZpUI@QLXUg^g=t65brJKYha@Jg3wch!k?by(#1BG^i;g=I zY*8tCWNASRaGmhp>y<{N*h<4eIWesFXj1!(FO6Ov5=Up$&95s0K8dtpLEbEjMn_S; zE_0v#eu+{w8TRWOmrB;Y{MpmY0_C)Wrk67SNWNjE%_svX=`A#f5NxU5zLP*E4gT?T zrTs%$v*`X)b>)Z;;1q8^(E&Y=T#NP!qtYE=kX`Rqx;VbUpBF@g6STcVUd4%Nn;5LOoxWuqr_sDs{@&zPQjBT@F`c$N+S|F`O8Sd5+VYk8l963GD z$Y^{$kl~`qdcn+~8pF=wedCNiNw-Q3zgb;k##g-op@e9^9%{@6NyX#6P}o`%LmWlu z!W|OqCw__x$j%1Ys??{|3dL$o`4mLjDi3NESrQGSOzlPAn|cI@7|!p+(_t`wDjj<` zS-P{tGQz{?;fBdn6wsM{w`w`T4*L4M&)b7Uv}ZZLE|%7Gpn`88J<$l@-lXrk3^}gC zhG@~XxIgoP9IxAHp}5S>bEG}C`qlzoO+*_Iiuy^A%iH`UjRIY3&nMzxak4*IP5 ziqjkcdThDH2FjE14f40tE@aaU9y{LoO9ON`(P$kDx8v%wQ|N^7kgBh+JOYH|68y%j z&G(Eb!I4<~(=yh4f`G&C1S%B9AS#*29{*}j>eos8ECk#IFP-gH0qK%*>)21~R;@Nd zUvk1S3T>*K|ij*TLsH9m$25 zR#B<_H1-!Ckab@RFDyrg2=qt=*8b?VTJ##=HC}+|(UD%0B$@t4j`1y^r6+`qV9Ya7v=_FTkH=*5Y&6Md)$e+hyNz-Vb4>gf@<4Dj{LE8*|kLv4- zI3|(NAB25`P)=1;r^YS@o|dK>%^O?}t!-f?cjITb>dMsmOPpvo0(|8y{J!8ZfT*w_ zITWc?g=5GO)=zv@pUlsiu@&YxlaBM#F-w*6>24HsOnc}FU!A&th%?zGrUULj*x*1= zxTs5!DM4->FBqfV0qyae2zu##TYprDpOBsqHL0^MTx>2&V}Whnp5rmt!tA&E9BmKQ zXc1uNaSRmppO9eZ>Uq8hr_ScM@8MT0l(GMSeG8BDC z#*L|?5lMe;p#lfk#7M)p($gE|2nq_-V|yp~m%CiElgfR>rKxBq80&}D=k-dgN!vVv zEcX#ERTnbAQWq~lgr+jCR>5JZ`o@ITm={?4AH?+dB$;gini$b*a?7^ zshgs!VZPTdD^t%aeJ9_|G&zgpl1^$v3K>ALL};}r$NOyoHqb?BGdJULdYw-kZN%&9 zP=FV$stle)Lb!E`uBbzW5O$L=MgktL-m^|2Kz|}u%c|8~_P!CDuxZ`_0ESm@21MRW zy#ZYw|B`B;1h$nja`faOWwd&IX8lqo-r(dEFI=pG3OyZ39OcCFG2(|LDMfoH9cB<) z7iyd-($8J69-*9_Ax&3^@BPj|2jxo#8=hoE?jpb}>4i-fsd3q{$bf1VVGX{&H&&yG zaYv8CKX!1U82gFtz@%c)@V4dX#Y2&yM?wP?GDjtg9m5CEEQ>Z0$#Z?ykEqdkRjEuq zmGOzOSQB;M^mod>unsJJL4<9VRBw_XyknA4;2qtk!otNg7A(y)QY?+rSIC$WHnOoR ztLO;CJ%!(Gfp!7aXL3r{XS1dVP@=j@=o-WDHrZ644#rZf52M6+^>)C7g8y%#L={b& z0c@E`D%Y}f*Bu7r`;Qbh*3a}Jznvih_vW?B2OvRI-mi7xp+ZR|^tY@`?|v$f9*q0- zOCwRA>cD?r`Bw`-bU&cl@j4vIC2)JVo$d>rw2qHJMA$ISLohsjdEpIOmi@b?V3yBP zLMTJhB3g+CrDEds7u7SuU7hqLT`%D3h^EdqPeZ9mnsC%VI^mD0ycD0^IVVK^3@ZUZ z>xre@<~KVWB@YUI`Ze1Vp{fc1d;uWCX-dBf^v*MJK#B>=*0KsYX!$YuC!!px)fTh- z+kOG<>M1O8n8k!W4rFNHC>aYlktf&E+4!`S?a;PMNtD#Agl~V6acQ)f=+&{!Axvwb zCD2L>XdIT#U^w9pmzF;N0&pP)G}_mDzf7^fhSVVhHNWFP@B)r(B!=71=Z?BH_4n8z zS}J_B0Ct;gnq?tdF+|ROj7e9Z0kI%Gc_zfe#90~6?k*5~yw>Q!>ubru9TrwDs{?5!NRxdQph5RBNg-_0rgmyt=J||~k zmqjK_8{&XlFWjOdrlb6%?jH6bQS~m{^C8}BloQMEcqiDa6Uq27$(N1sw((af;|M*D zt5ffuv;3=q!nctd0=C?Bci)MJnqR9x-r2ixH8RM|qgQq+Rp?nGh6yd_xZW zGl@dV`;7$LwfBj*FbP4nTY4RXJuuwrU29s`1Cq~1>J9&8+FeddT}x@)sVr%0Cb6#F zal=)0-PNVDYUa7H=u9P7(2>(+0Tpoza6hWN5V)hE=4no~e@sJ+Oa}PliQ*+6Wk_Ud z|HN0;wRCg6PH8;m7_e=0>OOgzEK;yo$`HBPqBR}W8DmN^y-sGUX#~nYZ8)-;#Hp^bFD{QMw8CTf;fyl z0sb|pLK?tca4hLF?DlJL|MbU2fH0r;De*n-C14G{R_j)v`!`NQn#?k{z4GP z*$-3qEnh>L#;@jY$A33g?zx(5WLPNM?xd^dlKI7|CiG_M78wnH0&DFv&kksdV>OuR zxZe59#I=lxmAv)oCe75fQa0Pxrj~EPANTxN^KoNv%KiOYiG&(R*heRvaxL(j0As^F z=NaWY=G+eH7N)rI9K}heU)0eSiOrJikdeRdFex4SeT%Z39+?No!^jXt>>v?bICbe> zlYo~Sj$@eBN7pGB)g;T?!~(>w$UlJYH$Lgt)%+g}d2uB%#DmTDD#H%D&d zqU9qR59;{@^_*li>w$jcQsF0-9zh39^f-2E5%R^gTVl*Z4QphyKk1~>y-fQlw zpGji|94(!Spj;J%!_6pOIn<2x2ZC2#Lssz8l?~kzT*P0HBI~}%{D|SquoIAwt0nf% zIRHDn1Zv|bJMB@Mo=0dEyrcvk_06hLUQ8H4&)Fe*sPg!$(beg0LELtv-`07kt*z-H z-Y58Ev)Lf1&>}m;{L-8QQc|3e_GriWQJF~xoO;8iPZ*8~LtqDLxul~f%TSTW9V6lMhOr5Q5DW*sSl~X5Fk_MmK zg_)7I7JF9ZsW_sX7~*3+$lDKtPX740wZt^BT)a=p>79yyS33Q>#B8BJdL%d*G`^|u zp+rdAxL(pR+<9WAOuFktXylrrGj?e`uJq&bV+nG~(l7so&xl&I_E~v#;@0qfm3BV$bFOL&Y>{p zq#ptz+^1%U4_3y;YcU2Y9K}+s{4?_7`y%|*DhlHwTM{gckWZ38jR2yoBxf6Q_(e-` zYGI`A4Jz?`d3@YGhOz}58)^l>7QlTcq z1tkk1BeBzT(~B9ZURVoPtNud)?61tFip4v$hZ41^bZ&GlX)aniA?3YA|f-ro>;K_Ew97lU>CP3d<%+ zKF(p=9lwTe6%!S0srq|$6{5O!p)~x;zWuapcSbq%20|cbS|=J{A)PyTFt|zG z8(uro?>}WARF+oq`5d?M$W^eHZ~Tm6tm{yiZ(n7|Ybfd(dJ??x8bwtmsbE%h;ynxi z8fJnxtNN$dDZhQ#%5)kIqOM`q&Q7cIZTbkF+uL=l7@t5mm#I4%6q6V&H79xHRe)$K zkQphKsoIomzs16&;2TS&7C1ozJNlY7` zf_l3BD=4Fs(H?T+$?M2X*3qVHF26wFO2|%n5YY1R`grr$!`^3kMxEp1*PUsBn{KwF zbeno~I~FpzaLy4bPUg8@v9qybzUfCgbl4(F6SUW$*IP*GsTZ zQX9L0@F6+sApQP+NANl>eI$P3n6a_loD3|!vbUv-WTlON+P5ilWW}!c58DO_1$8G$ zd$P~~_k75=ohMN!^WzmG$=_os+opFfpO{a&{;W=L2doF$+h5(S|2-;=m)O|A;2}?C zpqwzRe*;>9q4?izllMpRcsi`Y3tOQ-Ss)1=MR`K@RXak88b6}POJ74GP-J*~sa~vp zgIAKkYe%Z(N!!cN%t<{U@i=r#pAd(&ZK|4byOtKi2H~Y8@KhfHfX9I6Cm;xjg#KK< z0+-=h0Ro1JAV9?)||FMwv|rJ!(gS|IB1gXi2k09F7he02D;83YV&o}SX@wzAJ0uC?ZU3H)Cp z3D81J&>Q{ddI%e7Ww-IYeuyq4+;szZkjcJkgT>(X!n?1Ekh+AB!!C66R5-oU@0{h1 zNA;iI1s)*JhZ9gdYdG!%i!6dmV{Tf%RV+sDRD5f_35ma}5(Nc%(n4s20&4F`pI7e5 z^7!5_W#9~OWWZr(fq@{ji$l+JgDNvDj73TygC6=ZP|A#}kkt1bYnWKJP1-?HyB*|r zvJ?X{U!|xV-$x{?PrR(3%~p&>KyDKz_zWxD~uX>L?-lux@76{aoc?3Wox&m3BQ4?c2wEFdRak9Vr_@*QlW)y}o55`9H>3a=@D3rA>t8RhN5!GlpO*na`pAuM zPP|=T2EyS6TF)Jf(s(-3Z4Us_LDuQ7>Q&)F^y6vAhi4z3O~63VaO{Ai^j+KiT<#?xGX3Ymx62Ji0kyb*ePQ5v(exQJ|OjFZR6!ZrBReZB#0 z0u6}^$7A88hw%22Z`BEPc6LYMHMOHY5rdbbPal6=;#-+R0xBJH8`;S=g#I-%R;{oy zaDAgsbON)q4_MYN+{w7%xHrF}#x0E}f57Bnnl9ggS1SW5sW)jLJ(*3>J6j5OvRGsR z7U*!ZXzsSu!2Fuoql3#}Th%}rFsTH*ZJ(d#D`+Gq-?;WA)K#1BHRL5NTx!;qhYKwl z(7gAgCvmYcCqx{^g%_&>FZFx^%B-wvZ10_=NviL3DbRT&(c#VKIP4J(x*1$p%|x&l zqBLm#%_^J?LKt6qeLldv{u}tbga9Hva4OTPwtyN$`CnN0`x?`wTla`YUtSGj!}^bf zpl(9w4eNU^iPXzp;-N?7EGk$Hu4bTH=^79$hFbUWSs4z|TS)CgI}wY>#c5ihY!+r# z5Ym6A$W{i_Qvdq+0o)XaBUWs$+w?hQFSD@V!;4P<#FmC^ljIjJp&eRpaUCL21_lt1 zDjfdWqBFB%CN_wSvJzo?3zs)9YQ3ch{r=E35ZLZyRFOh9qn+C*xK37FjM>=z&CfI| z+NOkotn`$iII6p7$;7p^)YbDRr3jf*_>U;J`krh`y=>2)wsTa@;oY?>3<;)6z8RiR z0=>~C6*8Uw>{Ls#{=m-qs_0ylCd)2yi3T{gJ6HwZ=%KejPf+q#v8#!HdUwMv2L+PyZ}ctMAq&yosXJ zxDIt?I-^|3b_loC!X0GWzVN(#Aotz8Ti^HIzG~XP&^x`mI}h`GSbm72H8j<%>DAuh z#lEG~Yw59RyUALl+ws`SxjCPW0NxGy8#Y`MAUFPb>6L}JMEKLcb{Z{{6D{(YW;}@h z>w`E8cy$f4G=)rx(?JyJA>nErYkFYjwIq(h4;`Fs?>xG)DJjRAduzX*GHJ}JyzNc8 z6+VCD$MEzs(q&%jxR{}2!UnJ)EZNXb=c_>7ba&G3IPnaKj7 zeIkH(Va#uccD&dcJwt>?nP>EB#sTfaX6}fgx7Q5r4djH$L;|7kiNW6hSmnW2cjc=P zUWz+|r7{<#{GTD!v=DR`@s3Yt&$L0xM5O##{(!vhs8uKQ_UsQUv%N6#typ1PRq=JJ z`T%pjXp(}+c<;rETgJ7YY?bGM9m|yMoY1Gs5@7iwTl{=!lrMjfmr*`L%0%K)rQp1m zkpJSliKm91F#`9IufxsD!?h#r+?L$t3j_s0-m>Mx)!UapfZX5VrbR#CLg|U2Dlz^x zM$3Eb5FBZ;iwaNRW|9DD;->2$iwJwreC)304zCve>pL#QrF*GO<;3wr&Yeav_V1^4a!iE|$PKiyRxt`}WmR)8vZr3bhZ$Gr+S_R?4r&URf*fNRu z5O}6D*q9OBZ=n_7mlDV6E1YMblld~Vq@sjcngK^obA}+VnmB?~^=BRB;=CvwB!|UM zjq*6;K5NsxlRPGUn=7WgT<E<=K3i8O`SSU(Ok4poYj&9-!SR8JSmK>U zsd^c+`-Clh-)VKD5Mf7TuRi@tiOmr6L(L8!1Af)iUL*SPsW+p&((HT0r2MIs&1A8g zIS2pyJi8DdglUm>(pVx5-2+7F&We*mmKiDs(-yf^=VF;pXHAE$Pt!Eslf`oR+V+eM zi?aC=kl#{{x*g#x(sKO{PsK}m^ljW1FSrTso0;?dPoPGJ;bX$s zV}x!!jCJ#k8ZcnCF?Bt*{#0WGZDL6c>n+^e{nJ|6io$WEPduy;ErMMk9Jc+iPupuU z-fodix;qCkeR8+$(2CkjYw4rW!zplzchJi{O3J+DaUKktm{RXrx`cc1ZoP4gtCBSmeG zS>f)4g&Wz6G!C zD^Ua;YlUbx>bOOu$c18GYbiOwU$-Pintj|MZL42}SfUV5F)Z?P{?Jggd6-b#SO z0d_h6z`Uskru3yE=fe<5%K?fJHE8d>vzqR5z=Mva?f9i+59VD$>N<{G+c} z+$~Sxmq>xk(X<)kZL_n3(qyEojxua8im|X2&N{NFZ*6V z0uNd-!Uu)${)azC?U>a$qdloDujZw}92Ry^Zp_X|k^m|>Ojy_59U+6P(xFpM<4{ty zhVDL7ovX9{jB7Io1m^-pAzMV0A1&{d3fl9nRhEq1mGOL8<^v-GV2r ztLD%O>ixaeU4aVj#!_Kb`RK>OwUR4uSG+krtvbQ?=XVMA8BYaA`{tR`Htrr82FZ^R zSB{5+3tF{P?n?`a-S=~|U|I;tbJhhI@=L&lE>ihwjxfnQ*q{h@&|j!zDL*MTJh&Mc zq{_uW>`SwwaqA#uQ+7q4`13Lj{IktfRV%X*hso-XH2=(Vz~1h+mH*awuQ}Bz7DoQN z8Q&Z6N4!7lvR58>CRcmMVrldOpECR8e7Ut`YcxGQ2o)=!=Q)Q1e7>yu2HaVmw%jr+ znngE6u8k~>@TWyiiF~}0&jN-ECEcry>if0kr5`*7f0&z+6-5dlN~ZDO zxO^!6^nPQ%n~ja+Hun9aqoL2LRtZ3=(d3yrBtI86G zpV^+*_bn}?VsTkHP*=K%1o;+eqVVoKgW*4i&A--&>E#B*vHRS}x4z{-;u1lllpp_& zZ~$#>@cC9ICTwn=71HV=*e=S4oeiX3OA6D_R4}HY0*QP>fwSiC^rgk*z7`2w$!AT(0&6&m{U||wT!Che;mG#|WfO3DGq?_G&sLRe_ z;Gq$>SG}aQb(u+%BecdzbUNwa%H;N+$xU;|zvhw-yxw_7!fmCpetY#l#?GCp5y6eM z*a6I?soe_aV^q)GsPYk~8qx@va0aqV5@LUR)EQg~iT}`p4TQ4>*9slh`oe_?8Gfgr zrwt~DOQ4c05a}X^E``Pz3=lBU2)v?-A$x;D#!SIrLM{5E^O_prnEuB`;{44A`Z~3)9iA*zI7{Qdx6kEhr zB2PC!jkWg?LxwD^S-7d_g8+qo`04TQ0onjFBt@dQf3!$+CrY;&qt_VO{NUYlz6D5n zzzzcTy4B$pX}q88wk!c|$gn)i0k~E=gxIAodut8jOvw>jR8b@KJfANP0NQ%si~Ajt zM2i-TUcMrSgH&3VGKHL2# z)FJcbJS3AA(uVN$c|QTo;l!yukGW_k9z_BlF;m>g1lQ`{$qry47LMs+m{muA`<4JI zbSU0-Zr-S_cR(s9nY_XW)j|FL!$d1^hg%@xLgzJvP3jemLXbjS_m@UYQ_)5D*IoY; zN`$%)hY7v(Oh)ko{D3y9Ha^OSaU~%5#R=#Ctc565fFCg`;!;9x_&O(-xEkD#JpU3n zKovFeEhXZER-?5V8F|JZx1vJN55hw{{G%bg%iE(Q=jP38y9vsU6xK(2q!gJ`D2;75 zj$svRQK74Hs^ns#6BP6HgxKycS$(Awgf>P3blK)^w@m7DjBJmUhSM_}b9l;sviB4e zSi|p#o}X0!I*hBvs8VN1-RmZQja>? z*cbn%u_sbUrp1P5Gn?0VI8@+uT`;0=n6-Cbn+y-p+M%7FsAAb&^G!tCyWQ-~cmHu0 zK-&mR3{?`PH zR4Rs)VFL^IF*zFzNl}Q85*R!r3LA322c>Q+CUnSt}MBF4@ds?8s*{tYB2!;JKntHlHH$pyxO^~dp0K=bKrgh-WwdOJ$-M88x z8^sroc(prI)c8b}u{pm`tNk>7fWV6$@L96$-1Xw*pyz#b-AFkw_4C7K!M2dv0}YSJ zUK;hJXZSw4QnpM*#h$W_ud|wyUr`LzqI*$%1C|7TLOT5ca9Xeloxh_g+)Sw`MUJkq zp6upbkB^9_M(k@vXha1o_3sCU{&9~yJJa~)cu1jIm=}r8n})qDnvr(>*g?9)`Rfzo zc9YmDkxfW)Vqd%o+lJuAbDem6;+zxGq&44_mo>S_4~{RT$^O?c)q~U@4XisGzf~mZ z=-}C5IeqIj{8$>Dy)lAqEZwHMUr|C;-6=fH^lL4;gaD&%l4Q3mpHBzxNS2k5GRgc2 z*YTlwdTEW+b}o8qQ;)+kDFe;v=s8vC-~g#HCFQ66p=dlGW9FP?Wvz46e=+Lb2Z-(T zb5`WUu$!WF61^Ld)|K31Jy}xs5MfVWrk-7XS6!MEiOQ!=(;(}#scKehBaH)@H;ErP zX`6GJ6k3;-)7BqPoX(WKIJd|Rx~vO?t0@!zKBy^B*tiOqR3P220fO9j`Um2TE*U3 zS(Wk0PHOPz40LhVmA5P}cytYHDT}IR9>!SVH){3sM2G{qi*!w$E^{E-1#V`(IebB` z{_Sr9nJ*1Uu&a{7f~SSS+F+t$?Y0k_@1CvfrmJWu<6w}DD5&qs{W9mnGE6OJ`oUE3 zTs0EX%~J5p2TS@gJut^9udbrlUsl;^A=*=SVTe^NK>tg1djNF?8-dJaT{BFGwt-%egAlRW?MFC_UJ5|HdUX&+E1TfUJA1{zfv0l zZ*0d~k9b@AD5}`FP7l!dZ2s-%v!m0N!m&GWZ!Xz!y&jH$H;>s~h*Jb!Sr z(Z!&{&j4zErvRBCy#_5ci1#0b7dRulBYTRop%k%}zT;X|eY(Ru&K)OQnpGA#$^Fkd zUWjO_TBlh0iad`@=jLEdA-nMJS*{TF&r}xN@OHeAcyB$jHGahPZjj!VEyE_?CfA)! z^xlxSEqNr!v8GFYV}O3KOZoC-8r@yEF7Wo($SGWpV0TMK?g@kh!HR|a-Sq$qxkZH- zrbTlH$_o4l)F(usxu1hCRun?fst$hmapn@Xd{8-Jytp6P(q=)9FkY zekdpovc_U?L7QcVNNKEj{npn~WvxW-h6K&qd$6FfK=frYz#G%uZE8{CNBX3DVj7x| z5)cG-X!S##)<|TZU4$shD%7Q){nspo>T|`>7F`QpU&9FB6%4(r!vbrD?Rt6R`lw$_ zZJgYtY{O4IIvPPzcjdqbdhrs zPHI%ZWEI}#5v|Py@}~dZn!3Biem%C^JHp4T*vCf0Q{t|788JEZZ|Jf`An6v&42R>i zsJUGnmHZhKhm%_3#T&u9)OvGico#YyyK?Koqm84>p0gdBimW?Ip!9+K-y;gMwPb$R zpR3-jOC|}BF7gaYLMql*bs3kx?lRC(PEao{-zZKQuf(&$huXUy+)WxKy3iWgzk$aA z6>k2L;Q#wdT7jH2$DkxXW6ZeLTEJ}%A)FGHO<@<9zFyB(i5LwWC?7@)Hu=m6rg}&y zRw@>aAqF;^P3JDSu&OH6Nj+4pOCH$S+SnFm9AkuJ9{-PsBb;kUH>`)tuLPI(`XIN> ziS#+fnIyK;g5CitL-wN+kw+JT{%TKc-U^WnagDlZCM&O(Ziw%_88O9HXg7ITb(@=E z*HjP&6pH{~M1mXgkpzSj+^%eN?wNq>YF0(5@B`m-5yshX80q=@VU11DCp->7mUY}K zgDia$IVuHcIA3O^+{~&mCSf*Z5K(tUYz zMC46fxfv=zMIbhyyu?oQpFdz9Dcn*wh^RFy+~lra0VqQWvhEhv9so&N!wFwJ#xHf& z&s3g3&E29433Aq96ij{GZt?t0%Er);yY8olw2EcnvF>VCyJgNo(SviwrOtJwTE=O+ zt?8xCAJ`S|3KaSHMT1ekouC4POl1ZZ$TbZAKd%0-@}CU2{VLLdUV_(!?2Gnjhnk8K?&+szlH@4Aqzi-!NS0>DWvx}fIr`_V@V zF1khB$k=zOTjTDsrQ~m>Q?}le4s(%OXW9tiO7s34q{iFnFPf0vs#I5!w68M6+bNzX z+OqZ-H6WxMkkIxu6l*^)`RJeGN_e&g)}Z{fQ;SW(s+Gkb|)x65abBzUIFvWGUbzMqQs1JLc zX6>ZoATx&4J&?Q0J5#twFQvQRLBAte1H5oz}dGYCQ6#ZhDh}IX2e0KfVfe zoxIMC-dV4IQhaV3YZbR9O_1O)q&H-k_4T zQ|evV`yS>`@Au9t)77o-y?Gs9*z6lHK!mKM$e1t_iy^kEuG7HNExCOW0;)s1F4X7N zDat9cu_+;sEeRV5W&mF^jB*J%HaVq=5+UP0^M3G9p^dda&};DB^KTplDlyZG2JKl3#a)B`acLr7f;Vw4=VXxrXsz zEM~KqdOOEu`F!@hz(#$2y(M9)*tqD^w6vU6k4v_;l8+^y7{JmNsT8Rq0XC^dSVF9T z@q(}f4!RKX< zUg;Z&`fe*#KL`r2Uwk@fj(TEVOGiL3&PmJKer7pq5N6f)TG#MM4n9N3+ z_^&9|t@m-O#5EbL%w05sL~3ZKO0bXM-GLc2H*N1}MQhpx;P(u!kDH$uILhb^al39p zrg7|MiBi6zU+j6xcHxpd{*7am&mP6Pm}ddx&1Y#>-ro@E6KUT zgajf>vgk*|&zp>gypf^|p<{7}1rY3`C26ZG-1f;{n#!$Mh%AQ=J}*MnOteUira<+O z4=18QpR; zpFGXdLI#%824hMuv}t|Q6AP+Fz5Mg8xf$1dZ@NFROe}yRsHjnwWXP}GWqPzhrEjl1 zPq=YC*_F6%jaQVczF$~rw$1EeyoNfCU>#iuAG_T%P4U;lPKD6eix*vrn+u^uL_}5wKXtd$ zO{v9C%X@Eii1MbPUo>5`q>XRc{X%Py%XbVK96G;`7++oM4BOrX_D~zKs&4;>%p3^o z=Q4Fm#cjX44IC82_m}mGW(I?)pAxJVUTl6f_SIf!U##wCUQcX)8Ba3+p0im9Li!b? zLY&Za;W32(@7t!XO-Np!2j+X%;0B#A{1bC%C4|Bq?8yBRz{EG)7qAtz<%+oKeZTzC ztoM}2_cXoxar`kIs>9Gv4AUmIuTw0D^LO32TQ6B33RpPeMnr#5D zY2ZY|@0Urq`k7`Jocd>MXVL@Nh_?)w<-uj&V*NJ)sNxkZR+Mw}) zKxz7QBeaH;HdAoMLU~ILE8^k$;{Y>1@uHi;W6|4=$YR_c?=3$c1fRUY$KbLBDU%!h z70)Poq|--H**PBG0!5j3+eJ+lek=zQZ4Sp`xb71MdHuL$EJM^H|i>2!H`a~47( z2%lpXS9daP+wNq>O4Tb{=PaXRdG{&RW3m7n+c5h?mHMY|+4?xI1}{iWzlMHFm`ZNj zb9m(PtWx1hhD7dM6)BUoBc}J2e#pp?`$>U+*}oC#ns86NG+mDkv5AFjt;wQIr$O}A zjAC_%ajL36nCvhHpGREq^f_fEGG$GhT^spVkBL1h4RE-vo|A{W9p?yL=3Q6~^UY6| zVZ>EKyfS8lyqr%ybi#>{fcUmhd?(>XY~0~xFb&>!1-s6YU^`_Ed8R-7QiJ7A8gwFx z%ZSJzhEn*y@&@@7Kxj_4z>dWxHAA%#Nyi27+?{Zrht?ghenNkxROcAe(mB;f&uu<_ zcwJ*zJkZ4*BvME++GPrF3^=8O!5Gl8m=478%!;g|!C;$((T0ZU}MHmaydF zanrIlH0QKCQh!mewRLX@Yq#3ck(?HaRmTm#1(!H2LWR4A+lI-5NJ~F_UPL zH3OKh-M{!{KL~ZG$kDy#aCV*>(H?N*?CwSIKlaNL*Zp>%Q)b3iH~f+Yy&-Ti{3&9h zQHi?i@qZTQ2G`vw@IXd>#&(ze($|+JPCmc!^1|Y}UUF272kejXnw$ji_b$KRpiS@6 z>$gEA`$l%vakn0%i|5Kc43t@(1|XAn+f!%ki0hty?(~|3*qRH

    diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index e9d3badb..8287b971 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -1822,6 +1822,10 @@ off, the laptop (and the phone) carry on. (`deviceArrived`): pull, ask which of its chats were continued there (`GET /api/link/devices/taken`) and let them go, tell the secondary to connect now (`POST /api/link/devices/hello`), and wait until it stopped standing in. Setting `standInEnabled`/`standInMinutes` lives on the primary (PATCH /api/devices) and secondaries keep the copy they got with the device list. +* **Two computers that can't see each other** both believe the other is away: a laptop on another network without a + way back (Tailscale) stands in while the primary at home keeps working, and both run the shared work until they meet + again; then the newer changes win. A computer that has no internet doesn't stand in. A real fence needs a meeting + point outside the networks (the cloud link), which this doesn't have yet. * **Not twice.** A primary that starts (`groupSettled`) holds its schedules, its board and the chats its stop cut off until each secondary that comes online within 20 s was pulled. A late automation tick (the Mac slept, `onTick` `scheduledAt` more than a minute ago) waits until the group's copies are in and is skipped when the automation's diff --git a/packages/core/src/remote/devices.ts b/packages/core/src/remote/devices.ts index 4434c5f3..d28e5518 100644 --- a/packages/core/src/remote/devices.ts +++ b/packages/core/src/remote/devices.ts @@ -585,13 +585,15 @@ function stopWakeWatch(): void { */ export async function groupSettled(): Promise { if (!isPrimary() || !deviceRows().length) return; - const end = Date.now() + START_SETTLE_MS; + const start = Date.now(); for (;;) { const waiting = deviceRows().filter((d) => { const up = linkUpAt.get(d.id); - return !up || (arrivedAt.get(d.id) ?? 0) < up; + // One that doesn't connect within a short while is away; one that did is waited for until it handed back. + if (!up) return Date.now() - start < START_SETTLE_MS; + return (arrivedAt.get(d.id) ?? 0) < up && Date.now() - start < START_SETTLE_MS + HAND_BACK_WAIT_MS + 20_000; }); - if (!waiting.length || Date.now() > end) return; + if (!waiting.length) return; await sleep(500); } } @@ -955,7 +957,10 @@ export async function releaseChatsTo(peer: string, ids: string[]): Promise<{ rel if (!row || row.runner_id !== null) continue; const reason = `Stopped: ${name} continued this chat while this computer was away`; const active = activeRunForConversation(id); - if (active) await cancelRun(active, reason, { byHuman: true }).catch(() => undefined); + if (active) { + await cancelRun(active, reason, { byHuman: true }).catch(() => undefined); + await waitForRun(active, STOP_WAIT_MS).catch(() => undefined); + } const paused = pauseOf(id); if (paused) await cancelRun(paused.run_id, reason, { byHuman: true }).catch(() => undefined); cancelFollowup(id); @@ -1068,6 +1073,7 @@ export async function joinGroup(text: string): Promise { return await deviceGroup(); } catch (err) { if (primaryId) await removeRunner(primaryId).catch(() => undefined); + if (primaryId) forgetPeer(primaryId); forgetPeerKey(key); clearGroup(); deleteMeta(SELF_META); diff --git a/packages/core/src/remote/replica.ts b/packages/core/src/remote/replica.ts index ff2bcb93..58db291d 100644 --- a/packages/core/src/remote/replica.ts +++ b/packages/core/src/remote/replica.ts @@ -449,7 +449,7 @@ function emptyResult(): ApplyResult { * Write what `peer` changed. `peerWinsTies`: the peer is the primary. Each row is checked against its last change here * first; a row that points at one that isn't here yet waits (replica_deferred) and is tried with the next pull. */ -export function applyChanges(peer: string, changes: ReplicaChange[], opts: { peerWinsTies: boolean; onMissing?: (table: string, id: string) => void }): ApplyResult { +export function applyChanges(peer: string, changes: ReplicaChange[], opts: ApplyOptions): ApplyResult { ensureReplica(); const result = emptyResult(); const incoming = new Set(changes.filter((c) => !c.d).map((c) => `${c.t}${KEY_SEP}${c.k}`)); @@ -485,7 +485,14 @@ export function applyChanges(peer: string, changes: ReplicaChange[], opts: { pee return result; } -function applyOne(peer: string, c: ReplicaChange, opts: { peerWinsTies: boolean; onMissing?: (table: string, id: string) => void }, incoming: Set, result: ApplyResult): void { +export interface ApplyOptions { + peerWinsTies: boolean; + onMissing?: (table: string, id: string) => void; + /** These changes were tried before (replica_deferred). */ + retry?: boolean; +} + +function applyOne(peer: string, c: ReplicaChange, opts: ApplyOptions, incoming: Set, result: ApplyResult): void { const t = spec(c.t); if (!t || !exists(t.table) || typeof c.k !== "string" || typeof c.at !== "string") return; const parts = keyParts(t, c.k); @@ -497,8 +504,10 @@ function applyOne(peer: string, c: ReplicaChange, opts: { peerWinsTies: boolean; const keep = !!local && (local.at > c.at || (tie && !c.d && (local.deleted === 1 || (local.origin !== peer && !opts.peerWinsTies)))); if (keep) { result.kept++; + // Lost: nothing to try again. + sql("DELETE FROM replica_deferred WHERE peer = ? AND tbl = ? AND pk = ?", peer, t.table, c.k); // This computer's version is newer: it goes to the peer again (it pulled past it already, or never got it). - if (local!.at > c.at) { + if (local!.at > c.at && !opts.retry) { sql("UPDATE replica_seq SET n = n + 1 WHERE id = 1"); sql("UPDATE replica_rows SET seq = (SELECT n FROM replica_seq WHERE id = 1) WHERE tbl = ? AND pk = ?", t.table, c.k); } @@ -599,7 +608,7 @@ function defer(peer: string, c: ReplicaChange): void { } /** Changes of `peer` that waited for a row they point at: tried again (after a pull, after a chat arrived). */ -export function retryDeferred(peer: string, opts: { peerWinsTies: boolean; onMissing?: (table: string, id: string) => void }): ApplyResult { +export function retryDeferred(peer: string, opts: ApplyOptions): ApplyResult { const cutoff = new Date(Date.now() - DEFERRED_DAYS * 86_400_000).toISOString(); sql("DELETE FROM replica_deferred WHERE peer = ? AND created_at < ?", peer, cutoff); const waiting = all<{ change: string }>("SELECT change FROM replica_deferred WHERE peer = ? ORDER BY created_at", peer); @@ -613,7 +622,7 @@ export function retryDeferred(peer: string, opts: { peerWinsTies: boolean; onMis } } // Not counted again as waiting when it still can't: its entry stays as it is. - return applyChanges(peer, changes, { ...opts, onMissing: undefined }); + return applyChanges(peer, changes, { ...opts, onMissing: undefined, retry: true }); } /** Deletions older than this are forgotten (every computer of the group has long taken them). */ diff --git a/packages/core/src/remote/standIn.ts b/packages/core/src/remote/standIn.ts index 8ccbb09c..0e2bd96e 100644 --- a/packages/core/src/remote/standIn.ts +++ b/packages/core/src/remote/standIn.ts @@ -26,6 +26,8 @@ export interface TakeOver { let waiting: { timer: ReturnType; at: string; lostAt: string } | null = null; let goodbye = false; +/** Counts the primary's returns: a take-over that started before one doesn't go on after it. */ +let returns = 0; let takeOver: ((t: TakeOver) => Promise) | null = null; let changed: (() => void) | null = null; let online: (() => Promise) | null = null; @@ -103,6 +105,7 @@ export function primaryLeftNow(): void { /** The primary can be reached again: a take-over that waited doesn't happen. */ export function primaryIsBack(): void { + returns++; goodbye = false; if (!waiting) return; cancelWaiting(); @@ -111,7 +114,11 @@ export function primaryIsBack(): void { async function begin(lostAt: string): Promise { if (!isSecondary() || standingIn() || !takeOver) return; - if (online && !(await online().catch(() => true))) { + const since = returns; + // GODMODE_STAND_IN_MS (tests) also skips the internet check. + const reachable = online && !process.env.GODMODE_STAND_IN_MS ? await online().catch(() => true) : true; + if (returns !== since) return; + if (!reachable) { // Cut off itself (no internet): it looks again in a minute instead of running the group's work twice later. log.info("this computer is offline itself; it doesn't stand in yet"); const timer = setTimeout(() => { diff --git a/packages/core/src/scheduler/scheduler.ts b/packages/core/src/scheduler/scheduler.ts index 70d67423..feaa6a04 100644 --- a/packages/core/src/scheduler/scheduler.ts +++ b/packages/core/src/scheduler/scheduler.ts @@ -17,7 +17,7 @@ import { notify } from "../services/notifications"; import { automationConversation } from "../automations/conversation"; import { runConditionCheck } from "../automations/conditions"; import { activeMainRun, ensureRunListener, recordEvent, settleIfFinished } from "../automations/events"; -import { HttpError, badRequest, conflict, now } from "../util"; +import { HttpError, badRequest, conflict, now, parseJson } from "../util"; import { pausedRun } from "../services/pauses"; import { remindWaitingAutomation } from "../services/questions"; import { exhaustedBudget } from "../services/budgets"; @@ -234,8 +234,8 @@ async function onTick(routineId: string, scheduledAt: Date | null = null) { export async function runMissedSince(since: string): Promise { const from = Date.parse(since); if (!Number.isFinite(from)) return 0; - const due = all<{ id: string; cron: string; timezone: string; last_run_at: string | null }>( - `SELECT r.id, r.cron, r.timezone, r.last_run_at FROM routines r JOIN agents a ON a.id = r.agent_id + const due = all<{ id: string; cron: string; timezone: string; last_run_at: string | null; trigger: string }>( + `SELECT r.id, r.cron, r.timezone, r.last_run_at, r.trigger FROM routines r JOIN agents a ON a.id = r.agent_id WHERE r.enabled = 1 AND a.enabled = 1 AND CASE WHEN json_valid(r.trigger) THEN json_extract(r.trigger, '$.type') END = 'schedule'`, ).filter((r) => { let slot: Date | null = null; @@ -245,6 +245,9 @@ export async function runMissedSince(since: string): Promise { return false; } if (!slot || slot.getTime() < from - LATE_MS) return false; + // A start window still open: this computer's own random start for it runs it (once) within the window. + const window = startWindowOf(parseJson(r.trigger, { type: "schedule" }) as Routine["trigger"]); + if (window && Date.now() < slot.getTime() + window * 60_000) return false; return !r.last_run_at || Date.parse(r.last_run_at) < slot.getTime() - LATE_MS; }); let started = 0; diff --git a/packages/core/src/tasks/service.ts b/packages/core/src/tasks/service.ts index f995ee40..1b35852e 100644 --- a/packages/core/src/tasks/service.ts +++ b/packages/core/src/tasks/service.ts @@ -17,6 +17,7 @@ * each and is told to read them first. */ import { remoteRuns, runnerReachable } from "../remote/activeRuns"; +import { groupRole } from "../remote/group"; import { existsSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; @@ -2327,8 +2328,11 @@ export function reconcileTasks(reason: string, opts: { retry?: boolean } = {}): if (openRuns(t.conversation_id).length || (t.conversation_id && getFollowup(t.conversation_id))) continue; // Its chat lives on another computer that can be reached (one that stood in for this one): that computer finishes // it. One that is away can't: then the work is picked up here. - const owner = t.conversation_id ? get<{ runner_id: string | null }>("SELECT runner_id FROM conversations WHERE id = ?", t.conversation_id)?.runner_id : null; + const chat = t.conversation_id ? get<{ runner_id: string | null }>("SELECT runner_id FROM conversations WHERE id = ?", t.conversation_id) : null; + const owner = chat?.runner_id ?? null; if (owner && (runnerReachable(owner) || remoteRuns().some((r) => r.conversationId === t.conversation_id))) continue; + // In a group of three a ticket can work in a chat of another secondary that this computer doesn't know: left alone. + if (t.conversation_id && !chat && groupRole()) continue; // It waits for its parts: it keeps waiting, or continues when they were finished meanwhile. if (waitsForParts(t)) { if (!openParts(t.id).length) partClosed(t.id); diff --git a/packages/core/test/replica.test.ts b/packages/core/test/replica.test.ts index a46fb80f..9d054071 100644 --- a/packages/core/test/replica.test.ts +++ b/packages/core/test/replica.test.ts @@ -148,6 +148,22 @@ describe("between two computers", () => { expect(get<{ title: string }>("SELECT title FROM goals WHERE id = 'gol_4'")?.title).toBe("Newer on B"); }); + test("when this computer's version wins it is sent again, and a change that lost isn't tried again", () => { + use(b); + goal("gol_9", "Newer here"); + const before = get<{ seq: number }>("SELECT seq FROM replica_rows WHERE tbl = 'goals' AND pk = 'gol_9'")!.seq; + run("INSERT INTO replica_deferred (peer, tbl, pk, change, created_at) VALUES ('rnr_a', 'goals', 'gol_9', '{}', ?)", T(0)); + const older: ReplicaChange = { t: "goals", k: "gol_9", at: "2000-01-01T00:00:00.000Z", row: { id: "gol_9", title: "Older there", created_at: T(0), updated_at: T(0) } }; + expect(applyChanges("rnr_a", [older], { peerWinsTies: true }).kept).toBe(1); + const after = get<{ seq: number }>("SELECT seq FROM replica_rows WHERE tbl = 'goals' AND pk = 'gol_9'")!.seq; + expect(after).toBeGreaterThan(before); + expect(changesFor("rnr_a", before, { setup: true }).changes.map((c) => c.k)).toContain("gol_9"); + expect(all("SELECT * FROM replica_deferred WHERE pk = 'gol_9'")).toHaveLength(0); + // Tried again (a deferred change): it loses again without sending the row once more. + applyChanges("rnr_a", [older], { peerWinsTies: true, retry: true }); + expect(get<{ seq: number }>("SELECT seq FROM replica_rows WHERE tbl = 'goals' AND pk = 'gol_9'")!.seq).toBe(after); + }); + test("on a tie the primary's change wins", () => { use(b); goal("gol_5", "B's");

    5I`b~FKF#6|^lV0n`LDa?YlZfd zqFLq1FPE5Q)^Ea7B|c{4@R@T|DOqC}#`r!%Zzw2GBB|~#w&6cUp5TTVS89sUx(-R9IIHDIBRIm^r&Ej5t(80p*lb?UPbxueqf#5(s= zmXTKm5)cE<_$TPBxFdTVhc0{j>!VxVxssyQ1~i+YHP(-Xjz_IxevZv0<6LK=R=KH* zxqtKS_a?T83->nOr>6(lizs*51lbWvjl-(B@h%we756y(?oI&3KcQ>7_euFU7pp*NE z*hV~?!Tx)Yv=s3KD$n1u3UufLby!Ef=aS_3yXZR+j8y=S=Ly-n55(62}$+r1|Y z@h7nf=^04!SkIrq(4X2Sn|`?AN<=4OWyrO{aVoGsR#46Cj(gxOLX&v97oiz=YpXYO z96)-s>`JoOV$R|H#~lg5s$z8l0L|M0X$?atQWTiAvRwjS-&@&_X@2(88Wwq56`}Iw zX=0TpvvBqUENg59EH%XYcW=n3H^vC%OC~BGWa*9O{2C9V@$V+Ou_zqs`N+<=RP zQV3`T7^DFGk`a)OF@n2Cl<$1J=YO=wvpY9>j35XDEtM1qKthfIJVFp#7|^JBefKCG zj{Ti#`TINI0@xM)zhAY3_P-tygk8S_0iTU|r*LxbyjQ?`!2547;Sf}?8V=AA{DKkq ztb{ww@;Tt{QT(v#v-R81Cq!Gm zf8i?KD!awcLHVKh$5jwacB{g9@)?)D7E!+^m!=L``QzfIrq@;?-Z5OQvfKgmt_M>> z5h-hgt!BMGGJ-wv?_V5Ta;@2yu^1E*(>n9CLG{}%9aC8szgvL zTb*uCE=r*rI|LWGX15O)Ej~?08(RfVm_t_~={Dg*y$9pTCZ^0qd*91Dh7{Cg(%ASb zrQ)N~UnVjSSk`y8aRf986ke{ zV0fiK6Ev8}vh|RN2~g(u5s8|o3WGgZ;mZB?E=|nrJ%+vCvBG=wioF>Y%f;r2?uAEr zg|=@j(|J;je(t>iQcPfqV#TpOtAU}+mtYf0X4(raF+yZN`bCGR-uNpFCC$cz0SY4I z-~HGz0&;Ss9y{~LVHIbr;ok0*qW|V8NifK?QGmF_@fDRv5HqEtZE1|6Zt3HHtkXJ+ zb<`K%JB>2E!3D1V7@tH0{mV$a6yR%DmJ8~(4Jp&8K`R8-k$m}`-qyS}mkTnbi4d_$ zQ_mHrHUQMH7)qH&gANA%V&V%weRP!aIEaSsNT8=3L4zxC5Jq{k^wXE$opqoN{doB1 z4glU9KT%ms2sVIzk<)FeI{IZh#xE3tI!T>HO8+P$qhL71Vwo8a6-I~FAmW2M?9M6r zsT#}u4H95X(zh~6I-$=OHl1vt(EEAfpw%!3TP?Fu&Bs(Yc+X`oagHS82UvvGzltB= zgEOeM!|#QKoa*Y2tq1&^a)IL0;Vf9bL;W1!Nrt5O#PF^+y$^Gkf)E(*WX-kIXMJ7V zi2iK+lBT*4q3obd8|@%d5h_+mNpS@w_9RAt|I3+KpWT0SI<@YXQoSstnCV8NW&o%*Z`%_5itA#QIu=*iEH|>%SQTlQ|Y2V06RQ3 z1OiL1rnHlC;NNMJm5!`2=E;Gvb)`b-(^;Kc-%xqU67+$JZP?~IO3p!!TyiJ!6zZTkqwNTf3@H_h-Fr{08lxxW(k6bMn?o^)m_nxmh(e7WBK zbM4y~?yf|eGw7SsR|_pURhrM7_nZxfKF*kYCk05HejlN6+r3=hVh(=b*zifTsP$g= zD?ma1#R6=MlXSAity5z}-DxlZVrbxbI>u3RuH?{C5B(8UJX5@F>LdqGzVGk^fnBR5 zRC^ldIs*CRGWOnfsg{%f7J>5ltZ4SDUNf70eU;lLbzl5>Zo)8AW*H49oQB!BJNoT{ z{pa382>h~APwPmZD!_-X&zARyfLsxTK9oD3IIOs<$+SIrV*SuC;@t23kfo|Xr1JZo zC|As=&i%!t{Sv&{8ZrK~0Vo8SzVH1sRvZ zM*_J_IM=FIEyGTYaTu13k}IvTJ42=GUD;LAq_S_v^5#cBVtb z38Adssc*}N^d9g(hO4biI~hA%PsO2!boR{OX<{3$;&%qBl5gg;vzC<%Q7;Ncl>s%X?fJUl@nv5W{R?5gL&fv7&6Sso#~^_TY-!2bM<)CvA` zB=Sx1jzOl+m>Z5fx9cVsUFV*>C7E7pWqWTk@(cN>QO5Y7;`NL!cy6!sJvk%dJiv?@ zkrEgZ4y+0=jDNr8Q46#>Y3_0p;XqWBR<>3RuKcvOx!G@Z+oKx}_1$Qd&J5%+X}I&M zqfFs${B4T^m5@tUzIm+=%(Sem-+>aLjXyDtGDa&k3&b+#CL;*(i^0#gHiO-2?c0rfq?I3-8eO6~UdpODv@m^y!BNG>Z>7 z-V)(=XG79xBbMXnhX!s^xORUV52O1m2Uev(uNzx}%rYlxOdEgG6LRcKH^S1mWk8&-KH!aterVYB~m%0lva<+-*{>b;bxQg3`VhpqEPm{nZFZzz{8+NX9ocSacozW>Y; z-Vr`l`Fz+@;CVuVbe*Fd7P+7%18~+@{<7VUmNxy)SQ1C+6kkAvS%T<3y(`WL?MmOD z6**byoMUJgMnj?toP}3cE*_<7bg?bx3u*L2=Z-uRPuBx=2h(K(NdV5o#W_)UW5b0g zTH{(SQFE5cqP~o!!ENgwHoe%a`+`Eh;I?bCd?VA#5Vw@RG|52n$8T+wkwNoG48ZYNJdj`&xoU zNU%w)x;kM`v+gPUh=~GGp3nN*g2*jDq@eEa!BqQue0 zxh4Eo$)Ebo6Nl&17B=J{#;h^2&a0Jugy84C#%mpHvZzSuzJ(>G@3!5@x}V4&tn$`e z&>UWZnO_<##1b2z+t+~(JpBubVvu%CoAxiEqt%|6?jUMlqoP#@xL?$;oJW)C`2V_C1d`AR$~t4X->wXFg5XBkyQD zeI~X;Pr`i_%imgvPuq|3L?H2V`f;nVGv9{5lk1bB_x5X1R1Pd^UepAia7VMpg;1{? z#BroyT;Nm*+5<0;CKJ)5kN4&UIFzEY=kRrJX;AVB#VoyExQt{iUe+e z*1!a7!IHVL<$V)vV-aC1IJnCsb+8kd0CHy%=H-!m)bg0jV|oPNp?w0SYUY^M|203u zr;9;XdbntIl-a?(On#WPA#^1A{xmv`d_SQL%JpaGKG#}GxFuu)t^1r2Uo=V^Upn*o zhKbXx2DXpAAVa*&B+){`;5pWtS$TvSX!<#x36}?5QtxxR4*`NAFnZJ*=c1Y6Llo)3 z*3h|Xd`wr20=LS~&AvqCP2J^`t*TV9K!wG;o`QwnC`irulS(p?UN({z%@2vhK!x9H z!qfgo@50e;vLB=o!&xDH+>cVLB2iMyJ2}*`F{2=QEQ?|Ub6&|~Z331#!U9&-VMJ1_ z`$TU!X?^CN`OgxdQVMibHPf@GE1_K!3xan{Lms)1#U2`Dw^5-DyF7^;!19ThDO0cL z_!$y}T1plWR*wxc7@X8?$yaiW05IE{pB=oBb2K4^g!~|AsCDDD zx-h;`AYgHYQjO#Q+}>s~#o*)$07u zSJ4gvB;8Sj>UYr*pGtH*VWrDvKNk%fQ7I}d@fZ#b2%{B~3>1tN)0?BAtdhyw;gaN%g%j|HfpJtA%p+2M zn&BuW3EUAAAzKF!M^Ewam!MRnpcM%!9<7I}i z2yHi~$Sgpy&?gV2pu2sjM=CWQD!7H2U2?+cg9J->!k%hxN#JFuKi9KgQ+-Qc zpW|K+Eu21T&lU3qmaa|tSoq6iz3+I?kOA|Dd=E2uuo2kgA}z;M4rJh}J6<#mYP>4W zLUqTIc)}bS3r5-jiZz!G6*gE)#-$aL^I?ah*Usb>h2Dp;-}qyxmK~SznR<3V-#ylFn(P&Bm!bb zgHfvALG%KSTW>7Z&t~lTxQRDPf2)V;J;GiIzgJ)%$Tdr>Y zg=dVA#&7bxY>$NB8BM+DmV!tcZ@HV}KJwUw;v;PPB=(Iq4siF9Jm7iCmuDb}=ZRTy z$S1Fjv|dHsp42~9#%G6YQGC#t%v`=v2Unp%ZAWrH0<|nP^h~(VBm)j3$(GLc2wLYF zPiF`w-|Xu|pt$41*YPmEKg4)wLK|co>0K(fUqdnn)5Y=Jz4ys7Ex!h_fSF7$Uc%qw z;xV#>MIBtXmY0+-kiu%DNr^#3HPA?HGbb)f)0Xpf^R-Mo%LG;>X6TPnh|mDabiA#)N(?+h&#xKQYtANBGNf^xBgj@zs*PJk}zD>>(<*v%;w&*UyGZ zoXB3Pf=khm1OqR4*=+Zy;Ih&t&)&o6g~Ft(U0AH+fkx4R0Sy*bsA_NI?O{KwT|a`QEs(SKP{Hk2%YkU*^ic>e@>ruQ;A8Yd&_#$qN;ub!H0n{r z5|{iz-)d`lxgf4|D`$!v6cc)#qC!>Slq@>r`%^9sp7u1*#;)SaG1tOb!8ppe#M&|z zVnYiL5=EQa$gSAV%t?Z)4U@4+TT|Mz0d`fN;iJV4kdiE;RV*0ycckY{kygkAhPtj5(M=`kRKV)`v@XGt&-|qW3QU3^py~_VwvDY|;n%N8*dLzefOg~2k9Z)pOlb0 zzO#LolxR1mpQjRAxNV#NtX6q=o-L|X|d}0FseAPF7_H6z4DYMQOH`)=l zL2)znSbwkEHQAztmw~-kxZQJh-Y1(;=bxI(k3RJ?4+T!2J4CFr4bCQuZ$E2!*iu#0 z3JV|dKQ7P-Y)sM3{Doy?4V;EpltmAcuD)TZVuBkPn)do7JY8ateIWJw#ZKQOU2__Z zT9$oEOByaRQ8J}*;SNfrja6=kdlC3}&{-6cbLni+MzpkszAwu+ zK%q?BrSLdmN;cCkU?M2%ro<=fsBdV#)%zFSF*bfIBxFpZ0A^}ok^LM}Ta})cnt5|3 zemZKK72v{t%k;!-p2-m#nokJVhonhPwBm;!K5wgS>2s6|JRNV3)S&$`%O7_o@_S4c zfb`L~xPKF8ah1~Q(D2C?4*WFhkJ{kI&Mx+Cvp@|})|}cKm#=~joDP{!Xl@Up{5gSz7Yq*-Y3X0n*a8Dy^l@Rm1SgKerJm=U`y?yxG_ZY(+^G`n-kXlu4 zt}EXN?K>n{iDYR`qVqH+Eiv#Y?y38j`V#2ArjU7KsUToQ=&bNI{C8%bR=&Sk`?tCql zeI^+4{cBtV{4y}AoXg3|(NV6p0$y7IBcqG%Y+I&XMo45W9A0)EUeiuaFFzJvJ9jBL zGx+jjD4*(iKYFD2qsfFP_3K=hyycl|8VdaEMQd9s#RLFx@9=@1S;b_G4ynfiY@wIn z0&3jpLUC(@T?*oTiE-;g0rIHFn2%@73$jAT&yOlw-O3$b%K8R0eeP_M@hrMNT=&TQ ze3G7bAvTs?Ow9~H{Rk0wWzQxo?bcu-*vJ8Z4vsZO(iZI5woq=btm}+L`Xc|AvcROd z`8GnMBpMM2RU5Hsw&_}$CKw$84!UOfjg#`FOpjOt3kr83 znU2P?c#PTD+0}I|_`Cq$`szfq(w@&QqIzZsg_;AtjH)c4ZPpVc25J^Jj>0~!#&%Sk zejH8~b#m`bcG&k!X#XbRj;GA%komFwENnOP$q%HeNe3~>9NN*^zSN7KCi3glhHqo< zS0O9{1$TVdvc7LlOoHe(ZEy|O@sKx!paIh0PIYKO_P`UC5q!MKg(re$Lo0&%*VJNg z|Lonx9|0=b8kZ#P_96hq^9hA4t%x z$q>L2=*oV;K^n_-g%f0`0kxIviS3rgb3_wt2=KZlPXD0p%a37$WbQ+n2b!B)Rq+xZ zXg4`V0JuJ|Q%41!=0Ik?-rN5Of-d$tJ2e$RfyoE<%~r9Xjc|oIPX(u$6AGyLj7VeV zjvo*3D|cmppeWxq!(-6g8MCwFmH@bZQs*JCTUQ(~sSlCF#*3-*OS>C2kmGsXONM~r z+zA#6aQm+u-8J8xEUU^0AfYda0NCvo{e&eLxDNV%9Z>tf&Z4Ek{yz^iV*>&XydM(~ zSa(znMv&1|*F6Pc>$(`K{0$kl(5+-!oXS}%d9<*tF6@r1FVwggMG|bmySD^wUkfG3 z9qe%hbT9Wp%1Ps}JC^gN<4nee;(;BPNe2Dh`fq$;wc=0tbuDALZqth?|B4HmI{??s zj(pLPZ0lwwq=TDdt81?M`rJt?2Ho*k0FXpp4xOC}5u?gjolAQYjX1fnnO3vH<-g;9i`?sfx@BiK{`)yXmQM5gI<&Sg|{j;~GQp;sn% zsHvr=C#K7`Fx<&6?S>s>!t;-@G(aXVP#b=byEDQAc@}mhc^s$olE4>+B3_dI1@9K! z>Wy4?{Vx}mqYgUW9Zoygo-;abi^D0tPC5O@^>$Q<4iWfM2RT_hbW_}7skz1yp-q*Gjw^ww;EaxZ~j%YsUZ^Q-*a!|gT%)ztJM3%6NLv^3_? zLgi^D<3BDavW2Xh9!yny%AkwnMy|pJ%^qJcr(lbNn(GdZ#Y~g-$X^9Kh?A5S;~mOM zjB@Fnw1>zhG~eQbOcehqivi4|gU47(dbIQUmprww!4;=g&Q)A>ku09s#j2~6AyM8y zow|Cx{EXUKHx02SRZ3t4eJSU2{(rQT8mdoyVv@RRab2lb4=i(N;l`W;&P%@Q{G&x7 z>B9t$DDRUg6D)i0IGz(~MEhxF(#0LW!%{JiHc4m_G=|(?V~8UzQH((!@OuS+2V8Oy;}ZuA?aA`3I0)1 z>-w%x4nQYiHN;LaSo;9Vh|0==BrXqL+hv0up!?kF4dKfyT$O%loea!CIHl#WeId+L zrh$LskQT8)zwYU08nANM-01#&57BqtKJ5F_dg*q1P76xvMgQ%$KsiCuOHtRZ5`xUP zZE>NdQpl;q+ycvL`tKv-p(CBDyo8IkfYE#;mGJ5kJO!mpnP(RoI`2(Nfcd{m*|&rv!TQ_UGIyr9qBl9=9kb=16c za_a88{iTQhJ>Y?v*3ezR*JR+U(p$eR;$Lks(V5wW6?r5l)i#-@vACBk*WqWuKFQ|cns z`HDLF(I(wQX^Rt$B`#(W1IXkYXV@MedA%H6>+=^hm;i4`gHM3A*FyS z4UqTnPd(~D2s{Hn9ZZQiEtox?nHSAJ@GdT!YnW156bYLyr_>5BIc#4l#KZgWxh2y-ro31hKF~K#XRP&fwd&7t?TBKKNx;Ll z)eB|)zlXS+mbS{vGpt-4`q&$p$kqbhG78G^J?NS4`X;y`0p=Oy3t(;ZuOSf84|7Gh z$T_qsqb7VReZA~TXq0_cYlPr4!`H1Y$1^$osNXh~Ani}nbV(3t zSWtXM$bHB3vE!bde>b%0#xAE81!nF>^R26`4B2o)clgJCfA*4-oXdanr!&2k6+9CL zI&&t#DFIVw?kzdbV$RhlGs78BPc6aYWm#tP`CAt&AZzfQY0(O?cX8K+B5MZc23z05 zFn%qNT@`Mw4>PiXfg|h97~!BZ9S0Rr)C+Ozy9QwRg;7V*sUYcd`}{u*5}I`sB<1SB zG26Kw;0r8m&|iNdBy55ab&H9%c2IUJfq(7KyW{{a0BMf#4)_2&U<_8Ae?IWf)aW?+ zDNV3bc=)?-bp~T4fdBR(9*Xk$*C}dY1_Rf0qZn6?lizcm93K?@VJD4^iyF++58izmobcQ4 zLaz=P{=))Pq1@SU=6!h;ldd)kFRS<`btC$dJNjH}K)wc<*&g}t3H^?TKRVJoElaBD zaCgoPC(4Yj9em*z=bh$rGUQ2z#Ms^ICjS0Dx7WY;)-En<2D_5jY2TpSEo%VIv*_5W zc)MiHMec^f;nixx94$W3SJ-9gtHZ~ec;OwOJJCv6I(J)kE)(c+UD9f*F4=HIn3CZaV&%nFqlcV z7ylzTJ|hYzcA(w)T5qvGxuK^3```Kd%QG@`{!_a)%X|IkcWfU5!+;eU;uU4JPIf*2 zGZUyl1r&`PJt9+pQ|_n$f;Wtp6~i*Gn6*JbkN`v{G#iDjkGZ%k0mA!B0o2Glrh^|_ zfvN9!`wzdBQ)fG$dG1~>Wjv2vbFJmJu*Ud5_dam08^2=A${M`-Jbf-}4Y^HMd8vBt zr~6Sz8|{C1uzXf`C*7pG;F%Vy%lezr+sjxgge(hj#Aoh|p8l6Qih>6J!yoniAUbYkeKKi*q`t6Z!N2R@9W&s&KYPg7?7ZeVc5`3boogIc0#BDB z9|?Ul=w6#7`8OJnkd5?EOz!)*=LaQ5weKHdR?!WAQI&ZrkNU^ggf{q?>St%}xFLq2 zfV-A^;3fosgaB59S-%(F64&B*m#`p-=`NJ2zFOG?!1n;Tnf3x?Rg7=lpwuR>EF{R(SPIG9 zg$$0Ri6ed<&6Xu={af2JqCw5Gi&KWQ;*zlk6!HI8EAE$En{x+tcL@zS)W7QxK*5Fd z>NL2{Sv`4%_)EiS**c1Zz);eK=&<(8xG?5;=lh+O{9aZ>_S=s>+B?;K$Q<-Oc9FQD zx;pg!+%W-P*3W3|%EWSM_xu|@Kxl&KbT`GxwXOunwTQ_FIqi&CQG) zywA(a(;GGHJ(fVL+UAm$TB1c<#vK8HfGS=WUbb%!r~2QI4sATQ_VMv~biEHXQew*J z;qOB!%E|&a)E=EU8^|))x#1wA^5!URUGb632X~2#m&9cX7)?aau8rv%zw|$ew?WTH z2kO@9%4T64Z34%POBwjN8{aLD6tECK1y)5hl#>poxRCAxJe?re7_UA^`c?OOhf={x zJ{iL4hZkw4ZCuwWsS@uGjUG)Y`dU+u$=~vNL;G2x6kQmydm9aY=C+VqCi+(M7XQwV7|@1q5AB>n)F|nKV8WsLtw62FMb(iDoZ+; zKKbBX>eF_yF>!(}n%VRsj`kq|^2FxlHn-Z$Ri;G@UUkCv|A)P|ev7i}!iHz)4(XN> zq>=6+L;(pUrA6tKZU!Y32?6OEP(T>Edjtfe2axU_TDs-E(EEO#=R1z?c>jX;Cx$C_ zti9ISYwx|T^ZYXhu2c4CKA65v=l{L_0`e$+<{75>F}^1RanE%u(B)ZYLot+*oTe&^ z_M;;4{OQEEx=3OIg6)wiZkA3C8T7EowC7FdA2*kUoHgI4-^V;kWEPy$a&A;I-QM!k zThSy3R{hKvziO{OUmM@sGl94nIYUPW`N09%M}@8U_BbeYGS~h<7wwweic^TDO3d+- zeC96w3H0JjrwtwFm}r$G-^1)5fyY+uG_eSBbl-M8!4_eusgHw2hr?m%d2ex1sf(sh zpd8ofJo8_hc(R(M(HYd)GzI2?@nk|X+~PiQ%c=>3j`^;nS10*seW@iumj3uod04=0 z;a)<5)F<%iy--QI>ThZ=Su`9Dq83t|BC??v(eGOyi14>*-eUI&C%Okr-};hMeH;@@Nx%BL>gzt1q_PXIN`lnTunH1{b&aWSt)}(##vG_>L1qN!r#_uZoVYZWx$6V}ajg1W^{5IahZ*H9h9pIP1&e%Ws zJ;&;>1X>7(nl5RbN9lNqV^)c>18LaN3QKi|py(`gS)~`a#%W0`%xyO~uB300SZiz# zkiJx|#!=6jzIV8EzrCML7e&~y>>GvL(th^wGo$H_Hq&mK-TvlK(I;0Q603GflLkxN zcua~Dm|CKxNDei*pHSsigZ)g(?DO$SfM$(-%tUc(_&n(RFzv=2Zr1XE&*||7G;v^K z-gk{GYfYweSK(6Kar?aJLbQ}xd@?y8a`x>{@v1zvv($MwYcK$XkWegX4Vq#?&GK!} zuXgzgeFuN*2G4TkX+C}yPLlrse4Us4JC|+t&T{DvJyL&KdBob)hOQSutA(Jhb3J%2 z37h|gJCqQ;rkDjU_2EAie%6ZNPSbq#0D%ru0zVf`UP#^}-1UTnTlo+Pf7{f50qE2M zDUqZ3vdPZ3C^NMbsO&BU@lPDhd9^bINYGd1eN@6)H1RVqZ-!I-x-LRQ_A7SPAa}I- zRxQ&y%zqetfTQ~ zOKw=MeuqZ^vs>zH4OEu(JJrRqj^r@7IKy(>-A(7rbli-bDwmSEA{x!MN#wqGC=jFG zLDMOjbM(Rq^X)w%N!XUKCpNk@;9Ly%{MH|x1K?|7<_n{cJuN*5F`k*C+L{m7G+Kkv z)yE6vG)iQ+^USsDp?jm;1~{NmL(<=No-xt%_PU}M$ic{ zN(yPmjmW{S(l;JKn}SEl1qqeRhfi>Qmy(b}M@v=1(em-F#jcS1nMSjO6W$X$Xeb{Z z^9zn`aP2^Z${TQ(^P-e!V`d;*R*-XHB||=o@#g&Q>^eWo+Vs|t-fVbXXtN}m2<5y- zzO*ZJY(46XXg=oL6S@F6f};{->T4D|CKo2PtY*85MSVBFx^OgHt5f z2tUAe%t4)od+O@~=Lk@qJ4D~cUC|7$RU6>~k8Y|wcRN)!qV?Ym^_ni)>m$6iC4HYt zg(#}K3|!$!GIPt=Bavq(&Lenc~Ai~!m+>B96tD=s7Yt2UV-1L*-{d5 z*~KI+GHz;s>ciH0KeR*}zgE2m*QP)n0T&n_bz3%ssJ)%HXP@;ly*SDS9{hPAl{JPe zPQflf#c0rs4pz`@4-=t&nOuYs0IowPk4g-tO-5N#f!}v9jcx7>5!n~NZ$e?cqOJMqm_UFu3G8vLX8tn0iF9IzF}%I}2;M5(nTC!rq53(1CDBei zRMxL4+KwGo9|FQw_})oqlf+H^0v`xtra5j`5NbFs5S?&GLK~mpX`Fvz-y{+pRhmMg zZTsqKOax`z4gu;)h(7Fw5c{n1`nibT$v<%;E*RXLUpiV?F}G3ffo_<#$cdVdA1sB{ zVZoVhH&sKIWM7dyOEgO(o@zwjiTNc#eoA{||Mt(>2jQo3*n0qiWLxH~V&$)p!587< zXE#)T;<>L{;6`9ydQlMsxebOFsAHl1*Xcnxw4mEUSKG;{%@bw;DEXxM_Byn`5%Zke zOgMpoj*QtiX8MYpzCO;-kQ$z?J)V;8^{ihK|HR;Y%usENtGsHsQV{KH&5oCDYuD0A zk;H`RMUPfZByef}30?scvBmR_K3$#&F%qh>80%0KE38)niv{K zNSAVz7txJ@?s3w54BLl^H*3`Y#FT{Jm<#>-Jz*m+`vbCcbg$2Mb)Jc;JMQ`E>gvjA z6!lTe3_g%T{*fIhz0Dn4vbuPiQSNwJbJu^}G{E8G6!(P`qUF4+@Fq}%B8IXBQzj^c z`0o-I%9^|f=?XjIVNAJNXhl4l!Mf}@SRU4%4`C!?YB z;HA)`^LG7C>9IKd_3n<$iVymoVt_nYCB@2Ez-& z>s{UHKgUiBEguT**`!$e{1a6JJ^6JbJHv?7o+FVqw8O4a@Z2ZM8`xE$*f5G zZ|9ub^%mgO#qYtQn3kKH&c0r56?2)2iFat63>I6j<%a968~57B3@0X1c>Xi??v}vp z@{OgP2K7D85aI0M=)|KblO;rV`k3lSOFHk>!E;R%#=l*q{T4`UW2q7|PZxBPHP^v9 z`1xLYpU}{#U~`qeg%DkgE6@G(wm+*lLh~$acNPYqKsoaE_PG+ei0wIS_5WPPApBLXuJw~3DeEWVdHM}%DJmt#b^;41Csv4#p z^Eh@i)zkXaT{3$#OSjmOjlf#&sukydDi#0kfOPgZgB5Z15P^9fX=4La@1Igq3}%|O zA@-ITT6glaN5Ij+SpQ>sgy$xSoZJPE{E3UZmJ7OyiW+#9d~(beC*h)j-6v^g0cR(q`R7E6{~Ne=MZwDd1Hs) zLpHQqqLg8*k&wSDQWt_=MP$LwvH=g{&3!`!Ss}DPCgO;n_YKtBCSU*Q4c}_`2rE)< zUGbmuC%#MFU+X8ZlJ2aYezuKD|sd)+ev?2 zy@~mANCK?(alz?d#>RMUME_CQD&9I`8qVO1T2ib@=s(f{rFVATw*h9i2`1$Ajua|i z4w$3_7RsIRFYZ5b0hNitVorW;e_iLqRE3~JOivu;fm88syU>A=K|A^N^I*C3!7=kA zuPpJPh)8xAH)cs){Azr&O|%jI$}8>wzwa~FUQ*1ZGhI` z3W!}RZnKQn2pRaNiH+zD&3Spv$$Pg4^hqS3`?0Y3L@?2xdtI1E8(94kuZ?aFF>XO< zaKS`{K6GK?SB!ysz)9rIWMkGi=bkilxffl+T|tdfji3Ep_+H85Y7C=sbBc(5mI!!k z+`S510|V_ZooAopR3BsTk{^+Hw!cAY`xzu>uhg(MABif!XlT2`*gmc_w}LUQ^h@F)p*Gz>j&BG>*VpLM?%SgXbmUO-~KF4VJ$}Wi=8FY3C%<6V^~K60n9-XDu$&L z%YzqQ5k_DWV&iZEeuwPNH+(WBozP5US52m~^Zn|-EkZ6-)w!Q-@}a_PO&b4{Ym zheNBj6N1EU)z-enYyJc3?~Y&{r@c!M*x(miUeI*R0?$ z9MqT9jGkrh$klxk+4td0EzJ#~FYktwa`WpdN=`arheJ#7J%d}V43bUVh#GXJY$W9J zriSdf8>G)lH0hoo8t_pjGBQCk-%P~gR!{}O4%3I(Y(5`}$EQz%6Ags^dpDrb*&VKhaZ7g_MNPc;)&Lo^1 z7{`}(!AK&omxMFU>CS(ciur zwF;btI1qPjubsN}tsfknJIcNixZdQ2E$jO@v%v<#E)%FEE1^yjUR#%=jne@%=ohN? z!^2E?lNr0Rd$LbAwi;iAH&EQ_E9VVOQF=(`?Doi@+vLW&{Jb1ao*4ty5iOwcxh_(& zL?$uTuo1mLDJ*wc|5QwO+3DX`?MmWlvgtUBm1a%Y;Om=JK(bHpCsj~lYocyUUBlZt zHJ3iVtsB+?*R)))#^v9UV?v?Auz9t(5#|}+k8Ic@NpgWlx^qn5=_Yn?7k6XXe0Z-j zJa6?6>o7cYRXAJCEzOg%A#U(AFKIRa{p%%k*DeSV24(CI*FtrNFBKehKk7b-pHvsW zH!L?$BaMf8_2>sNdv}Kg&iQsC!|5sfR`pWz);3j81?m&{8MEI?$oU!FFK8yvz}MU3 zS#|hb6N8fs+k6Zvok35~B~>J&DJsKc_kVrRS<=rZUuxd&^sS_GCvOY_hKkk((vQzA zn5~ve)x`Sfc+A83Q@(zBAQmkLY+U?ozkhbWJG}R34oc-2AYfh$ayK!{`XIJlop-X1BFq zd&O-d>fq?0Ek~0KP;mlOw()LHL4I9aFQJMS*bx^jI*eS;?|qH0Y|9te=*7Eld_A|D za?^6&crQN-a9M*;4ZfAJ*Yd%5HflI!r0VK>nP!>M^LrVN@1pZ_vSNqS)F#>AYHPdg z|8&zEe7m0Ek2O-7iGFdqMSc{zgQo*AQh-K@9@TV&hNkqehYIGXO-`Z=hKHUV3;OY@ zZTGxi7tZVzTBn*zcRs;=v!Oo-&R|p2oNjw@69$+Dh@X1MnU}AquPF0fNoG`_!pWwc zG%+7Pj}sZ-*c^kQ$`C{j;PMd7YaJa$Ir^t=MW3Z5GO7=kMDsISfgM5|8|b`9|KK1$ zACPaKaV_*bGrcM4chYaE3`V}vqAwfL^V<>f5C|&_%(#VGb3B}0t4z&|p)}JZPFu?r zx(mBK!9t@2&w6j8p?^D41Rk_skbDJtA_tsY0EPp~%L1BUqyYN%r!F-d5a6n5Z^a54 z0jR8Cbf309f(5QgfOddD;3y~-uwnnt&pFlqSL8pk6lFyEX|6rs$U+QwGDsY}RlfBk zAc1SsA*gHyeByFuZ-S~#Fp3Mt%M3EVXwCs=q|2rhGQ&FahzK~s1|B#ODf&*3sF}? z<7p@o4#N}%ebd85WzLMw#vp1g?Ml|4@6ixdLW1==R|mG&S13Fb3+@2ELd1LL(Lo z-}O4Uif7%io@}`nLMcQx|5HZsZsZsGk1Rn2+}m~cT`N&UF>k6i?GD?!C%W}jP1U)+|P)B+$5Un zOz?h3j0lcuqxk+H{g`tFm)O~{uc?8t}tQfCasO|1-~Mf7ZWuA7K_0y32yh4d)a9lFd%u#^D@2WWJ~v zbi&^k_YnGYY4&|}DygM*A@>mX(Omu4hIeIl3yqMT;{2e;2A*GTBx*iDm_S8;p#mp9 zLr%HPw#N|(UW_um`p;~|@*Zx-AK4>}Gx(H0$k{tJ4+h};!vka`M}~XUTqp0fMtZt# zMwmPmLL&1T|M#x~?U`>z|2~80p+v3G>ZV40oswa;D6REZ_&L-1|G8VZW|nZ_Upko# z?`KOyi}<##^z!asCc(Zy3V!5X*o}#U%-c#9WZoN(AAewxuzc6M2S>6J7fTsNA8bqyYRUKLkXyjB7$)Cnz36_tr zWC(%x(M(QAFs)<oSed_NVjYinIo z6CU}b?+>&J0kc+(`}V|9amO_|04de00E^Fl7(5W4Fg=1JT=@r`MG+?%I;8@9Of<!-}8y)N3wFnQgQuN$Xq5oeuL@Ed_^8JzEgIp!6}a3zs{cSv zY4oT3N3dnQW^bHeEUR0L85ABM!@TSv?WQsw0HDep_%?p@q7eO`yEf2gLJr@uife9e z?@0jnWB}l$zd}xYEfVBe-(I>F?NrFN=AxdqTtiA4sbgZ6lhP)^A-#`zJJhI2Ay1 zq(at#;#n+$C|_H>`>mGlvL^cP zV{73aKUQNjPh!$AJ?B2Y%`Ig`x**XUH+rAXGyu3Af0f}|%LvC-SDJ#~Y0p-Td#TB{X}>$`JJh+l6rh;+Jyjw%vU<#4M-=ksq7E5LZw z4@7KYOy3+dCCY(`aTOZ$gE0dP#s^@NT0ZhtH&^%}a4J4?bb56lC#M zbd|N=@6M!nc$%yJd4qal98@dk9Q(H;4;|jS@sOR$<`#A=$^tF zyz_87O?JN5=Xn#v=*@xGH$h$>S+AG6vK+PTFC7O}M@K5cvZfDI<+U?^^_Yv?0jb>AI)XYjoJrG(gu^cCLP)&(v{PadWd;HGhg4g^qFZaH*5h(Va zV;W0U7N|!}j?m)W92e>F@#Ne35wF-ESyYnPjDHlXowi9>?kIyi zuxPHf_Xs2$DRDZqqd)M4muPyhXU$6%J{z8Ipb8c>c#*0(E^QYzFRo_+Frzzc=Icv0 zT8^M>(kctcWirZtcv8$+7s*OG%jS=#SlnSWjPh2ElSrDsWLfgBtRScF|Iqz4gKL3HZ@kVfL;Vpxg?r&O{S+KN zySwE_g3>Sw4ojE&H0h-xR3ov@QcrGHmKjh#YPJxyCMg`iWmn#}^@)I%(&jD2y}E+& zrzfq$cvTM*S2WPqA8%?G%=`cv>o^o~W(`QFO3lf0Or02gw=g7(gUcQo5Wr~VM1G`!ofy74KJSMZrgW+-ZM|+v&}dZd z(0djb(>0gkP@JAM2X;K%IJWc1GVEq-=xyA@=aww%he7Cyki#W5H#KtfansH*i8?Sh z3-K?;_n)qAtOts$>#@z#Rcza9_Ri;c!toh&b!ueZ{;PnW=- z4%%F~T4tY;jV;{v@IBPus=ROb63Z87F`=*f?yTXaSEQRw)_Nc%#f?@d!!Mx4Sy*Vj zt1m@mO=!?(;E-p)kuyg`Cw4I5S!gUW$tLBda(R0>wxsS2rwVZ7${utk2GG({ysXu0 z<2f}Zf;zDnMLy}b8Xiq(^!;&uYVMR`7_KcBg6j_cApuRgR8iF=P|tr_e-zU#;M4Qj zArr6HX|x+tbBtDY=AofD>!<~YcLElmDR@8_Gd#LIk~!McUOQ+24f`VfX5Z@?5a#$^*v@?<;{#E70D%a$c9y^*a9+);16s3@2ihMV%YoOiCb}u~m zQobPEy+#}BhJTVDvOI$IKdp1=H#T{pPAZRuR{J9(n&bNy z34#tm4^<=?f_v1 zUP+NeJVVn*I{pq6L{loE+Ddv6^N9= zVGQDCBf>2fN5c`^5Sesh*f|~B8|M)kvz}TxFrc4EgNBP|=O4)vvFmnCr46`>dT)K6xja?37Sm=egBSDdN{7 z4b4iUoTVC>N%p z8_vq)fcobb9;OYjS4y8@fC$a&Rp;C(Bzu~E`ZN|)liPpU(VcqV*=@9UA5B>HngsR~ z5YiQ{V7Ms)e3wO5ZWqIOkhBY4-kSs=?J#DDZ!j+s-akX$^vh5IYJIQ%Bq} zDJ5_75{hRo;Jnvo%$EwFYvZglMs$woba^t^lAm${?!w%ZQdWg3D*Aw=7mjI>vB&t? zu$uT@EGfE8FqZt|xKFCTWJ~u!g#N#@S3f;9Ts?@X7#Ysme*AVXtnz)puLaS4-T$_t zEsI2ZiyjnutU#NJ#g=)ckgLV}WSztL61D;2U49j5S}2A^nxA3fEX$6Dg#I}F+2ap8 z$2lv#;1V|D@kA;6_fwj{A_U8$cU%~(5ybl-;h?wb_oLJ9y#SDE?!Vt=I8*=FGEZ)Y zy(h+yxDI3s)W;4?^0U?+cObGT3Vhq+GLHXEsV?#9Ts?wOEt z=f6^y;WHUD0 zt{P3t`y0=`I6(S`_4;f4CLgBm2jlm~=A7b_ckzYNq^n$#n~p)WXYbj#f8t5_3p?+W zAvrh}`nKZ{cpn;E@&NeK2i`s1L@8)(GU9;!!sO*x%S70d4X3H0VX=a{uBT{W3+mbE zpC1f6Wj@c89a92)$-ip(iAKa~G|eQ?X7p2&Q;Br6g-Wpd@ zVk@H`MW~t+I677yP-UVXx9@d+3|$X>N%_~qLY1@oifm2HG-aV-dZSoTzb#aGLbAz( zm$YKIZTsL<)RCK-#4zxhv^IaWGJ^96&G`f6!~M0p4EMhmi>=W3e2dNcY+uMD+k|a5 ziUS5TfJ)a5PS#*44B30YnuN0bNV>54>XGl$^MkH2qL+L)|E=}w3piu$FR**D>0^oK z=GW;XC3k0JqI}g=O#^$Z>*p4*P*&XS8_ATvI*C?lLPxvGKEyh+eov5Q$b8M+ug$f^ z%MfYk512pf!=P@?xDC{F0bN(Y+AJhRTYy7ic%hMW@zRd%ugPPewE2(FgsOkP8cl<* zq1)J8+mE4$H7ey~FC4sv3sjQP$Y#QO!uSrJmsEo({Grx zK*Sm&pRD}H2WA-p$7OD6;|a;cFk+gp=L}E!bwV@0#2Zp91JimxkeV;x zR_;(`9r1~8Wt@@+Rl*NMy?X+qGO4dN#=P>P{BLU(?@noYU?BhrpX|Lb7`x6j@uCRe zcP1AX;9@1L+_N#><8sXR!m#nb$S{QdUeAa$^^f}T9ux)mokPw7F+?9WQmWxY$;vcX zr?~cGW($8c7b7S199r5=>jX8e#M`1pKOP$;*!AH&c<1%Adr&(#2Giy@me;xQ9UkVl zV99~k#wX=Mz5DNa1pZdq%4_gDNMZXN7?!lHMZ=h&s;rEps9~{) zFEdC6b5r=zo3`zZwKS?dV2~|emmIHczDe$CeKCQW+mFtisgc-^wt9kzyzBJvvAt4| z5H;+jWS57tt6cPlxox2Fls-7~j%$1xWCt8EmXMEdr& z>Xj<4zUWSNJS20m!4EA_S3z@pzx$ND<|kG6kvj19XLS4!=MQc>G>PRDk~v3AkA^B& zIur|kl zxu#?CMI053xI=JVeET{2OE9&H_T_n0{1U@Mbxb6k@#`YqM6XV?qj$a#nn%}CnYYzr zf9J2m2h(N+;vk>T-sf&)y_tTlcMqdB?&z`Q`t;>#8a@aSe0hk2#6e==j5DVhDK@0& zP#eNPsT@)w@C8oP?C zDJGqLKnZ)HnhCCJmo4uQ1H_JccZQjz2<^;g0>F_#Cj1OfR5G}vw%7^^K)>A7+)@zZ zX3f4Is3Sp9lEn@7tN7oaaH`5|!t3JR8oXODgX0B`SB-%L%JXEDUZyi#c!Mu$#MeLz zX!sqKBfCvX6~t(KD70Zep5>*~ix<8=2Nn*KuB7t(P$Q#FU`Q z*9hBi{#+*cR*k|Q#@^{9W@-x7jO?6PemH}?HVqQ_2z>+uaQ@0&_~!B^8pc+-6`Ma~2ZzVV1W z9B2pw0&6HA4h;KCL0la6aQt?@^8M87b&mT_pSkMya8){b${gPO9G`U6*8iRO+uP-O zcrazBwDP#~bBgA)$0Ko`@x&?BlE=gILIl5GTD4!KJ(*-I`29lsS|Yu}dHjXd-fuNF zD-0X?Y^vmLOg9|9U%KaSt#$*ZUg+1_Nh)@jnED5m8q|yCJ}%11v7Z55rwcWdN8CA@ zY7;cys$xnC$#3EudoKaHpwF7VN-YNkr1|LZaXFa?c-C!fSel-)fR9?t#bwL4-nId{ zC|tak^K6HdUTrIh26S!n%TL9Sn*Pa1H3wh4wQmjk#^s>UYRwJB@A}miw*IC#O4HHs z+-vxTomw3Ejn|;LF`gM;y|DMuskw_wnH)BfDlZz@VBN{vvG)qxz(LDceBIk{wCuHk z`N7Hd2C<#7r$#qP+tm)uAR&GDmDj8E2%B-tbNWqn;?$_cIM*Gz>B6tghVqTR05(*f zt}j*j^BUgJ3x%INv2mA+5X&841_#Ne6DMK}QTA7MKWC-6`b8g3G%a)+p=+&vA+cYdJG zOTGB?+!(a$wT{YHPsXxA@p(z^kBH|4ya8cM;u^MSHucIigJ?HnFx1Ad?aVh}zp3I|1b$zj+iM@~C1u{8Irfqf$|2Ha+-5^631zkY=Mq#^@NZvQ zjpdxOY@vLZyjyqVq9g=MLo-x;##laEWp93@i)Mqo<=F~4KB*o~eFhDC`=oe?$O=1j z(9bgRyZJEK_heyD6qp)zPe;*@MACK&+h2Q4EaDs<@>>l#Bwra_q1gDB(2ww!WZ18t zvG~mClCX^0m6IK)>>qgF^@L#mcxidy#S2NgbMScgGA~| z269IDtCE3LTwe+1W5k(+0@{f;C_oTmw}Lr;)(yiz>P8H9(ri?Q;`l6mYsHU^c0^FZ z7{0SBii<%M0B@p)S7*%eaxv@kD@9uMm-YO4!k7R zv$}pNS8i;wm-|+1`DN0o5FrxT@nQp%U#`~Q>*l-k={iJ2$QBF90S#;SO3m<`NqPpI z3pb*R=?i_sJTKw7W(bJ=#|%vEw&~1}%2n!SJlUAk)pY?5Y^82Yefl`?b7ELl2UoVZ zN-5jo$NbH1hUXB4#~6M)QRtc{IQ7|Jltg`PTD&sHSOjRcJ9u}?PT`H97%>4*V92Xy zkhJ0iwDz^y*`hdNNa;fFSbu2TijVDpTIMRO2zP;EIFo;X6XaK(QJRG1L8A-`a48v0 z?=+4bAh*UlR7Z^Wq6!uyGVNGAe}N{(Wnu+=o@O#IK-es1iTZ4!_R^=t%hk!{=Sv z3Y`z3jENk3k3s#jcp)RA16BTSzej>H%ooI0s))auiDvg4Kd{e}r(4C-W(cjYpOt{q z+z@GP@Glvzi;Ot8q=O*sPeXLE#iPCryy#V!EW~wh-}5xU#EZEDQEZJ)*pL;kj#q`6 z&ab7g3XMl1j7GXkm2jBu>D{V%_&z4c1nY=?q@mad_uZ5@h+%D6?dj-IvMeMfBF{Zz zm6w$V+M=1sx%D+(vT796FT)#j_rZ}9_pL%Ghdm_wPHdJdza{TEv`9LqWEnqFHf^v! z@GF_7sWw++3uSfr`D0JtYPv`59wV{Im{xkiW-H@}b(V-w4MFea zOQQf0iou}fj08_m2Kq6LHO+job>RW9D}>@I)aka^_75&K(&8A;LIW~(JH0FeSjC%W zWK04&0@1*<=wL%^SWx-o6#X;fYL!mvzB)w(BKBAFkza+EHECh?Dqnu$)pGkPZ-Lw~ znJW`2*iymBW*|k5fhL)=a7@RYbCGiB< zi4W}#O|TEIBz^W4dx8?yXRBx%!;$w0ut0>CEKbd>rV#EjSl%}12or4QTxiR1W@nDOqRV%@y2`GB=emahSTFmf&HJ2fFw|GcRX@ArS?N3I_FK zpakT&-DD>mmVJv)m1Nvr-JMrv>=Ge!mA~(*0CvyLisTZ(LC;ADBZ8bN)1!9FK@DLc z1CJ;h4}OAXC4H3>o%G2L$Wv&*w5;t*-w9R|8X5C9R6I2ud{t;DV3TUb?+65=n>=AwY7-I&8dG-?sni2nOlaFl(wrd^|!! z8E@Jzd_EU%l-HJ#N&%S+YdH3hY46t_gc+vX1x6*WCg-zrA=;xwJ_Tqe1e&+xL=Iz^ zLgU`#WM?xxE`9n;x9ZLVW(^aUZji}+KcNq0+ywU#7%iiiHuTxEV4MZ($w>WWI<2ebrkocF8agIEGRS_#hzs#Bt57&@$KAu1RQ0`Q zmv~y^W6A{MD5$?Vw}3iP>d;LETVyUb1-mcNTnBjG!-w(yy0K4KrBN*S>TA&WlqgMm zIq>}69~q2*8-yj@T_#9i?R{5<>LXDhI0JGR&Y>(yPGsR!5oOXV>}=#~7Lzp^*sv_z z5br&FHYDd`m<&slM$re5us&m^YiOI}m;^5*D+u!V8=ZzuPqF!3$TB*P)nMLSV)z7%yc3^LUb8Kr@)$2w{K5*M^7ejfF!_WJBDZa3IO6bWEcY!UDeWnf zn`@}X++$kE4T0sow0YYx56$(UcDUOs9HjT@We+HI`FAep$V3rJ)b8r$uvuXU2cZ(%#(ZT^;>X-pW)J;<3Sv@sNMp{W$eniKi%up956ap0#6Nt-KMNJ^54CYxAR+#jP_^3XL~-zQhR^YM@x5k zxnI?;Y*!65^R4wWFQ@I*=s?m2-gCsIzf&;kJ!^0BD1?!S7~T# zDhNlGX-1=v>%Ov90dXb@r#lVsVKNwRjP(+ld;Tg3c#F~BNnog|82wzZb@ zi^saIEf23OWH({PwKS>}cO1mSMiZU`wsVQmkkml;a9ba1ke|^&mQFB?FZp6LdBc8P z3vC92!BZu9dNFSHWnY{F&7utXMmwcOr;j}c#t5o-F>SWjs5&%av|oF>Y7-;hq_U-LASR8Ea(^g3a+ohrNM{c6avgBbC~TbObx1g^ok_W=D!hp1 zZ+nXxV_dm&+lLkl=x(*iHIlP~ERE1)kpw0r?LvP*`rf!zx*+oVlbC|qp{~B%%bzzQ z_4aFbMx!Yx!f2+AaKTl%lXiBGJQ>SJs=LZvqGu~?J7<{r8SwV*VZwMH^3BekFxGyd zht1oX;=L-!44leMhfm?erS^^GsEQAy$ zC@{=&AeYLX-~*wqN*}SkH+!u&?Qwf(b&^}mL;NiX@*wA3t~q(WrOAF<%`E9KYIs9W zD~H{{UJ4#*Linb-M(q)gE)PzH;bzabzVJI_zbr4a4U4}%EIw0sp~Z9k6E7lbJ!sM< zr`~yeE^U|krGF-WZvFboT)Oe#UUxmhZJ?=`RC)GirwN>kVe~z2mGFyRSS?2NaU$Ck zo$^6Im0QlvHaVqDw}kDC;Rtpw^*w!9T9lq|pml)I$+{@VLs;e7wts|ee`>hU?diO# z^78L14g&IEtjDBp=c+BaXs}gq={k+bcqbY!Y94)+alxrYTc5X3Q>E87`l7(X!>eXYJ;KVOUTbtQO8};q-KiTk( zdOn&9#rhsHSxH^Wg-UmmqJF$D3QUWtwS&JZ{gYAy z{nt!tQ8Q{Zo&)gZljyR6Vg;4@+#2=ZL_Xd$BMsyir~H%U)C|sPW7779^Y8*rjr5VAjX zQiE)Lin6+OOli?~HRTGUDALIRqKvxQcqkcH-3!;vRpK@~IsDG!Hf+VQ+4uNWE4z0Z zua4|T2*2WsP%R6|jgZ9)c4J-x)K~YB*ek}rl5CZyDOk@jyEu@GlSKKGjpU{Hh`y9z zn^Y5$^{E=LN6mv#>~P0RC1WBf|vei}ZQCMFHJAe$rnGoJdkzilPCMKoeWv z%|kM@P{s`*xZdI9j|qg5n81EeDCCiyBeju!r$WKQ{=v=Jvm%Wn$j>QOI99H<0qj_O zIm={nE1 z_ceE~9a#eioH@g_lb&E0#x<25zyF@5=FFpM;vb|ZhQGhOw^vl?VSnI)NHL?2W+*)4 z3XbMH`XZZV=?`zKn3J0IWv8rC=h-rpYLc}vIMKm%hqvzGBtQnOgK{C^ACzmv8uIS> zJNfCy9ouR6>8ta56;|Y78(GD%BIAT>;5RAa2hAImzsqxvt8)nc+pq%l{+(u;gt7j; zmL8RDUemd0ao-QW)|^Z}_xo0tbj(M)d;7oG4C7Vn@oT7~XV_2YGn_kIxgw1cXgcy) z)oRMKmL2!7W*DFU5r4eezBrY!AMDqjLZ&xVtvewMMYN))*O?pi0$0At4w|u^B=Y_bd$%aE~8%7 zws!l6b6dID<|&8pxi*vM4^W4R2!E#@;_CL;anm?(p1tH1YuxdHmo^IC zOc+f+pBI{uH8{AtMLt8L(ShdwV(2AiZ4Pn|fY)N3?QYqf`C&3@xS$cG+*hw9Iw5PU z_2iM_(JdbuRy(Xi`W5uZLQQN#BgR!Tg=jQ(cw&mCik0M#R)awUI5H7OnJ$elVxbnU zE0;X1*QPlP;J;jH19&~W=55L!Y|lP@`0(Uw%tNYmwX#v$!z11gL1CL@%r|@#JLD+ewr;ER&x0m7-)LBp_oHOit~Vp}A4KZa{9A+x z4kT5m{AF)eJ6OG0(rDTn{cp!M6hL=pzdF?{4${DA9T&%;S9-EnS4n+avZD@q|1c+(w%IpV~QwN%sj*f0bGIC`f|8o!If>mHBxWC>n z|CSaVJG=$y{)ej)1hT%fj*K)vSWw7+n(Fr2J-kiQkO-iu0`mM8ik^A;F&CAu?;p#y zJ{V*e(*102D++=D)R+RS{4t`S$M!R=4aFVJJFyAXQ5{s8zTqA0L7TJTBHMo}?Kgu; z^xdYK<}lql!I4{byZ`hL1bX);N79`cxT^Gr6R&{;`1!|OxTijQu0jX=H}r=$56JBN z|K-2aB;E!<8G*L}ryi^UTD#2;{`&?X!2fFnfIs?EI*`jKss4ih9uPcUfN%X2aP=>B z7wDVp?gjUt+I5t(Yo#szZ4E$A1X$PCChV%Wa5T-lWTMb+=Q5SB=HzX+O0EITd#mXI z`>v*yVollJ?fyI5wkI9_5kVD;KU;>c&Jv>8O{eKfO$M@_sKzpysq1OF{K)-WiulN% z{Kq|IJV_3B$P$Zy9)DJ;SBr3kTjk|(uD@?td5>_FZKfS$x_L!d5RhAa(jo&6_TG8$ z`_;1u_cOZzF>hnE&XNO)zkYs0;hF39qx}i@A8dzZW;A0@r0bNP_T91=K_O`)tUuSU znHJgoyOa>|WT?D*kz~Pn_+ZkP5jGwjrh@vP>x>(73~&MFQgk#&WsPr^8XrGlN^X(mgw(+;iTdQlILc=ma?8^`^1D`_>Luo-BH)Cku9!`NF##no(ao2PNt z;0^&ouwcQVaS}8H2_7K0y9H=0I0Ojyw&=pUva_ROg7lY+{lTP zNmNPpno%r9p?HUbs<<)kchQckT+TO4%vwg=78=CrS~c39C$N*yo=u?4C=4r5yTQN745(O5KHj1X{P0>fBJ;7;uEA z)SpLb<|^Fs#eA5^$*HC)FvW*dQ2NQ>;o>X9L(1Th_7u;SjfJ3KWS5oi9W%@AQw83a z%lC~BqcT@ykH`W)OvvQ8%xT#^L^?RrQ)=)&4gO1`MJnqmIMDonBwlsTP*QKH>>8aX zM8A#H)`6z*no*c~>-k2u`0+P6*TCnoYboa4Uhli{ptaCGxvFuM;z^Dyp zw~=$u^28&d!I2`qQ#F9LEz7zH>6tfGS*YCij$zM;I6T1go4F^qq;pWOR&vzg6|s&o zIfv9FIj~h_X~)9vt8jcdF~4V%%#x8wY&tZ!^lcb!ye70R(l}4oH1o=;7*k3*8x4ZL zDB}K&9!_b2zQvq$|5XPq8c!E0!n*_xSnAC-6#_>h-ZZ%C^|(Xm_5r@SvUD%(<%wSH+OWnUs8x#vTu|+w)_o++6LTaPyC!bQ63Rb8lSP`GM)->eOX{v z{)l2|UR%cSm$Qpei#9dzxlLX?cxJlQoc@|79V{qJ?YY0@bn7Q|E=1jSY-e{m+rWY^ z)*?Ya=qgAv6P&g{G$*ode8R2s%N8~++v1w*J!Sq6_s=($01h#BuppSn6V8p zcTpTzqpf}!R6e7!!=oBB@;V9Q#XrIVo3G1ue7YFT>Zc3QzpPYYxVceDSNH|u_1mV< z#M;_cRc(&zUg^r_abIu1>5onD+%%yIn{@*ZRh|+R_K$U`@q?yKLbeG$zN_WUMJ4Ob zjes(H_l*qHoX>NHtP@ziD^)?9)~eu29!1k?6goC8OURxUni?EG6ok@DK}sF%$a|TP zs2YW@bf2TO8>Tg7D5*D%Z@bzSwcglL+_F1UVC1)}bup6yuPMQY$>7#5s}!4!j`fBC zZ2$}wI#j`286VxOkyeYIoM1geQrK<>SpD-iPI|Qbn6b3Zp#gn|FxtNc4etL0FHEp? zw<%`j)Njxc*2~@UaGAH2$O5|V$K8=H)xU-q&4R9vgf(uiW4FGw{${ShYPYpV%_Z;b`kp@g?>L+wB%+R<-A|< zZC$!LI@5{^6z#rExz%|NIjB5lKWR85)T=>uLvMaqSV{hj^a~Y|RrFm~Iail}Dj(09 zOnpSOZ@he>YTc9hPeq;qRv)&%%r#n@&*#5;Mt+x%16xAYY=;M*lwr)v+AQ~nD8P5D zXMEpJFmENCwLZcIJ2Jle5PUzq=w*ct$CBBCTk+`!yhl>v9& zyS-;3;KA>mHk|2tl1|j_{Zv*3Hgk4t8W{2gc(Cyi_qn0{N*dK01r)d&)L>wm(WK%; z%Tkz}$F(GH9v%Av6V_hSXTqUxgC1d-&HggcV_JKC?&bb7qNLvPEB4JUz51lNH|<@+ z%V+P{v?D$-g2tAJLGY?b`InXnN9!;5)Nd^pLrH=r#-L*5g5=~>~Vz8KaYAs8g}UNjs9qr zWFZ&nR8_9G@>lI1Rs48m0ej`LuUC&gdeQ9DxtH}3bgy+r%T^32cgswyDab+>;_f{z zfzrv`BkWd*r!g4j$!As{u{^9J3qQuT6`PR^OC=YMyksIVHT3bjv1&MJR4?Wk(iR#3XC^Oto67dMhO6i@E zEcc8r@z!+1nNKFD7Atoy$h?#7Z|EqIV#;)KYqQ_0SWLeYWR)_vaN+n9@%wnsiQ9h} zog*!Y9WFF&i>rS59`O{vBNxdHCnp=xn?~eN;R3Hg$1ViJcsPKM1)3#KjMb&XMbh19 z7l~CSd(e+c#s>%@LdCIonj1bB66 zV!^0RD|C*c0aya#=~LQBq$Yx(8x^GNb*$aj-U<~*lcvw{G6A>zo+mX?HATRwklcC+ zk3?Ea9gA~dohau~l9hc$zivOKHJZ3&sI1j{jrKhZr~tgczx|0EpHb8s3ceU1vDEwIu)Zk^{i5kcZ} zP96IisZ7(`JTOub%1!dNOmDTdm0`9X2Q7Dn1MssHv7_sClf;oc&j>1!8xjMQ**NF3w=;KA27i9&Fk&lqTGGx44$?Le5v)Y%R7>+2Of3k%H zN}zzl^m1RRt3c>);#e?XS;h3Ayy4Y3A}TF-AnoMSRJ|)?B>YS4sw>9_ zB_6q%IrK(8Dxcrv`OZdyN8$J|qs$xXbnHYlxN~HFnTxAqo-nYKI(mJcx(^}TW*Bi4 z|J)~cEH_~pDBwzE5wot+bHF7fh?~382Dqtp9fbnWmE6G<{QI`k?_!xZ{d}jd^j*aL z;(TsUjB^|{P{5W1*LFtXpi?#Y?Yn*f4AeW!J6s4EK-v7!Tkw54)LwI{lI8=d>YE}n zL2)A*JeW(ocsr%ZO|Vu7PC}e24m3~21nV6K5M=o}qouI7aQ~59s+M03$m&4nxi&R& zt({XIc!PS-PgW)O<(*B*ho7&lM+Av|_#ONbyaB&_j4b37L1iRp?-NQk_5mZzO3?LQ zU>sk^YeD(@%3mk3lwF&YU!1<+P$9#!9fxcm>5Njvz*qoofZvVb#Nm}7di>6;)XHZi_^i*81Tu~jO8Jf(kQH&391;AGaGvVkBN}GCrLdzz9G1O_{v}#6D-keMSTbwnfq0ldI0*yr zJxjMHly8XiX4to=pIPNvVm62}23IEJr=6?o1mF;!1dE(s9;Uv;Nbu_1#iS>hmRF5m zE)PHJTU`TftZpHqXjaMfsYTizRh%j+vbs1=aQ30VlM=Vo+Y*uCJdr;N zM2p|{azOAnju(o{es5eqiJ6MOBDt>rGYnf`!Yt@p3%eL)n*U99N#SFM)4H0JU~X zI%8B?;*OP4oN~T=xwCc|JJa2zQjK4VncAHN^YLKlc+ZyE!0YJ7>dkBwZ)OwnV0q$r zO=*s7K{W423SP(?v7XP@@uPtY?9ax8Y-lKy+eT&qan&)+j45s<9^6Fz3e)|cwPV%O zIs#7(I$rI{X?@H-xk5%+g^V3813oFfkbxvSHqTJgZ!G}q?TI65JqBe8n7FvxKELJj zJ6q8myPlhpi@}n2(YU5d#`Pftv#qKZj z-NcnB^)XIj2_L27O_M77+=b;|TSDS#Ur>v1{-IretITZM5@Kfjf z=prqA=x?5;J@pIWgQRf7CKLGA?+4gWvl?{x>=j9;*3?^s zB(Ao+=C_CXQRKW;ex^JuLTL2eR3m<-}ymAlkD<>5Q!xCqiwZiD{xM;3BbEEr?0vJB-(zWIauTtxCQ0G;4z451 zM^6qBk*Z*N%wohH{IyXgw_(c2Rp_PZ%A{v!)_q?$rnHDr^|)Tt5<$kXE6KH0 zsE$&9umM?hRcpcGUQ6VxDibR$r1cQD$av8bkMo1l9+i^|BuMQe(BVK#6rSC^dEC=S z-O2kJjB69dZ|XL}K7ch<^wK}4zhScX)u)EApiq0;P99fw=Crkd5W}gAoy3s7W|c<9 z=P&j(3&jqY@7on#sh&j>IB9b5QP3UD@L4(<(|EgsaO^~Yr75SOH{XsfMc*0%a9S(gBS%xUJk-|P zfIWVf0!Aj!Mnc;A{ew0bb;+&&~FS!bHjtmVr|1LlbE^57;L}J;>!`hR~uI^v7q=C>rC&v@guF zkUIv_{N)?ji4Ueb5&Q51Qnb^!V#CN1^sgOyHeWLdu3=QM|Qk1}= z7zzH#7*fV;Yet`0Rwj3SYkcT>7oRaF%;#!hk-K~$zM`S*QB%`$lFGN@inrQ(7LtkafkvBXkSJeHig`?IMY_Qc~tG72h=Xs`#Dx=XwMRTNAvuwg?tJ=Z|gL;aa#Qt z;+Hc9Gv(2=!$!DXBC#roeOE8~1T0uPNCfw4608b@A#rh(;z2`4So(OG6SHSQr=cwS zO65u%Aa3&0RB9y}GuoJ9xfpb-vr!Yrh}%3Y=&DKcZlA)a%v5qX75D}Rmm_?vi!zh$ z$x~;HQ5*V;+2xRnO`?z*uV$U0ZXn9~1jtK}z+{lR4=BL9vu~yuURmdc z#OS(3`D-r4^kG89KjfG88_8ugy~PdC9{j-mMxGAubi2Q_E$to|F0uO9+hCpSkE>WP z4m2zO(8|fQpH{CD60mozD5~uWyT5!3iGm5WSY;7X6_pkJUJwDDqIuv+WBAac$56?u zg9anb<4&;_)412RkUOre-4P4CTae$|`mJC=b4G;;jhA^ywuxiUoD04wS4;T!naXk| zpv~}sRM&%a&;hre473zKEjg1+VBXA%X58-sw+o_+^F9E1FtcK zhnxGldBrb%XrtBQ0d3SD=N~0+4Wy9J%p2v$V{a+aIA&jYnqpQyDaC3g9Xr&mBaYKs zA2boPN;Pw<;s%pN+nteOEUcb0R){BQB2i!=}7S zzikFBD`IOu@JC>q+kMGLtt>EJMNJ)P|M_A5*t2Vo)T)fyT9C-}7TEvRi5-HLZ(fyt zag3H;%Ko;NBQ%|=@U@QX?hdV=dY6G~w!ON?hl_vL0+<3z{Ii$L;5a`JqTOTNt<&J3 z>%JP1?~>1@%U7$8Uav*cYx<^%M*KcW+MPMt>jeMS{t^gcIDSP(Z)$Gl(R_ zK~nu~N{bq}%Letn>g#N+dW{r0YP|0w1(v>3Z#UnVz_DQmGRWCIMc05FM-K0^w5Z}^ z$4T+qOW(KoUnP0&GdTQ*O?kjIWC@LZ~Ox5@3eljsdu4=DTX{Vhm3T-MBm|~&;_|EtkTUQ3o1sZD8K)NbRAg# zk%~w;bDY#5t*=zwzT&IC;Y%c=gvAeZf7&x~R?i~*r~g~Gq0>#vx(JRlg0|0tA}QTy zkurFaf1JUAmC{u(KF2j;de;(a_gOHh>`Uki-Kv&1&LFrQ-;eaL7Lc3D3>6FqR$R6l zfdi9~HZqVO8j93GhV9mBlkl-amNj8}kH|F~V23x%oU2edso*Tv`MZfq}8&*YpsYZ(6!Xwa)IBoX|b$wN1}XmQ*vzS{Xnj5mMySlt^D5VQYx&&5q(v zT+OHYD2?Ed11V&f3e#CUAQJGptq|KUCu|vLV|Z^2%b|Dcva^s#21KZ=%Rj9(*J&fe zwrUSZQQ09MEXaS;CxWSyRFMH&C_*59W9H+E<^3YUq&pqd?bDJ>Gq)(rJBxAyRK0 z-Y2n2FHJkXUHr*84r;Dku*PR9f>ug`v9s1CAD_<(2~s?x`W16mj{=kPn=s?2)-lEf zAC4onKKq^kz-FFY52M!FnOwc=)wm?aF@K|Dt0?p1IqqrNal?0>bQ{&jol14WKy5Fq zHbQNJZ>ohPB7HYi2`c_|ppy@fMWhQ=_ZT*SBb!YUZR;s>7gzSnTF1YK%NOO<$3>GvF zW-h1yByL)P3)Clf!;wR}Rhm~dEHUm7oqz+=Ki_(Ff{c*KyE{`Q!QygGl&Hb_=J6fn-C=|ZteuHOx)>lYMPpR`Z^on=Fd)x-b^8k3K>aaIxWdf zoVMnZgM9Eyb_|bSd@BGfL4_Yfkv{`4AmqE%c?gfLc2dg^hm!jDn1$n|FI26TQ%iAR z<~Jv^e?3SgijsDq4?WJvnku@R>ZkOtIrcXFPe=cy(-$|PKJQzRONu&&vNY|^c!CP= z+*W#*_HhERYQ*^{ZLwbxlLTBxHVWf+RgBpHK5>n652mQF--6uQv<(rkwOlcmD!aSJ zN`)F^jau!6s%MD12kyo6{DFNQe%8qw$%Gos%&aNmo04FkrXL#)D;!yOfBVoa)|FJV zsyrNmdJSZ6vk;}(<>A0A*TbJN6d=J;i@649>P9s{@TWYzN*H~cI!G|iuR7TIW}*-Y zSv?4cNRPtdTq;d!UUEqtoG-Y>KF)$>9O;!#;WKW0^{IQYAAid?G);K={#k`z)>Qf3 zRFgo)C{IU>_dnVP1S7x==_3i?=915<0j$a}Ir~H&I*32ZHTwhzKGd8wo3FqI@Rz3O zK+(Ff*+KBrCcu*;+M7io^^Uk#zwmHY|Hugb38MM;U9EmBR`+b06jbvQ&->wU8 zCa3sWtSi5PsQb73owu83Shbx@|JJ>fjs^1UaHA5j#!8EbYq@yZeH#yUmFz(ptAQ9s z$p~fk85TsB0Y5ccQ3ekV1ARtAdfZ~3(i?Q{;{n~Giyv!O0pWmMV#7$$nJ=g>R)a|)B`tq zIZv80(XapS#^{3BUUrS(7;zLIt*wGI+~&DNz)J% zA|gzv=U14866H$GJLVJ+?`O}SL(_9S*j`Eis3Jz#tMUgin18>aPqgC69ZJPm!VI5(QQb6eMs zo~T9Y#vmm4fB8=%1~p|Zcl-^OVoRWuDHgEw$d*!!sf?^#8wYl{$KRrOEqs93qG5!; zbY(6xH@oo6-)#mBnl4O4LHvL#xfob!2HLsNmU~HK#+BvT(dT#^dG2CmM*r%BTEmhc zdTu-APd4Tc5B*_wclcGZ z`<3Tp4vH9qV2&nB$?8!)JLoX?w3&%-@>ssMD`-$`VU6z}(geWB@7~`mM`%LvDD$>V z7s(6;S{V+9G?*g8a$`YmnX|#n0)G_XGZk($d#tg4TAG#DtoCi~zq8s7RTaeug|ws+ zw9mdXxX$7QFPeaO_rX4y5>&YIuNmg=Ctv zfH)BvKbN>r*FS=2~B=| zQ`F*Qhh%-ss1FneA7V{M#7_Qunan6hwNLcEHAhM_1PsXO zOLo3oW{IP9QB;DKGRPI-OgFX9-q)D{U(N(}qsQ)y0cBL+u4Brb$wqSaY0w?2)fW;J zam0J!m-w3JQ}xK;VEnt3wi9oauP@fUj8C62;s!~Q^OmBA>U3h2VeWBRM0ArL?VDTb z@I3Q!CRU3lTV%lI;`Q!&nY|o5+Z6pVy)ukpj}yCTkF8gHShDs7%a7vn;_~Vi%jc@? zD@xLPvr}4ATG>83MO&$ay6C>Qv8x}WB3*6bzi!0B96BV~vmA7FQ_;EHdEI~L24&2@ zhp>>btjVe6F1YT54d;HPrG_H&<5C#OT%vsqpBWEFL5BO0n2w$mY$l$hhklAO$p{5t z1OVmrh%E4Vb-PG^%b-ETkc=A2y@{iqhg+kefp|d4tq=%2~0&^gW%$w%uH-f7Ki0KuI^1L+@0l*o+bQdsPMcQ#%&WBx89M)(4gd43q&6fZ{%v1IEH0^AIul}6&dt`>A@O5r zfXX%h?EA*_D!R&@4l*>knII=D7~lG|k@p6N?@3e1!sUr^N_G z!uVJ|!xPs&F7U+1QRjYcyC1)#>qkHD+k1N@ayZK{#RmTM3BL7Y!}PcUGc2m7vd~2@0k;h zd~!xV#{^$RMN%VCAzjNO{(w!#=VZrkW|EK_5XSAO|9_)8iVVW71s`RlK6wVEV1W;?y zfG`HDL4wsE){|Xi4YFG_te|G*0e2}uvz0b&VGpS^5par_bCTIJvaiVzi3TDZ&o1T| zujXKzo4mP1XIIQDnKpLyVH@Q=;j=owUnIAg*b1mb+zv^Yi@1tD^-{P+a*HaR!n&!j ze6_8F3Hh;y4*3AU$fcj_(x5#Nsg7_f$|L}#ow5p0;KM?F8!{1lQ&f9m!tn=NymwJM zORRphBZkGXX~=nStZ+W8DnqQCM8Gmf zslzF%%L~irRx?J#G@B-eo1<~EbmQI^o0K>({!_27zzzVc#1S{>tifwXfeEDh*bJy_tf35 zU&Gj>JcO5KD7$MPHA5PQ6 zwx4< zIj#My@wVQf=4n6^*VB=sE@Vb3?Za{okB9cGk-K}+$v4Ep!w5JfoL@(rPc$dyo_PBi z=zsNiu8M78x}5NZLGXukInVR>f-#S0))uFlMU|q)(gV=}&{)F*4nyJ3 z9@OrcYpc4x?Z@Bi?f|#Ird1x-Vc9(V9-H!~MM<7&4Hq8st|^4mn$d(h0%Dim#SuVS zQPKR@s+mPcWs8FWcdAY^#sNyQ(v7o_yH%gEK}7?1@VG4Xks-Lt%Q+Vri-TpOQa>&B^Q$L0y@|h z{gqsd83Rz8jwNS`Br()hkuCZja)1RAu~)>d+C_(^3UMNzC$QASf0J|8FDpOSQqrc3 zYVU0KlpzAS*+8}NlJE2H0TIQCy`oQ3iXkX4u`rJV+{9xOBp~LW&X+Tsm<}sPnK9S$ zytq>t!20cUaNJVp1^bdwX-Z~;0&a9d1FXvOWX)VzkX}sJ7!7>|p!lJHibeJ#z@(E5 z+@c@&S}xi;c|{sG?}PJXR6cex!;h{e<<+X*&>Rgs)o;))ZBsEU+&o>j&5PYVZ| z;r>a048Z9Li3<-YaSyk zsE~z_LF$6(>#KV`Q@Y2H>Gd~;n-Uh;`{+=^U*=rYTPVGJbDq}&=|i_Tk=OfQk0I~R z;l=vzUC!c&-;8LtH&}+S6=(0w(t*)!D61+2iJMp+L8fEd?h-_FasLgB>?$Wb;g8og z@=}7giy!b{^W_Az(dI7U$Wj@rJ>O>7YM2~5A|*1hxSxP+E5sqWiNwj(dnUJHgrHh& zYAldmjV$T1QM5y+JJ9^Z#g9RjDeE%6ZdSH+zS5U%rA_=(je!ZC(kl}Z39(OMhMw9) zDINRxP-Fp>;trNwbQCMjRp*c2e#egE{@ZB~DOlglD~9GM)Qvtu_7W)DyhKmLv8<~z z5^Ms>dZNrEO(+@9a%R`IBvxq2p>YMZFAb8XK)5?(1Hn+aR zo!oj{QndyO9stS~p8hZE}{(j`McFaNj*N;4cUU9o@Drm5@WFc<4Xk1$Gir=qB)zJC7 zU*r5YV`SjhQX1uXwNE9{KeN?fhY`lZ9#dy3>T5Z=&B__-XMNQV*dOX;GE;%z&GKu< z37F`pjvKEU`b}!5*Ny2!j*BA!{1%b`KMLdr0a9q;ER8#d^%(V8REGV%W_5EwjeVYU zi>39&Pa8Xq@6)BqQN6}Tm}hOvJ;V~x79+c#iMCQwc&cKWYB2KXu`N^6-@OsGf{#`S zzF}QDsy5uyYjBX8zT8qQuWMw>N-DUU%bV?#)M2u!zVxUZbQpFh8 z7$FqwL|IQ<$cs_45`_#uCYJ2*!CpfF%MhTndBvyRm0!8FmJp>920;(Wpet=YXFcBQ z`)Mq2LBEqON82{RMf`xJS!RDQV1*F`jd_(JR;0a-I-Gm#q*us;;S&$sy^AzLhOXS6 zyuO!`^zf$BIeuXL&)vg>pVGH-MIGcfK4STK1zrb1Q!rthXQ1n_j-{%TE#v#^lchLG zBq#`${&d4Mh(0`5h$g4fMKz;8Dzl}NY>l5Z1d++hibehJH}~#S4&ttEvq3Nbj!QDa zAVbhS5zh{pFDzcTR=B={i;cx5JYz z%ZJQhYY<{`MUOF$a;ACd9ln786?Twe!7f&J?|YY*>VD|vgQzX(rjglAXM?q#NclRM z;FhTue6rAQDY0j!EKaQC7vaw#nI?&UX)E}y?rV*QVaO*Uehl`52(Cvg9K!K5+d)@A zLh!ib8td$q{qgh6?b@QHcgHt0ZbsK=!i^P@_!lRObA#p6pWw8uBvrpm&)VOk_f8?u zb9;E5O;llJKQ5QMGBiZvZzXAT8k`39Q3}>$;3p~e0oBc@e@~67#bx`Jx2=9I%H@i ze{H{lo9u}(@}t2XBu=Gt^*k=H09~#Of;P+Lf7cU;m!3U(JE(^4;Q=Ni%eLJd4r#kQ zKiB6$v-lNOuybUt52lN|yoZ0x`cue|%;QruiF|*sAb) z)^XfhPoFBG#ha`10;i0=ELc_T)~SOEJG9}EB@f8+d^RSY`&aC!@%@&L<%r?cV2RpQ z#M^63cwGzBmlM8AxTP)W=X3VnKlp8TnbKBoN0T9#m9HyNS7s%H;IA@tyg)wP#Ut2U z&(@k0by-mPJCTPgGRE=>KfF^Xk5|pkt4_}D*B+qEc~O5G;bhrAL=*tB-EfE8ET){N z1)H-iH1S{CX;}PvVYd488|H%E+p@mz7rbecCC`MkfS``@czFS9hH8 z@>7f%SbaU@4%Y*IGBRRv8(_{I|7GE+PRFNh2R2}xya3}p_SVDxbQSI5}4nxt}+5(VfPfO zlLZ)-XhjBVq0~YS91mpBzMYySf-<#T-DfCCaQ_2hKwt%^=25NwrCnUqQZ;L^*E`ey zgJQt6Lg7bH9R89ruFHl0R1p9FPQdsJ!+`I1|1A{53gy%g0dGVE%l`?`_)B#_n5tz) zL6|~3|2H^T5nK+xfq$Rl2OtOt2QmU_hw{%yN7fNjq*I-;@Zp)IGbbqSNzDYqhSWhcyV9R-(BT5G?mfDLv0hn}ua!C$n& zj?8~0Fe3(Kp1YL2S0RyGvZgw0I4yVdzSezs4j2 zDHHC6MlhCdoQ>jUe&;IqbW=VS4|Jz-xgkZ(P*6oWLbT{)&Skg|K3YFpL zD_vq3E7Q3L4!p@?vY@2F)Y-=m9LLGk>ibrWiKS-i=Tc$s@#&tXcv=B-1w>vPaUNg& zd$3LSsbQg|rVum^z#9Y>zfwSX!x~_T$sgRnl3T}7%y#(*v zMLKYKUW~{YjI|unATu62lrnE7&~yEB|;(Onc63lgWHOP(o8 znL$6bIy!S)t2v#SdoyszLha?FevAc2FL4|-<-Gv-Pe;=I@t^;4I6`dN`iBt!jhfl{ zQQ)8{VjN^7u9$~7BypSpO11{RBFi$SgT3x)=;BGe_YqsW$(6Cu0YA{4Zu<41(L%zP zy(bPq=xz({zh3H%*BwiAj-VG!cD%sN&Z1BhK|g)V$CVPWx^M;(U-CgQB8BxwSm>=O z`Klgjw<3b>OBRT~cDrE{*=ODT*L?Z3jIhlT(skaM@!~z!>9AMH?cJCID02u$%>viY zRr(kadVTpPSA@Vpu7t7`sO<`(T1@3gGjzyO>an}U1zLI{VLXcL!y&;YfhW*{fbSk& z7HuBSjUghkPkhU@c~bJc%azXfh8alr*k9lB_bRosnot8bi2ra{n%I5nt*PVd8@+T5 zx%caC|7x|7x3)?ZzBHzaY)NeIgbDd zQDOTGU$ITOTb3*ug4JZ-XSE%aY=OitU+~`_t^FKyR7hcm^-^y3@)2(FS3vxs*IOL< zV%cnKQ(A({u!>XIX~2BGnq>Iz3YoMOd*cgwBS3|2cZ>Tc zAK}<0(KR*-E_CTc@EBo5-f(NRu+uKvJ;sxy{7K`(M8I(B_CdRIEQ?rKhn?N+ohO70 zJkxCJ%*isml{^jp2@(}z{G!C{W*f!A?~9nGtG5#6>>5z#YJujLvX^V`pr}h%74>uv z7?z;Zsa+B3u+qEte8d>fZk1)-=7L5RTWN!SaZr;X!SO5^!w64xw*n*_l_VSP4ht$) zYU|qOz%@Wx#Yd$RSM~|P@NllSK2zwK4+bSz2Oo~NzZv_=b!}^`S_Z46d>383<*GN} zmSPCWs$H7P{$8G?vM)9!9Db~i^RB#y0}n71hn{&09t*Puw5v<*^3Bcp8vCJ{gZPaZ zQo1Zr;lH#IK54Q`H9R*C-X%hUV*|C$H4-1y<77m`9uYy%U|Bz1p9Nf7{&FNBocgMG z9|DuAAf^Nx15heTc?IkOe_EQ*QD9!p`&v)=$7qZ~MnG_QVRDd!&1oyNiD)$xNCWu2 zr$;#{{uI+fD>MNWX5xpi04mF;HL2ge-$#cRdT^4mI@4PLDnMGRFybI0JjO3+q?jn= zL1-`(=v{_qMNc=tPe>>OyI(*o;6{S!&>zx<8IVI9%z?D;nGxL|IT1zG(sf8< zA;T0hkPuhSWnc=lbOA#sdxBy94+^R>!f~RQeLAFj?8UL#dw=>%!C-cz?{Xj9v=Q&MuA*JhEc^GGCzf zZi_NV{*PgEw|N^ z+C>;T7e`1qB~gK#R^tR9B=Nt-!b}FzYGx7NV!|3;0{?Lo*~$@U-X#8Goemr@j`)p= z@DSKXpu-VPup|FZ0uXHYkC^@thkxXfJejTg9EA7^Zi6J!w~YU%0{BBe0YtUVP-;`Q zoCy9nqxRR%H4-JFJ0c+(DEFhDA8L^C_pUb3z81pF-xeVzBt%&Gqm3~`$EM{U_dUVB|F#P^)DeVm{~EX^ zMcjo5k+iV#o+-Y z^p~K6c07tNe|?A>AtvlMw_mvtWlk6HjeS27N2f|>p2*wJ`=&LKYM!auH$rrdXS>4U zXsg;o?#$_2;X|JqBuIPOPS&)1wqr#+NcOA$I%1lph0YN20 zP+UuZv_3M(f5KZ0wDg`9v0CC(=^`->raqCRXj8nqurxJ?86P3Xjnw>lLxUNC+}0HU5e}IW#u~aD2K~oZWmoox`F-Eqkx!Y?p%LYhP%6-$ z=);A!@dmGpLHs`^l%Bo(F;bCZplk|C>DqKfTmtcrSwrxuFOU(kgHB0kArfRz`*^Kg z>;8A4Q^Q4Gqg~T3xZ?HpH)Xaj>R{qCTryvKuk7D>NM?;JOG=P*-A?=8dMo5(z-K%P z%xNTI)XLx!24bm8YH<}KWORO}N30i<*Qc9{kY!rTUNY@uHHVSAwsQsD8#2q-2>S-T z_}IM5A$k8VCrS&kk7zGr>@7>Ve5Ky0+0PW$WQwj3UcV>!}} zYIxgmN7u#Cy-}z)q=-Uae{Ht!8+s;QxzDm|pDnI~2k(#1%xhoYUPr$;U+2r|TF;}^ zSLk|u6xzPLCd11;?c$hpUJzQC|XAI zjGx<6y|mtX-yhRfFHX^b9 zogWLfVZCw8y;{k`mKCeI+)EQ4>-8W+yuvv7Sa%%3T2U}eBa`{Vk5NC>|3sRysEaYN zobW`h?nrg+_5*G7*W&<6uF#*K#X82aI&xbeqgpiyOEh7h(3gEPEfX56ZZrDK{3iU_ zpsu3KY6~}=cEusCp?Mz0c&Yjsp6#CfV$J~vD9}UsOujE}aLGJo_n(VZw0veuHNn3? zX2O;y`6=r=ahc3a$0I9R0sU_RzIv5f8HY~QI;3B`(a4;hqoZJ?LmcBI12c#qKt$)c zlorx;Szq|Ixikyb>1!bxYU~aT+O!>aYehPq&mM6~{#>87{Gx5UdeECcISvzS)~{*X zFqS*Kd5R=LkznQVBEr#Bn8EX$G>IrhRrkFdw(DCF=3s0*Xx!vLnM%Rg)7X@Qdj99R z*0}vI&|&NmlezJsA$mG>2Te&KnPFU>yLFCn#l8t+R{TjTFqIdo_VpDncFZZD1)VOe z3w#U-Lc9y*w_=ZG?5K+{;LEkm?5SDmvwrRy>RxY%Yj9vY)+t#}yIF=V9}<=)FCi`t z0TnfqG8A?JgxU>uX`%Bcj&c6$YvvFMO-I)YH-kYV`xpVX>ea;w^ZO$DB;x|mS>?MC zyXDL+4K(`O$1zbRwFK%&VCix?Uu&j5F)xMVz4Yn zhRRsrITZ?tuH`7cIkBu-$)IV5GBEe>TtI64-_~~$I~08NE$OfRb&*tjN*%TA&-aUB zTQ89jYK9rp+83+n`!an`ah3nI^O0elrpHpX|5){N_9D0DibJ35q)EezM`&k{b;VCM z{G<~Ik>U3n^?b{%2@lL?Llj%2{rHo~LxHj8XBwVnyqak6`-9uyL*cC(QN@9@c7_JF zqDYAL8`YfxzjMWRy*W<2&7UGlQveZ*ERR8Ny}X%j-#WBGYzzA{jXN{SpK1w=D?<4F z9pb4J;=rMQzxmlm+PhQyDSW^tohg{to&=UDGSE@ee|U=A;bz43cqc5XJh<;@kHEG; zU!!J+W@kyr*`jM*7{;poTHHiY)SJsQ#43v>iiYTIsfvGONy zT^TNF-dVewr!yr&iRGv-DJ*pLAQj3_M@WdHJZ9f8c*j_#ZJCglETZ|8>+Df_|SiY;}Pbf113PeWo zMcb&zeVH;;9IJ_j8NbKOGBm>;%Y38{Bv0pXdn_f5Ax|7n#PlKjRn9gVQ#d`B2s>g? zN67*A8f%mLy|z}dDbWqD*{L^agC&1KvCEJ_fctgX1woafXbrgzC2xkXBRYxS2X!%` znOP#9*h+I!4=>Y=@k_H{f~(rOI!rj`{in#&f-vK7v&IHlqE@K3XtXn!>TCP!(4po~ ztM;KU^lJ>9w6ny;`$n~yaAg8npWr#Z!i>v)DS%gjcR5WLJf3XCFqc{6-?L5=-U|Lx{{@HwxN0$r}x`rO(;x zvW=99PrSNUjuN-X@0Rk|uE{HhcoxUcIG~sLZN_GT<$g%ygRw}F+X36LA))PS2@{XOX@4~p*Rg7x5i3kNOt^K^ zIprg{YD^Zr-rt0H>X=>Zzv?nJAuSG$CGl^uM@(u6Ofumn_x^L$c3B^jh+#pUf~Hu? z;NI?6$9v+&MRLyCs%t2x&3Q%rV*0iJ7k6*{7iG{j4(~4ArF5r~A`JpdiwHmmRgbRYXc3_m$6#vMeb6zQG?18hLQ0H-snD{G^ zKlXbmiuO+Ksp39=?hDjEj1RFP2MkVb@*sLJ5{zCaKp$g)nrM?^B5~;_Pvzg?M{@?L zltjF!C1s!1kSs-HR~g+?SG!G+&tkbG3U1|3eOpk@w|y$t^ZVth!dEX`m{MG_M?$7a zpF!i{a2SjynjEjjxvc&nevpQoM+1NK?JNW}%~KzcNx5~=)B`i4*M@D4VCnu^LBsi& zf&5?|ezC>HQ~#vB}1J})J0zS+t4%n)IK=b|GNpe@Z`}&hBJxky#6^3}Fb$az%>OV+nV`zigi3HC*If`k z#MeE#_LV&?6YO z)bfS*6N`2}WZ9^QD;Dr`_O4%TH-5$I?+34PX6-bOeZcTQS#HZwK(3`0*Ba}!cLujz zoT%X{SdbvE&z4Bh^1o-v5UN04hJX`rtCe0dxls^LCwYN}O7}zOZ;g>lpKKkB^~Nc1 z^~a-)v%+$Jko4boAcM+86!Dj|(yfWDAe{8_+IO(l-Go4{vUMV2NyML~o}mI0p;TwUN4#Qy8al~>r;Y9Z(z!!bS11Wi5zGAU)_ z?ldTP9 zjWNGcU%GeU#z_hYfMW%iTj8tSy(H4p7=59`(vVKH)0aH zXJTMa7PWw^j0+f`kOl3~x<2#ndiiv-mQlT-JxlYc&v~O0L8Oo7qvgN@er>R5P`VBZ zwKvnfJJ7jl_7eLH8zVp=pg84ow;XYlL95546Bo*qm zE?sqOMNFr%tTH928Pn;TU=bVlrfl(ghAn%(-BN`~f z<2e6Y1}-k!N8=1>dp+r)zB%31F?&M#^S(7A{FA zU$*9(0fF<&8+;}UoD~6Di6y2$%3p00p^lqsY4aFuoC=6O=a@HkgG!EUhx&%xCfa{j z;L9?v^#;d!N9EVn5j&De4YdzTtLxj^DhWYlB8v!&pUE_%=1*w(_MAQ|m~@Bn(m1@` z8mTyNYXAobDu{d8Jylmw@Bl$ay|+4jq}$4qZj+*0AKMvL>sqiL@Txi<2SJ*6*#cmX z#YQW!Q1C(De8Ik_+X(SEif1mVF*#$+g$x-Vk0n%kC454v%$C)BAx-7|%|(04??R0x zOZ*!nR_>>IQ(m$=sofW3N%Q1Rq8l}cy_OxjNPEoOrf301h6DqLBp5bA)q)$DbY#)a zX7{zh>f7VP!nefkig)eic^+;LiMPSrwHAMCFY1fj&Z|hFMUn{-L}$jGj@)j{^mlF9 z{2=SoqR1Pd4e<78))$SywzcmM(r6+?1clR!<9;bc%oXk=Q%#TM76s)QvU7@?`rwF` zsZ{EV%x!!~JRN7IBSyhD{fb^cz{3;-Re6su?KFkd$XaJ^8f{UbY_qUeI2Q6p@rAjM zwvri;8{KP-qgC@e?}Zt}p?apNN9oo{xEp-TPvt2AEq+PZPE}y>)d>8389_)3DvShsU|jKctUvP6)vO z&jI^QLM{#lQlev!wkl)L<2_Cw=xjal0emme`txs|@vr$cPOOQy;f#a*6->WJrW&30 z_mVS|0SrVg_6gZ!Ku`;Nf4CG(OP22k6=d=$O44NM3O+J9o#_^^?^_&f=Q4Yxg5Z8`gK&D!}w6h7d* zZ@3LXm!vnm?EARvK7UkATA5odm?~v2?xpT1$U^sbtAyQrT53d85cMDt)Y>z}11jp_ zj(g9;YY)q|$7SBHj=V4ZGF}*IQe&5Hs4US|y`SpQnD$UuNh6#p*Hr2I4G%8N*nKz` zmH3n{cfzq0d=zU{_GZNB~23uK|0(GOKmUg0?XPqzpL{0 zVWCtnev}}02G#x?7(SH^l$C<}LY)kqyJ-?npg@?2C@Tc z1rZbJ#)T_h@e_Tj-hrW*<8b=Lm6n71VghMICJQd>YPdH$4SX4Nvp9(0LPW5{Z$kL- zoY^hcj>}d|+r5ONaT!Mk`J&)hqn=4ay^_nlPs_9xM+MTp;R~P6ie!g!WBIO=(HE#% zaHr@za<%?*gOC4*TV~d7+f!A07T?w@TuJ9toz=APCi9CASFu1GEcZO8h{K)6Ut9Hb?@TOA|OTyh(qpi*gU z*k+^q(cL#`Du5P)`xkKLZbDMf+5YF`iY+3h*${cI^RUi35fS-EpAS`(EIWU(r>qsmyn(C^Nt9oOr{c8R-YK6C2(006kj2?l9VgbRh72aM`qNZMx-{94z z7j#L1P$kDcbpyu&_kBQ*93at`toVQbf?}^B7AZM^lu&qUPX@!M2b!Q$v#k8yKyKOq zl(zU!McWTy``Zc>yBG|@w7-pxMvsh)bRu7+WWzrdpuZFa1c;|>hmd+^i2}+G36ul> zC7=L_f_7@2W6FA2`^@O!2zt?z#_Y`Y#kR}YGyBC!Iwp)X7@dlX_Py!3*9#jXbF==` zRmi%K@kekqo@~FukVup^7DlfexIscvU@HLrfQVoLgvE1WamEK<=OjTnr--Y5#yqz{ zy{gOEP=-dGu_D`cSbnlofG{#Y}l4F&(am?X2*URCW+flN6uE= zRe#Wl8!0Ymn*yN?x!)pGq$V#yY^A|I+CpD7=oFQFTe3wK9>2%+9`8BjXFE}RF zy`p3j)#^Oowgt2tbF1TEdhsyt5xA1s2xcl2*xR0MJ!D^ydV?5hCUsfA#B0I96qBNlaYVoD z<6zDq0l%=$V#34MT>v|2WK*r1uhWU!>>)#4TcZI}yV1weRKO_ELf`RoXM%Xi%hyox zeQ=8uV5hWgNai$MC5H#og3ZGNOx{?omkInn8+h}6`r0GOhWokHl1XBzt#@pNP6^Yo zvFdb)cL8E|J;kuP5V^HWha%`(L|=UOc6L$GOs@GokV8!mju9TMP+FEO8GI42JyqecaCKe1OL zh4v6D5TQruPBIZ?a*mRG=& z!|29aEL5!h`+sXgjp`vsSw;jdMwW~-uJO%U?L1n^h~cv;Ygo0yU$uEN$@an&2d)O> za?hd8ZKcnq?x`N{#h9H;R)Vv3M2a|gk)!hvwNyrSvPBeP`a7mF+a zBcO3Hkr4W&2COqBuxuark~7S(cKV5?+&&+utC|EFT zV>VT=CAOcuTOfrGs|o$xK)weXzJ3qR2Mdhc2wj7c(V&9r`6y6D04I~9G8+)grVayN z8X9QZKCXGq?X+Cm;?o>q!&gTgGnyHMHt}Z3n49=vU+gkD=lj>qc z&$O3&eIs+L9XH`kGW3w^qjl*S5hw62{aJJY2bSf8Non`TWt z9?E7$=Ezi3FiG|2Uf!P*=1Bo(?c%}(h8=~ykUZ3zAyf0qN13Aie>o+QU;xk6CA$0e^{@%DJJ0^k zr?q84uYCP7`G@*HY_S*&y`IZFxG=5VIS5f|xc*=ub6|~s%`Z{WOkcNWRy@uv(GjyI z?vp`7$YPiTEq9yPd*5J4@+5?!L&APD{5X zKAmB@EaKj!A6Hmyw1m&HkwAS}GgHUUlaa$plX7v!W(vj6K5oLC*L0p&sslLX=VEq? z%hSbalY^^~{xj(!=D06{VX1#yS5FHAw@6JM75UJc#g)F`g4!l6jgjBA>5f&X^CI-W}Wg zT9j#b3-7T|=Zg1>xZxsJBo5{WHfI0hjM!e2f|!C`XvNN%fC#EjUhkCk-?2P5FJe9yb>NU$gOjM`C{V|qyMOjWt-=J zsGhpK{I@H6rDI7m`7w94>G9z*bPUbz~qdUGQIgY>>hh?*AJD_=@8{LgDXYYZyKZ1m2m~2EP8k&wvLRWJcTv z@R5tX(I+?nm$IA9Ar|mPBLeh=8y7Qt^okV)8z`R!MNL5nxX#_Y2mBU`IHF_+w&5Cp zeDPsIY&XaaJf;GkZy@;3*Z%>A9z59m@J908c)|UrSKt`|H2v?$M8N-=|KPWpe~0wFaoxLV`yWXD%eoY(mYADvRsT)|^tW%omG3V|z(oF%yef3m=KufGx%{@3 zmDA&EaqSLo7asg0dKSsDGXSp@kveGQ-NUW<3ux9H~|-?kD_xttiw)SgRt z_BJ2O&p9(_Ai-Y(Y0g0~FPvUi`-W6#7WgyvWK{=NTk?MJCF&w5pn2^a<~j2mUR$H? zYk!fLLtHCWljc%c{PB*M)|gh7ZYJ^1Ph(G|CE=>5@JgE9an}6gmo!)4^NIn>%5~qw zwF^J3#6pL2e-Z1%>`YMtt%FUV&bn4^LTWhG)vG3diQzR3@Cm=;G^M}3qtzlMD3%2{ zdnn?AfqK|jNYm^`IzQ$zL~YW>Y|Qo<)a2Thcc)`lUSjn*OgG$Og(u(HYT?q*Cuyp< zmOJdIATj0pcOD5N2TmneKx+SzeW^lY1D$J44dGZ+^}=~)wC<3eq^`1uj+~QW7d{i0 z=dAKAl9q}+IYB+uTcESI*ia6jaV!W{k!x@};;#7{Ub0c;PfkyIZF`!{?CjVfCn>}$5u?nei6NPj~mJ1KJqW&bx0y)DJH2m{) z6y79#Q5cW)i*aONlH!NBPn7;W^5RukIO z5{cY;!pqPz`TeA6CIbw?LON9%(x`6WJp6 zYu`rp2-ZsFk?V01kS5Qbhb(Eq!!K4^MSs6Y^!?;FN{dKw9yNgvj24nVvULh4G`@w} zP*q@fp%u7NlV!UtjSEv(U->)AU$h|>M4$&MmzyyG(4NMIFDq;--KUy@TPt1mG@6ou z;DERJu?WG*kZ%rGJ3=$7=0i+Qe%z_C9QZqTQMFbRck}w$?>yblKwY!xKqbnroCO`$ zMVhw!*^|dz!Sp=3fRO_hMowt9n2`IVVX@vFhJMHbtal(pdidMf_~(E@TzJABsq_0J z!4EiVGSnd?F2Imseq&51x6{I*KSXJr=MnawZJARIO`mn-)jXOI0Kaqe9j3H(B4Y)i zXEujF*Rt0vVxq*gR!N{MYQP02xnkhNPVNz6~@a69;%Llr#(gugJcYS+6K>_ALmNvj*b@#9-;uHAR$Ujp9sBwk~MZ;rk%97ug zCLxY2s)_zl{XpUw^ApMH15C&ZuSa{ySV#^D|2k$=BNxY|9qe^lOkY=_y=T9ZW2e9m z+iiO8J2BuHW<7(KjL1pdEC_~ZgCh&9PFv4Rj4X7S00@xS@RL#QUQTUEz zk25rq+FvDcXvkwAb65uksWBHp7ThimV=`F2XRluoB2m21aC?ghC`I$~BfrKu4r;ip z-gZUuALCJ?JsR4>JK}F(CqZqs(4{=Om_?AF?FZ-w6ElS;>-$CHp@xTlNCic=LP zyN{t6d_Un7kmAK;M+CMd3$c<;xEw~h|X@Xs|e&45H2+L$` zl8mZULR`J#l`SzFGv;Nwhj8@@hjworTl>py4HW< zwmdW^!yFVe34}xu zpnKmp0#%XeBZEI$-YH&K*71LJ8qSG}?$vZP3AgT|U0~K@aeOkLId`hxOZ!r5a>Cx= z4H!m$7(hU9Om~~0y^-RP2-5bCoL6+{v&J!IjD6%2^`n;i=0V?}$}8DKS= zp+nJdZ?xH9omI4WETmUF%d}BREadxy;Bm9%Qh+*f3=APs4Dg;Rdbt*CG~Rl1m*(?^ zvKOc1sw}8%UU+?A9Y_Ea^hgsWj$Ex-tU^e?wC&j#`iUstA^R_HH_s**mtJ27k*khDsumJ=m0YV9@rb#0E^MP`Z$`P|`M#-oM+ zYJ{8_U~6L=bIm;hF-gM^s(8exky4-F&G+KiW$56z)p4PL*FTNR9_fz@Vv#EH(IdU( z&IMOncYRX4A0OUmz6F>KBWiRgpN`@ToUdX=qz!BE;G$aEE zYlBz#=AryppDFlV9q7K*gGi6c2)y(jrYbJ2tK56IB%w|*M+2aZ=_FJ5YPS<>_t>T* zmq#EdQDDG9`;4W>Ir2cCzw2$gVdY=zk6#Fso8!Lk zUf#bphY$sr&Tn*&mq?7o>`cfjOiuiKhOHP`ovN(ySG&nKC%T!^1!H|hG*MIOXPJ#B z5g!@-Ab2_o&HUuGa?u=1LLmHHEJC!92AK>PoeU^dz&$ZQw!y(y+trUjp>jHx+bt?V z?~n&b7V@Bc^I#$Pvr)=dz` zC@N+3bpiFfXhcpBj#nyy7iZH`d8)6xu=X0c%LiXttw*cp{d5<#W`nA{OpEITmI9=5 zEZQz=Vzi~@nBA~3lCkw|5}FWX;ZPt^P9<7{($WgH=O^8l9A1#DY!=S&=~Vv-kR4 z@Sw*ofo1gjyB-|Kkc*00*&NqnvANw@kLLX$ZKgKAaJ0PO@wLQ{Lxj*o`uUtJREVN= z8-(ku_zPWYi>BRDv&iwlb8xBp9!#&b`Fc zYW6psRwk#P?=P4*>a)Y*~S`K97ZobOZD*C14hp zC|+dj3SR9~$(DG|zs5xB9pkdW0Z4FYv%Ep6tcFU2){6c#k6%O&Uzd*b+-$TFRr zod=Q^%JZ8xDs&WA|1nlAZfLKDqbTopDems@@_{5#HXe_!G*UUg($2Hfe56MqA_7Ke zZvj%F@Mgc~vn(r@BllzQw+^bwP@A*zVIcUUolHXlv@>EJL%CZ~3vPXWb!WD3_&#|0 zV{{+?%(cZx>rV)V<2*?=X~NRN39n9@-Fz*hmTRkS-VvJPR_s7@)K~u(lf?DsL4c8k+mTnruvm{ z@?yv}No(wU+es0FY+^_|-xlNWFDZpeuJ^J#E-}w zrMDP&xH%E3ad~6fgDTX^sm)5_v1!PB-vTXlam%A-J2{3oe9=8kK?lkMYGY8}xt5*1 z)mK*^tQ+U1z9NDzXKdGoCavlazW&odu2@FRhU+Wu2|3g`0X_7_VS3CFadalNwLm5< ziJZS6B}6NK1DD~%<`jS56k&1N964x;o{Js0kfFO9x% z-`GJ`M9-BmUc?P{Wi=3&IXrxQ-`VrguU5CI;BzIf_Zi7F;VPM};%m$S!53*GF8i9x23;ip1sy?a`d@}GMKGyk{5KMGpBoV&>>#el#rW5uqB2OcsLIC7V5gDs ztbNyIJF&HYo_#oIL@cEC!Il}lc-I5o`v=AnT>CWL+g#1&-Z4Sy0Rx@c5g)kRtQ8|( ze4|#0IDh0NO1-T!0A`N*g%M;_(L-HEoHM`4td2tIUmiw)ntrWS2FnpbQ)|tn`%H=c zxlv;y$JgAZ&(;*0K|7~)Zl;uJFgp$fOYooynK|$v(?djZONf5Ucf| zk*p-YZc3lW-~eN@osUv%214Tk2NRXe0THzX>KPwGioJanipLkn&DJpU9<2vz@v?o1 zRyH#;rRO5Jm@%?RSy~qtmmy-3==o1)YVb8V7HU*orqa3brEqmED2s#ycJAm!fHL{( zEsrRqvYba~N#ch51XVqOI`p07c*f7n>eB|_{9WUmCSY)(43%r z-*Kbua$IyxXQ_w=`!_;Vp<|?{mbL1ndGqil^|`|P$@qbyGstJhN1U5jH9u-;^?YSY zTh9BKS3`DlcB`%&%#W8onex>>8k$>I!ZMkaYRQSc=%~^0Vrb?eI=!bSSss^l44FAp zudBN887~e8?wD)4AH*RLS4+0OD3|Sb2)ryJ^H*Polx!Geq=n0(-x%%Lx+a6O(#ZX* zov#*7EbVI-UtXpA3(UK&k8P96hUYIfqbu}79EiM~f)DiU4b@i?iPc)ZZAN|{^74MY zUTTkwYE_@t_9!%McCB8Nqnw`c-Rxclmtiw44Eu-yCDzxE2XSCWp*KFX^iY}9pdFl7 z%NJ(2n3~DvuOOGfWp`{@*oGVhdUlZVwjomLVR(8KL9}W7PzEJ~I|xwbEQ=gu+~{kc zUC&757o2~e?)THcI?HKjsak(^(X0Q){7rw9ciCA#zS*{we#Lbu@I%^gybI> zcLnO9O`_i8z}e4UI0Ew@Hhy9z&fcdx1NjUZ)FSZOAG@x-=y6mF_n32`Ic`v!3wl9!YLbL6JZSnMupzv@f z82~#JQ7*q&$N)OSw4L3A4?PIKxROHM)yU4hn3IG$-IuW&DukRhzMKc8r#D4X9k~U@ zZ1V1r99rDZuQOzRoyKZ0lKLuU0z4PaGhwqDvV+yMXHhR6eC0L8{Jc95c@!T1bLK@i zHiqfE#x;no$#d%0({)Q%)z``SkFR#-5*-ib6l@k6i`{n+#SA^f=*(Xr(Z69U{)AEi z(4t4pQ{jhRSU@D9iEjO9@w>2tY5^b!W^lgVwf4BHmrB-DsyawWP<^F`^H#@ zrysiSuQr%$^G#VKBrjlt*DJ$?41|->RC?fkN(ue?x zh3?ZpaVhY0oEQsirH*Cs7ATKcSzMnvx_U6!P~&;BOZz}&V(?qtj(vQN=G?S_oG$-@ zl(cmYv1Tk9Q+w?WTUN+}#qA30s@cHvhKqbK@dO+#A8pUs{vfLma`G~P%s0VO06v|_ zr7v1m4i|XKA{m{fI=5IT62?t_V;K)k()}fXVjOVU+5^sX*u*z+8e}w@_C`VyKqX2i zjFcZL0|Q~y0}pS$^CtuYaaW*p!+-H=H?dnuKf2B?UQql++)e0{$)}?;&^+niO%npV zEHJ)$1`4A4Kfj9r2}_9oj=Q0Z1GLx_&}Bh#6p{QxCXAh3xP3GYE9NV&QCLen>1i!=IvouWY426ZnX-WqT^@BzQGF+J;W}3c}eL1zOT#j zf4UiaT^3G>=@P^GUsw+4;ZeqnJMF}Oi4GWz-En+K?AayjU-16+i_5IpT=^7{C}@{KBr)#pr~a=8Y|=9&@0dm82kpiYj?2$d;;hHe>^wh4)rCc_)!Ho z5dkCoU&!eZt{m)n)@1*g+s5^FR**B*I#bW>hMg%T0s~G;qFXxY>ZZ+Nlx#*C_%Xdi zoKlRbGzE1J6?-GT-Qxs9xWr?cvB|JqZgFu@u~9iDLYTs+KVV19I@9MRj3%>javsNP zGTok5*14W#DUo*YJ_5G@yr5Y08n!WQg^;iU_A8Q5 zAXXd{3Y0AV_W?oxCLhtiA0VLWDHxj`iqxZf%nno>eH#pkRS&y)F#-zI97RBtkZeE? zvGL?L6-1%HKR3U1tKnnQ114vbL~Daz>mBa zF%Pv5m>txzy42X_69PNBJQ#)7HAoy+aixoc1j=C5W^30z-^Wwf@9^J%0~AJukkoLa zwxn1h(Q$KgcuWY1YVzDqnf`RCH;;qipNc$Dn-KTOE0ni_y|S#+CT}lLXlnuV(UpeF1pjAfVpi!`_pg)Nke%gADULz+d#zClH^7pk!wBJb z$$E^tH`0fb{;<!QK0 zp~q>Gxx6sGhjz{UaWesYI6F?dr;iyA!T$2-t=xAS4MXIibt7kqQlWAt-8-+KMLE!- z7BwdwWDzYl2L}@gy$Hd7+Xb-7ha6~8^|)kG{gjfs^}K(q`)tAm332)32A#EBn}8xm z4Ul@1xng%v%n=Tc)I!VcXgNJ@NRu3mO^6xBo(!n^b8%*Yi}1JTRjly+#sBTI>?Q?F zO+REIP&JvWbGdj(pV^mn3~d!<4Kj zX$55a@I8k*NB*c&=@!k7@uifX)*Po0CV^Mh!{c5_^g;C!Y>@!B0Rxc3q!;(_F?5}( zxrhCFyRVc2lkl6>gyLRBKoQmI z9Byp-E8?GasJq_A$u(5yH>N`KZP`GXV=3ob<410mIqc^(CnoU3O8BQdiL6fyt#;l= zL=Y0{JE#&vj%&J3HZqfTXFBSAodW1Evvbbru%Ts;jL7K10%@q$-5~Mvx!%&Dx7#qu zd`53ap{vL2OZqBqnY>J`GxuTq)~VSL%}al^F^v>(CFqsU7v$4BsA@d>!XlBPy^zyI zw>@opJ3B2WRBkOFD%kad>Z^qr@`XDLb&fk-A2~m0Hx|af?fZ4iP1hPl&n_{GE=#!u zFjxviV2H)c9Dz+rj`xXpOWp90YLINC>tfTNbqP(K z;L?EW?%4g)_}lBT49!$`QQ}_r9{HyQ&RzM5H*H-yN#yL29sj;`J??ANWe!>2ow^%k zJg|foReSpOZu`(4X)%*;`?lpTnbTn6vvuwdPo={1)5v|@w@TY;XQfS!&ZU)E4i zUd3pcqKERmT_(!a*FF8!mOuP3(Lc^;q%mWJ}T7%974vYcxKKnc8LVU&y|G;$S`9hfP>>dYWhu3qCYn`7qU9_tNN_Y%m8K zw>;VUUdw$S%Ad#D@EK={`*|T7lcxu4wFRN=yY>|KQ(y&iRS`ZzPs*nX^eNE1>t2NL z_Ry<#S-uZK0^A$p4o4>zm6~mJWgqTXK<4@5Unl7OJWl!I!8E*0QY~=LQU)Wt?tO|k zxYH?kRPW)Mnk^rtL=JoVBD9czk%1h6yHBK0^oUZ;NKztQR+CO!Ae zQ(EDx)zM!3f%Ol@aij;vD#(dspV8cVOS*rw-+~<=$@Ar#H5Y14O8v7+hCuiElyS3i zDJQTH~mz+D1nZ* zXouzYra6sw(8!3)Z`iqH3Dog9{F8dimO_)06!@at6rU834v-#PY^1`)XQUo?GzSy* zSx&s%_snenliyZrFG!kFkJlx%_Zc+v`I}?ZJwnC#djI^al~u?dS}Zsgc>yEZyu~apR~R*goLcn2w@Xo(kueb zeV{)v?@(HH!c=!qSEN! zC^5i$N?Q{tLT9nYm6J?9NP;5K;6-5f@*-#Io1TEU=+MYw92}h8Aq5xv03mN8rgdbS_*XEhy1ve1@4tatmD+ z4AY4o`zz*T+zZL&)1I4^Z;AilST89u+N6IQqDCj!2^E}-aH;J+}4Yyy0F!_f>LEYAJ zP|wQxiOA8yREt6RqdcgEKXD58om(D;XzevN6d#HmbZ`z)-=ZT+kV-Ap$Llqk6xk z?-5uDl%adq>Ges0ST^IARYUySbQ^rpkj^c|Zto>Y0;zjfYCES?$lHJ3eBjzq43;WR z8qMj3-D^slBC#pbZ%%0_1=NNbUTkRz-)|92Mp*QnLXj(7+uH>iY$#rG^mIs+j@{QB z`}@gh!Srk1&UVx7{oykSqwQ3AeL3pYgo_2wUl{UdmJ~qDJ3bdW{mef08KtLBWp0M< z)%*%Gx|qbOf*;7LBh?CeF79o=Z8|>xU2sAKr=Wu;Cw%2?e?w}i=$+7Gi98o*6XS8j z-^hn#>G2Py<(K$M7TmR+ZKC2tg^y5C`(I+4>`@+*OlUw_4NN=*E$?jetWpODDp1-J z4G9n=G@6WX(AiE*FwPVtTIu%5Tc=KaO9$@%uZ1;j{6SwTiuV)T1`^*oJ5JfihRLTi z)D!S(E=e-XmU*haWr@wbJN`|ui_eBY!%B~pmz7A$;}xs2$`F2e6Ok%emtSOFLIbXw z1ZC`WdW^k~ra@A_-L;6u=$Gj!xHk7O3@t=yKJ4dYaV zmB*|6`@a>6k3>vg>;&1^&sUa>IPcUtz9WntdCqH{O8SKBbGyt-Oi6UECo|2kYY-O& z>_x6tr1@muma?qyYvULk)a^$KB63b#dIG66jL$Yuel5+NG}2!!K8}LRu+GM@Ot6uM zw_vSYrI!xh9Y>ugUk0y$TNCW$7Mpzc7Ro9(Kxbv9@~Q(%v`<@W_IVZcRB&z^eGlQV z4~p4 z#(p&Bq!VAZsfscVtm#{t=BQmS0XU!>GKV*r zI-6cbj1s3M%zSvML}8@$B+$orJ5J1lEsizjD)iy|lI{foV&0L@PA0#j7=WT1X|u?B zR@ssXGCGA*qjyTb?&4DSy7M1P{$`8NbO|FdZGBrMQZi?kJF*jzzK}_`;wWP@Yk2|7 z7yLk3_r{0j{nkRtp#({20l!!Wf$1%%uhFvVly_N+mOfQ}W~~vZtn_L?V`kiOb+HZPfVU;z{$lJQ?vFYsr$pl&$p#8e8^ z5Fo?`r62o@Mil-8nwpV@_tN6yH!=%YuJG2kXGfi+urfvV+sg=7%OQqU{8_8p)qo{Z z!D5MZUK6|{T&-kt_^ncQUgD=RW1$X`3@OA)ahK6+)M%$w=4dDkB&(`4QuGn|d*aHR5uOOI zF?d6_1dKtKLxIxB!<2{6qJm9?7B1ASh2!Ut5&9u1eKF!(*yGM)b}IgZfa-A%td)H>JCY*l`wgVps&${=J6M4YrA!EIV z;}im*x9J}d(}D-(-A^uc?c%wSqj4PyDXc5WU)o>E_Q-Eeg3IbT!5Bg&RDi|<?W4DDXi-QNx1!xj`hW%cD9;^&uCaKQxzms72+O-uM zEj%(mR9z&I&Dn0NgwENX^nAG8Xu7#j@LVo_tpx8OA9>pN4{W9`0I@YWvUl?=T}7bl z5Ye#YFjhnxeu`8;kx@~Vl0mnt;Jol7N5RtY1;4AJwfwP$(@)|+hJI`eqUKx7QW9uq zJ$dX+>@Ad3?FQB6DX&$C;1JJR0=HkVG_4R;bSvrql*=da;XFE+YCZLLF+ z(4#wFsquQHq|hMnn`rgn{jCuMzYn`i3=Tor2K5D!4J*VBop@jDaV$#`Cx)6z-fA#- zAv31x?dxXVizWkep1x?EL6ZSQ%JU=e;Z`3O+xoNeh!8rcPjbJJC9aa?CSqc?1W%L< zS`la|)R9}?S<9vI`EdZgGyzCc!yR=rAJ#8>bq5=*R{nJ*uq`H-Vc9s0{!SpChm1NX z2$FlSZQpMO>$u0^&Bp~D6*&zsl5&ssNsyJkWr(&o3A4}t4I0G_PEyZ#*c)DdBnN*}=<{LOHsHm@xeeI%{3r03O)Em$Q?ckt-za z(Z72FAp`QwW_t#LVTvfC^6$f5!PKoX=|%gD{m)XQ#VH?9cQSP%f(%PwQb3LeBz zw3LjZ_@lBvjbH(2zbiZOP9+(?Vu^!66;N;xBFz#YqvF*fiadrWn?CHi(=kx&|ICF1 z4}PulBC|E$`;-t`5^={?VLjnto!Ia#@!A=N=h^D5BS0Dg8C^oPT-6g}Mz`Fgpl9!? z!cFTSt=-h^gpu7h9QckZKfSgAByeq1K!ScI)W}h9aUoE!Lh@D!E|x@FkzH4kNn&_ggGX5}S%M7m6*gQI@f=SC(MzeK?pOY(G^c_MsGI$|mq z*Vd6T7KW~v(SqrF=7OL%%M+-j61vOL@wqI3kUR)IR^>euL1|q$5boUghC0!Dzzdm$ zGTz8F`$J_G*F}OhDFeZwe0Tw^X4TIlM={*eh2z3i&wrW_qM1_~%IfS}qGVo360VKR zvl9Mru|w!X0zj;8gO2IOtavq!QTKhsTm(KRZqtsBIl4s+e|I#N(1P}OQdzY&aw$&{ zKUi=v*a%iJaAUs<`Y$4|!85Q(JL^w+HZ(u>%j-Mntr;|9MgUz#`Yxzd5wB)}k_0_o zp-zd(AVr&g#;@rwh=Q(gv!f&ce~J)s{hspIYfx*|qDnd8gJjfe+}BvUg#L z0w4bnC~A=8G@*V6d!*)NrEE(oHRD~K9j_AxbpED92&NG^ae06PhQzamuv*M{p~DTi z?Lg$J9b$oSmtRm?KKkTOvVpG1MWD6T@<){Pox_u4M2b(8!VIg!I1jbDAQDkd9ZCE6 zG6W;a%LRYO+>QO<{c7rfNDEz%iFejVZdEC#Xb7C@ORSuGeP561%c5S53T!5nG}2NG z=>Q7o+M8^xz%p@*#(`58V`p8w3?2mw2*{ndd%C+DWn;-ckd!=qf^l`q=?Mrk!@?Nv z@Jj?udV`qJ-D%BRw+$$SrM6J>vaiD$fCa+dlj{{W>ZQZ<5i zcVS@cjD)YHzhc-cp8ux%OS)>b!r?L`N9_p zxq6W2(&Cy18b%k7PUV?|l71f(|8XqzebT){0qQ}Ai)en{>iaI~(B&U0($SDSjfsN- zVP1Tgp~+VdD~5dt(*zD&5^gj~XDr8agJAm4pqi{asAl9SI`9ynfGR^379vz#e+%)+ zJ#k>16r|c@G5yIX?+HO^hY@5uybHkf1t7XY%V`k57{JV8bMOUUja8REHE~Cd3XUMzWdy!#K%P$-4MaEr3=B zq+%`RRu)xS_>`~p8mb#ib4&%M3%@;XxRv-lJ@(7-tXq(Z3kPBXV;nG$o$URkD65Eg)nTjHp_ACa54)T%ebOvzN>NFcf|!g_C1H@yhFu z%1p*joTK89Rcu{oeYJbkU#x~_KUw_i?EPB*l_l1xW8OxB&7I=OxiFEC$B1H5trxtJ zH-&EIff*s8yo@`xnaClq;4fEu%sq#jz0<=LW!m}L2VZJhHl}xJ|6q6z)hTbh@e4uo+JiC z6ujpFLPVGp8A_G7yt$N+c-z;Or5;X4&k}mHlx(xH&8n{686wa0SMPNwtyG-TZmDPP zL}Ov2b+gY)C!M{|&qiXt#n16OkCZVCZb(cQzv`GAm%!g#m;qb-ts#_#4WWM{Z{@CZ z(FR-cN->^co2$CoJhf46T%xdXqWKl^ zm2K9;XR{~cUpkSTr`6y37}Dxpsj;^e#O!E7)gh9QuOd|l)(x47(lKjV9JfDrT1KHJ3E(_c#CwCcdLce3?>aHp$6EZbV|Ag`@hE zi~5KjxI#h%gU?ps!H6(|(HQ8l&R6J`=J!A_enb}PilDUy@}9tke>bo{A@CQcE!~6M z^O0egtun#~gASR*AT!M`aYlwZBjAS|IAG>vK$6yjznHP>=H@2K`&V<9hG6ePG;nX6 zC?F}k!jRson$dj)3T`)83?)TyYh>O`|2=26l--hUyng++T_byTv`H^p2j@?~@6V9b zEnke29X!+%K#w<25?zkBxfHzFfwxuBzI`YL44EJIV5SYWueVa@6F8TQ3|QhQV4=AZ zG$n(-GSAi4ZesT5WwRBRxc`;EykBS=rnUbp`D|N-bmJpytL4v&rPm~Mr5@E6Kiz4W z+vnXSEnUCaI5E%AJIsO-%@;x&HT|~^9cbEe7xHJ^n**xa7cpi_1Yr8Wq3?`ZFdE_5 za+Q&M_HW3JcoFTTgciM{zH8^F_ zt{uT|zrMN{$NMrhKx=<^nf#-4^-o zrzFbBkplP`7l6!ud2nP)VIuP0V+hX7%9n53Ak1ft-w@ZC(t6K1KLZheLl>4~TZ@GF zm~Q_$!-0G$NG=z31`?(k^a|5AyXV{j$5~aiz5OQYCMv4(Bq-3tE!a_EMcge=uh;q! z9!%>aC^xS>i5QSa0JT2NAeJuf*Fin7-v_<0rev=;B|x;*eJXxyRU%VwPVxmKu{Siz z0mM7dA;E*qyaC2WPUU_}H{&HRT?CmW2tzZTzL_y&5+Mc4l|9ulVnjqk7R8w~c-3ue zl0VL?s=j&ird)RK?Z5v8!OIr3Dgz?rxqbv|8%(Er?t<7zNU0KAUENnluiisi5aP#be`Dv1?424<`GtgB#)7=D>qth1W6 zYB6%dGX6@LBWjiy*{uQgOJ)8GVv_`4=;J5oKs6udrxDAQ>I17F=|_kwl8)e45-udR zVBGuc$ARbq^a#D;K8*YLkiNk{@f0d|VE=n1JCxInlen<5GeUEr5ORJ#F%{J7^&-i& zf2?_5+vAlqevCnRfoja_?^CbF>tV^KoUp`-y}`?TucsU(ED!Js}^h(9J*2 znOEQ=U7eq~u~?YjFa9d}#rRf#hB(Y1o>0RFYR|CZUY8uoL8!lo7waT0C2n*omy9IrtrTZS7FI>b^6IIIcH zdI<_!Uhc~8OulptY#7Nm4RZW?=@+KnMIQButD|A{y|iE@hBW&7za?R{u6%`O4+J?b zvv(>=!X@bPI7<)-cSb_|p+|Onh}l8qw@zLB%Oyv&DWV+huy%*m2%#3zlNG1WE_W%N zuFw*YZ%ktdbf-xu;{(D$en;5umYxj@S{R0P(#suweA_#T4uu=Fog1|0b?$sd59tmt ztbJ)^Ri{8+yT8(~qFd*f4?9K8mTsg(k*=q>-%cKLM}5*FgmsuG`|7w(*n}1^$!UYk zZW@$z{!#&q(J@Ar)zi}H5a~VDPS)s!Mc!ljX;OB8bZ$6+%fBq2`vXRd%Axn2)sHZ~ z-~HQ6Bx;*nRmbTn5Wz+c^)Ce+GzCi`?)2p&!%!svoGINky?cEoKpM{rcT~1rZR6f{ zWMZuQLM)l>!3mPv{+oZ+tT=Q3*Z>UJ0!@HJ%-W9=F#rfwyCOxQ%aKj+k;R}AzuEKy zDkq+xqKZ4sK#Qv*<7V1UsvRlEQTh(eh#HZXZWh`s>8FW{u?ib-$Nj`NrHl}4#Cg+7 z8>LO%=1$(=aku;CoowFkKKcd&-``q1CR4&o zV?ops;@%@x_vGLIfOtH3PYv1qfA4>J4^M>yM$h-3wF6*#^8eqbe4+qD_Ep}IDV3gp z5@g6R018a#2=reefMVSE@17x5W64U2Pty1Ns7>6GiYz|F0jOi zkjv{ORi3aEt>J_FA7_N%46hA=APNC5n2nT1B_UyC^f%Ym* z87ks=g-?91=CTgXVDgvcl8@UrQXH#eF83;KT>X$Tg9VFmq0G(G^p%WOS&Y_|<)-DO zZN=9ma6h#V8zXqj=I!gXjKozFi|(h=ec=Z|kH2DpEb!JrCv7sgCs0Rh2?MvS)7+NZ z#@W;0$|yCwb{c4BTo?f889-$O(}NB@C$vT&(B^maYY!2FJQNVU@1+<)CLuyHX-zn$ zIFOwZQecBq>yZb}yNmMeiWp*9bebmh^aXyDfeg(jg2)5!n9_tN(z)06w3+NH3rXF{ zvl`dW`}DkqS9lC1OkYr#2Ac_f7}U}Zl_ZZKPVUw+=!!^`t{Wg#|2zjX3^l_&o&9SK zLW3~T!_1h$h&OeH&)%M`or&48wBtreDWMucXaMK{CW!{;=ZZq+h%6WZ;wGs~A{_(8 z|9i+4ygm*sOw!_oTRt@}`2ns8=iGp|7? zh6l@3be4WWyZ|B;enEN+O+hL(6D8$r38L$+a;_N=qR=_zCo-JB3+b{> z1hQP5+ldSuF0XeQ4Qz`D>lwTkqlkTZ9?9iB*=+zNm0?Q6q1B7ZueE#VrCSpdV-6VW zs2tP7NhZzG>%qZqs}C_3wuW8dGmOT8W3y$>(n8Dgi^q3IAa12_ic#Fp*0*Ivvw+V5F-P4MISQ{)e`o8z<5E}l36<}>lJNW zHk;i=y`=4tSi|mB_A3#yRgpcOfA9b9^FHRWW!|F}Y=n8P z&Svoi`T!SKR>}<3k686Q4267SxKOb&GL1Yu7NrNL&Ww5-km4>4<5O zAKFX`=%jp_CP5v5QO_|>qPfFEPQE((inAgTN70<8?Hxt9SQO z%%edD)bIXe3yA4i0LtUL?9Q63*(rzEbF42@9tLdS(vGa3_gw0L3!vU3^P6I~mbZG?mn< zH3XvO~9P`D%I3BAuV=0OmI@ZTG3&hdT>Q+mwGntv?I zf9G|~Lx?zlB@`1&d7AxZN`0u2NzM@l{~} zNC9{V)HjUQf~h65iMge0Y9#Kj!ng66zjnYD?jzYxz$XnvLp{;i#v@@ zt)9qi7u1Bl`mhbdnh8=)x zfKHk^uc+w|=PZY;HBzlJ@2QcAj$=c-!~Aghs`FodVFQ0!0Y3zV=z`TLK88b|CAsSw zV_BcX2Dty94|%6>dFE7o>E?jWSfA<2h2R_yK|}7If|1}7`TVdR(WHS{h1cPR{rY1^_M6!^%{i+fe4O&kNr#c?^ zA!KZ2{7jl^-P6!y(a6wHkntiHFX?m&nC1)metH%)KV56Ddm%0`Zelo@@z}+rGd84b zuU&mx0P1p1!p|yvwf6DwX?{+&oI&^!_o#x%n=TPdL=0>YY+>sH)!&D^A6|9JwC)7@ zLmAC4{kXxwoCg!WaQ_@y{2L}*--1u4SQg-uHrfxOxWRKAlzZo|D8jy?v8Pq5W%n&{ zVd_!3KQSrU_exSgHzrD}!+JrDAm% z#-zi*F{{yxl~EaqA_s6CP!<6`lG^QdENiN17oHar>*Nf`!&B0>QmdOm+q!4+?WvJJ zHe9Clo4PE)4XX}(2xd}JwNv5W9~N4#*1z@64am?V6SweJW&T8bki`uSL~^XO-3-;T zL1oH?P#Nz?STY&F-t-WRw0K$X%iFq(DE^mURKVH;)x~+uEJ1}>?S5qw`>JMDnmU;@mWn)I{6!BhuZ~>xC|8RO~ z06H!%{|;q8bw`~SnDw3<29QGCVdwm^P~$7iTP5t14b6C|2*-o)kVor`Z@*XmtgQkw z_Yt6E@HrUgJeKGXJDXkw?GSQQJLTyBbHvPPS@wsUJ2fm$U(mzjejMrBml1j z+&29Fws&C}ZJp%M5)Y(_3GZ}AM!HYXt=|T-ewbpTxI1jf_;5#9o40w)AXe5 zT-tLcgs_Ee<{n5jD&)R%8KATb2y?TAc~T@dw^c;U;E+y--;(NgQ0td`_G>gLc{O%J zfdFYh^OedV7R*PL*lwVK1clv_PLE7lsn4NaZ@--R8w};waJJS;xxfZ!t66fS4Curk z`{Z1_aGvBIC_9-3pO7x37dWY!O<>y2_O*80dj1m}{Im$p?|FN>-TIyZ>vlZrvX&pMHH1t)J-*>y2dt!aiE)IdGV z2~i$lA_zCNcr~FqezS*$(Pc-$i}P+4(#!|c-5(4I5CmyA41?X0+CO$M zA$q64!9x=NT?4hw?BDym`9?Y>ZN3+)w9CLmB>dQ@Ww{w1E(!*4z%k$@|AM3E7Xn=P zJ<3;~A$=nSjMq0=nsOw%QF0H2UK3o_!FB2}qD5HTGRzHC66|li+RD|w zW>Ws22VJL9$0G#wx}(Nfi(&WgA!Veop?J@5&i_G#m((Aqks-Gq7!hs@AIdF+{py*hhDnKq1y~ zkyZQQlK<88o_U<;0a@&kUIg5;&P}s%ymE-a+uvY|{;>FWJWGb#@Z0*Kj#08Y%H_|X zFxf}JQ~;2;Xp_D9enLSNhLJ^2q@ofeoDOQx&S$fyP8D4+MA^7(eBO3kgA44~31U8)^w~!7#=f zf~Wj2X5{Ivt+q<)oqYKz7h-SQ36v{?;D31|I4Qo5b6@#0xIc?6J>UR&T~Z#M18V&W zvd|AHD-NzrCI_k`vs+KA&jn!0Y~*^kVtH&0l8D)uM^4b@Nfzfaf60b>yi^CwyMJ09+>ru^mMNOrD=OFkGqTqY zYW4EPJ^xUmI06}EP0Vl`8oxuJ0a95VmIN@>Lreu~Cl4H`d$Fp%rXmm3%w zzu5;2hY>Ncv`C4$IA^CGHdJhhRuoWfUGh_B)gCbH3Iv4VeYmc`oIbOmKD3|m-B&9q ze-ho!nTdmFS*4akkfxUGfgle-7ErhjUT{PSL)lu7n#ze^MSN-Q)ifGFj!_Tg74nCW zK6u)9P6zw>S*=Hp6GuP&@HnGVSBrc&gsKx<^`Gw+NV0n&!2hn4V~!*->j&=Z?&`6z zLmLNv9{+)?c&4u?_4P)Gh&`3^59iw~4NBPiP}%BkV@Qo_KqBQzE_-oo^i9 zDt=&kw?`TtG@P5_14c>t;hW9sug7 z);vIoWUC`X4EqXyew=|wb3{g6-Vk^u3C+I205;nmGs1;Pu;${MJsYqw zy1l|ny#oU;qW{(V9}aPJd?w}}ZbKOxOYjRDG*?REBF>wnialA$fScbdPgpZJilbG3H;_57aB!+sBV66yZV`Q&ZUaP1u zc8zLu*SjA!#{86P;jZ~Z(utHC1@$kl&*{s(jZ6C7%Tk~X=L2dont?5N>oxca=M%XS ztm#7FIw$V~`xSteBb+FZqg|tU-56QB#wT#D;9S7AGq>FkC+@5fkd4Z% zz3{ifn03XNMF~&4nbe9muxau!p*L23+6^O69=R@f2Qyj%@Y4#~8pj*6!~Rh`z<>NM zj}B~RT3xY>o|3K%V7JYTj@+Wu;FjSMu$$MLWlvDx+_F_kL7JyHYM2UQZw z`0JxsEyLNp>^-kWPwRQ6N9 zp<_U^iTPKT^$YOy^?PZG8J*TIllyP{7d06m!FQFF`;8Mxm}BtU%u+>M*p#+GvwM8c zNZ%;Q0PPp?K~3p0v9lvzVLiVW(29K9$~9bT6VTj;?oKR0EM{N(K1QjB%1+X`BMdFX z-Vvme4>C&5xL=cLj4Sy(%Zy!SD;v^s2#;0F;@vTw`aS z(FLG|-xc9KkJ#66S0Oz!HU)S6y7^=l)8MRjy}l}3-w=faaa|Bf_hLGpIyi66O!mMe zt|YM*M|bRRq@8-FLRYZFzHE!?rLV2aX|0`nP_ufJ({yo9l$Bv%#|PSx!0idRHE0f! zfiP4Q_QQ^%rzZ($HNRHAYl8CWkCYiuI!D<=0J5H%PO?{!EpT0ceNoc3VIr+{pR_0!yS3-iM-KUVVtJJ>Lr<)SO1lB>* zKi6s*i)zS;wSign4%1HXnql)AEHm<^+3M&z*CF3x{Zh`j^THLkCbeS+vMJ;5Ddbib z-cK4Nr4XSK7PasP6B853)r!STaWZcG=wn*)vVWWYI4%E;KLU$bh6C}Tg-Bzg&E&T_qey zzwm>8<6?d)sgz6mi*$q3j>Bwu@ z=?E_k&XDg5x(C+`&pV`~x3{-tO*e+LtuYFs1IdYU9>OIS+CM(0B%E6(aCC5xTKlvA z=6Q>T)G|T*fC}EHqCQV7HLfCQ(e=YEfBp%B_({ZI+RUgU=6&8O0WFB>l>F*qRGH_1 zS2I(eCdJ{-7mx(ABskqJT4=O^Q=1^BbS_kZBX8Y z(%s?Gzog0v6DPS1`Kz2YMz`h{n=7No12m*q(9tj`BcWL;CpXs}25&S6!vtZ10r1ME z|M}3P_@Spkt^=OwAGo%Eg#((bC}*%Vbj^k~#_|!34}rQeYXXmwyj%S&PNRaU3{Tj; zX9NUsRowjT!mNtt8;YrLjL!}l(!N;VZZ(jtY8IGHgFI?sx+-dCj`#DtJdifli)e^D zM*kDF>m7)&uFSZj#KJ)g3&4y`kTyy#L~aNmLusru9D7CPjhYhV3vN1rf)l~PUs4vI zS0;im=p@B6XbB-o`#R8z+D=s(Dw)CRFn{?H zj}9(Tk0`{i689x4Nazwadi~xo)Ai3QuC6}e|2qp{BBy@gDhEs*^%$ro=->FmflMeu zkPT5ohJVfi0i6gd+s4p?vlfaw7(a!4d7aUmL?%}wiqqhmy71i>yeF94oV>OJ8rC^7 z?`>^B-8$h`m z>&?HqEMzVe1rY(q=nvGOMdwK`hJ;7aW44CD*G8Gua=p)8@#6?lwpYI3 zVcF2lTfvTMnLi=G7dt=85q=PmH+Nr6?XDupq>E5=Y8zN5PaB>7<8X&luQJcU==d)fu=`3Gp!!6A(28%!oDY>}|8^?_? z!gBrKP72F#+-q#aFdocKQ5}z25kd!yO*LPVWz*5k*T9%eAw&)mNNV9AtLEg8{azML zjbBO7*a*P~Fyc>~%8U;f-UIu>BXf|zDU@li)6NAwJWm>7EM$H=HpPBt4{FzaRqr&) zl62BY&8Gr7$-!x`{9gfg?#JFn!-R;&Xs~=QnjWsh4)vghTUr@Fwgj1GnVDz%>)!yI zHk9zAz5v3d2|CHvhfzt(UAt5K~u`K(rFb zG~@+)o$4cVfp~`aL4_@w91R!CBX;kdta1fjC)%N6RDhN-auJ>Q7xs^y9wdFUD$akL zephnuDdkH+9{l_*Ai`{a09@<_pOm;vU3*;~7~Q`TZu$kx8QhvM9^jSoXV~WBP>Ifb zFYcdZn8Al=@w)-@Mi$@>4dU|AIa$)w%F5$-p8$STLc#5!Gn3Jw*UWUHXa+r!&l9KKk~>tU&n)`aF)I7Q}NlDsecx z{yJ=Pn{drJZ@6#^VzA8yxnG?#?fM7!*|oi}NQ!M<#83@97C(DIygJ(VQ|~SGZr!R~ z;ryB!0}z!l^d@w673lrM_8U;o@R2%uL4C+bhVsTjA1IvM-mA=@%3Iz*B*L+y0qL1% zujP!@uf?!hnIdmD^DFN{F#bP(@Dq?Y`75;BqOn1$gczhiMVyPE*aS!3;6Vm#jP>8NB6q*^Feh0)^D!TOCzsinTNsjcqhz+C(e)P zIxY=g@vpxq5{HerEPT0ZIZxSV{9`P+l6X4Xt&R5xtJR-cx;N@``WdU>_XpQAi{mGt zMttaD6$YA!&l1rks<*w7ai~`pUoY*fJTI!its@;+HuO!!r~HZTKZ@s)L|+}TTG3Os zXbrhHTQ-_vXe+z1KS#*db6AM4MtaBS_%ytP2T0!7vEReOVjoQSZi=2t@gp4-`m0HL zsrrX$2OioL5uAL~NZJ; zWWQX>6uCbuEj_nACL;>vHJ1(|WthIy5S0 z`5DQEY!n##{Mn<$^AoNFRjfd0#U??iHrxmt^cHGd3B4QhdWgDM9sgu+Mp85Jwaza` ziabO|w09*)psP2PRKK(6*X>mNM(cKXT32eJ@#O4HylpdMrgC}?%hG7b)rGH6xzsHA zAEE0(u^5$~I%a?_NTV~yY(vEUjTFzB4&DjAb5W6Y>-l80-eTp|HK&jhgW2t3T3cN>j;d=zl8#BB;fhVK591&6=HHp2 z@>dnEf9m2`8%MqI^ZxS5s)bi*&x(6bFZNbzmt=T=9$3=ydY$aLnjY|x7(KI>63)BriE>KoL<;<2x7GjH|I%G7|g^An<{ znhl?2M|r1m*mw(FtCMT;x&w-IU-BG1J6j`5;7f9ncsYXK;QI@=O#Om-s)#xKsDydj zp)%j`f?ghen6{HE-{PL|CMbp3=iWmO5I# zvq#+@Oe4dUjodu4!e3!=kos1|LPlrdY?@spO%{Dp@Hs3PHK+XwQ~}KQ1c7-X6A?R> zPp_#_m-%M>S8aQoy7#XJ_Ar+&u>9|DLw3?L@4vXFkwVhUr&K6m;_+y~_O+-HmzEDM zRQ-5LzNP#~MnbCNJRH(p*7|z6h!<~} zU0tgAUw96`#v_3njd^w$Lh~X;lpc%PTlw+6e%&O5l$|g1n{rrk>{?sFuEYh)>%EWG z{iqI$uYEFQ7xdK^&a=U~AVh|eoE!R;5jyJi!vGMk@WsyRUV2xk@0M!L!^!gO*sT;} zufWFd+)HNm(g-y>aA5VbTZ9nj;5Um%VGZsdg#l$ay< zAs!^SGnN`Q<)z9XbB@(+K_0p$cB4}o*Z!oJT9w&%u4h(4eR+J?-xTI z@a|6PKS?w|(d<9HEHq2{5z88W9(MLx-0_11>`z0ZX`6`0Bg}z?OVvHBq+_X61NphB zDxcgkbxyHb71O`^o9{LB&wx+)H<(zyzVDLaM)E&AzI-vA$wlB5R!_2ZvH~$j) zsEeH@L#&+Nw5P)A|6!Q3$s|Mi3dMY}vf2}QdT#W9#e4*!6mn{Q#9iaKn%#}^zkV=0 z4LWc%CV*(7gOuL$T+{#m)lClHm)un=FV;}=5BvFBRm!zjio2InXcryQny``1$C;h} z;MCRi-?Oxf!Tt!_>d{vd%ZL;96HT{x``J?z7c9aUvrl4W%@s1yZ=@oF3wy^ zIF9#gf+!hElta=)nQUN=t&eHgeGNez_$TAZ9II;P(f49_UpXQ-QdDG9L#RjxFBpIo z18^Pq;F7pWT$z2Oj-a$~?Z=-uq8_B+G^`U(dJQ6P~2d3FUXoATrc8ZaeF}uALWQi%cX7I{^xMV$>Wc`?&re${Kb& z75=iuKR}Z2E9dL>#kFCDMW>qS7oYj4IFPho)evIUPyQ<0W``BUB2qmdqj~3krV+!- za=ab?(gW^#SPy&yzBN#)1ymVYq>#Z*!v7QK6I=_&mR8ycZktw3Ki3S6Enl4&ui~7} z( z;5D%8$r_!>4zi3>!*KT+jy5~O3#R5T%UUwhhp7Khxbq>md)xdXEzbfAVwpo!B-;3~ z=BiSkVPb}Fb33zOSp2|fuQjk*Iq)qb{eQzOQi!Fp+n@j%r$RguN70iaiK5ycO>}8d zhwYd1pE+YN$#eg77p$8N75do{DER0uzx_DG**p&OaWwj*I0F6$_s6DO48tQln=y*8 zf9f`U#2=;kKUY$&i%!>#_@~bK`BtHrlAoIYkRfBO)@8?Y@VHVx%lLE5zxC9+z&%hn zq%Wwpj9Y5Ss{e8=`{3!I_cKr28|Q~l<*idyVEjbLZZ5R59QKnZ5_g1f76BY>b&L~k zxQOvLjI{$1)rt2QHuXGG-ca+^Tlp9nH|c--av)|KUwSCxaX36L0=j@2MxpzuJ zamlla@+VArp-$FG5v`HZd9=}nX~T&nFKLs9c_EhiIlh>m>?TEMduCVdPcP#>6wmMA zxfy6V1!awvrZ`hdH~OK2Om5!47_PXwe!p5iZJ8Vs?)N)VXEB2_tWYOC!y7s0QmE2Y zJYUA~+OlGs`s%>kaIZzK*U)mKy{Mxon;+I=)KDfRl&iOJ`Iv@9m5TIJR3(1PwHXL8 zSWnN~@OxbsRYpLMT8Vd4baYy&1!sL5+?V@)Wr}9xBL}%D&qZZwds6%=N?4Bbm3ECy zD5H6Nrky-TrWwDW^z0?f9P{SDSz+g*F;{6RL$HFPwDv6fEGZP1fR;mdQngH5_&Ccl zMA@^WoaXxvyO2{ZOq+MA+%D<*Xex$+$|;b)p`n&U%|4%oTg4v6i60+s@J@|6L;v-S z7~wXfTHxUJL;NQHa*_zEZ~uU|@2v=U%LHL|417o1qFEzb2$~=7K;>|M);&MS(DL= z*?OGk%vof2ZuBJ~WVipoMz;sV+)Rg9rNQ+56Rru*E2iHx72%ZQH;;QePxbpTGo*7k zF7r2){g$Jnp|Kgr=peJY+4tE7ox9dYc(e5}{@Z7`e+ieO8#&Vh%H5Vn`LExLMN#o( zsyEN5Yd%D&ew-~x9WFpQj383d#0zq^a`@~V1*rAxwe5VU?zrWIa%s(^gN$>rTE z_CS?l<*NE&Qul%w9^${_9uJ7wF~#OWRr?itOM87MHD$5g6GNpGRn!L{_tzC=$hNwg z^4V93p+*%9{eIC+lQa9%Qwi{piVBjO4a zjBj?;y#AC?zKON61cb~7xibv+P<%h{#XwoQ)OMvFSG*zLEFqjh}7vF9BAbxl&jAi=+`#y@<<(t!` z?KLUWd=k+{Y|*{9%ZGW~L`|@r8Z1%A*(WPx{hzo&Day(jc_1I@RCG)@fiD4a-J(?Y z#X`q`VrxPy^Ndq~^-$R3qVyPt-%6~Uj0^&Jpj=KxJ^2bn_s1}<*Phm&JJOT*1IaLu zGwEU+>Q05$5(gy9UY;h0L+M{Uk(jU_3_I51m;EI;sh(hT#ZzkL`qG(pl3iJ6R##rM zm&(7(7ignsG4!6uV|APV>&L(NX^!@)kyY~GS5EjEXqY5m3n|YqI*YA# z7#Ds1DYJ`M6AKpqh;i-Um}xj&?%609y7@`PC(Ze5;0t(l@Z}YXB9Z!8EE~Kjm_onk z`?cB*-VBSo_5tn}=R-BC=xHU3C(wC;VgLPDURXrF?C;Vpt1T*ovV>rR>5@;Da(f|; z^kCRG3I=u)%qqohYc^#t8p8}y5j@LAt)VZ#Zvjr3FCA?ditN|o59#7{)`g+_K{J)`bdGTQByqo`xo;%&RX|_8C z=y6)qBEJ+nh@r~R_j&*O19cE&*!0Geb#~r2cKYvIkFiXOc5X@^uTY=YlMYIWdkl{s zx(jQy8XTr&|3Q;vJqd|8`ouf&*AiR0ho!I!BNhjhNa&qy&?*!HI$-2{U^!)BFUgPL zJD}}zFczV3-@efg}i|K=f;?e6Ciqj9+;ZiYf(ckX89^E#HnV;K2GA?h8%GI z8!+sellaQ}`I$;SjpzC(FErY<^{48<0xps`4}Srlm>h(%kvv~);1QUwzBXSAw_){u zoR^h&i!Wa{!tqO#u<`?LDLx&vk{F% zM;A!YjAQV%8Rq)KQY=i==6;*^Mn(qrKhyqL{byrrviyYdotmUS9!hHA$I0^IT^8@; zVcIyaPe)Q749oF3dFH!d!)fj_lkC<1f_YW5&w~U>)an?<#O0zuQlj<8OP2%*5ll0% zP8{uW{Vcm-ZZ3-{@#LXZ2P5XklD70H&`lGG=2PhuM^e~Tc~>Kpl{XxcX8cMT)0^eg zNM-=gHSZF776keD_qfrX%J`ebxi$eMJGA0UzrX1lbk`{p$d^|7s{3lR-716>!n<7h zxp3*{A!lE~uOhp#&yS^L8vm}tO|xSc?b@4y2FO%HPQ~8nndZB|DbKnAX9Tuvov)lt z-65c?1Yf@RwOF8G?Sk!TxHMJBr;Ee9J3WiYzJ=o#I;aNe6m-)FL`g%8hXB!%|A(uu z0Bfsh+77|pp*WP{?!^NXC{EGh#oZ|shvM!~Jh&BiC{WxX#l0;W+#Sjv`aJLZeczw! z;^eS7duDcaX3i#a?@Z9kU5q_{1D=>xjvK~$3^!D?>fWo=5KfC93SL3#lEwi zED(O0r2sq(FoUQx$@cPC9di37T+pi5u zN1u5e=ixw9i>gd@yB?5O#JiiGIIVRa!Mr#}v|*zd0LD)^h>vR|tXE>}%W!SCmFrYY zRDk{K9(Gyr0tW3meYhHCfusR{IEWkWZ#!PlB;WxBZk4!|2}^8i-zO$*@T+fL(hUoh zTD8NS@muJ5Y+Fo&6cF-`f3<}Q{74&Nf&lP}WAMXWqDfvx&JNn7!z7dUX0nUql_RZh zXPxI}6aZNDo*7!C8Pjp(r%ydNBgoa_;~JR(T%w*X%&xA&IP2tW_!sf!K4AfL8)WK~ zWA%BBMZO}4y3MO68}EaQ3cHEjb|<b?Le-<0Zk9P6$f>N(Ci+ z<&p`7cZa-ToQqWg^b;W<(tHocNo)*&3nW7v%0S(~iKvkz{~SytEn%|QF=pL`m}^#1 z-hO!G(ij7;D0wD=Y&v~d)%?e8wtCdDgYJt~U)4ngaZ%%*AJ}aC+xV}Xa<(Y=N5Jz| zFaRbT_(zC7c7T@i7ww7U6hZmC#VEK7vB8GE6}1Iq@VGaxC0n9yUWlOV<1ExP4EtJz zT&4;RT%;kg%@%fm;Vi-gbW4*cTh}JF9WF^49-2eA4wt(&;0J~E8dDBb$vzZIcZ~NtQ;Yj5I8hK73OiVyP0z2P>~%BA^g~{Es1~3b!kD~0WBVL+-6#mdL4)-I$0a@YG4Db)GJTIJz2pi}()v}HyejFp<# z@N~8V{jUT8qy$u{Ng@dz=z5y$eiaQFdjF;*Rv36~F80#2DPgdNtgvB?K_ou~VDEjScj&9eUQFkW zm}3zdNmj-yLKUv=RIH0Hwq<)Hq;I(42ivTWXKJr;!#$dgljh)Fjqo9NqzOKaG*`bU zfjp)jIIdx}FK;{h2pT5cABNR#`$s>->5MswE3yLp)T7@MF*(VsGAzqpS&sw8A;pu< zbgFO{IfP`<`&Clkat?=mpuN%RJM3G>?Gste>jl~*RSDSl? zj}#!;-E28oXrZgSoot$cltz-uvt-op@IcrRUkEZlt6#pnq-@6es(0&kbYKs~3EM2zP;kco=e_ zQwzzVDO)f*0ITwV98sunaN!jZAu3s`Obt`{emM_zns*BY3kt^rGf8IQhl@gG{|Lrg z+VixqCfya@O}M`w*fK<6+cTw}Znnr1qRiJ+lr-aP822^kPFv zPTquh6V;PqcsXI&LC^R=*IH74M!zNpySL#&qi+lf)@G`8P{V{ACg;{FSu^2fe{!Y%Zy zdNxL-YAQ3C3N3_`x#43`qu67B>A1t&uNDC{q0DJjBFO1n(W z!r;qQeetf95v1)cv##gca7wbbwFaylYvcN%_e-Mo%QQJnEp0ZxJj=SL87KRY$0;S9 zvH`U4E6gV4+|e=I|APhCv6{p{qeCaaMi01pmNRL@wx|L-h3Pk@VY$sx)5Xgo;y0$n zTGuNzfVKql6VP<5meuct44w(PXui|F%TTmpAebkgx=o95_`8p1#Mxq<$y68ukTD+^2A znx^v86iw^MZM)8^GMJ}_$=p2V$}+Z%b}QWz6amvygn&>01o9Ei3JISnWaVC@y&>aw zCVR=*8+;SPy<&;(qmt8z<;HuEIQ0uXyFXCS=82G`Qzx9(xXI<} zUfzHdq$})e<}4br7xX+UMrVpyJ7O4dv)H$~xn#})Qxjhpqaqk=;cZkro;7gV_h)39 zrDU274*^sWa!JrgU@t z0*;TY3KwQ8`@7XFVi$XrMHWz>rHcc&+d%Q=nni&uF*3mtp?B+O^wmdVFYtKjQ0jtr zEgTQuz2--Lp`=O=M&!;rbqQdPq@6fZ`^<1xt{@C67)k0j=a_O6SsOL^UOWp&@3_T7|Ef$A8)I0y!djN0{vnI< ziTh)`GyTA)r&Jb+KhxD4if$FhWvcNpC* z!2riyyO>bAH)dvLG)yE!S*JYd-N+QTOw@9Nu9NCPS|h=( zyOreCMmr9^qv9lS76*DdKW++{MKJ~SKHks31S=jeHz$2pIXF_Dz3Ggs2Y|eI{8y;^ z@wSLohl@#0={a^cIh{nGI)9_}7YQJdUSiv7+D7@#soH3DfmYpje$CvnlgXVQUVr0m zHprB*RDkZ@DcQs@oTq<3kghhre>tN5r(1s=AI#HhS0nq9iPtu&uwtumMhM+g{z zB0sAOR8ou`JXP{EB(EesXrx9D*eX^mq3BYVGcun_Yf4BQ&@ zuWxB5h2Nw94^;rfKZSBTv0x*2u|t~-WF-Ev=`_TCRp+8!(zbO)*%4vxzYn)IoM*>z zmA3XNG!n+~f93<#n+sMQ34((V@aHV}pEbfi9)|i~KLgw74|DSW9067+&x=f&e~wTg zc-|`$APD}s;c*M~pCy+O=zSQh0Mm1qyHR{tUIQ3a8DijHqxxU+de#Qg&;Q|r)L@7Y z4$98EzF)>p2rA&GSs?^iMf*L|i(%i4gyof@p8q)eSnZzxN7{(`y9)5H@SqBWS0-wJ z3vF>9(I6QggLl8fs=onZmV%wMKOLi?6#Se8UJQ8a)W*o~c#u<49ubSDAE>k3S5WER zS@`}CbD6)By-rfz`WpW6)6SJi-_Eb{$Ih*j6Pi0j0IwS&;BiCcX7=fB%}e|difA=M zAKc#Ktqp>t059%;5=Ls?^mOg*?-%r|G%uEjFZ?XK%m4GJMSg2}O6BiU5U{!ayX(6!!*YF(ZJ-pX()0 z$?$HE&3cBgJ=af0h|kAC~w_gbX?r0auDXiF7${l*(t@D%qN6~kIlm`a~S>ODuR7bcZ-47McFfBjmI<`r zps%2TVrHT_RgLk6d{!b`4_o?|D(Kj<0HoJeXE9rka*=(~Z%slA*{)Q;R}I;(BFnI^K{aW~$#v0>8l3Z;P}EIy<>gVrteyZ8h1q+0Omq7*3 z%2{dTv=zk-oOhojAGf`^-m>@O)orjEA?C<5B`sud)?(v8VfIh}p-sCi6sag$XO2yb zuw2z<-_-3z;Dk(&Va72ttFE3tfJEYSDPL0ikD7w|FMD7k5c){e4Dx3y%6V8vXZjgl z8_erIz0n*j`dnm>CcMxI{y3PAvgGekD|=b0Z%sl4}4aYwMcrj94PW zg{`8G?Mu!jrAk?tAx9&VF^Zmkn&v2O?Pn?Oth=Wn4NsY2B_i5FS>2|QW}Z|HAlSAb zo1nG$W0%VJNF?28X)OLy%>QMl5ro~9%FsAXrZy*w=rsu+^J9KV&fxuLTE!RVOgZwN zLpQg$9-l#R`*f8Fd9nF_B=&^C>?PB zq>Gu_r?3kBn zuL5)*Eme8P%?k0?X1K#6!qp1*DmoVEG(rp(Zws&4$S)^)2_94Gb^LkM8-@%0s%bSu zzNRz(Y}|nNeL!E`5pHM0krK&Q=D)2-6Yz^^u7${B?`y?dcRD+dYWUuPWiR7Io?a>r zE9QCYik(cbq02TN^@oD4Jt`)b-9HYXyQOgzYy`LA;6hzB|IpGDJxFFUA?z#k(#W-AXZ+Iv@T&x}FP|>xQ!h}m zK-TK_R&WV1&>JRA$5NurPyA)c%Q}!*+)Xku*8MN z(lBl14Aufg-4!+llJu=38$&=;Y25Q)sO*Vy$*II2cbc8(p;S*d<;0R4m0}(L!MKP|amY-}aP@s|)UG-1)Q(6=M-Y+L(eJ-Xogfx_A&PMXnG4%;{Kf$Zbi)gWYFo5AgA z$_!wYU^AV3_1^tPs420;?#<8&<^3 zY@AMdSb-gE0s_qi1Q%LWCtp-`boFPv1Y20!{<0LJEWjTPf`@&rgrHnJF++%1lU&U(*2F7q zvbGWwy6Jt#!S%iRgRd2_px6fgqbhm`Uh??n3fy{NxWMNcg*CEZTV!>$C~_bSh60n! zg+8Vin*Tr3f@2l%mC)+SBtyWn%8~^z^_@qXvKHx>AvItPI}iy$D7yyBv-9r3&NE>d zE*@z`dNg+n*Y<-yD_jQ^5EF%0X$Y9Oq5Fr>m#;9cIw<-W)hFLItg~krhH=zxA)+)6rmpHcZRqugb z;s~TTRvGaj*?g&ot!kOuYsbq z2p4`Ryws4I8lVAmz?%BeO=u-Vu#a>BUje2P&+YJ#eQVzDNH*lLm#4jz&OK7W|3F+Qz(W-^=(25G^u()++s+& zqz?=FYVslK;x&K&pVjR5L2mtckb4?P0BAax^&1F(@q>zY0xRU98boS>3VnR0XDvze z9xPrw4rpJBirYZUcpr4p_uoF$u%7VLkPAN@8pz~wK~@yojqSY@nZLclWO=fA_gvi` zrQ<^fk7mho?4(bZ-^>Unfmu0)C)&{pYw65 zE?6zPva3SxD>OIxP?l<>Mk(#)JIf0TP>NuqluA*xkubS>`$cAwwy1(tG)yQqFo@B! z$lDR_u8q35ZZ5C=yQIJZR~jk&1E_AJHG1N&Vd**qd$B*-SJ>o6KLuAMQksrjJpOi) zm_H$Xgfv%+iMTF`9uO#mP6p?8@jfiH%+v7CrS(Pgp?BHv#l|H&Zm$)hU6L^j&UhZu zO6@7$lm`!>1R@n~!+vw0R3KBL`cC4bY;=VkPl+&@^SLcv8pQ$61e>2d`Pb*nIRgA> zF{F3+HcGGhG=3D$FzYc#u<6EA8mgRuXg=+`e!`yo9kO$==Jn|*Wan<8di9_xf?lg= z_LeenbuoQ$@%UiO$6{N!UJ?O>jtgLeq4VwGF1o~>Z|fgn#R(h3=W>MrLMTEymDtohAF9fw=$$jFm>u(Hy)hkh&AQ`GP|6r`OuM#L= z?gl)jjRZKVM$2&dS4(9W_@JSqNGpDlp1dQ9)1B2vGkeSZE@zPKuPM!Y2Ak~QY8|IF2VO@a1#B`FgH|sKKw~Sbw z$w{TL9bSDb=5}fr;E!)7^{DU$-vTb#B5DB96yFSiR0a`R#7pWofCd~mNd6^0z_-!I z<*jf4C0fD{3pXSrWT=!u5tMXYc%|djlXYnQ&+U0nXqJw*ifne$3CX2I$QSvryx4f8 zf|*`~vBVqlP*Q%7dO`fPYVAsxaTrw$uRz;!?L1Eg2%|yvJ_1wDUQR2LY9(SN>SzR|#6Q!z zbE+T}Df9teC8|xvYoJ3^!$>}__$}DNLB^EA$UPiE;^Jthv%%qCi8jBo5AT`23fYqP zwHAF1hi~-8{1rg=t$-?i5A>@w&7sTZoS1R9d&!s?BmEuG6|B3IuS5TBLK!Q4QdM@9h=nsK^pF$0wHtfI(VDrj0O$p-2pO9b8 ztngM8L}uAX^2A~NIQVrLD$MK_&L6M4nduydTX+*ZYQiBNf;bYWpTAk+{K}II$_Dbv zr$5|(w)P&xI`E9arjM^ZqWxss-NXvI`2*i@Lo|&EYzWF|beH-pfC5p5{HsVtv-+E`DZvUp2LbRGuMm7{ca;H4TEA5Qkiz<6Lg)NtfLl?3bW{bH*xw+) zaP#NoI-ui|ZSL(JDR^h83))Ppo#OSZ`1e}?(ns^tb0hofKtG`Ml#H|+5`;5u?t@xB zv6cwUgeB0&jWkck)~Z`Jd%&2zgv`wO!*{2PH^K;3mE|==l*o=sti(#a_y`0 z5&&Np~bzc3U_Qq161|g18?hjAWH1Ff|E;SvkJ?Od0BoD{NLJ(4O}Kk#V5;_oVlSo? z&7xE#Yq9lHcZ{;*p*=F~m&Ci(JOLAp^3gjiMG0Bg>(T*!Q=#l+5RUI$kl7k%1Fufv6JuoW`$ZWtx2_6 z*tzv^l)J59?82rZ#Y=Z5N0=#=lhVXJTSm8pORa-hDaUPk><9?f`-Y}gQKfw}HTwD>VZ7%5#yEfM{b0> z7fdI)9<0;2G|vtU$j9Ek#Nw%u0nK#lj*a&;DHn+wV`|ub5k-xx z&>ya^W|M5_c)sWRf1YzLF7A22H<{AtLT%*D&RW%G#`%u+6xzX*xRGp*2Thlvyi`;v z1&_VFSR+o``ja%tp6{>?E@8w?*G=7;@|lH$hzgI$@&^_$+QltUPb?NwiWCi}nCRtj z44Cs#KJK}(FeaE-4DQT&NC;A#823l(kqxz>@nLT=Uq0&yS%3ovIoKC`KRU%3z)@Vv@!fR+8IhxT8|Kqv$J`csL{ zf$X=7IvpP>Wj;)6Pcl}r+6C&sagw=xpV9S<4mEera*i&gJ7Dt&534n#95r;^I+YH< zI*}L=Z8H`LrKLL0aw--WGX>kN2A9w;YJ)k z?d!7LP1$>eDN{hQjE}-DHPRQiT#wO)Rg*#6WbgCioF-sgX>F!eqhlswY)3aauNVvfH#GM_wKAlUbKIa@l<5~ zPb4jk)B@QX@)E{Do-+5L{Hp}Jr8hf1#+^r>Y_kNRO!96cX(M|PrU<&fr@yzzVJu-O ziGGq#V(Cx4I5q!vNAE(kEpgzsIqLx+9czXK-waAUsV)C`6d@x(TIX9vw0TMjV8^;+ z0FLyK{_Q)qQ*JT!JU%rOJ*N|RfK@HlEj`?lDCH^%XeTXC#O>}Q6QXX)RsDF-+G@8Z zL=VnQ&Yx7GgS4>x?VUZ~!%Z`6AEh6MJ*yGG@<)l(p8!bM=Si`MHdWlzD%2my{s{8c z-<2{6v}eEs1;1rt-YT+j;TEI~vAxSfOB0zXd5N-~`84#X(0T6aVNpkBU+vVjAm}LP z?lF;7pL9Dmmd?|GB7Uc?`t8v3cJ3lceZ6CtqF&>MX?9KL%kkmi;|>?VzW2|O=5ZtD z&&M#Ze@x0@4iy(ZJjQy2F5SE-FVgpcC#pkFjr63DW;Q(pD5Y9|TmfOt-c9X!3sH>R z+3;)IZh8MlYRjcTxHP@eGFjIf>D`dNJ` zgrG-?^kECsdV?%(7&Mud7%Ow1dR{w7&gE2)S`sFfT=Eruy%g{`)CrTZ9FufC2m3Xl z%mo_jU$XbU;{KEZYwVGe zjNTSgAh71hS8(%Ml*eUP zO&?Z0y%*oNfuzt23f|Rc25VKr>0bMFA%gA=wiYQ-Z_!YgS-*B%}NPq_93Hw56(yE2V$9*ZhqWy z-^1{9U#h&fj_fx${)_@~*6R08Y)zV951li~rdeZZz{^gX!0BBgkpfyV$X6(pproE| zy3)XM#!TBaEkb9M`5UR=m7=Tx4Z8&VNKnn1;T5yqo^&Zk#VmN#ZjGGa-B0wdkZd!@ zX5h_obJUQ}I;GK!>Q5)3lo^(d z2y|S~bU?!sS8tXE70u-f)1(!dNEwhr z<{Nia-K27^1Wh8DS@%A1_$W4hrYo5&Wg=m*8K)lI#&_qLZWs+mkAB(#bNO((PazLt z019scP&=!8_t5VgkJz2QMRWuxQJ1AMR9*!D%d}RHJT4mD7n7~|(pCb%CQl8Tj=S`H zVlD0YMZW6r3F|!Bit)8Cy;{YV31f9EZ}_<~D2jldc83hS4_+wD{HmLU_SV(J*%k}rB{ z>=X0+0?w<#6u$Rho?C7Pfw%r*B%0$vyd0b@uPoYtEwpi#?SAy9+nJi3(M~ESLKt9C zhM1tF?{US}y7*Y|J7ZbRi4~tz9pv8uNcrD=?E9Gc@oe3ompCnYrr5bGha!2d&_;3d z>?B?wOt6+Km-|rKyP!JiVk6h-$71QN5-IrOaS5Dm6s+tM@fi$VnGRG8E&d%3XtU{o z!=9)+$>81BU>KtgINFF$z;By!KK3m6vnz|3IUZiiIG;itpuCmdLPJB&YTM0%hfiM_ zVUG<^#K~DO>G&gNtg4j`2M2y+=GHeatqr&3!a9OW5m9T|m?GI&xDwEC4T!B@iskI( zV-jqZ>z0PeRzkQRCR;C~5lHtOlDGx^FhCXwnuTm2t*Gyk_o>{Y`Q+DA|KvD`mKXje z;}l7J9FnB*Ab}^BU;af;%K>2*T9JS6{rYK` zxsOU}xr=qu3?mIdv?rT@rWdZ-m%!MU4dR}IyjARWpxL6L@raMQ%Gj%lg)AsL#5r|d zHI<`40>+EOE)WFg+v$-?0!&*DAFB0w2PQU*Y2Kzfpkpt zzGdPYcRdhvuSwvPGQY0z1tAVuzik>p{E-ydDnogl&2&o?2nmg%rGLry6s@TVla~RU z&~L_~xwLijFvp*XaBV2_lvT8iSq#(gHWztZeU zR$iwbpu~KMA7^7qvqJ0Q>mgsAO{ZiuLQiAd{_Syan$$*)1i=taJ86@Ar@Hl;0F1~` zRJ$x{PBaBLSN}QLBg(knvD*kH#05L%X>wK_SbRjTcFvNhmp%C_FVEMTM-8@T_MvK~ zM>Wm;WDf{ynT7l|YrK4*{WTT%1|m$z6IK4Ci5GJ~Y?(EVWSm+8!0SbZT~{~ZciWlV z^PD+PUeL}rxp__F+ZII+F=w}1x`6G)_3DuF1}^5;TO7530Lp9TdKN%~Q9odNM526b zOMRy(g`kBMdPNi97gfT4+`WqmZ}lu6ubyDN+A;5Mw@b`eX7GTeNx?f36(VMU{j1Jx zXTONsYZU~D%v5g`8YO?0yElt3l~IsyQHGuxmgeH6pEt=iv}(evj$^m*3j+aIC#UE7 zb)P8}a}IO5Y5-Bz=G3r#4*$a*z8s-iY^bNIFKX1w4cCbGPO)p7cw&#Nk?~Dt!SD^` zT$##_#vDq9lL&wY8^@?YIYK*)uS=!>BM#jhI?$kyiK?mbI|v@gpPB}o%$ODI+;=}7 zcVZPlS-1#9kxC6-xBa8>yWbSfE9-KR0IYNs{PpLP>{Z^?M;gf{VRyg)YtA<9$|~PR2@Ms{lc5p)`@c9|qaOuh_F` zz|T@yB)B6Ju{-Yx>i7`(9S7^D92RCZ(Zp&5rG@$j``}NibHYIdu_VY*KNxf_Hqc^k z{X%XYC?ZU;;H@-GgOJ9)kEjJ9w73BqOdKyR>8Htm6&Ad+{cBb*x5PGy3l6dpB*E*W zaeS$G9#KNOQgU27lUO?H2g`WhZKha11i>3EsF)6M6h59xfMUx zwVH3$iA;6GL)W1W6K3lqh5jAnn&bFru#%8QClz<0;{0mINRXVQyY7p6N>Yx2QX>I1 zKasd~37um^PHV%KxAH(J&5$fB`MEDjl3uazJR(>#M#tM{u%r$ipxY#Hml5;GeUo5Q z09%Vl|1}`p9464Q+gm3KE<~_Vo^r-7>5v1B44|!ui5*+eBQ=QF4yonb?rMJu>G!vG z!e5-8s;&qDl%X205Wort613#tB$1?45B_1U1v7k2-&ZK$s9#fWb<`284EuSOCzW<) zdrV|Vn=^N^(-H?`>U@l_0d7dly${J{pnz1Rm=dxl4A_@XtHj082-1lY{_j^=(&`t# zNF5|iejo-&T#>iu5qX)`OQyDikE$uQ44SEr-oGk*x-)m z_208Pk%FHTepqseVuFrA;9!7TWv&7om6lc;cQn<#YHMCnAVhw-=0FSuB7?bZCgcnW zCGRP{Csjnd`D7}whvM7e{3TQg4r~N`i0g3mwq{v|=Op3b=wh~f!C;8i@fO)AnCBuf zU`onHLoKiJT~rClUXeU)%(_GaQR89WLUcd9n!>OX(ja^R^-i8x%IBalJ*o%nyOl1p zxz5cxSC19JvhiyPu4RX7L!JHR`Qy=%C0p_99U^GO9qsBv6fJ6CYWl~pjh~s;TEwfjkJU$#~>Nn}O~)`1k$ z+X{M}ZzmZIWHc+{UT|EWqqMf@pUKqCt?KKfN*h_0^Bvl>nHFs~>LO;i( zXEo+&4n2iNBbU9eV5kO-s(;MLM%4L{amSFJrN+>8%wu!di6Q>h7Sd;Ntk97#XZQkJ zQjy%t{=H$R`Y9yEUED|p-6HuuX2@>r-T86es_U0$bAUbt$gpJ1scCd-4oWQZF0 z4z8vU+M1-y7TUikfW2w)jL>95@m;~o$EEp9fqQRbT;|xB1hB$GyN8qJMP_e(pJhlcG>1Xj?V7;7ZC_nP5%>LmWjnxdYFx{pe4G+kAV z=qCNuJEmf53cK2UKX!tzz48enlm;0HSJ&bPeWsM_I9+?0Pj*r;uNlNW%o{$ys@yfO zFtR5|SAc#Jxqi^m>o8+T12IU^6!ZxdP@b-Mk|x`K40Ja`ZD{PAt=7auAohuX^WK-v z#)EEZ#(|Rl#uj%al{-OHff#}AEqV>wfrWRo4Tm!}@Jf@BsBQ<3k}EeBca2l(eVNdSHrUpv@C>rJM;O%GaE%f7`P=_~@yxmulO6=)`fe zU3dJ&yFjhe(Qgks3Pk4U{AqZ1XiMMmvS*T&c;T|@W~CqT?n3g+qGkn{tus5x=i!qG zyXU?@%IGKEXlqXUr77ahqWaj1q`I_n$$A-6(Ip%7ZfpOlB)_(zO2i#oalNxrW9wRX zP3^XqQV?tVhk#^_6P!&~q zA!HoDk{ke)h}D#U*-F#?x#_)070XEjZX5h0es00EH&iX!0(Jf!?p{Z0cL|YaVeRAG z`MXA<3!@9>rXOeC?$s{o!xz{WkO}@=*IG-7rxJB?oK0@BHFntYy)%t1XP;Q>4x5Sp za~1|)5Z%%0Zm`_8HkWw~8a=ASl-)IIPb0A9Iv;3&38=qfS*@ib=!Zw6G+A3PQTd|F zaf+@eDo2ccOs9f)&t(K2d!P#PQN7@LjeE}{^+t4vp3}x}iGwd`&ars+*+=}3+Ksg$ zG^t-5l@c_|reouG^4U|pajfe8hWHJJhVh}6s{>tKBay+y{N#UFXj3iIK&XcAT^BcW z#Pc5ee<0qK3zmQvSfNQ0O8}3?^^_mneR%Qz(Zpa-l-sqXnA#Sjo%9=@B+7*E3{?dM zoW)8LpZwMCqYBV3O1vJ@@W`6 z_8aL8VEr3nzLA8%QvQiH!=n80uq+bK;crsd-_rN3{J4MqZCj%L8^ouAKazr>JzyWU z-Tl)t9rAC8-s~?@p$+FbYz_FYPJDij-Us}(M%dj0k)CfS1ID!qV8*rj|8E8V95eqL zwx@=i+@iX1at&}M~OtQG;TBB|2j zKslUI+AfiawcxLWu z0Qq={8M8BK-~vaUsjxF404v74o(3X(aM_Xs6GuSQ32aAc@Gm0)Iq5cg_xu5vq<@CN+_Tn+hYGC*D$ zpIZv~h9C+RX|)p)T9vj)`~`iPb(P~o!)eOWq$Pcs{=8EKGnn`J_(Cj2`T4yv}|i%)x>I|V=a-<_`HU6Kp56(b9&1G86( zoNdZ~+{~WM%;X78f(4Vjt?t~H2m5Ar1?r{zRmjU+Kb#)cqeGoqF<^H7Jc*jwAR_`) zk2(F=@UN*N$ZdnP4jY$Q7+stQUM6x>ZJpC)_6VE34J!7CF-4+P99Brr*yHF5vv-<~=GpFAbN3WZDMDjDL-QY< z=L_sHc%}>Vkz$^KV)2jV%HTBG?XNM58HtE@^K>LCE1wts6tF`^X-*M}Ex+Lj%^==| zSXzLEU(u#DoI;frzqKwLC6KH(6mWC9*7g&h?7@J^b-W$IFB7_FNUA=W-K$(pT$jYq z#%$2nfAh>@#QV`74t1f9chUEI3#!3lnW>o(M25q{x>G>YO~3`huzHSpr9G!r5(cTx zvl;{RAC6TAJZ>*iGKi2{VJ z6R*&CR8lh-Vsq4Oyp(O=QC~%Ebzq}`IQ)&(+idPHftbVt?%M2_Zzy5U4%mwtk{d=3 z87q-hYbgy`9Ubra0VUQsbx1O@bC^1OoVP)`;k@=W?j${z1RHG53K(37=s}V`HhD{e zv59Wgs1#$JN#+r~#M+Uf3y!c{Uk9}@3um3Nnxb+6G0_GUs7`qPaYZ=LNg^u_!DCMM z^io?D@N~9-kGk@@>wR6){X$}nS%!I);~OdN)4a`WyPFFjF?5x>pFrY+xYmc@xl3dt z=fDY;Gu71Ulee)Sl$vrltf>Xg4b(WkzHarnH&+uW@I6_d#I@oud3I0$+s_q7=?Hg+ zV}+I%s)5Rbp5IOpsP1PGg;w!@XpEM9^?3uP$f2GLt}S&6%;C%zeosXV?Ic%Op8lnM z(ZQ7-kM8D|fNSU)^@k}xr$$Whoh4(*1-)Z8%b!wXObee)oLCC8XTJkrMXU1L!i8E& zio(jn;989b5vF3DzQr^E8^x0!-m>-P_`d<~FkZTqvX6`CgO}^-5ifCK0Uh?d3krxG z{e(JkfZsIap3(!2*pLTbdlj&M@t-WFgybP2hnaIp4|}XPZw4l<(8aA2^kq=D=L{MCHEBLi3EE;1K%e*-(>v(HM<0<~fU{aX(()s9h~ zB`5ZF`H*076(4F#Ft6F_`@I)l%;tKOUmTaE=fJC`kY;M(Hv5XC~64! z6>xR;{FdHLSO1OuL+ee6j2$eW6rBeM0~0;aK{4{p6rW8z-YxKuZhiENek^kTkV}EQ ziyfUb%r3EM8xB5v^+;IvrXlA;>o?@S`t)WJKHI1;#>9bijo6A`Dv)o0Xf48PE^C-_ zU}_CeeGsXr!lRo4|00loI2V>)4fd+?V^9VABCE59@8l0WG9a{x$q`tMq4A>Q_xn^8 zuF$IYIje$s&;$*{q?K>wwx#Cyl9UfCa~g20_{j^CSqeqDI*g<|K(2Nno0zNK=aC0( zml{;}`Bfije!GxHbzk7LIwFS`e9=5Mo?h(;*a1A6T|H|Ri(98J=<)Dbe>h7^J!B&{LO0ziuGEs6WH9*T+MH3{g}u_ zznpmiKjTSEaf#8$BlCj9{M>{qpJ_^6ZFY@ zRj!PFR%Yh9A5>PM0ikptJ~sFANBz z;xwt0^+IpLD3gs>_89+jX$gbY!83D#p|FQzAX12FS|M^6)+_nMjx*hV_-EHv`8v;% zH40l#!^RK9j3jMf{vKvAPT3?R{~vbuBeuL??1I2?jUXck!d?Ch$|U?Ygc0G672(e8 zo!*fD(9c90mTJP3A1*A1TXmOxE*(9s7}O935E$1PV+_rrITmC}>9QMND9QRZk@-It zo?Z6YJYV<~Smh^61P#MG>xZjXD}OKhoLu+cJZosU&@QJyhg5DH(GOT8WpU^iBq+S> zZ8%n?m zMfPj&N(JlO4n+>x=US;7{48=r>J`Sh7XeuICM^pz>SWdf|ElFtTmKwdpg2CZ$B$U1 zDwH*J2(S@p^Kuq;AY$&zL64@yFfQZAjuZ+!Ydl$1^5a$!C!kwA0>zL4N~b=x)ZRvP zyv1?DHi3P_JW#R5#aU;PB;m_-kLtmTX3xv>n>j5ahP2b0|_4;UH> z|NXQ01-~04%Mxp7Y6c!TI7c9q(nBPx4^Ci~YPBm#~iHic?lc=gy(nW<^D-Oo4aSV@VUR$j3O z2gZ%y6T>P+)%m^;)Rd&H>1=!*%Qlw6tGiTTs=3zgYmlM#zT#aIaG9Vf zpo(|otC}bs_v_mE?wd?i)%Q0KAx6kV`$;>%izMro7r7vqJ;orm9U%OoLFh2xTR@^FhKJ3*OLhhwBqp! z`-g3E0iOcg9{0&TFAR2C9Sl-txeN=r=B*k~fJ|4~yP-#9$1q*qAKr=7*Li@>Tljb2 z8Vds!WiBBSx8IdT^^;^_&p=hQ%b4LMeJyuRR1?7K*kN9_l(!V9%3HDO+18~7z(nDu zhy*8fGPi5zQhr9H1v@vy1_@A8lruO0vgncxAu~%hJtt(`9sE_ZOcIDX{!O8VRf;>vnnblIxIf;5fdJS4G6_>(n@mx{5;E{|D9@mfkqPBJOu>U&khz=DtV!yBurTaqXGHBG=Rdb1gu8M_vU{9}O zc5^?|<$QcEg3&@!4}fmOWUX_~$+3Ejx-+)TFTq3{aXIvbQzj7kYid-~`cXrb+bf0o z;gMAvQ%G~nW9K+>tN2JPrhj7e)T-REsd-Sw4Qq{K8BukvTH5cJFbEGYhaK&AU6Mk@Y9GHvvdojgzKpZFLFhg;Zwr~#tuin0 z&l^*s0a9s!NkO4p`I|Hocj6D77WKJL?Cu_Tb%IBHh|| ztU>CAzyrTl3`u0=rx6Jtg(;ViGP<&e;U)FNVOmX^Xw}^ zN}!u>D_(+4?FBP?=)>(Ric8(n01;CAl^tAL85Tev()X;}y&D`H!-aQn)7+x0xCc#g z!mzntU!1TujDOjx|8104Z<2uM8k-gz(SD?4z~tN=?8mauj)WI!9*}-MV?cv8w`Rl0 zJ)`&ToTuNh$Dk~uNfi*;qVuKqY|STmz2-@@L?k@24Z&pms_hX@Es|`P??c4WrnUC4Bt$n2e#Jk^FxIDW$8C>py31v&mJ!x;7C%h$ zLigj|PuyBallt@Zw+6degKam;QZf23>RAOfUB7l;ng6W@K+fp+*I8eBsSNZWf%|bs z>Ck99?o`m$81anVUp`p2z{1ylaM*_RqZfE~o>Bo?yPXALGH3~v2S#5(1E}X8!w;$D zBA8XrO+6!YVJ;D*`Pc@Ws4#RySbpu=!O~x2z`OvDQAk68J^?8Y}B{5+aN zjna`1jD~=Q?sdHqdph&L+Gc7$)@BbOC_B@^7;JbrKs@Ng4XN3QIOW*!ykyjP( zZDR(tGCz9L&106*`YL1ixY zel#6YqQWF@opZ?BULr#mDDVd<&b)eFBv`CGa6evgNXKX^{Y9}a(d7-SQ!_@xkoe3Z zuVd{jSRG%aWmH(q&n+A%g;(n?1@^mR24Mx3 zFU6|ie||(Q-9&xnG~-19TS@eV&jR4u*qNx%&_YT_4AI!UBlAs;3+km%2Aq$8ulxl* zg+>um&?^+wemQwX+fhgHvF%Mei9-N%t?74W-CFd$f44lEVl>Xc^dZT|Ph2QLssgjR zZgECA1i3eAN!@ zX+Y+7QtWcmA%sM??_5e=VdahR(AvCKp9;}V9y`6oX1;E>=}y|L7IiAfrZt@$QfND% z=OVR7hi((tI|P^*PMgYrE-wUmsH0OGaWqbmH2|$QBEJ*40&t)y-0$NyPO~(iA69)I zx>A@S!-&%Z64agaM+1_tywzQLqBO`jo+RSiR0gP4$|qy|cw8wEGD_id7ls@Wma}{V z5)J@@m7S|l-Ugp`r={CG0uwUg{H$0==EHG8K8Xx~!)ZGFMlJ*<=ye@2$c2^Wz7T-9 zh_e+j3{b;^I)}NxMTW7J;w)(Y(RDu6ULN~%*HKp;E!_pW;a*Pd zMko$cr;f}IL*hB3YpQK*c5qZR6p6)8nCeL-M7U2aaeW4uZN=>gN;IU;o&;rSygdXg zQ*Kmipy^JvsN5)+EePKhu~0+o0vGMzz#Xdz^A_51M$fP^v1+Ki0foWzeb%;kn?|E-a| z5|?G=`y}2FU(DZq?2-P94C`c|@b5l$7qxJsSIE0>u?U<&n25^_qUXON@tBg#Te0JR zU0@;Nh|I+&C(vQfe(?FyF>@?=)jvv{IvD8mq!+ZJ!pzjvDcHd52awRmFug4swpMXg ziq92Bdar{zbLLnxaiQ<96k9al7p065M}L-FP6Xu057r@&0g`aX+Y=kK)|6d{m<0~BbNKnG8ljo&OS_l|?~V%z&yV%J8ko{itGsuTOIJIOCy??YyZ7~pU+jy@ z13bU)XWR&YjfpLw1^6qMu~PSkH}F?BYFwyh;#vU30WxeMVel2B#h0P8fN$Gr{xCW* z3OeS{{tW^cFcm5F7LjtN1+{yB_tQ#zR*R8F*P*7X%12_X@{&Df!_B=f*DidIa>gmgC#D&8OUmRfIF~ZYK3tHNYOos0 zSf{*=Aqg5~Q>6j+kquaEa8O%?n%99eyuvL6vYD>F8qjIfYQ6Q_^>F;_&+60qda_Cr zr4{8?E?HXgGqFB5MnhTHqoxPE)Yi1CW3z1X6{TtUuBXg)u#&8EmUMo(S>$$TGW1b^gIOogb{J2!XyNSPs5Q{j;S)x;y65QCSZ zMb>d(bDb9C19g;JQd5j=Z+Ior`b7@pz#{4EWw?2y9T5n^mHg&(@iG-JAi> zr3<@z%&pOjQXqey-G~!)SozYnAwlFY;kOj)2Irqa%^sdl7S;X=e{n@b&@6I)Mn7IG4dz<$CTZh z^F5)2hr0Ix%%+ztA_A{+wpw}B*25eb@?8>b&jD# zF(Z0eBVWgyp^Mq-R{UjK^u5P3>vG|AR*!)81dox{c+jI_C9Bv41%6`&?9*!debk8{ zW@V*l*-%Nsu|pon$4T$opfX0wi(8TbLyay_U4A*F-Vm?(_6P&PrlOSFRiCJk|$N7UL`)z|H@}{=@IQXuF3`Nte54p0?MqgQO&gFbW*!&*f+)MMJ)1lYF?qFL!n*^1_H?sSx7Ot$A@JGfCj2U)v?VyXpoPIPTKz@9R}G>v zwc|*}3`2|*>V~ecMk`~}1^z}|u<3-Z>Ooys#Ku>2&A|rBn~5O=4o|J|xi+n~j$v(< zVCLcMUWD{`t!s?gANFaNE!VDB;BN-4i@)DmH~cB68R=vpz^dkHzEh|tB1 z9rL7|n9S4HJ*MjV$LHG|BfB5tZ)Sv?P`@31YhH&>GK&IeAche|Uus|-o&@!sdloc4 zbBti<^mnVYc}?+kvvDBqv#rt04k%Cd=@PQd1&po!ot9-$pG&lnRib9zAr^H#o^S$Q zs_NB%uKWzZO#u7EnA$6cpK?9SHyvE95ZuRLO)VmNGs4)_!tT%##dpi&=^}DGEpm;p zzyWdFB0+Slju;FzmdOGDGY;q}V``Kfugo(d<>oT>U0s2^^Vbd$HYS#2RO%x8o?<9+ zudj~g8nTuqkd?w0CV+VLz-R=g8KCHK12?tb>3(;L_kFd=L{c2c#%}F>qaXmY39u|> ziLXomThm+i5>QUUB)=B>+)7Pd2!=1b08-w)Wq8V+gUHSjK>H@l53_X{;zVSo2V;m- z_Z8VkANf7Oi=47G$H6(x)si7Id){(%|4e_3K>#dcCB9uOir;R51S{Vve6bHR5r_Tc>sf9j zIeg(Q-R3>(T-Iau+Y*ts4vzrbj(2;#qg@NN`&LSBs&|6Pha)JMLzVbWfDc6O(OE4s zvE#vqNLm*_-M2mNR7d4-_VtoWDLC_`PQz+_KCIEGGY1J}`4_N32y9v!KU%FQn1U8J zwDAngx3OVRYyoeU*`F%mkEM2B9uFy>;SHrKX|1jLPd|K|%SNC2@g@w792_gRLt^F) zRx5kvZcXsI*oB@aFU)ybJanNz){gG9^fZOU?@H}uQ8-v6e73j(oR+a)lU1NgT(p37 zB>*}X>;z4qHRys_zt5FLdJzmiDBC%nzAT#-L+bW9GrHSwUes$<`Fb%ou2qx3;}RSE z3=oa&%a6&;)%yH%bZ2V&y^H7Z8%fxn+xma%;Wj3?|5LC0 zsh$?8SvG7si52%ejr~%Xz`XdUWrfV=k|%SX^~*>jPG9Y^c~)FsZ4nn2`aaZpqrN>s zqe#SCm=pmVj~yx=Jtf(yULN`2B^E@LESxr6HgPU^$$;=d_@@9TR4LX-RfrD@FTU-W z$#aQ$M@UB@`fR!L1P)d&$3zuv(9f@edRbCM;+m z{Vfd$QY1Y{Aa-@Mp(8UygD4FEc$xr1akiaEQsp2|)dBhR(9Z-q<$V9zy#U}|5EIfG zCI=Y9m!$~{;adYJqpLQ9u$3Z0-id$~yg%Zfo_)tR;D)+`tGqlFApEgUWZs0~lEVP4 zvtlUp&|LYaCyE1c*h2NQs-XWVf$$8A9Qn@(5v`+i_YFSz>mcernVp_&Q;0u=f6c!( zcEmIKe@vPPSQV{*(QH07m(LSN$(95H)})98cC?(7B6wWdEHxhsTlp z3x@ypNfwdyYrxOtuLE7++1b7B3F-7*g)D0EAL9p6C1|&0*zwzioMtImz1PN_uVWXn z9pnCo%gYLobzhfe9lYDoqoVdFkW~Ym(|7E9o>iVhvx$i(|3;#T?auoee3Y+ z&-bdkIS(^y@PSp?$LXJIeXZ$7NYt`pk?T?c1^e{qy)WdsNl2GX6uy|LcQ5F3xruYc zlBsLF<*w9t!QLYu{K|&B{S9(4ZgA;vA%RbI!+TN<-Ea1!jN9#xkvV;4?1h02to$CK zCly8;R|++Gy>rj8&qAIR@8qc^kd}loqD^Xoj&n!=hM5EO+WI+j~f0DygUl8wD;@x%IMdx$K ze5Gq9s&86M=)<>KAHH<8IQ5?^=~-4>z@RWyJ&P=)P=R-IvOLdOzx_CysG#c*s-&a8Zu7J?Lq6r`j5?-Z;BoIx?<9#)O_GMEpl^6S^D!dWl08Oevkr2Q0X0@cX+Atezq{RpH^fc5!jQB2rR)PRy6 z!#oLNGN?rW%Zd>hlyH9?zv7jNtb3}Ohbai(@Y^gDNtyy*w)z>=Cqs;sdRH{*Ol2;m z>3Iom3XjI#dx>Y{@Q+kR0_Fn>H=20{p&55xe6Pc`1a46s|6E4Dyr)H)e3Ex%S!!3% zmD;*<@gFvD6WdGbj2G||j=(xA84vXynWoQoqkohGQG}`p00>F))J0me9}h3Q znWWiKzltPNb8YQHk`_V0d=(Rz9?u9D&P&6M$R;X-t69>k43XB-CoLLCp-#KA=uFaw z!)xO1@B?p0L`;7)PP*D~s zS<3o*k!X0pqW-P=88W}Zo|zbx`aZi(Qi}srbgAQ`^&VJ;PK1{I!r+_B{|pT=3(p;N zb=)50it0=huXSxT{6Pb`d3iS#lcD}bjkE`T3pZIP=S?3rYa=fEGFOCwW?Jz|e|8<2 zR;;#$Rx(446@qJ(%`9uY^7I3S8<%}5i&szBoy>TtZ0>5$a=&q2Xl5^s9EsV{2mm6! z<6E&nddic+8bzTq%kYm8?y06)%Uq^bhM;)On{r>m((*~Z#u{;pCVM1!{Rj_rHr?iy zUP^=!6MTX{JtsPLCsN3N+1R(QKg_!xu=7FGfL9X^p zALQkrD`!Mkcz*bl9M_9s6SesT9{F4rFCa-XIL*KEt=={e6RRYrj%z;sv9_#@?#s?1 z9e_o(NBE>Tez<{*Ro9Zi+MrCZHLTG5lK>)8P`FgNT->r6x zHt5mjm5w2rZ(}aa?XUix-z~#GNp)(hzb&~jITW@W{}o`{Sh{{weC+xo3B%(}izgrF zcc%nzwxXtzf;+RWa55)ck0KCU9YYiUS_?=`dmb`nB7jt6`S*{zxk6i_2sog8VePwEcSps;=T z-N5P1J*XiNstpQ=87`iANd{GRwf9$?$AMXT@eq^$bkXLvx~fS-Z4EM_fjYC(bjai$ zam%brHHa>$N;!wQ?3pr@*5Bm`e_d*6kQ}Mc6v=R-aq+ra@5}Vd<|l#{BAAR&Vlt?{ z9X#8SArFmL#~r8LkPBhhk-}_>#=FMlamP5#K>?C zARol(1i`BwJeY8Lo8I@|zr)vlHg_TwU6~@SnUPN}NqPByE~flH%OMc$Vv^ETH$Mlj zpi4s5U-$mZ?gmdmibYRj{;Lx%iJ)1ihiQtp?Y=S|;_$-hMKk5s%r_#u{na^PtdM{d zzp*D(cpwbnf^k4^1ZdM1>p)NE3IeDV8T9s9RMyjKpoh3%8K9oa?%89ZBO#ywBjETj zvc{b&(F*weh&gW(1}6AE#nk#AO2MFxpgvkFC(wQYVLMShif^CwzYF+|8oFkwGbq@! zHhtNE(SvCO%-2V_7AJ?H_`0$68p)Gm2MyX?oMQ%M{kQW-@b9KjBZ1(MODUM>q7+g# z!GD>|1d-ip?e|GkIeu`3+Ybu`{~-Ji`z5oH;9JCb$VS30w9<4Ep800dA>Ej;HQWDa z5o)O95A|}T(Uw{0=2_{S`qNlLE+T$@H`rdtj#wlH+aSXfIR9Y*;<5XxQkC$#+IW4Y zr(yq{NA8ZC`07_)5gGB5+W~Q?rGWq4LRwROy#PlA18-aYvyJ7T`yx}#%wu{W|7WWi zh{k}SxhLqYb0IjTjX2Np-5&aYd~my`8fA(9)A5y^2zT%+mftU|WPkhs{YM&(e*u@( zVW4ny}9{NoGYBKj;y$gcy9Qub^hC*pznKS!3?2xSYVr-K0onBYmNpa@|+`IZ7H zQO-+8pYuH}h^IG_ga0m$r{Dj|D-%TSKaHhDp#67iL{$6F4)#>gFY#X~A^7*`@&C8* z;?w`%fci`8w#0{}-qT?P%z|nmfz_i6^^dVjl1B%9j#l*-1;Q@J42XpT z590x?U!46o8(mDJdyGFf-#yt_qzj~84$lGPYholQGN!xdO0BJBH8-xP{5)O+f`_K* zFpI;D`($z;n2>4WLj~4!Rpyz-Dp5=+eWh?rbOcF`i2i-HkcUIeZn$QYJ5mImi99x! z#~gWdc14}-qOAzsbbZPXxA^+PYwD)@!1$u(=NJ2iE*4})ij8;pDtZgR|ow@oVb>A$$#gYA8IwZsy^6Ny)+w_sf(e%Y_Kqe zb=0G$-ZYr3TqNn|eYUO$`sAFx7v7-1*sPoyj9Y#sHUnWxd#P?NJ2sYq==b!Z$c$Ta zYos*1R^`s~{1DjC-i`r5m6dh8*Ce3@hcCCG=n(KSXGH~YTHc+Pz2E*PEqn-+uyya!nd3;BxU4!2^Pcx&Upd=}o(E>d93 z%Qr^WKTly`s1)z3$eg9J}{@kc`qYz&AsPwI?RCRcD$mn4VGmg<7P0dNM&4~a&uRZ>egBI>6RX=n1a zG{=nf*VP6^^u2LD1hg?x0~j4-!19Xk;AlOmd25Fz1Sby~$gOsGu5Jcd@zYg-3?oNU zxrJ%y>p-V{4W2x-xV@m$v5BAh^B7&?LRhLzg^t>q!zzs5Zr2O*HuGf#` zdQ=7(TwE-IDdmg>?MY$Xqtb^RMy(~DTe_ZdQH*9lehS}7Y;(avF(drHl~NWp!WjPe z3BD#(w5+$c#@vpNldiFrd6MQ2>Ms;yf2aCHOZ64=R;GQLnQ^SD2$;APZs5H$TGw)@ zTfyloHDIJM&(1RE@=@j#qM1spSC}5M?6v0hR{148slB>1M&)8ASa3rE8aOgY{ZoH7!0I7Je&^3fC#$*O&Vgq3}{LIm7>XfVW$?#U?AcEcBb?8 ziCAc5BH!8uxOeKQ4%(LRM&#rmgJr&}I3l%*xct#Qf8G=haK4nn$GdvKjc9+XyU%Z^ z7flR$hY;F<`bZQXmo?Oooz!mtA4xt`@~Xd4uGi3N#aj(E z$SfaHfOO8x;<;K#aL$a>TG`O4C-$5~@}=9e3+@606v7#xyY4{!H#F#DsnY}>Eg;-S zFuV6T$U`BozY-vA`sqX@kx*$?i7MzKCK26=8`NT+KJM-+vV?&ogpd-8_z(>WPAmdE z23Cw4DuD~Yq1dK73FgU5-z26pDio#WQP=cEpu>wVSz#!XB6v^%Ek36Do+9MFm_pw; zowjT?80-B#`XPO<8UsvL!u%OTMVi)1jD*~w0xLoC1N0*wjt(*C+7=*vbn+Sv&vsDK zkxfBrJ0w}0J57l;VQOhs^-FA`VT8zxyrh3d*F#fP~y2n~c^Ya+Aw#*BAiw)lRl*KEAG-fZ)aDl^e;;up=PF|t=s zPCJUw1V|$-#3jx5C^xgm_0y`==D|(^KOVGBETir5j|@6^H|crd0>HOX)7$m#_o}Qc zUi@hT4m5Mf>z#JAd;aI|>Z3nOr49iww5zfE17YHu!C1g@_8s_}#V_0*J6UUGwi@ob zrhr3!55LhLhvNIO$ZOIgZ(Nd7wdg~89xP?+ZoBXK{ev%;*&7Oxpuh7AlI8rgE!wJ5 z#`VVQ81PjX(^ZWtn7$l0;rB65Gj5&y!S@4Lct4Iyc1s(Lu;Ra**r+kFDU#Jo=Ektk z#kT=)UsZV|peKreN+6vCAHt7+JFr>G>3S09!vJ*`4O99dcHi9qHxvY;FnZay9V$KD6}8U%FVkY9m?P=aPbB z=~vjG^q8c<>9liWIeq&pE3ALmF35Ya_zVCi_XOwA)l}F>A5K^u)mD5P-@_6Yd(wcM z((mLpcCna`J$HTq!BwPJMQ;M=GsU*doHuYb{`h$@XK`zsnT@B1_yAhl4PVjvd2IWi ziMRP{yBAsgiVGmPNWN5G~)lEy|Eo>@?!r=Q`=RmM|&Rouwpz?9Iug$2 ziZ4?SUj#rdYzRLlgt*_HW*fZ)EwJN@S*7bm4ef+#F--y zhaSYW6zn~4nfKFYMf(si0v|j`!E^_)kb=;B*7C`IAfdyMZq&&dB)dgk;6pzZBs0>! z{hntqaVCf)gyfq96k0#bu{w7yRzi+7Z<`|*sZ*IvpavgGHch|rm5BRQ=YwRHhWwfy z=NV`Adj^o~EyMhwE1@wah1x5F=tx08{_&?N*)x}i;fnEHisR@vYqPEW8~LvGlk<*{ zA!;5B=q+taTMO;<^ZkKE1%MV}RW0H`i4*9 zL_U5DXdlqBa0Fb@@Y87%os=eQxD#Qi)JW8Khsy{qs0b${SeppZ#k#}KpA+B!> zsRFOIA!5pK`|?v#4|_M7>7g6xe&QDS4q=6np!GMcrKY6dMU|1zHwqrZ+7|t#9KQO; z0~X?h;6>hck-dSMk6lx-h>tgtmk^5*{QcMz*|;6Z@j@LndancUu)EUg$91a9^!L9J zR{a4b?q5e}dw)IzN$0_4w~0}f+wN@3`R)5IlKb(mvnML)cH}v31QFQhIRXRjYwa%c z*x9INcgm07k1f3pLJyY1+=4%)7=(p%@x;rXWUZ~V7hSyVLxk-`-d!xT6qKnPcRYy9 z$8I&MSe|u;&HDLTy?1RDy)Qc+zub#C$Wh%|I_$aLc#7g~Vt@KH+fRa*1x)u_wf!Vl znfMp{;wcty(9FOp(Us;}<|)<|WqE3-B3~Bqaca_dU*kA2U(CDrzr$^x0O=8g{sE?c z`p?1yO~R&3QnE>_rTlwm$QD}m5EktI?bM9{nx{Zc@f6-Uh!<&zfvbqYEoNDQJTrJ) zm?p%um5l3Qw`u~2oZ|oXWC3ZWd&LXIM&|Ntm%pF>nN zA><0km@(9=UrYBAYxdUgmfw9_7Sj%8)4Dz~C`DcF{20;JBM*7@blWr*hDr>JMItUV zkHJ&Ko(`)!#KSDi2F19{>e{c^!s)S^bM_PVAd;1`HkbWAo zbVICnq;}SzEVM*pdZ8F(vG%aZgt8o#`((R$B|D}LQK&(YX#LYX8?Q8*k_zvW_q`xB zfFPetQI9D?^e?y^XGVKpjCWmcbb-|*?84i@(0`&UK{hBsHuNkfTGRveumy|_Si4-wAa(iNY+ z>H*YjP=2eh6IUm1@7<-OA9+6vNgcm^najAG_^>D6g{|5{|$Ua72N zJK^L6(}m{eza5c7kuZvQa1!{W!^#3vv3VzcZ-|O@{szdYoR#|HRy6@D?6#gQIG^S#;qkax4!io1z2Pb10v)TAv6ro zQs(efL6`~oxzR_#+Yp6!V8hH=+x^JO4+ZieG{i6mes`&`*FN zdZ6?y6mpz5!?1Oz>XVd7^YLt#`!k_#X2Mt^ZN8jN{mWy@|B-biNI5rD;{@23IfoLe zPp$vwR$Rh2@<x zO1t+8yvO#9e>3y00kkq7^m~j9FWeSeC4wxqa7YSq*GhjEi3{vg#*Sa&q|QdUje?02 z{T>P;hGFPzun}I`cS?5MAk0_)gb8})g3OB)DF*P)J3r#JDn<4)X)m|OCR+TdtJxKA zIqP$3kNVM-TqGO#Oft*<05J|gAsf^v=VP51llucfSP*kBaj8<|Llx}4B+Rof{IN=# z5ZuGcwA`7VxbDi71)!>Vsw1WY;dXytra6~Xq#P{oQbo~U%nUXEqVE%FbUVy42@ySi zGa@pI(W*7^`(swXNBMtMBtp{KJF_~hy^Po1wH6WK1CJO);P!dWOiRs~35?L}p0 zgTws%{?q*2)W2~}Gt>eU$fDD`7(xZJQg?Up;F4dUtEvv%)CeW4;%9ns*GAmxxrw#? zWZPcCZzh0&@ka*-lN>ePz0;Vs{4!PF`FAKaD3m*8N`Fng8T1I9<#5nKHOpITeC$Uy z74`fvfZ9Rhnp|J_@mpagm0-Ri_?M`x@_)4}9udq0Qz9WYMx%$WD9q(g%Q;KS-K{j>jy9H}bA&H|bcLlSTE4n((`uRbi>o%;SNeYqTU=ivdY z)-C-m>%d^1U`JIYzBa(C+V#CHX+XtJLe;ncU5GBKbrhL$)=}>;1HcR8hNb8r$DTSn z3dCDU1RM6_gj#r$cF)|Y3Ld6=pCxCePwFc#I|}s4&F2cktjf=mL2SB5Cv$VRz2)Wh z0Dh4iHxbzE!|W1u>)`g@9%Wipp;!!1Kw|G=o+w`To0kbAu&6e{Zpi7ub@6u6+?W{F zATkl!ElQy~H(2X~P6+$rd*W=^kW-5Hjl_(J;=!;|Hm>B-X~3wedvD(R4*^zkN48iD zW6I|lLacYPkd5xwT-=7t4YHZU+~jWKn-*+1JU z^WFCl=aXDTpS zmF*21in&!ut+9En_CEjq6~1%9>C57U5&OQ!9J|&GL4X@iLlg2Y5sJ-QbR+7taXabX zB9*|ma*W|JNuvnas2qR2*ZUs3sboplGt8%GREt`^bbeTaTK>hb4JKA=CG9sFNn{N_zq3Vd|F@@xh&ItMneHiPOruZuhk7O} zP%5qjNnxXTC=<^gf>T?bFAOAd)Qku?8*-#AVar=M{URC-4w}n2f<9lgz2zT*Lb~{; zql}Vn#LrEpY=)g)oT-7HuZYnPO%AJ2N6l^!JR#>`+;`n;J;bwYM(zyV)E7+cX$ zf1rh^PxEj6k3bb+L^r1=a)xf2=LDw_EHU40M2ymLl;H^^2NfJ)PZo8?p@Ha=&m8XMP^lf5CtQFl%C$zYMQP2Dr-Gb&0ZTp!_Ap>NvgZ3h*# zgcK~Q=I2={*s_TP)hS)fSIm{?=#PycQXT5;%OXg zj>Scnr!v0$s61i4d89or)+Ca=dJtbf4!c@qo?P@`h^J3Wb_t8723~A8p`di*8wVxE z(rQ_K#S+TCkL)cC&2T3a^2Ruo*a&~~Pnm1f?pi#@+F>7B6Jx`CAbd*FKC3eWcsjh^ zF~FhG2E!Lexp}XopFjc}Cmd)pE95w10UtS5&j z7dE^_`!h(X9gXXORMBvla3kYh1#=I(0eF$bWG?aVIw-h$uq{F>xQQx z2jNz3g(Q6`5mwgtisg&yE`fey7u>_x)=7^T4p`{Fr7pm7Xy%<6g z2qzj`Py)8Esghq?#bu`}H2|3+K(-Z?J90S+Ke3Vwr)NYbRc z2b{zSYOkGw%|`%-UFz%dCpV`Nt$1@nVIX8gK^9)pS}LSmlzd=#3F# zvQTA&OB!+n9>SLn5t}|$18VVu-kNF{Hhh0gO+uk;=ayw}RAK{v0^WG?w|gqn1rm(@ zu&~da&8h2Y@;qoEYzp?&)RXTIE&xSh6xhJtdH{v|t^R5Jgo^O5M-hha5o$h%P!3qv zx@n{RcqkU+2$4;EMnK&UVu}ah0#m4g2(%MaiCriJI<`F~51I9ONTbR{8Y;y`2+|xq zbc`VaG>{F7wnYUNWp@pv{*jCs{6F6zpqWr4sDh4PT8%EEM}8&)ZxSGUq|+7tiMq$| zHCheyT7!24X5x5uJ~bwcfgnqd@FGMEC~n&7{(3fPpGGhjdB_Iqf4BE9&HVn5li4)h zddXbi5K_~Q8GvFkEFYE-lzBs@poOAarR5`|J6)qFq^~VWHR*)wY?>t_-KM-3Sg_8i$`6oXs0I-jDT82jb z{w|&_Oq)3_E{+c~sy;A(7VrP*V}Wz}n^C_LmG#G+9Tl%4ZE}@KKs@ySZR!R0fjMT8 z{JqtBcu$Y``N6Yo`L_fAFDa^n>41sYZ{;3zM{aB~YgZ3vcWZ}hThB^LQ)vI{8yvn^ zZS$cYkuttHMyH+TTyF}z)tBMlJefPdrHmHI@-Ec=sD`R%R<~Yts)}We(w}{LH)Vbt%<4Gm z(&I(N+umPc5y}$ODQa<)bjr1MiHd2E&(9;qW;lqml8)2glKSNh*_-!i-nXL5Ft^Yq zZ*2tUp9AuDFJ-2|ko;t{pTc-g-ff8QB(mgicj>ud;xszh1)5G4L;W@J=P1I0Z=wqEkYhWd%Jw zZ9K#gRa}l!2$5WNw-nLA8dpEyI&{o2zY{%WM6m33sVnHB_BaRV=H4nwbzdATKi$e( zujx>d7ra^I_5puMStY(NI1NL-@20Zp)#WTl%T1KjDmAufauIR!SZV0gHnzymFgP_L zK^#hVHOlQ0@lQjW3&v6nt^2@b0` ze*Q=@#qMI7##ywZ9Oz>VnSLww>2^+zXC(>yz{$qn@!jHA5puGxS;tQkNtC~9X6@sx zR;qW>kjezp?OMRXeaJTABxKx|{O; zRnQ<>wBi(Mx4ktmbV!l)rcXj4*p_1;>%NwvrDPB#fj@nl9Oo3WN{_Eevh>;wpi@*Gv|kQ|MKaU~ z_DPrXGz1y~4S|M0%lso*6TXh?(h`4?`n5s&zt2I_wvul%5FK&y6@c}k*t{0F*-6QQ z5wlJSLKj8M=5iqv^J?H?#BTN@<#V;v=ri3pUwQ{Lv|c`BKhw?BZn$M zmNx%NN2@crPv=bRnnd%<^$2amKhw_O?vaJ?F56s{{7f#mBvwkUko*?)N<-Gq%tjF% z-gFMroU$ZA9t6Y%)=OQr-b%i4jnBX?g4`pgAcVx&j1o~6YasKq0)hV3{{Z)IQM-?+_WJ+; N002ovPDHLkV1gMn6zu>2 literal 0 HcmV?d00001 diff --git a/packages/core/src/remote/devices.ts b/packages/core/src/remote/devices.ts index fa522c34..0bc15e70 100644 --- a/packages/core/src/remote/devices.ts +++ b/packages/core/src/remote/devices.ts @@ -93,7 +93,9 @@ import { pairWithCode, prepareRemoteMessage, releaseChatsNow, + connectRunner, removeRunner, + takenFrom, runnerExec, runnerInfoOf, runnerOfConversation, @@ -102,7 +104,7 @@ import { } from "./runners"; import { browserSignIns, setBrowserSignIns } from "./browserSessions"; import { forgetPeer, pendingFor, replicaSeq } from "./replica"; -import { lastPulled as lastPulledAt, pendingChanges, pullFrom, replicaHint, startReplicaSync, stopReplicaSync } from "./replicaSync"; +import { pendingChanges, pullFrom, replicaHint, startReplicaSync, stopReplicaSync } from "./replicaSync"; import { endStandIn, forgetStandIn, primaryIsBack, primaryLeftNow, primaryWentAway, setStandInHooks, setStandInSettings, standInSettings, standInState, type TakeOver } from "./standIn"; import { SERVICE_LABEL } from "./launchd"; import { runMissedSince, setScheduleSettle } from "../scheduler/scheduler"; @@ -359,6 +361,36 @@ function awayDevice(id: string): boolean { async function deviceArrived(id: string): Promise { goneNow.delete(id); await pullFrom(id); + const l = link(id); + try { + // Chats it continued while this computer was away are its own now: nothing here may pick them up again. + const taken = await l.json<{ ids: string[] }>("GET", "/api/link/devices/taken", undefined, { timeoutMs: 30_000 }); + if (taken.ids?.length) await releaseChatsTo(id, taken.ids); + // Its own link to here may still be waiting to retry: it hands everything back now instead. + await l.json("POST", "/api/link/devices/hello", {}, { timeoutMs: 10_000 }); + } catch (err) { + log.info("could not settle the hand-back with a device", { error: err instanceof Error ? err.message : String(err) }); + } + arrivedAt.set(id, Date.now()); +} + +/** When each device was last caught up with after its link came up (ms). */ +const arrivedAt = new Map(); + +/** Over the link: chats this computer took over from the asking one (it is back), not handed back yet. */ +export function chatsTakenFrom(peer: string): { ids: string[] } { + return { ids: takenFrom(peer) }; +} + +/** Over the link: the primary is there again; this secondary connects to it now instead of at its next retry. */ +export function peerHello(peer: string): void { + if (isSecondary() && peer === primaryRunnerId() && !primaryOnline()) { + try { + connectRunner(peer); + } catch { + /* gone meanwhile */ + } + } } /** @@ -505,7 +537,7 @@ export async function groupSettled(): Promise { for (;;) { const waiting = deviceRows().filter((d) => { const up = linkUpAt.get(d.id); - return !up || (lastPulledAt(d.id) ?? 0) < up; + return !up || (arrivedAt.get(d.id) ?? 0) < up; }); if (!waiting.length || Date.now() > end) return; await sleep(500); @@ -523,7 +555,7 @@ async function settled(): Promise { const waiting = deviceRows().filter((d) => { const up = linkUpAt.get(d.id); if (!up) return Date.now() < wokeAt + SETTLE_MS; - return (lastPulledAt(d.id) ?? 0) < up; + return (arrivedAt.get(d.id) ?? 0) < up; }); if (!waiting.length || Date.now() > end) return; await sleep(500); diff --git a/packages/core/src/remote/runners.ts b/packages/core/src/remote/runners.ts index 23bc400c..59239d63 100644 --- a/packages/core/src/remote/runners.ts +++ b/packages/core/src/remote/runners.ts @@ -259,6 +259,11 @@ export function runnerInfoOf(id: string): RunnerInfo | undefined { return infos.get(id); } +/** Chats that moved here from `runnerId` and that it still has to let go. */ +export function takenFrom(runnerId: string): string[] { + return pendingReleases(runnerId); +} + /** The chats that moved here from `runnerId` are let go there now (it just connected, or the primary is back). */ export function releaseChatsNow(runnerId: string): Promise { return releaseChats(runnerId); diff --git a/packages/core/src/server/routes/link.ts b/packages/core/src/server/routes/link.ts index ae79bae4..7ac00e2f 100644 --- a/packages/core/src/server/routes/link.ts +++ b/packages/core/src/server/routes/link.ts @@ -15,7 +15,7 @@ import { installUpdates } from "../../services/maintenance"; import { checkUpdates } from "../../services/updates"; import { runCommand, toolPath } from "../../services/doctor"; import { HttpError, badRequest, childEnv, notFound } from "../../util"; -import { acceptJoin, adoptPushedChat, deviceIdOf, groupForSecondary, makeInvite, peerAway, peerLeft, releaseChatsTo } from "../../remote/devices"; +import { acceptJoin, adoptPushedChat, chatsTakenFrom, deviceIdOf, groupForSecondary, makeInvite, peerAway, peerHello, peerLeft, releaseChatsTo } from "../../remote/devices"; import { ackFrom, changesFor } from "../../remote/replica"; import { isSecondary } from "../../remote/group"; import { callForDevice } from "../../remote/deviceTools"; @@ -171,6 +171,15 @@ export function registerLinkRoutes(app: Hono): void { return c.json(await releaseChatsTo(peer, ids)); }); + // The calling computer is back: which of its chats this one continued meanwhile. + app.get("/api/link/devices/taken", (c) => c.json(chatsTakenFrom(groupPeer(c)))); + + // The calling computer (the primary) is back: connect to it now. + app.post("/api/link/devices/hello", (c) => { + peerHello(groupPeer(c)); + return c.json({ ok: true as const }); + }); + // The calling computer goes away right now (Godmode quits there). app.post("/api/link/devices/away", (c) => { peerAway(groupPeer(c)); diff --git a/packages/core/test/devices-e2e.test.ts b/packages/core/test/devices-e2e.test.ts index f54bcfbb..43da7beb 100644 --- a/packages/core/test/devices-e2e.test.ts +++ b/packages/core/test/devices-e2e.test.ts @@ -408,6 +408,11 @@ describe("a device group, end to end", () => { await until(async () => (await onPrimary(`/api/conversations/${standInChat}`)).body.runnerId === selfId, 30_000, "the primary to hand the chat over"); expect(localChat(standInChat)?.runner_id).toBeNull(); await until(async () => (await here("/api/devices")).body.pendingChanges === 0, 30_000, "everything to be taken"); + // The primary didn't pick the chat up again after its restart: every run it shows there is one of this computer's. + await sleep(3_000); + const theirs = (await onPrimary<{ id: string }[]>(`/api/runs?conversationId=${standInChat}&limit=50`)).body.map((r) => r.id); + const mine = new Set(runsOf(standInChat).map((r) => r.id)); + expect(theirs.filter((id) => !mine.has(id))).toEqual([]); }, 150_000); test("leaving makes both computers a Godmode of their own again", async () => { From c32555610788feacb659de6dc44c946c2b962bfb Mon Sep 17 00:00:00 2001 From: Daniel Ehrhardt Date: Tue, 20 Oct 2026 19:46:26 +0200 Subject: [PATCH 14/18] Device groups: a copy from another computer of the group never deletes messages --- packages/core/src/remote/mirror.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/core/src/remote/mirror.ts b/packages/core/src/remote/mirror.ts index c6b0e43d..65b2f501 100644 --- a/packages/core/src/remote/mirror.ts +++ b/packages/core/src/remote/mirror.ts @@ -488,7 +488,7 @@ function writeMessage(runnerId: string, incoming: MessageRow): "inserted" | "upd * were inserted: messages the runner dropped are deleted and new ones at the end appended; when one was missed in the * middle (or the order differs), the chat's messages are written again, in order. Returns what the UI doesn't know yet. */ -function writeMessages(conversationId: string, incoming: unknown): { created: string[]; updated: string[]; removed: number } { +function writeMessages(conversationId: string, incoming: unknown, keepOwn = false): { created: string[]; updated: string[]; removed: number } { const stored = all(`SELECT ${MESSAGE_COLUMNS} FROM messages WHERE conversation_id = ? ORDER BY created_at ASC, rowid ASC`, conversationId); const known = new Map(stored.map((m) => [m.id, m])); const rows: MessageRow[] = []; @@ -504,6 +504,17 @@ function writeMessages(conversationId: string, incoming: unknown): { created: st const kept = stored.filter((m) => ids.has(m.id)); const created = rows.filter((r) => !known.has(r.id)).map((r) => r.id); const updated = rows.filter((r) => known.has(r.id) && changed(known.get(r.id)!, r)).map((r) => r.id); + // Another computer of the group may have only part of a chat (a copy without old messages): what is here stays. + if (keepOwn) { + for (const row of rows) { + if (!known.has(row.id)) insert("messages", row); + else if (updated.includes(row.id)) { + const { id, conversation_id: _chat, ...rest } = row; + update("messages", id, rest); + } + } + return { created, updated, removed: 0 }; + } const removed = stored.length - kept.length; if (kept.every((m, i) => rows[i]!.id === m.id)) { @@ -1011,7 +1022,7 @@ function reconcile(runnerId: string, remote: unknown, runs: unknown, was?: strin // An answer without a message list is not a chat without messages: the copy must not be emptied over it. if (!chat || !Array.isArray((remote as Raw).messages)) throw refused(); const before = was === undefined ? viewOf(chat.id) : was; - const messages = tx(() => (writeConversation(runnerId, chat) ? writeMessages(chat.id, (remote as Raw).messages) : null)); + const messages = tx(() => (writeConversation(runnerId, chat) ? writeMessages(chat.id, (remote as Raw).messages, isDevice(runnerId)) : null)); if (!messages) throw refused(); const runEvents: { type: RunEvent; id: string }[] = []; From b816f1b25b19be2ae9def9d9e3e977512f856c05 Mon Sep 17 00:00:00 2001 From: Daniel Ehrhardt Date: Tue, 20 Oct 2026 19:57:38 +0200 Subject: [PATCH 15/18] Device groups: classify the new routes for the cloud, watchdog test opens its own database --- packages/core/src/cloud/scope.ts | 7 +++++++ packages/core/test/mac-prompts.test.ts | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/packages/core/src/cloud/scope.ts b/packages/core/src/cloud/scope.ts index baf79baf..2f4fc36c 100644 --- a/packages/core/src/cloud/scope.ts +++ b/packages/core/src/cloud/scope.ts @@ -285,6 +285,7 @@ const RULES: [methods: string, path: string, rule: Rule][] = [ ["POST", "/api/devices/join", refused(COMPUTER_ONLY)], ["POST", "/api/devices/leave", refused(COMPUTER_ONLY)], ["DELETE", "/api/devices/:id", refused(COMPUTER_ONLY)], + ["POST", "/api/devices/retire-runner", refused(COMPUTER_ONLY)], ["GET", "/api/link/info", refused(COMPUTER_ONLY)], ["POST", "/api/link/sync", refused(COMPUTER_ONLY)], ["GET", "/api/link/health", refused(COMPUTER_ONLY)], @@ -307,6 +308,12 @@ const RULES: [methods: string, path: string, rule: Rule][] = [ ["POST", "/api/link/devices/adopt-chat", refused(COMPUTER_ONLY)], ["GET", "/api/link/devices/welcome", refused(COMPUTER_ONLY)], ["POST", "/api/link/devices/tool", refused(COMPUTER_ONLY)], + ["POST", "/api/link/devices/release-chats", refused(COMPUTER_ONLY)], + ["GET", "/api/link/devices/taken", refused(COMPUTER_ONLY)], + ["POST", "/api/link/devices/hello", refused(COMPUTER_ONLY)], + ["POST", "/api/link/devices/away", refused(COMPUTER_ONLY)], + ["GET", "/api/link/replica/changes", refused(COMPUTER_ONLY)], + ["POST", "/api/link/replica/ack", refused(COMPUTER_ONLY)], ["POST", "/api/link/conversations/:id/send", refused(COMPUTER_ONLY)], ["POST", "/api/link/runs/:id/stop", refused(COMPUTER_ONLY)], ["GET", "/api/questions", A], diff --git a/packages/core/test/mac-prompts.test.ts b/packages/core/test/mac-prompts.test.ts index 321aa34e..26b6f368 100644 --- a/packages/core/test/mac-prompts.test.ts +++ b/packages/core/test/mac-prompts.test.ts @@ -75,6 +75,14 @@ describe("the watchdog and a macOS dialog", () => { const t0 = Date.parse("2026-10-20T10:16:00Z"); const run = { blocks: [tool("b", "Bash", { command: "ls -l ~/Desktop/fuerstenberger*" })], lastOutputAt: t0, startedAt: t0, waiting: false }; const hold = { pending: true, act: "open your Desktop folder", computer: "Mac mini" }; + // The step's label reads the settings (secrets are masked in it): this needs a database of its own. + let env: TestEnv; + beforeAll(async () => { + env = await setupEnv("godmode-mac-watchdog-"); + }); + afterAll(async () => { + await env.close(); + }); test("a run waiting for the answer is left alone; one stopped anyway says what it waited for", () => { expect(assess(run, t0 + 6 * 3_600_000, limits, hold)).toBeNull(); From 0358adee81ede8c4bef728c8e086c3c8fd518662 Mon Sep 17 00:00:00 2001 From: Daniel Ehrhardt Date: Tue, 20 Oct 2026 20:03:53 +0200 Subject: [PATCH 16/18] Device groups review: keys from the schema, no replica in backups, due slots, missed automations from their schedules --- packages/core/src/backup/backup.ts | 19 ++++++++- packages/core/src/remote/devices.ts | 6 +-- packages/core/src/remote/replica.ts | 21 +++++++++- packages/core/src/scheduler/scheduler.ts | 49 ++++++++++++++++-------- packages/core/test/replica.test.ts | 26 ++++++++++++- packages/core/test/scheduler.test.ts | 32 +++++++++++++++- 6 files changed, 129 insertions(+), 24 deletions(-) diff --git a/packages/core/src/backup/backup.ts b/packages/core/src/backup/backup.ts index c5c9b582..82ba5683 100644 --- a/packages/core/src/backup/backup.ts +++ b/packages/core/src/backup/backup.ts @@ -48,6 +48,8 @@ import { assertSafeKdf, openWithPassphrase, sealWithPassphrase } from "../vault/ import { badRequest, conflict, HttpError, slugify } from "../util"; import { reconcileTasks, recomputeTicketTotals } from "../tasks/service"; +import { groupRole } from "../remote/group"; + const log = logger("backup"); export const BACKUP_EXTENSION = ".godmode-backup"; @@ -55,7 +57,20 @@ export const MAX_BACKUP_BYTES = 2 * 1024 ** 3; const FILE_PREFIX = "godmode-backup-"; /** Never exported: login sessions, paired phones, paired runners and controllers, and the migration ledger. */ -const EXCLUDED_TABLES = new Set(["sessions", "mobile_devices", "connectors", "runners", "link_controllers", "runner_memory", "_migrations"]); +const EXCLUDED_TABLES = new Set([ + "sessions", + "mobile_devices", + "connectors", + "runners", + "link_controllers", + "runner_memory", + "_migrations", + // What the computers of a device group exchanged: about this computer's link, never part of a backup. + "replica_seq", + "replica_ctx", + "replica_rows", + "replica_deferred", +]); /** Vault key material travels in vault.json, not db.json. */ const VAULT_META_KEYS = new Set(["vault.kdf", "vault.wrapped_dek", "vault.canary"]); /** Settings sections that belong to this machine (bind address, remote access, allowed origins, phone and cloud access). */ @@ -740,6 +755,8 @@ export function importBackup(file: Uint8Array, passphrase: string, actor = "user const active = get<{ c: number }>("SELECT COUNT(*) AS c FROM runs WHERE status IN ('queued', 'running')")?.c ?? 0; if (active > 0) throw conflict("Wait for running tasks to finish (or cancel them) before restoring a backup"); + // The other computers keep the group's data and would hand it straight back (or take this backup over theirs). + if (groupRole()) throw conflict("This computer is part of a device group. Leave the group in Settings → Devices first, then restore the backup."); const stamp = new Date().toISOString().replace(/[:.]/g, "-"); stopScheduler(); diff --git a/packages/core/src/remote/devices.ts b/packages/core/src/remote/devices.ts index 0bc15e70..3ce9eb81 100644 --- a/packages/core/src/remote/devices.ts +++ b/packages/core/src/remote/devices.ts @@ -107,7 +107,7 @@ import { forgetPeer, pendingFor, replicaSeq } from "./replica"; import { pendingChanges, pullFrom, replicaHint, startReplicaSync, stopReplicaSync } from "./replicaSync"; import { endStandIn, forgetStandIn, primaryIsBack, primaryLeftNow, primaryWentAway, setStandInHooks, setStandInSettings, standInSettings, standInState, type TakeOver } from "./standIn"; import { SERVICE_LABEL } from "./launchd"; -import { runMissedSince, setScheduleSettle } from "../scheduler/scheduler"; +import { runMissedSince, setScheduleGroup } from "../scheduler/scheduler"; import { instanceInfo } from "../mobile/devices"; import { mobileUrls } from "../mobile/access"; import { getSettings } from "../services/settings"; @@ -186,7 +186,7 @@ export function startDevices(h: LinkHandler, deliver: (event: ServerEvent) => vo setStandInHooks({ takeOver, changed: emitGroupSoon }); startReplicaSync({ fetchChat: (peer, id) => void fetchChatFrom(peer, id) }); setLinkEventFilter(echoToPrimary); - setScheduleSettle(settled); + setScheduleGroup({ active: () => groupRole() !== null, settle: settled }); setPhoneInfo(() => (getSettings().mobile.enabled ? { instance: instanceInfo(), urls: mobileUrls() } : null)); startWakeWatch(); let wasForwarding = forwarding(); @@ -254,7 +254,7 @@ export function stopDevices(): void { setStandInHooks(null); stopReplicaSync(); setLinkEventFilter(null); - setScheduleSettle(null); + setScheduleGroup(null); setPhoneInfo(null); stopWakeWatch(); setForwarding(null); diff --git a/packages/core/src/remote/replica.ts b/packages/core/src/remote/replica.ts index 55d156a7..dd5200a0 100644 --- a/packages/core/src/remote/replica.ts +++ b/packages/core/src/remote/replica.ts @@ -70,10 +70,24 @@ const NOT_SHARED = new Set(["vms"]); let tablesCache: ReplicaTable[] | null = null; +/** A table's key columns, as the schema says (the settings-like tables are keyed by `key`, not `id`). */ +function keyOf(table: string): string[] { + const pk = all<{ name: string; pk: number }>(`PRAGMA table_info(${q(table)})`) + .filter((c) => c.pk > 0) + .sort((a, b) => a.pk - b.pk) + .map((c) => c.name); + return pk.length ? pk : ["id"]; +} + +/** Columns the setup copy sends one way but that stay each computer's own here (an agent's folder exists on one computer). */ +const OWN_HERE: Record = { agents: ["working_directory"] }; + export function replicaTables(): ReplicaTable[] { if (tablesCache) return tablesCache; - const setup = SETUP_TABLES.filter((t) => !NOT_SHARED.has(t.table)).map((t): ReplicaTable => ({ ...t, key: ["id"], setup: true })); - tablesCache = [...setup, ...STATE.map((t) => ({ ...t, setup: false }))]; + const setup = SETUP_TABLES.filter((t) => !NOT_SHARED.has(t.table)).map( + (t): ReplicaTable => ({ ...t, own: [...t.own, ...(OWN_HERE[t.table] ?? [])], key: keyOf(t.table), setup: true }), + ); + tablesCache = [...setup, ...STATE.map((t) => ({ ...t, key: keyOf(t.table), setup: false }))]; return tablesCache; } @@ -157,6 +171,8 @@ export function ensureReplica(): void { }); } if (getMeta("replica.backfilled") !== "1") backfill(tables); + // A crash in the middle of writing another computer's changes must not make this computer's own writes look like theirs. + sql("UPDATE replica_ctx SET origin = NULL, at = NULL WHERE id = 1"); ensured = getDb(); } @@ -185,6 +201,7 @@ function backfill(tables: ReplicaTable[]): void { /** Tests open several databases one after another. */ export function resetReplicaCache(): void { ensured = null; + tablesCache = null; fkCache.clear(); columnCache.clear(); } diff --git a/packages/core/src/scheduler/scheduler.ts b/packages/core/src/scheduler/scheduler.ts index a252f0d0..70d67423 100644 --- a/packages/core/src/scheduler/scheduler.ts +++ b/packages/core/src/scheduler/scheduler.ts @@ -50,6 +50,14 @@ function signature(r: WantedRoutine): string { return `${r.type}\u0000${r.cron}\u0000${r.timezone}\u0000${r.start_window ?? 0}\u0000${r.runs ?? 1}`; } +/** + * The time a cron tick was due (croner tells when it fired): a Mac that slept fires it late. Looked up two seconds + * ahead: at fire time croner counts the current slot as still to come, and it compares whole seconds. + */ +export function dueSlot(job: Cron, firedAt: Date): Date | null { + return job.previousRuns(1, new Date(firedAt.getTime() + 2_000))[0] ?? null; +} + function cronJob(r: WantedRoutine): Cron { return new Cron( r.cron, @@ -59,7 +67,7 @@ function cronJob(r: WantedRoutine): Cron { protect: true, catch: (err) => log.error(`routine ${r.id} tick crashed`, err), }, - (self: Cron) => onTick(r.id, self.currentRun()), + (self: Cron) => onTick(r.id, dueSlot(self, new Date())), ); } @@ -76,7 +84,7 @@ function randomStartJob(r: WantedRoutine, windowMinutes: number, runs: number, h jobs.delete(r.id); log.warn(`routine ${r.id} has no next start`, err); } - return onTick(r.id, slot); + return onTick(r.id, at); }); return job; } @@ -153,18 +161,21 @@ export async function triggerRoutine(id: string, opts: { scheduled?: boolean; by } } -/** Late ticks (this computer slept or was away) wait until the device group's copies are in (remote/devices.ts). */ -let settle: (() => Promise) | null = null; +/** + * In a device group (remote/devices.ts): late ticks (this computer slept or was away) wait until the group's copies are + * in, and are skipped when another computer ran that time already (it stood in). + */ +let group: { active: () => boolean; settle: () => Promise } | null = null; -export function setScheduleSettle(fn: (() => Promise) | null): void { - settle = fn; +export function setScheduleGroup(hooks: { active: () => boolean; settle: () => Promise } | null): void { + group = hooks; } const LATE_MS = 60_000; async function onTick(routineId: string, scheduledAt: Date | null = null) { - const late = !!scheduledAt && Date.now() - scheduledAt.getTime() > LATE_MS; - if (late && settle) await settle().catch(() => undefined); + const late = !!group?.active() && !!scheduledAt && Date.now() - scheduledAt.getTime() > LATE_MS; + if (late) await group!.settle().catch(() => undefined); let routine: Routine; try { routine = getRoutine(routineId); @@ -216,19 +227,25 @@ async function onTick(routineId: string, scheduledAt: Date | null = null) { } /** - * A computer that starts standing in for its primary: scheduled automations that came due since the primary was last - * seen and didn't run there run now, once each. + * A computer that starts standing in for its primary: scheduled automations whose last time slot came since the primary + * was last seen and that didn't run since (anywhere in the group) run now, once each. The slot comes from the schedule + * itself — the stored next run is rewritten as soon as the scheduler starts here. */ export async function runMissedSince(since: string): Promise { const from = Date.parse(since); if (!Number.isFinite(from)) return 0; - const due = all<{ id: string; next_run_at: string; last_run_at: string | null }>( - `SELECT r.id, r.next_run_at, r.last_run_at FROM routines r JOIN agents a ON a.id = r.agent_id - WHERE r.enabled = 1 AND a.enabled = 1 AND r.next_run_at IS NOT NULL - AND CASE WHEN json_valid(r.trigger) THEN json_extract(r.trigger, '$.type') END = 'schedule'`, + const due = all<{ id: string; cron: string; timezone: string; last_run_at: string | null }>( + `SELECT r.id, r.cron, r.timezone, r.last_run_at FROM routines r JOIN agents a ON a.id = r.agent_id + WHERE r.enabled = 1 AND a.enabled = 1 AND CASE WHEN json_valid(r.trigger) THEN json_extract(r.trigger, '$.type') END = 'schedule'`, ).filter((r) => { - const at = Date.parse(r.next_run_at); - return at >= from - LATE_MS && at <= Date.now() && (!r.last_run_at || Date.parse(r.last_run_at) < at - LATE_MS); + let slot: Date | null = null; + try { + slot = dueSlot(new Cron(r.cron, { timezone: r.timezone, mode: "5-or-6-parts", paused: true }), new Date()); + } catch { + return false; + } + if (!slot || slot.getTime() < from - LATE_MS) return false; + return !r.last_run_at || Date.parse(r.last_run_at) < slot.getTime() - LATE_MS; }); let started = 0; for (const r of due) { diff --git a/packages/core/test/replica.test.ts b/packages/core/test/replica.test.ts index c8e61e03..bd689db0 100644 --- a/packages/core/test/replica.test.ts +++ b/packages/core/test/replica.test.ts @@ -11,7 +11,7 @@ import { join } from "node:path"; import { loadConfig } from "../src/config"; import { all, closeDb, get, openDb, run, setDb } from "../src/db"; import { setLogLevel } from "../src/log"; -import { applyChanges, changesFor, ensureReplica, pendingFor, pendingKeys, replicaSeq, resetReplicaCache, retryDeferred, type ReplicaChange } from "../src/remote/replica"; +import { applyChanges, changesFor, ensureReplica, pendingFor, pendingKeys, replicaSeq, replicaTables, resetReplicaCache, retryDeferred, type ReplicaChange } from "../src/remote/replica"; let dir: string; let a: Database; @@ -65,6 +65,30 @@ describe("the change log", () => { expect(get<{ deleted: number }>("SELECT deleted FROM replica_rows WHERE tbl = 'goals' AND pk = 'gol_1'")!.deleted).toBe(1); }); + test("every shared table can be written, changed and emptied with the triggers in place", () => { + use(a); + run("PRAGMA foreign_keys = OFF"); + try { + for (const t of replicaTables()) { + const cols = all<{ name: string; type: string; notnull: number; dflt_value: string | null; pk: number }>(`PRAGMA table_info("${t.table}")`); + const value = (c: { type: string }, n: number) => (/INT|REAL|NUM/i.test(c.type) ? n : `v${n}_${t.table}`); + const row: Record = {}; + for (const c of cols) if (c.pk || (c.notnull && c.dflt_value === null)) row[c.name] = value(c, 1); + if (t.only) row[t.only.column] = t.only.value; + const names = Object.keys(row); + run(`INSERT INTO "${t.table}" (${names.map((n) => `"${n}"`).join(", ")}) VALUES (${names.map(() => "?").join(", ")})`, ...Object.values(row)); + const key = t.key.map((k) => String(row[k])).join("\u001f"); + expect(get<{ deleted: number }>("SELECT deleted FROM replica_rows WHERE tbl = ? AND pk = ?", t.table, key)?.deleted).toBe(0); + const other = cols.find((c) => !c.pk && !t.own.includes(c.name) && c.name !== "updated_at" && !(t.only && c.name === t.only.column)); + if (other) run(`UPDATE "${t.table}" SET "${other.name}" = ? WHERE ${t.key.map((k) => `"${k}" = ?`).join(" AND ")}`, value(other, 2), ...t.key.map((k) => row[k]!)); + run(`DELETE FROM "${t.table}" WHERE ${t.key.map((k) => `"${k}" = ?`).join(" AND ")}`, ...t.key.map((k) => row[k]!)); + expect(get<{ deleted: number }>("SELECT deleted FROM replica_rows WHERE tbl = ? AND pk = ?", t.table, key)?.deleted).toBe(1); + } + } finally { + run("PRAGMA foreign_keys = ON"); + } + }); + test("a change of only the bookkeeping (updated_at) is not a change", () => { use(a); goal("gol_2", "Quiet"); diff --git a/packages/core/test/scheduler.test.ts b/packages/core/test/scheduler.test.ts index fe26eb5d..fa1d2a8b 100644 --- a/packages/core/test/scheduler.test.ts +++ b/packages/core/test/scheduler.test.ts @@ -13,8 +13,9 @@ import { createAgent, updateAgent } from "../src/agents/service"; import * as repo from "../src/agents/repo"; import * as routines from "../src/services/routines"; import { createRoutine, getRoutine, runRoutineNow, updateRoutine } from "../src/services/routines"; -import { reloadSchedules, scheduledRoutines, startScheduler, stopScheduler, triggerRoutine } from "../src/scheduler/scheduler"; +import { dueSlot, reloadSchedules, runMissedSince, scheduledRoutines, startScheduler, stopScheduler, triggerRoutine } from "../src/scheduler/scheduler"; import { HttpError, newId, now } from "../src/util"; +import { Cron } from "croner"; let dataDir: string; let agent: Agent; @@ -359,4 +360,33 @@ describe("triggering", () => { finish(manual); expect(sent).toHaveLength(1); }); + + test("a computer that starts standing in runs the automations that came due since the primary went, once", async () => { + const hourly = createRoutine({ agentId: agent.id, name: "Hourly", cron: "0 * * * *", timezone: "UTC", prompt: "hourly" }); + const ranThere = createRoutine({ agentId: agent.id, name: "Ran there", cron: "0 * * * *", timezone: "UTC", prompt: "done there" }); + const before = createRoutine({ agentId: agent.id, name: "Before", cron: "0 0 1 1 *", timezone: "UTC", prompt: "yearly" }); + const slot = dueSlot(new Cron("0 * * * *", { timezone: "UTC", paused: true }), new Date())!; + // The primary ran this one in the current slot already (its copy says so). + exec("UPDATE routines SET last_run_at = ? WHERE id = ?", new Date(slot.getTime() + 5_000).toISOString(), ranThere.id); + startScheduler(); + const lostAt = new Date(slot.getTime() - 5 * 60_000).toISOString(); + expect(await runMissedSince(lostAt)).toBe(1); + expect(sent.map((m) => m.routineId)).toEqual([hourly.id]); + expect(sent.some((m) => m.routineId === before.id)).toBe(false); + for (const r of [hourly, ranThere, before]) updateRoutine(r.id, { enabled: false }); + }); +}); + +describe("when a tick was due", () => { + const job = new Cron("0 9 * * *", { timezone: "UTC", paused: true }); + const at = (iso: string) => new Date(iso); + + test("a tick on time is due now, not the day before", () => { + expect(dueSlot(job, at("2026-10-20T09:00:00.004Z"))?.toISOString()).toBe("2026-10-20T09:00:00.000Z"); + expect(dueSlot(job, at("2026-10-20T08:59:59.600Z"))?.toISOString()).toBe("2026-10-20T09:00:00.000Z"); + }); + + test("a tick a Mac fires after waking up is due at its time slot", () => { + expect(dueSlot(job, at("2026-10-20T09:31:00.000Z"))?.toISOString()).toBe("2026-10-20T09:00:00.000Z"); + }); }); From 15d9d74ecd63558f4ffabac1155caa53bd24e328 Mon Sep 17 00:00:00 2001 From: Daniel Ehrhardt Date: Tue, 20 Oct 2026 20:09:19 +0200 Subject: [PATCH 17/18] Device groups review: hand-back and split-brain safety, one ticket per question, settings travel back, docs --- docs/ARCHITECTURE.md | 35 +++++--- packages/core/src/cloud/scope.ts | 1 + packages/core/src/remote/activeRuns.ts | 11 +++ packages/core/src/remote/devices.ts | 85 +++++++++++++++---- packages/core/src/remote/replica.ts | 100 +++++++++++++++++++---- packages/core/src/remote/replicaSync.ts | 17 ++-- packages/core/src/remote/runners.ts | 11 ++- packages/core/src/remote/snapshot.ts | 22 +++-- packages/core/src/remote/standIn.ts | 34 ++++++-- packages/core/src/server/routes/link.ts | 7 +- packages/core/src/services/humanTasks.ts | 13 ++- packages/core/src/tasks/service.ts | 8 +- packages/core/test/devices-e2e.test.ts | 9 ++ packages/core/test/replica.test.ts | 19 +++++ 14 files changed, 306 insertions(+), 66 deletions(-) diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 092b6738..e9d3badb 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -1780,8 +1780,9 @@ off, the laptop (and the phone) carry on. (its screens, phones, VMs, the browser tab of a chat that lives here). Live views of other chats and `runner:` screens subscribe through the primary. Nothing that arrives over a link is forwarded again. * **The shared data on every computer** (`replica.ts`, `replicaSync.ts`, migration 99). Triggers on the shared tables - (the setup tables of `snapshot.ts` without VMs, plus goals, tickets with their events and dependencies, automations, - heartbeats, My tasks, missing logins, notifications, passkeys, cards and purchases, messaging, paired phones) note + (the setup tables of `snapshot.ts` without VMs, the settings sections that aren't about one computer, plus goals, + tickets with their events and dependencies, automations, heartbeats, My tasks, missing logins, notifications, + passkeys, cards and purchases, messaging, paired phones; keys come from the schema) note each change in `replica_rows`: one row per table row with its order (`seq`), when it was made (`at`, the time on the computer that made it, kept when copied) and where (`origin`: the runner id it came from, NULL = here). Writes of another computer's changes run inside `asPeer()` (table `replica_ctx`), so they are never sent back. Each computer @@ -1790,9 +1791,15 @@ off, the laptop (and the phone) carry on. as the snapshot), the primary from every secondary (everything). Pulls run when a link comes up, 300 ms after the other side's `replica.changed` (sent to linked computers only, never to windows), and once a minute. Of two changes to a row the newer wins; on a tie a deletion, then the primary's. A row that points at one that isn't there yet (a My task of a - chat not copied yet) waits in `replica_deferred` and the chat is fetched. Columns that describe the computer (an - agent's folder and status, a ticket's checkout, a phone's last address) are never copied. A secondary applying the - snapshot leaves the rows it changed itself and the primary hasn't taken yet (`pendingKeys`). The triggers are kept in + chat not copied yet, three fetched at a time), a change that can't be written yet (a name taken here, an agent at + work) waits in `replica_deferred` and is tried with every pull. When this computer's version wins it is sent again, + so both copies end up the same. Columns that describe the computer (an agent's folder and status, a ticket's + checkout, a phone's last address, the program paths in settings) are never copied. A secondary applying the + snapshot leaves the rows it changed and the primary hasn't taken yet (`pendingKeys`) and never deletes rows it made + itself (`madeHere`): a deletion of those arrives through the change feed, which also carries the setup's deletions to + a secondary. Rows from before a computer joined (or from before this feature) are set aside as the primary's and never + sent. Deletions are forgotten after 45 days once every computer took them. Backups leave the replica tables out, and a + computer in a group doesn't restore a backup (leave the group first). The triggers are kept in step with the schema at start (`ensureReplica`); they write with an update plus an insert, because a foreign key's `ON DELETE SET NULL` runs them with its own conflict handling and `INSERT OR REPLACE` fails there. * **A copy of the primary's chats.** A secondary mirrors the primary's own chats like a runner's (`catchUp` with @@ -1801,21 +1808,27 @@ off, the laptop (and the phone) carry on. stood in, the screenshots the primary still has are kept (`keepWhole` in `mirror.ts`). * **While the primary is away** a secondary is a Godmode of its own at once: nothing is read only, the Godmode tools of its agents run here (`runsOnPrimary` only while forwarding), and what changes goes to the primary once it is back. - After `standInMinutes` (default 2; at once when the primary said goodbye, `POST /api/link/devices/away` when it quits) - it **stands in** (`standIn.ts`, meta `link.group.standIn.since`): `runsShared()` turns true and `index.ts` starts the + After `standInMinutes` (default 2; at most 45 s when the primary said goodbye, `POST /api/link/devices/away` when it + quits or restarts, so a quick restart keeps its chats' sessions), and only while this computer itself reaches the + internet (one that lost it is the one cut off), it **stands in** (`standIn.ts`, meta `link.group.standIn.since`): `runsShared()` turns true and `index.ts` starts the shared services here, the chats that were working on the primary continue here from a recap (`continueHere`: `moveChatHere` without a handover), and scheduled automations that came due since the primary was last seen run once (`runMissedSince`). Turns the core starts in a chat of a computer that is away continue here while this computer runs the shared work (`setRemoteSender`). When the primary is back (`primaryArrived`): its changes come here, the chats taken over are handed back as this computer's (`POST /api/link/devices/release-chats`: the primary stops what still works in - them and mirrors them from here, keeping their messages), the secondary waits until the primary has pulled what changed - here (at most 30 s), stops standing in, and then forwards again. Setting `standInEnabled`/`standInMinutes` lives on the + them and mirrors them from here, keeping their messages; a copy from another computer of the group never deletes + messages), the secondary waits until the primary has pulled what changed here (at most 30 s), stops standing in, and + then forwards again. If the primary drops during this, the secondary keeps standing in. The primary's side of it + (`deviceArrived`): pull, ask which of its chats were continued there (`GET /api/link/devices/taken`) and let them go, + tell the secondary to connect now (`POST /api/link/devices/hello`), and wait until it stopped standing in. Setting `standInEnabled`/`standInMinutes` lives on the primary (PATCH /api/devices) and secondaries keep the copy they got with the device list. * **Not twice.** A primary that starts (`groupSettled`) holds its schedules, its board and the chats its stop cut off until each secondary that comes online within 20 s was pulled. A late automation tick (the Mac slept, `onTick` `scheduledAt` more than a minute ago) waits until the group's copies are in and is skipped when the automation's - `last_run_at` shows another computer ran that time already. The board leaves a ticket whose chat works on another - computer to that computer, and tickets that arrive in Todo start where the board runs (`ticketsArrived`). + `last_run_at` shows another computer ran that time already (`dueSlot`: the slot from croner, two seconds ahead). The + board leaves a ticket whose chat lives on another computer that can be reached to that computer, picks it up when that + one is away, and starts tickets that arrive in Todo where the board runs (`ticketsArrived`). A question's ticket in + My tasks is made only on the computer whose chat asks it (a runner's chats get theirs on its controller). * **Phones.** Paired phones are shared data, so a phone paired with one computer of the group works with all of them (a computer that gets a phone switches its phone access on). `GET /api/mobile/me` lists the group's computers with their phone addresses (`group`, from `RunnerInfo.phone`, kept in meta `link.group.phone.` for while one is away). diff --git a/packages/core/src/cloud/scope.ts b/packages/core/src/cloud/scope.ts index 2f4fc36c..71c397e1 100644 --- a/packages/core/src/cloud/scope.ts +++ b/packages/core/src/cloud/scope.ts @@ -311,6 +311,7 @@ const RULES: [methods: string, path: string, rule: Rule][] = [ ["POST", "/api/link/devices/release-chats", refused(COMPUTER_ONLY)], ["GET", "/api/link/devices/taken", refused(COMPUTER_ONLY)], ["POST", "/api/link/devices/hello", refused(COMPUTER_ONLY)], + ["GET", "/api/link/devices/state", refused(COMPUTER_ONLY)], ["POST", "/api/link/devices/away", refused(COMPUTER_ONLY)], ["GET", "/api/link/replica/changes", refused(COMPUTER_ONLY)], ["POST", "/api/link/replica/ack", refused(COMPUTER_ONLY)], diff --git a/packages/core/src/remote/activeRuns.ts b/packages/core/src/remote/activeRuns.ts index c6216c02..00453d6e 100644 --- a/packages/core/src/remote/activeRuns.ts +++ b/packages/core/src/remote/activeRuns.ts @@ -50,3 +50,14 @@ export function remoteRuns(runnerId?: string): RemoteRun[] { export function clearRunner(runnerId: string): void { for (const run of [...runs.values()]) if (run.runnerId === runnerId) runs.delete(run.runId); } + +let reachable: ((runnerId: string) => boolean) | null = null; + +/** remote/runners.ts tells whether the link to a runner (or another computer of the group) is up. */ +export function setRunnerReachability(fn: ((runnerId: string) => boolean) | null): void { + reachable = fn; +} + +export function runnerReachable(runnerId: string): boolean { + return reachable?.(runnerId) ?? false; +} diff --git a/packages/core/src/remote/devices.ts b/packages/core/src/remote/devices.ts index 3ce9eb81..4434c5f3 100644 --- a/packages/core/src/remote/devices.ts +++ b/packages/core/src/remote/devices.ts @@ -96,6 +96,7 @@ import { connectRunner, removeRunner, takenFrom, + forgetRelease, runnerExec, runnerInfoOf, runnerOfConversation, @@ -103,7 +104,7 @@ import { setDeviceLinkHooks, } from "./runners"; import { browserSignIns, setBrowserSignIns } from "./browserSessions"; -import { forgetPeer, pendingFor, replicaSeq } from "./replica"; +import { forgetPeer, keepPreJoinLocal, pendingFor, replicaSeq } from "./replica"; import { pendingChanges, pullFrom, replicaHint, startReplicaSync, stopReplicaSync } from "./replicaSync"; import { endStandIn, forgetStandIn, primaryIsBack, primaryLeftNow, primaryWentAway, setStandInHooks, setStandInSettings, standInSettings, standInState, type TakeOver } from "./standIn"; import { SERVICE_LABEL } from "./launchd"; @@ -128,6 +129,7 @@ const PRIMARY_MESSAGES_DAYS = 30; const WAKE_GAP_MS = 90_000; const SETTLE_MS = 45_000; const START_SETTLE_MS = 20_000; +const FETCHES_AT_ONCE = 3; interface LinkHandler { app: Hono; @@ -183,7 +185,7 @@ export function startDevices(h: LinkHandler, deliver: (event: ServerEvent) => vo deviceConnected: (id) => (isSecondary() && id === primaryRunnerId() ? primaryArrived(id) : deviceArrived(id)), replicaHint: (id) => replicaHint(id), }); - setStandInHooks({ takeOver, changed: emitGroupSoon }); + setStandInHooks({ takeOver, changed: emitGroupSoon, online: internetReachable }); startReplicaSync({ fetchChat: (peer, id) => void fetchChatFrom(peer, id) }); setLinkEventFilter(echoToPrimary); setScheduleGroup({ active: () => groupRole() !== null, settle: settled }); @@ -290,6 +292,16 @@ export function peerAway(peer: string): void { else if (isPrimary()) goneNow.add(peer); } +/** Whether this computer reaches the internet at all (any answer from Anthropic's API counts). */ +async function internetReachable(): Promise { + try { + await fetch("https://api.anthropic.com/", { method: "HEAD", signal: AbortSignal.timeout(8_000) }); + return true; + } catch { + return false; + } +} + /* ------------------------------------------------------------------ */ /* Phones */ /* ------------------------------------------------------------------ */ @@ -368,12 +380,24 @@ async function deviceArrived(id: string): Promise { if (taken.ids?.length) await releaseChatsTo(id, taken.ids); // Its own link to here may still be waiting to retry: it hands everything back now instead. await l.json("POST", "/api/link/devices/hello", {}, { timeoutMs: 10_000 }); + // Nothing runs twice: the shared work starts here once it stopped standing in. + const end = Date.now() + HAND_BACK_WAIT_MS + 10_000; + while (Date.now() < end && l.state.state === "online") { + const there = await l.json<{ standingIn: boolean }>("GET", "/api/link/devices/state", undefined, { timeoutMs: 10_000 }); + if (!there.standingIn) break; + await sleep(500); + } } catch (err) { log.info("could not settle the hand-back with a device", { error: err instanceof Error ? err.message : String(err) }); } arrivedAt.set(id, Date.now()); } +/** Over the link: where this computer stands (the primary asks before it starts the shared work again). */ +export function deviceState(): { standingIn: boolean } { + return { standingIn: standingIn() }; +} + /** When each device was last caught up with after its link came up (ms). */ const arrivedAt = new Map(); @@ -403,19 +427,25 @@ async function primaryArrived(id: string): Promise { } catch (err) { log.info("could not take the primary's changes yet", { error: err instanceof Error ? err.message : String(err) }); } + // Chats continued here while it was away (also before standing in began) live here now. + await releaseChatsNow(id); const since = standingInSince(); - if (since) await handBack(id, since); + if (since && !(await handBack(id, since))) return; if (link(id).state.state === "online") setPrimaryUp(true); emitGroupSoon(); void catchUpWithPrimary(id); } -async function handBack(id: string, since: string): Promise { - await releaseChatsNow(id); +/** False when the primary went away again meanwhile: this computer keeps standing in. */ +async function handBack(id: string, since: string): Promise { // Tells the primary there is something to pull; then wait until it has it (it pulls when its link to here is up). bus.emit({ type: "replica.changed", seq: replicaSeq() }); const end = Date.now() + HAND_BACK_WAIT_MS; while (pendingFor(id) > 0 && Date.now() < end && link(id).state.state === "online") await sleep(250); + if (link(id).state.state !== "online") { + log.info("the primary went away again during the hand-back; still standing in"); + return false; + } const left = pendingFor(id); endStandIn(); const minutes = Math.max(1, Math.round((Date.now() - Date.parse(since)) / 60_000)); @@ -426,6 +456,7 @@ async function handBack(id: string, since: string): Promise { `${computerName()} stood in for ${minutes === 1 ? "a minute" : `${minutes} minutes`}. ${left ? "What changed here goes over in a moment." : "Everything that changed here is there now."}`, "/settings/devices", ); + return true; } /** A copy of the primary's chats, for while it is away (messages without screenshots; old chats without messages). */ @@ -437,20 +468,41 @@ async function catchUpWithPrimary(id: string): Promise { } } -/** A change of the shared data points at a chat that isn't here yet. */ -async function fetchChatFrom(peer: string, conversationId: string): Promise { - if (fetching.has(conversationId)) return; +/** A change of the shared data points at a chat that isn't here yet: fetched, a few at a time. */ +function fetchChatFrom(peer: string, conversationId: string): Promise { + if (fetching.has(conversationId)) return Promise.resolve(); fetching.add(conversationId); - try { - const l = link(peer); - if (l.state.state !== "online") return; - if (await fetchConversation(peer, l, conversationId, { lite: isSecondary() && peer === primaryRunnerId() })) replicaHint(peer); - } finally { - fetching.delete(conversationId); - } + return new Promise((done) => { + fetchQueue.push(async () => { + try { + const l = link(peer); + if (l.state.state !== "online") return; + if (await fetchConversation(peer, l, conversationId, { lite: isSecondary() && peer === primaryRunnerId() })) replicaHint(peer); + } catch (err) { + log.info(`could not fetch chat ${conversationId}`, { error: err instanceof Error ? err.message : String(err) }); + } finally { + fetching.delete(conversationId); + done(); + } + }); + drainFetches(); + }); } const fetching = new Set(); +const fetchQueue: (() => Promise)[] = []; +let fetchesRunning = 0; + +function drainFetches(): void { + while (fetchesRunning < FETCHES_AT_ONCE && fetchQueue.length) { + const next = fetchQueue.shift()!; + fetchesRunning++; + void next().finally(() => { + fetchesRunning--; + drainFetches(); + }); + } +} /** * Events this secondary only keeps a copy of (its primary's chats) don't go back to the primary: it has them. Its own @@ -910,6 +962,8 @@ export async function releaseChatsTo(peer: string, ids: string[]): Promise<{ rel clearQueue(id); const state: RunnerChatState = { running: false, paused: null, followup: null }; sql("UPDATE conversations SET runner_id = ?, runner_state = ?, working_directory = NULL, computer_target = NULL, updated_at = ? WHERE id = ?", peer, JSON.stringify(state), now(), id); + // It lives there now: an older plan of this computer to hand it back there is done with. + forgetRelease(peer, id); emitConversationUpdated(id); released++; void fetchChatFrom(peer, id); @@ -1000,6 +1054,7 @@ export async function joinGroup(text: string): Promise { prepared: (id) => { primaryId = id; setGroup("secondary", id); + keepPreJoinLocal(id); }, }); const l = await waitOnline(primary.id); diff --git a/packages/core/src/remote/replica.ts b/packages/core/src/remote/replica.ts index dd5200a0..ff2bcb93 100644 --- a/packages/core/src/remote/replica.ts +++ b/packages/core/src/remote/replica.ts @@ -17,7 +17,9 @@ import { all, get, getDb, getMeta, run as sql, setMeta, tx } from "../db"; import { bus } from "../events/bus"; import { logger } from "../log"; import { now } from "../util"; -import { SETUP_TABLES, unsafe } from "./snapshot"; +import { listActiveRuns } from "../runner/runner"; +import { isSecondary, primaryRunnerId } from "./group"; +import { LOCAL_SETTINGS, SETUP_TABLES, unsafe, withOwnFields } from "./snapshot"; const log = logger("replica"); @@ -32,6 +34,8 @@ export interface ReplicaTable { key: string[]; /** Only rows with this value are shared. */ only?: { column: string; value: string }; + /** Rows with one of these values are never shared (the settings that describe one computer). */ + skip?: { column: string; values: string[] }; /** Own columns a new row can't take the column default for. */ onInsert?: (row: Record) => Record; /** Part of the setup: from the primary it comes as the snapshot. */ @@ -68,6 +72,7 @@ const STATE: Omit[] = [ /** VMs are machines of the computer they were made on. */ const NOT_SHARED = new Set(["vms"]); + let tablesCache: ReplicaTable[] | null = null; /** A table's key columns, as the schema says (the settings-like tables are keyed by `key`, not `id`). */ @@ -87,7 +92,12 @@ export function replicaTables(): ReplicaTable[] { const setup = SETUP_TABLES.filter((t) => !NOT_SHARED.has(t.table)).map( (t): ReplicaTable => ({ ...t, own: [...t.own, ...(OWN_HERE[t.table] ?? [])], key: keyOf(t.table), setup: true }), ); - tablesCache = [...setup, ...STATE.map((t) => ({ ...t, key: keyOf(t.table), setup: false }))]; + // Settings come from the primary as part of the snapshot too; what a secondary changes goes back from here. The + // sections that describe one computer stay where they are. + // The sections of one computer: snapshot.ts LOCAL_SETTINGS and what a secondary keeps while it forwards. + const ownSections = [...new Set([...LOCAL_SETTINGS, "vm"])]; + const settings: ReplicaTable = { table: "settings", own: [], entity: "settings", key: ["key"], setup: true, skip: { column: "key", values: ownSections } }; + tablesCache = [...setup, settings, ...STATE.map((t) => ({ ...t, key: keyOf(t.table), setup: false }))]; return tablesCache; } @@ -123,7 +133,10 @@ function keyExpr(t: ReplicaTable, alias: "NEW" | "OLD"): string { function triggerSql(t: ReplicaTable): string[] { const columns = columnsOf(t.table); const shared = columns.filter((c) => !t.own.includes(c) && c !== "updated_at"); - const only = (alias: "NEW" | "OLD") => (t.only ? ` AND ${alias}.${q(t.only.column)} = '${t.only.value.replace(/'/g, "''")}'` : ""); + const lit = (v: string) => `'${v.replace(/'/g, "''")}'`; + const only = (alias: "NEW" | "OLD") => + (t.only ? ` AND ${alias}.${q(t.only.column)} = ${lit(t.only.value)}` : "") + + (t.skip ? ` AND ${alias}.${q(t.skip.column)} NOT IN (${t.skip.values.map(lit).join(", ")})` : ""); // An update and an insert instead of INSERT OR REPLACE: a foreign key action (ON DELETE SET NULL) runs the trigger // with its own conflict handling, and a replace would fail there. const key = (alias: "NEW" | "OLD") => keyExpr(t, alias); @@ -178,18 +191,21 @@ export function ensureReplica(): void { /** Rows from before the replica: known, as old as can be, so any real change wins over them. */ function backfill(tables: ReplicaTable[]): void { + // On a secondary what is here already came from its primary: nothing of it goes back. + const origin = isSecondary() ? primaryRunnerId() : null; tx(() => { let n = get<{ n: number }>("SELECT n FROM replica_seq WHERE id = 1")?.n ?? 0; for (const t of tables) { - const where = t.only ? ` WHERE ${q(t.only.column)} = ?` : ""; - const rows = all>(`SELECT ${t.key.map(q).join(", ")} FROM ${q(t.table)}${where}`, ...(t.only ? [t.only.value] : [])); + const where = t.only ? ` WHERE ${q(t.only.column)} = ?` : t.skip ? ` WHERE ${q(t.skip.column)} NOT IN (${t.skip.values.map(() => "?").join(", ")})` : ""; + const rows = all>(`SELECT ${t.key.map(q).join(", ")} FROM ${q(t.table)}${where}`, ...(t.only ? [t.only.value] : t.skip ? t.skip.values : [])); for (const r of rows) { n++; sql( - "INSERT OR IGNORE INTO replica_rows (tbl, pk, seq, at, deleted, origin) VALUES (?, ?, ?, '1970-01-01T00:00:00.000Z', 0, NULL)", + "INSERT OR IGNORE INTO replica_rows (tbl, pk, seq, at, deleted, origin) VALUES (?, ?, ?, '1970-01-01T00:00:00.000Z', 0, ?)", t.table, t.key.map((k) => String(r[k])).join(KEY_SEP), n, + origin, ); } } @@ -274,6 +290,24 @@ export function onAck(fn: (peer: string, after: number) => void): () => void { return () => ackListeners.delete(fn); } +/** Joining a group: what this computer had before stays its own and is never sent (the primary's setup replaces it). */ +export function keepPreJoinLocal(primary: string): void { + try { + sql("UPDATE replica_rows SET origin = ? WHERE origin IS NULL", primary); + } catch (err) { + log.warn("could not set this computer's earlier data aside", err); + } +} + +/** Keys of `table` this computer made itself (not copies): the setup copy doesn't delete them, a deletion arrives here. */ +export function madeHere(table: string): Set { + try { + return new Set(all<{ pk: string }>("SELECT pk FROM replica_rows WHERE tbl = ? AND origin IS NULL AND deleted = 0", table).map((r) => r.pk)); + } catch { + return new Set(); + } +} + /** Forget what a computer that left the group took or gave. */ export function forgetPeer(peer: string): void { try { @@ -333,7 +367,8 @@ export function changesFor(peer: string, after: number, opts: { setup: boolean; for (const r of page) { if (r.origin === peer) continue; const t = spec(r.tbl); - if (!t || (!opts.setup && t.setup) || !exists(t.table)) continue; + // Without the setup a secondary still gets its deletions: the snapshot doesn't delete what that computer made itself. + if (!t || (!opts.setup && t.setup && !r.deleted) || !exists(t.table)) continue; if (r.deleted) { changes.push({ t: r.tbl, k: r.pk, at: r.at, d: 1 }); continue; @@ -436,7 +471,13 @@ export function applyChanges(peer: string, changes: ReplicaChange[], opts: { pee }); } catch (one) { partial.failed++; - log.warn(`could not take a change of ${c.t}`, { peer, key: c.k, error: one instanceof Error ? one.message : String(one) }); + // Kept and tried again with the next pulls (a name taken here may be free by then); never just dropped. + try { + defer(peer, c); + } catch { + /* the database is in trouble: the next pull brings it again */ + } + log.warn(`could not take a change of ${c.t} yet`, { peer, key: c.k, error: one instanceof Error ? one.message : String(one) }); } } Object.assign(result, partial); @@ -456,6 +497,11 @@ function applyOne(peer: string, c: ReplicaChange, opts: { peerWinsTies: boolean; const keep = !!local && (local.at > c.at || (tie && !c.d && (local.deleted === 1 || (local.origin !== peer && !opts.peerWinsTies)))); if (keep) { result.kept++; + // This computer's version is newer: it goes to the peer again (it pulled past it already, or never got it). + if (local!.at > c.at) { + sql("UPDATE replica_seq SET n = n + 1 WHERE id = 1"); + sql("UPDATE replica_rows SET seq = (SELECT n FROM replica_seq WHERE id = 1) WHERE tbl = ? AND pk = ?", t.table, c.k); + } return; } const columns = cachedColumns(t.table); @@ -464,7 +510,14 @@ function applyOne(peer: string, c: ReplicaChange, opts: { peerWinsTies: boolean; result.entities.add(t.entity); (result.keys[t.table] ??= []).push(c.k); }; + if (c.d && t.skip && t.key.length === 1 && t.skip.column === t.key[0] && t.skip.values.includes(parts[0]!)) return; if (c.d) { + // Never an agent out from under a run: the deletion waits until its work ends here. + if (t.table === "agents" && listActiveRuns().some((r) => r.agentId === parts[0])) { + defer(peer, c); + result.deferred++; + return; + } const before = t.table === "agents" ? get<{ slug: string }>("SELECT slug FROM agents WHERE id = ?", parts[0]!) : null; const res = asPeer(peer, c.at, () => sql(`DELETE FROM ${q(t.table)} WHERE ${keyWhere(t)}`, ...parts)); if (res.changes === 0) { @@ -492,6 +545,10 @@ function applyOne(peer: string, c: ReplicaChange, opts: { peerWinsTies: boolean; } for (const [i, k] of t.key.entries()) row[k] = parts[i]!; if (t.only && row[t.only.column] !== t.only.value) return; + if (t.skip && t.skip.values.includes(String(row[t.skip.column]))) return; + if (t.table === "settings" && typeof row.value === "string") { + row.value = withOwnFields(String(row.key), row.value, get<{ value: string }>("SELECT value FROM settings WHERE key = ?", String(row.key))?.value ?? null); + } // Ids and names that become folder names here are checked like the setup copy checks them. const problem = unsafe(t.table, row); if (problem) { @@ -501,14 +558,7 @@ function applyOne(peer: string, c: ReplicaChange, opts: { peerWinsTies: boolean; } const missing = missingParent(row, t.table, incoming); if (missing) { - sql( - "INSERT INTO replica_deferred (peer, tbl, pk, change, created_at) VALUES (?, ?, ?, ?, ?) ON CONFLICT(peer, tbl, pk) DO UPDATE SET change = excluded.change", - peer, - t.table, - c.k, - JSON.stringify(c), - now(), - ); + defer(peer, c); result.deferred++; opts.onMissing?.(missing.table, missing.id); return; @@ -536,6 +586,18 @@ function applyOne(peer: string, c: ReplicaChange, opts: { peerWinsTies: boolean; } } +/** Kept to try again: a change that can't be written yet (a row it points at, a name taken here, an agent at work). */ +function defer(peer: string, c: ReplicaChange): void { + sql( + "INSERT INTO replica_deferred (peer, tbl, pk, change, created_at) VALUES (?, ?, ?, ?, ?) ON CONFLICT(peer, tbl, pk) DO UPDATE SET change = excluded.change", + peer, + c.t, + c.k, + JSON.stringify(c), + now(), + ); +} + /** Changes of `peer` that waited for a row they point at: tried again (after a pull, after a chat arrived). */ export function retryDeferred(peer: string, opts: { peerWinsTies: boolean; onMissing?: (table: string, id: string) => void }): ApplyResult { const cutoff = new Date(Date.now() - DEFERRED_DAYS * 86_400_000).toISOString(); @@ -555,10 +617,12 @@ export function retryDeferred(peer: string, opts: { peerWinsTies: boolean; onMis } /** Deletions older than this are forgotten (every computer of the group has long taken them). */ -export function pruneTombstones(): void { +export function pruneTombstones(peers: string[]): void { try { const cutoff = new Date(Date.now() - TOMBSTONE_DAYS * 86_400_000).toISOString(); - sql("DELETE FROM replica_rows WHERE deleted = 1 AND at < ?", cutoff); + // Only what every computer of the group has taken: one that was away for long still learns about the deletion. + const taken = peers.length ? Math.min(...peers.map((p) => Number(getMeta(ackedKey(p)) ?? 0))) : Number.MAX_SAFE_INTEGER; + sql("DELETE FROM replica_rows WHERE deleted = 1 AND at < ? AND seq <= ?", cutoff, taken); } catch (err) { log.warn("could not prune old deletions", err); } diff --git a/packages/core/src/remote/replicaSync.ts b/packages/core/src/remote/replicaSync.ts index 4462cc76..a054e524 100644 --- a/packages/core/src/remote/replicaSync.ts +++ b/packages/core/src/remote/replicaSync.ts @@ -11,9 +11,9 @@ import { computerName } from "../mobile/devices"; import { reloadSchedules } from "../scheduler/scheduler"; import { notify } from "../services/notifications"; import { applyRuntimeSettings } from "../services/runtime"; -import { getSettings, updateSettings } from "../services/settings"; +import { getSettings, resetSettingsCache, updateSettings } from "../services/settings"; import { ticketsArrived } from "../tasks/service"; -import { getMeta, setMeta } from "../db"; +import { get, getMeta, setMeta } from "../db"; import { groupRole, isSecondary, primaryRunnerId } from "./group"; import { type ApplyResult, @@ -37,6 +37,7 @@ const PULL_EVERY_MS = 60_000; const HINT_DELAY_MS = 300; const WATCH_MS = 1_500; const MAX_PAGES = 200; +const PHONE_ON_META = "link.group.phoneAccessOn"; const chains = new Map>(); const hintTimers = new Map>(); @@ -127,16 +128,22 @@ async function afterApply(from: string, result: ApplyResult): Promise { for (const agentId of result.agents) { await refreshAgentFiles(agentId, `Changes from ${from}`).catch((err) => log.warn(`could not write the files of agent ${agentId}`, err)); } + if (result.keys.settings?.length) { + resetSettingsCache(); + applyRuntimeSettings(getSettings()); + } if (result.keys.routines?.length) reloadSchedules(); if (result.keys.tasks?.length) ticketsArrived([...new Set(result.keys.tasks)]); - if (result.keys.mobile_devices?.length) phonesArrived(from); + if (result.keys.mobile_devices?.some((id) => get("SELECT 1 FROM mobile_devices WHERE id = ?", id))) phonesArrived(from); announce(result); } /** A phone paired with another computer of the group: it works with this one too once phone access is on here. */ function phonesArrived(from: string): void { const settings = getSettings(); - if (settings.mobile.enabled) return; + // Once: a computer whose phone access the human switched off afterwards keeps it off. + if (settings.mobile.enabled || getMeta(PHONE_ON_META)) return; + setMeta(PHONE_ON_META, "1"); try { applyRuntimeSettings(updateSettings({ mobile: { enabled: true } } as never)); notify("info", "Your phone works with this computer too", `It was paired on ${from}. When that computer is away, the Godmode app on your phone connects to ${computerName()}.`, "/settings/phone"); @@ -184,7 +191,7 @@ export function startReplicaSync(opts: { fetchChat: (peer: string, conversationI }, WATCH_MS); watchTimer.unref?.(); pullTimer ??= setInterval(() => { - pruneTombstones(); + pruneTombstones(peers()); for (const peer of peers()) void pullFrom(peer).catch(() => undefined); }, PULL_EVERY_MS); pullTimer.unref?.(); diff --git a/packages/core/src/remote/runners.ts b/packages/core/src/remote/runners.ts index 59239d63..065bc07f 100644 --- a/packages/core/src/remote/runners.ts +++ b/packages/core/src/remote/runners.ts @@ -56,7 +56,7 @@ import { notify } from "../services/notifications"; import { addWelcomeEvents, setRemoteViewHandlers } from "../server/ws"; import { HttpError, badRequest, newId, notFound, now, parseJson } from "../util"; import * as vault from "../vault/vault"; -import { remoteRuns } from "./activeRuns"; +import { remoteRuns, setRunnerReachability } from "./activeRuns"; import { browserSignIns, cookiesFor } from "./browserSessions"; import { canonicalKey, fingerprint } from "./crypto"; import { loadIdentity } from "./identity"; @@ -259,6 +259,13 @@ export function runnerInfoOf(id: string): RunnerInfo | undefined { return infos.get(id); } +/** A chat that moved back to `runnerId` before it was let go there: nothing to let go anymore. */ +export function forgetRelease(runnerId: string, conversationId: string): void { + const left = pendingReleases(runnerId).filter((id) => id !== conversationId); + if (left.length) setMeta(releaseKey(runnerId), JSON.stringify(left)); + else deleteMeta(releaseKey(runnerId)); +} + /** Chats that moved here from `runnerId` and that it still has to let go. */ export function takenFrom(runnerId: string): string[] { return pendingReleases(runnerId); @@ -594,6 +601,7 @@ export function startRunners(): void { if (started) return; started = true; wireHub(); + setRunnerReachability((id) => links.get(id)?.state.state === "online"); setUpdateHost({ row: (id) => { const r = row(id); @@ -639,6 +647,7 @@ export function startRunners(): void { export function stopRunners(): void { started = false; + setRunnerReachability(null); offBus?.(); offBus = null; if (autoUpdateTimer) clearInterval(autoUpdateTimer); diff --git a/packages/core/src/remote/snapshot.ts b/packages/core/src/remote/snapshot.ts index bc4991cb..106d5b6f 100644 --- a/packages/core/src/remote/snapshot.ts +++ b/packages/core/src/remote/snapshot.ts @@ -28,7 +28,7 @@ import { DEFAULT_SETTINGS, getSettings, resetSettingsCache } from "../services/s import { badRequest, parseJson } from "../util"; import { decrypt, sha256 } from "../vault/crypto"; import { isSecondary, primaryRunnerId } from "./group"; -import { asPeer, pendingKeys } from "./replica"; +import { asPeer, madeHere, pendingKeys } from "./replica"; import * as vault from "../vault/vault"; const log = logger("snapshot"); @@ -134,6 +134,18 @@ function keptFields(section: string): string[] { return [...(EXECUTABLE_SETTINGS[section] ?? []), ...(RUNNER_SETTINGS[section] ?? [])]; } +/** A settings section another computer sent (JSON), with this computer's own programs and endpoints kept in it. */ +export function withOwnFields(section: string, incoming: string, local: string | null): string { + const next = parseJson(incoming, null); + const mine = parseJson(local, null); + if (!isObject(next)) return incoming; + for (const field of keptFields(section)) { + delete next[field]; + if (isObject(mine) && field in mine) next[field] = mine[field]; + } + return JSON.stringify(next); +} + /* ------------------------------------------------------------------ */ /* Build (controller) */ /* ------------------------------------------------------------------ */ @@ -270,6 +282,8 @@ async function apply(s: ConfigSnapshot): Promise<{ digest: string; warnings: str // primary takes them and sends them back with its next copy), and what this copy writes is the primary's. const primary = isSecondary() ? primaryRunnerId() : null; const mineNow = (table: string) => (primary ? pendingKeys(primary, table) : new Set()); + // What this computer made itself is never deleted by a copy: a deletion of it arrives from the primary by itself. + const madeByMe = (table: string) => (primary ? madeHere(table) : new Set()); const writing = (fn: () => T): T => (primary ? asPeer(primary, null, fn) : fn()); writing(() => tx(() => { @@ -306,6 +320,7 @@ async function apply(s: ConfigSnapshot): Promise<{ digest: string; warnings: str const keys = new Set(); const rows: Record[] = []; const ownChanges = mineNow(spec.table); + const ownRows = madeByMe(spec.table); for (const raw of incoming as unknown[]) { if (!isObject(raw) || typeof raw[pk] !== "string" || !raw[pk]) continue; if (spec.only && raw[spec.only.column] !== spec.only.value) continue; @@ -321,10 +336,7 @@ async function apply(s: ConfigSnapshot): Promise<{ digest: string; warnings: str for (const local of all>(`SELECT * FROM ${q(spec.table)}${filter}`, ...(spec.only ? [spec.only.value] : []))) { const key = String(local[pk]); if (keys.has(key)) continue; - if (ownChanges.has(key)) { - pending = true; - continue; - } + if (ownChanges.has(key) || ownRows.has(key)) continue; if (spec.table === "agents" && busy.has(key)) { pending = true; warnings.push( diff --git a/packages/core/src/remote/standIn.ts b/packages/core/src/remote/standIn.ts index 66994f9e..8ccbb09c 100644 --- a/packages/core/src/remote/standIn.ts +++ b/packages/core/src/remote/standIn.ts @@ -16,6 +16,8 @@ const log = logger("devices"); const ENABLED_META = "link.group.standIn"; const MINUTES_META = "link.group.standInMinutes"; const DEFAULT_MINUTES = 2; +const GOODBYE_WAIT_MS = 45_000; +const RECHECK_MS = 60_000; export interface TakeOver { /** When the primary was last seen: automations due since then run here once. */ @@ -26,11 +28,16 @@ let waiting: { timer: ReturnType; at: string; lostAt: string let goodbye = false; let takeOver: ((t: TakeOver) => Promise) | null = null; let changed: (() => void) | null = null; +let online: (() => Promise) | null = null; -/** remote/devices.ts: what taking over means (continue the primary's work here), and how the UI hears of it. */ -export function setStandInHooks(hooks: { takeOver: (t: TakeOver) => Promise; changed: () => void } | null): void { +/** + * remote/devices.ts: what taking over means (continue the primary's work here), how the UI hears of it, and whether + * this computer itself is online (one that lost the internet is the one cut off: it doesn't take over). + */ +export function setStandInHooks(hooks: { takeOver: (t: TakeOver) => Promise; changed: () => void; online: () => Promise } | null): void { takeOver = hooks?.takeOver ?? null; changed = hooks?.changed ?? null; + online = hooks?.online ?? null; if (!hooks) cancelWaiting(); } @@ -69,8 +76,10 @@ export function primaryWentAway(lastSeen: string | null): void { if (!isSecondary() || standingIn() || waiting || !takeOver) return; const settings = standInSettings(); if (!settings.standInEnabled) return; - // GODMODE_STAND_IN_MS: tests don't wait minutes. - const wait = goodbye ? 0 : Number(process.env.GODMODE_STAND_IN_MS) || settings.standInMinutes * 60_000; + // GODMODE_STAND_IN_MS: tests don't wait minutes. A primary that said goodbye may only be restarting (an update): a + // short wait still, so its chats keep their sessions when it is back within it. + const full = Number(process.env.GODMODE_STAND_IN_MS) || settings.standInMinutes * 60_000; + const wait = goodbye ? Math.min(full, GOODBYE_WAIT_MS) : full; const at = new Date(Date.now() + wait).toISOString(); const lostAt = lastSeen ?? now(); const timer = setTimeout(() => { @@ -83,13 +92,13 @@ export function primaryWentAway(lastSeen: string | null): void { changed?.(); } -/** The primary said it goes away now (Godmode quits there): no grace time. */ +/** The primary said it goes away now (Godmode quits or restarts there): a shorter grace time. */ export function primaryLeftNow(): void { goodbye = true; if (!waiting) return; const lostAt = waiting.lostAt; cancelWaiting(); - void begin(lostAt); + primaryWentAway(lostAt); } /** The primary can be reached again: a take-over that waited doesn't happen. */ @@ -101,6 +110,19 @@ export function primaryIsBack(): void { } async function begin(lostAt: string): Promise { + if (!isSecondary() || standingIn() || !takeOver) return; + if (online && !(await online().catch(() => true))) { + // Cut off itself (no internet): it looks again in a minute instead of running the group's work twice later. + log.info("this computer is offline itself; it doesn't stand in yet"); + const timer = setTimeout(() => { + waiting = null; + void begin(lostAt); + }, RECHECK_MS); + timer.unref?.(); + waiting = { timer, at: new Date(Date.now() + RECHECK_MS).toISOString(), lostAt }; + changed?.(); + return; + } if (!isSecondary() || standingIn() || !takeOver) return; setStandingIn(now()); log.info("standing in for the primary"); diff --git a/packages/core/src/server/routes/link.ts b/packages/core/src/server/routes/link.ts index 7ac00e2f..190ffc2d 100644 --- a/packages/core/src/server/routes/link.ts +++ b/packages/core/src/server/routes/link.ts @@ -15,7 +15,7 @@ import { installUpdates } from "../../services/maintenance"; import { checkUpdates } from "../../services/updates"; import { runCommand, toolPath } from "../../services/doctor"; import { HttpError, badRequest, childEnv, notFound } from "../../util"; -import { acceptJoin, adoptPushedChat, chatsTakenFrom, deviceIdOf, groupForSecondary, makeInvite, peerAway, peerHello, peerLeft, releaseChatsTo } from "../../remote/devices"; +import { acceptJoin, adoptPushedChat, chatsTakenFrom, deviceIdOf, deviceState, groupForSecondary, makeInvite, peerAway, peerHello, peerLeft, releaseChatsTo } from "../../remote/devices"; import { ackFrom, changesFor } from "../../remote/replica"; import { isSecondary } from "../../remote/group"; import { callForDevice } from "../../remote/deviceTools"; @@ -174,6 +174,11 @@ export function registerLinkRoutes(app: Hono): void { // The calling computer is back: which of its chats this one continued meanwhile. app.get("/api/link/devices/taken", (c) => c.json(chatsTakenFrom(groupPeer(c)))); + app.get("/api/link/devices/state", (c) => { + groupPeer(c); + return c.json(deviceState()); + }); + // The calling computer (the primary) is back: connect to it now. app.post("/api/link/devices/hello", (c) => { peerHello(groupPeer(c)); diff --git a/packages/core/src/services/humanTasks.ts b/packages/core/src/services/humanTasks.ts index 3b0f4a40..0804feef 100644 --- a/packages/core/src/services/humanTasks.ts +++ b/packages/core/src/services/humanTasks.ts @@ -528,8 +528,17 @@ function questionBody(q: AgentQuestion): string { } /** An agent asked (`ask_human`, `request_approval`): the question also waits on the board, as a ticket that stands for it. */ +/** + * The question's chat lives on another computer of the device group: that computer makes its ticket and the group + * shares it (remote/replica.ts). A runner's chats get theirs here, runners share nothing. + */ +function askedOnDevice(conversationId: string | null): boolean { + if (!conversationId) return false; + return !!get("SELECT 1 FROM conversations c JOIN runners r ON r.id = c.runner_id WHERE c.id = ? AND r.kind = 'device'", conversationId); +} + function mirrorQuestion(q: AgentQuestion): void { - if (q.status !== "open" || get("SELECT 1 FROM human_tasks WHERE question_id = ?", q.id)) return; + if (q.status !== "open" || askedOnDevice(q.conversationId) || get("SELECT 1 FROM human_tasks WHERE question_id = ?", q.id)) return; add({ title: q.title, body: questionBody(q), @@ -573,6 +582,8 @@ function syncQuestions(): void { safely(() => mirrorQuestion(q)); } for (const r of all(`SELECT * FROM human_tasks WHERE question_id IS NOT NULL AND status IN ${ACTIVE_SQL}`)) { + // Another computer of the group asked it: that computer keeps its ticket in step. + if (askedOnDevice(r.conversation_id)) continue; safely(() => { let q: AgentQuestion | null = null; try { diff --git a/packages/core/src/tasks/service.ts b/packages/core/src/tasks/service.ts index 794bfa19..f995ee40 100644 --- a/packages/core/src/tasks/service.ts +++ b/packages/core/src/tasks/service.ts @@ -16,7 +16,7 @@ * Descriptions are Markdown and may link files (screenshots, PDFs…, see ./attachments.ts): the agent gets a copy of * each and is told to read them first. */ -import { remoteRuns } from "../remote/activeRuns"; +import { remoteRuns, runnerReachable } from "../remote/activeRuns"; import { existsSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; @@ -2325,8 +2325,10 @@ export function reconcileTasks(reason: string, opts: { retry?: boolean } = {}): let restarts = 0; for (const t of all("SELECT * FROM tasks WHERE status = 'in_progress'")) { if (openRuns(t.conversation_id).length || (t.conversation_id && getFollowup(t.conversation_id))) continue; - // Its chat works on another computer of the group (one that stood in for this one): that computer finishes it. - if (t.conversation_id && remoteRuns().some((r) => r.conversationId === t.conversation_id)) continue; + // Its chat lives on another computer that can be reached (one that stood in for this one): that computer finishes + // it. One that is away can't: then the work is picked up here. + const owner = t.conversation_id ? get<{ runner_id: string | null }>("SELECT runner_id FROM conversations WHERE id = ?", t.conversation_id)?.runner_id : null; + if (owner && (runnerReachable(owner) || remoteRuns().some((r) => r.conversationId === t.conversation_id))) continue; // It waits for its parts: it keeps waiting, or continues when they were finished meanwhile. if (waitsForParts(t)) { if (!openParts(t.id).length) partClosed(t.id); diff --git a/packages/core/test/devices-e2e.test.ts b/packages/core/test/devices-e2e.test.ts index 43da7beb..9dbc8062 100644 --- a/packages/core/test/devices-e2e.test.ts +++ b/packages/core/test/devices-e2e.test.ts @@ -18,6 +18,7 @@ import { deliverForwarded, websocketHandler, type HubSocket } from "../src/serve import { resetSettingsCache, updateSettings } from "../src/services/settings"; import { startChat } from "../src/services/conversations"; import { startDevices, stopDevices } from "../src/remote/devices"; +import { startHumanTasks, stopHumanTasks } from "../src/services/humanTasks"; import { forwarding, groupRole, primaryRunnerId, resetGroupCache, runsShared } from "../src/remote/group"; import { startLinkServer, stopLinkServer } from "../src/remote/linkServer"; import { startRunners, stopRunners } from "../src/remote/runners"; @@ -150,6 +151,8 @@ beforeAll(async () => { const before = await startChat({ agentId: agent.id, content: "Before joining" }); beforeJoinChat = before.conversation.id; await waitForRun(before.run.id, 20_000); + // Like the app: My tasks run on every computer of the group. + startHumanTasks(); startDevices({ app, websocket: websocketHandler }, deliverForwarded); startRunners(); }, 120_000); @@ -164,6 +167,7 @@ afterAll(async () => { if (savedClaudeConfig === undefined) delete process.env.CLAUDE_CONFIG_DIR; else process.env.CLAUDE_CONFIG_DIR = savedClaudeConfig; stopDevices(); + stopHumanTasks(); stopRunners(); stopLinkServer(); await stopPrimary(); @@ -282,6 +286,11 @@ describe("a device group, end to end", () => { 30_000, "the question on the primary", ); + // One ticket in My tasks for it, made where the run asks and shared with the primary. + await until(async () => (await onPrimary<{ questionId: string | null }[]>("/api/human-tasks")).body.some((t) => t.questionId === question!.id), 20_000, "the question's ticket on the primary"); + await sleep(2_000); + expect((await onPrimary<{ questionId: string | null }[]>("/api/human-tasks")).body.filter((t) => t.questionId === question!.id)).toHaveLength(1); + expect(all("SELECT id FROM human_tasks WHERE question_id = ?", question!.id)).toHaveLength(1); const answered = await here(`/api/questions/${question!.id}/answer`, { method: "POST", body: JSON.stringify({ optionId: question!.options[0]!.id }) }); expect(answered.status).toBe(200); await until(() => runsOf(id).some((r) => r.status === "succeeded"), 30_000, "the run to continue here"); diff --git a/packages/core/test/replica.test.ts b/packages/core/test/replica.test.ts index bd689db0..a46fb80f 100644 --- a/packages/core/test/replica.test.ts +++ b/packages/core/test/replica.test.ts @@ -11,6 +11,7 @@ import { join } from "node:path"; import { loadConfig } from "../src/config"; import { all, closeDb, get, openDb, run, setDb } from "../src/db"; import { setLogLevel } from "../src/log"; +import { getSettings, resetSettingsCache, updateSettings } from "../src/services/settings"; import { applyChanges, changesFor, ensureReplica, pendingFor, pendingKeys, replicaSeq, replicaTables, resetReplicaCache, retryDeferred, type ReplicaChange } from "../src/remote/replica"; let dir: string; @@ -209,6 +210,24 @@ describe("between two computers", () => { expect(get("SELECT id FROM agents WHERE id = 'agt_evil'")).toBeNull(); }); + test("a settings change goes to the other computer, which keeps its own programs and its own sections", () => { + use(a); + resetSettingsCache(); + updateSettings({ general: { theme: "dark" }, runner: { claudePath: "/on/a/claude" }, mobile: { enabled: true } } as never); + const page = changesFor("rnr_b", 0, { setup: true }); + const sections = page.changes.filter((c) => c.t === "settings").map((c) => c.k); + expect(sections).toContain("general"); + expect(sections).not.toContain("mobile"); + use(b); + resetSettingsCache(); + updateSettings({ runner: { claudePath: "/on/b/claude" } } as never); + applyChanges("rnr_a", page.changes, { peerWinsTies: false }); + resetSettingsCache(); + expect(getSettings().general.theme).toBe("dark"); + expect(getSettings().runner.claudePath).toBe("/on/b/claude"); + resetSettingsCache(); + }); + test("the setup can be left out (a secondary gets it as the snapshot)", () => { use(a); run("INSERT INTO workspaces (id, name, slug, created_at, updated_at) VALUES ('wsp_1', 'Shop', 'shop', ?, ?)", T(0), T(0)); From 8a688228e67380d9755a400430a46f95a8c1beb0 Mon Sep 17 00:00:00 2001 From: Daniel Ehrhardt Date: Tue, 20 Oct 2026 20:18:49 +0200 Subject: [PATCH 18/18] Device groups review round 2: deferred losers, take-over after a return, missed windows, failed joins, settle wait --- .../components/settings/devices-section.tsx | 2 +- docs/ARCHITECTURE.md | 4 ++++ packages/core/src/remote/devices.ts | 14 ++++++++++---- packages/core/src/remote/replica.ts | 19 ++++++++++++++----- packages/core/src/remote/standIn.ts | 9 ++++++++- packages/core/src/scheduler/scheduler.ts | 9 ++++++--- packages/core/src/tasks/service.ts | 6 +++++- packages/core/test/replica.test.ts | 16 ++++++++++++++++ 8 files changed, 64 insertions(+), 15 deletions(-) diff --git a/apps/desktop/src/components/settings/devices-section.tsx b/apps/desktop/src/components/settings/devices-section.tsx index 3e65f748..04a8ecd2 100644 --- a/apps/desktop/src/components/settings/devices-section.tsx +++ b/apps/desktop/src/components/settings/devices-section.tsx @@ -568,7 +568,7 @@ function StandInGroup({ group, now }: { group: DeviceGroup; now: number }) { const elsewhere = primary ? "" : ` Change this on ${group.primaryName}.`; return ( - } description="Every computer has a copy of everything, so nothing stops when the primary sleeps or its lid closes."> + } description="Every computer has a copy of everything, so nothing stops when the primary sleeps or its lid closes. With Tailscale on each computer they also find each other on different networks, so only one of them does the work."> {group.role === "secondary" && !group.primaryOnline && (