From f27b7decd051e3410beb938357d62f8bf33d1951 Mon Sep 17 00:00:00 2001 From: Jonathan Hefner Date: Wed, 7 Jan 2026 17:06:58 -0600 Subject: [PATCH 001/352] Support `safeAreaInsets` + type-checking in video-resource-server MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apply host-provided safe area insets as padding on the main container, and update `tsconfig.json` to use `moduleResolution: "bundler"` for correct resolution of `McpUiHostContext` type with Vite. Also adds `tsc --noEmit` to the build script to catch type errors, and fixes pre-existing type safety issue with `blob` property access by using proper type narrowing. ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- examples/video-resource-server/package.json | 2 +- examples/video-resource-server/src/mcp-app.ts | 30 ++++++++++++++----- examples/video-resource-server/tsconfig.json | 20 ++++++++----- 3 files changed, 35 insertions(+), 17 deletions(-) diff --git a/examples/video-resource-server/package.json b/examples/video-resource-server/package.json index b5efd1c..1d221fb 100644 --- a/examples/video-resource-server/package.json +++ b/examples/video-resource-server/package.json @@ -4,7 +4,7 @@ "private": true, "type": "module", "scripts": { - "build": "cross-env INPUT=mcp-app.html vite build", + "build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build", "watch": "cross-env INPUT=mcp-app.html vite build --watch", "serve": "bun server.ts", "start": "cross-env NODE_ENV=development npm run build && npm run serve", diff --git a/examples/video-resource-server/src/mcp-app.ts b/examples/video-resource-server/src/mcp-app.ts index f530ce7..d71d600 100644 --- a/examples/video-resource-server/src/mcp-app.ts +++ b/examples/video-resource-server/src/mcp-app.ts @@ -4,7 +4,7 @@ * Demonstrates fetching binary content (video) via MCP resources. * The video is served as a base64 blob and converted to a data URI for playback. */ -import { App } from "@modelcontextprotocol/ext-apps"; +import { App, type McpUiHostContext } from "@modelcontextprotocol/ext-apps"; import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; import { ReadResourceResultSchema } from "@modelcontextprotocol/sdk/types.js"; import "./global.css"; @@ -16,6 +16,7 @@ const log = { }; // Get element references +const mainEl = document.querySelector(".main") as HTMLElement; const loadingEl = document.getElementById("loading")!; const loadingTextEl = document.getElementById("loading-text")!; const errorEl = document.getElementById("error")!; @@ -91,16 +92,13 @@ app.ontoolresult = async (result) => { ReadResourceResultSchema, ); - log.info( - "Resource received, blob size:", - resourceResult.contents[0]?.blob?.length, - ); - const content = resourceResult.contents[0]; - if (!content?.blob) { + if (!content || !("blob" in content)) { throw new Error("Resource response did not contain blob data"); } + log.info("Resource received, blob size:", content.blob.length); + showLoading("Converting to data URI..."); const mimeType = content.mimeType || "video/mp4"; @@ -120,5 +118,21 @@ app.onerror = (err) => { showError(err instanceof Error ? err.message : String(err)); }; +function handleHostContextChanged(ctx: McpUiHostContext) { + if (ctx.safeAreaInsets) { + mainEl.style.paddingTop = `${ctx.safeAreaInsets.top}px`; + mainEl.style.paddingRight = `${ctx.safeAreaInsets.right}px`; + mainEl.style.paddingBottom = `${ctx.safeAreaInsets.bottom}px`; + mainEl.style.paddingLeft = `${ctx.safeAreaInsets.left}px`; + } +} + +app.onhostcontextchanged = handleHostContextChanged; + // Connect to host -app.connect(); +app.connect().then(() => { + const ctx = app.getHostContext(); + if (ctx) { + handleHostContextChanged(ctx); + } +}); diff --git a/examples/video-resource-server/tsconfig.json b/examples/video-resource-server/tsconfig.json index 1a7525e..535267b 100644 --- a/examples/video-resource-server/tsconfig.json +++ b/examples/video-resource-server/tsconfig.json @@ -1,15 +1,19 @@ { "compilerOptions": { "target": "ESNext", - "module": "NodeNext", - "moduleResolution": "NodeNext", + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "verbatimModuleSyntax": true, + "noEmit": true, "strict": true, "skipLibCheck": true, - "esModuleInterop": true, - "resolveJsonModule": true, - "declaration": false, - "outDir": "dist", - "lib": ["ESNext", "DOM"] + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true }, - "include": ["server.ts", "src/**/*"] + "include": ["src", "server.ts"] } From e205e26e4e50c02bd184b2581ace10b0d4eab406 Mon Sep 17 00:00:00 2001 From: Jonathan Hefner Date: Mon, 15 Dec 2025 11:15:04 -0600 Subject: [PATCH 002/352] Update quickstart guide MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Reorganize prerequisites to emphasize MCP concepts first - Add tip linking to official MCP quickstart for newcomers - Update install command to use published npm package - Remove zod dependency and `structuredContent` usage - Use `RESOURCE_MIME_TYPE` constant for consistency - Add clearer comments explaining tool/resource registration - Simplify UI to extract time from text content ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- docs/quickstart.md | 60 ++++++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/docs/quickstart.md b/docs/quickstart.md index 8569bfd..9481df3 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -15,8 +15,12 @@ A simple app that fetches the current server time and displays it in a clickable ## Prerequisites -- Node.js 18+ +- Familiarity with MCP concepts, especially [Tools](https://modelcontextprotocol.io/docs/learn/server-concepts#tools) and [Resources](https://modelcontextprotocol.io/docs/learn/server-concepts#resources) - Familiarity with the [MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk) +- Node.js 18+ + +> [!TIP] +> New to building MCP servers? Start with the [official MCP quickstart guide](https://modelcontextprotocol.io/docs/develop/build-server) to learn the core concepts first. ## 1. Project Setup @@ -30,7 +34,7 @@ npm init -y Install dependencies: ```bash -npm install github:modelcontextprotocol/ext-apps @modelcontextprotocol/sdk zod +npm install @modelcontextprotocol/ext-apps @modelcontextprotocol/sdk npm install -D typescript vite vite-plugin-singlefile express cors @types/express @types/cors tsx ``` @@ -98,45 +102,49 @@ Create `server.ts`: import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; import { + registerAppTool, + registerAppResource, RESOURCE_MIME_TYPE, - type McpUiToolMeta, -} from "@modelcontextprotocol/ext-apps"; +} from "@modelcontextprotocol/ext-apps/server"; import cors from "cors"; import express from "express"; import fs from "node:fs/promises"; import path from "node:path"; -import * as z from "zod"; const server = new McpServer({ name: "My MCP App Server", version: "1.0.0", }); -// Two-part registration: tool + resource +// Two-part registration: tool + resource, tied together by the resource URI. const resourceUri = "ui://get-time/mcp-app.html"; -server.registerTool( +// Register a tool with UI metadata. When the host calls this tool, it reads +// `_meta.ui.resourceUri` to know which resource to fetch and render as an +// interactive UI. +registerAppTool( + server, "get-time", { title: "Get Time", description: "Returns the current server time.", inputSchema: {}, - outputSchema: { time: z.string() }, - _meta: { ui: { resourceUri } as McpUiToolMeta }, // Links tool to UI + _meta: { ui: { resourceUri } }, }, async () => { const time = new Date().toISOString(); return { content: [{ type: "text", text: time }], - structuredContent: { time }, }; }, ); -server.registerResource( +// Register the resource, which returns the bundled HTML/JavaScript for the UI. +registerAppResource( + server, resourceUri, resourceUri, - { mimeType: "text/html;profile=mcp-app" }, + { mimeType: RESOURCE_MIME_TYPE }, async () => { const html = await fs.readFile( path.join(import.meta.dirname, "dist", "mcp-app.html"), @@ -144,18 +152,18 @@ server.registerResource( ); return { contents: [ - { uri: resourceUri, mimeType: "text/html;profile=mcp-app", text: html }, + { uri: resourceUri, mimeType: RESOURCE_MIME_TYPE, text: html }, ], }; }, ); -// Express server for MCP endpoint -const app = express(); -app.use(cors()); -app.use(express.json()); +// Start an Express server that exposes the MCP endpoint. +const expressApp = express(); +expressApp.use(cors()); +expressApp.use(express.json()); -app.post("/mcp", async (req, res) => { +expressApp.post("/mcp", async (req, res) => { const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined, enableJsonResponse: true, @@ -165,7 +173,7 @@ app.post("/mcp", async (req, res) => { await transport.handleRequest(req, res, req.body); }); -app.listen(3001, (err) => { +expressApp.listen(3001, (err) => { if (err) { console.error("Error starting server:", err); process.exit(1); @@ -209,7 +217,7 @@ Create `mcp-app.html`: Create `src/mcp-app.ts`: ```typescript -import { App, PostMessageTransport } from "@modelcontextprotocol/ext-apps"; +import { App } from "@modelcontextprotocol/ext-apps"; // Get element references const serverTimeEl = document.getElementById("server-time")!; @@ -220,30 +228,30 @@ const app = new App({ name: "Get Time App", version: "1.0.0" }); // Register handlers BEFORE connecting app.ontoolresult = (result) => { - const { time } = (result.structuredContent as { time?: string }) ?? {}; + const time = result.content?.find((c) => c.type === "text")?.text; serverTimeEl.textContent = time ?? "[ERROR]"; }; // Wire up button click getTimeBtn.addEventListener("click", async () => { const result = await app.callServerTool({ name: "get-time", arguments: {} }); - const { time } = (result.structuredContent as { time?: string }) ?? {}; + const time = result.content?.find((c) => c.type === "text")?.text; serverTimeEl.textContent = time ?? "[ERROR]"; }); // Connect to host -app.connect(new PostMessageTransport(window.parent)); +app.connect(); ``` +> [!NOTE] +> **Full files:** [`mcp-app.html`](https://github.com/modelcontextprotocol/ext-apps/blob/main/examples/basic-server-vanillajs/mcp-app.html), [`src/mcp-app.ts`](https://github.com/modelcontextprotocol/ext-apps/blob/main/examples/basic-server-vanillajs/src/mcp-app.ts) + Build the UI: ```bash npm run build ``` -> [!NOTE] -> **Full files:** [`mcp-app.html`](https://github.com/modelcontextprotocol/ext-apps/blob/main/examples/basic-server-vanillajs/mcp-app.html), [`src/mcp-app.ts`](https://github.com/modelcontextprotocol/ext-apps/blob/main/examples/basic-server-vanillajs/src/mcp-app.ts) - This produces `dist/mcp-app.html` which contains your bundled app: ```console From 2a3c2ce0348ac156b864b638e43e337b27a06791 Mon Sep 17 00:00:00 2001 From: Jonathan Hefner Date: Wed, 7 Jan 2026 10:48:40 -0600 Subject: [PATCH 003/352] Add "How It Works" section to README MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Provides a concise 4-step overview of the MCP Apps architecture: tool call โ†’ `ui://` resource โ†’ sandboxed iframe โ†’ bidirectional communication via notifications. ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index eb95e8b..3010859 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,17 @@ This repo contains the SDK and [specification](https://github.com/modelcontextpr MCP Apps are a proposed standard inspired by [MCP-UI](https://mcpui.dev/) and [OpenAI's Apps SDK](https://developers.openai.com/apps-sdk/) to allow MCP Servers to display interactive UI elements in conversational MCP clients / chatbots. +## How It Works + +MCP Apps extend the Model Context Protocol to let servers deliver **interactive UIs** to MCP hosts. Here's how it works: + +1. **Tool call** โ€” The LLM calls a tool on your server +2. **UI Resource** โ€” The tool's definition links to a predeclared `ui://` resource containing its HTML interface +3. **Host renders** โ€” The host fetches the resource and displays it in a sandboxed iframe +4. **Bidirectional communication** โ€” The host passes tool data to the UI via notifications, and the UI can call other tools through the host + +This enables dashboards, forms, visualizations, and other rich experiences inside chat interfaces. + ## Overview This SDK serves two audiences: From df49e88b2d625b620243bd3d2905e1ed3148103a Mon Sep 17 00:00:00 2001 From: Ido Salomon Date: Sun, 11 Jan 2026 14:54:18 +0200 Subject: [PATCH 004/352] fix: align CSP sample with resourceDomains spec (#233) --- specification/draft/apps.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/specification/draft/apps.mdx b/specification/draft/apps.mdx index 8305003..2f95daa 100644 --- a/specification/draft/apps.mdx +++ b/specification/draft/apps.mdx @@ -1480,8 +1480,8 @@ const csp = resource._meta?.ui?.csp; const cspValue = ` default-src 'none'; - script-src 'self' 'unsafe-inline'; - style-src 'self' 'unsafe-inline'; + script-src 'self' 'unsafe-inline' ${csp?.resourceDomains?.join(' ') || ''}; + style-src 'self' 'unsafe-inline' ${csp?.resourceDomains?.join(' ') || ''}; connect-src 'self' ${csp?.connectDomains?.join(' ') || ''}; img-src 'self' data: ${csp?.resourceDomains?.join(' ') || ''}; font-src 'self' ${csp?.resourceDomains?.join(' ') || ''}; From 8b09f4278c08cbcae644965bf8a089a53bd3e32c Mon Sep 17 00:00:00 2001 From: Olivier Chafik Date: Sun, 11 Jan 2026 14:32:48 +0000 Subject: [PATCH 005/352] fix: proper CSP handling in basic-host sandboxing (HTTP headers, worker-src, document.write) (#234) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: Move CSP to HTTP headers + add worker-src, frameDomains, baseUriDomains, permissions Security improvements: - CSP is now set via HTTP headers in serve.ts instead of meta tags (meta tag CSP can be tampered with by same-origin content) - CSP passed as query param to sandbox.html for header-based enforcement New CSP/permissions features (borrowed from PR #158): - frameDomains: control frame-src directive for nested iframes - baseUriDomains: control base-uri directive - permissions: camera, microphone, geolocation via iframe allow attribute WebGL fix: - Use document.write() instead of srcdoc for inner iframe content (srcdoc creates opaque origin that breaks WebGL canvas updates) - Add worker-src directive with blob: support (critical for WebGL apps like CesiumJS/Three.js that use workers for tile decoding, terrain processing, image processing) ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * refactor: Remove permissions support (defer to PR #158) Keep this PR focused on CSP security fixes only. Permissions (camera, microphone, geolocation) will be handled in #158. ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * cleanup McpUiResourceCsp type usage / duplicate defs * fix: guard against CSP injection in domain parameters Validate CSP domain entries to reject characters that could: - Break out of CSP directives (semicolons, newlines) - Inject CSP keywords like 'unsafe-eval' (quotes) - Inject multiple sources in one entry (spaces) This prevents injection attacks where malicious domains could override the security policy. --------- Co-authored-by: Claude Opus 4.5 --- examples/basic-host/sandbox.html | 4 +- examples/basic-host/serve.ts | 86 +++++- examples/basic-host/src/implementation.ts | 24 +- examples/basic-host/src/index.tsx | 25 +- examples/basic-host/src/sandbox.ts | 54 +--- examples/basic-host/src/tamper-detection.ts | 325 ++++++++++++++++++++ specification/draft/apps.mdx | 36 ++- src/generated/schema.json | 42 +++ src/generated/schema.test.ts | 28 +- src/generated/schema.ts | 92 +++--- src/spec.types.ts | 11 +- 11 files changed, 572 insertions(+), 155 deletions(-) create mode 100644 examples/basic-host/src/tamper-detection.ts diff --git a/examples/basic-host/sandbox.html b/examples/basic-host/sandbox.html index b868e58..e0790fb 100644 --- a/examples/basic-host/sandbox.html +++ b/examples/basic-host/sandbox.html @@ -3,8 +3,8 @@ - + MCP-UI Proxy + + +
+ +
Loading globe...
+ + + diff --git a/examples/map-server/package.json b/examples/map-server/package.json new file mode 100644 index 0000000..2385f50 --- /dev/null +++ b/examples/map-server/package.json @@ -0,0 +1,46 @@ +{ + "name": "@modelcontextprotocol/server-map", + "version": "0.1.0", + "type": "module", + "description": "MCP App Server example with CesiumJS 3D globe and geocoding", + "repository": { + "type": "git", + "url": "https://github.com/modelcontextprotocol/ext-apps", + "directory": "examples/map-server" + }, + "license": "MIT", + "main": "server.ts", + "files": [ + "server.ts", + "server-utils.ts", + "dist" + ], + "scripts": { + "build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build", + "watch": "cross-env INPUT=mcp-app.html vite build --watch", + "serve:http": "bun server.ts", + "serve:stdio": "bun server.ts --stdio", + "start": "npm run start:http", + "start:http": "cross-env NODE_ENV=development npm run build && npm run serve:http", + "start:stdio": "cross-env NODE_ENV=development npm run build && npm run serve:stdio", + "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve:http'", + "prepublishOnly": "npm run build" + }, + "dependencies": { + "@modelcontextprotocol/ext-apps": "^0.3.1", + "@modelcontextprotocol/sdk": "^1.24.0", + "zod": "^4.1.13" + }, + "devDependencies": { + "@types/cors": "^2.8.19", + "@types/express": "^5.0.0", + "@types/node": "^22.0.0", + "concurrently": "^9.2.1", + "cors": "^2.8.5", + "cross-env": "^10.1.0", + "express": "^5.1.0", + "typescript": "^5.9.3", + "vite": "^6.0.0", + "vite-plugin-singlefile": "^2.3.0" + } +} diff --git a/examples/map-server/server-utils.ts b/examples/map-server/server-utils.ts new file mode 100644 index 0000000..c700c81 --- /dev/null +++ b/examples/map-server/server-utils.ts @@ -0,0 +1,68 @@ +/** + * Shared utilities for running MCP servers with Streamable HTTP transport. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +export interface ServerOptions { + port: number; + name?: string; +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + * @param options - Server configuration options. + */ +export async function startServer( + createServer: () => McpServer, + options: ServerOptions, +): Promise { + const { port, name = "MCP Server" } = options; + + const app = createMcpExpressApp({ host: "0.0.0.0" }); + app.use(cors()); + + app.all("/mcp", async (req: Request, res: Response) => { + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const httpServer = app.listen(port, () => { + console.log(`${name} listening on http://localhost:${port}/mcp`); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} diff --git a/examples/map-server/server.ts b/examples/map-server/server.ts new file mode 100644 index 0000000..b36db93 --- /dev/null +++ b/examples/map-server/server.ts @@ -0,0 +1,268 @@ +/** + * CesiumJS Map MCP Server + * + * Provides tools for: + * - geocode: Search for places using OpenStreetMap Nominatim + * - show-map: Display an interactive 3D globe at a given location + */ +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import type { + CallToolResult, + ReadResourceResult, +} from "@modelcontextprotocol/sdk/types.js"; +import fs from "node:fs/promises"; +import path from "node:path"; +import { z } from "zod"; +import { + registerAppTool, + registerAppResource, + RESOURCE_MIME_TYPE, + RESOURCE_URI_META_KEY, +} from "@modelcontextprotocol/ext-apps/server"; +import { startServer } from "./server-utils.js"; + +const DIST_DIR = path.join(import.meta.dirname, "dist"); +const RESOURCE_URI = "ui://cesium-map/mcp-app.html"; + +// Nominatim API response type +interface NominatimResult { + place_id: number; + licence: string; + osm_type: string; + osm_id: number; + lat: string; + lon: string; + display_name: string; + boundingbox: [string, string, string, string]; // [south, north, west, east] + class: string; + type: string; + importance: number; +} + +// Rate limiting for Nominatim (1 request per second per their usage policy) +let lastNominatimRequest = 0; +const NOMINATIM_RATE_LIMIT_MS = 1100; // 1.1 seconds to be safe + +/** + * Query Nominatim geocoding API with rate limiting + */ +async function geocodeWithNominatim(query: string): Promise { + // Respect rate limit + const now = Date.now(); + const timeSinceLastRequest = now - lastNominatimRequest; + if (timeSinceLastRequest < NOMINATIM_RATE_LIMIT_MS) { + await new Promise((resolve) => + setTimeout(resolve, NOMINATIM_RATE_LIMIT_MS - timeSinceLastRequest), + ); + } + lastNominatimRequest = Date.now(); + + const params = new URLSearchParams({ + q: query, + format: "json", + limit: "5", + }); + + const response = await fetch( + `https://nominatim.openstreetmap.org/search?${params}`, + { + headers: { + "User-Agent": + "MCP-CesiumMap-Example/1.0 (https://github.com/modelcontextprotocol)", + }, + }, + ); + + if (!response.ok) { + throw new Error( + `Nominatim API error: ${response.status} ${response.statusText}`, + ); + } + + return response.json(); +} + +/** + * Creates a new MCP server instance with tools and resources registered. + * Each HTTP session needs its own server instance because McpServer only supports one transport. + */ +export function createServer(): McpServer { + const server = new McpServer({ + name: "CesiumJS Map Server", + version: "1.0.0", + }); + + // CSP configuration for external tile sources + const cspMeta = { + ui: { + csp: { + // Allow fetching tiles from OSM (tiles + geocoding) and Cesium assets + connectDomains: [ + "https://*.openstreetmap.org", // OSM tiles + Nominatim geocoding + "https://cesium.com", + "https://*.cesium.com", + ], + // Allow loading tile images, scripts, and Cesium CDN resources + resourceDomains: [ + "https://*.openstreetmap.org", // OSM map tiles (covers tile.openstreetmap.org) + "https://cesium.com", + "https://*.cesium.com", + ], + }, + }, + }; + + // Register the CesiumJS map resource with CSP for external tile sources + registerAppResource( + server, + RESOURCE_URI, + RESOURCE_URI, + { mimeType: RESOURCE_MIME_TYPE }, + async (): Promise => { + const html = await fs.readFile( + path.join(DIST_DIR, "mcp-app.html"), + "utf-8", + ); + return { + contents: [ + // _meta must be on the content item, not the resource metadata + { + uri: RESOURCE_URI, + mimeType: RESOURCE_MIME_TYPE, + text: html, + _meta: cspMeta, + }, + ], + }; + }, + ); + + // show-map tool - displays the CesiumJS globe + // Default bounding box: London area + registerAppTool( + server, + "show-map", + { + title: "Show Map", + description: + "Display an interactive world map zoomed to a specific bounding box. Use the GeoCode tool to find the bounding box of a location.", + inputSchema: { + west: z + .number() + .optional() + .default(-0.5) + .describe("Western longitude (-180 to 180)"), + south: z + .number() + .optional() + .default(51.3) + .describe("Southern latitude (-90 to 90)"), + east: z + .number() + .optional() + .default(0.3) + .describe("Eastern longitude (-180 to 180)"), + north: z + .number() + .optional() + .default(51.7) + .describe("Northern latitude (-90 to 90)"), + label: z + .string() + .optional() + .describe("Optional label to display on the map"), + }, + _meta: { [RESOURCE_URI_META_KEY]: RESOURCE_URI }, + }, + async ({ west, south, east, north, label }): Promise => ({ + content: [ + { + type: "text", + text: `Displaying globe at: W:${west.toFixed(4)}, S:${south.toFixed(4)}, E:${east.toFixed(4)}, N:${north.toFixed(4)}${label ? ` (${label})` : ""}`, + }, + ], + }), + ); + + // geocode tool - searches for places using Nominatim (no UI) + server.registerTool( + "geocode", + { + title: "Geocode", + description: + "Search for places using OpenStreetMap. Returns coordinates and bounding boxes for up to 5 matches.", + inputSchema: { + query: z + .string() + .describe( + "Place name or address to search for (e.g., 'Paris', 'Golden Gate Bridge', '1600 Pennsylvania Ave')", + ), + }, + }, + async ({ query }): Promise => { + try { + const results = await geocodeWithNominatim(query); + + if (results.length === 0) { + return { + content: [ + { type: "text", text: `No results found for "${query}"` }, + ], + }; + } + + const formattedResults = results.map((r) => ({ + displayName: r.display_name, + lat: parseFloat(r.lat), + lon: parseFloat(r.lon), + boundingBox: { + south: parseFloat(r.boundingbox[0]), + north: parseFloat(r.boundingbox[1]), + west: parseFloat(r.boundingbox[2]), + east: parseFloat(r.boundingbox[3]), + }, + type: r.type, + importance: r.importance, + })); + + const textContent = formattedResults + .map( + (r, i) => + `${i + 1}. ${r.displayName}\n Coordinates: ${r.lat.toFixed(6)}, ${r.lon.toFixed(6)}\n Bounding box: W:${r.boundingBox.west.toFixed(4)}, S:${r.boundingBox.south.toFixed(4)}, E:${r.boundingBox.east.toFixed(4)}, N:${r.boundingBox.north.toFixed(4)}`, + ) + .join("\n\n"); + + return { + content: [{ type: "text", text: textContent }], + }; + } catch (error) { + return { + content: [ + { + type: "text", + text: `Geocoding error: ${error instanceof Error ? error.message : String(error)}`, + }, + ], + isError: true, + }; + } + }, + ); + + return server; +} + +async function main() { + if (process.argv.includes("--stdio")) { + await createServer().connect(new StdioServerTransport()); + } else { + const port = parseInt(process.env.PORT ?? "3001", 10); + await startServer(createServer, { port, name: "CesiumJS Map Server" }); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/examples/map-server/src/mcp-app.ts b/examples/map-server/src/mcp-app.ts new file mode 100644 index 0000000..b78aee7 --- /dev/null +++ b/examples/map-server/src/mcp-app.ts @@ -0,0 +1,843 @@ +/** + * CesiumJS Globe MCP App + * + * Displays a 3D globe using CesiumJS with OpenStreetMap tiles. + * Receives initial bounding box from the show-map tool and exposes + * a navigate-to tool for the host to control navigation. + */ +import { App } from "@modelcontextprotocol/ext-apps"; +import { z } from "zod"; + +// TypeScript declaration for Cesium loaded from CDN +// eslint-disable-next-line @typescript-eslint/no-explicit-any +declare let Cesium: any; + +const CESIUM_VERSION = "1.123"; +const CESIUM_BASE_URL = `https://cesium.com/downloads/cesiumjs/releases/${CESIUM_VERSION}/Build/Cesium`; + +/** + * Dynamically load CesiumJS from CDN + * This is necessary because external + + + diff --git a/examples/map-server/tsconfig.json b/examples/map-server/tsconfig.json new file mode 100644 index 0000000..535267b --- /dev/null +++ b/examples/map-server/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "verbatimModuleSyntax": true, + "noEmit": true, + "strict": true, + "skipLibCheck": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src", "server.ts"] +} diff --git a/examples/map-server/vite.config.ts b/examples/map-server/vite.config.ts new file mode 100644 index 0000000..005ecaf --- /dev/null +++ b/examples/map-server/vite.config.ts @@ -0,0 +1,23 @@ +import { defineConfig } from "vite"; +import { viteSingleFile } from "vite-plugin-singlefile"; + +const INPUT = process.env.INPUT; +if (!INPUT) { + throw new Error("INPUT environment variable is not set"); +} + +const isDevelopment = process.env.NODE_ENV === "development"; + +export default defineConfig({ + plugins: [viteSingleFile()], + build: { + sourcemap: isDevelopment ? "inline" : undefined, + cssMinify: !isDevelopment, + minify: !isDevelopment, + rollupOptions: { + input: INPUT, + }, + outDir: "dist", + emptyOutDir: false, + }, +}); diff --git a/package-lock.json b/package-lock.json index 115e415..8b74a9e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -96,8 +96,6 @@ }, "examples/basic-host/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -137,8 +135,6 @@ }, "examples/basic-server-preact/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -181,8 +177,6 @@ }, "examples/basic-server-react/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -222,8 +216,6 @@ }, "examples/basic-server-solid/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -263,8 +255,6 @@ }, "examples/basic-server-svelte/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -302,8 +292,6 @@ }, "examples/basic-server-vanillajs/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -343,8 +331,6 @@ }, "examples/basic-server-vue/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -383,8 +369,6 @@ }, "examples/budget-allocator-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -427,8 +411,6 @@ }, "examples/cohort-heatmap-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -467,8 +449,6 @@ }, "examples/customer-segmentation-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -508,8 +488,6 @@ }, "examples/integration-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -523,6 +501,43 @@ "dev": true, "license": "MIT" }, + "examples/map-server": { + "name": "@modelcontextprotocol/server-map", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "@modelcontextprotocol/ext-apps": "^0.3.1", + "@modelcontextprotocol/sdk": "^1.24.0", + "zod": "^4.1.13" + }, + "devDependencies": { + "@types/cors": "^2.8.19", + "@types/express": "^5.0.0", + "@types/node": "^22.0.0", + "concurrently": "^9.2.1", + "cors": "^2.8.5", + "cross-env": "^10.1.0", + "express": "^5.1.0", + "typescript": "^5.9.3", + "vite": "^6.0.0", + "vite-plugin-singlefile": "^2.3.0" + } + }, + "examples/map-server/node_modules/@types/node": { + "version": "22.19.1", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "examples/map-server/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "examples/scenario-modeler-server": { "name": "@modelcontextprotocol/server-scenario-modeler", "version": "0.1.0", @@ -553,8 +568,6 @@ }, "examples/scenario-modeler-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -593,8 +606,6 @@ }, "examples/sheet-music-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -634,8 +645,6 @@ }, "examples/system-monitor-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -680,8 +689,6 @@ }, "examples/threejs-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -719,8 +726,6 @@ }, "examples/video-resource-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -760,8 +765,6 @@ }, "examples/wiki-explorer-server/node_modules/@types/node": { "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -1777,6 +1780,10 @@ "resolved": "examples/customer-segmentation-server", "link": true }, + "node_modules/@modelcontextprotocol/server-map": { + "resolved": "examples/map-server", + "link": true + }, "node_modules/@modelcontextprotocol/server-scenario-modeler": { "resolved": "examples/scenario-modeler-server", "link": true diff --git a/tests/e2e/servers.spec.ts b/tests/e2e/servers.spec.ts index e554bc3..7c7099c 100644 --- a/tests/e2e/servers.spec.ts +++ b/tests/e2e/servers.spec.ts @@ -13,6 +13,7 @@ const DYNAMIC_MASKS: Record = { "basic-vue": ["#server-time"], // Server time display "cohort-heatmap": ['[class*="heatmapWrapper"]'], // Heatmap grid (random data) "customer-segmentation": [".chart-container"], // Scatter plot (random data) + // Note: map-server uses SLOW_SERVERS timeout instead of masking to wait for tiles "system-monitor": [ ".chart-container", // CPU chart (highly dynamic) "#status-text", // Current timestamp @@ -25,6 +26,12 @@ const DYNAMIC_MASKS: Record = { "wiki-explorer": ["#graph"], // Force-directed graph (dynamic layout) }; +// Servers that need extra stabilization time (e.g., for tile loading, WebGL init) +const SLOW_SERVERS: Record = { + "map-server": 5000, // CesiumJS needs time for tiles to load + threejs: 2000, // Three.js WebGL initialization +}; + // Server configurations (key is used for screenshot filenames, name is the MCP server name) const SERVERS = [ { key: "integration", name: "Integration Test Server" }, @@ -37,6 +44,7 @@ const SERVERS = [ { key: "budget-allocator", name: "Budget Allocator Server" }, { key: "cohort-heatmap", name: "Cohort Heatmap Server" }, { key: "customer-segmentation", name: "Customer Segmentation Server" }, + { key: "map-server", name: "CesiumJS Map Server" }, { key: "scenario-modeler", name: "SaaS Scenario Modeler" }, { key: "sheet-music", name: "Sheet Music Server" }, { key: "system-monitor", name: "System Monitor Server" }, @@ -121,7 +129,10 @@ SERVERS.forEach((server) => { test("screenshot matches golden", async ({ page }) => { await loadServer(page, server.name); - await page.waitForTimeout(500); // Brief stabilization + + // Some servers (WebGL, tile-based) need extra stabilization time + const stabilizationMs = SLOW_SERVERS[server.key] ?? 500; + await page.waitForTimeout(stabilizationMs); // Get mask locators for dynamic content (timestamps, charts, etc.) const mask = getMaskLocators(page, server.key); diff --git a/tests/e2e/servers.spec.ts-snapshots/map-server.png b/tests/e2e/servers.spec.ts-snapshots/map-server.png new file mode 100644 index 0000000000000000000000000000000000000000..d53de01e8477dcc6dba8a7263f558ce7233cc6e2 GIT binary patch literal 395717 zcmd?QRa6|ow=X<6!QCYxXmEE8!6mqRaCaZvf(3W?z@WipaDuzLyW8NG-2XjmoprwN z`M%tj?wOkI>FVmPUHd0H;=6(*DiRSA002OhmJ(M60N~y~LQfz zTZy0QiAaJz)5=f;LD?ckbBV$Q%6*WQGOcVr^BHg3uV1^bsvigGBo$Wt`a(4L>g;^H zQg^@TeOf=aX72lT|F&*VU!-Z8q^7R*-#5OXjL|RU6}3bEeRHB^hzqFv|1=u?Uu!gn z?);{7E9XL5T!qK)SSY@rr~f`w{~5Wvs$PHz zlv$3|vC1AGNT`w`hyH(D?@8l_e~mdt&2QD*|M`=*x+a|e|5J_LSdsaq%co{q)I~np zFp^ugBom z;|%V_hL<|wr#kbsU?oWOIwX2DW1>g+nqAm=Pu?>9bUVj9wFSUJ`J}dzqm0TEe5WU>l zzuoQ08xg$jD8BBbaifOytUqL}FSeDbm%sEXKKH&i!3V9stgf%NmFZW#L1Nz^Y23F@ zFY8b3>&tCrlNQelu`dhnOyUnSdu;=Qw;*9i&}arVH8t=?((h&@V{UHl^#c9P;ktNmaFF~V zj=U>!c6L_yu|RmK&C<&1D9jHMHr{4wYP$R0l~`{3^z7_c@N3oE@kmB;O3K^&ZTz?{ zPD@K8f6OE2yDly&DiVH~7G7<$baT5ywfE>rX}5HAyd*vM7}%3{c6P4vdpUmpJ0qjb ztaG3JJ^AbF>niWn@zTfM92Dj~M%Pj(M z1L6I^g&LD{ulZIk`=tikWov_{C3bs0ubTsd=RO0QwLiX3ck^v~oF0xlf8)T4pEB+dWw(4~Z%HTd-sy_}Tw&S@j4nja* zb6d83Z(3`Anymufrg00tLbm;GHT>#5r{VB*FWTRqhxyvgf=O)qzTo*{o8@@6;QF=T z`unRAEA)8az5cW|n!(g|(XG*br1pN`-_Nma=f3C5ZHM`hOkTV62A+HJ=)%tzPwQ{5 z?+123wlvzda5K0!%V8UjUSFOr>D0jK_YFlKuZkbInm=mJ zws2qf<>q(q&p9#{i3vhA|Ig(GpHAKfbNsm+ZQYjN{p@}AH9zcSY@Yd!IcHyk-e*9^ zc}{~GU0R`1T#;c~9fg`45?=%cBxkcq4B9gWzHMCzL^qeNOhP^=DkZ7KJmj6N;+{Ey ziKZbY9nh|l7F8SbOY5(AS1^{{YKGHxR25k)4B0G*fm}LmYs9=srpxx^qgtMOPfqei z`$bvVEm{F-3Z8K(j3TW`i zfCokxucO+&m2+sJWqdW_f*2ld%MCKbdc%M-hd2))1qod=p$$f*rCUr6K_~JuFirHjM&sfmgdvR^MCHQ5( z2`IO7s_*2_?R)|*#gYiQ_;^|Z-OQYv^7X5nW8x;~%M&+>*AqL8IVNx+8&gVN_Fm;j z4CNtTosP+PS;IaVK8CWr*ncqk_Sx;=Q*x1yaVRH^=7iLl=O4}E*73!jl8k0hDZ=f_ zo@JqWEUU}>jJl=tAhs_%qB@TlPm^7T!!Kr16@I4p1a_HX0&gAIqsgb4xUh#Jjk0D^ z&upV6?s08hkS)KDtthFd)R>)yGe7P)&af+Tk!L_V!{*UpJ8M21Fg5MWGp`En9;*dA zdc>n@7%%op%y_EQqf|AIX{Ef_3@L3=ZmlVTP)I7eX2NJiRHYh3JA+Ne!&3k>e^v?@ z>m+vUuG8&sI4TJ6vULxGE^v|cz7CX-$)FV|;GhBwLPFI6@US8y>iv{ZLOM`C z_~7s{LEYPkhGCc-ZpcdGdj6jWYDjWv8J22{#{>9l7O(UG1{Hg74h83UB(#XtLrBNT zyXI^?eAy`*cY`RS8zR{PJy5~5h^PRr4Ox=EUHRYIhmg})o-wq))#=GXcsm*JnZ^uu zTpVxVk&nJu04gM2o=Um4WhXI%W>=l$w9MP!Z&ns2C<88r$s4@NCxrhRBvbt5E)` z&TJ$u+h;=#uC@~?HNtTpV%3|Qc#O6ISXn`#tVGBe-_zJW##)Yi4ldjrs%@JmCgbmb zOni;y$Y5N*u4+2SUu@?6SWo+NZf-uGM*@4#d~e0<>#Tq}G<7G%^EOgzzjeZhtCJC_ zj+SENt$OQfYGy@9_SToNI?32&7ro43s|60EwH}l*B>iq8;YpR9bfIj&7IcLrqC#8 zGSoN9eVE@p*ggAwR8{6d8I&#r_*L4&@l#!0bULGT0@v=Cr2Mb5)yh{EA&WB1REd74(z-L&brld;kLqxF%{)kNO z;8)g5-OYIi+M7?20?86S96!92>5Qah4}cAcr?ig@^7elWCN=3#CB7GDwV^1GD1H_j z&J>d34m3Wfu_z=u(99r8F8&gui8D!agr*RRNm%T}xc3q@@QwE|DGR@+(_|_v+ky0G zFaMWiHo9?~tQ@rff@PFVq?-Do3USBbqjYG_b~`2+2EGE<-PoUJ`DwFAF1Jb$bmxCo z4_`H%9 zj$qw6!#`cX08k*55&54dhEP*CLn#fNX?I<;ol&G zieA8KSD?^Egv(Ng$ftWEkDfBfk+*F4=EU2Iu#KYXBge-#Z{EOffYuxq* zrTPoONh0c_5A3>PKWSLc2bep~$O;R8WXWq)d$mA7*g)5CQ`hWsJs4Avh2-l9czbm#w4^MM(Qo0lC2ya0ztOui(7xxMD&YUD0#*8v`TAJs48=XFi*yfS zM0L_VnwD-z$7X0zfpD#`*SP{ZOd0G&gw*wHOtQ(roIzG6US z-&k%L<3(#H-WRnI_(r+lG(?+nGyG&YaVnM0M~X-)NWXRvi=b#UiO2Tg}6WtJ8nm8W)v|y17 z^<2t?1w|Lo#95!h5w=NuWjW*O%9%wvIuQi z=;%&Y`{P{uK;I^>JdW}b6eM-=bs1Cv%kPEh>FG<2=R?~xcxYq-wN37}W@dI24$c>+ zX0UYKYAEnQvq?$sp?bYblH3IDBPYVL&ma}P@Y`?Sg06#wt?u^wRd8Evt;2Kg9VxPo zJHytJCHjr5@SG)O>fHhX16q2cU>C9N+L*YPZU_vk2DW;CN=&{M z$LmFBZ~$k$8oX=7>qIc!W47b;D1<$ZjAt_x7yY4HGSiA9e#OWx`oXnNfkq@69CV1` zv3cM8z#%N!TX8@MyCDTOob|Hvr?Z^GJcYw? zH~xfba&&oahB6*>2Z|(lQJq+2_Ejhz)e{;Rw*?wMb&n+G)2gTgSFY!UBHbzg^LDdQ z`2`JzeC^Nzg2G~7Q{83dy5ccZ)0OLF^JfJY$dqD-IZ0YJy#NQ~w%y!O^?SG5i&kJsMF0 z*yTC15*9u1Rg!LS$E21AL$icvFvXlE(;vCn&&pt#d54@AtEl|Z9QmA*Uj@Z!A!?5e zPR3yyboHRcY?8q)?fvpIN>lqL#ECamXjmx?Fay;KO(em*xiuxeR|c@@wBmpZA{rJe zwwyb?sZ&ahWh;6@1`tG>H9wAO_w|9hxKBt_1p?kDy*1m%g z`zP&?{Kz|-<%XWi6Iw#x;Tl4R%NvxS5-aRsCF62s%kxmbICk#Yb|L{X7?YsmSr zJ~-@fZ((fC_PS%Ak&zKStbk#7pJu;NZbaTwf1$Fh1(Y8nL&4#ky4!A%cq55NJEOhT zs;Ri?d`2+sl%Ono*d?OBA=cF@A^0=IPQJXFDPUaMSKf|D)kxWT6gfXeC!vYn150TL zP-;g#NN1Q!yo?jt2DRa$U-`kH_yW)(=tBEvC|sNda55EV8wq{x_{?B#8SMG@XSf*$ z7uDzFeptIQR6M0tysnk2*U+3V`ILTqWuv?vCS({@vd?b4lDts0Ut{h?{|LcaS%v%_kD;&-_ahU+3%)o`@nkHAbm#qZh$(d#qVO$n~ayuO7| ze9W}oD-9m{;T0Q8ha&n29#Kg0;r1;3@V8rqF%yoo>2>3OBE^99P{yKARM3g`fQ7LD zU>8gzLnA_*;A*Wl=iU_(K*R0MZQYor`g9e0A9+3#AK-JcP&40gSMR>&xxdG~ewEz# zd{p&%#QeI&TzhQ-zSRNWLbhZ5?%nu2lWoPSKNfe9Y@(*o%HMfv5}!1qOMdfPtMXE)N%d0DbGrTr*0 z<@9Qiy`Gfc&8Cg%C#CcpZA-(3qJAAf^ZOz%ty~eCv{sW=Odsn(D|ESHEcUlFDKbZz z1}hYtyxbs}IOmE90TwK-vUC5?JR2Qq+Y}GH0fbh`fZi`K*iuG0;`%c3Qgk{9f472i ze+L`c-8`lQDt%*c_zs0)gNZ@Ghp6g+$e@c;Ho{Ib1j-K@ADVy@Mg(d%$DnO8$ysnt z(AUgcpa2WhWTGa+6hH}D#V6vt@f2c_A`9XSzoAv@s07UJdUm1UVLMEM9BVvS`U>D- zNS72tU+U*}#ChZcYAq8{y)Sc#QN2E=Xd3A6XvGcRR>;m<=!n>5?;rRK2Sa_sPo%ce zB6Dt|K&gf<>77)HHD$6^@PAEi$&jlp&Hv^j$_geTN(E zIT;ks(IEwAgCWVQ(y@;sIcb3-c!R-ImYSLF>VuEJcI+BU&L2}QzxBh{*0*VGc`dua zXWYr^e#L$LoeZe9zPEE3zPg&SAjm^a5q7t4*Y}3xN#fyac(uPey9t}GJ7@dNM&5BY zj+S7(p?=GQ@7AiW7~mT|e#xt=7UJctGj#*HxupXfjHIsFP;y9EQfq)g(Z;h{`w8qm z18_L)ip`598;N_*Vt|1IPCf8rB z65wvwM0#c40^%N~&%OaIAsI?H;y*1JSoj4T>V%@J9i&jlAa{c_6?fsD=2DOkSW2J`2*i?c|Q1~-Jp$)j|GuGV%X7bihsZ~||l zDq|ujfDB`SJ%M5j5zBlE60KS3yb0yMse1jvKt=TfHANfj15awUt<(2sa;{UN;PF6t z4x9PCpeBEOn!z2baT&H&J^X-j_D1^hlZunN0d?qsbbetgt9>8^69a?5+rxO6ucu$C6_v|5?+v>pO4l_Z<6%i8wmbB)kvb>$(|&KWD{xH*1vh_Ph^%$N+o# z`o7Qrw`hQnFh7Emd%^paARr*tZ#$a1Th^CL;GKxh)mgjFz6Y%JTt4-ZuDzVOZ@(~C zsqeFM{95y0xk&t{C_FX3znR_V7ZHj+TMf&0-uwLP5C3S@#&sZnso_7B&6hDv*nJV# z*`RGZX8E-rcnfZYCg3r6m|9=CYeet$?s%weHje=s{UgD_mwdzUVs#+HZzF7L->Ebu zO#+ssO_gau=f4MqJJ|q+ojL*aWxr*WdIH;M+03YvQBL_92?;cpRDOqQG(pcW<7Ls| zrWeT zZYIQILu!>L7Iw9dw8Q>D_XHBcnWqoLL4UT78Xv3rK_qSSVVT~7s3B^&{((|8R2kP7&&p#-nl2?ss2;j@0!m>0wp5Wu8+Q+ zG0Fnaz3pCl?1jDP7Bpx(?+PRHTH77ZvS{pK$-G#`*K_G=U|go5DHb(|4gEaP!0&G3 zH;Jsj!Ew~i(N#0WAu9Px(Z9y7k(~(5-DdqY|7BiIaa`!?pdja|dmms-?sKvE@BkW! zC4W1Re49^ty7QfP_tj|CiY%Bc5xRZ|3PbC2gx)}2!ZQhELOn<>j43q|Wx+oj+ZwLC|PyXo3GixP4JHK;BTC&Ym}aih6QMGs6t@$c>?zxjKsG(myx@IMtA(k=iA~=+cT(cc0 z%Y=5^>DO-e28jq^xuKz1qNyK`)GUhYbQ!_XF)-PXqS+6h;k*t_%FG}#!A>a3gi0Xr zW!<`mDkoVXRmf#M%ni%%-^U@7Cj{fTfVQb`#AkEm(!LU^P$Q;k@n%w3BDJjDzD!)+ z%BK-_%4xem90jl@j47iExv&Fx#Hm?cJkuwQ2;`|ir@L&+c{WDF(p$zX1n>c}n3G22K>6{%i5H76dwpTaGN_jjr!a9=*Wn!=WfzR)qnuMe+t?k zQuv^*cZ~_iLv%r$O909FFD{_N>Mp7N9oN8t-}c|0bC|s*BS-kxi&5uqzY5=cwKz@b zxGD0RO%nL0A=9J^y3gKn?=*ss&tLDj`t@&(pK{i{pI|P>tnHg#L-yg{vNC>KI6c6+Ds2{6EG#ig4*_sf8z3U{q*ZW!Unc;@-OX@+}IBG^2*ZE6*M zfUPc4`^BDALb+2w-y*g7LqCg3FWJ29EY2)8S#{1lw`EV}NsbccK_?k2hKy$)f;j>59uo~-dWF?3Lcp9j!;Bzhcu zyZJMlJ66-}g5}ZC)G5kCK9EbM?DTZxm^&@R_F61-vJv0h_KM?}7w|+&c7M=?ai^-B zy>@hEAi`pC7t2D@s$C3CD#TJK-fjEgZ`5%5XW7=UFss$gZLamr=YAE<(s{W*LNuhT z7M7)UuZ1&%1S4A8`93@Hy#2g$s{4c9X?Rp^2rK)QZa-!}1)R4YP6PP@Ha7Ie7dVGe zKsZ}xaVE+EKZ^DAG&^VxmTI5Ru6zv|JF>EyByx-PC-w;oH~;Z+=N5?oyXNBUEn3{d zlE8dcR@z#F>+tilz^iyr0tXBxgX;+tTD*8J&;;*V6r8iAMuKm1E4FIb)*mu5HfFR7 zgXD!XKwnP3sxV&rj-`MP!Ne$v4CHz|jt7@PJ*A4fDHD*)VpDsTBewl15CjAFjmKdl z00B*)+V+^ilrg~rXRv_v3nIr42M6&QZN4GWSUm?`gfe1D9KYPzwkQU|00WQDw5A&U zJxWC1_G0qhNC&PqNYdQ5Fo~l*^ff7Ss!aHl7VqoRz6 zpDzrVpflU7vuc$qW~fdDN~!+znmf&JWgGRR*?c+i$rF*RPG>ZOwoW$|KL|B9!DY6i za~@{{9e&&Glk$jiX>qka=rTf6CKwc|d~t*O$U3ls5Dc%4b~3WHJ1zI?mEaas5HeWW zKq$C4gyQ{0te^JSFwyB*TsgiCDmo@cW3n+@T6PY|D!}Wy$oOJNdE4FwkrDsSk7o^A z_=UXb@G+Nw>dQS>&)>+vn@U2bFYoF*6z;a}1wziKqyE#< zd_I)_v?6S0uFmBsQa3CBA}#FwuFEU>Jx+(AllKS0?EAjwKjwS`1Wk`H2xz))i>4p# zYb+i&5QN`RW4ZD6(zxLPw+rN5=;xX^4{hH>wQss#^KP_T)y64NTx3VT*^U(k9!%uD zqq7i)i|vhrPFbdASVl>2maUT0=ZUZAUAAD>6&9Di5}{kVOrjuU$spI?2Z))Nh8vC| z94MrLk$td`0CEV_zdTA%@Ooe0;|2Akz43K*{q+(?L{z7$eN&Bj&24Og*-r7=c=#Em z4|_^m*+{9Cth}CQUYy>U(U1c#pqDKQ(d6iZ)o;2ub_VEAa{gKmG1PQ)Wf%Y+?(W~Y zW^`tJvlMcFB%-_GmEp@N@YE5>dt>@s>U9~B3t1@~$3iAoramfGxzy~zs=8fbg6yXiY7tOXn&pgRo}+g+GKoc5CqgIvrV^5|0B1sSvYq*ros-i3^;?8X&F?4-!IW z?He;~jK7mg1HpEd^fijGFamf0=c0B3MWsf0wi(KMPPr3_QOo+(3D$s}?zyD&(uLUM zDQH5yAF8II(5>5_B4YX+NFfSL?dp37?Q2&Szi`sbLztXxss6}*D#g4ba4U;vQX42j zG-DKznBnF|YLM6q$4ur%sWz)(^m#c2o4wHpUD7?p&vXog}6{^d&s5&>mOhpvR}<+rf1boz4fIlJV^7-mmE!N3!Uy} z1`UA8nwTnCD;2>o_QLWpma$3OXk0;&xvD~-_)`H?XUDm1R!&BCX0E2mazEdvk~*y6 z6iI1ttJ}sav+rSCm_(2$Im+FTSNme>eWT3JLu%w6!{Y`Jc0vLU`4JyT9p*GGBg0V- zpJ4VDM(k}zK3vsYk4kXPpago(a9{eyTY&J-LIVg1%7@24mb#=SmqH8hHPw=i7HGDJ zRmw|BMC1gsg=OsOGiAOv=8!7rasRnpp=z!|OVv7>ob|X)gUW`rE;%P z!v^Dz`MrL0rpCq9xaZ?>+!(F`KT!qh6fIn%99YPc zC+gT$V1$W`3x^4zQ3VJ6F-YJ2*GMCdKlbVX;WR@P$1Co)-I!2bV4ZGumElI{=e@73 zXEHy*W_(|IEwW_GtX(rcRFX@o!jx7psvp50AQ!z*HDB=z9(H-AG$kKv0apVX{TK5Y zj{04@t3j+)9aWqC)pW4INR5jvXTRo8Y*7!z#zog%1ltUF?T2jg z4*&=%n1O!R+Wa%u6df9|(f)MSDr%N4u3OA1z;wZIZG+m` zf62`~wGjJy5L;WvC1OE>WP#yRw;8{o|zQ5LUHXGl|*nl;3tTQX<306I+b)OLgWvs+9$H zG;R5()WwDSytn^cAVPk<-_H^uUN; zk(_+n`fAu%y*1`sbo&!gDYAm zE?qe%4&N`O>fjG_>mRjcBY2hrWR04H1Rf6}Zg1CCVzdyLV2a-1mY2VNd~%PKye^}q zHY?+%?T;*+h%6O)z;q&>==^G*oD$WIPTWRy&zOG_--gUnkZw?Ba~H1_$!}2wN;BmH z*%mxtak}KlRrOcDP}eUywod?gt#nlH7bQPH45>Ru>Q}*br}*Qk$C*I?QUY9?U)zpd zW0I?%*%@3VN8m;5;m+*zuF}hEi`lis(ebYZre+Ii^?&G6+ipX35B>0HVu>;lmF?No zzkww$ami3DtsQeNdmP}Vb8=2luWH5IR@@!0XTpzIGtxF*+vD|7;{YTUe>z#IVWY}q zaNK56$mtH)oZ;&Z6~1gUF_f5u9=XqyHfwgPT^YRmALLzjwwiZuJ{ zE2B|r~H{^-C$z`)4(GMMxH0SMCt%~0cP)CsirJ=R%&k4gbFus1|#VIRdr zKl;5h&gY6RGm4w?f1qsk!-StV-yRL#j>E`av`dm0s6R z8?tZrZ?Eg?_rB}*g;KWze$N9?u>otF`~U{n`p9EGkBbd%pC0baVyzJF$xRJC*IDoP zlVAv7@RNt8f4LL=7$i@jKD43|@!*{&^D@ryJX@ zH^S^&U-CTe;`eP#(O*t&$zPRe%=cHkq#KBaKfi1lR`Cdpv|1`9ij{T7#P|A*Q_Lty zqE8L2LtWC-QfLoPeU|`11I8rcr~Ew$Sr92Z>qJlllc95)8Wc@Ex)v~K8B1v+m_(!G z$wZKudjdKK@Ky#1Elj0TlXbGE8^Q?B(VT|qp8*(6)oR^T$w14vWK}IPRAlo`!9l}=YUw+ZEJQ9|tF$rA z0a`>7$6}l!NyT=I9+z?|b$Dvl(ENf2HM4LH4YZ+pYkKBcobNBh{8jCUD0GGhicgSGDB9zf#D;rLP&vxU|JN4n(XG5=a(sh zA7|O5{03KB__0$5T|u$p(l(2oVExwFm0Hugi_Nb&FDLskWI8?YK+zUZ3ZM$uln+qL__`U5T^7+WN@^p8Wsf0)laI zYinx^u!69dr%DO7bp|Nf?O0l*zEbi_#GB8H$7iPGB|SQipZn>=NkApaz5?8w z+t>HK#C>9J-%4-C*KKh&_NtYN?>ahiaP>Xy9h#Jk6?WVBYl2RCd@s?t>yW^+vCn9~ zK*~fW4rm^@3_4Oot*b(V)J&ke$2{z z7a}7N<@gZPRa!T9c;8YkOFuxy>$Z~@^u8mwm2BGA1i@|LGkcY{7od|1Jzh*=BjC@a zcu5EH4-N?IG?ei03D?kWX-If3jc+U9foQbQW5chp=OYJ64vbegu5ry;{vu~@&y7lD zSF*ffRM+vjYpmmsK!&2+<=(cIILV`>ADWmBl; zo79v?>GW#8gwgz@&}j;BCpfE6S|_fUO%Ro(W{gwhwGzT$7f1`AU+O6uoIHwRT+Tk# zex~mNr%PdsV@7wT+3>W~S_?(R_uWGO(NC|bY68lez8zIyQ=JGb@ZNR2FB=6A-^)Jy zoYApP-ds(Charu?U=CU|oXaE)eb3ujjcs|7pO71F`Ca1s1*~`WD?V=+ z*)sb*3{P4T?{~Xy5|fsqrvTF3P0ZV_`N7xx#Fw*xA_C~P>+{!Du(z_EXU_y>6pjxD zVAe3{{(LgI zuIki>_>0X{AGpmtO#%9G-Hi^R%)}(oBmw?9YuW^ zY8q`RUV9Y^AsbCQHO|gfn8=m14FpN-Pc$oCo80QH;O%-iTJc8EjlEa zXhKD0A)@Lg#Yn3ONi7NShIOYvFYo+@jz6_PpRNyq)r1OTf7<+AJeoIiVD(~uVIq?V zEhZMk@j0TXCJwO)9nl-Udi7Y1vdpKn<09?fSl4?wyRi*V*&bADTSJRevGmNG+^h{V z3A#PgPHc~ixU{PWnYav$kv>(nL37MGlCY0zsB0ixI*gxXc{44nR?N0an-A}ZoAdCv z?Py{fmQSKtq5dAA@3r9IaoV|fK55`6Dm2JCLvpb>UXcp*Wr*4_{OFnd?S&x>Im9V~ zRUlx0d~~!D1Oo2W)9d*kHATv}!JWtq2SOZbr1mo#RSu+Q-aV zz>;E+!X@m_+Ows5SZ{x8mSa$u=J%MBjBgGR&P zL@oLYk5Ob1o5$?b^vdCiq!_8gx-}8>au$H=@O7f(SE~f_-yahpR-YZWjJHE4ht$#& z{)p6g^)yYta|!31+FiXa?4?Qs0vC)6TeH~1L9@3N%j3A?Hr^~FqHxQ6a`lr|J6dF@ z64uDp?YC%BPRp)gO&H7Fus0<0Sa-SXf8z`13J=Z%pdU{wt8O2yeMdG?3gjMAe*d2&tp$4(ND=cj4OK&W$k1^U7gDLBnhp{jUIO6UiX#II<| zs>9N5vbb?_b%7;t=S6cY*nJO19HKRkctw{;D(BJ&?AAQ|Oh0X~DCE=~(!BZ4UN6!1 zsEYVmvQ}luI8>-34tv9DN0!RSXYEt`J{Y;6$!&1<38-KR#eTL{{Z7X<6qW0Pny+Tv zG12XXcQ%@j&Q0b{%E>z1VofnDCfmS>_mrRU-R;8@QmXtIjHGo^f+VX#LaA&DY^>M; zYsr^b)y1?59^pKseF8wn4alw4my4g+3g^J$ok6CAIe>Gyf0x_39ikkVwzw_&M}K$Q z&-IVRZHi~8gal-zD&)est$JYpF)Em3L431eKxUsX9z(baQVYMZeUiuf4Bnl?qAmnc* z+lt@2{#7f%oWmgQM7ym2>rUu)Pq2Olw35Ze-j#+Z#!4wF`7`+K{LOp&<-IBjKfGNG zoTPSVs_k<^{!ZxQ^Enf}D3kRz;Ddi&1)Te=d%w)L-RZbx_2^hL(s_+HCDL?ot6)ji z3q;=J6c%4uKuPOjs)uL>Xsa5iC~q{?=4mi>$%Ue5Mkb*ypoJQ_I-crdg$gNX${o=&7H>`}Tgh|k;xR17wStY9u^`ki z{qjKx-dX{Hrm5Uzg>$WoPZ*CO_pwL9TC&v9(U@Mbwu^1{$<=4`DVrRF(nz~E1-m>G z$_-lUvU_(h9DV+fG`15*@*V?xT~;{*wLC)_wyKLY(!;6W|nV_g!xAyC+@GE*{(ti{XjE53RS=Y0O29HY-rF-}2sncNK~2 z?4>)`wdo_^l5rIb4)PH8k9tkluiDntz3qiC6W}f`9mPw1hR93=b>!@PtE|)O6K_3j zMvK{NX<11eqsUHALwcET%~S^gH)FE0PyNyQPKd-Y|8`a5H7qltuWKnoHNjEd4FlR) ziDHZcaD%5+CWe#z^a3{Vkx&T5 zN-91JxW~h)*e#R!(#WNB*lt*yaosF%-<(Oia}n$B-~q`S1)wIy5k?+*K z;o54iAI+?|V`teiqC*3HjvvP5$%IPQv<^vu7ZbVMu-Q53wlQ9ppL2wDb8Kvy4ViNO z2B1l1eJZw`umI4Y;cK7^d;BnRbah)!Jmni8*9-Snnu|P&CTelKJvi##gxh%Q7q|6V zb}|2S#B|R<4+!9Gv^8^eJ(bOQj9m5mC41%c*k_&Y zBE!R6bm*SFPo}Vyavy3`6l}I~h7FN_r`m{Brm-n7Nd8c!B&6>w*xTX2#=#eJO>GBY z%LOD+|4!c{xE55m-@e1~JVVl|n=Oo{cOI~z2)s)0Z^{VRN+4SB zANSc~e^;svv;v5IXJLi6Z})utO%$IJKV4jk-Z3u%Z9Ogz75#`zV10n=zV~@X|0)E1 z-;I)loql&PwkS9^X8uT;$X}k`Ya{K2Z}QLyzp-M!wPALm$VILLmP=-{xPaIv%@6Vp zkc7#6=le1yYLRKIjU%Z|d8-~E) zjF38ZqDtR-+BhxI(^Z-_>y+kjI&(_)>vC5hmXs(Cr4i~7{&IY3gpe$Dwz;b6Pb^$q zT&EAvdruqrNjQA<%13RA+JwQQomV7ayW^w5LQUC-7~Mz-l~;RMpOk*} ziJW8|0%T=H+c%)aY;_|TNf#fm(XxJB^{WE$#X_yR-%H!CY+E2rW;$YOPn%A8pV-M}QCJ_yrmgY04EW(K*c`SIQKe0+S2 zm+O6CyWT+zo#@N~)#j~%;`1*Ptc1JBBGi=ljoAGZzjG4X0pI$Ium)E!&SBqRO+%%noT6Sky z1({oR;vaWlCxp6S2TWIS=k!#8f8BKdnoNZ#hmo6U<<}-IGX2%JTcL9(ENmt~TewkQ z%vR+p8Tz`dt7EC$FFW`Bpin7U+;N5+K#LAC_Ked4c9M=S;qf#~pT>kL9nJNqw+gMI zxTXh;Byf=Rf6Kf{<{Kar;^JM;UK5&5w*oO&!k~D&t|R+$z`nqgVC{;xu9XT4yiQEI z;LH@Av*sFV+hHCK%~U5Pf1diSL%glH zu%_5`IK3^iY;+M^(pE@-0*cU6$K)3JnXsUkwNfvTK1kK*kqqegO=%X`FPqyXHr-0$S$6dL3=c`on%a+gT#*5NF z#>V_msaDE6tdD2;;pPfG*NCBTRV*uh9m%K>G}TrWW|;umY?m9t$bpc9$%417Y>_&- z$PeIuIBklQ3+?Kkt03oTW&fY2^895fb??5idIidfsV zH#Rb?R=3kf^rZ{et9S0c^a*`ObDMLE=91XOYyH?bDfQ=Kx#M(s z;-rq;!bCC365#_1;Cb!7V;*2w5O;l~0VV<`P&U84KBb-I&0F!d$^MXN$X0O zy*F}=j;)4gxNGvywUYE-B4Gk%2lEgo;Tp%MAL_?N=dh0OYWg{>(%;Q zb(b^xR7T3>axwLV2o2-m= zE}G2FtFHsjlcv|pdr(0EHQ~1P3@SnX%B7^ls7;W3*$wnN$M$yDi&7|T_EQOV6q|W> zG3LnKzqjuCkjz0w{+||q)=o)uw8j!F8dlMCS=OzdPEdT%ZzH%md?GxCuSLS!@lW6v zoNbno+D@IPLk4Ihbvh5_{})r|7#>&HuI-6!JB@AIoY-tMvDLV-Z8x^<#Wu$izMuVKSrp zXaXkgwTcUW*R0;B*rF0BJ0UkSDX~>CMVkRkIv5e-y92ih0W;g#HM~;aMT29^w??+w zl-G`F{Fw*CS@jmB<|5R-+W4Q%FG|n-c*(71!L6H1J%V+dN7i?9n8G?EZ?lP%-?sB_ z{o9X6w&iy8E9UW+^$d{KB|nw}aH+=ZNd)n(R{RUy&GjkFz^YA&yUeyaCU51TP-m#& zM!B66NYRY}oK*t1-C=+<)?Qu8TPRkvd8(>cj{XV1o0%9x8T@t_3~6Udk;ar$@9)WF zO#*XRwui<<)g#1_{H>hJVk5I=x65;)^AL}oD*?JVJiNSjHhg;due6+u%G;_GbGyA1 zwN5?crMyNw$V&jZbr;>;`+~A*&LX;$SS2IAQt5Si6$!oHQlFl1_JHbXCrl+A`-8_d zj`zlO;m(qWC!Io=@{)quoWmLnM%Pw(LHgHIOm0@R9XDAHjgt&-3LE^e{a{QVNqkrs z$5Y?H0Lo{h-DyYB_zn|lv_W)y=<96*APx*diK4+iV10XrE+Aoh6t#vTg*6?|kKfCh zn9cbUGtv7j@&V4=<=MXR{`8_0BN4QN%0i|gW;z7}SD(Rgx&Mws`wv(zguXxWUjp85 z#|E+?-9Es21^jKe&rcqot$uz5lPvj~d2d{t?~fbUl0HSP`v1twok6j`BjB(Kyzj%< zT`cFGXJhhL_Jxx)tX~to2}0Xdz414h|JNVMO7y64jh*%=Ut(|CQhD0_mx=47IYe&t zp7e!WZtFQtLSfyO!NgXmMy0!0>M7@zli=xAl#Ae+>Kgh$Wa8qWneEKtqlJc}mTj{p z!ZA+WaackE)3j7^@Y7->Xd9g(9M;=9YA62uj(SIj|Q)c^PZ7foYOBxZmm;+(#|L z(|U2Od1Sd=`NPV>aBd1M!%IY(@w-jM_YrF)!-nAN&&rFr;(~PS7vVVAC%qYnzpa&t zK_pRVc84oM2`aU^(G_*F8L4VVGjpO(xl6|dc-%Q>c_;<9P@h73NbKhaTaN193;p7Yj-r;Hm2AmNVV!l zxtN&p^-Lo)cDBq@@wNI`;_HZBq_=95i$RbWNSnMZD69%WWsej1>~)7yyGhp+N}BQC zrXL`AkqLJn9S|o-QSMs#TnxVs-fGR0A^T2E#l#=kfBRP5*;ah_;+gUY9bEd#i8*Zm z(Czjo8bHh8%DM1(iZ;>-jMO+-RZ!oG_AsLJoEYi0**t7i;CJhlDUM>*J6~w+6Y4Tt z&lld>1mrtftUKbwP>MWSz;_RekdF zO=Uuj_~YZYiPST|2FsVV!B5mi6zrPRzgO;(YZA?sjiNfd>-A&)$u6j&mQQ}I8|vn| z_Kbe*NoL4mo~-Dswvv!olKoe+(3tqSTgu*aC=Q<B64kR|r0lYAu*PUB=O9a7FFyEL%@~?BUZ#(e?n56Uw z3X#btZKTdsv6rfuSanr6RhID9-CIC!Z1ACdU$#5Z=j`V}+&qwtlqcZf&;hZy@H=^E zQPqJPiSh-rP1u<~SE(%Xl+zQNR#qk4(i*M9yUw-_NurQcnrB?pl zdoE6dikuh#fgm&DlOaK*c3Tt|tX2$Ydrb7>miEU6`dYue3Q`mlPb1K; zXzx<&`zZ?_D$hKtFQR(;&h@v)_@q0L+JHNoNAPCut3TM~@uJ!I>)&-`cC>L-B?w=KU2~z!0D*c!s(Lj{5UyGRx*leF zcnOHfX|5F?Y?&f@%?@P1bZQ9}{{krnrWy?h7_Z^%tI%{DI*4ER+jiClx*4k->C+1! z-7#(p1q~23P1FG7(ve=ehI)ZYs0RWGH(6-A*L;bHv#^~dk)1M5I%R7ji&`JmnK`@# zh40xAt|$nl3P^sHIaCBKSM8@1-Jwp)hBZH58b!B~iOwV@-aEUMLUo>l=Lbr{BE&8` z0Zx~{G`ln5e}`_=QMgbHqL__-KSb*{4Jyp6DCXWs!dW44?jZ81wteW(7pf6p_MnP@a%uhF!gp^L?g%nn0s{hxBeiLyYi}-k7{r(>F z^!0{J)B_CT7hA5?r-dBv1O( zb*x*}y@O(ruqqx}97CKNY7?24{2K0PAI^I2lJcGDpm+0pTEZvW$kIcass#WW)Hs(= zabeI`SPOgPXTD|!pD}8|wyTZ4tKix#&zW#;QP~p|*>p{;lsNtFfp=%@(xDGJv1Z7x z*dyB*DF(EEU^8Wsq+EoEOXU%1<#nq;E!!L)B{~SEvyS&TN3CYuLxpnzfNK zh@ZLhZRJ7>u4l(tsKcvW+4U#Qt$qxNN-D5zuD=fhXd)56v^(9-o8^Z|?gh|XaapQ% zP#jfis9Uv?*+5M1Ic+Nwr6s!`i!QWh%H1YXV|42G0NkQN zj|^2dJxvepb|>yq=NJ87KTHLJhsFmLHMnbI$8d*9pLASqAPw2&Osd%I9q4kPQdQK* zdwP2x`YPagiN8dLk$7GI_qCq)8c=tQ_V)&@ zyu2Kox|+a`(q<1B@qHZgHvat=PBgkX1a80v?nO@vZnZf;t$}~~vqXb_!R33|ICk>} zo@zG2tClwK#mHG+zW%BI`;Y^!dw?xpRt0@Z9u?q@$ZN~fUZB_hY&mFx!>BvcX3y?% zIh>Xza~(|jynM}fuMX-iBV5%({hf6MRu1)FKlNVw(|l~4iW0qnJyVwN;DVW`-=-{Z zpmxsxm)k#inD6W8+z7=fSmv|W2<8WHM-CZwwCkkPBwedgBA|GyAt$@6P%Sg z>V1MaZO8YNVU*P#2vf4R(+jGF;DjO8D+uootBQRHT3S79C|}f7jHcsPW~b_xzsA-# z+~g3Y#b6~mp*UY{x{c0?W++AAhCp(ujWx3UK!1>9bRu2#atr1yzbV({a~xrJ7CEXR zLIFu23>bKHn03_^__$9eY{+6 z#k$rgJgBIb5ynBm7I2;)`IZ_NCHh9v+BWUOXx~!joc;i6?W5|hw&g1DGcwu@Ye{5^ zD1;az1<|55t-uhV#qAR0QrWUi9^eoArci?*P1BBrY*I;m?M;u?^>_LDPE?(JzAj&*&R^uKjI^zI zS>ovN5TXd$<)sZVp0U{}15LIAJ%04pDlN;QXYTJ|(YukjUJpQvcGAtnO=1?`>h^G@&4XNV-U?jK|DC%bHXY_#mkx~Z-eNSom>TQv zpW}`whT1(cql%LyybPaO5ms*UZ2R>yC2#hHZzLmOXQ6U^za&H=?&|PIY3Rfni#s=U zc5g?yD`I&0rjbUot&cH`GvfN|;~II^@as5?cA`}Ntt7!8FQKlcU;;H^qm0b;i`clX zlJ^rh%`V_Kr^}S0<`sL0Q$ZqKjlLE4in15)ax>uwZpm&^zWlhxS=gj=R6Re^5H7}Q z`{ukiiskQrw!Zs=&xAi?;C+esHUvaA@7mhh=clfvJsC7qj(a~=36N1Noz?>tOaZwNl<7|-3?l04F=N1FNVB`0-i>saQUnL`-M_2>c1@__vfAu4o z^vqEEIeTh=*2vqNd3T-${C>JlG56p6gSg){@n+q7xB_;-?ya01zb$YYTLQr6;y&F* zVIeX9r*M-!ZRG9QL%FO(0e;Nz?jVN~P_eN%-_PSm#^deWG4BlK&x(B;2pl~*KK{2# z9}K&7`k48?F^(C!w<|W%Aux^g3^Sec!|~}KIwbl~sbV_(&)oR<8%2&>KHuh6n9}{J zWty+k#JBIy$|V7jv(trEd^%k!e?THgVA36#+_5wwmOSCY@)XQ%Hl*%p}EGw=~s8J(cjy zI**q@7D4gWNBV3=Ymq60xb*Gk%La3}DCDLR^fHsD77j#h;_w%_B6-S}0%GLWi1Jb? z3N3Z~NXA`qk*lykYW~vTAf1+)WbTp!Ya#hGSEjlR6U(BZ4SdQRHkBXXoNeijK*;zz zZNJspRtw#lJC61~WCyEKD-Zsey}Ut`3{*wxuPr2*+Pb@+0&a%te;`OP4$Mui)iO}twjr^Is(eCj+yh+0 z944h4Hkv@TmihrCuk>mCb?MB5T`Ik2=wIU@AjjQ>e&#P6bx^ISz5UiYeno5s{CiwScvt@xS6`ej}>FC;U5+&`n3;7vkhe4pUyH&*#UQe zWq5rQxl13hewO(8xkYiOhPG{ax6Y1%@~hZ5%IB$z(B_Gz zp1aYE{Mz@L(~!4e=1(IVsVHBI_HqM*y}$>fxcA$Et?t3QJI{w?7X8>*9Rqh?@9)%A ziaARTCyTab7cHAMjAtMO0~LMxZR+4cWgDksU4L;{N_-%%=^9L!kqN1~C)e8T`XN7I zhAdX5RXTpT(Y$FKAe({iuw?$*e14S@2KBN}^yf;fz%ugWBi*{uyLUwM4O}hSYAd0s zlmN|Po1a9)5zR%ztgpqwk>Xi=y2PPqPmpb11=pe^7YP#PEvHYFqpowo;Ev;zX?$b-Xv02TpV#$dz_YznLgNWMLRNoh__&cOKZH%Q<6^RxD%e}e1o zfN%)wf8a4q&eKW2uM?i@doW=P<%MJN@GtT-zDv#kRCCr&KnLJtzRx%XaI!=TD@med zq6$gAb6$=TIr+VTrIG*8m{xrh|2MF=(C<`|43cnc5|iuBCimr^Nb*bXg%Nq&Ki&tj z+ibjvDdYt5BZe~d5LcdM0Oh!AIZ<3kpsZbvK3H>&Xi>=c6CG38~_x|n9_@tIj8i30>zO_KR9AD&8f>N?> zX-^HaUrsWyWFv-a&nF~7WrpK2*v1i(wW^h%PliU7*j%nb(k)?HUvVb}1fpcGJK%FI zAR=LUQmG-ai>~NwFeCLk1u{ULpsK&aNL9Z2(eJ4yX^k9^xsczMpq=%({W~l>=_=3_ zY4m0ZI^mdLTodM-sIW;x5ue@s#e?>4p)iMdV%&_7WG>|0jQB_U)%ft3v{wB;^%p8Q z*xuzTC^0T7>rK1rEN@kfQJ0n+8a3+3Rvt~=y)6DDn02{t4oit@;y&+WW-(dQWALF8tJyZyJq9F;$~R<$D2cZYZ8VnAt|p=T29! z`x#zTm5^{RLlmLr;Ep!7L#pRSicd*@7M1UZIj(APAF*MSk2Ymhh_G=g{c=rv-E5@) zan)fzRyXB&tOn`6o$J_AzNNX26l<2w9$nFX)qh9S2fvLKp_87#`~aJ@cH`Hf>Sz4T z;Ux~eH&?C7(b#E)5X)m4RIqd9+g6*Wd%;o{f%QN)(;MZ3a?^pqlCOJ#hAE1ieI=kA zI``lsd8`|E7Jijfw*K1>$^LEtDgqBryVnP5`TWp=5?;8#{g-den#K^zyM!*5y~WRX z)>H@Fz||-0E_yh9;u39%!e5tDYnHmY;(LNS|I-EY}!#Of*NyNjK#d%^oMYkgS;HqLm5~7+od?PXGHfvsJX&--aA&2`so!>DO-OxGh4PL@ z=#;x9$<69X)yoaQqU6i>P4LOX)=yiI^!elH^T+y_h^3d@d|Du#2_bJa`an6%X_(T# zzD08q%iF`}zYkze_iINd%L3Y;d9;6mo4|}~u&y+aAxjw%rukL$W9%;*{g?{Kq)>bs zQuOcFzdL`&+`S&LiYvbhDK0Iie&dGS$D4r)-0nfcS2X+pw=Bs1{zFRM5FCI@g*(5M zc7AJ!K4{P=KAsT(w+c7LgM}A^k1h=D`R~ zC4>{Y$`6DbBODX`M*&ejm8bYrx8^!X%%+l7EBC~|7R|!$#ZVf?HAtv(mXRJ9v~-9~ zdk&xGT7>|_d~Hd?A=FyeHjd;Qa22Y5=`5Jm8c_NmlSZ&>%-ueGI)kY@Ji=^Wu858% z1~54X14v+}?M!Vx7jq^?rkbYPkkUN@1q#oJGv?oxvbtFH% zuep&LUKJcT`R$M%?v;T;+pZz*uBe9TqG)onFLpBc&QP@_J}R+ff80K{4?Y>UgjSvo zRre>3`hEjD*>EfaMR(6e*|v^&RWr67eIO!p)p9UMSXY*7;R!;nlZiV=ia>pG3?YeD zi85Ac9Cp4Qcil~cK`+BjvYP)eu(fV3H*gJ+H0bgQGlhgFvW>Z=`;$F@%(cp2`n=l) z;#i<)+RD*eJ26Ct$D#i#k8>-gn$&Y3WPC&z(5T!IFDywcMc^hkk}Li8LqPN$y}tb= zpOFoTN-LQ(V&r^smgb9(6y?8Nz<`0pGiBX4VKTUx_Bg%Je z<_au!L3Tli*+$_dPf1=KdH*8My(3>4JCfaVld2zWHOHF1j&C(r>wt-+`;`2li@3z1 z2I{c3nX60(l{UK>z%>_b4xd^!=IP)^s|;nuOP$?8W~>i|Y>vETZdrm^c?8dWT%?)A zcYR63VpvvuF~iTvG^anyg*7VkktdL8iPr81$!PW^>5~xra z&|_8DCzLERdilD zCyay%d>3knLAtG_DzT3@Ws;3LNAaGq5~tSF-+1Bv(8MCrBvpm>wQOr@0(%J(f?c77 z`Gkf2!-WUtNrk-7k;=erPvI32>+>Nr(b$!Bur!O8!sf3u6s(BzE`T(6*JRH0VK-zm za~0TkUR6CiPs-&B_CAC4&0h1L{ccA-%YQQay#jW%q5ST~AnMup`7-;Z@8hBV@7&)P z(Z7qVe=wH>jCX@r!E;t~lEzPa=Rc&vKEJ_ITV0lGu$OsS@?U)lM1*?*9?n=v-^l~! z0>U-_8Fz%+)UH2rL&esJS00yF!|erjsr{9<$BXcfTr*E3=?{wJ0#|X;PD&**b$J;X zv8V54=y8i1FOGRKN~(xC36RW?8dFQ&`4kakH?eP#cHu~Cv=p1`)U(XJb?<_Oum?fd z)q)(iD+*rGRZf`H)KfSWknXdc7eVisR6i~edz{DQa~^44@?9Mq@XJ#GnFeaCzgV8` zi93v1PqqSv)U;vGXSMr!+o+N=)#XD1>BN%D)y;02ADTij>X-#0m1+>QvY@4zDR>cA ztCa++@)$^DD!p!U)mS$DMg-?09oBt?6eah}5VrfN^-oK_WB`bZt1N6cgY{(|n?3g| zU7=}TyHGl@7sm}|4{a(QdiK>DOB{ikga2d!4C(A@eZY;uN0OZqM}|B_gwNq=AR&d+ z>nTepWVTm0_f#!xAyQSE2F-p4u|RuJ656ZKl%`$uj6JnKXPltiU%3m_l!M}u`$+To z$(<7ZvJhSNu4lB9_LYN(7}kI&7AEB3u&s?t>~RZ{baVt;?&C~Wcz1#^DLu*vi%Ixv zcsqv;0hdf&P(f9#pjI_=CyUTXs|BG^>J(j1wweo5jAp8bC)Wry9SOXcXuRyg4<7j( zyX4=8!HKqWnAe$h3JWaN7j&!FzsX+qi}jL~fbHe&GeD=jBx#mbSg%jbC6T+`F14z0 zuLa>YA^=Vel_CV?qzmDPT|`b6fxE!{qbS{@gJE3;iLxf${*1kjt}2x}uK{gbO)F{O zT$B%|b~#Pi`GW zzrn9BfBNv5)#STvDcMNFCMF$5wLV;&i>TN;^~mcU{4%Xv>|V8|j(8dk(AgR8xAzQl zC`RAMb@RXXJoo!&qY~dBrt|S&y@twK^Jen9Tk^cgwzG5Gl;#$}Y%_wWNPC+B__0M< zIxUR$?ZaXoN2%+ofOc2r0#0UN_1`Xi55O1yDW2W)e?p0WF=jQ;K>tQW<%>d^HDdHCxvHh^IfSf!@>>+JBW;r=d10~IbIjEi5aC(1ZH(7J@1TOq zlK${VLVaSHLn~n(b1k`n$Yts`1r)nt^{k;RD@QRL$PPY}u~cWZ52Jh!6kl^_?oZNc zG4CNlG8h$RlO058IF}n~qUWtpx8gN? z>})qW{YEpM;-=qJ-@KY?+x9>sBSl?+63MUHrKy8ZPwyY4bobeC#!oS0CHbgsy>Y+fuNt#Oh01@o$&sa?z= zdZ5$Zuz0YpV1Ds=+#n|G#<`_J<%Nnv^yJFss+b_?#hO`NTDl=tEPb`-!4Mbr21!+y zb=~)q|DPf$H}ih;#yDd_w;8T1x1X7Z0daRM6hd1D2C{Yi_3nDH$3Cmxx{gd$L~|Id!+MT#T4CRF;Sl7q_ROcXooytd z5|qAKZhO$zSg;k$?X@)-F^tMsYc@5ls+*FEYo15Sr1xlBL;dIhD!Q5eOyo*u`8tE5 zQd3+?KQA3^E%)VXFN_)4x8hK1V@qkLR7ZwuH$?(=!JB?(AK;57oi3CGL00+P3t*s& z4fB^Z?Qg264%%6|Hpv7AR)Z7W%J!y7p38U0-Tz4aeYcogo~GkWR9K3p5tuPLbfr?t zSi;0PNgk)=5EVm!GY+=B6eK+Qfw_B8hePAHIfDpv;f>^-<`HkGnTN4aHRzM{hJr}F z64XujN$VWU%5kHZ=$DGKB=R&MK8H`Ci3A zn>eOcOp}2&u#Kq4Fm4+PPW8pYHSMIZK4%u{?GjAkl*pq)KUc1J+c%pg%Qd1IMfsf?uhe?1GC?Xt*DgxhKNP&g_;61_c`UA-POy<(>&yf6i^C(=gfrf-I#)rWP|;WurW8GQ zfLdrr{8KXEW(GTDgb_Pxxjhc~wPu<9QKZPN3^!ytqRQNoEkaD49OlW&iX+i&Aee~D zf4Mia>oxmB0BR^*&XV_{V{Cf6-y1Gn6d;pEPU*&6Tesxo?$PJj z0S5-L8N7+{NAvm~`aKD$r_t)-V)%|Ek|qRM&c!wnCqYSuI=_Dxe+G4OQ?#4~fjHIL zUskhmHbqf$qv?75Hn1zvVD+FoTCEOQsM);xo+01&XgT%Ov1o(Ne5@Zg}O8MBRT8Z?; zyv?BRib1_8OOthdu8c$dTx%kQL9rEIPF*rOxb!p&h#@nvHa{P6q@2O zT0ThzT?~t(vU>C&bL;vhkwk~BfL#ym2>EQld_I*dYLm>JQ^P61uqXa z^$-j@l}fYzuBlY9Q@BOXk{dB%TR6zT##)JQcReW`%i}C*CDKd|Y7OBH#3X<95Wlgf znCED4+DBkFXKqq;I1DOLLu5W^rN^%?3qjSn(UlsWNM^Lg61bEL5bBrb;}WVOQM}~c zQfIo9J%hxunKaJGTZugEEG3w~soK=M3#_Z}drT$7I!s3Q>g3$6 z$^Q8jxi#rY1GNSPW&cKMX_KVUC@b;{CfclDlaV7ynkl9PnfpdzbY>QbB%u1lxvm!t z)Sk!~{o&Elr=KzIL%g$}J+7sHISI?b1nlw($|9o6jwe{#a`$Z8?nr9+E_1$t?5OFT zo(oS^id!=5a*}K%5Ytci=dd=7sK!j3mQE$^nZxpR#)qYJG4MIGyaU8yJ z-;RzlrbTfiwf5w&w9YHAIht0dX(=3-z6E#@K@I@3)gZhs9m&6ymN8AbJ5-;v#e^J zC)Di>E)tM-A=$YIS;etw}`$k!H<1Y}qVuhvGKPAr69rV*Xrfhv;k7J+s zjDbLG;=fa1p-UNVM-i-4)PTSsgJme<I~eC0|mQJ=PmIm^o}sVGxMR-qbK7YF@I8J9pB?863BWt`=j z!=~ohN_gcmRcV+gevtlwh+Q)nLW^t0b5`95bA;vnG+-uVG^x25$8?HWbDF4gUL#>E z?4Zb@QyG}(kj=s8*xy*4TkJhpb2~~d8^NVv%hJQ2x@wS~{8P-3%S56(Ou-4rau@mw zeeQtC-6#*~LU6`%ringHD+5kDJe-?wu;i$0EGC!o5GVNiFvTsyfiDB&jw@&BR5g=< zHCKG=rf$CLRG}U8P94;8D=}wzrJb4?qf*F%T(yNFRN$1EBv054$H6jN@R-2e&dAj@ zhV5@AA99P-KPul`l!5^o^z`5N+$b7AQ;ga975qK!eX3RUn&#)3>qaTzMz(`{E+#C> z5lf1bRCv-r@9QwBv4QgNbjCSWd%>mtOj`yU*Ub1xy&!s9!E+1hJs10k^fuS9diFYL zmc}O6E%{p3A5n`I&>^HeYD|U)MwWv)9?h-AlJS4+!@0EO(+em`id(FjVoD!>sM!aI z@8G+8YF^x2v>wRtXN_VZs-DFiWc`ehZgn`b~k$mC1 z6l|(JlbFJ>YYkLsNI)lxbJ6oenqwA{V7x5PdhBX#@Of_}!fI^9tu=NC+h7?VL14P# z<;(P=+#kf}f#kAaG--3QnIHLP)kr3)FX={*msq8NRVeG#Ar(r-l+w(0w($j=73N`% z5F9qk{6g?Up(p$UQ;F&-QT=K}4niBYTEQY^NZ9;6a^fDC5{g&=mk}d+rWBqT;F+l- zrX+LTM#YgsR1Cu;w*b6~`*IXDi;UO@l`{&@8XAI(S=wiGPCBE6Szdg^K=fL8qlW47 zOig8i(p-MnYdqk^)6jS^QSRQMAPA>KJoa!)GFTDDojG`qx za%3XXSc7L3dx@P~&#Fn|1QIFa%FU3SeJGsr=S8JjLY#n^Z8c;RgVGNh68~5m5yHf- zB!h@Gv8ohQLXv^%Aw4@I#hE&z^F9h|?BzFzIx#y5|iZ5$cVV zU9GiFjQ4Jc?i=vu0e9O*wc9YZ!qwbY3-jk++(m+EbR4R0?3G~>gr@}>ZqJ9!HB-ku zW7|V9H`!4x1NZqVGCkFro(Tbvqbs3DTUAHuMZxre;R!E1FuqV@2^<6`42<@0zCM%9 z9>T`i-BhnNx9!FCQnpca2EOtY&2%#)Ix3y8ncKNioy9n?tSZDI5$&69);u`tTJEwm zHfDDG){IKfzaZWD&^bCjvt$wrLOxIAFX&qt(^JL2RKe^kuSzdXw{z&v{^pzCTcI7| z0YcCyeIDu!CfnnrM73qe!SGkTL1mx1g7Fj!Su|CCrkQE}du1LPJ=;YD_&3$2R8BD<)Vn!+g7BqSyoYacg(%AFfqiCm@Z zYL^Yof|0{k)ew3Wwc+BYv)*QKA4ip7;lhO<=ktRqx{=FMcnz(mV2@un1}U!ui369G zdf_0_Ab-9EB#%i%$yefT+!Ak6YAZxaFF=iLJarzVZ*VMM)I)f0w^)sJB=2FTBJa!N zvYG21I~8i&1ua@YD4pyobyOkQBR~Qz#j|q=f0S``7X5Jxat;XH1GB^{2qsp&SWF zCxtA7WPo_g_zy3O7~IjP=fQ+gm>OZ_z!50F=uu0vRYb|0GHIEOW$e$6j7BG|s;Q6) z7f)$eu4i;&gzP`ll`&fF7i7V$PW5r{Uom>Yc9Graur=63S}&4b3L=kl5|?=9HY3yGywt?RnoK!`Y}uN zg<1U+sM%VUs>hZ)Lo5~L!vc&}ZKA-PZ7TuatVNK=sqh4P#?vPLKrX~YW|7G9MY`Q> zKn990G-~A%@rjkosYt9G@k*Ia_mEx2)^1k=jw9{$K89-HM#qrp3JhS({p z;Cpb$r@35BsBRDY#6~2EDBf-==v>Wmim(UeThN?kteg3WNqbu$mCIB;3S5aH9O}OHv@GQhxSoAa(2ftxoF+I>q-l`Bj)TxA`&d|o1uS(hWg2*VXrp-%&&XC-}vum zGv5e#nIx7ZP~2+HT_e=U89Ty*w*m`XP}8yP%$Zc=Gv)1$afMR+_$cIy`HH+0&r~~g zZYm|L)FF-7YUzPJ<$$je$O-8Qv-EYz(KF5>@z69wuiLBcwdM$jRMe&PW(keU?U2=V z31#*YL3I=3rQpK$6Ne7Bc=qt`AT)B%2Q5f7`0MyH*qLxLTK32j%=!PQzDGBU|uTP@(C4i z$N_v(+o}&Isu%>iwyDh0<5*Id#l87YZT1OnwTbVk_H~b&2v0;XdisY#f<8j$i^QYP z@fR`=HGkp*NehzZK*CI`phoO&1KOGw5`h{Y=(}3EVrW&V3t+WrS%XA^OwB?YZ5ee1 zPgS~RZ1u=#m$bl~o-B#M@~7Q_NiKszdL>nJ=gh!{I6b#$UYd$`+oWo7Ji|srB0^|f zAp(Rfe(|_*0rf-<`VoCy1N3E#5Y#Dkqv$Ni1bTRg6IcIZ?;@LtG-ZrZvp#WYm!ePL ziVLE#>p(WTC;^)v!zMYv{&)PTd-xen!ISu#`6I-fG^Mic8YL~{%xLftJ$uk_hOK^b za*$r7s-;=2;xfaOttPo#2))FYsWCT2i`MyR(cla7>sTJU*i7!Y`j!g(87@Uyy>Chn zpNjsv@0rC!M{c1WMa%kYRhvF*)&^O|n0}6f<$!Q7KA6eQ&RmYF>Qrt&sp0LPR?Fi) zj8)RR|yX?IAj_iX@0q+`h96YgKW?#li7P|mXw0YZK$IO$`K;G6^oUj zfe9KEt{5UY*Y%;HBU#)w>0k}cMx{_`r64gb67Tps#b=X^*6$Tx-y??mQn@)vn4-Z_ zGcmamv<*9&1HmAPbl4Fkb7$n3cz!@-U52x;F0(Bp{m1TmAU&5f$DD)>v%B5&k{ffp z>N$m6@j*E-j@q(ErUO6l+2)5{{4R-C?kqE!y#dp2?_70odoBUv?0xp4U#J@FaC}gXSpOy%Z)H7FEj@dzZ|zqJ%%*p8AsLSQ`CAh z{>gc2S+*Rw=plWUb-<=>lSqmnZZr9vd!o%)Yz-X+FdAqA(k(7x&s4ZTqJX7vl)E|4 zgyvsA>?vrlG&xsw?>axF^b3I7>WtuE&pIR2K$7pDE7D%A9Cfgh(aSRA7eDzT{4@X4 z232zTYC}4v9Wzh5EW?;w2t_5MF9J!;l+q*1P5Ra1dTDCJ^it&h5Xrat+K?$NaidoV z_Lxxn;j*E;SZ$sF2#tVDnHXmhAI&kI>J+Nt@JU-Yw&tX-3eiH09O5JCodkXgP&`#S zL{F4T;+3Eo;0%f6U)v0fBMn-qt5pMr8pSznrqXxK*rp1#G#mAE8K*-TAtkc-ls5nz zQw4SwA*vkh_I)Rxw?{VR41uo#SG)@?1OVl4$%6Be40qxk5Lpm6;2^%)a5Z~WbK#-( z!AqZqHH5e&5jRZIAeBu8$S|XO?}tG%LZsocUfzSCl4;K&7BVP;|wx2ZJ>vlo;sh0fl16z#uWa3v#pkD0~Eo_1DLj4BJ-4qoOr#b7G!6=8D$7? zyn2*$mVV)M;N<=W2y}7llE5ZKAut5q=zvB#tK&n9eNf%#YQ@UDc@%17=pez<_sKQ` z!0_J?uD!9=7X`E$ZZK~JUwv!^~hC+o+R#7uaz||Q3U06`ZqJ^iGcr4m{ zfyiV(BI*2>mp50-U(F)5gn~-9?z{Ih{Jxm5w=1=SNcWSY7C_n^6PCh_Y zk#hIOVqOW{LcEEovlA4MAgal}@%oZ>ev0brHzo9B`JkU;cL;usB74i6qSH1tz+b76 zA63Y%e6dwxo8q6E?6}0dJMRH~0&d$Cwz}4+<3yPx($ATRrLy!Y3TRPj;lN5npkTQo z5t{5`mrmIpb51EMkX>AqubQha*613VFUYa5HeYRlnB{~8J@3b3IBetXA~@TOpekp@ z);)FD83tYSdYOY7SMW0~L}&n%HG@=_9F*JC@NE`Rmo>LuRD`vIE}BW|zq`i0yK4dF ztICnb$WM0CZVDrmt$k7eWVz*A=B-ko+wK7uri%nCv-(K4KiA4`FKKi{j4$_6Anpsx$zsTg2UV$u9Jl{ApqJFs(ojk{{J0 zWy#WqtL&BV0&T1NG|5|GtwpXv;Sk|8Y~P(Nx6v6eTUO?q(Rc;YsXMx*qSN}b`zW4?UfeyL*Kp0<$V)xEsu+kjMrd5{==%2M+Mq1jzbSz z-dh7vPD$ETLS7Q9-WmrXP-Ax1DMEiEI-v3hZ^UhrR!QU=z}gTp)dkI&y|sRR2VXJE0GZUijs0~6$vq3Vt$v%lTuN1p`J4K!56K>n z9{#X)P4YP5=qw%Pi>lQz|1_GE7{X9+RnH++Qi=OJOQUR|qMHA7nXVGUMH1dET>>Y= z0>TF?H&vGOsYI$py5m*ZApbknxS9l~Xt+v~G6N!lzjv6Wbt=n;jhj3&hpvjY(<&e< ze8^f(V6N6@2u%WwiyDD(&VCQeBm?H2Tg!2QU!9vr)n(95&w{V#K zwsDpNfGORP%+c6Tnb|U$Yf}|FU2j2MuJ7tSY3=7m&TIJGFqcP@^MmCs)x1C(yy}fM z!5d9Dj8fqwZ{+%fz~Y56>0Q0?xm2SwDw8>K#10twD_fsWg8jQ`9;OCudD_J|he&!} z9D=cHbB*R>vQJfI9D^R{kHKUz_l>TN8AgLXT_6|sQCef`|!*Bh}h z+Oys+YQ;+0iQL#H?xPvCjnSZz$>mqqXKo4BMr-Aj1ejk)Q&V&ZgW@Uk*Alc7=Xq`i z&5JnSM?2q-3KhSH^#@8(Hugy@)u4WjW_4II1bQPm-SN*8HPztN4#ls?L^j2TCF(1p zb|`n5vuhgN&E1)?&OFfs0Z4Fo!8PH45xAS4#KK5GZ0MUrYC&hh zZ7oQY@8p5Q*;gH>^^&P(bCv2!#h^t8b`9`g)QfE!m&=*kRDFz>ME=fR;c5LcRjEL{}&-QvJd_>1)jN-I%EvSRbgLURZ9(>CKS)(yoSZGDobXMjbA}VuaN^YHR62U z2b0OJI<8rR?)uz?`!bMnL|RV&s0lMkaR}+GR3aY}%FwBKf?!{Qeq^3zfOIB54PNW) zs39KaOT#MfMl>Jv2zCrd7muP>y`osvY7<k?f%kHYdv!5! z-K1aqNh1!$JXWjlv#)>_&Qk-Ik-)K$K-CuC;oD+25a}ptIJu6Fdn`0PEqz&1lTE+H zsLD-=!*gauvSnx2UvIM)L4S1f!0?}1!RO_Q4?7)t&BLqqjQ-`}_I|BtA1430F~ z+IGiICN?Ivt(jzE+qP|EV%xTDb!^+Voe963_tdGcs;m3|Q`LK~=U!`F*LJ7dv^UhM zJL7cy8NKaF5C!zu8ttJ-YluZaA;z%76kAvT+HD!-L!5v5L*)v!L6Hb^LoMUrH;9By zb=^`!oSyq!CQeg58MIyQyLu6ngAqa}R>g?629sE(98A1zR~+7J$a$iQNJjA!uccCs zDf{&X-U~!A!0nG0rA!1()5D* zX?tT{6zdcQ)`*x~{i|G!O0UWe52fwG{FGAQG)u5M8_281`!= zv8_z|M{%NTTHUxLn`Tr-sgg`~1gWt*?Y~xLYCp1IJt1WaAlVSIz@yoKcFI3`F1Q(g zdqVgsJ5YrL=A_KpRMG3>G5`-kyQhQ7;#xckbD82l5oP6877J|IgnT=>cb+;I2=2uilnb|GdDmDBeN4t&a%rAI;_^=tLR zv%_--juu=MiU3BKTo#juQi-G3#?76@QL%rWQV&h+efIW0$rn=7MO#PgM_mmxWwc4t zF6hfPP(EpmQ7XK6)9Cn=!Q^EQ*VJ$- zUK8)M5WiAPg4v9W4MC_k4f_@d>4*5#%{J&7OaACHfA6liC_Hg`5v|pLt3u0nO|XIL zO;D;NT~zFvI?q+F!GA8UpzF<5G$m)a1Sbh#Nnp+wx0$TkO(WCULe3^?tfTQw4lzwq z5HjN)#~Q~22D@qQ;3)Sa6GW+&+-O00bi7 zz;A!Dp?{^uIr^k*s-RaAdlVCL8WE=C(%!E`A zfnaS1(}cmH>eq9i#w^9h00SN*0t43Tbsx+pd zsdOWq*;oTRJTLEl?DN^3}l zZy^s#YL|Xa&0ut6P>5YZ+=spRJHF5x{WWhG*DB~mgJ41Ylw&ys<}=N}*;$U^NtLT; zF~8>ZPqsJ{Qxzx_CH5Z)S|d*pKXa%Zyr+fR;ne|nUX0w!GSCE>9P-VdJM0%%YEl}=>_bMLW=HUpuILEP#2k=;wuLB~??zbl?y`KXk848pm{!{cl=QAc21{+Or$jLQNLTB_HTc=tIC0y@Oy z9plM_r-L$Gp>MSqSdOM(e7y9D1lS4Ev|V}jZuwX9cB6gWYLoqc=!EYt^KWsC$?;@u ze&uba2uuhQBZVS1`Wsb}1>l;uQUxwM5QC(fKI}JAz^jxsPjeMoYfy5nd!}g_DS}cZ z3~Czex~V`$mCMR&IJBjbbVzAkrk=5!B0;kKH_c%pq&H^e=<_sy zZQtNao^h3Q`iRgdxxRgFg^bIyc2EF zivmG@*p#y2532yHwuQ4l$pDE+=RBn!_Ua;}YF+x&NCntL(vnStFEEK%$LSXPl>{4{!wSSepp#8c1_Z{E$YILM9V?myf)pa`P>)s80+ z*viPud^f^83rRvjie)Gw$C6`icL6+poOF%J3^c|qP2>JMp4D7uk<2Z0F^6gN8ioEe z)#c0j1)&C78H#iFrSX@gstRT4*G*xHe{wViV#hNrXm=;_O1w1dq(WlWa|_Vn3dh9U z%GN<_#r;aT^4Lb5pD{%2)NUH}#6_6;)rCOLqF^|wPLx&-P6GH(TBl&oY3Fw^xE8sW zQbnyKc-dCwPE^I&vRyhSdN9T^Vdci-_N8WT5uBMDmKCPT49U^-dQcrubjF6;E=`DS zF$N6w+5I}n@-v`*W<0I-Aunnh`wyokLzQ?R6u)701Jp%6=dtO$CzyR!YIDg%>6n7K zO;+I4e#|&m(e0{`Ei#!ubj^r`a1kg&%*(*SV&tapAc95ZL>hUjENO62r5sn%qL@Uj zYYnBRoM_h9if2JCe#mN>S zPR16mQcJUf@ zDy`HLX*>_sdPwcr^FUV!jjX+Xm4xZP&gihiwKVjLA&ONMzs{X=egt6xIQPQP2rMF)<#XSe3bgLgid}z=Q%q zC%-CWX%zk}jVNM7#`AXaB(-y&(@wdlb!i5>Ki#K#1}I>~jnc$de=(HrssP?nIU}e{ zXL_W@asHCLgtLL4!TqmnGWf>Dfx#RnhQNK&d=!CQa95B6 zP{f`yPmz>d}{;ll_4`tLUhAfdbX=9S|O@yc=<_IUw?%*C55gHtqiRLQ_g`r{Lj2E&( zE4HgAlUB|$;;L#hJGJ-5+VvT;5|hfy<`kUxB&3Z?8#TeCvNH`EWKs%DHi(x=TDY@H zgw{6IM8R4fQ@PSrk?0KlvOV#)4i%iQQ#$pZyZxEgjqo^fXWz@Fn0;#W0wqkr3XXfw znR8p1dna~*oe^|w5>;3W@E7067?_}@sx&Rj`j6A&|4$o^o2XbgFQ?z6GN25J4*V^h z$Y)f_un$r6S2Qum<2q#UV9yncZ_rR&qHt&016QZIZ&b1}p-q~L<22bRmKgX0*x9fw zWYd*jBEC^cMq46^a7g2pdey;NBKKN{%IIr9Ck-hmlm^LRw_FF9-~?&Bw%FLEO@$n~ zf=(?o^XbpYN$*h8MEFLhJZ#Kekg(-QY?}Qfs~nnVy%zmP3H7Y$D8vGQIRZHez$k7n z{&23o2S*pz3GvDw^~xzs`QS(8A2&cGb~1r89+C)Og6ssLHpxQAOJ;1&wIFkIs@S)xi}aw*giLq}`?5WMc$rX-^4M=tAkN#gPEzT|iTaso z-gpiua4YpmsFNN-5G|+|7_yTWVkTlYkkch%6DXa+=qc{cz%qyW2BkFbe6 zvqI9~bi=vm1ya&dA;ej%)<7#OzR;35S{R!)3xVov>$d3F5Ho08vwsjd_$$C9G4?v71&%q1<0P!hJJHN`v*O zOVc&aBMkdR)aHm+&@616LZ#|uIMUc779FPJ-CH1rBI|gmp#0mV0D;^^U$W- zFqfEUTl)Zx-rNoTLlO|3d(3MPejN%a?;`QwtJ@p3 zvF$=7W3t-65HC`1w}*83aZq4W@gkY&6E3(3So+MB;XIXrtt*yq<;(3R2=tL1DBv*P zMisYeXhM52mujJ7~sV0ai5ssjK`@UeuM>+cnD4%+75E z`+mF@iN*bLWx%Lt@ZY|7-$lMQ7Ni>>R~z3Q{?B+n4(=1y%h^#Pe8yPIsHnhV(25!B z>o;8WjbX#P<=o@1KXy(=&UT&S@S^JFdY3beuxo-t+_1RGYLS;S=pP)lTn@9w7sl{< zR%>=#L`qIAq8$Tk!SkQPfB)JmuAF=lg9t>Kzzh#b7iO`0WXBtlL={YXe_j=#QXFYq zJ{=SSMbUVr{lv<`VS@C_qh@z*B7+gZlBBQdb3wLRA?%pOfk%-2yX;fW0He6<{ zUnEakScl7>R4WiP(X#Tykl5+Kfo~v0lfVel=uiu?s05qKU4&FC4~ReU#He+Z1;oyo z^_IdFxE3+7{?lWR*MyOf$V!wo2R@KGuwHN=GN5i$Ml$mlpGF%uNYiqTZozoWn1z|R z8HY#WfI!7a&dslQ&Xia_DP!}}7tupYiGSi;;)EnJ!$6Dpj)SLW zu%~c9^UApml?E5&XZ~t3Tb*ZmX$FlEhQTE}IQi-A8lhYUOv)np|94VDa1++cbldL* z+S4#C781dbIc^QPm17{&2ECC`kw>XTs8|Fv(Si-DI?njvem)|sBz%KTo*}0=w^(TA zada&nb$vc-F=<+eZ4r%nao0 zWur>oq0)NX{uFZ<29JX=E*z9oNj^wlXO7Ke6gCpJmJfbHt?D z509NCtt|`Y5=`PixS@L7WXJVm<6H-tR38?l}so;<|w0F z(3F;N2pP<|>tdh0pm94EQmrO(o3K8%h1jq>2CwWQog^wE^Xl)9$b9ZzRhDsfm^g5JQE#}AJ6z%$$93o5jq%B< zg3D3;Z6HvPSG*(s$C`>02;lgIJMxu#sX+09D&V_i*+Ig*S!IW%7xcu9Ex_FDk8S}8 z=4TRl$IBgYskn3@w$H>~;kgi7BK!#$CP$aF&>xq?vHLOk>b;-O>wWbKNyF|Jv6MJo zBtgWbm(aUv!IaCd`U64aOz4kUsmq;|rurkijHAIAWJIaQ|K{%Q^ccN*moKeb)>~tB zYFsZ);>yBc@GPoV2NL&`HZgc4#FZUd|FE@-b#R5Fc-?#(wMoUl?E#xMP5uPCQ2MA1 ze>>ts^~(3To8i2Y3?qa7*zcr24ZqWuUdW$u+hk)7$1vdWIgm=QyrhR0=B`-0pgAei zqr%ZOX5tR#76!&Pu z+FkG>5v5sd_9{k81o@H`iMTbW5~R=}$eOvk?|6eO51xo*RF;-|g<8JxTl{-KBm*n4Iq_fN{>_D9o6C{)Woh8FnUdNDQRNX#8{mlw`m1PhIy?42x-1Uq z*&_%jT&e2D%y;CmrC#_oCY9K)pfz$CK9WO*1dQz9R}o0Bee-;O7WoGPKrJ259$s8y zEC2M*Q;_s8E=lGw|C+|!oTMkqo+rz1%70`KKVf&`ly=L8+h+Hs^=rA=^!29iCIZK% z*PH*;X~$qzhpqQG!t&Li&*%HrxlQ|rp4S>8)OF`!@%ba-W!JKf?>wEW%?0xI$I=Jq zYj?{=kSn+AR%6N(n{WRm+=|mqvSnTV>eo`oeuG*0=Sg?QRqH)Ihfas9&+{klw!JHb zPV0UZ$3@2TdIk|Ax8c5C9vhzz z=aqz|SyH@atz3M9K0Nm$e9I}uB?vn{D1&ekLNl!HCr4my&>FX=!+c1YVG2&1fO&1fk{2hbOzoxBv>8Xh ziN0R9nRK{8UFnX1;5+OyagPHK9#>ZYMP#N>fq?SfSKpQ0EaTbhP+ADR+Jd-E?UG+1 z-ZWveayDi~Ol;I*eCA zhXjVm%vDh06dk?Z2rw2(pKN=;%!XZcCQMrzhJ>)qV2PkeuS1kTTV^pPspNBZ+%BO2 zVu|n-%C=?jR+$R_)UL!2#|QSbcg{kQSoq_q6{v@hUYw|N@+JG@fBEOCXCo_zy81Vq z$i9~3S}6)!-S07lf8rx5)%1JfcPu;4Z@BgW;l5oQd&opBX0p`V)Av|5a9O-mPLKF1 z%)tU;%X`7JG%IVcn!IC}NU%5gj_c^7iWT!tUJ~Jze;*P##-)E6$2M7d?{&WaW?QQl z?o&;qtWb`S{>`|n8gDRGPdr&yTqDc4zAp|7tAX%_HmYUxTakJiHcQ>2R3 znXpa8Y#j)Z_HhH^zNt|PAszmjHE(pwa63Lfr{uQr&EuVx+iycb&9Db24Mhp*OY~bZ z1`AIt)w8XGlF?HMVKeAn%wiw7k;T-1f(~1#5&z{V)gzuSMM5m}v1P?8^m8`L+h1V% z2iR%f+%-$=>(YZ+uJ?Z5L9z2iBVC7=;YOPjhi#d8oD`c1yP-&*OPOVqO^`1pzN&bl zwUj;re8-Zk1U45rN9u_?4*L@bgA1Lht3#&EW25S9e8b1ha*bR`4Lbds8l-`pVq`Gs zAetq9%WeY3H9ILFr?4~UJMxC-4#E#7xhUOZ%#VL34(5n$JDs3UxmUP-G(1`16q$6kB*Tx&XL#zdJp?~&yB=h=V*KpLb z_s)Jqm3GHb=bs29p95=-jh$`x;UWIp&6W+j%?$q9kyMTrOH7`ZTcpm*eZtnq=+a6wB^cDYr|b0g{b@|+WwCCX%NI{|&bLg#Yo1{vc&X7v`(C?d{rtN?92VvOoZ`^+ zjoow}miCm*Hs7tzsM+>C?)`UO-SHW`>AHFA-_mocd~FBwzbpXEb?al7$F}UDnx^9W zF?<^TUrXH81TI?H1$s_iPNkgwIV^~Aq*(6!OE1b?65IG+?A8&+%NngLxBA|yvvCLl zA)F-&y-Oi%mWG704J8#yq~#7o9)3JMT%9D2|49=G9c7rqgcD>DjnSC#o_e!ngv_1; znZC@J2`O_>tL8K-dL{YdOJXMP&_k?EOdnv5MwCd>5EOpCAc&~bR;!m>Y*U~ z@`BmOeCprIX6-~xUZ_|XT9~`4SiRr9l+4a9+ ztzN|60rWS=u#5g3Fa=%isT81^k@CF*`Hpzbx?x6oLs4zNqJQf*ZEFhP%6$~OekSDu zN?+o7h}S0H02uzb`ENB84Qz3n>e{u@2PU2uRP@2uP^PH8C>0mYjyU)6&H6Ruii_%8 z))yevPvP+RtYoA&Yg*G8LJkLs8oM*^bdoi7OEFKGQS4B{Ft?3Cu$0jN(;GFYI3)C# zOdbN1v9&4_YAMLcn{75Bk^1yF0gakk>fQ&vVCUyqy?TBTH(oVdTy@rOOPd`GoGuS5 zroZ0Y8G%^z%P@dKhD}cxUZhQ%>y-keYI?j9paW7jzU$i*KBlgheY(+yz}HQ0;Q4tX zk93z}sU&@un}-F8O@vH~=X2LH9UYyqxL{?zv98l?kY<$`|CZ}lx7`U#NM_mr+BfF{Y;{OQnI$SmruoU-`t*Im@5p#V)srp&+qIP-rp! z*H?bZX>NRIE?+oCs%HsdCsPODI;0ET(6b6h-6i!Dp~s-&fK$e7PiNv25f_l2WkCav z6P{&5v%H62%;jSE*-6F-)4-WGjQ{-?b~HT30esge<8*|w8Vp|_9X37ok#N1)TRx)4 zti0{t2NJE$zagY;>6ssi=bF`T%`M)qOPW`m=3kHC=peqf9^+6LU6!Bymn}WYfua`< zACEmx{w*6$YfvuE99w*?wSL29owYy>$Equ0keyULMnk}eX_T+J!^zI)cISCC z?uTa0_E&I>*8$k_dyDMmXRE2L|#7Ot@B|Bc{U*|K=o&UfhdoP~)h(?EW&R zA3t*8Y-*Pz;QA8Pegu3X0R2I72T3IMz>dpqYjPJ$Vjhchq77g)OnFf%?ZgEZmr8Lr z%w$0RZYYq`H%pZ$N*ou&pU5PmL?wv~-oi?qlHVqjsu0& z;g4eeA+T`;LU_bS1D^_!#aQO9n;QL+SxG6y|1n3Ty|33xMez5~X9&`$jh&NyJC9CG zP!CAMOxh6bv%h_W3#7b^({rrh#8Ja;KmPX5&MbgysA;@EV0Hr@;80RaAc~7Mk?4K5 z9FI+p{XV`cD1RMay}};t>CGljQPZxsZyJ*KCtQy2w=_btiJRUUOPIm^RFb}RCt%jD z(avj^@M|}R!0Y5Eyy1`FOP3Cv8fj^n19ixQe?7mR>QqqumNc}r`}K7{&aQhACrvzO zA_zEdcKE)9Ti0FB(v2C}$5oY8m*0#d^lk61j&-m)uW4`H_Wgdst$JsI;fv>BOl>Fm zj>RjN4$&Bbwzq6gL;~JM%jN1_yT)%+6Tq0%dUMXEg^}Q+*UsAc@*4oTt?hM7=9fv- z^=-79eHpg+31pO+HDhnF-qx{Q0QkWK_Yp$QKp}2d&G-M5c5{u|kQLVFN>;8AXVDgq z3*TE*UO5mLq3Y~m3{cmYk+9@dJoZ_6s3y7%qmYVsVP}18}qG zb4FJO9dmk(B<4*F8uX#D03BRz6Yh|8>PHwdxR{d%>ualbFQ=Fgoa zhxoPaqndK*v8ic;qgZmky!nufYx8mC3TjW#YQNq6^xnNm=Q0iYZPX>&+I)L<=C{+^ z)x&GS1VXhuU1#{>_|32TemHx2_przkp6Rsve(4aW9iPJEqk>&tcR#&uX8hW_-tz5l z>ag)V?(LX8kVa$dxO=p1>waJVwlGR_bUuRFb{t3ZAia-$ewfCL{9jc??Rj*h#=D@N zWK~(C5gT8Mcs5VnqNXB_f(4-}!PA<4;YdetsIF8ff&dA5*w zBfo?wm5iYxy0Sv1gH-GxCrI3n_^=k*`6x*;wN2|{S~CHziRkfkQ~=P=I``8r7aYLI zpNL^OPD6o#sk;0-@$lrwduudQEF%{i6Hm{e_w1?b`kiXITW0OY(raX znj0&7ColUV#}l`XS+f;hvn4LZF|Zg=T)D#f3FqzxJ^y~oYLgMGt01L1>{65yVp*{Z z?$qRJ27wdvRP&{)bb&$TT7ptu_&g-~Z;j_qK}^n4p7=m;yF@NT#$aY=W46ieI+5iW zOthaxoR(!a#fJUjmtl-7cFbx*D0q8V>XD&*Yz&}tr^a2?-1ed0lIzWs@kc|el_G-q z!EEz^@v~Z~7(5eO3no#?bTDP)iKuCL_Q#+R)~4@QN+07ygMqs-!u|94w}HHBy?F^YDvQTe4_HrIvD{}_ z-DdI}eVHv65|hR0wI|fG{5JRTtn;+-J=OH-M`x&`i>U-?!ef<7zwex0)-}jUyBN}aJxjSIq zq@k#opsMxBn=;FF4~p~5w&t~hxv89;fnrWxs(#+8 zA8^W5y$>PvNTofXX2L7`Pb@^$Y&kiXx>w0rEOBIR&wU6AUqW^0afQ^O__(K%(sTriD2V6#KvVIlO zDF|3*6Oh2WQEJq5zdx#i9+#yna=o9qx;iRTKP9`JH<_1eN|=dM%k#w4P2xZUx;<8z zsqjDVkcNPZmaw#smq6DIkLA85Q^dEfyI0(&CRrbw>>rL&OcN8PSzxaCVrrJ#&Ts7a z20q_E$6M~W?9Ny_m%Q@8tRO@tU|o;rb$1ZY73fnG4-_{H^bXVK<#$0R-Q#d>emeMh zh3j*8ge&V%e-Bv;_P7_b)G2VyAIUz{E-vd*B?P%Y>ONLi(|PrpkTSUDIeXN?*J_8k z0s7|J@ZS__%IN56(SP-2&Q-P46LOA76cIau`tjQ#N|a+_$VPSpI$sDLn> zIzQiOAN|bFhRhww$+s;5w8{DiFFDx|7vG>sCmp-CsS z$w70E5~F`Nk}(M}OExI?YVWp-%&DX<7FV}v`Xzu%RJMqNio=qaYJzk7)-I9e;pIz{ zL8}Ue$>*eRSz)xs6HDw9pPKehK{J+aA$H9$oz>xZB{dfFM~y0y9cha4VRDBx((($8 zKd>HdA_B98+Y+Nyo=3TWTLZkwIqHeL?=yzazg~9k?&6O_dmxJmu*~ zF9Us`@()Vu?3PVy#+U~k|H}e+ny*tcvLGm=;)W$9u`p}X&89tC;GV&A%~^4R{d)|L z5gFs6_boKAN3*PE}27EgA6Am&wM z_gwEqFx&~2H+9z6hl4<%dwrw(d9S%V`ILDbZsfp78tvZmLI~FCypKIhFM)wbKK+uq z4x8gW5YTiod#9&mAp{;Tc_D-dA8Sd|U7%)AXwL@+14SuXUbBOq{*4W+I=Z^P2XUg+ zT~D~*YL733)XAd3!7z{gxM9MtjpOcGW1sWyx5lC8uDRc{`o-+2c{E(Qmrney+g%La zr;^p)t4)dt*6`Q2`*5jg&zr72%EMB-wq+G^G1nR|hx&FTFS*3NsN%4sWrXF8 zIcZhtZC>{(wy^NY=HF_ILPaM!Z7Zx}!l%m6Y$r4cq6g*vT?!{U)BG&uU{6@O%+#U> z@Co24-Po-&K1+VCa!05C zW?9p9)qY;R`9^AVv2o?y!O?a3_LtnSxYuaoCq{~Y4BuhkrTdzxzZ|{U-lnIkXC#p= zRBcwGD#~@p7mzq(COjl&G{Q(TDg`nR@Z%f52e{r3)OokCD?`WjaGm^u zd-#)C>r;aDlq#J`G&md&h$#r>BS50!jRUu;Y8+&p?B4TkC|jIjU>$-IDzt^C;mD+hoFSm!x*3pC_pK1s099#nnG8JBbR4Z z007-_z+Po0n!dNODZ+H}J$MwLCNanm*yt_F=Peu?%-Ah>J&I&NGAoa$7-qbhk8sQM z>7x@7_7@+g=H?t)mNT47aHBkuK@|{|mU%utcShn2qc1@LisFR1O!+HOt(EG z648?9t=Qpwzq{oHJuFgS2=-38=K-o26u>+iy-Om2EjJC)D@uN`8PRA1XPFI5f7haumf#r3Pa=7Adm0u^xON!aOeGEewy%X0hKr>e+rb`TpqPyy0E{8M<@nH6S8O7lz+L(k zIae*QK=G&)jlH@$Yq9}VCUqO#R-hjPI(@La(i5yL2J;>WEAgdtsJe96b};8 z&P2!1o)XiC7u~(35)yJfe}9TqzJ1_0^3F(Ul;E5|op0go^gi+l_B1PtDTiaGgjI>S zh1})9s4J>44u)DpOPqmH42aBYut*k7*$tt~ja1vPjWI|BI1tYw|5IktxS8z z6(;z>&iel@Ea;+|W;n0qXw<2$&*!UlN71_4Xcisrfbw?Y@%1B8!QuKL17pu}B!#O=ZJUm2Su9y8*l)nI0 zSZm@;nkYOllbQ9I{YXoY!;`-=qxey9{BIzxS)<9r+XZLEk^3Q#l;Iudiog748qDj| zNC{QG(p^FVsl*3T^n$ZJ6JgX{@{;UFu}v+atR3aIb@PEeTF*;R5Lh>71*)w$TaYOT zz0m5!*vrV>ydRHoEAsBHUZbA2*34xhk0u}5efJ>7*lD7qJwZN0L-wLmj^e~zk|Y!E zFQN!zHf#JQ2q%jCd1x3DC)2f5cXgx=RyqN<{(Zwpun-8}Y}%!<wz-EgD!*9$e7qGim3Ha3_F-cM!6QS0}T&@`s{?axKWh3z*o9*bROD;&YwVBSFhN?d#mh0C?q^92GXsou6x-C>&FjYeODBJpLM>A^sk$`^=%Jp z?BvbcYv7}kjIF^jS~UkGUzSy4+kcCR1{T`=u^k}8a3nVz#+o@jSVo0{rgF;h%%cRz zSz)!PMr=FPY-{t4b_HZ6#AneF>qh{O@OHl2;sWtmgWhata=CsMY~3p<2wg~**C}+K z9N8r~4Ap3BO+A4bBR|urRI_7wpah$&puv*XG%OcVE%Tye+sIrJZyUL{H2F>O5sM1F zTM{)FR=h*LbI%d|EE_dWnHi9xnW+a6RyCfKZCOm&;z9DzDAJ=+95B_?oFt8-M#_tR zh#alvYBl~tR0FC*YcT_~liQ?0XtQ16WXMj=IzJ!a0d28s)WOHY1!4lDrC6ZD<90*j z#{L^gT-Xza4|Eb#QSPad4wei91LJMh?0m^uO_YIwfm|GZ(jbf^NEZq2ia@g)tm=i^tXl2iGybX9Y)O&XT|2r1 zuI?d_lzjb02Lm$A>m8tT%hg{3KX^TqXS>J7+&(c3b$>{#aCq=i!_!!$%Vr{sTEJC4 zrEfQ+o;l=#2UfPL49VPmKe>r~SQQHK|@mA;n#+%){!nAMu#KD}C4l zW@$Zpc_VJHCCIc5*+jed^uu8NZ!%?o_>yt5l(unl9~1KNqXt6bjR-;(3Iz28t9)RA zXuVHQ%n?%-qU7vj7r%*o#cXceoP38!YijsMpEVO+C6b4EvIq6d+8PF>xzn2-Cv3mp z-hBdV42$_0sX0v?-i^DA!P&+WrNrt@4mn9Ok&n!DynTE1CcO4HdDIW z#64Cf=J@agAP%|#6Eu-}Ik}m!U!tlQ70t@Axe6n>q*5=cC5g9+Hbq{8Ly@}HdY;$1@~UXpVq+DI?o zLry-zho>=&Aubh|@i@-~krS0exOdD)LD zuZw2bp3Okxo>7AS1j(-aNhhFv>e<-JLH{?c@(0;NMT1Dnjd4&%on@gYjpre09EXE2 zas@dIlumZp9jMLZLvcAk#tsy9h&vR38xFxAWjA3bYG0$hFPJEG5U+?!93Yi8ey<1x zoCd+)2M0lk7d*JND=djH&Z@A=$e$!Kc%5?4deTi99_$$FX;4$QgnDP$UG*bL!JlvV zUlt(D24+}UqpB>20(43 zs6J4&E`@eMYHx!uVh8iHs4rc^O|N1%R&(j0pEJzgt%#e4=Pk+ib2@gwvGqD~=;3Jl z{r$T0@jKk?ejxTg`A(%=xbX!oJKj|9^52tupBPjk20x!LdQ}8hXbf!1c76Zcw%c?p`7$P3nummRB{QxH*tAy| zACeQ?J(`ItkA^?5sINQ`1=v@y!%7*-RzSom!sz*XQkV2f9;cpUav0krQQ?-7Y}~gLH>|4mJT1<;MXbmN<+wVsidDlAYtJkjW5uB^5*d-N<$G^UK#8KwG zJnqkHa&)z{dh8!>cJvVZ$SUk$U{T=Chr=WnqikB9Uv3k=OHjB1fv=Z?2V7gPgsFR) znr>zsgj0foKN(W=I$uK^CYYGwKe`>idOt*C!k)<;GLGo9LsN9Teo8icOOCcz*4N33 zQ>dw*uQm(%|G7j4$Af6?1xYuuZO6k|8@8_Vzc!ZjqhwZk{pPRr>e zIWiSHE1pixs-mAFkilT+dg`mf)G6-IGniTKes_0QAbcW#TIAd^W}1f@ayb6$J6_DK83Go zp26oTVwm_PET)BS5KIo(&{5MvaCFlN3*mosdamo`4Ga3xHHkNt7KzwX#NqbJ?IL>N zvo5*)vcb^B|M7xzO87Bk`b+ff{SRSJ7mUE#e-9f(ND#eio;SF`IBaT{ES(*qNa%D4 z@!u2=nLuQId0c1Z46TgB-{Ft|$kH49oKgW*i0lkbn_NB9MYjm-y4b(3@cOZog3H)l zYmZIWV76Eq56eT<(>&TbKTyf(dqKIFh#a-U8ix10_O5hUbflbU^6q{I@0f?Bl`9g7 zwop{5N=vpk4@ss>I_G~-jR7`7CcQ z7+)8yRS;+E(`CT?iBpzq!298u!?j&@<5IE(qOW;2kq;8b(@vcr#yx%}8og^Xf$?U@ z5b}Ab(Wl4~{EE|2!)+jvu<8CDS^c_^WavJi> z4erkHvAgwd?N@cHe|61|sqTCG$aBv9S?B8zpHq$@*IuQ5;b{a0IrPctZOC6%$xX#M z@35CWnvHdGKV}&N8kP`n*iYdL4NLQVh0SSkTJL_=f4lA$)yKZqedk#yQOBKLe;DEF zroR4tuQ%^qG&;U-S5BSX%FWIOZ1Ht(78oz{bd?EkJuOt}i(SA`&|0JnU>TN;K$g?q zUvr3me67iEtqKJHB=+608jv7)oXDbxfRNvFRf{3UA9iITJw4`qrgkG!%vo4k7w@Z! zt>6c@D&fVL*UkNF-#kY8uPJ-=kv#2Y%Zx5w^?zXl3^iOR+vt{d3oQPfo3v79kTm}0 z(^MWrzX&s;BafG*UNO~6Vo4jDSxEe=xovLj1G%d@UhGg8Pf6m`CleEBf4j?aM?=hs zOgtK^S$kKn&PbfPpf7GygYv&h9^;M|jR6qL_NdH~e;0?JQcks+z*W;p&o}iO4^>kX zWI5#IXTVdtjfZ`bjTaK&-mp=?)==%7{vG1fMmtBw#2bX|?W*?-KPQ1L;IVRm>rEf{ zTC?8n0agJFscR&|U_jK-#=M%FTcYLw2a{wg8H+}~morI)Y=B25ikD3!z{@ZoRDqtG zr~HS+_1+?MqQ=4L{KUBJYQm|@=Y0p7zOPl|`e7&h^fyB6W+=<)HQ{ZCZKEr|kN8eL?wG!8M zuO?v(ln||lcws}f@lL(ML!(&+Z9igSrO>cUOYl#wS=a4@h|a^6PcN;G^_6o#dJDDg zgp7G@DajNY@u{~_%VKFu5kx_;l+~51TinmT85`a=pJI(a#UG`FZFdFn#l$5(}RKcHM z$PX>B)cECu4Gel6vC2+N=z36uiKbY2M%NfYCVTR}sO)}P&U*_}1$gJcy`YG_E%PBO z0L-9`ib2~8ABt)+6eZ&#Gc*6o{hnNo_T!cT)gjV2ZKnv#>k=j8C~j&jj}@M zycV`BJX!L%%H)An(mZ3K2c^1*{?7WO3Y*f0y`U2HUk{z>A4&B%X{$;67(F9-!&^|* z0deEsOhm-k<+a^?f6K;IBXhZ#v5!GF9c6CHQ=1H%&8n0FiG27AK7VWGlZG=*ZPUb) z&A)-fBki#kV3TylzmwQr^dDA*q8hKw_QjK&wcVlflHZ^XK zDT`N`Y~O-CivH-itDZ_$S}mhD>p{ zN4uHvC-&f(?#T$VcLoy)xpWDc2;kfP;|#<`cflqVi#y;pMH{-m@i3x4C34`5iXG%o z5M!wFv1G?mIJ{1W+33B8i{kYs1&zA`LFCuIxjC*UL*R7x?MqdfkvHUME2V&O!}~Sv z4GMgqKrT8(jhF&GZ1--Za2kSro^ybgHE#qfXOQJK1#BWjA4B{b&E4^i==bc*B*@4m zL)CI#w~rk^v20GfzZ|o6B@zZX=7lJKC;p&(D(glY@Vuq_k|(%^jOxsQjwO1oaBet( z0_U5^(y|})Deenu=C2EYRO`*H=Fczkgt98TMoM(=<)eIJFIyN6P7YY&G{i~bkeR{3 zw+q!bqMyaj&(EPaSHgZb7nhS~XFzshS`fKu-}61i%hcOgH| zB7HmEWcW3ks{#2NYOyP+#TsK8O5z7{tR1%Qmu(cbHQ&Ac6!n_pXy12$vy}k2ap$C# z1Y1#TQM^7RpbhV2@#UR+Ji8mPt+&p+Y+{_=c9;oZgdh!u5AeEwpn5)7P0GZNsXZ8c+a ztkI6Hi2ewjKy(tR`}0q?w-hvv+WW&!(GgZy=x^G~Ku}4TXaVzM&JpOcLUQ9WlYXPs zI6w^T*o*bn&!X(EY6pba^9VM6YJ0mCgZeE34{<1vghigV4*-vR=Xl#s8;{G~_gm+I z@MvN$Tw-qxd9Nd?Z~LWhLr}3bP#0bN85u!i=VSicD%;CV#G($TH1@a4V)IMvhYenN z8`{L68}j~%iy>9$xT?`x3h?Fa1){ny_I59dwf?$i{1P@r4u^B?v@?~6i2^u4Tm*$Fyw&~-BmBw&gDu=wt6=DSeR z`co2fvup3+Tc=YjBd-)TXR!R~V=kg2A$H2XpX0Cx_VN6xI5jC2AMHoV6f0G=5$!4FoeAmH8$M$NT-_|O*gY}tv^R2A zDQO=5n~{Ecw3pjuctY-_mG=PM{ql(pTD`#SEBW2xkjVCv6Mc31A1UfFHYklH#{K7> zjr{R+E5XpKTCmB$DoFu@T`*04BcS?(vMLJ|W+}>)tF{6G&EY%8i%y*v+bAuL>)6)3v`?d|1=dbh z&nfRe3)s`t^S@8p_3D1n)SJ%BF?RQAj@k|}`)3DAgiwil$|J;72n+MSly~3qVPIfD zde#BY4#9KAPgiN{z6X;SQ0F>577DRW;M+{dh$}QI!T;o)^~HckT7?fxAQyhJdfPVc z47g{#^heiZEr{d?QeBvdt&zux-P9$l`)~P3;$x7Do}h&Xoxf|UPVRncE_3T=rzieb zPEa(#*mQ66s)Ot01JV1M%J$6cT&0#4p@;!*?SUtJ87#TW(^a;3S*boMW9XIkSJlJYh`u21-#N+t?``4`~(K6h4ZHRMPgw1-WE z*$LcBSsh?}?n0W{667e>d*D(#(BcUpeO8z`4$-mOs)d=A!v`pfd|HB3NpW@AP ze@;odiuFXlG*G{pNr3j))pU`DZuxid3;McVFT~~K>sgX%>@-$SqGTw#UixKYnf>~96Z zD%sP2D5W1q71^dy&cs9~O+T}u-+Q&R3^fe?`c0vU>0exJ+%|iB>xqG3-LB;!MVY~f z1?F47@pe74cfwH#H|hyG&Ma48#8~U}<&W;Knn{GqR>x1OB6H1Bo3LPsMwL8N9HZ<1 z;aeL~pilCI3NF#D0lu;Lu9vdBZI|05+iQMayD@RXs{0XpYQ^c`kg;2u!USW?L&#K? z=63mzTXgh|x0~~DT!rFwp{C}db9Bxdzkc zzI`TRqLysYJ%X0wG-73!_p>%T0-wk{KTq8#!>J5h?z5p30pO{z`AE{hH^gD+*^hmX z4WbfTw)-OhyncL{J4_jHMF4#4etuwsZd-}nw@pDmZFNI$FqcRW2fp$I%Uc-v}m4EJ6Jbv?{7TYrz`CwlKB9KHvUZpGz6 z<+@4NAKLQXj&KnB<{aV?=POn zIqX%a+rcpTt?Gx^*cV9C>?kBYQS*6Hohdv0)!|ysjqvWmJF=LW*n%`Kze#NHqJEGi zj1bE{(Am+GMD5v_a3k0&={uU#$Z*%n9sVP8>c{i+UR+_O-jKaB*Rb--vb1@i2Kz{W2NDSk$1V z{GoXJaiC2&3$Id{NJ2F1x-Y`%#iTiCQc^)~zKxl4M~?PlMlf!7E1YK|7)O?)ATn}p z@|sQfZ8l~KCs|M|FIKj&#{bsN_#tN_V5^wGsr%(y&8j&pE1XH{-v#0D5GaySz~g8N z+#SyLe3ff-#cyp-Ay5b?1bs&BI4FAyoKwkHvz0IF@{pHa&>shFNReT_7?FAEP;WSVFyN!n@sLx$Z}ZHUrKIz`=4t%ucE^!LICIH zVi%_AE;|||lIg~8D|{*{DkTR8*ANX-14{xM`9y#d@SN?nxZ8ba$OHB-v2w}#H@W8M z>lpB{M%b%%BRkL0DbCgyuf+Fw3&b=9Cd5hO@5ZbY&@mo>iBX7Jk(%l#AgXqlsxgmz z(r~3ab8ac0Js7^){+b}$zN(HX&%_8+!wa4?1+JanJZto*J0IPFsZy>PI){=RCA}00 z9nQ(UrEvwTQ$SvVU`phc=6fYg0S_WCT<=zhh|Ju{i}W1Psrz$oWJ^T8+#g%@e$F^> zXB%1Wl9x1d{-z9HGLlC~`KDOlQ<7##gJGlAS`5fD>O(MZ`VjALUBvE! zDziAC{J`iUnnWJI{#7foXIGoSm*yrNb7lUnGyo;rX@1;D7OmV64jC_V0Zk5QPYF>W z^dmLYt18H`+zC41wH4b+1dK;i)~L{#p^zPLA^30PxB(~pa6t#WBM^IR0A8Tn0iGJ< z#9o)3-nQu8W@cJS@vzPnm@lRPcNi;}K@-Ng(D6AS;Dw;e8X)0sCG;Exd}x1+NPBx4 zG48YjTw*LuUEI+Dx6(u(SytZ$4sy|OjJh2!F7u#+8xI-Axc|Gy#6RDkuR2xyc`zq7 zk?{Lt0e@fq!^NdbFpJv~&pl}p>e(t1XW*IX6Ig7gQK<#BBqvw9kxGY)Y7Fwg64e@Q?Z& zf~&z;pPe;zE)`TatWinC$D22293yw*G)_nz`)gKU=xy~bKUJl+JwdaQh!CfKWvvY9r=Tq@6ZnwP9?c-Q9W%Sh z!jp>3-(NK0F7hqoYm649KO>3ehhdpYQ+Da$FmDqIfzYwM^gH|-QG|s27HdeW@nf9) zcj88Nw|o2j_-Z!lJFAaZ5=~8EYma^5BZU{W`-aM0o7K>qAnX@OUnEVi^DJp|EO2GP z^!aeqzY+GUSjpn;tFUO-xNFxd(n-C0m|-rBl(!`g zHYKRmcL8SNjj+wlhah=PvC_^xa!xh8<2SzUM_R-9f}UIjt-4t;q*v(KnM!0M3TkE$ zh&A7&fN0pra=bpV7&&<{2D{?pZi7rxNlB!%;Z>zb1C^}CoL}gH-5KsQFKjycIHquO z?%W3tgsC)_H1Dr%dW?1n@Eb0HT*mER%?j*Py$~HTN)ES4TO(AGaYa817GQonFK(Ns z@$Mu)eX!=|)$pXe%3w7>n8qpK!L`!aW#SS^8xi+#-}G52E&q5>#UI5IT{z-Y_Kh=Z z7g8VT7mik4)`RsBkHHZ-{kNn*)j2qHv)+mMfUuD+nrtGA9-Vqg2yY=vp(G=}9Y)hu zGJ=(PA{$nfJXg#;9|A@+#`O0)QWYgf))a)#4px5Cd8Ab za3pMeu*xi2lIX5#wyHh;K}<|xIkHdQ=!l6v66m*tk~4#D6-%StQcdJ(2jdNIVbo7> zw1ipkA9$Kb!wQHtIdQnpV^pV>#qcy$y2|&^-`$C|+$qG!gIFN>^jgZ7v}$BrO+u4E z1UNmEK(f9ZqrhvqYzw=9N^TB_#|~0xoaytxZ^9LGJtHPYQe5J4EqFy_WmYZeT`Ew8 zY=^mFkszCfZcJmMrX?}_YGbhaUGopKKltca@t7q~Ute5C>l=kX2N0rXV%lm^eT>Q1 zL4Fy`^jxX@AU|k|eLEELI|8-AK~NW)ci7Jq(1^<-S=48EF}t9rI6`5 zR?pnWK6{MlBv@Wcf9w&_A9SFb9d2T@OUJ@b|fS=ia+~X_>eM6&rzmf zHtBqF{bczk%7zph7j$1ujwE&xHao#@sbL1JQS`jvAcpUPtI;ZvJBoDhm|p%8Nq#B3 zxpVyZsdl;Z7Xw<3d0kn|+H$3I37HM=rQY2He?g{B&v!`R^|I=3nf8+Sl-T7M?O`$f9hyYg%!$rz*20gD!UWG#R0iy6}g=E~FOynQixRE8sK%0GiFHR(Y8@GAu zeTu|oyA-~^Ej2OH^WyrH_viZNrp7J%Upe_HrOV41#zD!3B}Q$ou=aW+Gy5v z1Y1vSH#7yC2`_H7MCV!gI(8atF;0M;%Jclk>%AqI&Hw1vxgW-CeOv9y`K6>A^?0;iGp-@KdDWvAG;JP=ORj9$-p4Mw8h}InWy_bhq|h^hbUKb=b&cNZZ$W0&DWIUstwrpWYi9(qi=ZmEbd9!~82B`5*jp%}>uk z-9U%5i-VD*hV@!6XEGKxODzhp09B})_i-S=^25|_bs5<{eSn!UUBmLoh>Y&M1Szfj zi67v*_I9~yytNM{;i$EpINW4hVgj;7MC~6d<_SyGpRxmHNa|`h?83&FFw8NXe;bC% zoC(`uXDXC)alU-PO{>e)q`dy<--2-3Xf$CPx2d+8Ixe7?y>AQA^*sDAchIV{X0Ce% z6U_@V9$D^UKx-+EhBGI>Yt^oY4PJ>73UytKv02<7(1SU_Q3lfv>lsonK>yIvl_?R- zX~TE$e`%ilwi2kg$neSLW5Nl=3ROY2sZ5FYTMx|Q$!iEdU6iM#inkduG7^WWE|;L$ zrq(HC^TO8kZwvXRA*}@2nTp%w)HeJwUoJ znqnm8B1Goi85Tsf&vl{KvyJv2F2Dk_tkwJ%Ip)Vz)bBJhe^Si^!tnGl?S_lLOLx0A zqRnjmwKL$(XCaOkl8&ujRV|)C*dHmxDwz8%pK=822#Hovl_nFaX`G+N2`SAukVea= zDj*Cj6Z$O}4@>-6C+@pb&dMP?j#{A}1{fw>$9O6w5?7YJ?yDIQ9kV%0zOn1%Av+LE2RgBMe&PDZ8Iz~Q~G_3gk8&kvyWuEGO z9OB#IUk8J4qbypqiyggN*n16ZkUiZHS3AhuTaG&m6lJG~ou;v}E(6%@twiwbW87~y zb6N(yOzr>oIQE}HQ$BRA`xcrEolfK6VnF^r+sBkw!%9wiUwwX4eZt?>!CWbCq`4sa zugubBlI@2I-RE{Lp{x?R18HK6A&?5GCcNtu!R7VyYD8f_Nyv_n97gx$;l<$V%)0aQ z4{w)FZ}+!G9m^ZKw!hJkk(=JE1nXrnLN6N+eeDU`<}XKAy?hkpYik>zb}*rG&q3T& zcg{`0DN}&)<4r{8nY(l{z0nsT&CA`%nGm^yh(#~2yJ1t@+Pl{Mzf`vlqNS;rS_{i5 z={@YYrb_(1dS@YNev+?VD{R6SSJ|!AFYyv>TA%Ps3}#7l1Vt{{S{HFc20Hw6%SWbLvzP zO8>EJ*5!S%xphmjSVKnYh#}W?%n4_}0r#Tu;q<~J$C27)v(ceD+*lhS%QTV|>lS`7 zpR-iet*}R)N(Pxx0cMqy$_*{40|wKbg`25m29ET}UTok>9RZzU64bab9ONf^LGm~U zw?Tmx?$mudX)jpW@w0))7V}f#@pTO3QDA0KSv~WU?l3%cMt|}H=|Wk^Tp{>I#G;+* z_t)yw$_}ry>5oJSa@y$V)u$BL2?3HdbMAj91PvnM{8{FQXU3KoFXv^@7QRb(D9JHO z85cELrm^ChTJEwwTF1=$cOLc{v3%5tc8`(_Ls3zJ8`bZLsF#g-(era*=$HN-cUN9K zt7i^#&Lc&b&W^2qsLT3fo^f-+Cg8I~iKNe@*5OVYMM^7}d1rABQ>TMYQkft4?YJJ( zXMYcMrDV8Zbk}<9^Fxb)nRzuEhEv&DE_0>u7zKgHzm2EEVF14hcEuNeXbbRoW@hKL z;*ggpMJ<=NulY_6Ezd1}zfZ+^jA@jQ|5R8L8ER$n@L8+XpHF&pb}1r)$Jw@zou7Yc zbz|eT_Azl&5DC^p+`S#1=W4_P7`aACk7ngL0KU&jF+%D$;80MZ@&+w{-1u3!uO-70~Ls^R0OIWIG!@c+@na3R}$8PNEeydCb6j_9(>SnMt`0M%_5y~bCr6zu8 z3GnJVKag%JE~b;AJlaXRo`-}^pPO{3E=3W3|3Lg|+UVv%=+*ZK@xQXJyMHnDvT6mj zkaa;1*B8&^i`tLo-94a(+c#Sy>rGW@qV5xPnSWaw8a~eS!5h6y+x<3~NQJylqvkGZ zN}mQN{z0?W*24_f)WY)X%r2H@K@SISwW@l@E|x5i$u0e%?st?gkYO>of(iT#&>HyU zD#d#I#fJ>VXn_M#Uv?dwzCKyo5a3O@7A{_S;HfODaTMDul_$aU{f4onT|TW%edJLV z?>wXu;ZI1IF6I%3bUDYO1tfvF3BCDqB z>FAoz@icY_vrG%&y1lyCZxKd^1EwT_Wxy7Ff$d1sMu9C{p|vc~;DgDnEEcG|ZEPmp zzdXR*A>=yw(33?uD%TECUi>6f8{u2Eo>f7#0$EDBWr^1B&e`m0Zc{HL<$BJj9nh=D z3J2963e`#9QZkP^W|^cMQ2`MFS~Z8?4D;^jkQ2UGgQ(IlC9-W#%Sdz#ksS^gd|Lf? zi2|UccG0v5*t|nwJ99e6{wByqBDrXzX*-l(GM}s zTE3ZxQw$gIQ0MXPx}CFVGAvX*r&dYVH2BzlvHV@TIY47BU<&iYxCde=G~``tSCZA= zcm?6j`@0YKeg5;85)pXv8pTi*U6LPDJn^OZxmNobLG4IFu4z7MXrlNn@n&#mLuNKv zo;Q9uXXK*Z4{y&DZwvv@cacR-?CxjUyZz*s0bu9W3EJ{@3cO!@doq5m1fH@<9e+?4 zb4t6@=J&_2i{xmo8LO3Y&Swc`@6rll3z3e!;|7aXmWw}gtF<^_V7{M9Qb{Zx86+3i zx2|>4rpF^Q-kmZOzfih#{^P%WfY#*k?4}lZaBd_SRWT?U>mrSPKB8Mv9^|{Xm>oMvZKEOB^&8# zz^4?JWQq!Y?z(wQ5I&b%A9U9fGIRD2UONx_slSi+xq4m2>)zR}lgnLLH^uThPiQjo z2rJzfGt;&NuvP5L;kL8(d(nh#*Ql1j=L2^1UhD&z+zGMsd-;c+R#tJH8HI0wg{BYOh;S-sUCB`Z)HktRQ=2cs@?>MLn^ z=wXXfO&>)7X3u+KiJ9ECTi|`oB&7TQ5mvfw+UP;sVSdE9wJD`o>&0v6l~GmtzS1He zT3eS_zC;py$tDYC z9RnZX*hC5Dh%_n|P>q&pP?)bY##iNU^ueG>N)tz@$B^MeNg`1?d`}opl*%~!No{>&dlR{tDj$Gx)5a>#~~xK(e&O) zRJTk7(}W3mm5;~$B9}mVrgv+rAL$T8<8r^iP6^adyi74$cl+?50Y?;M8WW78eg-N zo|%OcSrB>miCkbyz4DJ&HQ(Eoehvu6Zu%7|M%;fAigncc&|?Y4bAmYI>Rx6b32FTfw}FcGo(UdPX8WwL~z*>q^}NxtRd7%>b=d2SzO zC4PkmAfln2_fRsWY7CcYpDgsU8l#t-VA$Mm+U9$2Fw4Yh;lHb2r#}R|i!I?=BN^ef zlW}nguy0W!%5^8Iz$fy65lMYFhH_g~+b)8fwbs4pTpksPXJYFuH~5tK+63o+U{xR&ak?EwC8R33GVO3r24eTP#GP0ynpgCvO^c5 z!g=Ts!7=~(0Un{_r(+|#Z0Fc#Q=AB>MY|xk{uOqE30&aDc}UKt3AM?^eJ{>NSRHK7 ze;95MXSES%1weqrX$4D02Yr#KDc#dFjYPubP2@b8#a7c)#(_y~Ys9`zL5&o1&iP18 ze!ORY_b?gI#~E@eQMx$N;12M_dSLAZJLcivxHiFmBR{(hUw!3AN6{10!ehC8=~>j| z%44=JZgqQg_HW&j{#kQraabIW?@$L?6ZI#qhKLj$LNPeRcBnqtRNAm}Uk#OG_ zqg_A{KPlJp3{2@=a;App^{<^WvGgbd%j(J-yIHpXw6gTbf&$3x4tY+|FwscH$%{(+AT((W8@M$=sjK z%_ElsuzqW|Egrwe233JU;CBpFhG;!n9Q-97@fCnOh!w}*=5xI7+V$|H-TmXr*M}pg zCbd$ya07D%L+VL<6W;)DN=lA9D9LAqJ`fw{iSce`%#i^YVJ-0csf1q1d~Z%chl0U< zP@oA0(HWz9Y+0HVoTf=TngU7CoW;V2L1~#t#=8R%Ug>KTs&y4G>D5J&hO+0tJWvox zx9Am`XTd095;-7O%YW|w`V=qM>98YT!If*13jXf>!I<*phX0Y*1^=za)s8Ew; zn+o(FE})do6GO@HxncQC$cYV~!1!_WydK9-UZ$W@8>1s9zEaqq)=5*>1<2%Kx$>gx z!9lNKDTaOeFNfS#DTX1tQdq8WMZT^CSj9nj-QT`NukXm#-0msi51`g3utZOn1lF%&l2Z4lzYi9F-NBlr8+Pay($*@X5VFIJP0o?waMEsVuI&%69^PCXpJgV^3a zjJP!EVf6x9`8;>(RB5V)iin_WW8Z>XZ*CZ4`kJ+4BML)80uri=@U5&uOG>#TBKk#N z+1ZW<&1A$FM{R{q3I+Roz&8`w$XnOf@9sGjtMBa;4p$i{=VB+b%gc~+z?PRE$Wb@h zON(ixhQMi~tGz))O@$iV*_Vxd?ke81(}(tx+)!hOUg3ocGwZU8;^p_C!w&yOitjKY zjMIO)h~C%z=)=EKQOoW}y0g$LB*i{cEzOa!p9CXj8%7z$}4WiRnniv%s z+^>YsvtqRmhAIRH7?#QK{a_c|u(9iy6SD=H9~RMb#~`MBwp5Zup#h zZ1bVVUD75%KGY~s#l%7gOWb+soDdYThM@J_cDS%fcthYzBvA>e_&|WRJ+5vF zY{eN4I@pFIaN{$KgG|IbAK^)eMymb150)KqtnoW;J3yA|fX((MJ{*z(PWwHkqzR42 z@q6k1hN~w+eXarBMa#iwf6J#z-U9hQBP6lq_>&KbnjY9`-`^)K1qfdr=8mwLwUt=LXCa0M_?qn)-5UY?&ALS#0hdo{p7Jf`GY<>QCG4U%6&Cdh(6v9pcp~6#bCs2BH zi4ZZZy!}GKJ2x3*YwAQkXxnHW{Z9kNyuKhaY}QVyq?D*(gOgRWueqNDu|qJnH*~-4 z^L~aCAFtwEGyjJfCRmS!4|8AKg~k5eX|oKk06vZRUmCMvcCo$oF%!`0m)G}H^GjiQ z*&Kj|?1zIgRa8~U352iFoz{xBB}wJb^)Xv;ohxwjsgd!}QbWbTRTnK1+Qc{WxixZH`R#t<1ap#XdT zTf9&n%OrW;yk^6Dkn?Xv)S|B_Qou03jy}Y4jq%7ymCwA6+;(KepLyr6(Ik>nJDO$+ zS+c&Uk!goi896akONW!naAd$rvXlwVJ`o!f*gQlu)}4?(NX02{!{Pr zC+z$hS!U!{;XeX@<}p#-mlD&+9Euz!LtSx?vC{;6WpOjFy@^**Y^JTg@(ZHA(o=1k zRLp9GRUR7=ZtrRS&_KqOL8@e;;R%kQDq{^2IU22Wr0tBrbwGtvIQi!^7hh|fHuw=I2mqOlapetTV&~9I zwS7NR$mYN0H9L6KL||ORlr%s8TDaq)PjCYfs*8zxyvYYiI1u#KM;P8Yxt+A?btAR@H142R_9yVJFQ=`Sd>(0nlnh9no zsg{gg??GOZ&T6@qhytVL;}9+yJ9CW3DY_on&*=OX?*+kxzu%{d#I{-O4G$AuT^Z`b zGK|WElcWoM z*ok3Q8MBbOQ;$DOi8H1*hn<2+6I7E+om$TdV<;(UfJaSPvawA36{QjkUtslHy>Jn? z;BbZ0O)VuDVoUfcs567}aY0;hWoXt@kQ4O_nMZCP;Rye)b-_IBlcHj762g8n1v@I= zRx;x73HKXvIz$Hb&*mCju`n?w{M=&W+mfkaI9|QbL6JXWSt}E%t_X50W{p~ShL@6y zK3r3HDdPW9qbZ34FFkV&g#k*adYr@qroYYJEZSS&9;}-T!X%cC(fZgcj-#Q9#{h3z zi5>k_dIluJ+Ab$yqv9F1PvvBh`S(eJckW#m!}=>INhL{bViP9JW8ZuF_smG4~=SNp3JqRwjQ_0UnOw$Vpb*(iLG4djcb`Y zS|?Vn^~Vf8oP|iTeVb7}{M4%N7sSqSO0k{uRG)--bI=}@Vtx(iTb*e4%uo~}eU3T? zR-*`PIvQ3J%`=;okX0+|Gqs0yPbKy#0SbrHC&ukVok(&!@skYzl`C*mkxJTwctc%@ zqW$I}XMt9tM_L0mbEw<^dQt*Q`bPXk(zi-Q!v$tg_)38?2JLq1)lzVVTkgZ18ILa} z{LbaW%6z5tF1FF@c3RiV)fk&lB+j?B1%2@Qz?+bhzndRFsmR;Q`m#k4{y@3d6FP zdXMGkxC5X0-Y~@O4AA{Sg$;)x|@K1zI|O=&A%&Ag-Dm`XP}k zS*Bncxje3gv-IWantFiCW`mkp}PREDbTWpnJlO@W#%{^fy}?1F@L>bn9} z$i>cC3fcl4&n7cHuW`ydk47yNGOzR}*pc62No-+q7rsPITgYRsd@V@F-YBNAV_=2z z<7Y_bv*xn2GkWqPjT*=uclgW5t{)>$h~FgK)L4~Y;K69-M}=uQDp%vCSzDaiSMm{c z?&q{ku~c|p`)qr#9LJLAU7dqlqA45Va}i~|!p1=P^;U4n?PkRH zfX`D`dxbarS%$dRZS>QV#CakDOUoTD-h=X;nsx6W{E_56smx&tL+9Tq>opb2=;_ws zP#j6&R$`FVpgrRbLFK1#&SsabxqWsy+p6Ce*fJNLww@pA%7a>bSz#W6T_9?P4$j8!j*~GESWhq3NfQL0`r068mwvh^DU#aJ~S0pcR1;fFZZS6{Xb{9yQd)!iA22!h7VrNUJIP< z4y#V)xudxxqSyXL{Ju+>NvqU#;iJ}EvZYLtz1$&6mDWZPhAlPqbU~uU_&%1SI^o=> zxiepDW@>7^jjId`5%N$hb*+%)m9_uF1z2vX#^?1qVc=0U=#38IPKA-%FWbX3HBp45 z>a`q<@}6FkbH`Qm3X=@`R$jxKnF}sLzT{MD*I>tXwx(k~w|8_XCZ;O?Q`37-2@n$y zg2h}gYO<`d)|BD^P8KOhr`{OLOF_uO{6w~fXL)nS&SuaO^O%Ifqq2S@{q2Y(2%O$pt>i_{j8`9M{kB-^W10)t>_C9siSFY?w z81H}UB)`bl&>Xe!n}hj=F-J2=II4INxs_yG({Leu({2(E95Hl3{gDXhEK-D@p=4~s zRj2*vmy>u$RKU%9z~0TJtk+?;R$c+X#;0 zn@G$o>S{dcf^sXu#5-Zw)qmq-{iq;R=V?Zof5hABnHwa2*dc^4?qT6%Sl({iYgT_+ zDWUL@;G?QNsgGcH2;GGFp!gwgiQ43!r_8G0M~(!fS@biIPU+K0gtVP&-l@xCMu{~; z(|a<}Lbi?QD{ARNeNc06y{RF0FGIzexs8*@D!VwMgANspJR++fsg0S}>e3Ds!9mL5 z{ZHdjG3SM$;a}g4VNPf9{426`X4n+_b~22}%IA|)4_#ZS3(#4Yl8}^l?1Fg-_81p& zil?#!4K?E_Xm%2HE(L4$eehLSed9O4koi!87_%+|h%YN9%HF<>%3$Do8wWLo|Kq$P zW@ZUzSvB{`zykUN3}GnlSBs*5f)3s((rR;NwyY{PIjqfhagnxyT71qz`G6gk*M%Hk z&59pYKiA4fBB;;rEvJ|x0*(jUoGOj)^liM#2!Mb4bJN!h1Wi~I5Zgvcvt zt1}aXzPWh9Jz1HAH93%9aP45fHrr(N83}&3t=M~SOZ5WtvW}%d-YZR7hpu%a91Mbc zH;*7aQHYk2t&_Vy6D`K0?)TTM6Kci2l^^mf3iA;iSKzCba2`eV%p1_CXII}Qe@pcw z?#+2AU&-*8b_lRU3upP$los-dKK^`+9p8f?1{dFCw0_|S8F$We)hnD%T&yQ+{092t3^#IB$}Y)8y}eyPej zNU|ZN8y+sbxxQ|2YsX&|T8(*}UB7H@%X4P?J{sQZFlR)wq`=ggpMRdA5Fg2{Z-=9H zB8AC^I$&$89)$sgJzqdWX@V^(RhPm3UIWU_x&)AGJ;M?>1C!u7|9dEPNr$PcZUW0ZT-* z>db$9u zwr$%^DzA9^%tZy^qt{^Zw+6gIis#b} z7z8j^RVC0#-xP5jMN1q3S06;h%)&(yWsQRH#;dC`c7zvD>71n3np&Yqk(H{opp6i7 z2WObc<*1=swN=t-P$#Z3Fel@*Aa-RrU7a^uv05wB_%rFwga{i_(PBg^S{UX{=1jMn zg;~G4re_`M=^V?Wi2(c8(m3FIi%j__zc>*;HX6?$@20gE_b&VhX=1o4zcf~C-)58M zn#@#@BhsFMbnq%3Fm(}=OQ`RE5&JQ*%(I=oGp^-mDWwynE;th-0e;I4qUC&FZ_-ge zqgM4|ZOT&UeBl-4IbMcVnplUtKk21Bhq7_|+B18K`Tv$&er$SVw02J;#E#3G(^KBsoU&;UP^QR*d=`DYUXOom zx=Nn6Ry7>|Ec#ob%wHOy@eHLkUsp}v)FNin@r9^ZwdxM`$cp{LcDF)Rpyxl-kB|bk zANt!@HPK?I3b+|y1)`7cRO}Ip*4+$PWWo?Y8^}QIbY8QGUo9wNEM6w1Ie_}wrMd8s zS~( zkNeH26-UhB`Yn!e5;Zb$9>0GJbz6_3N4wB=De(`?gB2=-laZXhCp$_DIpN!#LRohP z&~Y+-K|H4?5C-LSws0-ox}d)*SSCE!TYM&##MBa+{qW{HHE`3R9cO~=-UK)zh(EmS*q#(gU}^cIln#Khzw zB_QuI#%%cj$*?nyo^5+=(oTr0)RwS< zOa5=~P*a~f8=Z3`#hOZQQfvc^E0;M{QeD|*lnDv#bGtoEKZ1eDXz=xh1bmm3tw==x zEw-Y*HC(WzP(p?kqZPYF?Lh0euFk67vej?Lf-B+1{z98*JbRuc*Hk9dnHqg>uw@$5 zK+xW8T|>ycka36$6FjFz;TM;FN{EpVE>Hn#gdk+Ub1`F_e=m+d|K9d?hX~!sNFPQJ zQC-+@=E`S>ZIJ=RhVRUH$s1&a)0LS%Qd8~VodAWGWEV)hy@G%)m`9D7p*6v`K>T)x zIE%+`Eza5Zpm`F=OXz4Xp;D9a;g1F47(4nM^HYpd68yJic>eq;sQ&frY3pO_vn3KK zwMAjsm=?Y+>@-vRc6iuQAEf)WTMTeZ(irW5U!TO_ncH&ji~e6H)4MNCQbP8%`**p} zm-Xk+t1^7=|J_9k{0QP!J@80-snE_|uX`x1AxR4%jsu~*x-r<<6~KW)^1<*442(&3 zGDmbSb_+u*WAT#Fv&|h!&mc4*1z;h1Vz)=H6w**WRt>XuS20{wE#fx%pcYbxmo{vF z%e{-M+h%(=7qZe~$IlA)&{s0+j!i81OOqQ&S8HYitO$t>waXSeIZ|QtOq{KeVam98 z9f6W&^0}En)p=$~KJXKb$rS@MNT8jAQ740x6Lt%*1~kE;w>qVDgtIm<;RL_dtKO#B z3C95b*4;cq)`=@v*Zyc_KH3JGwy*694Qd5=81N~suQ65AF@N8L_?8nAhA*?RfDP^- zmH>NX+UbEqrd_tHci;xn-|zoB4#iMM6E1c;!l$tz#5j-Z3Q1+?GoZ~V2svULF7oep z66vA_EO9ZZ%-v+Ix2;&|@&rFxR|a^qxiW>D1VsDDnwc%XXd$zy7HVK+tg`>&7=FzX zzFIQ%6D-yzE5X?Ity_@TN!bT!bv{;uOG^J^)#?@)g8DrDD*%enkONS#4SWXfZu5MH zvfbb5=fcl;=7f%C`iUt3Re;@Xo1Oih^6ZqX%i<1Xd0S4;zV56m#taR z8$7vMsFWSrgE(fK(2s+1vsyR2hR{frrP>M%jg@R<1ON;eh{v+c6nAQs0To2y=6H4X zpxz>~SuB{^8dqI)kYuFAe`u5woHL&ct6q4JcJN@U7}0J+hcBEJX?Z8 z%(IZMS8X+HKg#7^F3QeAY3S9koUEuKqIM5PC-H{6;Pu;>^sct4k)BuV*;40`1i(-T z6f_ZNyC{!w)ge*l-qJQ6P`5WRpN1-g_Fwv2o6|89&~ENfEU#nQqlQlK_aX?@abi-j zhz)vGHBRpS++y=&(NJq}%`{2H6W&R@T*LZ(CE z^em4ZaQ^F8cpAo6YwC88@sZ*M{1X?$&mJKg6nVV|pF_ujExo4j7l!fhU-cBkk+!xk zT?b}-e)FSiYMT-jV)5NaQ_ETfs`_D!^)LC9C8TPYY9DwFIfh}=Q}OYc8?9MEr``Bp zS`Q5NR(eQH5;|xPt!*=;qJJAuPN|~J=oFr;SiKzx4`xlQ=t)MxlI!TKJvYtcLYG9a z)kmi~Xt*sSe;zS8uR|!MJe95#w9Nvte4+%t)dv+anQ|wlAV1Rnn*}(GV|~F5*wupB z(lH1#6WbpPgld>g`0RV`?pzf=9u1 zQbShP`pl8^EB|N~kFg*=HQSRhD78QW7Wrzii#M~yDsHwH`*U`+0hWRwB_gh@)5D)3 zSXwd`mN8+)o-wGSk0aH2KgOp_v5-P}6wW;V-Ha%zHZudul#rE#S6^d=aQ_#O!o%># zW2FoF1@&lS;0*s*RI2v00zigY_~+f99OXI~vBsRDXOO{NNtCi3K_HUj>fj_PLRlM_ zw1gouxRhkVHnwc`WLm~Su(4QZo<-;CzvAm6(n2Y^GruaaLqBWZntjG*$ASW7z)?c zgPnAqRNhe|5NJ0`>Jui>tfEsSD(^&Gv7F8pxgx)|tlQe#!iFf~EFXEG(=zpk-=n_K zUVHxEpuw|f$S*U&eDvGzZOV;X_meC%Wq?N1_U;{G6d^=vCUAKm(rLj2+D&$zdnEc+xz;=|M=cB3>(0U z?ss?l2)!jDYk0}BcWEn*EQs-}Yw&4`nwx}AdOj#21#RI4+3&4O7yM#|+QIh9S}>*i zv6p&$_KE|tl&h;EqG$X6(G0#Hj`d>SDV^TZLq3B1kLB{~AODWm`j~oz4h(5@Iu`Z{ zwN<>G8#vEBllpT4h?2WcVUA?xnx7E)LMz_C&e8K+v#Dg& z96J-Z#e-BRK{D`Pb_%K6W~(H01hqN-okpKv|Ehx$ce}m@ourtp%4~!AX&N4zwu%G z_*Uon*2ddI`aupVQq$_*CatCAXrI-Nl+G0}sSHG!|IIr*d$`%Hvtp&+DsZv=HVNkJ z`gfQ>NF1+rA>9qS?WNUKxmZ7~uYjdKz>N?`btt!+PNn#uf|}wh1a;w$r0a9|*-V$8 z7Qempr~?G@mGp&u9dfQ)!wk1}3Lq?^z=g*R!Wxw{v zGRhEU!+F^&QaYn(%7TYBjmPDp8(b)@t#^mvP2o2ewJ2Pp4tiFzHjvEN%#ph@E;}1?(XaB*T0`k4~Kv3L`!+Hc4ep) zc~OOGj-kI{Qd7*olr?^iyov$ShJF}HxE_DR;{SZT`y0+l?G}yb#}(l+ojtrQ*Wu$ z-rxq&(kr8KW8@bYs~g=-6=8#OIC1)lRn%9!@S@BwFk`~LdlxMGa|D=LKJusg=- zi?|62=;jEdS=SfiCiDlly_l?9X(EAckOM`G&7_tl#Cyq6W`~^IW>$lfe*fGUezzj@ zMLXhgTa*gzIrn)EA-pw1t7RstUH6Jd(`TJk6I*e+&DuY$N7p$r)~)L#%FSuxem3YlKG01P-J*=rNk)7-T|g~akFhSPFeh0* zLT~A~cpm9}B&4EMygCHnKT9Fzx8JLH=$b`6y*s+>p_TS(p5*A0QZc#O~B z?Y{6w$RT`HySRvS_GHUTsgxUqxY=*L#!K))b6<*8#Ifc_>CL~Uh~)GV%;U4!OVlPl zhDfjHc|p$YcFl>`6$4hLY|vy{9?%VzoJ*%6)7zroJcpXu87qoWQ#!+S6c=zzr;$ad zZuQeFWI92}Tf8AsEvs9`QY&B7t`w*K;9XMTSegJvPl08V3OJ(H>(^uUI^1!knQMqIo;jSLh_o8~1| z5FTT2Ch!8pr&S0MUMb2Mcw&|h& z^WE2a8RqDBxsRh-U5=($LB~>K=VMJaZO$p4MwPU&?LPZhqnCLaNG_(9&>nS`cQl;F zwxqT+01$|a$hSsjj)p#nMg+bGfGorKJ)^D2fPl6^?cU%&li6C(vu9?XRFy&EddCvB z!*8^)U&^Zeu(W&*KKj^ggc0L8{{*H?j*VzDUHZi5*4F(y6hW`T%R9KbC*r1Aai|Y2 zxr+W?Z`~fa4vOhZ(({S|^LkdZ2x=Z1FQvEC5#h{^uFV^9iV|`S-}P>JmxFhis*|i z;>Y!FDw4&`A?Jj*&gzq-cpI*Wjol$*5#hjfRmD18_s&ub4`DPplk+(>kojDuOKO@* zts}09DhPtCq`5=<30_}&&Xv_ZIh~&tWd2j7;~GWd5d+ZuVhdyXQj`Le-PTY|n9VxP zqfRghZeq{0>+!aKe;bKog2t_PV$5#s7)5?j%Jtsjo>?;)oj?+T1xoBO+IDt<{QJdO z;S07KdQDwLGt|PeY2PJ~u_fZFlwGNh0mPYX)(Lh%1*D5~qM3`BV?_LEP9<=N9?<$c z$3iL&sMc?_ws!8iGW)fs|6^>^B5tw)I~UxsN!cvg+pBP}?>esFXdbiV-A+_;Ek-uw z<;j~#6DuOYA*yT^khdWJ{Dov6*1V*Q0O4~p2DnylO)~3!eP$QfbKI&pXbO9)00@;ln{1neY037tB5c2RmbUwFu`J%Fj|y zU2xzdcuzcrLvUO+^}K!@*`@05+&xR}6s)E47&j8c)EzA~5fLW&r_@cJyqmFUkIJAB zIdIl#4l%9*vM`rhgp19qpC1o$bY=K)7!f;h=bXsmtR%*qS}L>jc}3XeRt7575| z(i^H-$2UmjFJ3w!7e?SVP*tc&{jE6XdRpAmOVNE=&TNGtw?~N?@+Etk>xx}hSvrCEJ?TV@kVe17F>k5cp!~|UraqX#pWP{bvD5}{&c$At9T)CHstF^Qw zWF~UdUxQ>UKLb+ef|vy zEMt|#d{y8NYl3&K#THSB%2nNg?Hq^vAevf|B6)}9M}Z;R&AVUOF#U>^{b-pByzCxE zL1R0Xv?AwmsTvrZ#_ZOus_ZeLN(zkh`FIm$hUdJEZV6dUFF^XB;8e!fgvh8|>$fH` z#RXZI=J8{w7#G#_78Hq_?K;|gv2XvA?p+1JX{%*7g~afWv*>x;{3W-}*MlTt+dxs= zpkN@IX3wErV5sZ(YT}^RoU*D?=B&TXprCz}>H;?lYAW+bH%Wx_I2*a|m5VHzuohv( ze0qT;>|gNOR*(#XK-K6YJqrn4aM}R}ODOZu$%WThZ9>p`AlVWoF^msSao(c0h_h0& z)d69EZF8CYyLlYqKI?{P34G$2pcLKuf3tujSsZnXCWt%UjrBYVtjpp@oz^I*yh=C5 zW`aA$gF*8y0oHX3+8;};C=@i^kG@Q9+0{Vn`IXH;vBevgDFFd;n1RU^dGWy8=gTr0 zH&XHd&7VoKR#XHULY}b=i?Hc#Ym~zS9q1KxE1pj9YWE0Y@@?vQ<>xLS+Zs9#gliF; z!LekiLjch$o^YQ{$=AW3NS0`IM!;Whgml)8@_miHpQBV1?bu_2{5CCUC|+`yph9RW zn%zV~o;GO~PJRk43zHmj)|!=CRB39xSz^KmyePYTOl7nJaOX_Y>AZ7l#j`eUj%nu4 zKJ!Dc)KC`L80bRA=2{0}+1(IDYmK;G@_4Z-R#BFT`q$Qh;t2V1wZq z29k=^xVDQXF77P;8%pYRQyjZk80wa#aVCWxH1J?l5iv}Xgl3{H`HLy*#Y)AB;HOs; zw;#~`$+OFiWw*Q2u#?nSQcDb9Oq|u*V@_!UF=H18tS~Z7)^uKk z`R>o9^;(%~K#0hJO;>sXp?#3n4keLB*{&mV41Da0aPZ8apI-A!d&U{t+9M9^o6IrX zd3P4Hj`dfh-|&67akC(|LO`vwl`P4bvo;n}N}JgesunHdPpqWe2+wuJN{0$KyNjCd z8s<>^RJQ>Dx+N{3&*+W1$K2DzbSPIF#8OzE>tNJ9kL{8ns@@JvTiW163?H44?e06C zVj=NmvAl)RQU0uXb6HPGEOS$$1_97k$DCFzw@N`q2fCCitC~Q@aGVm;AA&I8XvIyY zd*-Gh133u}ddZch-v@l@B3+~*MO`Yxi;eo}6j{nfkkU%(hcfANQJyQ2!j;Dijr@_z zeCzXpxqXPjlX-lL8{Zoq*CL1OKG;qc4iEoW!H#{+8bMsa!8q0Ghrz0QPC0twp4O1& z)o(Gbv#N$2#e4^V3hdK0-)bHrb4?*_#k(Z9(!0iqRW&2? zb|iE65dLn9HX!k~ac(b=O1+96;f$gsLrTTwCIq3Ughljn`{v);PvIn-io=z%k)8 zOv8<_A^{t)`=@CJ|G0|Z*Wa^)`NZCXTT zaJmgo!JKw`oTeZb5fOJZW$hA&EI8d3RFgY*VKm(ZG5k|sli=_AoS3FUa|kf>mK62l zu$zSo#Pk0}h?}zSI)YD`8CY|f1IoPSm9|+5QjK($u`Q>T#?Zm2x}kLy&zE@ZQ?p0R zFh@ns_DQa(wPMK7f2i1R5iKAY05VVbskw83MY{#x|2yQe8mB?9QQ@JcXae$$7bKmm zFi%|>Lj^?sCEj}&xzxcb>CQa(w6PNwfU(Z*+(Y>bx6T@wPH>mo{0g`fXK6*+$;BnZ zB}A{vHA+Q57~qi(2cgzRXuN@;sjg+_C~-5XU*3RK-J#NEUIAjEb3%i)@hv7iVF#9G zVV?iIV)ZN>a{b;biBXWtmXiHdwHcS`AN-}=xu7lYdfwV2VEh9R=0q~9C$=ucAfG66 zm=9Yg)$-;ZSsDJtF&*1aJOl=JyZxP-OU4Wa*l*sh(G`p}Fj-hoa64w(yGs;FA`F%LR<%BfE5L0Zyx;RwqA32`rDM-T`oY90NWc~Zy7RTR1+0cHLENu(-3%$cO$ZN*Y*H&3--;G4|$(o`3!_5 z9N(Nd$ukrbJ^pB^|LT?a^dBuKOZDMM>d??GAC|TiveVmhif@E31=kItPNb7dui}?r z9GuKU(aWhqF_H;YbAnH95kwzS(_njAsIKfnPWQ%qEBT`sG&Hh`{N;q9EsJ>dYtpR#oPhx>EV4PE?_Sz z|E}ZOH5%xF_`_>7@kw`~0h!ILOS7v0eLdZQ6y;%kP9S;Y;7XH-VE*~YAIZtgs@{s7 z&NM&%&k5o>if6~;N*5JYR$DUJ4TP=MlefgCK5JpRLExRbko7_;3~XMCUZOs8X2!F7 zj*ReoxIaFe2!#kgkjPC~^@D(v+!8bCwLmv9tRCoCyBL8WbSqt0mt7B74Jy0?@>b1p zrxj>+4f8HXbEiwdWpfP^!08-CEO3}3vMCQ>MMuaDoyuhu7=ox>o~T140(<>?)?@ z2?Bt6+r_Rsa*C;1IJpD0QKfj6!CMf&$hGfWHgaSd3eT^r}4K zdTDaS7xrO*7zBByQ{l8?49g_I0LKb&>6F}h4|xsr=7^@PTiX@%N33Q3Ge2WT_f5jG z$8C>J^DO%5HdC&ojeKc2o#UmdI#aaDR`da14Km%e<6%!lRa=p>z^$8H$yGY(-E-uy zpW?`S1SoFao;z*v09ekWyjNY#|MnZBg*{xfj{oFnA9?RgID-*w_RO;YQyAo49cm=H zX$Wo?rHtmb_f_&Z_4bP^vE;sS266Sl*bEbcU&4|I&|;28;>WKbDBv_hs-W7?F45)R z+f75-UXBK{?}d7Xmto&{#XV@E@QM8=;bU`+F0UWEjS5_bj+K z6(+6J|8?hA1Em~%O7Fb)J{Z!M%opm9qq%_sT(uOk`h8DqsHf?|$mjnh2KxITuq^8M ze?Uw+#84@EV$Cgu@&soxH(r7>(3wCAxIn>;l6s>{Og58>*@y>h<$}c&lNc0}E(5 z?0dhQ>BaW}WHD1eP8_j|?kQq;K#MHKCmCq+$WxhO?lnLq_9v5XjhmQJHrB_f8o;PV zBdzO+&)_9JhHN}=S)yGkTBHa6J?R7nm_V3z`m%y!C(QefYQ!qG^8di)XDBj?F z#E#&2(L0Ex8~lgWm?R}>G$a*QE24mE$dd*vSY=ggCge@K#ko~- zEED5sf}V#})@nLDnBtQl8~rg}$3@YQ8lWo!Tdk#*u8S@TNBLaU9UHI0J8cLoat|5b(+wVRH!RVUdXdU;CW687;XrwBDb4Ahb zRy-8AEg%)Nkld}#mM}!fv!1p?+BkoDpbN5l77shq32r8xqYr~Gp0Fe(JV8Q zIciR6xuRTBpN9;IKhbB6g)?rKb!5@AZdSIFfuj4jiRe~Lz9mIhdIO^193wUChQM?( z>ghByz#g2b3ct5-oZU6>-WU_4Ktu(8L=fDnisvnm3NLx`M~qp;uIkVt&*McCDvx%0 zodX#!6XcfhUp;X2yRH&MFz&*;cH=tb=Dto$ruI(@Z3#1NQh1Hp3A?398+&%TR|$M~ zI!DN^HiM%UO8g>F*k%CcN`^djBd@_#KIQlCpJ#YIQ>+xCE|R2t%siZKqpL~xe)ONY zKA1E1%wug7!XPL%@8zgwYzqdh;HYMwSVHah zXR|*C0c_JA(>(;9&)mHy7?FDi6j7aA-LYYX<{&`Hknfu{n{-k>b8^zo3DGJ!?5^~_ zT5PLho6M*}cpih$#ZPB(%6SRDN)&%{Rk2)(jh_32IO8;;velCO(rHAD!g#=_1KM#) zjpL)-_zRrLI{S09%8V{_99T(BZSjdGK(l1tS#@>VYZRa`3bNi1(eE}~2LI;AkK&OY zU1OvjD>e7%aS`zj9s55jl&Q|omw?{}G5r8ScsZ}rbMv){1=+c|)<7TMBV+sCOy^=T5=71O2iGX!CJ z;=3BUVCLRcu(I)B!pfKTJo@!l@uxS?-S_V8c8xd{!07jSzqvm-lS|Lck4*vkgLidO zef4dH^fry}5=Ib9`45(0wkl7m@>J5J!T$2*d5|*PV?#)ML~C`4n%v?3xjwz9JD`hZ z9!WZ2$b%mUW1@YzenO9jAtB{<%|lz=vw*lyb(F4>h0J2(hDj{VQ z_i5O)LMi@aXY6htA>g)Mh>gDHx7SDq$$B+Uc8d(BNb{#@6Po*NXI#CiF8|E}up17Y zyBwH~`EBE7tuKgsd}+vOHPrekn7MLM7fYzi7k}rN8BH$BGlz)jmBQCEZ=SHRi;%oH zj`L$`Yxlhi&$%w#L^^=o=K5p0!APT*Q=^QO^hbdcfU(MU(65720&9@vMMEHEaSW?VzlDav~*AgUqmVM^mhIF8 zPOEFQ$*g#Qb*WBSpmxjPK-{a+H{IIMnpK#1at<}vw?bg@ZlgjxiCYh3Ti~o7K4Zzz z-D*ibuqjxV*%3lN;+|m7!YszQRe*(!BI^Ug`83k(uBi4+n$;Oj*PY780`NK#aGj)3 za}}Yv1(KU#=LG{Szw6>#yXO4Cq@V3LIH#j!H?j>)_Kmmtj?b%2_U#t4xWf$eL7Bnk z=9~@O1vvVHL9*=DoSRic1!0}9<`kJ_e2ca*>9rV^cp?e>IF*0vVm{pTK?7|^cZZ$e z-tvD)BRH0>f%GfYdv=@t5xV+0G3Cq9cd!bgzhQJ-1yLM*wN+$!y0W1X(BP44{dT3H z{MQFm{+jXcnnpd7J*1KTS<)OYn3h0`0J%nH!SzKITyxGMWXhUhMUcU%H%zL-E;u9y z1r-mbpv@IV9G^FNp#MLlin^wv2^Wr?w>s&;|9c!?-~R(181~Zt6(3UNkF53%an9Z%+6XUXp1*~J39Ege1NZ4uZ}$}KaWO+4t7`He?MJY ziJrGF#UIhwMbYJ#eus~VUzCXX1^s|}nkz2{R(Bt72iZywHDpbet$xyV+&w($nFD}7dQ|_ zObEl`YV;C$tE25WCxXZCp2QsKO$;_h+gQ3|=4w0sshT6IFF9pMqE#QqF2Tz((mR|C zC#7kTU{aEhS_dlnGSvPUSQ$K7d7;$tYTY+yVG-9?2iO$Eh~p$t03q&}6m^?^GsrfU zGLw$TlFMjmD1_e3`(z`a>7GDn{X9B0VkB~x$eLUs?94#vhVi3XmylZe>EVuVl~=mC zfjt$fHEnB2x-=jpSedOWoQ8=wRAzm1{n z!lJh31ymREc`8Z<>izf*EwTsTepu-TeM^nJA{kCrQjX&AT9PCirPIUC=a-~T|3vJg ztgDL_Zm2dyp6(pilyRl4d*@BHU8FJ&RxX-=5zpIn)tG93#0ICCJAX4GB-#-!L&M9= z$ubj<^qXKblm~)NV6W1*;>kwUJEPV=n^+=_f6oV1Gt^ou6szkd1}44*oz^KrZ97$O zNgLQ}yAIto?F_b!FU^N6*bj0h*Htjn+L~C}SJytXJ?#`V^2p>p7&%KxRF)-7sp*jj z8Fk;uD$Ri&T`(2cq*!lth^VSPf5Tz(hRhKThGc!K*OHG5T#UK;`vykr1ZIl?$?~@p>^PEYKklR7__{r_l zJT-p%wX>-+U%j{s^5ZDKTkkV!Q0<) z+0`#q@$}-IK`{^i*5Mu0*b>ZM!Ezlp?gQd%u>~y-j<@j+aw&NvnXkOn`Ou)b1I8+G zW9yPs1G)xhHPo4UySIr`a9e}vNGri`yC3S6L^PSR$Si=>=!#BUL~c1?yr{~3k@D{{ zGL)6%2v}B!IByn84*EJf_B@V(y7;&kSr9=h9YBo>m;uq#+$o0AkI27eK2cf7$-=U3 zrotrwK8oq^pevIo^X)t6>Wv=p{f1%_2D|cV7gU2s4PgMn)_YX>-(Am4Nl! zcrGyvUMyDH3;im zm^9Dam0|lW5{Utpn}(5>9533?Y=i6caXS~~=|&wMc)9wcZWC1YXC!+dkWv=S)$67A z26FqyAl~Z#sP5$UCV}QN>9B?QiK;_%6LHbW;~zoz^06`$nK!*XWWP`t@2YUTqHr-x zNU;PrE@&Ny{8jqIk)}SUjS)?Y!l!@NLGGiwACk+?%Rgw3+0i!Yrqw@r z4&!eE+ypa3wJ1Yx(TnOq13(>klrtyFBwu;iP^nIrHNjGPsBB%>9|eVkrml`oerGXy zBxK7qyopRoWhuaM6A#chYNgs+??mT0^z$|#o!9O`u8>YvnJ(e87_&nt!JXgr#+HzR z3JJ@ULe&HSCgtpnSs4p)iYDZ890hFwh)l1Lo%p(o%2yWV z3+_zl+jb@Kv;JMZFivFww=D8VR$(YVolb$n|apb7E zHg{lkmjyutVQJCczmepv)x(Wr{T5wx>M^Jyoh34eyF@}W5wqI7t5@g}k+%hAHd+oVRWJXockUAj*2*T1(JDM!EG4tXoX!!fVn{)fxF z=I$ePoTLO;1-`X4=#!@5GX((&1jrYRR{nNo+H@E2+;ZVCU?W}029=Q<8X&QG$(|yI zXyh6eE0+wVgmrQ|TU@!qjT&mghLd-bS2=w!BO!{?1aQHNF7{1Vo7ih@FHAO?O|Z3R zrX#U&A{(dcC}l-E$Yh?;+M0$&m^yJwx3m!}IWS*6Aab?fXe?ZbdtEk{Hh{V)s&tWb z!D2E8T!u`1pPh9%(I4&)^7%v)S(*2CNUSUiF};D?y>L%*c6oP`t76%J3K_CGerD@j z;2&uQDmKH&R5oKJJK}~V0C`V>fAp#3HvvCMpOL#ZypVyLKj?eY&VJzS-Nq3;=ADWD zuVxgSH3A#zt_7y2zL=X|L-$;e)N650`-JLh+* z4!p_C=1_XF4TBXTU^zM1e)#>E{&3WI41nSC%B%B}(T%ybBfS7q&X`ZE3v_rwED>nd zu9Q<{@yF7V(g%h9DRxO@;X)xDY@qXgpbR{G=zb${nmsedT%2UXSf~W+rlxjwE6sA@ zLw^H8_gwR&!_q>#SsqZ1ULdm5!lcOEj2LMDt%A8`m(VTHmhz?j@;QqV!D1D$k~E3! zzP;pJmB7oFIIjq7M?d-pWtAUcd(cGdYXPHbb4zv$gusl%xC%?vg9dJivtsc)mb5FX z{2`xdm$Xfh$VY6EUI}o4#mjLgzm>^ogkK+1158D3N27D{m^%O9%SZi^bFE}g_-Z^w zXyB@g%0o?48KYjVk_L1gCIz0l>j_)0n=ByFcF-@C3zMOSVy)^b%f2pkS!Z4$y`%B| z$*u11R~R|w0}>?3vPM@13K8pnp<)I*?I!#kk*Z&X3&sL*9baW1AL^Rf;1$V!9UkA= z1Xq5RT}&6l9xr}S-sNa6@fDa5TXqT3}RQl*7vCYnwz`oR6C&(CXb z2eo2=qo6*7Gt1_l!iRI#iFk2Xa2)nWjkn!t^7}~gqb{={y!U}kt86rYErRbWq+^wh zzG(Q@%VsMJEU*-o-2-Z8x8W@O)~Z~M;qzj|gj1hzk4Ltv5L?pj3j7!0fIAz4pmpTU z24uNJ2~OM^@WVnTdYOkYOT={{|K}Jw7t{zu&#s4lx!5#IU~-#Kyh7-S@JV%&^!^D) zZB>^0bZINwVK|ImR*e?g7d}-ZHt&`E-ewX%+!V-6S&MkvU@=~UXv3>2PPTGeog{$K zlDbK&&_jKII9lHg<_b#OLN(QZ6l&7ki^G;&m#1`jRW57w#$Q^R!*3~Ge1ONbRz{a;IP&Xq?3A3(1=#KtUeSG1{grs*dHAGvdS>5_-Q7nX>s-^l*|8k2Fz-G~66uuSjQN#iw9-0wbYgxm4GEz~ z#?#~ZvdTd)7yLu&{Z9{=`SB`)h}BpNM{C5(q)C+F$}XlZV@|ZBfK^~I$xN%k*tKsO zlaZVvNePX3>Xcq)C>aYwWc7rcnD7py;ejcpe0hrciuK_(G>%b64k}Sn_N6! zE@vSDS7C!fw48t`M}Kp2k58wIfvHc+x(US^wQrdBhUkGvzh&&e2i$nsG51tTO|*c# z+;WsiC0VbYMgclzOINa~xv;TB!QA+7^>S%^Qx%gtZSjBlWlBMcgfZBtXoRp>6N%P~ zyizI#xZvHK(5IF;$*Li3+72VVI0s^a*_kppYPXhO~{uO1Nh*k-&A zm_9A=O{m}I|CYn#tFRz}4AoM~~SoID`LJdIsvtd^=%>e2~rGb0pw@M^876Wv;h zU}=+3<5r%vLL1$~42V~|{IVqu<|J8*2@1X)Mgi$`^4GkvcIF(3__@sURKlSkLIsuj zSr%#8uVjDM_Q|-iqV3^8rT22(=V#uUi7N(I6%4T8z1?xsiOdV*A&mMk|Nnh{e;h3t zxQ*Y-<4c0)f}{h33t3yw;LI|ECFv-ArJTmOnq>}uC}Q|nzhrrEp2YN1HhjH4&VjAd zv;XV*yUT(^Fh^REV+o1cqe5K+Yq-kk=lVR-J8;`iSr94m4}IaGg&n58*H@VTF%}K`OOZ<1r zB{#b$05qi)7#iDLfhRt$oLB(66M>^cCXV?=6OL#^xYQ(~5qQPZHrDVQ!)gD3L_Kc< zwH1IK7nKu2B1a>tBKyl76$_B=pvG;1gv;4(73E-v&^Ew| zU!GqiPw*N7)Cd5!i} z8vb)qQ<35s8o&$8qTGe`Y7^r5%R|wdCq2v+1<7;-zY3Q8uxnh+eo4hSO9-|TEBr&t ztt}?tmFjcMOXeLaLq2AeOdsBDQFped&Ma0?C>s9+l&FV9pQxL)x5&A=Bt0$~CP7vI zf_;tR)~1b|@V1yPIe1Lus#`PT875~a1J*naGBWN3{i*_eJ_x7&JoPJy+8tunt+Es= zTTj&X_peB-)0%q;Ycgt;Hbz^q>jGoueO>E}5eo)}>j}%YkC-ygP9&Vn+5R$Z#o`D5@07i^vbDp^qJDFS z2H%gG);N=4Im>TbHHm*PYvJCe^HNq6xK8#f$-f9ou6&lQazx9P*uU?7yjFe6B8>DL z*&4hu0VZP}OE-4^s5V$Da=~ov`}l%*@}@ithc_X*-%P@el!d?)78H zVfzlD?L$yhyVED`yu2tYUkPjJec@>1&~EjHN(K#`on1i3YU8O5O~{2_M+3?rxm)R0 zzb4Im88YA{LW8P7O;p@t$aQ)AERcOp@{oy`Uli~h?tD}j>g{J)|TrOAF+ zeHa5=Bk#bc#4KI%k2WYP5iFW@d=6Dn@hO1>uBFhmDuZLUcAwcMh6g&sWxys1S8ZV{ z<$jFk0WZC*)LRH;$QXy_)xwr!8(i3C%k(Pe!iYq!xxy--uG?#VhZ!c`W3o znQ%g$aBID4VI|q)F@fB_;h#|6^QA+Rv5gGI66McFZM`)$5m0P}s$e&02J`n>JhbX8I)&1tweo`?7gcQcMfu*ty0m1~hW`euYPmcmM%3pQ-d z9{<9`yc}>vK9o83Glp6i;ij>NQg6cfMTztdTG>oYHb#&qtMnSRmCfcT&e2%X*-R$! z#gSeHyI&4IEk%GoaQK`(fwRddWw(X8> z?AW$#8=a1A+qOEkZQDtw`^)p5_o?sHshYoFRoyjfjd_pj5>BHUm|-2a+n2&B%Z${| zJ)iHri7%%IE_;ikRkBD#zJdZ|RXKhFEG7DDYX-jcvQBfl@^Iik7V~6wUAm&)7@NNE z0RN?B1oTF@`Nt>k)!2GCVK53!~Os8LF9VMu-yr zB2ZRs7}+gjH7*Tkr=IBd5H+^zs6e)&%}y>tw!`iyycbJawvv7eC5}0Sm=Lw5j(B2S zl){&Z&&Ia8uEy;*KcBQnE6^ph=pX+|=#5xYj_5W0F-@!eyzm0uhl+(CTFO|KP$uTj z#}^5q-!RFqRjc?b49&k95uV7XO7psVYxFq~CotI|+3WlWd}Laz2UsTa$+0n48HV2x5VOmJGeBX zvs=A>&i13g#l8`(5OhAPSkKoT2-oA^(N7wZ9uFwVXL9DWBEZHQi@F6dgV5-#e&p0; zL?CHRTnZryYymY4OsUtPXLLXr;%9(qWEBMaG@8_L9)N%9!xgzvTz!;9Qm#IYeGI%{ zqHeGdz(=#x1bxZB#*Vv<3T$6TQTPZzDkGf6{VDyONm49&63mq+sagzlIag;#luY#w zN7G5zW)s4L;x#c$3%p?Do5>XYO9{kD7SSkV5cKS2B+>E0@$Bke9IK8i|%S!TKz>LXoF!8=zq^|Pi2C3eO~`# zclf`eH8Yb{awP+Y5L;B}`+3BZI5;&cD0DMClZE<}o2%69?oge(?>#T`k40qEyj zZA}vXCEujLwDSXdrZq~ohA#wBxbnIuF^@aPNh~1C>iK=kCSoz^{pel<8J~8depR-U zVAbQaX_-|AN0q0uo6xG<|K{T1LrsRvd;F+nWq6c4>eZbkcjqbYZd$-Zn z32vt)2+b{!jY>x(Q5f|jHU&?p&Ki_T$P2)*I0g6|t^s}%kV{K0+O^PO)k*zmgB!(G z2TLdYQ(CxYP4x;bkeS>NgsZ6+q~ZOzgygj@OKqK{+#xUJemO|6wo(W7SQ4y-d_PRQhe(d;jem^{J z)fC`9H!lXVG}R7nL}%krBmdE7*h6V)Sp>{s)H>Q7uoU2y(Tk^AgAxug^t5Q8rO3O! z{skUn&(FZv7#JxKW>oewitEkq8c!j;mtVk#%97iO2NHz_EJX0!t^bPGKxN|*Ky?v8 zWh~4(>$WNvf;pKFn_4%lsmLOa8e|3_*yGCf^Tj7&ndKh4R_rI8K$z*tCnN|6p1F3q zwp?`jKioN~Vrn3{|6<%vMaJ3%Ie>T&hOZ_NCCS1+0t zasoDc5+52Z?ChH`X;{7Iu8VcyOFAC1_iLJO{t5dxAQv*+tqd)@+ z9Nq$V8v*vjF?|W4mzzoptbuMMfe;UNhD7;n`^1-(ro^jKBK0zB2lJ!Z$#zevH`tV5 z`g4mx?lk(QoLH$R@e0wX%z~;3D5Jw_$8gB$ZZg$WH{JQJA!G88<*=NS$@vJ6vuNkT znTKTj_w+RQf*5Sd8c`2y%K)g>iFUi3kE3&3a&%_-pAl*he{1+0lfX(axpPsV-9>NL zNc{i*(0KcwcmL(vv*%w?^J^%2tMIPt^At57MnuOSnkyVFw_UBoN?-*Z))4yFfawYz4R3OI)%Mz4)`IARx;W@ zC3^Z31XkUK24e;T)f<|B-slpMf8}D0IQvstsJ`I8cv|hqgnv(}SSp3We;Nsw+T~D0 zN>zQ1@Zeq*4y)9JYb@L~*-g9g;EXWJhw0ZP&+|$>(F%!ya!$?r1L-gLZ5+u5uS5N* zLhZE%5ooLEnw?Q6VJXY)eLMyZQ30jFfwGgx2lak$;tehjCGX6dOW}Bd1g$88e;cin zkrPZOnv;R?Gom6{uJySN)nI5-*`h&JLwC3YWAHnBuDg(fPT$a^fmc#Z*YSY*$paH+?h@a(X^H z+(vAA%(=go52<*!?zf8mI}0%2=@Q_$s4NEiq7i9yoB>S27-5Lp#MvUm;jkcgs!e9_ zcms-xwr%9M%%W&hG~`NfF+Pl$A>&|*D#R8zIHqc9)E%=6*=|w5a4JG8!3&}y3}LZS z6f`>J_C0Fo#Mi=IDzMo)2PZsANS{8B?vvh)6HDH|$>4;9H?qqQ&gxS?GUUE--?;8w zU;1@|XQ%SdM`zzcvQ?z>Fssbozt44OVubPkj9Fp#9Bu6qMn4<5P!Z;%;F_|rXGv&t z>6j5P)Y6623mMfq+0XF-*jG-L?3*27z0rtEHwenbzx;hZhNq~6CZD3zS_6@^(x^1a z7%`xF4`0BvyX_<2Quy8@-Tnh&{iC^Ipj?<&R}2 zroCklVa|Q~<}&kAxF%&Q9!h9d+CY(Z!iRPY0|&13W}_hyB<*Q~_Yy~d9HAtWum-o{ zf0+c|438w;nga>zXFM8+T-pB0L2U@kSd>zeB+7{3K#2IR*1f!f17>#LsQ&E{X+Ea~-!HZWA4aygWo)dLU!QU}$-OX9jip)* zqv58cTuFGa+BK|nhmt>f@>xsVs|-Uq zhsQ)nrkzYiAz^;@IXzPV1{dd zhJTYI+=Bz%A>rH&;T5apOFVNnI`wHVT6HPWEVJi9kxVJ6AnF2iUNwtbVRxhBc>X4< z%0WM+0QHu?oT$z`2N!b_xHTXriTjf+vn0>2)d(%IQ^C#$TVPql>4R1<69=;@-L*_7 zQ1S~$X-tv`v%J9R$l7Ok&(?JqhMfy4u!Wl$?v;%+5BU%0oVYvpOM3PR+(kl<7H+t+ zDP;2YjcW|B)O6};cU!Q5G@er;5Db(RG-<5T#G9_p>3BJU!H7xjp3K2k_3q*X6Xbva zZYktIxtJ*EcAPxxOC6*F z>b&maqV(69*ebOscahR)(AA=x)CjFcJ=TjgHH0JM%ipZ_19*=XMjt6 zA5~3dMlEsTkoe1H-&a_`JJY}ADyE*di|frg|2?qb-#PMBe%rBQI<*g#-QK>g$!1o{ z$XvP@z+P>J^SmPeKD_X?@%j*6&=lI}=t>$`^o9fd<&EfQGmoREwnXR}TbqXIiNqDU ziO^bnhbRT4pXe{*E#%DInM3FkU@C>qfv^}<${5aT8aZH1*)g_J_%wxYm4ytjVKC+j z03^*K9hqEZxX#MLBaLEW+o&hRvrrf6wxbCY zzZ=KMU&Fq%L(#R#A(OIQs2g{blP|5AriL<8z;-!;To3;Q^*g zR-5z}5Byyh)M>vS^@f2CV7z#T{U*I(QMzYl6SvSB)=CL2tWB;w1r0d2{Olf#P(tF& z+*2E}%4o+hCq!nhk2y3Q>oksKp_?umzDG53K~0|3l%C5}ngBX~bDV}ZtRQ*U50?`r zm#sepr-TDm^s&uE^FuS8O=Ljb$rDzTOTGAThM~7#LvjLlwudj~-F4wcUoQF=W{_?n zr=VZqe?5r)`6~kU&KNsDx#*kJw($Em(}oqw3mhf84^?#f}0K`yxo+wi3@JW$cvRSRs>y-)3l;L@}UPxP%1V*Tg&QLA>v|%~~v1^1gPL!%{X4tDTN`tC!>iAV7JB6+$ zA2kecCtE8E6^Y@W9NC^wE6qz;h*qE%{uj%Af5BdsB6E+FE@rJ9XNjwM(jgZ|*q%d9+jvEArUB6Z%uan{kDxv(fIh$H;$(on7px+LB;Ec@skooXT` zu*wH{R(4H3ZCGM*2cyHy@TSj5UDeAIENVh5J%prA9{FM?FsZ}vfSxJKkU^9dy`fsJ zV|A<2hAM6u0dEr^=MfqfRK2lWIyKNusTY}-STa0B%p?8uc^6;!0NxX49trjiCYyNv zg%M$7z}XEZI{3;LA%f?U^%B*}vt@nJT}le=qzOy~(umzYfv#QdOOrC-*i>WoJ=dBr zRlCX72qS^uk0`Y?-KcYDK1sAejaeC!MmxpETlgCAL3#-EuukSnlv==n?7f_%DFPRD zk>9?E3R2hoK5TY)it_v*^3+~I5jJwpB#&!jr1@GwS;4|;3 zvi~2$kZ(Z3w@2XLK2v=F#`?X)$HEgn+l!nox_*b+5X)K} zr&FhZ?XIK`LW{#Gd}P8Dt|R+*M9SL6=>bUMM3`J!;I?b9mjO9Z{k@Vfi5kq=2~46m zcaGXkzNprbbs{Y(8_f0Ml@Yg%UYh4CKB>;g6aK>qHV^Nw&9Wevbpwr!ego-Z$##;!joQt}h>#yT4=pTr3Z@rxABa!t6edh6tlm z1s-#5jH&Y%bMyXqfBq&nz1ym*kBrQ(*VwG)1-zFCmr1hS827dZ+}h`wsR7n^cXn~( zymRK@d~u$su#%Dr{vj+CY>UCml z(Dd{o>1c48(c6yVGugc~nq|4--3@#7rjsKkzZdCAWtO4M6GUr=;@&h;UnF0sTB-6#e9AHL`R{cGb;Z}46MXWXdS0`}p{fvBI5(2MJkBXtaM08$P~nm zYfJ&qvMVYw$_n9bW=$b+ET$4x-+^^45F1v|o}*~e)Jb%dwL%NlJcI6R-X{LZ$iMZa zh(@J?Veez&gunZ=!7g?`_Rfv&7Q*^fN;0MIrgOPJsOs;*nM{LJ$ zl2Wq9Y}p87ty!PwBuNJ^jN7R-5>UgTWPq9Wt~WSI>8XBW(BB3JqM=}vt5M{Hudlqo z`B;ff67L`O%YqWT_mZpul24;-Wo#^~m$pk&Xf7a?;GIPWO?uN1l>Iz$k)V zd2JTVdcd11wq!I2!BcBDgYh(hF#0b;S?$Fdi;3)^sL;y6%7wQL5AL}i{ivr)$<2a{ zOydMXZKW8YY_pI`*VNnRFvmPv3go%bbF)z{YX#5cBZQrC<@0v2v`49cwklawJ#|Yk zLmP#Vpx+oR;2U61s7;7kb?4`;@+!>4n6a~~(_?Z{B^~+<&$hzQ!Xthh7bw3Mg^QzH z7*oxU$D34nc#2>_4^MDe1SczEI}M-dS}Q0)r=6PhR!l5twF7@wfw`GgHy07|1oQKN#5^qw1ph8Lmr4KB=Cdx{1xiU-rz0qgq;%3L;d{X z?Z}da>aJ8$nFDuH}%d1CC^%>r6_FQBr&|<8qUOJ6hU#qA9H=B9$OTLbg3T6Zuj=ht1|_XI9EV} zZ+8fgLl)eGv^q$Ea|gDeGALm@Xgy7$fdjBb?7)q6RB7o@0!I7C84F8D$hBMoF*~ts zqwCF#uko-~ywoD1M~to2u_%i(4i6-LmL6wySOCh{^rDXk=l=4=pC^dPuc=}FcNT!J z^<$mA1-*9K!+a2%o^`t*UN+l1cnnOyP`7oP)tdm^&Q{WkuZ2YxtKP8;G}JASvmQaR zjbB4GIbSAcXmmC1`kzOBU4OC)b5ia5Nc3%5%OmHHph>lh48~6fzf95y_yt(Il`CEu z^}?f$!)9gm=vmaZ{KG`?qzF6w&)Agf~4# zWtQdTcw3BaAT8*F?d8KCAF?6~3uLIh?Qey7VUSBgwh(PkOSPpjlGldh9gK*_n3ycJ z4$Qmnn9z)?wI?vPU0|@tNY7m44{Jv!L<4#8j|8ZCTAm@kEI` z?NxHd1~zaqT=LsN-|?Ltn7XTg{VAxy2qfx4n5m?hle;R1{A!D&4@Z^X&{YpK5_@M< z-Eboq7F(Hzn8ReFz9Er_16*j1Ov03Ab9_2mUD}T*;ei^b=>@zk&7<~KtV7E=xjJs1 zOm*jyRTt|%8sm+&pE;iFY0H5evX>=Y)Qk-SyNcqQx|qiN+Vz8Knevm=$gtrVunwM3 zo>tZ}2B&5rL`sbf30K2j>xiV3^t3f`XgyR|e{eacC+h`V$mD}Wz&JE+9Z_pC4x{m7xo`=Adelg2qweI?WW+g|m>x zN5SbaAQR{=DhlLyR^sv6?}N~t5fB7%n;GRm9rnx6l*ovYP8_@+^E z<2QW>%({Gwy&op~9%fzj5I=MD1Ek8H=nURzQ{*lZ{I0ylb}x}`w>mz*|7uTb@fWz; zo!cehAF~{KM4Rt?dHvpxH)jPr&=zIt2)3DVY@R@oU*IiI5{?bQo82BXYcW|BhAqp^ zUtG~~(?E>Cj@GHmclD~c(&)u3r@JZO8f-+lBJOR8nTTMruw(_ zHp}pS&+X(!@7GaP$e{B;5K5i>^AKnqJb(;9Bx0>`7K>(GjA3hVGyKr8du3##IlBng zgXE`HN4KvFrx-}D30(A5HNk3WRQEoiS!+?TwsHs{V~kq2um)FOwF`|=4Zbv+v{OG- zsoTsmyNrdvyHgvK>k8cqhPK8^(BgfMS;#U!D9n$ju-fSXNeu#sVF5F+o*dy0gg)Q{ zzr9(k<&EYKjatRetfFdu!<>Je)>1?Msg1t&`%a9|W9^T=TmSDQ>F=H}+;qQkC?fB| z6IPW%4rFfXcKn&02?(rA$spDcy`ndCrB#={l@%6Bdx}ky=^lRd88jktr5v7PN;7zT zJ!UeraD{8m<%0VTs?c4^b37^RsP-i8ES+u}xF58ao6y;0Ip})9=nV|BKA0f3b_!qb z=toKtn+uB6^+KMP_Kr&^ypyCDfYY;sTE&n=KQekmE}}Eq(rRx0SEP-0{i%FYVT;uf zIOC%pkNPOHbcq?4ZF4eM3C&=Nr67uuXzabO7QU2=_{6*Tjp13>+BwPgQweb>i*R*`^g<1_QfK%9P&|=B%%XV>dfWu4vc1j<FdVAe zLgFN-u}vj>8;Q9N3VFoXFg4o^a;WH_O6*Q@n{*qQZ=i-?NzzRx8|&n-UM)}S{jA_g z>_nUmIwf#f)Ni<}kR#CcGvT8y^SYX0f+;@gsJZ*7Q~Xm40#83((&%IEgZf?J zE;iUnIdAn(@A)4?>lL(81&=jcxO#uX{hU>%w|tpcVco9J6}h8_f^2QU>rD0sC#!uA zLxd)v<1_@VWj|l2POT5Ve3Ddwxxb;5Fz@l;M9f$?wjGYrNa0rfi<8PT7-_N{#1=}6{c8!#~Y)vIgCqU5EcQ-OCg z36OF>QYEijneO?>C^jeu(bZA0K{!>adcZ9-s7ODP@&VNz8t6=32lXRi_eiow`*7QZD!mZN>C%%#-Sr_V=JA4$}L-*~}L%r&en;nEEJ z(teQC5{W<4r~eeHM$wp{Q{0Ty){%+8>B#it6zS_-B$Fuz;hv(?PF;b>w$T&MmRLqc z3;)quSZSzpRf~d0XDMz&RkUKD;$jR_BT9D-ARpA`c7!If$e`rDLLsdNx5P3)kv&6>9`#%g%dA$TM%cFzoXh-ufx+Mm=I&*#DMgRt)MD5G4dnQx#cXe@ zHvEVohKGC(WE zO92i^nwKQLx<0&x{(CJ$p%v4{?EILv`*{_Wvp!wb%9F+c?pUL|YYvqkNT8!+_NuuvM$8OTlH%uU^$>i}2F``-`lbbFg zAGFPsZFN#E#I|FEvoN(oXE5Itq}G01q571LP3L?{IYbG8kC~m(nfE`HI`9VaR!0sr zX#-?DO1!L#C2g;^2W>J&grK)2XRt?Yidkv?m1{irF$_rx44gX93aR;eF@q}qv#Yqu z$LfmNp8L7nRpKYUZA21H+OOiO<@51#Ti(eS-&@0kbls8-7}{dnOO(($ff;_%H3xR5 z$zDY>z#3jYS@XKyj|rr|cL~VSS@Kk_54-Iy|E@i5hKuGS zBDcgdB)`)NNA&Lv$*n7gesYlbV-&A0;JL~`uU5rpeXo--bb0i&MH79-%3M8VC+eBn z^-T8w^T98qes?UI+Y9d=m&&<54s)wMWDq&snp5qttJST-L>rrGmgZfeNx5z1x2`~r zKmDkO<26A}S@;bTsqN5QdiFjE-ky^IFVL|#@|;QyA^11{4H-0T4(E{aVg9d$QD~;p zgL#4$7ofdCP#ceZOeF$%tA`*IYr(%fdrB(91Oawv!_wvYNX)y_$IT2#(<)ojhH6^* zqkt_8fdl`224WqW@shlhnrh2Wg&%*OBQ9iC!dyYms=}_BTJ;S#cJkT}FcI3qHGR`` z{Q;7%t(KcB^v&CR{M=C{P;(F`r4iIADzHnpk+QEM1e9@fF}zvkiz;}t1oSc)Iw7I2 zrgue{22ThWV!Zcxtn3@Hw+Hz)nQ7teyX<8FZ_-CksJaJ&?5FRGd4HR~PQJkf|1v=L z{!IQ`SNwY?_;$U=^k+BVUGQU1=zlEL-=b>syPph)P--An-#T78pWO4)$zGZ*C!)jx zaF5JFNEHfDaEAJRE>ddo`Ft&nK*_>9mXg6gqnXLaztw-|HnfvJosr$CdTo8cO;nO>RKDf6JxMARo%MQ{tR~flM0))>|4}u#TCCaNb+`yhjQQ%S; z)lzwL7;DIID)=lZIOw|&Nzo`f`Gy-b!c@VZ4AznTPGy(^UmC_y5b3p{j|*<+p0|EO zD2Lk%3E6qtE{~8hSy**Y=kGrE6qb`W$ioac&Wc0AWE_*Ya%SW_QueYGOwhr zn>($U3%0<F9s_3^d5egtayrjgML*=&7W6ANYFuphLz-*~LX3~DkIky*SO|V87 zaunkV8ES{tpTLGazcj$NgfgJztX&iKXr6ZDVi^O=?MYz@`8%o1(YzkbT3VQ*!1#Tt z6>rHjQUQ)RAU#4z`NbSaX!y!t<5fn;H_luXM7&%mY-+aEjJl|tWWnA)fRhltWnZo$ zKl7U`Ax zDE7@q_G|8b+SG(MDDo3nI+s+ry6e}TFmIKx{ls!*>*(>fNFF^s1?r^$t?KXyjDCr2 z`!n5jcUFcF=bx(rfAYqxxQsVbkXYUzU?g@D#;%_K0F^uN(GiN-N!kX1^AHA_V4Bi& z8X5hbGQ+f*ue*k!O5N7bhlcP$CP^LtLAA17HCoMNqocsmPOZjR5Q3!nkDg(FeN@k- zj&~b@u?%ouO$o>*C$^0VN8ulXMMFPo1$pX4EyD|APQl#RfuhGSui~v=w7qd(=dksd zoQQ3}Awq9!5so^G`=TnEWIonwG^0Caq4 z(rxkZI(*;BIaXxrwA$1gErRAQ9w0RZosP}&m_2&B{%nbMaR}(DB??Oj>%58vUuu{6 zvT>^67YFNTRh^r>((s=cft%$^L`mm>*CI z;Qq6>`){kL?|JuM*}t)XJEXq`f`8Zh{)OPd|DPt&y`Mm>evfq@h;d+71GP106VMrZ zqDLws%(Z1mptVKM;SqJkY8|y2d3{M-`%<&mfYoxb`h>0JV2-%GcCbDDkwf%OIa6ve zIxaTI_8cP7+0swaW~p&MejvC5*luQ2bMAw93C0j^Xu_av+|-*09N?fU0g;7CotMPa zzfw~U+C6#6Dr^r&?=UBej|>DaS+!tvE^5*Eyl7W3ye# z#uC=sh#0`*LZqH=3F^>m5MOC2{C5`6^w>d_jMbrk1u>j%o`S|By!t5g8hqh|zZ&9_ zT9Qm}p=E-DWLSU)L}S_ZcEY{1t>$JK`M8kz5z(5E3<3~JlrOTP$b4wrox=^0jxYUn zCnw)|xTF{*8y5S=DEy}a;OyY&oeBaD zm@5QLM>NSIqn*G&KC?_HGP8lZVE9}PU!Y!XuFi*$rYI0P{ZM#3)7|x3(487+MAN-~ z`spJk=bRM78!?6hUK0JOJpb(!>(D~;%T!HiaIz&z8jyj~cGqmyH|+-5=;=@6^ohCP zoVz@rN7=zFc@T2EjpKm{N7WS;?3@jAD<(=8Y?Kfg3}Of=KJ?7Ga&qqE0_^8^|ET*2sJ5 zL`p;iNZVHyf7#~35=HTzk=QftkP8w9wv~gF0zvCyAH=fzpk`)T83qu1>nD|;JQ9r2 zEKfv2O$tKwx15pRrL)?jN7=5e@ht?(_L?FyBZc?}=SYOdH(8;54v@ct)a8F&EFPHj zL|F1q8;mF4##@0@b0&42#ZXFK}(_`ie#E)PNoL?=u!9HWZUE^GQ2g$z3KH%Ral zYye($QAdQlb1f3)|ZA@d?N19K~!n0L?+t9S+O2#CnljwyrF8P}aW zBnw3c1wt%ZY=QM4Y+x>8Q@*=HjYJwpl{|%wJ}BKhXFKWzU8Ken@C+*G`*VUv(xPRM zlTP*r(?LBSa)+l38xm*m4_ibEVUg@Pb{3lTU5@^Az&r34&8@sw`NP|M4C6i{rRT``nXfYXt?5;~T zDfJM%TU1uQQtLY;IU+SnI(QNyz3paBXlqKSD85#u!{|-5po575rCRxt6sk>nVsbC~ zI}$R1koH5^OC0LncDc^>LNtKs%A`F}CIzeB{4Q*bi3%f0T|S*4`sUhb-f1NQz?+6l)$LsYb)3x0-Bc&`~p8%$b&QIB{vvXJsTx?+{^#*Gv;(=Jm=1%u7 z!}ca3*PCg~^U6vah2ffsKTmI_EExzsUnEZR3!Jb1vNGe^^V5Fc9ucL$Ja*LI{XfPQ})*`cX*b3(W=B+>cj{fK$bvPlquLsxTCo0Op39{QNNx2M*A?|7Ud4-kj|%c zL$y=gIsKWzho&#pJ#+70mJE=Gd@~XRNr$PSHEO-88BDeD_17QqKlnhhbGB}B*CL_6 z6`=>Vqj{s$-+vb<0Q(EdGckLrUru)sF?oGHhd%w_bnu@AzY|9OPqfT!!wL8jqqj#x zd>TcEsCpl+2DN5fnXC%a18Z8{Sr&fbXNv!fAF&GN=n(rl;3FrQ_g-m0$eq#7wO;j` zxJS3K;TV9|{@oyl`#Xi($jsLmWx%eJ0!1y=HZ-#hMTK9U-Ju%aQ ztWwJmshldUg}zGB!DC{WH0!8-pp-&oddc|>akM{0zTs-ueA?OlyGAFhL$48!PQMwY zYiheiSZYd4_(Zd%SEO;I-R7D(eri8lQKYG}B=GK29hMdcfV*0|7i9sSHwvC=xoJkw z_1Au*d$m>Bz2;F36G>AjX5}g-4A(W=sqO`Oe%1YJ#*63DCUExD-ejPE2+qtQ5TIYl zjovZNrai_LWU($iCV|6-C!bbfJt1;h0E?fR%vPpVu6*EsHu7<=_4T&IpMlJ&%61G7 z##LdqmB<$%kIl|o1Pg;Lx}F)aJf-aoC>XtHhnc05DGxGFM06V|%2pR$9O%Va@+12c*4I>vbuoB3H0#2R4R#AjZL*)v1U9MDN<(?(0Cl4kcaYdu2A$`N09xM?RU)cwRxf z-yv=9e|@NQhkw65U$VG4e&cnVC_}e9(qCCk!Eo=Ahrg* zGpA!?!ROBkWHh5gepHJKU+RtwWV*X~MwwYTX>g7nV9pdcMYh`hDWk@q^1ux&bv4X{Ya$L#)^ias4iR7HK#jB42=i}nk`2O#m2&8Oj3UJd*)U) zx6v1@*)@*|cN0(N*V`js>r@pwYFPcyng-&#hl5c)v3q>X+w)aZLJ$Y?v#Xr@gCy&d}$wR|JC1mj}oVlqbk6!yoJ_;4yn~HiUj28Q5gk*CzYB}(+RbfdK zPqH0u=*WIG^~XSe)3MP&L7z|3ZK|BCceOctUKDxhTGxD4mqX1w~_)cDzpErig^7K<%-(51x2 zwmZ!>&vtz3?6&nXNh^B@G{N`Lp?H&akFHXp^ow95EY(NUb5aF0uNXD#Ug2Q^#oQ6_^DUjBDuG;@(1LOLO;7(g`u`3Fn`=2pHW3S?2Ro#14La zDRiK&J;TPxxz?K7ZedIzZ8a@{`zMFJ$MxCI-mHrtG9>_uHq`L*lfi4MWu3{P z8wF4gNA5UG%88T2@}KjseGIGbP5f(wtnan1`7feYqB42V3rOoQo$Q+qAd=m2eBAW| zQJYKEP)fl_I*>DEdVE9D$bmAW*P4fx>|qR98#JyOjk)h^f}Cdhmsq{mFSBHxDZ8Q3 z8^fp@7C;XClw1o3h4}S&1h(d*k~KXzL$5S?st`}%ocl!QCfa_>Nt)p)8Y>?H{)s0x zrVQgs{V_|O1i4%V=-l#|d+fA;naV=+sdQPftpS?kU85~GuEb}?@2y`%aw$F9<1Yk; z(a0+M_nDT7F?>b`rTc&;-6PQ{DNM`IFcn212(dU9=OhtuR0->Vw1FzSwGnsFP9(RK@CaW8SJ>w3FW(z#@ zEH)!p0fZ@nGJec;BPAsd5n~&Ycn6d(xjw`qXl>l5mm~YtKX*e_7Ur45Fbj^77+GJ8P_hV*@lAN5LVq#)d zwa{K|EevkGd-Q^>8TL#9!b6+^OxW9Ak|vb{Px367>sTcGBjhBi_v|V;oT>Cbm5WcV z4>p{D*uhvWQ4MqcQ&oe_p_ld2VPV0ghgx&^a9AjU=7jl#fQu5gZ`YghiZjOI$B2q9Z$VL&(pesF8(`lHYWSmkUTZ zN2|PT9EvJ|(s#{4A>w49k7-2-IkBte`BmV`A4b`(5nk!(rOdRwJgTSvkS%Uk=l;AK z{wJ+XjkEnEorO6SOD`|% zF!{y?f)N&{g0x&R4v!6Pl8U%KR4jwV**PlOm}4QCm@)p5eFm-H1U8VUfonroQr102 zOkNI!VrK%o3p%M}irYWw+lx~^uq-1x+C2BOxYrU+zE!2&B*WbTLxoa$X9TPNV+k7E zBeJsOdJuQMX{|HST4EPf7?n&BxbO=av#0)dZ889Y?+DbC)LG&~VzKbI z(a^8$DKvNv0(TTrUUJmd-3ELMi@^WSZl-Fd+c1qoPuIEx9h_lswp~! zxNs1bQrI4=;1VqLLdejcXW8F<2%oy%(0=qs?+B7pvvMsmX37=V3OLMNs?NK9w>=SC zgeGtUojod!JiNV$d2d;0u${rc`Ny>bUl zU+389U$@BUBvWs@{{5T*i##h_X3Ng_lk=L*=W<{=R}Oa|qPLl0C8rT`ah_BL;*7Ow zu$Ym34j_sz)&5oJhMyQ=?2(gJHFYP+V`Y_Y=V+fak*8PDXZI_f^)I!#7?=~U;Q4rQEMEXf~*%fd= zpH{>I2c7MgQmFqj^~`<}X0&pUL$d6a%NmoXn zZCNQz{&W5+Bgw~r{6P+!cz|DVx8yY0lqx@dd$%^sBMWZO{e(Jr58JlTtX9r%3ge6`dP^w$uYRQ`k7&~t%L*DScjOHck|dEfz9nvu7pKfX8-M`Souy(i?Kb{!=OY3R2c0D+KA#kb#_v z#gWEpv(|s>zrijBEp6xQ;l`!5Ow$yz1_}oH7}sl-qop3;=>p@0BE~XKUHAhm#`e`@ zYj2DAk9ia{VH7XbSjlxuy}hQYa)!fhrhc7w;FHGfbKOl)s=#m(Hi9DD-}+oyyAZYM zU=rmUTO}FsB3tmPEw&L}AiWr<#VY@xv$QAOZc^nUoKtc10M+r(P;9kvgM&12(~gz^ zN!^z*bE)dPF-qEb5Bj`6E1Iarifj-rUZuxgoMUu^Hbf^OfrJPpKkp){kP(#bkWxTb z$0p!9bRV6Jq&?a%bU+|*glZ{CdP6RaAcmaT7(+AWl3q5 zZvz03Q$#Nfefh)M)-Iq)05uYJWNeB(G$n^iM| zKM}E?^PB721O4EH2np|s8ss(hnS>6Iuc6|9A^To*q;Jz5RXLX1=cUOs-Cij@ z%KI|?nA*D+rogq!sfmu{s4YRKHPOn$1A-(ORN1npB%u1pX2rs}CJ0vhf9aBu-Lvs0 zRD7;N^V`eK-DbIg!H+XBZMjoRv%t%s->AveP~;uioHsRr^4>d@-&lMob1OV)HNZRyiSR4O1gI9zA} z=>+p0bxA+!|3}j~Hf9p6-TH}b+fF97lZkC>V*82BnP6huw(VqM+qTVaMk}d#&?I)d2ym<;C#dY{~>YcvL-dBawkTN(Kzn_rWBf5>$FcH}JW_vMXXh+((3& z%BTpRb_+rBlJF$S9?M~rs(U%ut%I5y7R3x`-J9n5fCi>yBT7+s5~T#lYe7rG)KGg| zLi#i#27(YHTrvogw<;B2NQg;3gLsLB_3=| z!xab*Xmqq%Iv~5mnoe|1o){@A*MUIu<`+;V+#%|`6p%GI@19P#_UoVyShV0fuKdq& z2Ebpa)Jg4Vr3d%c1QEdi0d4`I(=X+e zhE*h7QUjKyV+m&2;ww(;(LL2hV2SNe3i#KLB=Z@QLd?#v zr2+)RAyO(4%$N*oYh$PD&I_D@$E#oaQC7R}S+j3GJFCHC(B)y<=&n`ae)6bUA|YEtFwtk07S54FL4*qA3th z<1opzwda(l$}&|6zZmA7aJ-maKKIuFb~F~C(>@JdV4$&(4ZRZx47lGQ`3DE> z!9_=(O5v=MGR3coB6{cG2-}s;^>UwZ4W$940@NX2LGuD0tcAb&GS`VpsfVlpAlon> zZ)Uh<)MeB@1aBmYT^`~S0+b0W^!)*#Xh3K5$Dps6oA2fVZND2_t6VBd&HuY<#@~eE zc`t)3qNLJ+g3Y?dDvQaf$u~(SoCg`G$d^b4kc$}+)-$VwV9pI`62qOFM@tEyVz{P2 zM#$XZANXY$20+;``0Ge@loQ*N^dxGRM^w+~vOVS;HYh>Z2MSBI{1}omQ5L7kLGH<~ z;t)l}M~g&`CzI#6X|$M!KLZUFX6m^EXP14I6V>#{f2jCl$pF`F0g{`4;Q`&ILY5y{ z=S^%Hc&5A~2_bVxa@}2Xez+e>5W-x+gTLj58=%Ix154Oh=Pw_v$%7tzVcJTf#Ghr& z2fEFgJOY!Ch!+$Hs$U7BRLS3*0;Gc^C6H8gM{`kTi6s^9YKZ{Rj*xy zlhg7(+LUWaq52gY|7eUHY`bOn%^n_j9}>R}_zZG`WXc}mlLMG-+bxY`Nu#X5Bs(q} z89~RxA{A^ckT9nelI_dD4Db+Q7{YhJz^^F_=cL;3;irm(fGFkxyzR(6?5@oWIYzD8 zt2tIzCT#NsSwM;8bLt|1&Uu|Q9&ql4sY<{1h2A4Y!${#MhPuQ;!nla@xa4inEahG3 zSVz|xtUVh3gj!9bMV0aM2j#Z)D}v5nJuVQVFT|BBxVO-SuECFpW9O5wi$IOurCfkL z|7<1?N!n9H2ed#aYL(BS0DqMeG997l9^-R=LeDh>NKwSws^qW&Y0>%{Q0S3772S3q zr6WKDqMXfMQk>@(kXl5{dedM@mG_WWcC3Qh2^GXgASF<=^YM0tkgMu}Av>hsqYPM= zvBKF1P|_W+aF$70eHR_wjL39UowCu8LPB6^VSiFpXcEU7S>Pe>oc-XaxAg_zZ=QTR zx*MH8&-KhN+pIl|RygHk3j0D%CH{rP#axKr9M2YxF?K!InMoME2(Yp`Pqnt=smM*i zW%+#$ChPmsP(v}@tzH1p#h6$R&2(gB;5hB7?CtCj!t$LId0bBiMn_`@2TkSmE;sbu ztc~{;AK1By^SROtQUqOJ_hS?DC!|fio+u4(^}Cxp>z&UQLl0UGqz|Hb<>lB`}LM*ugsH6!)Gq|Z8+@o}c{Gypbdj7Zl#c^b0WCk_-H6h91VPQwH1uT_W5Xd-H zK^Y-=Aaz2~0X~MNRj$55vQa)^aK$PE{gJX6D=p0zLJN^!D3s2C6mlA&3;5qZ$sGWn zMauROCy~T}PM&o!%lrx^7={uv)`Cs=@t0h8ov66W|7iia_{fO<yqFlLg~)-ugD{$A7}w4huLrFZ`W^9)S1 z*YZ$j=|ZCM2C!r~0ImZ492V~(7Li=kJi`DZELA1%5Nt12SC{n=cSwY+crJK2U&}zs z6jb!r_`D{=DBPTW)!+AN6@&n8oAF)QWRl=K7SKf%HbOv#Jsf>af(-37iW=A{hpy0h z596&-=rlSl4L~jq+W*H8jR%D(um29sAQW1+q-BL|xhoiZMsWhz6+-+nTP`Y?m+VCm z%cOB!M_Sqz%5ksVm`}r{1A{v01ugI*S&P++P?AOLl&S7 z&v|%=DM?l#-jA$rsA{EH5y0KvxpZmZKJ!@KSeojKZhwBM*Y3+7P1e1iOt)ZF2)S>M zjp+6S-0_90Y$spNN~qM{ZW)t1ZmsG_sEfbjf1ucFVC=U4Whi(VjL`IhN{r@1Q6 z5U^698GUkk$rLS@3q^!5(t*bN1;pXw@o^vPVBDrHGC9hW3`;{tDeS`3_My3S8j2fH zzZUR70ZC-&W7~76d#AQL?R_C_vljze!-U%nrM$A=N)5NYVg z23hGT`J-_4IklYhVzLL$dy-ye*l2zEyKEn_1x`5>66Zp@+r7o+r8 z_A~8BDG8L|_nC(9jugajc;;x2DO`^$bRx+2=(Z%u@0LeW%#xdP*BU#;bWjJGVyMcR zkXfI;RU$3LoTwa#s`)<2xD#A*&Z20opNw(Cq8E`NzI@oSk;_nA$9(Xn-C@e+V?*p5 zvp$$*9(&?GbgB^}D=>0X!6CuIM@OucWMsluWYjeOWa4xC+TXtd~Fbs(k<@HG6?JedG z(eW%|M*}zNWld4ue*O^NQ^om}vC|xfy@_0(VDcv_Hmg@R0u0dAnp}O=7l_oX8QAt` zx-+u|eE@h#z8?({oJv2N_NQMRLUr*{I>DO^#THj+YS#MxB4=o#+PyGGXwJHPvdLon zR{Gzy*?0&}OWMkzU0YWr5BC(kbJM?A-6@Yo8cg|PHas8v5*q*^7j8{W^=vRNp|iJo z+4iL(9$TIsB(IgFC~c1S!v{-r2d(GGKMWW%6#T5xw`6WVH7e>2uQG@IAr|C8#KPYe zS4Jd&L%=+jm5R#>PGK5Gm4#+dZO)|<+zM1%k z7Z3M%yW;jP-!X=j`a2afA8Bw5J9n+FwUZ~>h0*g^vV}ORCr+jt=tCnMy~X2y#Q1BS zZKKvpsShUb=~{r3j}UHjc#0SRz9Ss1V_YKHMQ1$7<9jC+(q0SZMj~R&J_d5 zy5Daj@*Tq2DRG+@m$JQfLUMF@d|vlEuRM#7JiNSkHLCSH9q%xS@7d(+H``i)#S(Ph&6?(qeLyX}*NeUa-}N80=8rMFunXbu9b)urjLr_WEL(tfe0 z8vXD49*TF&y`Mn7(kg8eIPU6KDQx#6TxQyQge}$%f(PD%d=Y#~Q3 zXib*YRx*2(e3DF+J)R=w(UufG*+_x0waqHR8198LQ49wcrN0VBUjz;}5g;6~;ed14 zuia!xoGJ#YDHW;!SzBs>qT>#7fYZTAhL{8v{f88hdeRX?*_?iefR8 z-cfBhMuJ+=7u(0G7Bj5h7L9D!fdhsq;hi4Xjv%WPSrR4Qq$5dx~J z`P%>D|MB3Hz#lJ)y{h>4Wh8IipRF~3ppAt>hD!G)t&h32lEIrvjOKf2lW`8e$2_iv zEq)~&QP)X`g*57IWVT*p)R}_>>_`QQ8L-w| z@+4g~>|s@>QXLK2VDM5g@K(##&cr-DYBg4!D?6I~)<~K!Ml3F>!CKTeBsau<6H{qs z=Z>WCh%2gvQXFT1q520>u-^lekV;x^LQ|zBg^voTjuQ$I35EWut;CX-EFGxB_E~E< zL(lrLJ%oS`vtNKYqSEjg8XKya#iYl_nnr!pw(I0I>@u@9=5pe1sTM%{nb)7cw->T0 zjHP_7pCe$sj-SD->-|gGxlo+Yftp7#BsO6azLQSe4R76b#71|$32$%F_g*OIO)W&H zo!|Lm+~sb0#`xNpn2*uG!;}lRCz#F96E3}Qxt(yx@waen!A_#?e98a`T$mz2SrH;9 z6_NM&P2Z>NhmoAZ#-}5`{nh#8_;{Wq*ORf*pZEOwT!$){}bUQjMIy%(8mRoWy zDk@5!D7x|(;XbO{u&V}>*5C4P>$!X+G+cB**Ei6+^X8ON_LfaqhJ+6hVyQQGXpUe~ z&LlVwmO%f}NJXUQ8h>o4yiWYi|J<03w~wBNUzUXLIi@g#=YDK)1ufuDD%AbL)Tb%3 z#V-BheS#lPYm4*R)w>>K`*>F+`zxYy4k^QYiqEI^f%h-pGn};itEsKqeI)0XxtIaYt_JtCe768Fj<)kD_r0i^)7(2KVe%N>K2v({qyTu_6ZO z50OKhL~`)DYJX=gtC@&Mvh_a!mLs8JZFXE^rO;3o4Q!_}4ckd=G$>PkX=Xd&{ZHHI zV9)18*b#-avyKS{ebEPf2DB2_&|xW5=+g=DM>rH|sKouc=AkwuRH8&u?~L0LfXD02 zV|r5$7Pk=xJRrl82{yBV2goq>5EMcZ_&;AIhA6yU;~J~SVQ0v4 zk?4`fs2WvO#&-o;ml;Y>`pzfI=03O2c*#k6FK$muC`(Gye!KPPR|)pIM9(rg%+*D1 z-70dOD%hir1m9OwdpxLf0}}I#ZLA0T?~KM=VD9N5&yjR;{55iL)d)6s%#cvZQgNy= zs}**R6B73VjZ#8siWxeLicuY>dV^w#!XV~`nXG_ms~yL1!*X6k3c>Z1F}mEQwdT{m zT3&#EgHhZHFY*aRN)q6D8fOwLt84%PjCzUucXf4D*Y)n$hkp0kWy}?Nwq@fk*9;me zV&P^0d!Y8L4KCu_l5_4d7)mlpv)87Li`R0Yz1z&OcVOSD$lum1Qdw}SpQ#CGoMf)Y z-2_k3U(WPwguDXy1@^#>nhv|Vjwr*cp)MoiI&&|xUh(*kOs%_`b5nza5@mCUoJj?r z`s06q%@qwG1^`xet@E3#&Ds(fsuR4T=#m43%0xet~^eUgVPt z^9Jf9L`VU}{mtW5b2U(Nu$&y&TOXkzm-}5&k$i$!cxJ$} zm%H(E5(8E`TOC*}qeF$vq~jBoWyyZZ^AXKK{+q2s;mApv7I~l%vREFs7_benwf`AX zE3z&%k!mrB)<=qG8vsu=yf_!hdhdZ+5wqnTr~XJ8 zF2zQudBJqZF{SYr^6g<;Og^?9giB7(2&c=O77ebkjOND4rFqC`_)Dpcj~5PiT!viu zujPVzELT%cOllaLNmjQq&EtPsfF??N91f$CG|Uss{46C7s$)KgC;Sv)<-_iZo&DY^ zoj<=}x>oT9yhPNAsre_@lgfc1{tr?KI28p7Za?c;Nh)r%`aj1gylprT$|zPW*BwSW zRCD+3zU-c5%(F#clJx~c@9v+@w*$)ivf^2??k`3W0)MIy-~gVKWd7W7pe<}#5}2mk z_6xF0N?x6OkuNtmgvV-_Md)JK#R4rq!$f7G;pUu%=GbhnuC`hn?@k-b z-7;ItS2E-iZJu5QpL>xc99vwR3InIpv{{Xya8<-x?bOI@0Ec9U;Ph(H9XTQ(2dJf@ zzjK8|rFa}N91bqvE1LlCCNP`?4L_g?q#25E9~|3ApvCCuF?*Upq(<{5mbhHxmBrrp zEw9-#F!tdmJ#E>KNm`uv4_iiSZ+t08+GtGxA)-yV=?oi51qH0>``FlYJoc>u)<4C* zmqVD+v;D1n()Bm$F=9;BwK+Z~!e3CcJYH496f>`Gy#QK~%Ct9&SPJ~?bO(*wk4*mU zC^z7f|4B%;`k1M^K%_Xy&c&{(AtJWFWeF=vSr}GIiI{p?;f2urgan$Y_z=WNi7faphTPQ>`dHbCLoh16X#nQfpoeeXY@NT_!4t_pE^MLJZKj5@{5xDFZ(N`Se?z8ak6jFy79>OPs!!eKCL#AbR7p6Tlu@8=r0o&|t3N{{ucPJStsYg#t zWtIq{JIxqZ-c~kJi%GP$v`qskW{4@tZ8ZI{rt`818J{JD9BC&G4^k5Js$;U?Pw5K( zb0wu7)-dHf*6?2@l_d)|F0Px*QE*U>RTGCO=qAD>JMqSB%G~c0@%W z5pGMH7zYAErjmr*2n2st%`k>u0sI=&cn&?%V=#s$w4&~iQhgb8EOPX&2xi%QMvH;d z>0v?50(dMBvO3m2A7x{o<=^9-D{T3wfx-CM=adz8#R;oV-PWy zWHTq*G!THl3C`Xl7?xF;SXxuqC$jEKix{N-G5Lb~bhbPwRIM1$Ppdx#2-0+P^{*z@1voZ>*x> z1>1z$X=Pijags_K%Ur79+2qL7lXlcF#9h;~`Mugk^Tcs;3kFzxqLLLUlP?WwErUH5y)(!L zy%0%a1u9bIl$T2u>wJeZyXK9Krw%N4GyzSGze6Ub9E+_~9;D?&We65c)5M+2VvAN@ zE2ErB*Gt&Qk-M2L2sC2)*M|-#zaAItRjm`_ss3j3c+@FX8?;=XpPp(rbJ9yHSM9JZ z0Ubkn_7>{J+vBab96rblgTlz}P2}f(7I~l+E1~zF@o!xqDH__%YAHjJtX7n8TO40< z*;VQ*ptsl7>)hc_?R)XAwYT&7&;H}*XM{R9Ih;3S((Ux^2im&R!-w^6bo!)lXeDVS zar5&dG|yeynRj<)o0cYo=g-kkxF32DawL*-{}t!Mg_e~zhPCbY@$Nf_oi`c@cT6sH7|mEV5W2 zl#VsVDjk_m5>9wAtWfYpBfPN^*qEE_5+s0c*;pyBOwOe-q*Fm9tDtqel`_}xpqzBv zxvz+)=*28C(SU|C^4F(k;apiQr7$*AFRa8r+z{qG*V!h z!L5v%CULva$U&eY(<)r=C*qsMU-)!(o1NTLRuSc;SX3h_!lD3^%3jzfdh#ahp^xAo zUpDO5Dob99f)Q#`&gg)@vU2h8c{FqwCG5+?8Q?P}-ieA{w(@_h#Wt1l+`pJ%i)8-9 zN{~j@@ECGi$U>aoPmBfhp63r2txNynk^G*JPfym+V~jyJ2ua`hDH?K217QkYs04bD zfck#W0Fy(*9F?T4$^cSqF+b!_lw6URLT@473(Lm-o$Eqy`Q3wu`$c^5O>4k1%a1uy zIQjnRiO$NXaDW1ZcNr_Mup)|fH>PKe_QV2anrrnU8E$~)`C8) zWp5te4tm`0H0Xv8waJW+xOUMbtZIfn`POU@Lt3KD!845Mq$~#Wbd~6UG589ceL?8PIMYOy~{Fad}E*U8=73xq1_{xH=zx69w!g_0R2uo&fQp#8D;sXQo|k zTeP4$jgm~RcOM=QhVR($DO{VCq2Bi|D4K7u2E8?)B5PMyR-^aaO^tq=)1M;PZR%b< zc`AOTWo2DFNxa5Tw2l!O8tOCkXquI(j(%Iv5qrmHTkk^zRMCw^>5O_^kGphB;`z{~ z*vj$>3Yk2vyF(9n>1TL7vKnU#jd;yfdYzcYBMzW=+S=NuPhMMJJM}ueI&+ocjk-Z~ z!_@H1%BxKq(y7BVS5Gg7Py`^lNc{aDaRuI-IVmSRM%Nl~2aZ`YuB_By@XoVPGy=uT zQ-Vx?G~XH=3n_TxZ-(&aU(=EL8(2r;!FBA)0<;)NUVT*b8aXpz)EiG#QU287dMlZB z*W7s8acX}Y#$#C_`R>FMwRU4>Mr8TEq8WI4p5;n>+JWQu8eZOhF#UfpY_F0NK5w$X zZe!t+3!DJ zwctA@yZn(!vMI5yVOf3i*2=2wk4cRVfHY(vCg;WD<>TYy{k&?WI>@%YVME+;Q-H1& z)Iu52GlyNqeJy%yADl6s)4s?As}W9)ay&F1ABbvu3C!@j{&+FFY`00PFEXI;=ubv5 zN`#Eh+(T()x)qXtCvz=FUUNZ**^gm{E%!=_Q$e{10C=LH4dLVbCFLq&^4NG2HK=r4 z2cgdl_2>NT;}DOI1X|7NNxJnPJm*9e6a?nSMMfGc>Y_d|=F0H4Jk1h(k{{XD*S^qv zHQ`{3wD}+GcnvYqjG1Xu0E;#ebB_iEc zZ;TkVO8u49RXl`#?MBS7oyr9~CDcC0NdF{_3TA#&Es7kJ_KhEavWd#djZD2B4gZ!% zGCKW2NKU2YtBp1fYgb#_i$es%z_Ei_g5oO{Oav%juH#W_#yu&>Jl6wq`^h@Io;78&{Y1=eYgeR*sYw>S6f-d)!Ump>|0jlNXLD=NFg# zZ}t`TAlKP&pz(oefFGV+-(e`ZE~D^nHT6mN7!WrQk=BLEH$JKcV9)pbNM-Ol77fkK zP*ZVA#YEyWeDhdobBWRn{z|ZYR*kB++>AY7>)_FQ3umr?;%mDDr|YKX%(eCP^^I?v zWaAqJnH+Pm=J*qrdP0-ZJt4j~p33R~XAc_E*)BMMOs`Ix3$82ivS{^SJS_hom{xJ_ z5i@3(zwa1mbaun!Hwgl$YRnM6qD~%@g?pTej|7r4`jueW^|vr6W!zuPjCG~ zfO#Is)X%KL_eK)`Z%|{RIvqQCl5#JKdwV6zY=tRu%_q`~&O^O3a`$K{{_W$tq@%Li z9iegBo(IzXAXe~elI(c_tLskSqq4Ht_llG7%=ewn&*k*4`(x7&%kP@8`}XFt`{P2P zM#1;sFOiMw55AY*!-QYAoJ)BJZ-k%w-CyHxe>OKJ2N``%YZdrk7G!K*&Rg%0yr1KV z{2ad9WKY4aUNj7bJSpBbLIiui*5Cfw`yI?UUv9N++)Q^562ATiOAQjl!@sD~TXs_5 z?*OH@J4zLNdFO23IDjihd6PnSKo_M*??i;X{*P*q63ICrL`;mRJ$C;`V(A4k!N5VZl4u}Lww@zk_E zJP}_Bi=r`!^Z;6M1-yV6pLt4j4O>%K`m_wJ#dw4bZy%?Y`ln<*KSuKq-7R>!Mb0UcCX{+*kfWk+gxV?#%;Q^4ef zUXGYy{eN0Od}XTT+R*Yh#$2V_a^088t3bpHbZKKZ*0E4(YHfAB*&S3dzjX20o|gq> zI6ev9Tu~k_ark~2N7#7TLq(a7OO!K{Y5N%OX8dip2H4U<@|EwbLw9%luOytXf9C`@ zO$~(Ya6?Q{^v8yyp{OS6kS<+in2h66#KK_P5JKy?GiNOOCPQH8+tVa$AMOi? z(b{GhDI-g9o83Uy{RMFaX`{x(^h(@_bI}c1Kq)PRg0Pl7r+_#+EP2bcrmj!cYo(Z- zPpcAU2hYVIPUcDs?Wevg?YY>CiazQ*^kx00a!O2fWz2wF^813q(&zEIT)(|_@|*r12kUk}>Bi^ve7`T{{o#GJvhk7WSueoP zicoCkYWd?;oP)hV^?9X+v!Ol&GevcYh?H1UmUR8*~8WL;c%$>bG7;h*XAqF z^zS8uF85N@geiQ%*7|NZuGC^nKdy{y1I=%*>TK)TKGE~xK9kBcNw{_-h&6+DEVE-_O0`-(oQ<0Rs$LR;d|4iq0i|K zd)64<`tnBdM%Ot|vC`i7O7MVHi999FUnhNHwYB{U9hFin1N(Myv*^^O_hTu;u1|+? zeCq2^(C2D$^72xkXC!v7&28N=Ow71#CitYGhUqD~d1KB>E}hbmaupWx6Iqj*9SjB1?>HEjL%6V5kD^_z;Tja+^ z-C>H@#zHaC*9Nbk0}0Q=G?DKkE0O}+^ncvO8%*r~qC_2viG;h~XQuocTCO(ov(BHW zh6WWj*K|yulE5|sj{xIBeM)N%Bs>uqalG;1LEX?XTSJThY}t`SsM;7BSWr+~lNl)P z$(UAl)`88|9z;DlCJ=b7OX2}%Fr5?Z;f%QjHD zYlk(g)}LzG-Pm^fC5^tAG8xyz7VOek#zfCd=QZM=HL%G+#KS{u6REG&mZ^C;azWN> z)>gWG?}oxng$OutT{Z8Iw48SOLb~5aHK1kyi+w_npuG_0C%c0(1|O$OMQL;2um>RK z?;k5z{!p|K%2lEIzv8lmeM4~|^tB$PL!EVX_;$-b*VZaHCit>>35zRLNYx7Rg4c?; z1t-S3x^7oHVHn9`!~m$ydK9^`1ZI+1mJ#P%qBo7kX_6+x*8-vt5ub+{Df**#k|5Rk zk_yBXI2|CfC&eaF$*zppw#YcG*je0en5F%#Z5o+6g)h57MfPEk#ap z_o9D98f*W_R9%CvBm7y)GZvn`vv++Zd4}r96axhjB9HOYs8!3m`PosYq(a5Hwv#PTOl|DdQTe{T3hiw2T?EF{DSqvJIp*oLouG^hvRKikp_z1#W?a(YOC*|&VG&Q`8w)q_2d zkJPJB=3`x22u$f8a@1OWZ~(*Rwsoich40p$X3tCd zvp%W;^(8&6sx}?0thQ z;w#3@GT`g`$7P}V!^vXn+vS&~Twz%;q38V;ef?druey;-u<*Iv*za#i=Qq^~S@z5I zsqx=R(18%qH(oy|A6P(*;On)I0{`cg!0R$M;PHsEYyQ87kQvdH-`Cp%*2g8s;2^aA z_A(gpI2@570gZ|~g^HabNsRjWv_?|e4PwE(SR|^E@vi+&u@s>eAUA~MF6JP7ZW=9O zM9=W2T)?DGsLU$`^5$iWAr6X~If)&Vz=I{O53(ZsNy zh^S+hQXX_fmEay`=%z4wgWMyYD1QdE&rz z?!s$AXZ>8YrxO}46{(y=FBQ)f9jOc$uun2|z{Fqnn=_iIqZDn-N2NdCSvAg3WoJrL zGYp2VPj{hlMi=V!h%>21(1{Wuh|W)bbAVa2uX5w<r*aeFm>B^f$g1i8r5KuU?cMvK){0;7qfqf%u{=3 z@*+p5C1L?lg7vP0NzeKpQexIQdO8hh|I0eAt1E=nblb~t2R2Y;j%%3%CyX2{;==#% zc07*1JS9}Plf*m0wN7<4vu)^Av-5=^aLxfR4D8CO=@lS=`oR+@8# z9Vv~r7CAY7CuKO^!qX{7SIXjD4DMX+_-k)~NzrAgN$=+k`KS(BcU!d7Stj+EvV|b_ zVeAc=mo~I=np!9oH|J<$EX7K4>4oVnoDlTwBAhxG2x?6X)aM6MBsv^PxIqKzLhC_#*sl9U` z$65^XVVpA(P*ivKCo0!x9H;!=OZAOTg$rrP%k@l548v9P*z%PFjNHC3OLq73fjT%F z8z2DQXuT?M=_P1Y$o8!iE1`hjwLulS9CK+(Qtj@Nh;G0p|3BH; z*+DP<-K5MFW6u7wz~UlYF-H_3d(<(9oLv+~h;hcTT9TENn5jkwFl$$>(P?_3OLUhD z>FXUz7R!S_H{G3)cSwXd_~Q2ARp5#RbMV&#AZJk=hAfXvhX__vq1L<$asDgTIFa3x z$4~6B*zZv{n1G(1%qrFPa)1B))6%)~*}}?3yCuuUG9`1@N)>)rc|6)B^~r3f>{f8y zGs|Yz*RI5GgYIS-Z6=J!^ZI>sDhz*P4#{^PiRislA6M`F{pxdcxC;mC%jNRzY3s9I zVkkh`T7m!Or4mZu?z;2b@uN%7DE^4>`0vw+WkMc#U^b~ zhclAb=a5`C5B5;O2tjbi&-EG91WzU<_ljFm@qLba-bw0(tBT}`f(eFWIEI|40{jzQ z%t+1NMFs!FV?A(}Dv$wOhul8!g0s{BqGJ7ahKxAc1yr!Rgy}h)nd-<}uDD!9lz5c5 zY~wlOh7@r)I&WinWs?MNTtpE9En??$Z%o8yX^S`b1WK|;F)_$`1d*Q=ib4H$nnrB! zPwh3IH91LVD^WD7DcH8R~+u`0>b7LE|Xe}!c(G612( z13#=AX{V*n81?VHi6*gf*6EU~wTl`%xVFw7nmL;ddlA94y}H4u%Qs7sr72o4^YyP* z59q!*)^}ofBM6`KkLyHjM*CC-%qWHCXmwTP zhPHvi+_>v{$cxAJ;Axaq%D{&X9&hG{FBeMyX0@8Rxj7(7vk6Z^2|aq1mv;wHB6gV6 zfy$#s8tZy6x}am-{5m)1%sQc6jw36VTvQCu1$mW^SN($Iqs5G4|FQqF4BwmM15f^tg$J*^-(`Z{A5ghNH z0L=D-y5wG#$}I+l=jY@>7p626MGo50RoB`0Z?xg6YW;Sg?Za`b>lD*yQ#>^XHvG1e zVGO-7Og3I31`fF5OflnFq{xRyOzZ*?xR?oDWMy;Enw zo=5_tj!g*wGle^^mB3+zjKc^C%==4J27<#u2)&o%lWubw!!%@LS-}=Aip2MUS~an8 zZ`D2>Z0PI-c~FGBjgK_Sv{rxN!wzkU3MN1CTi%>6dfs6`9L$Kj2rhi7idrNqq)As$ zcUvIopblzSLv@{t{a1b#=w;ME9l|h;v2f&P&bxn2UCrWn4w?}6ZjNAJQL@iJHS+Cf~gc&D%>Y4ad5}vCGxPobX#vfRB^^ST zC>AaC1;>9Ip-DsHzMZuK!#}sv+f^fmqlL4g3Ord~9oOJU1b=1CT2C~Kj$%A|z(2Zr zL!*0fL#>c=r-H2U5>egGmonc5{rj>RP0p^c?I8f?O@KZ9mWDRm#>q@`tgKdt+A-}E zGH{~58;xJj?ZcmYy)wyPQ_Oh^PwU@NwC0UegnsX$S04l2`d#04(c@o%&mKllfi^m% zkD2BvHza_AYibj0_T$W{%3r}5&u!N1*6zV9@i4lh;&p;%*HiTO(bGkROPs9#f*|g! zk&TV)A7YI*(X8TJl>#c~T&UQQqO+FFPO3cqktK@72YefblyxrgE@ zozP9e@D%A@NVa@kO4yTX-Y@V*4?}Hp>d|ASe)Lfp3fF78ycHSj=xgPwhj(LXy$Bn zv?`S^Y-2yRZ9IN{CR%G$8yG;WtKG^R>wE3~G`4H<@_Be2lws8MI2c+iy5Odg&v;IJ zdjDhl0&tPYf2@qs`MzTGy;dURpcR{^(MkN3RbU6KeTz)%GK^i`K1Gc+T!PJY?x*(z z#nvjFMnoyK<<+_yTh?HTx|+Hzd-s+-n~Flqo0}kjlNUSeX#aoUj}^*Q<4tC`D(pS9 z1=z(yhkXLL)uh4@8;%u&Q)2mcJHH@Q;5E;_V=Pe55>2t|mBN;`K_SB`YJt3jPbjPp zXzK6K$=lvP7=CoTZ9Hv$4=sJ&X9Lx94IO+M&yzb22Jsc8GYrYGaoxd6#0{zs*KMpV zKlg9YdZ>R8XhqMObZ=}fZ}f-ilaRbz0S{f+ss#2>V=IxUD*3T0j_3Vn$qw z97zU+q`0*+iYZTZUzTTa8b7KWG>uN959rUaiH<~!)=`no8vIZwrRQrUXLznFRT`YwRpu|MDBcVOIYmkTGu-h)quX=+Jo}K#j-CtjP6g!;Ldt zj+=1xCt|TUan>v=3AuOmiw;b3J>Za^DhY#A>~tspE~RcipyK_X`k=A6ByP`*)62z0DWO#MaM(0y+-b7E-rfp&Rd_4Lqx^ORX~fo>~1quc?}|JZ|%e z+|O%=uf9f!1h3(kRDsrX#a~5rtEG+W?z}u-sS-v+isJ~9tq*g!x?<#E(JTKq%8~Bp zeG_3YZ{U6WL}=E4jBe~f-k%sJ6z+ z`7a7%sCHQu59s2DHBj1nCPWDt9@9TC<;TCp1ZM1hgOHA}W|@SBPe+O4Yrb#Kf+c08 zh*V&8Ne%Gu!mF2=5#x)tP>MQ#C*A#kw?v0X++{)4=n{&!u_7Q&&_6f!+xoXEe%tLQ^YY;ow^G!hgd|{33Ph`;D3vBP!wOYg)$>@R5zEOp9>4tHH!LL zn$)e6mFb*cyWQ_!=11D!sT|#qia46Z)t~kTVOvhRNSn{cGxmye#`c@^BA z-lmSex%$;UUvGlXqkbN*$1`M93K@VbG{~3ZwjklJkO;=F<2ONFZr}ZEd_i1cCEn=n zn<)FN&bM>k&70_CgD#hw-LWhUZ2_mBBm(z(!}SD9Oi|*jnJ!mqV*j zbW2qYZjX>3B$?CeO&13Ti6BX4+Xt>_xcy)`biet>mTv z*OOl$gF^i^wcyP;95gDhhU)Th8+`lhOVpJnjMbwLh~qekoYE@y0pj)m$tLOy+X=)S!-a25s-nmUfYiqaiPJ@+IJ9-8HgRDi&dMyRJATMD|QrVVS z)|jnmzb*%m0gtGJuz8DD+hWWf4uNupt&0J7mevr#2J6mC7wyWt*VUaV)E);@LBvLI zbE_XR;I)BPV;)-!t7=P@P+GP|I>fwJ$ieQoEwn4+o;()&Lsa?vX7c97V0ENTa)CC1 zjxD$eKin9H$^_9~<@ZmtEf@EBP?A66R7EQF5weVSC4B}_D278^E=5y`d1ZivL~MNW z@~*ecEAJ-{(4J?}C0DTR{@iGYlB81{wp1=@%{&2X`Q>cJ8B}}CH zE_+_W!dOwMz9!jO5usjC8tsb+`99a!oGB151jvjlCK4$6L7Vv2$MhMclS;vDG7I!E z@Uf}&dI(iLKjxo4X%SpL2ou>zLpmS;R=1b`$JRSVM;dlp+ZA`5j*X7(bZpzUZQDtw zW81cE+qP}H|9aoO_Za`dckrCocxv2tt(t4jYbw*eABR*a#WZT_G(SzjRzB^Sq>RpC zcN|t`_WZj!k8uHk^81V<|2LGOB}@&yAf!dqjJRYK!{C;@-s>Mt9>e z@9pitOAA@yf5Ty&lwmZ5S2nb3zjLIVU633k>&Dxvu5IQX@5l-dY!sutR>HJL67*1h&9JamzZ5$mvk; zn+8(z5B(uM=3fHkAQq}-BGhQinYt1S-d;2X*kw7D;c*+wiCq-Om zpEhYYiN2ElYBCr)N3HVX$2b|sgl7lr{-RSMq)32*pSPU!Z2;S_*0#doZ|2aXo1RyP z_v~B|Fwz-8Lu2owqs=2VA#~_peU(i<&}g<=D@BdYx3{vgvNJ0=Tzy!WIttOq?P622 ztFE%Etl8#vy&T=VN4^}@X9o{v+p@;z@tl0>WS31zNdY{9c3Ll9h{fQZft6k%QXSpj z@9)PY9a%O(7WOYMKR;cp+_3wc58fR-X)cKvMu2T@ZEbXWf1MXCRg}zRaro}5*KGLg zg`{-9_4wfc&es~;dS2(HFtWRVd-{ied%#U;uU`KLiGyNQ@*c99Rnyy0NK4n1O|20# zvr_SqGiMgTzta&6dY#WC;DTavZP}io-QnTb?|a7YZTsbW!LzHorRCrF5%m=?mM~FN zM7ry1=KpP@tZx(TPCxNlI<=q-4u95at`qr}Tu4aI71JOXU1q&+b(b?576Ke@Mm!0u zfbaa+%SRWB=*||##yL7w*pkOP&x{?jaD%?y4+aJ`oMXXR`vo`|0hT&H?@E-z(REI( z?C|cY!SmiV?J~0qT>&#hEHWsE;5EZB$#rjOw!@e^*WR1>6HU~f z$O2fQY51mB^A33Cl~`U$pI^__ngLzNmfD7Sk+y|?ZB(1_7w(&-@3>DBlEOYxaqu25f@cIN9+1MD+YsuD!g*rQ~SU zfzC2{k|`A5*z&!-U!u_Qy|>E@1=?Q7pr4SqFfjN!lS>0YW_9Ob_jOf|r?E1D2i~w2 z7+^&;d9BE-{Y10(qq#k$TaBkhao{rF3Gqwz!j11~mE1Dsd%7OQPN#kJ+6z1=wmI8( z|IV%v-}5zK;d-bf+xw19N$Xdgus#Qyl@9i-}>7{O|>in&zMWog1Y(nm{gT5hb zy646WvX}aW$D97+6eZ`i^FjW~E61zc=^OEeYt?eG>-G?+&Zsx{VyTh8KdhH+tr${+wZkA0*qd)rQt@I3daO6~eVL@>;*VFGRgIE>F_T}HL zDdo1HnCip+RfT}jD~f?WY1!3ii#}M0PeAfhxF-BiRR1@Oc^3^j#jEg+1^7B;0f4y7 zCJnA@+QefHA1Lu!WOFg=L;St&XM;old0djZWr_3B!i)))@|4(J(YNQ7)>0>(a0F(O zI_H)q)Lh+M0poAgTC`BWyhE1l&GFRJ($Z4a)K$aDwe8dl$SFazpu0@NT4sixzfFjN z^ZB6!g^srOSy9?C%OxyQL$b+^&+(+!b=Qi+=AJ#U9}sr(`f+h_{C<9pm>RPaZo<~U z#rBa-w|n!#MQ3AkZQFB*sexq+(AZMPii>c-UangHYgUY>e@=(g(`V(1qOxLl7cx9Wvus)$I74M zZMMlKA;h^9u73>vJ!}`()2L)nrC!zb;o0`cr#bOt?1F#-Fxj0TVlX;6drwL2Rha;% z9;g#PEW;UhcM>zuc|ju8O{Sf zMX}pIFs=_6LThM81ofa7^lM&JKu>W<5zLCpn7n{j6ez$5SuttI0XAaHwgToKq$paC zUdO*VzVFFpF@k@yH@?v-a$8-!n#P2=~-iOh>i-IaxjOEM*f=qDY|62Mp+>tVctobk6B8`I+ceF~;(W+?b zMA)FtF?wqvL!@amGbPE4l0h9T6*p+vp3#yu6Fq~T`;3pdlJP-Th-M$qmS;zAQ*TKL z*A|P)BfjMOdt)(Mz&mK~m0j17A1qEwR-Gk!pzZtN z)ps}8yf-JEH?9c0U(#$lm|0mxfFS`Lb-0D5C7c#pYwKsopm;Ug#FFQi7ZBb4W7-XY z;|Sqiz&m_rILucx9GJVNx;oU6q&yWE0@g8;4010Ce;4Tfy%aAeSYB2GnDEi{wQcrE zJE{BZ1=t`c6AB^LC0OUn<)wAU*4p-3+)7Of_e^t@W>*A1EHi4W&Dt#!pfTCPg>$Q7 zr5ZkrsIq2d~P=K7{Z2(y4eirJmEx7mmvi-1QHK@#}W*+1+gx=1n&K_RLi zY9C0}irq}%%jIHbPopnxVh&Mhn`ctUH3ZRR_os+s?b?LP$6(bShNP)D+Tx?<3tgXO zNoJy4wc_tzDSN7nDN3dq)2H5^hu65SE>}OKH-R!m5g(?^MynOo0IHb;@M^MN)6!MK z2g+DZ$R9ctOWY$?)6zJ-4M!ZPB*o<_6t#<%DkII{q8WG^xb_W^> zL-&oVt1O_*-nW;i{jxX@v*}^qm5YBj8IuzhAAgiyOG&}G`S9!{7E{%GL?|xB(J7D4 z-~=f`S^}dL%rWUyDzFaBc>b>?!r7Y;NU?8AuWz`net)3r%8>5Upp&-{DO|`=A z8igz#Iw4Oz*2mD*SzI1ndm`Kxk)~BGw_=2QCUZkSEHNEcqNlL&*_zkFP>XYsW+8b| z9-mKUtlIcZWy30ygoZ4|>^piu1+U?>s5)RIT0x6|bZ<)tzPM`Iuo znl|1@fJkdi)O)GNeKAk+BRU1a-omP znFaFDEnKq>jt%P6N{<{@iZ^Oo_f}~N@7I~!#Z6bJ<|$Bhah>6L&&qQZG0pL@cwHOF zS)As%AJOwWjQRI|p?2+e*zm%4@7A?O48+v!+%@#rG~$2uH|=4p&ivj?g5rC40zNI@ zhkJZ_ey>2AH4ta_nHBc$)y}8ny2wm5>w&;`2mGJxf08~K?&3D*nZ)TyjfNr*B@S{m zROv^`WCJWWpa4h`X%H&WYPi>=VAAeqjDBMYN<{QDxKpluOf=2MRsNm$I&{`k&Guy( zP$6a0<5K(S+o$<`z*RiS%jGI^T&zMenZ`LFp6IRt^f6;3K5@qHihqt**UN`$Shn4P5*xe0ufQ)NPK#AyXSW zYgbRxS3h;lB<&;th`e$Y004B;cY7QxpGRf*`{Hdt9%?#*L}&2Ff?QBD&XAH`*~2K? zWD}o4JVHo00ebz#@kW^8q>A!>{Ucgc+i;lcQ?Co!7MH*u^zRKgtxBR&N-9^QTPc4! zIvVP@>0WTzVm6zWmYdmZ_dqeCzpH2fhuUS3{FbUzXs}lqv!_4CbW;&DA^`chuo`n`V+gT- zT`lJ6<~hfc+=Zj~*=4k%%LWZibTwR`=UsyNr5;!~BoxYbq_;%B(QhhBICpJJj+%>$ zORhT~STel_rxcV8?;pLX^)!=phwivj$;6^7CnqO6FLZ7u_fyFkd#wiq^e0K1&yO^C zaU*l-?B5s1JlN0Us~~;CPVBgx$XFvK3y$w25!->yfVIFO1aCwRS0^=x{4b4>g~wUX zhglEW5W~@(DQLJ}-K8T^VoAvixPXhNXuosFIij|D4-4}G94JAmJxkhvsu{os$kbuk znnGOTxoi~cO~tF-arC}pMMf2I3nD4U^-z-_GN7I2;VYIR_` zc2uAgf*@z67B!9F?sH5#kl#-&-gr9TUwHM%s~ncFGe`6g9y>_f&yOG(4b{Xv$XZ!9 z39|5zoRhSlO*cS=a=R8FUiB?Umq?T3!<8#%QlA3U|J$Ea)Sy)fU zt+8KNZNLk^MGp}fq+cH9i!u9RV^OlVu*9~~d zg1OW2r3F#9Sb1ynoUfcGj^=H|z$SlwjN5&hKS-D#Plx?c@|4&A>#hn9`Ai zF#9HnI=u~ShLKsZ88&<+;>^rc&jsEMkg3Kj6NH=!Uvt=z4P}Pg_wbEL-7*2!cyZ1kekk%{l*$W4_hV&QAbkB2J;W!##`+JV+cp(-PoP~Db=IKtYTg)*{4 z2;|k}m<%jp3J@Wj@|PW21^7PgIhJyO4A^1!XU_K6jm8zy^fi09OW*Yl#L&N{GQugL zLgY9^C7CR`WlO36&xD_T++nXQgTxdKb(`r>3+RVS8X5}V6CLOJO|0j8zTkfdvIkS_ z+yA~_F6i5@o=|b7^z&r((MEr{il@X?BX&4ADWk(k=oH+B&Egefm{47me5ng(?-BJ- zSzDhUHM7NXT*A`L`#+%W#!u=PZ1hg=Sh;}D@^cEK2G^8awzx%-5`dHk@1Rbo;<%z zJy0vESaogfd-@;L`}Xm#F%; zN=kB|BtYsHe`nS5Bru0X=I~fR@NbnGYJg#LdlQnv>v8lacssuojPAV;{{%7vL#%AI z&dVO?ACl;fE!&Q*DphL#0E4j4-VB}84*R{fJ#%)}1x-zLHjrc(5O3WvM18&i`yc-8 zj7zN>T+A&DUwZ#8^n7l-_&`T#StqB;?VLmXKbKAw}&FsVA|S&Q6u;> z8*e0=QlH^9R;1%qL^;{+Y~7n#8i@wwJA-|LhA)*WAT$dj)SwTWmE~=Rr;{FtUC~l_ zWb6@dYLHEyx`cT-@_$+Y)gb&Ioz7BsHh)H$g6Zkysf-p~jh?#Zy6&CroV2v;EUTmm z5P#)s_Eho4=Aw6>1+~z>)h84OGe)nJWYBTc>`%XT(}1A3!~k_KHPW9}(*hopV^ExL{nosnYojmDVi zTT?uBS;-xqRkQ>;%Zp0L7>?WG4rhwvz3^c z7bj=Ya4#SrMVU+#MX*{*!6{C$q-IcPQ2Tif?5{D|yqU*5Qtt#RAt?!rLGfED(*%0h zPBAPlab2e=Jr=Q}(iW|mw%x(9895S#%j%&*m?^N^ixpn7;%)Hq_2%az<59o)|A6xl zksg^yy}30<4Df)>Vt0TII|kNOK`9GzZ1yA7Pj;`tDp#I!X-T{rGX7 zX+kBOLC&26R6ly&OfxhcQZd&7`y{nEqiyr$CuBzc?g8e)aJi>J6~es=Ot}U#?_q5u zI5gNa?PUq@qq*#J2Ua<<2!pZ|_>B`$DAY8vL|?tSn490uJOvu4bB$W5d$P zvm3Y4JEQP}1Jb7^jFb#AhwwfrBOTU$utI-mFbcR9eyCL^OJwTHO8u>?#Zk8cT=VO3 znmAR~7pDhkPz=?bC^}d$bZrm2QGojWW!4M__N`!Axb53 zHER|0U7!2wNfq|RftGFDDqOzz#v+R~z>r%{k6msU{Ur_3#PQ~)_Si#!ezv7Fi0$U; znp2QWi*hrKm#yvg3pbpYq|?1I6NMBSS#&^_>F8ELXflR3Bz>|rrZJab?$Pf!I~p3V zrPh9jUJ}W5s3E-}w^=^pxs!=90cH1qHpg_cmc?yWUY?N@bP`nEdG$wEhmK|_dZf|Q z1>n&QOK$6jXjWTL4HTkI#$eK?v*h};p zcOWSwk8CUZs2}00Y(c}UmG89L`X}WxBfN~}b99f%;FJMr<(6KuU`V_{G-0lCnf#dz z`m%40hVz*tc1B_n(grfz%@o>?6xShbZrf1@U(gdP+~oBj!w?mxI_U+{k-=EZ6bosQ zY2I;1kSMQa-=Ikxt<0iRz80ejM6;WQMW`l@N=>AqiY6QDl|Ta=A^}{(D#^i#2)ZF} zSiwgBwb^!()W$n6N;I-pT_E+Yt`GfuIc=V8as9j8oKsBhG9N27;VdA3R~zq}XM4;W z&j0SxSiJ_8s#aj>rk>>I6vS&5`w2d_KgeDA1p0igSFccqgLFW=_-BOdyFwv!hTt#NM9o(!VE2DAXk+dL z|Me_ERIWnTP)&cEs$tUIDyD@M3W>@Q#^WKsi=^521<6~Jb*>+V(q3*f{;ioOf;op3 z&d?#$ZzF<Qfu?pDU?P^r-;cJ#DYnu~D-31V+{>@T`k5dDST*3@-(-q{ zsnlS`LYMJ3;-NOMO>k6oAES5+jj;lAc9N~VNpw(R$0b~^g*p|T#5Zv$b+yeuX|NfP z7=zC)mCpe`Y)tpnxsW)z2$RTRaNSS`2JQm7sxk&)W?fIZ07Hl7M3n z8vgmmb|PF_+V>joMxEQm)6{dFC4e0?GXXmkqVR(6t?8lp>b3jE(=dlJyYvSGPe+bl3@zyDfyrdqLXPN)^`4-)VeS0Dyx`aWGdvEAxSA{o%fpr6_*LQk7 zH{ET^l{fBgnY>vhXCWuqdU`wRdU`#;;#f`Qss^`hhok!=v+k#>8{ZSIViO3H-CC=c z?gyPy*dvZ5NqM>??hyfaZUiPvP#7?>K#O0EBBced0>>=mk~y1EEOVlJwJmQsc$sTL zchrlf(r52fnD!$gEe(z`q{OW8mZ^r;^i0wA6zVPp>G7dLV9U83}J zP7?qvCdhCSMsaGyA%xU7k8Cmx@YvyFIvSC-3-_dPRQtkL)8YO)v;mjUg4^LLEev|S zK$v(Vjla}?odkAWmAY|`x$q`RHyQ*x0#Cx*Mz<&tJnRUl1ekE|LyW8~(KFbXQzL7K zkK~PzJ^CMl&#BU{Lo*O$v1`2;r3F&rCbeTl67)GxIk0K1Ocl1XfuQ7fwUr>B83Lh&uI{8M&`IE z`%^cX6_JMWwsc^fYt&2aTv? zhEyoIWbz?TU8PYm!B!(-%@OxAGy_7CFY2f1L9)}pE-8+jVu;Dyen-`kj6AYnraQ3osRuKuNXS`{Wa_8dG_QuYx z$<0<|fR~3rXGo{U_#;5AY$-^x2*wZ0(?pdZTQY5MpY93NA*(tX@0Wa`5F_Yhbv>~+ z4h;RRUn#v4Md&N~gMLtd?4=793V{26tH|sU?}q4o75whJdS3WUd$|l4{*oCCOAt#p z3?PR$ASG{6g&`Wlav&td8aZa0Ib<6P$AVVYBfZ01LHKBO6w9CILL)(|yf#aaiE7j9 zE(rJL7{tW9G|3-9LeN3sWiovze}-RZ}Y6F(O1m8OM;)a><_uz7bYSwjC(SO6g1 zr1q0Lk}ufg3&R|X$Tftn^D`etxeL$?YLGKQtr z2Nj}~t1OVj$DuOzHj}8-<#Bl>u|=vZ8ij$H6{RrN_9mw9grdam_oS6kl53w0q=SpM z*^kn|s^xn~qw_sKN;`R0i{Ry9K7ir6PuFV_moCfM=XVE0%RY?ChhBB~*3N74if+}y z^m!oP3&=UUYE)e(j=yC4VaPvr-zc~l3f{5h>(=z&G?|`=7X0k&I03P&NVZW69T5|X?eHJUvJ;)q(X;?s6pE% z&44M8b{^kP_T99FDF0~AXx0xdgxq<+a_;d8SdfuO8SsmM#Tn3dI#)Jpro~wR?TRbHelqb2 zQ?cq@5#R|JiCgasU^cs^0C1}dQcc9R@+m?g47kR&5>JL2nwY++{#j5Cq!LRWEH+9i z!Iq`;k6N?%VYR$8rL*yJ?K9FptuXK_K+j3Xgk!wVs!+bWTA+ZC(>HHkAo9!bVAx0Fj%_Q{0Dy97edIt`Yb&{WQ>ze3-qLbmS6Dr9B2NIfQ zr@;Ok4B}f5mG6<0Un?yXNsr{cw!P8uK2DAEyJo;lzKIuNsGnl`y~~vaTQj=B@$$9f zrlV&))iRlz0^H2Q5Nne;3VHLRm%N0MoD|KHCD^~ja0vYt8rw`A?MX+9)SzVLippAy zeub(g@9m-Q|2G5-z^iK+jYCeUjtvQ;Hf+tKT~cwH1T_WFm@h zNLcN#q;jy1~stq|9W^-w`7k z*J64qyY0jpvhur@UecsNyG-Sx_6dbt7E}ew%V48ao)u{=o#t{^;T6P*W@;Bk=QrjD zlELAUx|q};KK=J+Q(EOg^kRU!AI+1-A zif%@7xB^lmvY#CO8K-!1REL@ZxITMvo>9XeU*%AU76JKkY#M~4?`M0zm*uCW10dz@ z0)gGDa^s5kVN$kaCr-&^zzv>DW_{psoF6=ZQH7aD55N)rbrOgD_$nAgk3Tano?lkq zjWS0nDJV14|H=^Up&5ia4s%LA>GF>;0PB|7ig)@DXf^$+n%t z>j;~H0Z?$v#8-@LGX>b zz-ts6gE2KVj55QBw9efi7U=8aaMV&%#%}}1WE@&3Dq&X`7j<`j_>ZrQl^Tv{r~POy zxhXe$(@_$eNCXR{OAOAAum_PAl1JwA#UkCT zj<{H3R&4kz2{7l)k`PJwLD1_nujETE5|I5Q6h++t1%tzR^0wWe$sZKqi)~IaBW@%F z2`)wYGUa$@25J6VmxYG@Tqdm^X^i70v7%EM@35DtNKupjOqDHuc^8tzTwSj4LlS$| zIThpt+I^i8Y-Ciz90n6Cd;~mJLl#tLb0&Wy_H0^$$)jKNC_gS0Q%;=$gqrmd&{Y7C zNFL8uRQS+3MYHBWPL)o~Fcp~~t#`bg(FT~0ND)NWKR#EpbkVUsXZaB)oHr|DnY#<pwlyL1tN#tYN7p1oC<_7 z4F=*oj%ybX^Y^gd#2SHbrXhXL>ifsq_eGw<@+_loM*A+UGXJgH*vyh&$xH~qK}80) zw_;N(bc3)&6lc)QK<5AV+-^8)))qipbK9K!XKx1gACO5@jq$2rJ%}ET}De2e=6Zg$Jg@C6pM)>XV7SfauoF)M*uLxqCU5$VF#Gu6V*sKL15}V zpwUYrAbXx28tNCQ9zIrfZf2mu9aF+lubeA=*@va?dhMSm6#v~Q!r6I|<+gnXh$!36oZ3%P@oC)kS}DkiKsifc`zffm6{|; z0i)9o;>A4HH-KO3HI&r3nn}SsE#RLr5@#H|OS?LA*a%Il$OIzVwJX0S>b&^0Ve+2L}&u3M_L z+h4QnK2=af$Zt9;3~@|gRagfUR&{q)H|$;@2l58INX;y5ZB5%Xax97^cyZzNe81b4 zGJfMUMfA4C!G{IevjnD3rp4r#)I7QWzj?JO@a#M0AI$%q`|px5e=tY(FJRh-W9uTDtc)CfB`Vm7h7sHEbyG?2I2ibu$2Isr+N>iA%l`&~Xi zy=v{n8V|tNxiM6wValfD3z0nV$hFgPq8GUGD>YFt zl4&sV(_8?S=HVt0Gjrbr3=#aRwKtb5t1S%aj`qOu5HEYsm*Rb#Wknp?+xz@gX*-;| z!Z>>wvDziLbXxT)2-k;$^|CqtC3d(@NWUeENZnDqefI zjzujPdzs;WG(Gc`HpHuJdB_z^MVm(m9h@bZ%-BzNC zz!DIrP$$avW|^(8*2J0?`(uZtnEaglEdiBGkh^2pPuwl&d<3N)xVCLPkas&V{_{{? zgq!hl%s#i-mPtRU0$8tn!2I_#1MNBO!pK#vNszsT{mCfDIMPXxvn+z9vI!4k8s3^^ zvS|pfUZyalm{-%K)M5l@=p4~=rAF81yX}Nt+Z`YMWl3|XnT9=)0q*4FSOPKz4OYDd z%pl41$F?=jC@p3nT|1~}#nyH2Jb@j%1W{ioqx1s>ex0vzD*EiGL#D6-uINv~CEJpQ zj*bknQWd%+?+v2AJXw*M4HUARTed$$82dn`moHesEa6+BELgB@?5^OUz}P2j$LQ6@ zqb~*qds;oOj@P5smLDe#;9UC(Am)6UL%8Jo4V zX|uh}^JtzL_>K_Dm7mVes5>&|%xha)omX_s(wp=`Mikg_d0qwxyf3(RET*Jqre|7? zF%sDEA3s`bw_pFm%X&FwT@>tD1Jr^=wrSa@RKR^JIpIF1$4rON^Snu4^@S0rbNJV1 z*>OK_5VXFIs(nAk^?=yv6?|!Y&G&pJ`F&w*-SMUHy{7DZUw*NE#Z;N`{GI{bi&Vh1lbCL*Db1BsL?%@b;f%Q|B6_m_}{U-CrYl$Ey9( zyD3ovbTSS|!aYYc3AhO+n*2gI%VH5Kxa8RE06F7JbW;cg?q)+abCb!&G<2HwfL$pu zJPAW1U0P~1iVcPOT1OE&BuxHbw@D^{#y#9{#mljvki4XfY+*SXLL;ZDjl)e7s(7mW z0|xnM8Tc05rx{PaDdiRl3{wtc-b^WcBTGc9Ns0y07fP7gqiR@vKy9ou96NEX{@}1? zf1D}>i7RChd-O74Ms^;g6kDbyJ)3I|itFVAUx30vrq&?eZC!XwmDolyRD z*&ECcUI+(eF>en&$bupq@klDm zf2hp{lHj|lrqwm;`ci4 zLa5(7XDZ+PIg&&T1Sj-3sMSDXE40*p0_3J7HYS>Uu+v9#ZGV$SB8cTx)eq}Bv@$?s z&cwO4pyGtBBU_a6BwKG}+Ol~CZ8P(^i<15M8CIlg$7ydf6JSvmFV1o@^!XE^7D{D8 z8b0*xnoT<3^&Wd#d!!M)WKvY)$oQ{Q?)kE$J%t~jO9Qu)aLj+d#VP!dH2DFQk$Km7 zz;G08qZA{y(?6GkAuayurc@w>)hzV_WaqCR@f0jXd}IP0iJC*6KrvUUp&0YMQCNBi z-!kt6??{$6yU!rfMD7to_7mO9bP_RNsL1heZwOn%mi=+ z%AM}~o)%|@2wC1{xXR-nc*Lc?os5{_4$D&qrsjv)8>pZ%GxtUmxgvKB4l{=D#}bMy zyia<3to+Q({H(Zcc~&U5G_|_C?}iv)aHi7ULfSOfg8CUU68)Cta)B+F@}?y!?>A2Vj_VM5ziTI85ylpzzaPj4 z3bWa9x8Fk=pF42D+mz%K>|5|x?;V&Ycy5DTQmV><)a~I< z!0|z5g!EA=S9morUu={>6}62_Gg8;6pw_{Yy!nZW4Z%rJ7N$7_obuU$$~x0Hwnkc@2u(Sg!&4>G5L?>PUJP1D>WY^J_wc0q-_vNVRgNSh_p???>jz6w^mOxYosd6>(cu0yQxLrhi z)9}j>5g$~p#g_g5X#pk~fpBOCS9AEMyvE61*$e4eS1$liw}(=@qB-R?JMiqd5;%Dk z6G@eGkFxl7M%*Ik-?D4dRnjg(OHz5?B>qL0L%8EY(X((J&Cl~pw(VW=qF%98AC|Cg zDvdwPXRMjZg1ls?P^Quq8xw}p1wl7dU^#oN{a?=SKlGzv+%0K^PPdeD@R>tWT9 zAKDiGXlNVs4}=x2*BDHUQ|$>%o+}wd(Y-5WO2`91MnEbawyw4+)M|Q8cwV}{u3n^B zOU9ETC=QWek5d7rUyxg+>VUrqN`}PzCudk%0s;W;UUh{L&Ii@4g?CkyheFB4C zR056ygw6)vc+b2LWyPPm+t+8wVULZ;vGiPI3>cHgz`)pk$bNYx-E};Q@%_9k`kSH+ zWrFd=a26v9v}|Q_dcb^tp0;7ocReC6#?!30(7^sU+v;j&n3R-1ADW60?()OISiDOQj=)bCiyi7faQJ&seW(d)H+M)uFAiEIGcB^j_P+OE zaypz(d;cECp!7bP@BU{ux?0E554ZKH!NG#a@wc(ktKypNwiS6Ao8l=i?5Z_{)U+vZ?PyHG%hcp+Z$f zc9dQlErZ7O5_U-;9XRS;`;sZc8w$ScQTYr638MQyi#LaZkV7G_}#;EL5_VXcLI^wksA=)NxD|UP(?M7YA4%cKB()b4D3l=^1Fy?|8T$a}~b?V?Qpda<$sMqyVNZ;=r6fJ59(Du!<0*DPOBadqlU#Rm8-C z8`IX#CPsAN`T4k3Ap|Px%8)M{1no$9?264dd);-Z-i-{9+D0Ao`R0b-SJQo)^|JN+ z_5X$e$6{*l$`gFdl4pNzV{3Ka?8$w9%yc4(Olryb?6&ajc^^~zMS5E~@BP{N#*pKA zJ<;=c)P5;L>^#x)@xa-+al`lq|5rdd*ckGkpk)lt^I*cxB@N%}soB3TvFR1x`EQ1G zm`)t8Q$C*)SU*0vD8pBFGrz238=luNzfVH^t>3GB`p(&Jn%q6^UCjA;x;*UmdEVsb=Dr9>exO)k)9YSUGT@@XJw+!fzzxbFsJ)pJ7z0Tm-J!9RqAo`n$QV&`<)B%Tpl&zr3zdHUVcBQD zd0G1IM)nY39Qf#!RQ|=Zi#>x$k}6`%4^DhbC7y89Pbtw8_z{=qhgNTjA3H|JnkG4Z zP6ARC%g;`|5#Yu=fEiH4fS4geDSwM~upxBEwI9prs zLwI1Z3|KQ%_ljfTG?&QoYpgY`_DCWb4#ykA5vOh_%WYv_5=U9*A3Rs?!NDzrd?G;R zXczPH4e0k^RY|vj)~jlB$njQ0>voU`;WA{f{(-I57G_16L@@$(7b4?rD*Uo>kpku3 z-j$mQZUIW0FLZaFVV2F3l@sk!)H@YcY;X26!L4cbJx#zL5}O{vDQ7@UnM~g4IU%gj zE0(%8)jk9NqVN+=8VkjdR1$T$<_W`vzC#(-6)+F~jrHf2Kqpji+P5lA(aQQM`5Kn&b1#;h&poQZAQb|$uMPHfwriET}6 z+vdc!Z96%6-><$pRi{qZ{@Jzv?AohW-_N?QE5?qmy|FcJ5D6cb*Cw%!&dboDReGOn$ zw}e~%;F;>`Wa|bjp-o?1GDhAm5e1`_r5omj#{Ju7GRGoAm}sLoeu`q;wiPz@4c1CER7f+mLf&xEW_FQT8qK-gz^ ze|as@cfodtal!S;>=odGrCP<3uQ%8X2dp95YOXoepn;6FL|=fDv18XPd3LbdI2mHc>q9g4wuT zxL*<=GQW2p+Vpd)nE|>Q_3_du)y*P4*rT#(Fm=r#d0hV7kuZ5lUTPvu#y>C*v{o?T z2kl2LsJU72G8z6Mvj46SNikmw0`2RVZb<+r+HhaHCd>V%OBE198bDSc$tGb5pK#@| znlz3gH^W9J$0EDXpnrFaaC?g4M4hlO;r`t?3@kI|)e(p$7RIEU!`zcewO~;Sz=pEK zdUd^cR52r!qDRotLuffd+=NO)st+&pR<>xiRxuv0ZAU(W9E1T$#M}`vlvxjz++pe$ z3&(^(3t3jR8r9TWj+kK}GB3PT5cO#@8i@v_x0KRt?2&BmSY)o*1r{Q~e8g?9Y4(*X zb21r(1`|1E7sl_jltikBpw#E`;uP7`!aP;;5`evT*x zjbm6%k>pG$YpxFUflrxps7=7Cp*cq=?!Xrqm#o-Dys5-sp0JA_XPW=1pz;sSrX%!+ z)3RYM9h@|d4s>e33}OVT;%_sPlf?9FapT`=+S#jJe{JKUa(`=wUdq z+}9nJSJ82X0$~fT*$3Vx=0jzFv^yZ^w6c=Zm2qi(H(_aKZD}^#=q0HQ*VZTF90^=i zzR>L^ZjzKo+V(bzt#I}`qEP7f_6?$R8@b1RUs^Laa&z{R`r}W@en?>EIB)b%xU3`o zlOLj*F!$!^oq$TDXf#N{Q)fXA-;F*wZZHpG+OE*^yeag1#p!<3?taiqbv48!(B%f< zz0iL@`trWrFReG5vKWO1Zkt<~u|)2rrKK4S%V&G7@r37raI8$iUpI7JHJh5LMOUml z3|l;RT`W%=qT;eb{CcX_*2ei=WwVz1Yyo3RAtlyQ;5jT~b$I-3kUJAm1RLR!tt%Z$ z1O@cnZ8MaxC0RG`zL;#`z_(r4nxRGm>CZ~y~Q0?%&GgZ)?zf7B>Pm%%M3C2^mJegNxG#vhfz<^j5n@1q?2j$c83M{o0TIo(^G^JRP++-_SR z)evJ29q(O!U*a)+90VnL&r!ql6|O5=pp51JmjH}y$cm-jcvZ&a zPQs7lyU})CSe$)U_4DcPmflAMg5NC*L91Vwo14@BW&wEt|E2A5Og-;nbeD8LcY9y| zg*B3K_&G&3Bw6yUF<~gl zLEG#jGmy;uA0oO0NZ(reYDV}brU2Ssp)n?qYq%aljuC@VN_?8iz?a5dgumYf5ifhOXd{*K%nO^ldB4~>NkOA~)0VS~KsLqQF` z+-FR6YOH?%7@J8*dkT9YlI>J|n!E8p5v-Fm(FFqdNPw+!$AY2JP!>VMwZ~7fymstK zNAW_LfWW4Zpm0QMy z3@=MY$H}aHWmW$yYRT9jv-w<}ADh1UYbZf5&I$qJjlHQ`99 zWjaIK)GZGFk6}WQkN8*3H^`YCFunF>@~N^SZ|2p5upQqxuy8nC&r)}H$2Cyi1QSSd zo?e69&6y>R;ulai>!CzbTS+mdp@G3ftb_)4Q-7l{C5i6wTf~Vf9ewWT+1gn@n`1;K zA7SOc;TWQDuI=mjsSw~nmBDrqX;Ki0dyCmM#i>_Pr+HI5qKLW4mNx#{ixA8-;d`W#Hx%y*AX$CZN3@hFGHV6+ zo|za0ECLsy7FbC=%@Ug7Y$TxO1~|TCVO!EhD$($v8{cq{(-iIu?_}8C zDEp_^(|h0h!M8I*xBW4Q;JrkxG`sWclIOBxZ=f`Rai><4|1Uq|pd(lKw!e^jcVh-l zK3F!|HIxi`3Wlkf8SH72f7YWn1?7$?LcO;eYB&9^Sqq~gHDrF`u|D9P+`oLSp)uh` z8pqy@jEcA9&X;m8SQwn_I#Nn9@ss=2$NaKHbJ|(sCK!w;@LXa1?WMOT$Yt6#79IV$>j+o|7{q;C+pS3x>Jm=&zEB7970Qq?_O=UyXje+6AeEMi0#JP z4a56EP)gU+eG1>#{*_;a=c`qYk3nA0|EwJwv5Br}e^4a^-&I7X#RxQXRzq#5Nw*LS zZvq!-YNGUjTSLnD0@Pz)tiQd4Bw4E95}<5?F9@GDNW)yPXkQ9~EO`+WbM@vh`n3L$ zx*|Rn5M7u5Kr{@OA$mQF-Zp8vMcqNxfCZ%;lEKs12QeS8-K;pyn3&;&#w)*{6eC$! zF~X(;jEJx<@6}5aL!olPopni}EY;Qi6B@{A3c5<^^IdNFU8JKB8mrTsdzffkrl5WJ zSArdXzX@T$U|sc{p5Ah3OT8uX3oDaoc~QvBHL<$26k_=o+Vd7s}yanW)8WDiwM8XcbJ+9qOXY* zEUeh(tT{UJXSKs{3P5KV!!#(@e=vrK*$&M17%$LRO$2&2SZjS6IwxM%ie<4CUaWUX z?T1N9w#DXsVk5}tF$uAjrCxbirSP!Zd(*BTNfJar`Q}QQSZJmiOh}5_<+=KEq5pw# z4(X#lQoDA_Rf0-<3b89b4d@6}_-NYt{F>LaW_ zxVKgW(6OBg?ArnGEdNC0ZgG!|O&7dDsTD5xg2?PFwBkns$k9Eb`z3_~k=b*mRhaHe zV<91{BsGbXT}(i!d?;z0*Vaut7L*Rk=CkewatN~J8btO=s&dIs`-a0$Qjj<4&WBlt zXxj>Fg9sqTf!252xcIX)BTm&^E`+kdNXop#W%?_d3S=TzEQ zgY3X8Ib=MTwyK1#bTu@1FSR<+&wp1y`+f7dE?TpDobp)uNvT%!o3Hg-_Vd3J7g`Y% zyEV6vD+5U@X5STIIFbcC(ho&^Bcx#{UZ*DD6FJJeov9$fKETMD6HaBuNv}@k-_vA$ z<%Bjyjt{(T*h)x9E~?6yNqQ;CJCI5ng0*rl|qO+kyV5 zjkri8FC>3YlPmx+0*Jj;u&pwjzjRb|tsWZffq7VxiTywN#EU5!+=v%pnkfI z5vUILhI?&nO(UCQ8Amr=uVZF$vxYj!8SY+iQ$PkwyCR5APe)|vV?p0|`>?SeV)fg{ zd)Pjdc-!(NxJ*`Z0wF<@Nt2JP?pVEW-5hL_OY)wjK$4Tevj8TAf?EYcpi$LX1cPqY zcs{Zo8%s`R@xpC7xRpI2WsJ+Zm^+H9eN@7kTTIj5e|O)h(vG{}VVrzQbo282xn=8n zb67@(;>oDs($INKo9P@cnyVdC4RyR@W;q5&;ZMtBSBpi# z=8t6^-(^j3&DPn2yOl@@Y2?PisM*$OO&lxG^ziPSZ^Q&N_jKX}4?|0)Po#+zqW4hy zSXsT@(x{theGiM1rrDW$GRMf!>jprMH)j}~by#F~KR&+Oy~@gPJyZAVy&aBlvgHe7 zlbe^1i;uZ$!&HW`Ai}BpDr5sTF;w$f`Gan~k#Ai~ma_e}=T{dwoNe!uUXxe{*v&J- z@SBUQGy4did>*&^aU?VjiQZ4`Q}5k5?=cIdC;DG>9cTu(A|AXlp$^EPdFE`zXA9Wx zT27un^sdqr@}=tZ)*ij*8o<>moNLlvt>Evf5B!IP5(@yep-6J_Q#(;V7-ZE-x;y@s z%))ZWrvD{zv!hIaJ!3}ODoJiJ`q1rK*V_CwJ-rnW!~Psw+9H=+IAd@B@w!m$^I^dc z6`joqeY|w%-T#=*Qt4@AxlEwb>D@Y0%|(WAIl>v9Ps!_blr?@=Z@<^40}hKjOc{aZ zDHOh5r-u>Hqb=sT#r<_{_W8aeZ~OCZU!4DX*(he~D~aDX_q54U05qm_6{?4!JnH5e zcpSxD?(nW`-SYyzQGhi1*Dw9&>uCO}rRqvZpP%KsEqJAjZ1sCx`Ae?1d*LSbR& zla$=h(0erSf761~#krK@2Bxw0eoC(G0I2FCeGzJtnei-m(qQJrGxIZO$*&C_8A1WT zG8Q;wbs8PKfq3g+EFmCzE-tI3c)P?qfW{cJYp36=6d0jgUu05Swq5)i7o-4tn0NG+ zSCFVSVn~ zzggSMKl(}0X=xK{zDsDrY;vk_qIkRa<>}`8+_6|&%&;EmdGjlEzk4XwLw=b>yphp@ z!M3eqGI#e;d1^hZGGj9WqI?CsxYc;}(E1fDN$J@7D>`%?m;CBZ!B_JgV3t?5xF*AjW14VJwCM+M2h`5+j9@FP0nR#E#m?11jI< zX>2VEirv1o*?U9Yty>3gczj0JmbqhWnW4;BXYVT-i;C;-_f|#@;tpDgMSr%1&W43% zFnE2Pdk*rm-6rNS96=QCcd?&2{}zX_`0weVy`trT}(bMfr)@yWIF>&8zf zJ159%nc-#PFi}D#_33}J0Lh;_9ro4=QDS>@IiC%i_f{n#z7Y>u?fyahpCbuhyV6@4 z7rgdejkAu;^m@zTlc3PpHo9#!2fNLw%9Y&K<-(XP^^ct}<<)uqahp+kpkUa#-luo+ zeEpOB?;}CQex6X+E)12nwTtp`TWhV?g%mk@M&k&)?_J#!Oy%uuizbcAVGV2_eJP9U zkodmOpOW1FL)@(m<349vXh@pmAq&BGwZ#sP$xyV=951a#ok94+_=j+O<`i8(nw9l7 zo{^UAbPr_eHt}fOk`4n1E7c21+@)1kvNSBtFFFZ;qmGU48@T}&QUKFBp=kfoh13y$ii z=h#jBbNA?KuK(;O_-gs)LVSbe!Au2K{LP^yd&reoqv;EB(GNu^1LAGfL~s!++~r<3m};N8rNTdka1nIXEvoCvJSd$F5>Y+p0KiQjaQE?mRxrey&9;U~IK1~e~yBfQnG~Cqg)y`KoL+0jeD*Sr1>l|&v zYjlbjPu8@7&D*3rgA`nuNbS=*7U}6|#5Gy*9HXLK=z(sMCEUNu;EjPAZi7okPK?SP_Ufj)28O^<$^E3}CF#ap@ zR9h^2%Qy6XiAqys1yVjXkb{pBN1?fi)B;%dXsyFD*V#9CHZVIo%l~!swK0yN|1!kU zjRgi|tVMS{T&=qJ&N%V9UAKIOqwzi}w_YEt)YZTIzQ&~+wZI>(?5aCCyPq$;wp{K< z!r4RS)J~)KRL>UV%oHjY^gIrj0j6`T{)p{o|8)ITP)PMT+v$chA$c$WoRm}l{^@o) zr4GC|sAIUj$znV6W^Hi3%+myIkA zmSHfuy6YP)GF&^=U@l?NF%B;|9juLv%h=(Ch6l!t-S3u$0;4TS_jEl zqf6Yc923ioea2azh~$vGSpO^mtRx)dz1`iB0SiKZxc)hmiPhrv?r{$ei;hBQZBn)_ zN8g}G6TZR|gDm4lg<36DS8Zwd+zj&{JGb{MLJelMhJ>_VdAyDCT=9Aw%8;w_OXX&2 zq*-p>Rk?YP4d2M7{)0c%=NTU_I?x&ykM5c4L3rnx%KYU27=NOpql@|g_2FV4yHenu?{Bk-Gy4uQ|Us_mih>sr?JisI_ci|GGF^_FDr_y82$bS-!#5y1ljVU!0Nl04lMs}u$ zioziBong#_<FruT}E{oT7zvK+3X~*#o z7ovpR7;4J^u8sIFz);Yy+o=$Xqn3zjueBu7=nIPNH?MvV$K+g#I} zjA)PdQ>X=M80h#7ZM!jOvGlluuRm{W0eGZwibuD&&;hf*D)4B{^fx!;&xOqi9>q=R zyOMEl3ox>0QE-I@&E~@*z{EagkJYvMXwXZGV8VT}(yfCuX&Or!=^!oXP~?d*VfF=( za~*>$;zc0PEIMSb&eb(#COcRdl_=_TS^xQof%rk2b!3Jtfbu-7ma)Kvmc7~ zj4=jMd}f%MYFw>fsNOi;>HE+}#uMUZyn*_ucCJJM{ue#X^#gEJlCDPTsS`cdwxWU0 z9f|+=4?&JP_mRHWFa29H!8VMj*e<9o zz_#t`)yg-0o^-FXgFX>yYyhP;FfBS$54>9eZno?=ZaF`LF50U=uQ9vKAykm z6?&!Ny!DF)hD z^gz%}-|zoV!;*C!4I0p80@^t`nzfs6^5T>xip!r?npJjF6I1ZY+`wAKA|S)U6&$Pfnyd@ejRY z_Z1-sB)JGT4-&*NV*VA5`gpZ_^>2=_d`NY!rdA4PQN_*HT&%pbY8C!y#>tQIwDH?+ zuZFSqumWtK{(r!{xe0FC2%kF`e0cnit>5lh{<;G%g77{9yP;jcHA zZvD=upcvoht|@+}XT8Qd1i$C5V!p?}`Y+5z#eC0Z`fq8#Ykq^4N;Q{u1Nf*3*OUTR3vA}Y*Vk(LLym)g0esDDjaxVyfG%beSmwAtb(17 zi0vOwb(x6aWPsjB0Sv9o8ywGHqdJ{y2kfgwQ z$8Liru9oQ+<8c6}%Y9 zbHXSsNMF3ua*#P^@F44yQbK$3K`nCamKt>OT~&sJbFL^fJATnWSrV3OyEWwfQmdnm zeUNvvWe1!GSI?T}BAW&5My1MA)p3R5t8+J1d>|D%!dzU&cgZ=(#=>H~5Za)s7x(a> zt%I-M5)PIoS_o};omsPRGKjnUUenHBko7vNEbMaN&r~^?j&vasVqZhc(#ERy`jW@; zX6cBg1Soej6}Qxx6G9Jho|b#WhEHp)ZFc&BfP@rbzpTL)a0A^ZtD#;Z0vq>?4E83_ z_8FW}{Sb{=kwwCR#)ZFi`T*_kMnCiYGaVs~vXOucl9UpK)r@ie2;I1$FEmdckms+) z#z0P9D4`%}v{TS~-UAbUZclfBZ=)GXmQ~%Mqi+9$(pr)w>!r0?$S?~3fTI?&%;8b< z5-O_?7hi4j%Hnn4E3bKGq2387GN$jZjP)lEoA3~#c8?9KiPVQSLh!~46%Wq+EOw>W z+0gvMci z=!PZ8z;O1F0-bitgmLU0y{i85zv~9j)vz56*bPznW(EHkMPaXGE06gAkMXaqEO2d- zft3J#g;Y*k)LsAZek{5spg_ zGHaBYT}N~ilar=<_ZY*ExHv7EDax43JX@|)JeNN0f{SB}hli%7TC$WHk}Vh|TsXO` z0-6_*Ns6OS_*+4+DYlkKd)tXRyLphyRlhlHcV@k(0NG|Lg)V#1+g_+Dc!jQ_ zt6bcT#+lpG;>moWH`g^iE?-AeU!wCT(lU1g$F?d25=J_lB861bAX2>C&H~n4i9dGo zh6_!)ldTs+MHU%VC^Yy{$XrsV@YSgxhg91RRX9N-71QoMhtOZ`W4!9sdOuyyG2g-> zXUqr4_oBF)vR^y5o{v|?RspAJt16|bW8}>uL%U}BqfhOND@NXJ zLQr%R$=cGrSU7JnXr9}B43Q0QqWCs3AeaA}1yo}u^jNOrSF{^PFjd)5&dOQ&kAd57 zIt)EFFKia+@DdlBG5!3Z+J`&183Y{v>z;U<`-4V@HCm1Z_GI&PC}nXXKVq`|vhPV2 zrLj9;bITqS#2^9M(0ik<+_-m`*@kVh(a(#+ctgT9>^QWOc|wXEy}kwANFj$SQ@er^ z^-Lws^qNvZxFqCZa9wdbk8DYAKSU!Kxffhj;fJHf-8EFSn{XGwm~D=x5N?jDiTIfF zd2R7g5PKUarbTaO{>LUWSkE869qj37`PSJ>P%LsrC+GfeW(peEG7!|()jczpCOcUl z!$bWZBiWtv+E{~ibaXb|64E`G@dLKx7|a zKcMS~H7W|!j*KNhd`Gg-;TiJYd}v}3{oL7)TUe_{K%z*cxFG7R}qpamv`2_ zxjUhs+z-xiti@|&=nA`(ill9!wrDK(yl>V@G!gmz6@y{VMg5YrSHC+Z73}>l+j`Tb zao928uO8B}bgPBj@Bk(!k7V+Fo+%e~M&1=tzIq4lkZVBUiAa_AI@`1x5;+c^;kKZG z0TE6=_)b0h_>t6Nq?sz-ct8yOvyQ(P_0nVP?bj#&7e?oXpE<&{JfJ?|{KSuxM61*J zPnOqnfHKNG&wus+cI&lGO-0?QldsmSj0RX3F$R@pnVb|whXxbrN2SqPJIiA!f1T>) z#e`SUC8?H1cR(>!3rwS7%tOjHP&aB4O=!l2;A;pYwox!;otb(?PxyLxW#6tfGfB?g zl&b(_5GaPha^X@I>y;vhpb$OsAWf_egD@Ee$;??Yx0F%eWWLYuux)bdX`26q;z=#D z2XG$+q>fw!WltP2ghrx(u7HLe&ug@0KXqGLvfW%=ZfWg=dxMy^I2ajwe+PLDNj1eB z%9`|TujlBlQL$s)8QJ4JaS6L_XQ$-^tY9atGaJ_OV8ZR2lTNQMIqh4NSN|P?c!ic#8HmRT(hq2`{^ds{WzY05iaakUn{G?Y)-M7ltny2}yhF?E<+t0T z2QJZFl&Q-1q_?l|fIc$~R>CWOTnjdJA_z?m>7R5!4`n93K`#2yA!(H?aEVMp8K-E! z4a|R2zUgnqlnX1%Fa7W>p-8b=bCGHYg)V$eQ!*xEhwazbH~a7aNHIuq#THt;*?Nda zqL@%59TQASJ<*5US!YI!U)CMlZnZ#S!MEbyjciSedJ0KKm%rg;Y#B z<0B&^Hc1u3RW31wpjQyo5XQpfv}J^9rzGH{DlXIct)4aj6#7ZpE9PO18h5NS)`d9x zACzF3QOL*bby#o&`GcdAW0)yq)Uc>HYnjJRL%OCHVRKua;$9;%VyT7=03WOIB7`&D zF&N%XxW&Uszyb68-`yoVyDlhEq@W;a&!UCF>nhRnlG-(CYceJUJO}7&xpE6i7DgND zv3jz_2g`y4qdDe?L24K)j$y`LZX*chA*bxW1`Pk5$vY)} z;j332%mhRUB(agHa%v7?9`=LI;I;Q$jcF4=8NqE|J`R0+Xz_h)QcgM*8XaH|G$!wk z5_(VLeilmNah8t#cpXPMtryST_Vdy#?H`LFZHgG`i|B{#fMaGEJaeIteO$J3D8aZ%q9RO9!Z@;Db{JgsQfWN+ zSXU*#(jcXWtVOzee((|+3Z_y$&KU=otHu4rn_vEev9w4@8u^gUCH!O&^c3bF{Z9!z zxy8$?lXl!pYogS0A}GgEP;HtESrfC|*b?UuR@`!x9alY`{KEC<+l2M)32$0!r<$b# z*%(7AM94I7M7B;zrsRpe0y+z&_qaaX{72m1bve&zAYPF@9*PT za*(O}2L}fv;_7P2>fT#x8=I{jdxwWZp+^~AcEFS&8>*VLxq*@4 zHO`zMwx&H0{cw<(&Fm6Ze>(Ab5o4NO!5(^~ggB{CTIdDOaAx;4LFuzBIK?Sz z0PC-?k~(O|-dBBl*JBdh5!*&gbtI#bAJx?F9E?2@)W=VBrYNwb7E_C?cb=>JZ?CZ98zTm(X1Y$d1#hC5C~s0Gn}Ez&CmP$ z`x&F*u|nifG#a{pi*0sIAikh3TGIW(=(&1;q@cW!x?8KixRpba+gmgxx+fa=aj~Zcq2KeMcrDO}U2wL49*Yu0 z9JrwM-n3ZMW>n{5Z$U%RkN=_xQP63w9q$7vpH?I|y=S{dPGx*jRT%UP=I9nPcM4ZETC>iMsbGa* zAg!nKgT#h8Jl#{v_Q$o*2;vp~7_{NXp2Ht3L^pN#+2B>_{bYSwL%7>i7^D&_O#0cN z=7^`~_(G)o6RZ39FT~&VD?v#R(}=xxu};_rsK@%~Na{&{yV2%Mv;#U94I|}K*R%fJ zcJtqH1-w$ZlNN21y&NT1VA*!pnmYx57dDP`|J>3p9VC_QERbqqzkgnR!FyE>|6lMg zjxD7?QwgrCCZ}3X}y-1cl>c9#PjKM#2TsdJOdFLIXdPz zTBJ|TlyX0$?VxL@V^q-pYTOhHb%gB^2KUw~oOpia zW_TCn*{Ma()8kFe7v8sHpNPZ75@JSkkQ#k(xXgs9z5HhO*l&EXIP^r%%fq7japilr zWT3clB|g=4y^GNG)vtwyx#gJ}dLd_K=EWZ_rr;a)6Q+M=vC?G?LMAVs7H4oKf}s=a z+_QTvB9BwHp2*q}6GRcV_~P65Ij&x<)9J~E8@26CCaDHu>F$ayusZbm`pxhB+KI^q zPqfusyve5-mzJ)tT>1X;$9DTxGj2QA&(4kx`}gM=ugT7Sw~dR=PAm0l-Bw50)FJ{f zGr2515L#WhZOkRx3KAq^Eu4&ukIx#la@LHwySuySi(3DXwX^<5xn(TlXoPW3btrwz zXwk*-&cEkR8mPaHZIPL9e#7L_c=_M9atJZP#)5a+WBu8X&8nn^QBWxfYJK#beO&+T z=&ViKhH3J-qRo_ z&KAoDQW#b(q}#G;fR`b&16YzNXr-_`@zz@I)lnG-S17}q++4H0E<=2~F~ERWor;|h z$0NBSRYvTmT0ok=#*6svQb@Pl$Bzrlrea*OnES!vTW1JWI<4FxMdE6$yGFnRLfNw4 z)bs^Yo*6A@EgZ3sk$}!UHGkkgC7?mf4}d5Ii;AU;{H0ylBfJWYNMmmXOa&2~m--{b zNn^(Oa-IE|bGEEpj|`6rjS{=LTH5}u5s&HEoRCwyOkXCWcUWExV?Pwb#+n|J zYdeBn#520+eBy{qx+Qmt5JdqJzSv||R4B56S>c~WPyZK1{TQ_PJS{hXKTH9AX?a}5 zx#5)IWv_99p`D$Xl^p{dwjA^%=_zv4ZYEF1DP)P$Nz;n`fIsA;PbR)XjDO%@NzjZA zr=eUHO&)zj1^ya5sLa`4!U{fDFaDOs8u|dLkS}aBfiO?A>3efDI1{%eq+5b z_~WEVE@jIBZ&gkAofnkG;j3eHQ)zZ4%u%zHApb^nr|J#y@%$6uKqOZ8$b!29Lsfwqb!-UH?K|t{;ys7Xgq_L0wS*u-{v)W z;2;ohV#1wub!8cf`ar5Mvk=<8uvMR%*;&MH_h82mRDa}_pKMf?>I%O z`z50rD@?I@Ze@A-d3CAlvxnb{Fg(xB=ZwdmZ|mdoF3`G3x=Oh`v3%i&zoGwt$x`K# z)q&%R3$KRe)x}k}`^oI$;iDdc#^wC#TK(wTsk{B_m%)|15nKD@oq~O3<56e#3(uVj zsMWT{{6IWeSVNW-xg7B$TU+5|2z@(R!-~3qHXSHYE`U9cfSFVP1hq#9%o!Hi90-dl zZ0WpyFPh2t$7ZyNRH?3DS7Y$6MsX;M-%-X>hZ_Ht)*C97c9U@iS@>A9vkLDK&ST5t z=G7hF)f?}eBuH?S(f;zH(-e}Yj-F=Q$K%@3A^N)*sNu)+LP}Hhw;Qhpf>cP=6}J|< z4+t0ifl6{3;zhIu&yW?LVYy_4Ectv7%we)WF&Z%Fk`&T-qPDIE-ZV9>%$=-! z)SyJ!cFZK?5=xC!FJvHK+S8)Vypl+sRc5IF_Oe}jBO2oT6dRPoLfvq7tj~3s9kCQ!?vcT+>vdmw%N6g4;QieT zdm^;7m`t(06`hds5OU&<7UC%93Ju`0)wHls)7|q z7P3NnA3wKHFX4Z)fFynzSJv?u?piL@%~@zi556QqJzV-l+x$P?HL5etL)_}8i^@)a z=qj!~wISHzRfn68aHwSuE{V|imHoO5xm+~ad^BShn2yjOmR4wH&*)jgs1R`0tDt3G zJG*dWL@639|6Yi;A$BMc9WEqqB^sl!PY9QJFwhX%5D^56pt~G%H;u8(p55Y_w7zyo zMxe(3w7(xT*11IB68Z{_0pONGq;O&9Vh5_69_}pZ?!6bKVm|iNKF}5BeWY0cmIkLR z#u8NAXtc$${*f!ltBy(Gjb+l0SCRq11_`8YE5rfekm&staE6GIt{_DZ)((M5y4 z-6JDgV-eoP=+~zAD2@hvmc~dXe`J!ZsCWzUa<|ga7OdqJq$P`V{+zGfPcx9Wgvn&w zc}y$#8W2@u#WqzAss>E~Xk$9DFmW#xv)Fw~Ct`wXhX%$0-glYYfW}j}-h0*w1g{_*jw(>^ z_}GeuP1mVTETBR7;~Z{0w)P99WKw}& zt>LWYw8#uadI}&8`7@l+K+^=u@WsU?_2d-6>s`>?z~<&=j%wXb$Ahujz2T!n3`dc> z%&$SW?iACN_V1PE#`yi7WopyoDC_E_HOH!X4d9g^ERaQP&FbpvdUSMT*Zua`+_|@T z5RxQTsfaoV!_aZvSpBt<#$tx=c}!%@uJGjcwd)1h-}}Cb%z4>+`T2NxY0kW&p~>@6 zwFk5D*w@#AaOrauijDW^+U&-%qNSG=gIz~kCusL(ux4a3d_WDvv%2#PayvpDQQcZ3 z;)4(Bk3a>(HW41nRHPSP;sE7VdJ*s^c+e80{Ad}B;o)K7SO z8VC6cBNKWF9NweULnI3Y*iQiFOBZgx8HXiF&eR(3zG=++llL6-V;5Elfi0k6DLpJo zIo^VbeMo4aH&9F7D1Fqhr!!rO!XQXiveg!Gaj>tgGP$8TC|$_3*HubDHdo%*)jI_p z7LzwS7J^w$me-Vd8k#a9P00M#nVDNPINAv@dw)##S}eFj^ySp0D@Q{Or-9zhTauLe z(B31l$^GI7+K|zbjMc`Yywd0ZEn0za2u&1fX335Y2SfsHi>f7%sb)1n1)kjXCt{<& zBW@vTA#2(4s;(p@iKUuDlU9!=CR|@uYTspKMrtZWi^3aU_LN-3fY; zZO?8Cj{jAk?e1Q-G#OOuWrKhcVU|KE7b6QHHCB`6dW_V#yvOCMVCQB}GVVQZ<|?ck zy);*2`e3p~zHrE*GO{?~BY_h>RW{;rGf*OiCqwDB5!piyg@Rs$A^9Wnx4U(-U9FJS zK_^hR%g-e?LIW7hgeM!am`PE;WgGPU{kyO0q4m|4qToz7qsI&M%NzKw zWRcE~5Q!ZB(VDXfbKMUDnbZ*nYsv>ls|dsoX`#WbV^(b9`J@4Jh)Qj;8CimRb>K-nQqD${vIa*;(Ut=YTl3+yf^d1AOc0zo4Di< zp6j%x3@QP6TM0u3B%Y!%eNCpH6Mq=m<(8P&-o|%#zgDaB=9DHQL%m9GYn2$9Hn&(t znKI83LX0v}q4&|bo(7r=dg;k~3$!$Y47!HX6}=-q%0Jao0sOf*kCttrbi~!2)m7Kc z(89sNf-2H-nRUrwj&*Hit+mUCL~^b&tCRn0u^DMZepuLA7*ot5yS2(`&4yxlZ|3Xj zX4tO#V*aMFQI77nrLjZ61iEGFd;fB@`f&E_W@u=bPDrCjuG!{sp=AUm z!x2@CLVL8mZNQk`ahLsV6t8MuGf2?QIQYZ8PSwoe)v1@WVkV!-?V5?o!_axX-rUr* z3Lwd52$1dQ(bGM2lBKquRQ^#RQtA!n02jzK8Z1BTihWk5l!4?s-jI%p*R%9Gvmb|w zdLp&=&5g~&eMEEwY61AlNc0WLErm>r!k5gIfFKAEK}Xp>_-2kSCJ&F_Jn_~eddn*? zDM=;or_n2KFF!ks0p0dBxV)O?ZiM%G_9ZxLMdBYn&#%re>FF4@D=se2FF*lnu9bRD zKLzmX{3h#hm))+e4Ql-SRhy4^K5fn#c3GDaibsCE4^=XX{Q70*=4EJDI%AGOJrVA0 zXNRC~=hkKs4??THDVaW`1vF^$9hAj$R zR=J2bLWYzc-?jqY%8FuLek?mG9K##%wwK3WlPR(sg8k^8Z^Td)cf^i&9T_K*IUTaE zQW;esP$+-6)^Rw)4k8x>^K;~22WaIYY9^Qtp=V*7oS7{7W0gAonpn3nV~LV!Gn0YhGG~Lq%!~^8_P*~kV$$->=*``)Ig$cZb4is$lB0X z@g+4N8xLMHu3oG^{8UZjNQ`8)X1^(JSZamyaHP%y|B08T1e#&rLulWgclUl51kZOj z9EC6 zkmT87OL$vsSoh>nuoPn@D4L6Z@=1P(N3HZ74q#+fv%l0pqT+PC-(mb}zUTgT=c5$# z^j%kRVUwT6Dp6Y%50gXI|AwsJV^|lLmL?e7odbIfRaT@n0z%=5^(2;N1IT~<{XVt% zZQ`6PSIaCJPnkD{ap-7t{#Vw>^2-wjF=RUks(LnvohUnY-UqKTYENYr?>=u|)ysbL zQ%bbKvlAO(WrACak7DT=-B^L%nV+boIFXyl1_QxuHi?e;dPSa9CD>Gu74 zP@2JTX;B>mXq=*kzQ>6ZRV*OJ4m60vNUKDuQ9_H8u3)+`^KYbOP&!X{z#Tc!6`>q1LDII1rs&c&r8j!G+A&K;ULE`#wsBXo5TergP~zT05!z^?yrt%)z4i2 zoN}nBH=FEuza7s=sa_6dL8Aj>|A(e?jE<~fn{~_yCbrFq&53Q>9oxpl zwr$&(*tVUCZJmDJv%aigDH zwz=H^re532W_IgNbmHBV!27W?^Q-vxP3pQ0Th;}y-|dijuGbfky;5CUZDV6|V2(q{ zna0EOUOl`iTz5oS(~S%btm$Wa@3X*lGBprLEQ7{-8^^IMRk?vo!QAz2xe=R z(S-h+S*5LlGVd2+j;vw3t5;*7{)^HrhtWh$-lG!>j*7!U=bf@xKT+tMpl8mjD%o!( zYoyS;LAR!xe0VTnEv~Gs5^1PKREF-FQSlc`fNo5K+b~?V`DnBY4M1+oo_?o;`_mX) zHxxIS_ApjLmkX3oPIQga$U&INC(A)OxB$IdA{^%*UwF9uv(+H)K~4~O=24qeJgDMk zu@Rb}g_7SfksUUb&gQ(O%XWscVemu(SB`U)R^?hc8HepA=f6kR(i~PC!^SzsVDac- z73+irG(DZ;<_sL9N84kFgYXRmi6Z>=KT`Xdti#Uzzu9z{AudJ5WlhZw5D2)~HjjfG_!l>8tvaJeZGjKuZ;>|rC{A?E zt3S4twzaKQv!Y*54I zECTx!HB1m_CVH(cV)Ig?tRL%WSD#p$DKJ_?pzUT8SG-$nHyAr?oLOYS=&DqL$QM$tN$pu_zUFa1g-%b z7KWU`v%9-8Gc$~QI*W^K<*Y3xn}R3^HEz!|1N1Z+s_-*tyT6~8i(rq_z95OVu69Zt zrZeutd2dzDt;g%^Fx=~^Cvi5IJ`dV(hI!>B%sl zfG+UTOcxcQYGb1F{|uY~bPsHAe+kLS@V97Va1-WdYEcKp7i)gkegB87dgs~E)YAhj;r88q7XF_X(4qwW z`L%RuGZSgsdvN8Tc7cbO^LF*jsNaLfc6PsYbp|%~T4?w^X2<_pP1);nwrCSAh6)J7 zxh??rpM{thIHfv=HVsb{!2?LVZK*N9Dr zyfZMK&EG+KxGEY2UT*c3(2SrP9G6>l%$kiBOOnSU+1u$?#UcHIhiS$AX`O$*hz+Wk zIw8y2RxyQaKFAq&l2=D0ar#wG9#hg+&qJ&TQBt zu5{nbzIXGt2j}WMAu;KrCaLBc3ek;MMtJ+5))t%63houk_>@w|z$(Fg1{n{C5)M3) zwly@|COKYN>$LT)%MZT3KQcPX0&W*;0HMpe3Ft z&+#Eifi4@o&yIAp}dYTh>D;^0T&G5xAY^eoG=@%-xrU zS-W6hm2&I(PtuXQ^o8q8rqS4Hg+c&-+Tj7#zm*zDR~8h-zAo*ZXIdAnwnYKqwjR`A z+kc7B>8@(63-ipXux+5bH9-IrbPxZvj;7-_6(l3BhP`_|%STjxi3s5e?L~nvHSoTi z70b7&A+y9i0s3o<*_TgveUFQ=|DxIMlf97VvNgQ7V@Q4vk@`C(xX<6~Cp{0^NDOa& z3!%L?Gdn;oA)C)-@;m=+w1D@+<`1u#|Mbbso4t(xGhqPzpIopI3(nuIs5CPfVxFXEzK~snOHb0>-yKAj&qZ1DOaA-cFtIklw>uTW_C^kL#mVM;y4frtNvJ zo}rc4vOwHCls7bp7hBYi;#AotMU~JP$ycPt9{g8S0xfL<1{oM6<4((@VV1l=jBE^jFq9rKjJ=nI4K(Vlu5OB}iGc}FY(5TlGooJl)Ldv$h- z6z|V^^*~yrB~&Ck`smpy|1L?&c7-Q;gHyAAHO;cgY##WEB!O>1|@;0kA^5fb_%4I#ZJ0~c{G=~DR@Nj&kESZ(g2 z>59wkIg-%>GsmN3M*uGd>SQ|m-TeDOJr1!C0%#|L1PBlyIlSF?GG_xZG_S0(K&YqR z)yL~&F*(;1L(j*&JNMr#_t(1#i9jOaz{G!{dyJp+jMi1P2W2IiKyFPczV@cW@gXo1 zc)j0G(m=S=dGqk~Rdb#p6Te*rH;XbzGDVjkX&4!pAfjcZyCxXkrha_64t!zbDH$i>vfJwst20Yc)$9q^J>wo z!HJvJLgYf_!r!)KR%dRqB^@TX@Qa&t7|G^EpxYLT%^lTVF2#!PHE}$Sczq3?+T|qv zu0#wXm4DT_8^{~tv>@X!`n}mY27__vLseVMJZ*PTz)-i-Q)3Es1dkL>)Yf@n#vm(p zl%aXL=6*)kERN>bGAiOza~I92AQN8-JA$Z4+DK0nFQy8}m$_d<8TJpcVJxX&VSv2| zus_MQrM~0~^e!S~*e1**e%D!r@arbRUfC=@7-VIP8m3*T7zRPJasQF9KH@TbbRRGL z19Cbpt$eb(ARKl)WHVZ-9L0zs$uJDdxPvSun=6!jd_+e5XTdQ8rf46=YDr}GE4V|( z{D2W5A&wTPWAJ~(|A0I>YdM!|9R3~4P>?&g-n{OV#dMf|79gF?aJUf-2q%-HsAk0+ z&>1!fD~jvt56VeUZKLoh>a$inW;lrHf%QnSCTdT*C(8~uFnp;VQfpj$@L9IrU(p7E zgvRW7d!1p-@%csq+vPCp9viCleem<5^Z3W{y>qf4@Nz-<-3kPq9x(EGU)1WR^}fuS zf89(X0yax|{BFi}Uix=8(}%F%{-=3zx9Z#50lwv}9!H!7@cz|>YBG|LbBCl-c8;3q z-j?t?!W2M)7F%sXC7evTun7ZIUMjbk$fl0}$Kb-M>TuFxTfw}e&R9jDU?x?xqL6IA zh9a>>%<4kDgzh@?9nYp=*!AIJ>g{=f#H?1Bl8yZ8>Uh7P{sD1?v>1HoKV!;iFxzZC zCtgdAn;XB^;t6^F*K90%-Eyt!`i_Pl6s`aV(7M{CDnfm5Yz?HYJm3g{>qhx=k6V^Z z$@gRLN4V%!$1-rr!@`>#b)N6Y$I(|{H*4h2$i za@@IE07S!Ly9CtZ3M*9J^!N84FI9$iZ<`2j_`7eoR#k=7N5-6+CC*uRVsYD6E^wY_ zfx>^yPt<}~!e5$4XmG?(h6V+NSQ98tudfd;RcdRjuWi^3K=U?~?gQZHE)A{1gG6DH zX!FUl|CNDwuh&5QmKGNFSZFRXx1kixGGUhG>FHIeU6H_AJHU?$Ip8OJDr-b#4CHq5F~SVU!WUN^ zuIs>2a|(Z;CTW4w)gwadEYF=RW6<%3lf&PDX-w|0&zQ|U?G?T18-~5&9{>{#LeT3sd|>VF5CyWD%( z5}a~93&sbN{L6>%PF0OWA(IoU$B4dV6MZiXus&y=Y-99^;B!o{0RwC}KATQ0#t z0{XlfJk=DThnhG`=y8-J-c?*M$xo{&$w-Oq3q*0TOt6|>dM=oKGza&^!t)ddTJn*s zlinkbmwBf|#r@Svv@h}ajSM(>fAmrpM5WVtvY0oRxVUPfGgg0@i4F^Kl4hHnZsgNI z+O*^>t>T29%ukca7vt=Tz5e+pWK|^^BmNF<-)mxrP_~`iT)vo3G{y)nRykhtq>IeqaA^G|hGFvtzK*;zK3cp89J8wl~k>j9YEdLLh zG;Z8TVL9^hKD15uq_92`(;}IaB1B`@nR;BE(2Epyq-3&1(&n6MvSjKBCs92|?I7)f zgmP@POm?n*uxYVDSzlfe+47Y#(O(6(WY9%O-Dad+=T95UY8au<+u1-A%>43lfmZ9n z>2&iAFijNOj1%2%HlQA&Tyf;847{UEFm^j%uDc8w#dWxCyPUk;DUsfcc8xU1XLBW+ zjOlw{zl$m^pHB@P9X$gNjX)pg>=Ky6psl3sy`$~*e!WY+_I_qWh7>h)N2vq&7@L}2 zE|x3zzQ7|LdVG!e-BBVEb8x_PJw86RU(N3seh*>lg9acZsXKz&H-k{Mw1L1i&6Nd( zPTqY0JzK+WsJD6^j!;UnS@ga=dzc$DV}OU6g#5xu(Z~cfyOa~nC?pg7O}KJk8GaI7 zo^DQX4x8Uc3(AiVR#P5mqiZ709$UtlVtz#13yA!iJ^(!k_`QSv(niBF6=X7H&?KEn zOq_Ir4}DAtpo<;9)*oC#ZxzfP)}K-~EHsagrtDYqs05#c#W@|ZOmqOhX7Z!lP>9-} zCXJvl60oPBzjbR>JUP|6f2i3KPlnuCp<)mRX6KAOJOEx^v^jFOTg6AkuX3eV9jgUN zU4TQ`NNt(xQ}=m+e|xmm?J^&OGnhjR$wEt9S3(W1OQk>b-e8dbakjQe6lN1Y%U@0wQXzUEKcdZ+DPvF@7cH;A z+WB|VYQCdR0w+u3Jah+C$;4KIu4f43MOu88bA<~ap4)x&FmeP&voo+YS? z$rJ-ofKcqHRulL0#b$2CZTSsCZIq48sOLU1e+P&hc&)GGWtSY-SmIaJ#LF1L+ zg`kB`1Y#t$tlo@uQKAWVqFUUVF#}bXNpuy~>PtV816jdI*m#SCEf~eLqP@+U8fInZ z@hKOEk_%o$v=R$=C+|5*N)yP+QJK@SDKKo)^O4@vcViw<`?MNwSAL8qK8`rz8Gr3L zyWi7)q4JQDjpZnp@?8~2$HiCiNlSB$tq%UJGV?;M>@!w=-cJ0?IwYrF(hNhH*~ zU-`YD_THx>{Ug{q+&{?uzQ82-ep8mWp@4tpeYvsoIc_Cjwr}*irOka?EhTubO$ju}l@!RrbnrvNt{~qAzeIVUEHMsAO@jKo# zrmy-QWAxoS5BfVCLJQ0DL@KfMm6-b-?e}?@4y>ly@y!}FGT{P$-=sf$ANrP?Py-*% ze#VrNl5FW<)UIVPOK#F>w)j_$!J$Y&aTa&b)*XON|DP9-EVEc9KT1(XTq35UX-{9F z^P_m2+L~ejb#SQWN@a4~Q7a|<@=uE@wB;^@Yx$p)tRx8@?md!)G&ui$#RAn7fF78` zk!UgV5B@27X%Oo^-fCHT-YrQji`R;%q!i>VGs#`>BnJPYC6@{@+RDYD(iEF^7^j&{ zU$1miSKj6XCS19Vek5S!kf-`(Qq&xA`DFtD*fcRzbQVc`GnA0m@QmSd!IK7WK_Ki%EE zc|Bpgys(ZHCmneN@wsk)uVFEl(@yD2IeF#j`OLOE0Eh1W!UwLXO#{)p59!L^|Ni=M z;zWNxobUAI013zyD{{H~olR{KvX^v|;N5K8_@!#fEu^%zGEVR0u%@JL{t^g-$zbnS zFGrhMOEwj18po*2@1QFHk3rvwERl5H+(~zdxE~T^q+@8zMnjU2TpEY#F3_(i8%hk% zHyx;ABrt1v;w)k-yc1)B>bpu)H20)?ZxL0R?d%~##Ko3pq_i4|mY_50Jg)nk(=RMD zzTYuCS30`7)$jCGIM7dZD}Gn)m?^0#@d|<@f|=^NkRZ0K=lAM>v$sz_n&|m83{2Nx{|gN1GymjTcNjrbJB9g`Cs5~Lz)L7R`ZCKqs62mnRs=u zn@SH7{Oz8Z(lj5#NC{#IH8B11#eX6I6%jgI{KS%CU`7#{#3h!`@&%ll?vs`c1tW<{b6`I#Ama7OSb+DRkvn&7}ec%7oOP=qZRKHr!%O^ zpa?Q9a}Wt2n<$P0x>XHZ>@5h^NY*-H?85{=wOgV8ZI@QBIIU9}#aja3GpU=ZB#0sT z>a>y(Zt&S`d~&<4sEC`E_aTcfc{7^&U$I3Lyst?s~N+&->QiSp9c} z|8*|b=OXcB=9@vm@_TH?_r+K~=X;az^XjwuE2NgsfjFPpxW)b3?rYo6b4Oj^3s)b& z|JE*k{hOf915H zs%N+VbkkQTwgFGs1**JbGU=#m8Yx%8C?re4EQB&#ARkOoI6B6kt_5aXSjzr{L|Vxh zajV>=44CnNR5(3~p*lJ-8p7=)&yrsnC{}6X)R1**{4)l5eBCz;ikd$xC9#N~S})O}ym`4>F#N1au3CjAJC z)xA^iO^sVjgL6WO=ATOh^%TsLR63T3f2&j&Z&4_2!G%=y#$N~nDZJLNtE5uA*86!R!DO4 zqIoz3L>B<8r${4A^B^heZ;Gey8gRJsaZf*mrog%-w|a5VwOiP)n5C+kVx9XI5a^|RE$32oA3 z`E<%%(xth2`PTVKBop`kf zEjAG<5>&7XrPsBvG4kCimOdhCTH>8?$3r#BjgerTIIk;H4I`m8s=3Fg*%d3qt6C*% zg-XXW+XPQ(+QLcTgPHM&PvV`XH<(0Q<4V=ApDLB6nc{e0#_tY1m?WXDa|7R?&`^gp z+I$EnslhadRW?bgA5f8t=*@iJK*E*aCEC$AJN{|%vrv#F+M0bkD__DrJ-UQkNa1Q3 zEV8N8mxO92Z-=#TS-&d#)Y0NcWCK@QIbu1TRyiwbTd$(+IEkk3X4PM;)Q$)^dGbT@ z->pQM+@8(^Q>4a)_R^MleiR@#(;*{_Kc;;SpZUd2F5lT}KITKecF)xbxV)C_vi)A> z?w3Ld-X22YsB3I#-P%k-T>=z?aOm%x464^|h?|>)o%upnY{Z znmvv`W4|U4T)!q`X`(2m5RMr=PeW>bpO~IT&3!+|NBCXIhbAV!GoLPLV+HtDz263U z9gmQFKT&gEN5LC${{1gHLujnBRF>>VOCnI=m_&A30FQc_o(>v95=KuQEFK2`A^E2q zW8X#OHT0dvvaa2<04{{eUwOQVD(nFAqew$DGyaT1zFMBUaLZd z=CE2?dKq5OH0NK6fv3d5>6I24cM*b|&%&JeT(znjHIKZtso-wBoW30Xb05g55$xuQZRv~zIq2<0c%zqD_WDPafwB#NCNVO z5Hp{>8XoB#aMmn26cAA4I6+j-{+w&Nw|ihX5^pqEFbN@M>TxT%c}T6)z$h2QU_rs$W6Yv7!hzij{>l z-joCl?vrEa7{4})eW%5OK-~{4IQgBxCLF>|kGwqqwxq8f+0N@zD>yL5fcT7rnB%@L?|T{mt)`wL zoo;nP-*1>_(s}uGi%MCe*IVD*{CR2jJ(NtVUjJF!^LEB6mpS!RZ#*KD9R&?8d05D> zv`j`c`|@@+4%GNQM|msR=L8R)?mqY9$z(Cq1E3Zn3Ol5^8gE8Wyu)S49H8RU<>TCW zKNL&WhQ(s@aR{E2(M}u)WlQ`_#=3=P^RkYr|erXMemUEozg%#QCdk9rB;Nq&DCk z7?CeM^yHQllUtsSN?yrWA*=LSRnfIt=`Sy&n`)U|=2T<(m+YJl_NuvdNPW&T3(pQ$ zsyJWnlcJ#?q#A#-!7y|1n{So@@Y`edvfwVQWh}kZ97ll-8g=4*Ph&gp!BN$u&UqCk zjD0w@M$M`G14Gs^R*!50k5Qu`E=ogp?gviu_P<+!gV05@F*7Oyx>Am+OPMArf9;87 zA|1^wA5n6WRGFS}nZurF$4dTu30{$Ygttvh59@Q>cuO`I;U(?{p4i{LcR%t^iapXW zo(hTeT*L!nf6;?k`WdiwCVYQqs{C3D<-glN`s5^J{a*9_Xw+Zz zxM4xs8R36@Oa0EMci*w|IThe@J}sy0xeFQjTC!sWl2=a%vX+GY|F!E&Fm6)PI5|nL z9I3X#V|f!zvqGUXZh7S=S%C4r{O3OiNon#aY(d<6tEy$1i62O-34J8OVFzHp1OtOYV-o2c4Qeb(X(b-{zE z+Y~)a1CB|T;6FCjBO4bVaFAh*UP)k7v@|5mQu}G~P)eq6J*17BAnfI4*`eW@Y<%Kp zQ|;kWF)c|<=_YinZq`j;f{K$43Jr9hO_bDG@M$l2hF->k`|@L?VSWd)Hv#SWIs=k$1Rmgif!3V!!G5{?GJ-WHLRXky7A_zrRUp>-{urw?Vw2s7&b^ zPu8c?5fbQW8c3ZD*E$-KW7wdn>3+TkK{Zhr`ySBrGtON|S)NTfNvTSR8$+aeCNB+?g=fqeKcj2f=SSZ`=+ zc3vKq@7ZewGR#Dtnq&||BU3tMFW(wljl>dy({Au^h9zS46)#zD`#!lA;focH`Mnnk zc$^-Y4Vz@oexwhKZYXSjQXMn{*EpVkqW&tsFg0B!xmh zBFLei*9igEaY85#k=c9uk1?bx7^&JA)F^5xVx;>s(Qbd?pJiBOqOGznFGkFhaa8Xy zqqBr@zg#NCuy{)~u`aU8-iSvvsO7cLS#mDx*6{eW^AsE{{?2Y?5*t9{IzZEU+b@ko zQe^5sKTSFi&J+++9e)5#ZHYT6K>+~^`adrqSL0R+blrJ4V;U9#onBMcu^=gS-L1JM z=P5)jnKF%aRlSZd@7GfNA1sdRe}lO9!b@6IHYA-P^Yh+hyu}_)+yX5UV&1Eim3ouo zujHDwEL)yB5|=o#usBosxT-cbEm5@xzCTyh7L?h<^@*J?eyzoOW|DB_o5Z1w8i&Qz zFoPIamh?qKc~E4gLb)yALHSB3uk+2&N;=977vmgNKtu7No<#@t9+REgqExNJ^G@WH z>vg}9%HLbFE=`djLQg-~@qv^;i;F!liv7Et#r%Ll4~kg^j2LB*K$ecC`)wuV z-uiubBJi+ROUHi~zVn`aZ@!93__gF`wf!{Xb13~?|F|aadpFSgaO+p^@ZI~d+527% z9lP}gX1sHsNE_>S*BFW9d(2|sm@9$ec`EJ=>;DD%!TYeAeuydHy|*uSXJDlU$M>I! zBT#7Ulnw4YA#g_u4mIA_Gk{4(eIb8w_)KrIBZqGw_(a^Hsay zs?UGNFf!jnnq{|x_CE^`?|!>WnwEwADOb^GLs4<%s)qzSR)Cqm7`y*{DZ>k?q)ws` zQ&^A!@&Z~>WGhSKt=fUF7%irv7EO9G>#B%qre^^hW++fdDaPgrgmg}V{ACbee&NjP z;)DAu`FvVg45Lj_fIn)YycpD5$fuF>O>L@XX$$J6HyM+J;Ah{Bk0e9Us!*f_jqNH2 z%^VtMn1nb{sJ&4(nlPlO zOC3h{=U2CEAiD2hwd2HVBo;r{j_vL?Z!3ER7B7Gt=)Ld2S4EP_5=`V>=&sy%p;F2j zbXryq58pQHr}cC%TazRja9`DF_+PqxZ@wlsqtlGE;;%f(;qf?}T)F`_DN8m0?-&*z zOq9xmlH0nRzRm27!*tSZ)yY|XN*LrEqH|;xtcF3LcTj`Jr#*(3`D6%XijX2Xoy0A-`I%9C}hHav{2nM#Rpt|a$ zT>a~(su+bDBUPu%sj$v@frTCo6G4%%O@|_5Y4MXansn>o7-mGz0h7%c)bze3V^ou_BboG=4ex7_Vu1bC+YB8D_i(lLE8@@k^1GE;2zKa^%5 zFH`s)`2kc%L3D?t!nxtv`cbya5^ESVT6MY;^-VQk1dGD@NBOi1T|1GIF}VvW$3(^D zk76$=RAmN(PwtBAB#G`tDWTm>vQU;SSNgw@PF5sWd*=?!!9cuvc645jV*j=1vV06V zMMhonK8B3cWPJ~&5|BGo918ozbvc<$Y5fcc9u>U7Sth-D{paoup?kApW^@;<< z3=Gc5SQRTplNAdT{Q?&D50|uUnox$E101K z)=*r#a*OB}U79L$XB^m^ch=op9Kcn=gWs-+`s3gCa0gmAI=Wlx$mx2NOK0BhQ=11S2AKL4zE%Vta6=OrD@F zPtr$TBp(kE76tql6kAW*^l=L4?hi^aUN6nKU91B0OgL6*d?8vCh>Wo>=#!CVwp{B( zA?gCd581B@325XK$m4W-Qzq($Du}dt>tOQ?kiuQFj0#Dyp^nRx=AJSwHtV#O71>us zw(_g_WSrJG4Ms{B*|9(rSjggwIx+8+E0;=^YXkGK*mUHO?NL(LTldLQ9|E=jUrDwM z%W0RLl3&-jo5IcaDh3Fv=ujwl#j=h?t5$OJ3jxPp5KFsAuD79-CbKa6vs379yuHg7 zoCdo7(*DDxzgs2NbGCGKi51{p=*y2DSLZ(*TOl7JxtLeV-0<|EFz_p)vJ7-b1iX$P zZVzyQc_X?h;9ot8Rmwi$*Nuv?fyVyBdBkdRWpl)th`)Rs=vS3gz@kmBLZdD>1biFgI&+}#ACW0CJ%uY~iw@GutDN&lv4R)`za1;?+p0+L zGpzaw%l0aBx1B`~B9mQ9M_fHb8sCDbY|s2DnALXO#UYe)`KCYVp@jk2!MV;`iDf-m z5Lxu5CEA1BIVNs~!j|+I-=7PKUk{m)R2jf14ta=9mXa=&I?aiMw%1y3pUO_jjw#jV zsaI~q#aA8-sMNOb0c8X4^SivkoXG;zOB1-y6D|U`g*-AxGN6nQYj|B8;&R?6^!dJT z?D+0hzdw>|bx#G_EG#2W4`8L&VtEoGWBvB(Dc4>@2|fN@?EH}ZjCLByfS-b%QLcCW zo=?mi8~$DU`u4==eN<1$zBU|$Y8M_LEj zlKV^v+;&`Gkg-lkvoQ{-Dpk%pKW0;bn-pPkmbEG(l@aJQYOzCw8|reS-GWSR%nfdC zWq)heps>KQX%U|+RE4HaCpW4+mV1XoLq)9CT7=P#q*P%Em^zX zo25Z(q}#@;;#kATZY1=UiMp)%^J&$nYnQKgKrtoqg7RoOj?AmkNS(vL(g*1zm5)+i zlz^-@a}gOW8e~HzM93PmV~=m)6Ev^g@gmka>+HfEy9<^tYFBxvM`gM93a7f^Fi{Dw ztAJGpK(u$whZAwbzk>P4^}zRQ`yIQ!-K3Z<2nQRP5Xsl8fcA zD)+cs-Wg^ z1CUG|>n=ft*UlW)OTIFP#jhHV0ufD|w+mA4^IYRH3l)8q8yOD_tGj}aEm-Z6jatcWks$@uKEJy}6+EK#FE3xBM{xUHf zJhPeYi561^^rvtao2n%Q;uMH{{LNMYyq+YetcjFJOr^ou;;)>yXuU*Shjfw65Q2i$ z&C+rF8#mKVRUi^ZXeX>cRRHw}U>npyuzC^H)FfwN7x6Wj>?5QwF1!@Un?|}}8gcbG z`ni1|-nQcYg;g-@Y>`-y^czZDNxFYNu46TDR$cPVBuQ?*sl*2RmC}bEZUsFj^mKrY zZ-NpP@ojNFjw?MbDM|4Rtb_EYQ+J4xmO;M*7aG%up*oI{@fYc-vDcvWK{Anv12K{q zr~9(7wrEUGmTL2BR(UUqYNpEQxt>C;S0oLh#BJn9lD#WmO}DEoB&(2O)?wA5WUj2S z6n9#~S;SrQjhUnioeH&OQF?QKSB-)yNF@!2*y5W;JOi$B4`fL?ns)&HJ_;s}=8K$E z1&R<#vD~jTd^SIOr;aAkU%#O!)tB3LKXnKabb1o(IKBJWOWK)1R!Kl6fr3I7KP}v} zz!VW}3#6`EUnhokM;@R7VsUb5Dwz+kvyR8q3eBUe~7S?r)#S-na5tpRUJ$ z@9bU9C-b7N-=u_`mD)aTJugE7ZT45dHaPGYl)EZRo8Wd5KI4056?yIV^0)D8Xhh(B z74mztmXN1EYih{&YZ^6{&tY%!^I}}?{v+1x{=uJN;gH{ts~ zbAd0&>(A;^{%`m154#;dr_-_Be&gJ?7eCY9u9w;0Clxd&Un~6YxVgQKJHQbu8$FK; z<=E@2*Xk7;+3$Jd+)wpfdB4lQ`kDDV|FdVYu`@F>k1_Ws1bN7Egf0rzjMcawR$2;# zQ@JeR$&}KY!rP1gwJ#<#pfv{_WJLXZ0;fDV!Xo=Y%6Xs=P+;axRR)zzqk|H76oXN< zsF8uE0P;0nR8$MHg^oiD_%^hTJ>im5Xt=4nCg+Q+u>3T#A#GHZdu;L7&)KllmW2B! zDmoX&_Y>K;5id}c`9@{dz&GfG`ZA*W{=rbU`DFFXMzcK?!#MRFqrhFznkF1doXn>GATTzAG(gPw6G(93MiQ{K%LWdd_H&*NR^OV< z@K6ws&VT8R6B}jH+a38oFF@nEh>VRQ(mAIIIBXnR->SL3rut2{`(hV7@Vl z*0nwX%~>(rRtgvcN%bN!mA2(z1e<6g45i00(|ZjLp_liGXu5f)|-PI{?OCt zO=u5N)kb7colMbq2tr_b@|7%C>af2mq@;P1I$oM&j8P3%O|>l^P;2CI|8>tTaJV9& zta}wjddz&59aqFNBP==Y8bZxVloZhfS+ZYOi}-BenZ_K^@C)Q+^jcj_`WQ-78_2E| z{Q`D4gLU$%5GzdI&Zn=pT7WTuwbpS*v>YdP=`Vt zn5J(GU1-}_)*I<42Ssai0}pFAu|a(Ap-i>M6ChGf*=Hn`uGDf6bwQ9g&)o|!xT+=M zPHU5LWYdwAH3wuILW&y=#U3;@-A7ry(Yehk7Ig9C8=OZ`#^9Nm3RC0iCmoX=vPX+M z8=16v$&WS#aFtsg`wDyC)3am$vo+p4mU*3aKCitVd_C6$o^Q;3&-=x{AHCEBHoH#z zKBsoPzjvALJ-m-M4{|?OfjQpOsU#2c?eF#-@2S77E?;~4z2Cq)^^I50_-eZTd#s=H z7lJk7(@f8|Q*P%?KGJuk->vF$*Y!&8!}azz$8R$~hq=zXF~7$>MrOOcoOi<4O}p=P zD>SzTr@j6Xx0zZ#Z(E88w*UDhv1d9Yu)A$v18*wfa7q8z#tW1x>4hxb;k-_d!9uSF@=w;}v zYl);*oE@2`42?>C7+74%Tun54XpC=`A@{riUhyDMVWo>^=TPE4X-e7!aTRFE5J5-} z;1z=ujD+Qvk&P7_DM6-pj>T+x<+B+&S*!tw7X_-^kR*Dz`V4@|V8BQdWSI3ve$Se) zCWggse*;pYk(*MKe><9F6zG(48tK@3YBYrH0+sHszREGSzebqsKx>NqlZ3B_aQcYPwpfQwJa0i|*hX1${vD!FA@t(oUn2 zMKN(y;fN5~`6?4!tCJGTH@j)>e6l@fs}YG-QIQBQMist|GGT#4@64v z{p;{SXDc%MEEnvXFP+Sf5wYBhVW|)s4rrCsU9MOxla$X^2UUcA>1)dgl-!9 zu6N2+JRmc|8~L%1facf3<*Vk%UhNe7aYZO_*D0_MeEST3tOz{yk>+~s#uN5XeQ%QX zK7Z)nZzJJGBKe%&9ZCxvhkhC(`5ea*zD*+eob2uN-rneYUS16JzE6evJ%=&?>`%vN zw_o+Y`+j`?uNghFOLfQFh$0=VL#mA+2?GFl#-=689QR4{BSk0GE~`Rf5K(HMGIOPw zc!AGJs!%#=A6CJpNEYg7)1G!TFmu)?wNNZEF)Y{-2iStMboOPd`BSS01N? z5SH57&5SoV+VTThg^JMG85;(oSTn{1#NwBKnKos27{9aiiaPG{yh-k9#6Za^;z=$Hpf*+xE zfJO{NbIHs87!aDjytM9zC!CtL6ul!>bAZ+ec z=v+DzXP|L;=Qw_Y-hcC>K2rinEv~l)D5Dksg-QOay`C(k`q;eQ5=wQ8vYQ?n-*Jb+ zb8)K$Pev~)yL#g;vo0qA#mUevFUgEI4+lst`Wavq?JKS9Q5j<(H}p|np{ty$TKHG= zL#O!HkNt_G#}*KfiE_z|`-mmuyuQDk7#+Sj6vZ~4P0=XKD=kZX?uicG#&KGDb-s6K zVb9Fza-Q#A@6c0k=yvmzyQQdzycM8J$)CXQF@+;uxF-3ySzGO4{V+uY`*cG;Rc=*1 zf2%;j!b0izbV-kYK1w)o2ZBoU^|Rwjq*|g1w4wox!7J5uWAxepO*a-1T7Q@+*|P`%nhu3e-X^g+Q^*5oEDKmsMG6>=#Btu@ zFqj~E2yY_Y%=3l$*6Ln4RGc&#)TiRlR>*k;RJ zTYqQ_Xgo?bu(pE9zXNs}@=x^-jl28cNYx_K3Lhb;TqOBAby8Q8)~%~Nul@!8EVrd; z#ytTWH#)#c(j`N;ky1I1q2e{qxCh90=$)+ImWsotsBOxAOFPex#D7m&6)o}%zP z-vpVPJD0Llc%WYJHQ|!OuQl*-QppR^`IvgbN z=()U?ZbN zExW@Q1hqOQQ|oEr6bJl*m=12*=BpTxzv1(_RK;nkWn;ysG~T+A8T0 z*%p*Xac)zHT-0sZM(u7UURAZn61_*mfit*N5p^Gpan2`2Xwg-Ul+Tp5^#7wTUB2# zIRc#-BR5*7eY?Tq0cbH4;J5dUL{oB!NOdsK^v~Xhoa7vBJ~TCVLpmV8ygLNE>iPI^ zaWWYttMmldsGjO}D?pz+W2m{VmDPJ|$ET)KJ)7s;7FewM(!KIE7^sB2WS0f&<_Y+* z!X2awP-=&o!WRpSvxd7(mP_q?JMjr&1tN~2fs2^SDnYRDKfEDaUfy;xzM;tCK((Ad zfmxg$cCe~CuRddn7iFV>c4lmIc}9xD#2&g96}-$R7Z3zT7rqzJaxLxHC~V$*192R~ zIBqf96*VXF(?2IDX5c{7j2FmsrrZ2a&8^Phl3w<=|B7~@4Th~bRi#Is~akvVkZvtODa`3kXsio zLkG~6xFwxKJJd!@<)kcOn{9o1q)@%~V=w84;MDwbRDhAv)eYIv=VpjTsoe#k8Ue5# zSQ#&uCbxloQV`!WF4N)r^y+aE|ke-@my(rXWO4~n)?(pSzNN zeAWOc>oKU?hL@g&mm^FW=qc|5IhNrYSPN;EG9dzer0x?3g!9DO$x%-b5J!6X74E#N@)bsSZy{9CoIz!BpX5 zub%tK_B5+IA|;s&l24${%Ex4sU86lA3Pguo++w?pa7xpi)cHE6>s3#VH5q zqpti$??Pf|;;D)KsM=3Eg+~MLV$hn2OA%v7uWVx0CDIc!kX3`H1&z)bh(fI@mqdQu zN|ac&`MD)0~~*Q;K26!u6}7FEGT>_}B_ z$~M$*5$n|Wc##)&nOH|7aHi8WlL3EGldi!hCG5`ipUI!0PbjOoLemX{!BUYKWCtOf z5-(}E6Q?pbHt!Zt50xj-3)BijJnRiCHeXE|Xb&((@bFCptDBcy|L&%*eRJ`h=wQ3) zmBu8lI%q8$Gte-IS{L>&R30psDH>cXABZX=8xHEzmq9?swFjQv8JyA`QngD#U7`lH zoYF*l8*!Osr*65bf=9x4pOdghG-(a| zg3gjJQe~!IY9rZ3mo&|kG zza;3(Js&L4@0SR@Th+rm7&G1>f&F()H!-BNF(N^a0YHH$i$zm0Hgt}sqKz1k9vI9$ zXD7NbG9HCuzu;@{u6w?t%^ovqx z$$)hX)U5^WAQ*xM;iEF$6ddwmJrKRQFf(0M z*PG#}0kIm*y_h;=?O-ZWt#)hlG|Lw_?GK5-TZr+)?}h#1@qN_rL=c}tNzlD8PTRUp za1}+12S{GvKt{bXE**?Bxz4!Qkp%I}`PpBtfgeHfjZ^Vxl0CQ#BEBQ;)d_#p3n`tF zrFrEwnnZN9m*;-fABu~=UptBPB5)h$)0ZF|d@EIAvx0%X7+udAqR6Z9geuJmtwJI* zk`3iZs5$_&H1&cdr^L!eVH_b^)~G;&Sv2wn;TUghqTqM#@;4pn6b^Z}TNB7_X+lU% z&k-u9bKWP(+?0SCm?kWpnLRE1W3kA@Y}^@AnAg-)=`dUB zjg!p*8C`ttXMdvcD$^K6e@~@l0M3!L4Ji>bhH8bq)RpG~LxT}n32H|1q;lK0CwS5m zX^n+ouas(u2z79UjL&%*-7#8HEo<9uB3D-}FsFQhzr{q8fHdgb&IhCD}=*|&HjG?ft2 z?i}O?Yz%qpY78^#-Hc*^obW0B*m{Z;8a-EDx&(=iN!VaiJ#J!6ZAx^u$mzycEKa09 z-u%gW?FSV;KmB7tYYY5&GSiC^pRUM>i^Kqk7RGy4Ch4l2EJj$_5m-leR^$v@5 zxnkW8&_T;nQ}terF8Ft+W@GsI``c>1=R+*(R`$I@y-qh5I!8lu!SB{u3sdPysOiWf zM|-@7IncFE)aHBQgV}>EMRs#@g#_630>QBfb_7`!zM+cA(su6ReC5o@#W5)cB9qTf z_D2MyQaFbKaezpGeXAel^~G5@XI9F5gYZkN?xWw%8T%O0XIHD3hq)FA(e<{={0P#9 zT&Ynu6Ms5J`#{iBR}WW+9x=%?ar|97#wkrjayagl^OhKgTk=tsh$G{do}=c<&+ynf zO5eF0@hK{s=o{zEG!8kC*=}sOduFX3iv^hH|8OTeoOt)Kc5= zZ0A7a7XJfO%+u(|RxN)-tnEr^#gV`WmOYz=+dsWOR=(nyMe|-+-l(8(kq~ z+WOy+gHjD!u2k`0j#juSnlIGCYSw$%i7aSeX@g9|h8?HB@6N8eMZx!Pe`4BsW}{~- z7I=4yd9!PmbhBm2(;r~bZH%S<0YLiFfrmX7YuD=&X*$KrIJSGXjXjFAC%?HlE65M zOV2{`jxthzFG4R<(F_4hW}aK(h*SK1G};K}toy0ve^!~Nm04-gshKfW{L)cQsMm-HJsSvNy5nqoDkjGF!Cv$v zwrTGjOHQN3KwS3A3@_(Dr4cL_5wf zroVKeoiG*U1m6!Q=8_;%I=`-1x+O5en;i7(*EC9};I|r&!dRW_X@MSU#78F}QLg@)5|(MOBVIB=ue@8y zu4hsdJw`D=n-+>BQATouRN6OwQ^V@IuW@|_p2vl45T@+(+bK&Ld?QtTi1&^2=&L7yb0L-P+6uCDWJ?K%_vN)_G@F#i7xYyXpPW84cN zeanA7=`4uvFG_I)1WHbTIT2YwQU?ds^b7;Xn`#A8vm8sq-`-RcX9nO4$nV} z2!IoTm6nXbZ+R4sCJ0jcw0~ zKZU$>s!=L-#(fN{ry`iDI+?UiG8{qkAc1dO1yEXcI7JocoDj6HAw5z8f9y~-Y7->v z>YJeaSf>oVi-ip`Ux2_$r?dIn<3zcobgD$%S)I~m%PBLS(?y`vdWoj7W+$tME=I=j z*O^!*Fw?gLPRobevlUPN`#yvxjcG1Y5Kg^-0Qnz(W_W{BUcJg5+H@l_cu^wg3|LEb zmddlWh=t^84X&(H0|D%($z82UsrAsVats4gNsW%W3RZ^<=BsY?5bIyw_MsKa37|@p zYr1Y!F(YdPv^$4FOrGAz#4jq&xnXxK?NRt_-`G#C$~7-h()>Zhn+3Z`)^74jfs{)u zE!5=n_-~3>x*{Pn`4ak7R0hS#tBq0FiIn1Ah=UU+i*SfX<2M?-%CKu495kmn!6kpp zcy#`tbI8s)>XJ{&v%J7?eI+LRtM*5jK$()Da_1}2<(zLAX8r+jm-^VlQ{~U*f9VK= z++N|$a&EL9|7{97uqIMK2HyKdW&zMyn$H0|XA2o`H*T#$j<~w(FczH9J1ABfC(o$r zI;^)+Uhw5QaFqHc+QI5go7;Wa-zDbc=UT9xaLe+fpStKUyjm!;q1!o>NCx(~isBf! z8u&Fh(i&dZkM*oNx&6vZ2ZIrK91*BAOZcA53tro0jG%&4!y~{f{F7vi ztKRjftpu~d>{q0tLIo3vCvt=Sa0P5fCvQuq@Y3l#?I6_v1%NNxZWaBgc;aW#G)ou> zcQhobI?r0gM8LmRV_E2^z82_UO$me8KpP1j^HSDnj%&Gl7S}jMgqxOFx$_Nxc)yw( z7uWNVZ17%brlgQJmGdG~Zu4DyG4EMOdK{aSHb>R-<51kn`hWRx=`ne2tfbJAJsixD zSp12aMr_`|BJ?oWDvOk%*18_i`0tF+NBB<0snzqN0|YxxZOcvV$UjYb60B==cljDy zQR7TgshmHRV~c+lK>M>owPg`uTufqkbHak77l|ad{;|XNavYoBwn0b?gHUxMQsgfJ z3}#-pS;7_=A-c}zR}tHwF;EIF`ZtM#59(y6h(A-P7MJ$lYSa(*9HMw55plQ?6K3qz z{bg|L2b9`cW6Kz-EU}9IIsjV^RI*4d;0kj2<3flO5v|WJiIhSWhLLp_%OAChWJhsb zmk!>=M3QDwIM!!_v6L)D-$$Nkmi?#dZ<~`ytsrHOygoeunc;7*>{o{n7YG$-fLNXC zba2n1p@IY`GT_uJG$PlM} zfpD4W3MZtB$IHfLAq6ANJDAVc%osz3&sQFYEj87vVP3)G*uXCWxNM8iUD7{evN!q5 zV2XqIRxB6X>MGV<-$9ge0yBNQuG2(=sa&e)p|e1^I+NZd*|y%ao0EDj^>9<3O|{?5 zkzKUaEe_LqFU-)Sek?sdSOxkk{XUV-tg(a;t2R`Z?OniFUK}q<0#5^P%?RYOdW8|V z2p{1qUCR8Mabg6JHIR3~AX%EM;O-1H#Xb>gWgSF*1BZzhlXc)9X zuZAv?FD4u>gCVi1ilyOIXlji?u6G6b0o`02%WvyOde(1bX~r6m=5+F7g^k1&irl2( zvL+^a#AW+>G@AN~97}_B$1k@>_(ErD_Eq9;Xz6~8t!QIhr{aJBYKM?p`S9ttk)qW% z%9*Z;B3YQ2&{WMG7DKwo{2t^b%Lqj? zMd*8fSB?mNxKt^o%Fw|^5LKMhPqShdtDc#@W8E#CT5CB*4^oX5!+-06PzoiXY;Ilg z`~kax43qSen=xumRCK{brX#rH_s0#(@e+BbxarR1oND<}Z3nOk(~-fhZ%Ss4Nu*0F zQ6s|;6O2j2WxMFLOYQdGh>P!V}uZk44^`WRG$Y6zv{^azUkse!hosMw3nFvggN$?{~Xqo4A+v{N;6Bl>uaYW2= zOCNhbujxGFfB27{^l_7u3b*6EhRkq%x}7_#O>)_V2dd%~(%0oT{VMb9IXENV(}a7e zVC1=jVN)*>vB$1l2O#;dvUk1oto>+)kSiFxY_Ai(R}+`B{^Fwg^#|ks=t`jH9P* zQUEQ(P>x!7v&JwEmgXyj^=BmHk2l+B$1+G(T>YG}RJQp$ThSgPHfPu#zW*fF1f8i? zK~#(g_knrpC>A&>##`HS=6V4dnF_Ow=FKR0mi&rqCdbiUem!pejwb>?!UbDR*;4kMV@R2?<~b-)5br{vwRG^~vaLA((};4pe_4beuW!RZEI=+~;P z+}X$2y66XF7S^z}W2t*}x!KqRo4(ThqX==7sU_I?NYzR4=B*82CVR0`BHCdw{S?Ot z_|DHBF=kYeT}*AGMyD5Xi{Z>BlEvOR08{tfw92*Ukzt*z88hsOPRt7!6vDJqAheYEYHA9?H<*g^AZp+B-R98j9`j2^hqTeg))C zP4Fded#=F>e4WSyHCD&`bLG?EW#UmJ=5v^_n1z~Ylt*okjAsry<#>(3g3`>tVN8EH zNft)h9qlmnoz2qv{yef`O6q#zv}l!^P&~dMWTg#>=TT4yb&+eP^^y`0UjFRPdvsXF zZ>p1(NnePih3e@V^5U13B4HvBzf0YurR#V6-n}QGnM1YYr~~eyD#Q&!*>g>4!`hnT zuc2^r%t-p4O;~4vThO)MDH=1b%an`f$K2ya;b)K;XfUoyVrd;|mwSvaoOqj(g2lQC zZDQ=}Z~*0OB9TiwY!X8qRnpOH)7T!nwcmhm+#i37K`}a3)Loli-d|p+3ZfHBKTM_6$Y&lm-;N`B4ChQI44fm)TRe|r8O}O6L8nZ!HT~qDszbOuV zyS3aTeJ_<~XKpqmdm8) z_wHQPUA!=7BhR~YH#eu5dp@~{4FKw-lV98rcJSsFv3=iDorl7ZffX05`Ktzz5?3uR4x8W+|O=Ha!{KP^#9@9=O zWrGAeN`^-z8fb9O9X%&}W$yBPUIkSY&ccmeNfvING%0PlTif}4`{gr|r8Hj#6i%YE zRbDw<#ExHbx6JrO4_MK+ps|`B;6Z|9~WF&>mzqRlYtw0t1wzdJmNFwuqp5B0BO~9%NxwgR9eG_ZcFh5+Qd|BBwXW+xgrzAda@YVpqKWVbExg6lf;-w9Up_pDDzV2Ey zQs2f&k6@G50Ktw}LrYJxII0d6EV|P#-}R?Qr}ErNL2|5mTPxv6y@1g(`w4`Z3dn>o zgK93QZ>3n%N$EN)6NFObYDlaq(7L{U(BI}`tJ2nlE^kWUZ#ALuUF>`wW@S4Mzxc-z z1^dLm&X0NS<6TM}hFx+Uw5W1|?5wiyl@!cFd!CoZq*--!9T-p~DR9Se@#&fi%02?E zTnYGgb&g>W3?&S){R~FL^5eE?^ltUYfm~V6i59rkBTh(Ddgve72o-bm_0WGe(I$BO zLrJix>DR`}A}O#Jo4ao}N{oD;6Qn+%-3N*(E%2XL3U6FB@N-oP+P}*f(~LYrazFq_4(l%*B-2)zWyFoL731o4CqrpNW_*| zF!&C0v7|s}2}XDCyLKNc2hFP8XOex6bFI>efof|bc;nPr1kdd|@w23d2&5yeiQjGN z=Ih~O!$!cdW;cu)ugLj`d0JZ==3MGpuA$?6jHSpa>4Y*9` zhH%)*KX1KB3HZnjxP}cW6yowf7xLS4L2Z~IC{Oq2Ky;dYCc}3+v;Q zNyO)caD6gV+o*{(LUCzl;Pc?KwYIgDCr_QD=wfGgf9~M3_NI@Ujf5BV7fgx+Kd!j{ zIvzsJBuoWO(!X;PX$ORp}@J)e=6z z_mdC-^6gKg+%rdyw%vtw%7BV4mAV3Q&*E7_79D#?Jhzq?-F#7W0;Pwo_F$60nZ^CtwbIFM>8>>)7842mN2?F*O)QX zF!fhU$GK`j&gQ1-quMGJ6KCd?_ek1m7-AcLV`E6I;)6}E(GdMXLHSLZ&X7hV5i6Yb z@u`iKYh{IL!4BLB+yQa)d}<0t*@^Sw zhq(T@M#k?A1UORc1#4$5D^}|ABWx)GEdrz2G#Q+B)fKj)W|W5(u?ceQ7`4qXaFK7c zCh%x+CdjSWywv?-%8Ny^*c_z@f&1-uk!5qQ(y0+;lw_6k*=}hhh-KGVn)WJW`gcD$ zN3|X32y%&uC0xhuwy{IY!T?o;41+OlEX23vynX)~sQJsTTY3_ReyEr>4ac^nAy;G{ z$ON#oJneoP7(dsfi46Yx*C7SWhM403v~goh5jL%dT)U_O=ANnyG~!ih<=S8K1NJgn zNxSJS4mo?7mb5fM1N9alA$rs%>U-D^+WN>ldF!<57^*}ha&@?$+QdoH@0C8^^gcfx zyIw{<&p*q-S(?ymTW4tIOKavotrm}svkY&<(0{i{>jdNOo3}hGo%krt)+W|f669`Cm z*W&{2?67q=h(b@}a4lJFYZoy2b$LIhI0WoXD{VQw8a!?ywjiqOD+^%Er%WfO`d&XD zaWZ#1zvg%_1FK-Gn$S0TZqp*Y`NQ?`^~VxmfS7T^K74C|3ynR@k^FLrRW@0Bv(j>c z%Yw~qseMDK=86_wMVON|oJ$;!Gd+!(8#{fjm|s(0(4ntq z(|a!{;7+JEJB;BwJoUF0|tJ-E= zr(unLzHv+)k=pIO(MleB4y#yqUZ%~>^wDRlJrLA+)cHtRn@4n)`+VWi{W*5v-d^9< z2E+OEg$6rF(fYVk`usQj@oyUUsGXi(u9;@##dXe>E6?ZfS?G0@E8hNBqh5s#Jt5&) zi9H|u9SMuZz;nJ35i&JAzDlUsH~k{`Jxa9hF=8yuN-Fn?gB1=bPxb0bey0V33b}!@ z42DVd>?`*e4?^=;c2W6F73{^T@-TKzp@ zYQ0s6GtcM>zUpt4k8w4z8Z735YC#@=6oA}-6IGV2yB)joXgZ%84m*_wA74=)l>5tI z$@4lwp59-rhS`NlLvBqDWW=9NZUsHFFsD^1nZx!VFSO+tbrQv!v}(O^#PmwcrqebfSOk(@(~CivPVY;2EuDKzxao1?!gV4N`EEZ;Ha85-O;y=XT0;x>+5)F8xTkCs3?0(jPR980 zeMp`vah9j*Htc1;jw2+HFTz|?2EBL`YS>cLesI9sK?^<#TyQ5N&Z)Qe$1o7F)()_S zSWL5V$YcONw#|YOsK-?l)0l!ndxCCYfz!?-KX0-)Q_?tQVysDaNU# z8_7g|>j(cab@PlNmtj4{^olhNhWw?5%3`h&?>;NI(>j2I%7{VeD4iJHFa;lzMc{2< zV?E$ivFqQ1k+*P+i1q-q0LJ;Y6bbgHUN@Arfh8kdb^LEGprsrN&+@W7X(MEw9_iT&Q`LrG80;*AQ+HJzx)82Jo$wcT3}SsNXW=fTE~Xy84(>TJ#JF% zaXuCm(;60|OGwIGzu$Tp;K5DOefwdAq)WV1ZmnkxgyxRv_J)1kdYw}1y4-ZTu-~V* zX)!-@cd48zIZ8~iJTc?$>26Wm#ir7>8JXR#4YMNhOr%R92I)VZx7t3Jqd)#<*4n&1Lc`NC zl1jSk)!p0~;C6en(;IZQ$+u*+Gy6L6W4hz&U;U-$YfdFUI+TAih~MeWvweOj>A9>V zcYSrU&GVXPJGHfyX;v1%e@slJ<9+z=94Lnz+P=nhb!=eV`X_wdSpiTxR?lYcn|&*T zV0h@}_g7TzNI72aZR(5xKiU34j9{(tZS&$IMXS2g+Y56%U>n!}Vizc0dzJs*P8S3-;L3vG92%yH=6t(c-3a3ws>m@R1t1f}^GOTtR6}Y46vc``=kR(1g^PPV zUq+iUJRX{gQ7S>36_s?CpxRGtC$yf*mx4KkDFW%Usr4xc$Zqdv9!`8jD6=LB`i1k% z)RUrOOgY;epnDU&06j9uQ=?nq1Qvk$hecqnQq{9KVbGSB`nR%HdR8YTBanSI9vka> zu#^#R*A30tB*>3z;NG#ItdcZ{_Ub9W!k;zKm9m#4K-xgbBjGxbm(>T+T_t@KzEf4(3ct z7@)JACejN=IPU(LC);L6U4&J%awFZtqQS~S%p^K~yP4BQgy%*HjQ-Nt(W$$*&~^2b}0?m)tJ$llAQm^A|s`ypNCQxz45y=Jk-Am z|E04r1Pg}|q9^xT)0bcJ<@CU!y|b>#zZ}FwY?D|TFV{T*6CS?ASI~g}{Ic1Zr~xf6O>P?hE9$ zJ#hwr(o6&vf5TwS<~JeaMXFJt!oIB`d}aR2{}QWHc~%vH8DZYx*Ma{O3Y4fdMPZx^^B23 zjOx5w|FNdW6;JejS0ZGGGDWD3_?~JS7$ukCA|*_MG8{VE%%kre&YQ&aBQ1MTgvAs@fk za)H$ffuk7W|L_Glgt=?Gx@H$5#(H;p7Y{Z>_kXU=+rpIOE`U?$R;;fM&+ArB%Ph_P z6cQg<&JS#8iB&O5M{v9uS0?hz4a8$e{# z>ElwJ)HdKHQj{8PtUAxx*s$eql3heP9gfXwd7t7V5)wwslc(t+?B7Al1A?r>-}}$c zbDp1hptwfh$&A0^xCunNq)X69P1J?zdqxp~(APrHXSwqi?h;>=d>dg;Pn$12pH2wC z{Snvy;^?CFlDL9q5iz6l?uLHreJac>aouV7{AjxS?4tcraw5b$7q8s`NfgY21_>Xs4*i!4$BuEr&`f zNHwTwERYl!g*0p_;<+5 z`CG|QYn)T#(;u1Z1d`*jp~)~LlAv&KC^jEyFK_#o0(4SNIu{$bLD7_eATZsFyMqrf z9dg5Jmu?)~(``q`Kt$W+ID#tgFZHc;$r@|J4;rKM(alZ!3eb>G``*XLlzW%kr2D%! zWVJZ4V|2QYlf6ltFHM>=d(QguN=9Ox$EICFY8xUT)jJIqQdS85JjrgwDV0>QBz$ky zlNa7o*`xnivvaYOPjMuoJn_A^cgLg}Wb4(nbxA2WjMo~As9CjP*Vx8r1kKsFM@Izi z;}PXd-;#`@rEVHaDASgG?0?t>w*u--g_6WS=L^!i)zwd0e=F4#%eX_pwm(ZwBU^|hF)YoK^p3@iqOBY0QOMRYaJ(`z}hEvRS-0FmMr?)#c_=Qh5KxG|n zVKOwXzsAJVNR7I*wG(*ny!>s#P7IvyDS@wIPsO*~^{@*#%Jn}yiLvs10JihR zj8uoq(bMnzB7*jx{FcH7Hh$vDCX0bq-!l5(Bd|_%lZ^!q9>IEv^5EVx`PJ7^I>F2P znBK}Jnt6$goyH1BI<)zjp4|YV(u_L(AYsm28a#HLHzm=uH^Q+4TZK+|kLKLKgE~bV z0v=ydK6+Uc=RBi*lMbMFzOq?!eSOOP_c2M$*oe1bUMQs)(=|K2AIAKHcbfwLjN09+ zJeC8Ne70U6Ji1KnoNAk!ZzmnzXfJ3;9sncDgaZDWw()b5pD)+bU6=DlFBjdnc~4K_ zg3s5?f>)%Z0!NSC52L7lPfnljc~4)k+-koaHPR1dmuu93*V1P9t9?tMyMgVA{?B>koYVx-bdL`c*t;?q`U*^PXz^ltwv#KBUz9Hp&aMsiP7;q7U|9|Vh1#KfE zuI~SM-uc(N1-tgt6D(hLCeLCdJ3&1zI6J&GWV2-|$%F8_tNs2C?D*tG&@Y`%etfZ* z(~k(j6=dPXAw_xE8ArcUfva;b{qj(aKd%RhK>L{@RIQm!&O;I_q@%Oq`wE4XHc<48 zF}w(Ngata>QRUiE$zw$_QmItd9*^E5CR}=7S`7`yZVCLjy&=Uc6#6VM%?*3YfPhaBy_O=85RCNE zE4aIfgXIxG%dl685=l44yATB39hN@`wjC_4Cr1`UHC|Kglt}d8z3t_&-V#J6cxCXI zGSnjfcV=s2wX@Bu@%vaQ&fqnB1da4ixXK^woj)m5NHOO$orDK7-QRFcOE@7E3=<2Z zZLW)L8u{mbFJ5$rPeHh;oH>&(8&f@^MCCxvmamj7rCbJfDI(gcNuv857)<Icw<0w`H8sGgEPxu2ER+%HFAmYq3$Pt2!jU z|GOdpKj&4fkchT1H=z;_JE^JWnfL2VEte0$mVvi<)rN}Vt}Ld+DPd*wWK$W9_X3uK z*mKoWsxSbmct5_dFi4E0{TX;aPN}u>X;}5{82UIXEVNW!%QgR!A29VP*NNh#{HXts z=r`~$as-@r#`31~9H5J8Rk|i%(LRPVsGJ(h7fwayTm*ViQ1%%TW^ zgMurZw4>B900>PVZv{jlbl-=Fdlth>aZk(A>&i=_ixV=`^!mZMM(FNB-V{5F*@YLgI5v)U%Qw75;I~ADpd{`djAj~QrUq` z^jY-eUv2Y825SM?qoVk1Jo6-Gejn|AF(%a->Ozz!f=d2eNQCiZCqwV(XxMMcOy|^V zUt{L~To+{O?*&7Zr_!ir0MO<9g&T#+U+=Dce)}=4ztZtLW5ssSr&EkS7c8rh(UXVZ z!N_-~byH-zfq4uR{j4-UXmwpxXfZg(x;q&$M1%|HC{Wo zLidrDO#eFzC{Fw2g4{mLcoceJ=30LKA*5*1aDlDc@i`lQ8Ss|$d00rw=W!wAzkeB9 z{RPDPkBDXaGWRoK;PyWY%&%BH=xG~P=$HTVmjC;w&c0etSlBblhbvJt$SQ}|Z?!R- zjrIsvlVOb)CXtII;FWKh_yHzKrlYON_umr?*lpG8NRT5SiPfHJO zp}N6CP?tOev9SHKW2bYwbAL%&RD+U9)Sk*2LRXql0*Tj}Q@CQ1HbO`=cN|r0JWwLv zwSfH10iJMzuU{ZHpEeb-8JF|Z#**BZ2Ty+Rur=|Ppyi_38av$C$wr%{?)L>XFnN_i z7znrQqITx)xwCupxh#xhUjzzU-}9GyZf5)LcP1$Oz?t^;_RjZ^8MnfIWn04xvr*p? zm-iPOWmeG(Z`JO*K15@VEw_&i5xjWR8t_MT6oejiGBnM5MWWDltCeYKbh;Yx4fITo zdGo$gX&QXtG3R*A5g##**z;D-v&FBg3I3osfNe0K)32f>&s(MOD*hy6pNsELOc`oE zF3KC!jJ>R6qrW_RvUC102I4qg`TAF#tkwL=H&CNGQ z@4xe%We=6`3QTeQfgB`@k=l}w(L7*1oFMy8YUwE*a8CM zzKLR|H(XKSqg>5nsX1D6?^K|esGK=fP7gsrAshdhOCwF45Rp*EhT8^>;|1q@i#p%X3sd~RbVE4czhaYkOxr!Oy= zt}COMG@4p%PN}vImv2WxZ_~_OPrK{u`T}zT+nc)x({2iXCo9tpYmOR?t*1jZozx%J1~wpTbXBXb zvd;e`h3~S1lKys0k*Jz+szM|$1~wASGX|s=7Unvb9tUJ*T% zaJALRX{Xd-)xVXZMKWL%?nVS~tb^HK7i)3|%~5jcaOQxioR%7{PDn9GmgYqxutyxE zu_=Bz;z}Z*9;03@1RC@>z!f)ZE!QuVJe7xA(120lNg)AFa)RqysQvk~<$5iUF0t}6 zA0pMoq{zI(qW5g!u&-Iw9XCxbN1+UoAv+f_Hd;nrI@+4`pa&w-h%$D?p?-4aC{H$t zv8OMg^yMY#`ujt3bGwVQod2udmhVg7eBlmSTp;)O!^1<@<9SKyQk=k5+((4@itu*8 z)8{)vs@Kwn2fi0lQ9)gB0~k?x#E|1*8{(Ob*>AJ@U2LYjj}Peh2~Mq%b{rn?OUfU- zZ3)_*x+Z2`otr(1yRw%}HZ+T=X=|(5`l%uQ-8i8%T#J@qPY!sKKaMW9X5teog+YzM1x>GE`d!Zp{JNS1l14wZnp zm;C6gUCYUCJ!{_l$e+q-{@S`^4l?*rV>{AaaOCnm(qek*B-|a=Syje=Sfe1wTanaY^fe#3GaG_D&jTNk>XRbNOpvC~#?$e|nJ$WxUO+-svnO!2Z2c4R}G zBK|bzaKuhQkK>G|MNXypRo#&3oC`4;a=&dNwnDfMiC@TMO~?}tM#wK2%!^&XE8P3{lW zqgZ53pz}&%A^#eetJ8|=z>mSfj)sO7?jzM5g49dWu?VLQNkuVGu^zm-!eD~aIE<5;x%_ha?rUH&(B)W#woj1 z?GgYL%U&8IN2a$&U*>i`E;=9I*Vm@Io4eP1cKYUpv-+h%%(}d-}}F&2IwvCos8?OqNnFl{%H6l zCvAZ}OpgD`<~=4RnaQFEas_+GPSm!ZZu>(7bj)&(j5EI7qo;SFOIoA1&|-W{3X{Rc zZUajt63A#+yoHxz!vHv$H5SdrZ%x12y?x8w&^B~@L>WL#Yc(yiPzQn#hhhBZ?J9a; z_diZ==b)QM6oM!k|D~A6wyXg1v*{{pWe3K-J%ei$H)Qi$`EJO;!yUV?5%WLP+A)Fs zHY-uuc$h#GH&vKdHx)`K=5d5*DGPW}`jly&2Z#LE`Y|ioF6i{9 zO+qtCzfMTKKjII=1*EuDY)VFe43l*8YbK|<6;*Zg4v^*B(J9;+xcGjnY%xP_`2+ti zLk$ziZ(xB*=`8t}XwrhB-TRiIVX3k%fVTA-+R_E~oqv zt2BA~GAkYC%n`d{B%JQDE~I0<8~y|MbllM_g9BKAvM$VuZFMiRz5}}nq1ytIZi+5x zBX-g_x`t2Il(I$wd55mty+J3p3pO6GnJ!LXcc>A_#y6)uhtl9#c2etZteZUONFg$9 zxM{Mte9HMp3Tn(*I{0g)_x-ph1p+@t9R0-ZB-JVv@(q9I7vcboh_Q-IZT{3-8-WF2 z)1$bgL**Bx@?~p>X4?HrsnB{`t=mc1mnf(G^IzUuAqd2=Rl*A)KQ(I_2OeeLy^dNYrd^>S}ZS*f_fEcqOqF3Iv|DQ$@`X!L;7JPkWyW~;K{$cb%katJi*dIh!%UVS_+q341pb7rlDfX}J?AGY3s zIn!us!;Ed)={V`w>{uP!PTttIZQHhO+qP|WFga)H)K@h%Rr@dO{XA>kxby~e*4OMe zuG~!t)YQe-P8)q^b{@7}a`>EJ+G+u+HEe*rrVDl*@3*6dk?4jfL#6I$Jf!D!SYIe7 zqG%vO&YVcQ%Q)^aTQ6ku2%62M67if-6pm$sXpG4LJh?-jYW$Mlx}|&m#YCjgOjeUd z>+L~v68!PL)v~XE02r*o`cjUb{REpSAQ}QwrDv29kw|S5>r>c|MUamPlY^hQ*gyYn zA2qUVS_}-;pONUr#YH%+%0)Awa`pTvi%3gLgO6jCL1rl0`#Dj>d-Z}C9d@;~p^H0h z7*=Xx>+Q|GA`EhQe)xQIA0!(}B%Rc-!|Bt#Dq2jC#vXLXzH)RRWF>|W(sQWl%J#_e|Q;<{`8nri&Hm{UhrBE6<8Aj^dMq7YK!^A}7+anMY5Y}H?MBI?BjqUCKJW6m$0^dm&i!Yd( zz5!yP?7*+aRV%l@Nnv%L4H0iB90|o8IUUEprVVcoQBzjiu)n$g6CktcyE|g=S^KEp zy68FB!=!k@q zDjS87qY%EwI-SUc-Z)@gxzju>Ehs$3OM@Uzx{ej3X;V7L-;}MFJzcs{GwtwVmB}ik z2hB#>qohHnvCtrg)7!EF5YxblOz!&z}VPC=0De`sUR$Z&YIT3YVcXl> zxNiHrTuT`Fs~3T=k(iVty&ph87uAc>TSO537X$4{wmj|-dfM7(IRGk9jr{TyeS8Zk2y*3z0r6Rn)w)$lKW`QW9x= zU8?a%(*Pa30;F!(nLijDr@KafT^+(?2W4)$DPEL>wR-j~AlcR~RBhJCQ&N;KjZUCQ zL6v9LD_LrOsID!-%Pz3MPJMbju`CwK68DVMM5zI)BLJd=dVDh-a6e1&*}9j@e@RMW z&4x?lUO+jEf1^{Sb1^xyShqoZrg&%Nd>e++k)deiSxS)ss0C4(dl`nx|fYj#N|faF zqu(=~ylbu&ae4u9f5FW6_OqhAi)Xx+k1FvYiv;3AjEx?p-5}=eH0|&SMLRSgEKwP-Qn&k>51u=*neWKcNhdMJ5Dd_VF?Zs75$*dmOCCdT{Cvi|=1;hWK)DgFgdc)@Sp1HW@Y#TftRqd@5)i`r_(N@3`^<7ExcVVaAR>3-cy}U3^8s3?_L}`j?ET%GNGJ^dn*c=n~lE3ZCq-YW!#q_x7Ks|0IgOxTJ z-hc$RXhyl*%ZwMIkPZ9yV5W11eFx?wZzdE zu*C0~7Li@zWe6aGzoJbVs}`){_2_yG6PCDjH5M)#SJtLHIQsD?3rfX7li{O?CmpbP zDvkvgicpx3$V*#>`mIPyMm+ck6ct33#~TQ*i!7r3gD;(JxnW?DX>3rRi0-~E3zTrA zBhJNjy_KTf5avKDz?i&P@S;Cq5iVnTRy)HI3;9(m);{Ai8p4jCP2UL^^q7)WJzuS* zLB>7wmx{`ASWWH*g*0D1qu_DaAIN|@-U^ZIh*_v(z!7*5%BmwC!^dHLdL{b}Q#@^* zR8&QoBiV`*P%w1zaS!`UjRc|uXYm)P`nV+PMHJp)CIkrY)IUR}tZ|rf@IDbi~;@KMb}yMo@E#@I!RY%aUX zH8VNf-@gixs#G!(%CH2*C08&+ut3h+Lq5NlXLM<;PbmIocix|GN2pdqHkHl^*DH(2 ztHtDx*>-vuGK8PICTn-ux3%=lu;7$vkYUCYGFrdJPmb9UD*A4g{LL9|@b>Ts+48?@ zfb(73e|y=v`DP&ez716H4n zdLn3O{uJ%f39!DxG6+^_sB7-TGX?X#s%4xs$}BSDryf_oP8cXhUFgCE3RE~TI%e%-vtP^QYdmSHYs;%L8wc(){TgBkzFMyc zzs9Gv$?a+UrTbqOO~%UCSk1?QVu>s<*xGjc-Mtipw)@`DoSF1;V=i}-1}zr#%u5sx zEj+mcHMtaWsV@>+Ur1RGxNEOHQoZ7oOFY#+EuF6z2|F-nFljFy81L#h)71T5=_Mh^ zR79>${CvZ_C}-wDEdkzfN=s>qrCsz24~E--5PX8?>O>vgRRXRoPn{TOvmxnu-N_#U zF7k@RI#zh<-n5hgVRCFM@2cSfan<{|Hzpy~bY1fDjrpV5MNo;XqGpx+{87l9#`?i) zLVtdv<`^Pz1^G;6^`8myoODLZDw?K_L)Be0ND^m{$|`^i+{tDeEsjt36k)Mm6t^|+^%EJi zK#~Dk&DUPS)tgMjI~FP5QCwhTTu{quY~n|ra!63lg9H975Q$4Q5A9CF`fZgTOj`qW zqJZhOQ17QrcK|EB5(T4uu~@!Nn55}pnQ>_g+y-oQwFF*);0#Ft^i#oZ=^cl?hin@| z&z*=fWf+GMw@~OodlsswTWiSD5K3L5cw*pQDhf|SQk;Ps#k>`+CgWO_I9-~DkBj4r zR=q-d!%Dtaux+Rar~6ez6Nf}$ekmR_QB8@JIZ>+Dl*Wv7nQ7ANI`)edV29|G3d@XCb(s{#~HaIh#@JuLHxsT0qu;$?BiIj-q1AHH6jF0sV@}et5hdd?NvbeER<2gU=A$V~L_;zT6Xj_G<8dIY zouWmzW84$Z3&YY1=ENbZ_Na)#$V+;}EFx6O-_P$EPHxLuZmi&Po z*JfVsvZ;dL#Z58{WAy7a!U47`%K+ff;j)?$4Uro5ASI=b1}qv+`zQmUhM2Jl8N01u z9v-5fuWm5O79SB^qR1mDa0nuFV|noA@cDYSpeDit>-}UUrP4t`t<%ABI2UR@p>gv4ng4O=M@K!x@8i3|e z^kl#ZUafTK79M-1X1j;?SS|*LiS%9t)%<+8RaAr^Orn@oUeL!JFqydqHS6?|K1miO zm|c1G71WU^9#*ILI8(BntURlb!N%z(7B7Wx`wvVB^3m(O>}GcgcE{s=@@(M(P+{Z) zBNTQ%=sWo8%Cxp~BlBxfpsBUdb$`(Aw!fbCKMPJcIDe;04gK~)v!8@Oaa_!NpErSr#^|4&1V8pMBYx8a1+Z#B4Z}Jl_x^7C`t+LKctAoWMzUMw zXzvOTJaNOtBOdSqgdDgNHedS_NCk~6n9}SRNa&!2yjB{nMTtDY~VH3tZdLqab z#b^e6O%3JW)tD;2-ej2rbD1t+P?eXmyV&?Mi7Pivh&F1;AET5W{e67BzCkQrKDV)dU0P2l~H zI9OzdOo7L7ZvcCFF3mh@eL7|J-c_j~PK;;`{C@Th;RoH7kYS{TZ>bjLx2zO(gb z=lx2(=!b2S?E7kNcz+*Qo&wTOT91L|)Q9^fup@wd6^#`WIJ17yhSIuQDTvW1C?C7y z2BxLDQ_uD!HRCWpooemD*pss1H{AKUV2E=^N`CecqUuKbNcd{iW{gjRWr#FQYI(?J zJW!~!29)CH8 zdLPDOF`d17%k}FmqWI=z@r=1-CKI~f*3Rwd;}g;I`$uc~yx|F|vT9y;+4ivUutw-v z#E~I8Tr(e@7KPph` zQ?F^a+Z*JU``2mA&;#MyJfY8Fi06UBPS?i@?G*pZ=ne1pXiVEjk3KEmW6?wcLmi>% zt102vmJQ!WhtJhN{#M{6muTLPf9wQbG&wxq8#|qM8Kar^KSTd~ z(0QTmgr93l?k{wvw%PJVrW%HTYmGNSaS^htr!Xg?9`3@2| zXcQ8)LZ91@fv&Pb4*d_nPJ31AxxwG15~4o0z4gC zey*aXyS=qhFIEz#$FN5WRgd$-KY%H5H94LfAXbjn*G^ePU8uA zbA~;TC1E?!o!F5;DoT)Nh7Z}fIf)UpikzP0=F+vyMOs9c8++9P46NEN$(3w8IQBUp zd*hq`c>bumBVp(8>gmw5KGl7A@_ep;vSK-{E?CL0%uCn5WAp)t?2zE{dFi_5KB@xvTUt9f@}jC)}ac}>$a&7MbKFH zq^_8!>k3cJ$8oSuSLmX}!o;~{0g1Ypo`21tW7j=Zu{u5E0eT~tik%6t{1 zv+hPW%??R#sj3lDlgF{4>32x~>Tb4~+0%tGo`!O=su!A4> z_{%fmO*f!v%Q~z;IuI%@-A*|!sQ_9+1s!D!M;cp$j$Cn^G)N;$f0ko;1pKFR`KJSG zlf?lQ(z?C9Z5yi`uS8fO>|(OCRMDX+k$q_LF>35X7DvNKEGiLeI-b-%13l>4bFwhX z5nDl#z@EOf>n%~Ljcs051>6JlJlAPhP&VG+H~su(A<7S&k*or2i&_Ru*-OWClM>ut zhSVhWM}C?_KUdGvF|eKEbD?RjliB?lEm~nUADy@wuY478(WZ|T z4+Lgk84)oc`28afUt4dv9?gqv&JTaup#?WD9VLT4b~bjpUcQb6bPZ%xWz~Go`Mk6$ zA1}D{Tx3ziSSSxJ6#Ba}GcN2ZDJLl_114f>vUQfKjVmgu=T92`(DcF`OWi;A>ST-)@HgbwsOd~&ZnwAq zbkJC>eTzaNL|`pY}%V*@fuO-P~KPQ@Q7Y~6`b zX01<-1DG$hTpzkN}Go#yj3+JyFulwvZ ztM0PxHZs%oZ!1(*g?%~Oo(RbR6lB8)Cp&mVP50VzFJJ5GKUxeAx++1Wm&a|IL9%n$FPpZJ7q9hp7 z7iMI<7$OebN+(1p79Pqr;#?OOg;RQ++2{@f6ZTMfN&%uDf8pVWIo2=pOKAm1c$`WQ zb7DId&MSqhml^7N;!Dl?x}FTZ+R*8|Q@do*_g7owDPuDf5PF7*ybF%qDIX%Tt-1&V zny^-;h<8P0oj7_bf;!E`zJEwK%2s{E7Rpb}*$|8N)6^Qggk3d^*FIW|w zlhUZ<5U>(hu5w>n(AoekB&5=nt}45ZGICn?eH;2QI1X1at?aGcWp`zZdY43pJedY! z*x9+9w-RfWi)@2QV0s}7Ufx)%xCEA1g)RVUoOKGe)iemEHhjlYjqQ6JMp}7-m5oyC ztX$KZ49ZG)h2!ZErpv4=V3V)>)1>GQ4`NZJj?|Lf-ifNYx#5|P5&kR{ofYHnV(Cm~ zsQykvX6mYW`Ln1nGPhdu)cc<%{=KGr>Xv1%nca|VpRYE%p1(_o*;8JSRM}A9i1|N` zh-)p(xR)VJdIX37=awKmq~mkF*%uzn8)q(jkY1q_WJ3~lp`uZj$RIOY1O6!b*0I#m zHfvKSH)9VQ8vx+s$8oE!LNwo9*Y)xvG}PJV$35W1*>53oM?DLbWSG7+VCt$}zHDS6 z%-$?Nt9;w~rge38E?zl?6*Gi&QVgEkZ^c!^$NP!U(FK?I<#DAGY?jjF@;au6v|A8o z!0g^Cq$oOYH6BI;qJ=Gj>?_qJpfZdGw99HV(I?9xs*=?ZndS;qB2f%+nT#hFSQLn>_{Wn{Ah^v>un!q^--9 z@sZzF_6{_a@mPt7(iK-)c;zq-+nmbP{JRUtU9&!L4trP-?KZ8~@ws-ZQM#b`>vW8P z)dbSS_28giC3=LIc|Z+%g0oCw99Gn1xU00_e`RUo^V#$1BA}sne3Uc5*r>(XVu2{o7=y|pYkZtH;1i>LbuV7c%;MYGDKY?%%W+uW(> zL0kN5LhnsmTpvOkg*}fV+rjr00E2AF0jDqW-ue6l6^3&SA8~!g95R!>PM5Ff7SC5~ z!W1juf4}jOmS;LRx$e4nJlnX{UwO);>~HbgQikwP=%6oq;n4H%eNw;P?;oGZ@|jWG z`Fe((>ABtcK8?w7d*+;-kcdY!hv5)8O@or&!jWvonlHwX5MF=(OGjhn8Qj>5nnXu4 z;>;71-jWV)W1hXVG4`RAZET!fys=^5vvN5^hvz)f9BVpSyalxn@AFMn!dxu+0uU#cx$#UaG_5{E)0O!7sXN^#rukBAhjypomkwwCTnq0*+hqF{< zrxIj{3J^R}6!D~%*g_|4Df7*avx#xCoL&d&yD0s%a&s$emvOoz8*oA^xqlb5vw{Wd z4qjzLe?j@w(B`((!!hxan}c z+xK~6_$w?wd*%!zSh8SVpxpB>dm|=i_0$o0WTSmm6@(9Z#!#I)1oRv^RrZiYCDbqN zn!tH8>0rb*s>|`<=TcyP@Ai1%1K=#;aJ&wZuBD9wDgPz5 zC|u4q3qWbckN?&l^qHv=`ag2#7_8N3YCiYiKYt*2oBnl z1rgGYih=caJX4Ebw(VZOTbsLFXnN28uRmPV(9Az#3l3>~rRT1l_-lr>mKU(3h7~ z&Oe+N8$j%WkL+$>JbfN-*|ZqhwXDj<+AEyEwYdZ-rI?dDZSQ*yeG38rdURjs8;$3B zX1|R=@^3Hm)y$KTh!%wE7jQWg)rkPO7?ev4y`(K#i>^;6O{dIyQXyN5eb%?Xs;mr1 zcA~SYRS}10$^23F;`(c{DP=TWHzx8tqBvw*8i^*~-pfhu5DR40KEzToMLKzadA){%J zaj$YbR^FC^$Pov*>|wi2=cQm_9jZ+51s$q%dJcYqi6NsxmMJG4;xNDvgxuXf!+w}` z%SC)@T6zxT&|@KuX7mVX}$Q!Q#ox-05h#;~Hc+i{QDI zQwMALJj%TbIJCXB70f-!qPN6+!ReaQA>%?F1@{+i$c7BVCB)qM`*~Qx$g$7}smij3 zR;JGgw}2HLEo(ZkT`F14(Ha}u!D88lZEniR3G}9{7;Tn)LhJ<9@Bi%rEK1K;S-qr4 zrl~$Jz>Zg$EmT%=#2`#>xFD+$Kz>NNmlBHMjmO|VGOKAA>an6MPDX}D$%){YoS5V} zFx)MYD=Gx~CgV|~=GO2I7ep#vMvmj`n_#bya@9oT>-h#6ViN}r-VdaX*qGuwbBHS< zSyC5lm8=^0q$~HHWQgX~oR!_M0v5bC&Db zDp8}0>yV=*RxL~;w3tP*>eiqkm#+^{`Ks(h@m!*+)5;y^^Hr-7$|p0$zDA-M`gTB} z2Kc7S)=`tjA#G4|oa>5dZFx{hWZX0=jE=eGX*EVVa2p$=9BLuKS+Jm6w=7vY@EMdv z7RW_uy9h}i`l?A;5tZL=AzQBJJxn2PBgGh2Bt1O&ue8V~We!0mtkuruxNGCy^E5Np+OSF%;7w{yT~S9h?nC7UvTK zY@twg6gEoCR9<274eh(BNi<~#iO-p09SFhnGCoW<{u@`iX{ut>&D#s;-5 zT~sk|I=+DsUr+Vqw6;|2wAK-9LaZq~H^LGk1bGP%7R=!gI4@ba0TTmvMm%9Q9an4$ z15y4>hPeFSusu*{@B;lTDNS{Cz?U7J(&c%FfQpS_JO(qz<9_!9&g(+CF|sbc)a3ME z_b?S0Eb&c4v*=%qGrCD{-ZMJdj@ND4=4HAXgWLMeZ3XjaHLVmYS4|@5T*@V-^04z& z=3t5vfR;va-Um(XKmTOau{8R` z7|Y`J0kolX<+A-VOD!?XzRA_iDv*j(pSQI5~?M;l$Tg4 zbyNweq(yzVXl0E>38q^$EQ*ce*H|!-HGK3|t*qw; zTXVY^7`vTi-MFtf3O)Z3hZNC=Zc?e@QAQEV*45O}QB!Zf zn7m>I;;fzZ(5&x)tTl~?TPM_zs{)P|?+TKJkI@LUqVT$}2l?d224SnXl4O+}8&j_P^ItzcnTprtWdzt8lz;gMPvmWZs_HoR;$#1#igPBjq$7Ue5t{Sbv+ zu@n{dA`ZfJ#I#G`PA!&*HYz5oGs(J7WMn;(+K7)PKNA%n8fGnIpgsD%r+V%C3t-CR zet7Pb=tkQp#o1OYFXgLEtvym;<6(q(vzjW|-lUtt6)HJ6(HOX@%!*X@8F!aai*^lp z6^kO6EQ@SlA_GgN|3<%bIH7gcXptTgeXs;dh&})RK^dgB7WjQKpztYxsX9Q~0Q z|0}^*y4~v!W$t#!Q&3+v$;5^eTST=?@SYFb%|dE92^ZBH zgyK3P+6?HhTOi$4V=uB70deb8_q?n zUrVSr-1w(f1VmN*uTh#%Bp;UT6c{Sfkh+=hZfTlxgE2dKB}=rCw=kr2#x}}sU_q#% z7}_&Azk>R5WOZq)IzCFgb}ZkW%F<>Bb`CMQq%50aHsQpPqJD;mj!%T^dcvWC_2Aam^J)<|xGN-^h$$Mr6M{DfjWRO0+RABEhz zmdi?5*TE`906Fq$5WgsoV5{Y|u=wi8hxG1!5xIX7D=r{4X)twBdP8Sc#$3fHo$Kr~my zX%ahWPyK`m?iSG4P3JpW@Y&%;t9b8aI%1TH|Ng0XHJ3Nj7L7lc+tz4r=%Cuc92s-v+1}Y9L>L+MTciU3Ll+kX>6w=utNRU5u!ZH2 zx*e=*&}vi6N@vS`hopa*>#rV4NJfz9i@0OP2&hxx&f+U%G|0EN9;<~=%?p6}mbjg* zwb_KR%YD2ZrvmT(r$zCzM@Y+`Fu9kV3>-ds%4gq>8bdAw=1F9#77G8>f|zf`CZ zN`I5r#2phAvYPaLA~yb(iAT{I1jOjQLAucx3n}bQ;P2mk+=4(Fq%+86kW)^50hph4 zOSem8)7d^E_yjP?_ABIyB*1c+878`hHwJ+c75m!$na#juv^nKtK$V3SlS$1|n(%|- zjT*|#m1z`CijblXW&VR9C4YvskHF&xYwaD<;ie?zac>EcpV)q*MGLj%95Ps!bFkW` zbVPeuY-yw!Udv=CMgfpiK_(L>YDLZ$1`lD4$6w3sd5xF*D(o*M!QM|#ib-n_1Y}Ye zb~~0OjtlyL$~{1vmz zevAJ(+qSW`K$g;OmDJvGYUyygWJ@v?@NLR!{ zAA!-U8?fX#31*s}oY0ClVw`vYlHtu94$T-+85 z&~JcRYJ<{1VYv$O_%-nzTh_3LM_1Msfwy3G1(`#m zYddSv)BnLsen7bp;E?9l+~WW)14G%#B{!;y*WA52QGqc_drqdkz~8CjM)5BcYZL$K z`SURwKz>UDjlWx~%K=+RXuGg^G2Q~}x>fX%)>;G!Q?~I7sTsC-v8w)kus8KEbu=Ve z07YUAjq9rt>0TK-K*E|TsAvBr0R8mTVw!wk-CC>b~_^xl$4df>a4#t<^fBipIXLm_92NaleEQ zBCioJev2PEPg_gb{-6MOTMZ|4+OQb4a7=Ckehx-kv|Y3G&HGxENvpAl0PiqAnUJO& zYvQhSK8OPc-4%NuaCUM#i-U;E=EgbF5F=58=m6nXshU2vjqgL2UvH+8VF{lFix$Mc z_@jG|hgN0d)?6zx@BmHC!oVc-T2Pdaw+VlX>t0 zXGu<^G1a`)KALtOwe*@h>W7m`^7xWHqs+A@|`q_w`~P&rU-ld2z}B?!1RWis~u117`DrE~yX z(L%+r&p|7r^bJI$WoP8iV;;AUDdDDU8j2SUGjD{^->X`sUefze1GStp+7}3$djZih z#X0JTGj0}!oDX^KQbgoZ*$1p5GnB3d68ruEqN_20dAIk?@8N?1&`j12)2~?j+%D<5 z>ZplvMUI;@GWvsoJEtsyOG4YG882;uioJEwv618a;z2jXxYEr|LW*m`q)Qes*5LYfKiqY4-SDyw zs9_$#bBLC2aWa%-kZr0QQPSNo*CM%Qby`_hG{*TkLs4HRxP7k@W>v=t#JSm1@+eGef4=x4)v|kv7^2` z&dY3|KK{V(mf0osFKrfI&~bS}^4|L-w1L@LizwZbW-eR6C+n)INBZA?#A%Zi?x8ZvFT z1W0Nwh55z1I6Lu@%aLbZ!}F-Zscw?U)6)&`lDJXcYoj-p&n2oQnlvwKf^yC zC5#L$447V&h-~@Y;+X_g&7D>Sbh&y+!37TnY2@H?XxgbXHk41{?t5D~>4zOyn37kj z=m8hLP2yf#73)d)B{PxN6~hbbJT#|tlh;=5|HdC45Ey(KCoL2<%fAeLDk=r<!4%z4AV&ZEBj)6=55v&tJ!R#i$=;wB%bw-(ILaJ^^ zN^>;DdyMO2){jHbPlf{Vr4$#yRYz9W{td*o?`icHV-}@|v?Okuz+=TZREVALV5_{W z+oQ(IbC3g035xs9wNGlL^Ma_dSDXf|rDIz!dNU~xYwYble;Vs3WS6=(+YXs2#g*n! z!hQm;x0(AJ!9Y|cgJ8fTGQRCNtF@0saSH*h7UQJy>&QW@ZlFE=sEHoO+hbjw>pjH> z0#`+}t+-^Zia7M*DSUR=Sf75;a(A&vZ3&`kVG|9mskS-!aoMqMfG*z_U$Bb4RN#ey zdBV0Y=&St)6jW;`02n$ZM*%Z7#HfO)iiV2DEPoUjcJIElz-F7j5uOzgnmqGuqxRiq zOYSJg1#zQMuUz_)VccdbnVH&OoJNpQb$V14jtKtq?<0+e`w_v~RbpSzEBy6LgN>HU z+1Y3YVTeZ8H`Ij-$=F)ISE?d9-zo>V)~|j&2#+1E6c|{JoOo+Ml7=jDD3pLeSI&eY z)G`q(YTbz?8CB;P`+&qwry_A}3{b~~30~M=b<@%(Pzah8N$Di8$j;jZZ*-mu4n9Wx zUgO@Sl|1uzCIurR+0}+?-Lkn5TBZTXT`#}J!$w^$CSJ?AlyH!UDI8PM7-=^>p2@epNJzlPQlF=xPs5Y-$hBzro0Z$gC|OsJmW{i#%NU zhfo+y#D~#Y=;s<_dFo2>_C}P+#W9)d61uwu=zp~!6?t|4s7QGBm;`FzZLz4E{9d_jJXd_V5IWqrRAMh^Yo-8IOylui|t5l)e2P3M6J z-wzx>^O9TWiJf+m-VZ9EX>cxYh>Mi~3Bm^F*Fqfqf;^Nw&|Q^2$& zNU!$X`tX-HvZbc?KBNp_++Ajog;LiT+EqFp_7gYE|LnK8a)NV_PEAKbe>HA(8Uoso z5hU0pKzWL)9MkXSDteKFMZ_vQ`y9{#18oTp@SlIDNk7(TsE$S*>Xk9QA=Vt_oV~7 z;&5S6G$f|H;m=qJ2tlQtEqb5Gr;IUEXb)dN6{j?&8kgi$oJ&uJtr862Ag6H?Y~OpT z9wvBN8ys~nRc=-`B$~}|mB4$|(}!~9E}_68!gUbLn9cEc6@g5$Ovja@PLg3_+^)}F zaJrCMI#WU=EShknF@qjtGW1|bw@$yUR;j}O2@h4A+tO!eQfcgx>RwA~5mU+yiKi#(@0S!5}lYLsKwWy>k4j&4@FRqQi`w4A`if)Zzlk)1DH+G-ExFEBf=5 z*dQR-a*QW35v+9iD3##iN_{ciQ%^3cKO&w+h&NOL$qBX)09Ju{@_hHFqXAH}m9L93 zmWFDrf?ovY%PprVnT8lsu?!ypGNxf#vUT~@-syaByiwy7En7?(?y~*1eRp>Dm4puh zua>sSD(_;iT(MA}k)%C=cwtT0w9HO*GzcKL0y=qn9Ke)gAN zkAEe`4U!}G$KQRv2_9RCvZC?aO#C-Rh6g>hXbhbr(uk!e1Iu(VFW2mxF5KX9*IOPjg#4V75%anf+=Keg5u%gl zCh|_kVz!_8=uac?9CcWIOsf4vWt-R)&Q;knd1pmltXs|7rSHctlV`N6JIa*+tJ&a<+Q`eJ4bUT|tO#dm;!w|q ztA+&Y?)*}y%A%6Y3Cc=8v*Ug!%WPv{9hj74hqm;MqI&f(vv57cxOF!PJNDA>-i8BV z>lifdG4bLvZX)CYJcS}6Pt#nN5CPv!RCv^^`m&vl9Uj;46eXlb|FnfjiT!5i>&-{& zVOx{?wiRB3z%%t&y@6XjeuKaFmESHT%tFn+^>{>tL5Yo7$i*PF2 z+sAzJL`jgXM|AqW}xd;uf zBbKQTdAd;QuoIOvnsUHA<(x4IewaMNwJi)&2o!-v0qth(^*WQ2ZMF?FrVkaYvT&rw zr19{k4K~dFjpdL>>uXK_Irf3}an&bfP!E{3rF6t!6#M_)a$M~w4`@1C|4XidWpx+%T#B?j|eiU z>XfFQ1sv0~zHD!@rp0Vax)5frVt;haasQQoX-gj?5i=LaOzn#u{TyaN@6_c|GUk3T z#kJT|eZ>1iGVWEjAX-Toidb;A%%(kU-&SadsxgL}&}f@y!Ij86W5Hd~fgU$HyiQoI z`?l!hRrz;0}?}#;MDe7*`nMPX-p9h2ZlT zL4E?Ke>9{y+O9O=ub^+Wbtnx*)WFDyV5aVh{&zf(=7Gc-meX8>tk=DX6MP}qp zd~amk6bMh`&XFh2^nS~wXNS$n+dCQEq|h_zy?>3B~LL3MdWJE&83;e*!Tel#(DZomVLEEE@{wRvTBu}KQ_Tt ztSqAizkt-DQGj<}iiH0Y)C=o%-S;34dJuDPU@D=y-EJ+=Z5N&Exm!Dn`{K(QwKtyV zX~?GQ)rGSklk z?bX3Vy%y6Fw9T5gFr-zfN}{>;iiN*OJ9~6x4PMhDd>XL&DC<&X-KPq(2xWh^H4^Ea ziI8$M2?l4Dy9$>5riTRwYFjN#oSl;!o#HC*?i7%``uxS*K0-2k>Ll&yg9TDr?>J%X z!8{&?-6l@qV5~d?r)z|Yr+-PQa_iA0(AZTAdrgrgr?Ijlx^bb)=nUS8l3cJN85Y~m z#?=sQCBg#NESGHa{zqa7lYv__eY&&&b08-Pg<0HN?r_pXQN}pq{~_ufxGM|Rwb9r% zI<{@wwrzE6+v!*(!WpV~FY#5$kg_*0bdiu$?+!xWtNQl`$`pC<0lBIwLf;uSpF z?aJv40+Wwo*T7sz_DaG)hvCE@8e-9%mI`vE4^fLHseNuR4#)ZY{Lgu(VYl!UllG0Y zXF$;mS;M{?gobPVl#4%tJa#L8WB8l`Zi8($eL|8&DTg`FEo?j<#uiiNQ;-F{YOC*B zIk?PuaZ7oN_vZtY>+$)>>HX9S1WW|PTKcW&N5sUg71uGFsGiv)f)Q93OA!3qE>`c( z8@*jQowV2%aopfiIaqf4j-7l%emz0u!t@ zK>;@~d6kF$ko*Z0QSC0~N^y#@o-&2mHqmo`<@uGL!bBEVkzY@l>2}cX!!biqzSF-b z$iTc7DQ~{>%x$~%rz?_XCteO5R811Xw11S1$#{;V5qh%~qQDZIBMkCCr_xS|Zsl!k z)%ngzC-mTFnTmtn!A^MsbySj9sHJPBks9gRV`wR_04Kf4yjJY4jy>oGP^1~08bsiQ zoISBljMlm_-Gj$St8Z$A(4w-_+LqKEeQ?h8mfe+L-^4gMN#ftIqFgve~9>G~lKnV~IVV__p_^N0hAm)fR4qf!uM7NZHOiIQDK<+zOW zBTope=u%Zo-dauMu-0Ya>xm}il{2{=3!-N&3u@E|h1Tn19E?1O-DXuG}B!NX$=nXzA+6Ah*#F>#tz*;Ldh)csuwv z^Ax&VV-!zMC3}mxw6f}Y%rmAiOt6*FT}-3eT^X9>2j9s$Qi5$q00D=1R^jyX>N=Aw z+=f?R$;wqwH8tnVJSFy4p5Dq!b#Ks8jC!o^M=aee&EvJX3CeC{_W_4pu0D4jr}T1v z3FU;O)!kvs=dGUGM7s@a@n32_s%*c_Iif{3!+7e6GPI2^LNLX`H79N;9J*7bIe-u_uORi&C2kRZ(;)-#viYL^sEbCMh6is? z{foS|G!D2 zg?N#K!TNA+ekXB7e_QD)Ep>c~dwW>L)dOAVTS{pY5IYl^Zw9XHSF59-pB@YgJb@Sl z=`gpAVy^e%mzRG4l}XTN?Xl@P@Y6X%qH!a=iVy?I+HvT7apD(jSfa)BGXRs2^m534 zlKXrcd4AP0>?OU54CI3;j)(;LoBp71Wv@lIcuBMRkR?>!2;Uc)8eWghx|%NZmL0PT z%JqBhvb~y!d9<~&m7i*EXJgdT;E%Hh#O`g5pSK3hd>YVv8^7WPRulQdHJox5h*nm6 z_5Tv{6=uL2j|nO%{)s!xZ6m;A)!tJT(Q73&1e%M!)YFY!nh!n9ms36kul|#Rtf!5? z^_jwMoialFuwqA>zm86{mrzK;6=fR?9I5a6Y-kI#-tsO-q9itzQafR2(P*hTmm1mh zV>pxC6#NG)J5n9S|G4%t@{*SM5oyvjVrrQISu0||h^uUy8o zNcaw%(RHE^D+Mn&34rtxIY2BcyPF?LyxJd~H{@S~lib%KvpQGoJPGa~`6Z_2$24R5 z@(bgQ$#zE17X=iF5?r?fvk%9I_n0nez?qtJ-{q%avIl0SboDQqf{`_Ne~zgG>bKSQ zQi0#cUgJyu28xk?m$F$bigwi$LuYB5zV3Y}eXxh0%!FSJ>VRIk>t&MvYw@Jy3m^|Q z>6rTU=KT@@8@hMjN&d+>#yd~Fc1Y8)pjrOb+qDJc-H9K2=+thhgng8@8ewX#dgx@g zl7JuRvX>?b_(KK#D}PSW5aV$)nkO$@M-+RR`fwy4PV<8vWangf`wNis^%D4<8uWSn zejRvx1O?{wznJVhfWYW&ZFz%>>7zK1R*(&xG@ED~pqBKjh1TADkBs?o=VbI%K|k|M zc2c`;#b*hn@~^E95?Dx>L*LHmU--5c)dt~T&?hN~6N`G~$_B?Oyw<6nJ|2?g;Za7x zQA<_JFMjnw4h|>HGYBu0AphFK@|ht?#le(8@R%`ovIBH}XHD7v@X{+x@F#7M|1FR| zbv>)nNQ)}f68|;EAP}?2jT)OplTks?a8%!jIydO&S+Ywz)18m#jB%lw8#mWaA`o;pnv`&Clb(9L^nD<;Y=ipjDB`7bxQ8T>B%25d~;_>#&& z0)51m;=>fohJ#AZz}?mC-Qy=&PtAiHz1Rki`|K)Af)Q`$`giCmoP3;f8hVqaz-@^R zraL6m+#M=uNQ`D&C~RMUbOww1^fGhSI4+u?C&Nm8R3q(NpV5_YNz$B{oXbvX`D)Ma zW44zSQ1t=`%S?&C#4^R6!_+qv>R-ETrvPbE_votPv`lfrYINR#cH6B$a{z+-&N#R7 zfOdpDpP0l3Op!(QFeAKgdssJ}zMkpx%L2ufD1X6vY1A;&Yz`7nZj`3iWXuv)gEoq! zV>H%c#4|F=fUvY24&b*?anS zlo^4VU63D8CzJ(Js05?I@lfUa7q(Hw0D_{akQ2vDsQI=+^$j3(BJV37Ahl{;5IaXVL%T$vLwLK0;_tJCm4uv@n& z;?{yU${r`$(Cb11=@?5gt5xLWMZOXpVAw#^`T`kiEAplz7SY8Pps`+BeV6J-Gx)-bL+KN1 zG=J9{IApv|UT>}zB-<1!Y$;e$-Lyqe&RDEaJ_lj6ZnoR^S}}RrG9Zj+l+(NHbrE%> z5PnNvm4v|+)cRgb_gi&}sqiejlj9s~4a!Z^-3rEiS}(_j1#!UKiBGoC1K2=yT)eIY zHGcz-5!n4B9~R2%-R>(V@bUU9<7=tsZTRc-`lHe5efg`Sg^SqhKZBxRW$0cSg}*6y z`yXfXNayo4MxD|q0{@e{FR;kI5XjYlas?W#S=-r*1AXV$BNIt|P6hMil?q~*)cD~$ z_m}4z^blGkkY)FexTL_xEmi0mPqx++epnt%_UhkLoK9}xuZ#5M~}4fezlT^#DZ z^HbPBL*Fp3^AHBl6RyFSLh~kcY)i?(h8QgITFZRB8U@QaL}3g~l?WZ@5O4Vzo;M;L zt)J?YGx$RU<7#~jq0LQI>>$Yy!3;*&dZ^CPl_}e-{#}(E3I6W?7H&|xvT83hib#|R zB7QcK`yKX8gkG0|hAc?RN13fIr%W7aJX|6#rv2F1_J1uKdQ3km zwAF}eioCb|{nb5_ca9n^gi2@d6wx*1^<0F$vZ>(#59DV`_}RtIV7g6dqAjJ@F=gcS z1QXd7EI=|x`JQ0s`POZ&tC8A>laO=0;Xo*u>=5rg&f3;^xVe^5sOhjMn6tQj?1GSu zOZp2a$t$QV6V)CHY?dH{{Yq;VFe<9yV=9#IxF%77h{&d7UT`SMZqLEKpYp*&d&W?) zG$W_h^~r7kNSmChA*dPE9ytCw0?c{n4HUqpI5mEs^Aoc&GbVP>F6 z5x*?$V84GPoi5!nPPR3hPCVE(V^@IwwYJtWtVKP_c=)b86&=rueiTAi5*=sCk{uJ8 z1F>H{bMEfnO8?Rlm4$DH%?^50w3K^29FFH@M1uB4`?x1<6$85}v501A{fp#HeWzSh zRH39h1F}2P2Ll~t_hMW}$J6~Sc4?^}LKUwcLSmI(K|{1TkGYQ6tp&6JgH@9sJp>Z1^)|i$s_yIR3j4JgLEnLHN7M zb*{PePh9m(LGXkLMJrNFvTWXkwQGzSu0%KU7Oz%pvyO&oJA>i*+a0t4LrR z)%LY#QBqdu3xz`SqhF*pjusg9*NTU$rkr{Le$W5j-_`3sXY7I6i}84lm3<2~UjesG zJCgITG2G)3971HMQp5p)C=87SzkYF)gi47>mRuA62B;R2UJiD6iAoiuo|0 zTEycbG6ZLHW|UBhlcc*k`@jG;J_vZG?9o7k7BJ?jiNzs6t;Uep-xqm-7>66fi?zUz zK%_jRq_j+#O_y~F127U2oHA)mY0BJEF_=pJE~+B&K^j{}g7Gsy$KDPasBG)!CTv?Z z=F4UWE8Wu2v=k$c!;_lR6ua5#yQRaRI2G;^%yvZ$2zODr>vKHkLN^A;*&i|mz~ReH ztIazqPM9=ov`tI0NzxHfZn)R@_$W?z(ps|hvGo#l>2{rZ@(!@=Xub*v3 z+g6^}IvIy7FSV1e0hVy*530jAGja2o6G4N_JBd5PP(E-5XW&16K~#5=JIq~&#wuz# z(OG^_b=U6nmtVPdy0A;`L~4u&|DrCv><+&lE|V@Kr0hj{J_>1SZUTgfXARF+MxWm4 z!(S)cFC$=nX^cyiFQ@g_r@PiL`Dx^hgHMuTJX>5(J!JhT&5&4#yH>Vp$_rw?Go^+NTv(XWoARF&5su|SavL{SSbwqsF4OL zjwQD1-s2Y6$=+_WRG7Le2F33n$ydum2B`nV0;<%dt`)Lac&9SCm9#V52{##vmR>l~ zpuSUr%b2Z+Wc(HGo$y|zM`!qpc{j^aXaqS>H}lzhrPM+g3fVKuZHq|PU+@AJAws_x zk+H~{EG)F6XBHSpG<11+B^ztrU#KD-0)k7VXq0M9%vg6esKCy|+YLA8w35}XWIH|{ zFPqM%-^#%?YdV&Y!IOU)=+djxd*9U;OoA=m?iB4~J5ai(LL_xQJnDs1AiZtFp;k~=3k9a{Z{`JbCx94@o>(ct`(ZiA%j_d_K zN$vxj#N;Rn#ZQOxi;z~vEV=A9o2AF*zL?6r)?aIxg6g8~&FNh_$(6%BpiHl3kZ+`Y`8uvLd5z>QtZE^YhHc3lS5ZpEg>dL1k>$rN_<9@BBB>uCT9B~H0%4e9wZGl-!gOIFR7!_3LYAAFR?$aii%YFL#6pbyktdD$2sRh2_#mtfUGZbOBBKC{VRDyGhJ7m zAgWew?c(tBHi=~({453*#?uIu4y1!%4r0I2f_$Q{;esHTXS>mMeEp{%oV6f=n(;;g zx($T_15znu*f-${>n~BwmfXIpM9E||+jL)Jtx{t5e5EM0z;14+wDi@>*W{KdIjdnw zRHWqo)*Lma98VK&_V`{NUGmlT9QMWPyV#5|{Q&pXb&=`RJy2dX#1t2O%rg>VKzxzo zs*tRTwanr=4-x(i#~;W$V^h@+;xfr(&YdaatB7ZF@-ptB!6~tNPE7kTKW^7HO>WMd ztMHiUjVk~tVW$~CWepkeYn#1v0@8;<-N9iMbgCLELdGzMzxK;wD1g7)H_4bQAh#fQ)NXF z`Dc6mou<19?SOa%k%o-)NlSSz2$|@UiSvCi6u{)-Pv``ZYQ^WSi5{oH>WNB$Wc||| z<}Y#pQ}kDHql6Ppdj{&w8?UN3g=EHoHkWQ09wj9Le#DeA#Bf*?pSr`MfW>m@wdb5bS^<4wis#Lw@i z&jHHMO8nm%)RO`UJ8rr0NlVpC8rMls_V=vMK_dCMxb+t+A_F&)eShVi_(rgJY9g7X zl|+Dz4dFrdx@iY0L?dSTMA5q^RstSSuUG-ba@X@Zi*p8IPkK7iVD_`h$fZSgxUzG8 zzJmNN@=ml92bUIwjVFD`08_E$YQRjgTdf%?{ea>8oQR{9_(aJ{gcWRpa5?I6+XL~f zUpIyXLyGiu{6kuFbSeoB4M30++-m!FIA<(2Tt^uspl1ZOd+CTY^7`lW>Bb0&w&?ZDfM zfyhK5uj|c`M4}EEr*juO{!SoUHz&b!BUy)_lsVCGNCQb-MaAHa+HNGbgWDiJzbafa z2wWT7m}LDvTd-J(X6$0|$gxts03W}fBQ1umqGTwYR?UXbi>pY|61$v4&3Q9Ce5l%&(w-EfhR?nx~n+yHj;Q1rf=T``Q@e)Yh+!DQayekb_ zO0?N0bG_Q*yEh`ge`Q~<$kC5ocf)!ypv<03u}1g8fatOm<{u>nhRqfwXOdhDWe0{R zD{p!%KDdJE&1K~KrkmArdR)n^K0Y9@AF2(i=h(Rz1*3^c^Ecktm)TG}Q5FgAuz@@I zyRI{+jY7MS+6DmaMN=pTpJ|_8NTdo%{ilWUs%hja&96|#{Az#y74ATro+e2bAk$gU zU}L@x!n*GB3ThzwALfnur^QFw+{@AZKlUK_n`3{-KXV6`9ll;OMW$lY{3Ch~x>k-H zMLC3QM5geeo2)xEou)Q2R2S^{6z1eJm)|Rw&Lm;kQ^gi2su50y6%!w-(h1Y@$s4)e3(XYDMs7K1rr~Zja?dw^C<=ZyGUszH_x*bpW(z`YwhWS7oDdx9|a@ zF+y3MO_mRpgNkoxJkvMeg-TpUZhJXpWmpi~x3Sz7+0z@9=gx*|e=xW8f(Z4qepm1( z={?PJ-tm!JG)Ehk%DNa&Ow@5xsmFO8Nt9LEbw#;OYPMq{mm-V|PX(@%d$~eeDY)<- zA3J)fLRvXk<9ztNrs6^vQF`);-%g?O;#qj++{PNKY$gdyF5Kz!2A%R|g_brRRPiu9 zfc#v3Azn%p`D=8^*}iyut(uD-7k?+Zf1MRg6!L8a?-!p*dG)I_ukk4eNCPimGT`fb zMw^{?Qh?J7DQ4@I6)d=mFG1@<&pbknQ9x|9 zUntaaJ2D}?axiz@l1-&ZOBV?P=$^L$CMpn)t}ucvkW^qN-O$}!xF_F5 z;Kxd}Oxch1^ra;`hb4cqUAmD(g@`*p(1oDW*alLt-6>OlzR;ji$F`Flab6E3-l4MoTJ~~K(xc-kdPx${?^E>3{K&F`sD&uOCY74DC*-`UIr^%AZiNkzpEz^~+ zir`=HAe6akzB-0CuE=JG6(m?ut(2#H2SXoO@`4qHxj0{cTCEygb^D5tl^7zW73_48 zcNWbs$$cr2#j-Ax6?jkO0T#uz1tl{p*=$YRcPMAcq&tI~f`6}?$7 z=9>8wjOTUmYZJ$CG^>wj%9iFY1l&W8A~CQPTdtj&Ic<|q~nCu_YE{j5BGE!2|TTM;3e%A$#o%eo?oo=QE+oBVn8TLt5lZS|R@vO91<95Rn{0T-?vL+i^yI#^tH18Tn2fS~a^=*8S&Y9e8*+4A7TrYHSV zJ0TH+ZwL1>oO;UH>b)bdmQ@$ecki*Q2W()?$mwb^f|Dtni^D|&HHb! znnqE01{0ziuVO~bR{0yc-v9tO1qR`X7mM@|zRpcD3pCM}W zT-e~3BYE4p1})aiP{~Z=?G?5r=MDM{*q9c$RbBSoo$7LLL$19zKUI*#`(lHWb-WKR zMuwO^c9f{az8_a!m=O6iPvVuM^Vv&m&OO$z58WRd9RsHTy-My>B0%*v<**J~d43|zR9TGw-Zgt+O*_)(f zWwDrYBIY7?`kC;8Y!H#foamP3aT=gB%33FJqS~BSzZ;B_6W$Q2`fvMuuQiIboE-W4 z|4-P$Sxi(JLST9!6(hK3R;Ovm$z>R1LgnK(ieU6za>LwkfmZvAUR9Q5)hG?->lC`{ ztAR4ewCq<3>}<@rzfQ1J2h>FDGHW%NuX%YGoj=wODzt5AvE?m3EH`QbSr>xJ@>S5s zkm-5XT%KO$jRkO77g&P++QXe3{EQzfi)}cH$#Ek*!2NFfa9E~J^`yU4d7+tnyU9- zEPw;$gnKb`{n6YcAK;#dvJZIw90F|JrV5Mj&?4J@REoQD66ez$Vls2Rr2NX~3*B|59bl2p> znw;u}&SHe)Nt~YWbI5=cfVT}KEw#aJLzu9bGxWJ@pabis0XXmdRqPq3jX8=& z)~ym(k##D9V)-RjR4&mr>`j?PkTB$y(eL*o4hzA8r5!KZ>Z2kZMO#r#CB3!m1&vLH zIkN#7fGfGnEJp)Nx}LsSq2_!TgCno3P5**gh+C#Js`M)=S~BlD- z7qCvlWLC#`s;27p@b&%T{bhGIqx;`uC707_1BrP<(OvXDH3EC%VcFf#>1<;{z@kS` zrVM|!e6e{!XaP-nSs9i41(yx`-v;i8%o+RcR?q8zY;#Y;ZrA6FgD%hQmvJZmx6u?U znIDJV&X;TMa1VuFo!Ww4|9S;|)^xKnnrA*2L;ok~PRuJ}wB0dJFyQ&$RV0Cng7$Rr z=t0_aSAAob1Z=af=k@1MOZVXmX#AmRw_)`faC2?T`{T036X*#{_G;55$Om*iO+68A z^+YxoZ~&f71w(bboY>-bGtJE|w?UvvJFs4pd~Vq%y&K19ynlZ(dVz_d)Yw{9TGj(E z1{D*Vh{8!WpH$!)jUM2Ojw!?(*Bo zmZ1#i)->#v+((wAQ>7b&o0?MjI9Uq_%DT(zb=2VERa;c7&8uwC?eS`>PWMel;|D8; zr+%WGA2c&gqs+NgoknWuD-NerZeYpR1pWFJgbTiJe(i954t(uNZ#)}) z8hx#<<3s+JyWjsG?*79wVU`0M4KLx^{b$Uik}nqak|1Hfg_TR?BC^TOxL@;r%%sGf zBckYv89HfoKptb2AwwftB360lZ?=Cl$wA|cYbZBNc!7Y0$Vw-RUE~^+3m0ZX^!T@n8LZ|52)E$;S(t-V{09z6E7PyDW zrL^*aDmXwfsC|;XnQtM@kk&d2XOn<0^g5Gj1EP% z=Y$h2LOULl06FE%q(IT``$2`xEoLa|9y*Gf>IdEnS z^U}3_xVM`Q(QWqN+{Zzq++hLjl|A8wr$fCrq4LE%C?H(ax9zxZ90xVh>1;CRZ{VL zW<4E}AZwfq&yC_u9&DaWq?QHG0;cI8ia8Oj-cwxM9NY31Q~skH_L6Q zcu`SFFSj>~ORf6{)qQ2y5@sLkba7+F`B~SK;B%_77-BfhB zY3}TCd+GFfW6r*|z1rpf=8=wMldhDI@J+bgY+qbn8ws@fTo3quz4yG=A}1!Kvujo! zPbYqk^n9#qfDT{3`#nzaUFQP;ghWKOv9vLb+wYUx0dJQ~7YTEUe^z~*pFWRzTDjovD!RPCnH%D^4q&1(PE!IeNOsL<${66Sac^H~Xz7F{S-v|K#-OfOI}7 zeKz`j9SEWShgGS^W$%7$u5EKNe60?21663#TrFhsC9yh;pu!Y<((|Znzj0n35;jazXV9*-BeqMyV74MKM)=#;N`k z&8*;HxS8s9X*_zBEE&fKDWb#DrPVCYE`CBX4Z$@wJvBrDm-mM5zYw2ClniQ?0R76m zBeTAvj8=&|c^fku)s>IG2gfW4b5$oP+Jz|UzDGI_*PqIi1VUKa=jzll?Oy%1%GQNu z0mK+EwYzM-i1T@+;+C(uY##i{@U|BsGw5?SB15j)*v9qHG3BTl=NwNwJ7t1sfBlLS zhSxS(){R>`=nhWTGa{&u$%O)7X79zh5%!1mu_{rn!!0TKg(A)fF58E)*wnN76FYUN zZs`(i0QEX3iCvl{Tch?KLsH1sIH--JA9+P=_Jg<#sBhkquiRDEsYYDv4lb2w^xgW` zy2fyfDr0dZWCrb5^Kx6np9`GvLMFEQfNNPOb`DwhZcsy2yqBqelMamgT*idi!5(f6 z&lM$k_G$Xd!vVD-BUg$P3b(7S+NX2tR_H9*C}v9H?WFwjGpWgV3KYeEC29QK^PHlT zG_QU%8`RL8o1A)-Wywn=qp((&KY(%S-oqsxHf*XnY45-l*(1h~M|F-#jwJ>!b!ghs zd&%k*yz&~E^(TW`GuDEJU!jUW`Bg%jFvk_s$K(t6enx)1CO*|%eHY3iM39;4*tjSv zC0+-3ef>LS3$fADsvUOLPQw^jf7*Tv*i=us*|s~k^$1XO6&Py(Uc$4DH}LcDzz#&6 zER8N5G%p)P&prDAz3whsi~{c_tGhlrD**Q%INuWFhZiIKc&^Xz?spodh>0@A<(8*ywYs3HgEsA zRE7OgN73BhYR!lkU!E%&MeB!4ihKNJ#v{iT*bviUIleE@KEpeWEKw}u+NxfN5C!hT zc@81}sz4kW)Yz<3L$O1otBM->ctj*Aj0M!y(IoOQkb0QJL2QaA{*CEXp#i=PGgSJ$ zLM;`!5?|s}t<-)MWpXSrI@@fdidPNIp%U{jXB}wJ{My;DiCm;THYE=Cvd6Am41$L- zrJ&dUTNp{K*-BmUbOy>4&20gj`qPhxlT`b^OzJAW$O20 zs8eJbO1cU|eDqF~C)lsJU0k!f?q?uqa$%st_npw!9d2SaGZr-y9CJ39WH}3Rl|GM> zF4k#ev7Lp9!J&?`UImPRGWgEo`P>A=1pwM00e93NUT!5T=hP26s#$nv@zQh>v%&u+6L%TN9*x{;8Tdv%CxHEfhdMLXL8IdOM6ch}XK$8fB zG5s6RftNGy9PKn{?SHZ&(K~I&2Omrfco7{~iqEvmXr_~mxDoUD zq*y5rF?R&4)JYyMBSvnbD$Nfvi~JGy@EUO$o9zg-QMF({6CR6yZ9vTyTD#z2RZ&wq zdZQ5px67aLfR}bu987=&YciJbN%uP=!(g`%NxwtU0{#jTf+wHAQ*b_Kc3&8EpE+XS zreUWb-CADxB;ESBB1J>&4@y)eo~6}yoi(<*lvP7DMsnZVdqW+}1#wViG>NdxUTy6Zza;Ns_GD^+Mv0E`&fyeNgi zo9NqfMv$|#OwQ8W4=5JiCW63)dURHk&Bcv80j%Rlw~>RZ;C7#Rn=8D(B6_ur&g)PC zjRMk8D(_dm*MU!f>#x_0?a#S&r>$0JvXyMzZQsv>o8`dkrvdJ6*Ztv~?=a@0%bbys z>7K8vr>~)&XQ$)4d8WW!1z8w%3mJNr6}3=K_pu*~4vnQ2fMYi)k0;Nb`${92l;@Y- z)7tk}r_P%ty;OA{4=;M<^r|^}-^1o*L+_8t@A)GI`ss6V`DvYI$=l3wS;>f0%11CU@pqyJ3^#(X0<;;&nM(eRBojGhgKUzVmrAx_WUDw{vC6 z68Q6JV0r8Py*k5aRI<3eLNj*ArJlHb^#LrGQ1IK8%~EZ4`LaJsF5ehTG?y)2a>j%L zMhCX%ERIk|d>}5@w2S6>^Cw#9Ljh5?9V1N#Du{2m+)tM-V;%AT(Q_c+RK92<~5u=$KGW>xnja+;ACCXRmML&d2)2bY0{G9e|Gx!G0@0)4E&)I%UhkL2N_I|rcc`u~WjH~2^ zhL$p%DqC?FM27*UAyYg{ARa#x(LbW8Bx(ok?8DRRx6sNWpE9u5dT=e)@U4vsgLI4E zp3EGJ&}5fYH3!x-2s}f@&Ht{Z99v%yWDFtM5t=Fk$X>ADWlNpjPSvrF3(Y{b0CS zWtZYL+QL<5Xxv7XT>~Y@SDUQ7>*XVGqx>%x5G&b~n{IXc4_DS>0EeOj;*oZLJjqz* zTdLu4crHoTKcU=PBu6$;)vBw<`f>_`WqNVArA@_hBge^fe(e_|>-1;ng=LfSl4#sw zF|RsWJ>uQP${gH+wo72CSUkLY^!)0DrYk38&$jnZkm4}-7`GcRoqz#yn&+PvYuv7V z$vBWQQ_46|n<3jm7oX7zBsq{bt&r;00iJa>X0?!q=PbRMJv^NUrr6E8jvq*-KV z71W#a%0z>K`FIRI>W5@kpx*jnn|*77ZsUe0>?}Qg*izySjY3O`wh;lbK#(0#|70*-Hwe;we0q1RfW1e7%Xw-4tC9!~JRF!0Ie)@N&=l)e{lFP^Zh~ znO$v<;lgBN@xc0WZMR=tR~l4d-TbT!xi-I?M(!Lc^@_+gXhiard8MH=IG8dBQY})tmL|buovljE}`a(9+^AIs$GB+jsdAJ26fLX7i~`TPrlwmf(BG zPUa?FDg=z!HHw>&V7DCN4<1j@nOxr*ExGtN$942C+!YCC?h)6SE+p%|a!a9sr9U*! zbEfEG%H!2=OJ{7)Jy{u}RWjz{?8oGep;bT(F$e$*{sE}31j7y3&={20GjC=zW_AF} zym4_}bmM)zFD54aMijG)N|v!-NwJU359}E$!iXx3Zv<$4(UD^`=*|K1uX}1Z_#mDC zamWNxLC5eG&dz11@=Y>`)=+4@6g@Q6YJR>973l~?_Z7P@PIqb7oz7k>;k&gv8t#Tv zyGIX{psu*Q+`xR-)%^awLwRdlAcmT-jO)&NJr!+kcfkBBWg&tdI-EPQe38~^*+MS} zHodwbo>D)hR;0thN#&Uy#uugx&*BFJxgSN;x_J+2khLr>^=f$cttUB2*Mn#cw&|=c z^O=vgj}NbrJ`cCoW%Duui`MrhD&-^ER{g_Chn3ZW|Lkx8Kdj>p2VtG8 zfDeg2R2TV;?)mxSYc#feWs$=*t>I0`XL<0r9n?@j0}+|3NTd?!;U=|@MEaLjfzw9~ zHt}?n58T3)I%K!MoB0u)ucR=GvY{wHzgAJiaN^t0-*7DLZ$~t0%36bi_CT`)hWz)J z3P2M=gsCrj$=+=O_}Px7_U@y3bU2jY0k+LVF{3p&*D7=2$1%QHm|U1eoP8aBuR;Gf ztQGW*AK!VzyS^O&wGB)w#e7ZL|a|%J|2g|a_)AD zR#r^gD?RQObZ|}f74(V`Vms;WHTX+juAaMlEQcLo8xXeyQwiBaou?SQ8KAp9E}e`B zMK|Wz%m~Tky952Kt#*8*NvA?mxFTjk2p=G8ntFyP8?8Plk)YL{N@~er|M+ML z*03NqsiTA=ImZ9UWel2JGw#NW%r4Srt(DyY6k7~^4mGUn!)LvGN8tC@GTYzCfkkP1 zbZM{INbMn+*Rc`3iV;a9K1|xy0nYDtWrEs7eW}el*q5|i41+bjuSjSw#S<&APjinL zK0lq1X7fmFai;1OJ*;A&NPTM}PSAp=xlg&L9#B_ z_s7F8d6x=6Zh?I1P!*i%N92BBYM?c(*l|ZO5d&3^0})k3q9A(GVz@9q1^kmgC?cMO zaG5F*4nvtE3ns0~_P!UR|5%phZ{h)6qvk5bHv3oqCjzM!-)0q3E>+7MmOcaT=32Y| z9VcM-!}t4iJeep4vTd0hAz(I8+ggy&nHeC~8B^O0`M}OrncIhEj-TNLr(2Rf`%SX{ z=umGEOK`Is|M}wzoOf5(y1H=yZR#T0Zo3kRIt(93Lyth*EOEka6is`bN(vPT0@Y_v zS}Ne#T#mDZt-N06g28VYf9a3`@l?^?VLsz32kLl+`sy;d>1JU@us*e;1EVMW`98RyDCKT zIjVdeiwA<#2v!NLv!}l7PQL1ROx;DG@m`NKH!U&GED?>cMn1O`V2Lpb1uofa;m(Xf zjc%mSC^8+T!*KD(Do?_c|CbHi6!5eieIfU}QjH_}(9trqx8Pa$TYb$>#;QpHK9C^w zfk(l*3V$ln7~2*ny5}_H6W{RSwPJ&OH6JqS;QdGKLq!54^k`->*(G7EicXQLDpH(y zTg3oKlCp9GF+y>l@d@4W$vXbuW3T(~ zJ7yxD09dL|df(3}`IG35JGk`H$0GZJ{_->V__=`etuAF1s(ZQ44dD)642_(vx;S)+ zM@VB0=H5KFDc28#PgYQ4V0}*YTBAg4QvuxEUwn&yX3Ih$M-kMR6nxf;912>R?(6LO z9B4iw7!b}s+WmhTE>*UFP@neynI;0zawKiuj?LAcE4~@vxOqJ{S)vN8{iU9i%m+95 zojJh);eSd8Cz|NuN~?S?_i_^gVi+FsM2cnnI}t_Z*p9|~Ze{Cl0*&5UZdF1P9D2_4 z$+^z#z9U2ZVDvw02VdqGwt6a{*(E}kqzD&+1J;b)hD0GW^xl=f7+jA)W8dGbHc~)r z>Nz~o|NFh>r~PkC0~ae}b+SH*+dL1;k)iRbnvgKe*T%qS@7H_Svj4=&D8=|XQrfim zJ*p3=;M2`Da{H%?xE;8{%Y))iAzHaCVa#Y#!|SyKKv*-iJ{tpLTwPRYc`R5FF}d3; zaW1yI%|0wf9KSek4N0apHIQ|wMky1NnI$w2G~u?YA`4CI)ev!*HO`{7sbDa(;$lLI zCt$qUBg}XCcqy?JRGSynJmJpAicI|JUe`1;CwmIMs}F*nhkI`BWnqkva(@x&l6T(9 z=K0KAXfkdR)iSsaJq~@zzz_w|RJ^KCErN4_T|?v4lVI{kxVMDbj13C1Jjmkm$JowK zgytIRK#Aq-0~l<6?m+l8Fm>#O-!#z5bl`#VZk4Z~jj0Yqhb;751v=z%-vP6{lb(YQ z`STXiRG~=ZV%As{ieU?>MBXGU?OuF!57lE}EDF(*7z6TgYSw>e!qK`NX6Iwk+=@|+ z=DOme8n4Am5K=2!TYv2k4J{0WT@iP|Pgl73)eichouAM1JOe}_MI`F#$Y19ewKivA z3D#s{b?~z}3*5^+OKt6lfvoF`bzdA|Q+g>(yEH$nFlJb};Apft1CZ$Z%!-6*DpfIy z{#s;4F+(OM&a3%P6=m#vmQRWlV!ih->fBeDxov0y(?MR0E0ppp@6dy6A-~c0@Mgrb zqMGRpk@VkudR(5AhUtDEiJ#W>+MMqDzMsa@&l`M(SP?K*+f3MvLoYm=d&DsO;W7n0 z*JmDrMhD)8SVQg9iqlgu4Q@}6OU$fQ_#H*!)3o29wY2EcvU{>ix)z6HOF#Cum0dEs zK&waE*51hpH9nw-Stgdb;OhQV2iZq{QVL z=qB9y_?D9aiy@Tc)DOJuHVT4*jT4makU$W$McDy(5KYO}#YxV>u>-G@F-UyTdmGfm zS-|4j3UsCd%C+dn;*tA?Ud?w_gfa9~_l%6o_TPavu8-E0(xe=+vnfRZZs-aH4`IrV zDp=!-E?wGK%9o`Q+;PyO#Kn-%+m+M}*l8mlOQ8mf4xV$1&%{c9KU6Fs zCGeLt^9nny&eT4k76g1t#4x7d(I&ZeNPT4sCTGT;oDP7RXH*?~l2g|b3(u0Ltu-kLLj2(tA*PS)>bbaso??o*RkEk6woJD z=z_J`Gi4L)@`5NQuQH=VG=t=Twu$!vX26dCMi0z$7f5Z0+}3?K4mCU^0y$8gRX4>c zpRgJZ|0g+wW82l>O|t*Dqd`N;VKa{{OE{C742~U!Y)2=gU*j+>oIFz@lQX9MuaiCK zJCqxAgYsi1M_pMARCyrf6(h5?Ll=x4?vSea<*X8c1p#71lP%WxP)eE7NyhjP=|8Z1 zWm6rH2%766uqjsJ3mbHt58d|ew#`aXamDrSnP1+mTQkkK_n9zdgtol!ypV^H3bm0fRh$IeF3q;+9 z#a3H>f*Di!T)IGcDfvT(q0B5GFL;eGn;z0>rDapnDhr+qi(qmDX2t!a$33XrPFr10 zA;a}W`){I$pYWz}ybf#f6e@xtNbK*q#5o|BUd*dE8`ThJyNRgvHX~lAAnI9IcpbuY zUbeZbll?)Vhr%4Matn8or_R708l@2+B%``hH#d4IPFR3}nP2%{t&u+xo*T|p#dUb` zCuDT6_Wtnn1~ zZCv`5>WbO?0xS4O3=c25f+6TPeFP5Ynz49-U zO&eMPDl0uUg5lfBi~oTT%0v_n-`>pF)o=EDeHncWUY{J%%80h$d4&ynaALm%xCeVM zy?p^qU0*(mL2^*BhWBbW+Rv)|uJf)9d5q~lF4kNd$#)N4e=y(;5sUGV-_?$>!FB$S z-3!xIX(BBOXQb6VG1-WSh_Vp{Ahw@VS%xVd2i56r9u~YQyr>B|o z`maf+cf1sCY-6~~C4wT6@$f<1<&K9e^AGJqKYR!X&?!OMhy%YmUvCJA|@P& z>7v9z(KVHV!D3?*xnt=}JP#jV4-jDB!#Yge*VHXFWyV=>d2xY{kMFD{|E(l8Qza4! zc)v409bDedIdPuF-1i{$x1S4YR(GC{ip| zzCwlKR;b-dxe#vySBmzGfd>z|C9&!?RJbvn8L43A1o_VzALoJDFpLGvSb81TluJXL zIU~QjIg*rt5CG0NJkXk(rZ(9iAyWc_KIz|zB^ng=YXLEizI&SRrz`>uHc4LtwRvA# zwVPXCL$#}6V9sd2RR9?TGp#t z3^gC`#1iTpV}h?@-8I#D;e*8Q09cDS>`VI$QT~9ZmtkKb)Os8mCtNEXe(T-tAE`4C z9{NDawZKX*0?>adigRsRt;sW`Vx2bE_1T?f^LA`*;ccl{V^Uc7yp!WRWqa%Al{hsh{)&nbbjM%qqQ*0+ZA&68dYe&RHtp*nBM>?VI>Dd{-n| zlRqqp@f}3#Cm(GUGPf+zTDBG-+FI$86qQx>C1m6}q2FMd^9a4T`Nm1c8r*sCOI5Jt zjM`vaoH(%5-3Ub+&5);bc$6;cs_Ef>Wo3G7QgeBObuEVPvXf9RHF4sIE>i!h)jUtz zQ5VlRr=FJykr+MX3I3V2;%X2rVR8?f$(Ep=jXK8ZT>{!guYNCU^xK7&3XCO+SpzZK zwYOebyDNEh_YvQ5)}0Eg;_i@#eB?B~7Pfu7*##qq(P>B~oH+@GHtTlzT&Fv~{&;FJ<<(yBIbFn=5L2R0o4&1Labj6B znLJ>(|Mu-1iHQH_JK%QFY8HS=L|A~JrIw(xYXl1@1CAGXg(M=8_H^4 zi(@{FKVPXc=tZ3ii5|+koF5##+S_x?Vj>dg!3yX45GJ~~rZ^?W8&N^O3)Mt9@VwlW z%|;la{u6<-=P)D)j#1V1`Q)`z^e%%P_8nhEfF$c$uf42g3b?(*TdDK$8-|gX8*F=i z>Z;qwmWS>l((nI#{+iz5;pG+N6X4_FEk^5>%)LuHKRLPo_&Bc=c^nXf3acibgt$M4 z_PFOQw5!wnv?V;eFVv?=Y{E!|#Y1tDkttA){yQw{1Xj=bGzzkt*hYQZp8w@AM`IQR zWTU64OIt1Gd$Z-ox`Dvv#o;x-B*iu;7gVU_q%N8@ZiAvUCm5D`JY6k0)OW(e_3XWVVA57gAKww ze2+Wb@fZ&v(QDU&6%Z@6&+kFw=ZQ(ZuQ05NQSdF`uU|n z9=xAY_nF<)^jWa^`&5;YE*}BJqSjrk90HFbq3#LHg^#eV`hv6;z4;q&4wk_G+!2Cw z|Br>inhVi*{RmQ3B?1wOT*v*(1abNP?F>+`PRD&9m&oesj^i)wT4I zIi4bX3-EMg%Du7=Fs>2nPe41~Vd1u{mtNu9K>Bq01S9k1RKD@>6(=lyOSF!e@z$mF z)KdjG9F$vYB}_t$-;|ls*lW&&JR!RjXpR!xq86s#GIF3y+&oycX>v~)9XHo3#;ah# zsuW|@H=?&fOrpo_ursnn6)OJYtc0wW6(pE*k9(SL|I6Al5`^u=v}S{LNcAsmZqo+Z z1~QXz6wQ3#msC*}-akCIR^lzPMPNclKCil+*HCy?Izk_BSCWJlikiJc4t!MSLr6tp zF+WnWy!~aBJ*>S=$6c#q7nIb#dEJn50@U_2%}<76OCmx~r2O-9zU?IjbAz`!;HvESajH^=*Y8M4kUEjfe#n?iZb6HXq#eaL?wHCzLpIkC&sCBgFE5biruQ?Wb|;>m^o9pRyPrY*>+9@>y4&jr=jLau?r*8#a#Y(p>tt6s z=O>;2go4B*iEN$L4XP@#<&FF-r8WZbcP*eoNeoWH`Z!^-d?-Wr|G3{VgqF85r@ls%@qkex{Hb= zL(Kmr6Xe~t*85NU-!BNgRqQu2|ASbR#{PZK1!y}bVNoe5Mm43OUL(6Ov3`54Wl2Z#>HWo*6oH+&M9v+08L^h z+8)}>9n+nnzVr~@(I4=#(^mwsY>RM|=u;h$OmLJVUE?M)iEXWw>&~CBzZeArk-AEE zoEO}%`7QdUXQ@4z@TZ*eiJBw{lGgNLs%shD?QUszlBT#NV_&p}v^>*@r46eroj*%o zYg%zNY}mo9OVp!8h!uq^N70j_(7pl2Ml_)rdYO=S}vdiXv((Ub#+)J1jK z^jDGgfMIZ!KYZC-`y-@Je6di}MEqi?ajPro)ohc_$1>#6-fWHU-~f-(LbPpe+lvFMof z*Or~{NSwhIQ*;NMa*`t4*2VRe^~bSmW2w&0#u|ljjZs>D{dg#RW$zyewV#vvy`E;G zzq6d34Og>;C74(HU+=6>CgmhV#7*%deD%~wBTt8#<^eN!1uG`vh5l=+Jsi;|iDM}u z*$}yoH?@<+FH0NkPDX3Z`gACZ`{f(FPyQR>Q({?6A4m8~%z5s}#mD>#%FZl&Qsa;A zTBUl-w~$}U-O7Ahbc2wN2rDQ(Q6?(zPK+sN`%Xll5vM+4sZPzs8_R{@S)Z*#N~C#` zw!a2WpAXijglzQ%i==;=0H|f#+UhTe^f!b$7FsS{I}uByyFS1TI*xjuw*zl>Kb^T_ z4y>8;DP@+^m+mWO`+%3%R~LreP0f+?YMr`&3tBZ~g4}(bR_;HX{0@wSd|r0P;;VhT zfg5^!fe#gdcNIJD$1_(m)%CqTCo|Pn&CUHUGwo>=DvZuYlh)imPY(??*{>mYLUOXo zgoK2B&)dE%dHVc+?~85L_l%|cKW6Uo^71a}e0@!yAs>+a(9x`!3R5v1ERNr`Yb>3i zjQzpUgIE{|zuR!FOtj`02xja+y{nIu`{yDL5q#Tv9T9m#DbfgWUX= z#B9W&Z~LX1HYvl>j=!XlM_omjY6xmv>myx*P0CYqw|HR6d)Fn5FBFxP{t967O}~JW z+94lX*9r|nMh{C0_NC5MMH7zlq&bA0PWB*iI6x6C$rTuNwn!LOah6xcgd`}!hKEtn zUIiBGC1qLjs&iF8);xfV`aCFtHZAD96yYXlWFkKeRQuc`hOow?opSgKPrEa-%p@;a zb!#ut47tpjb(+OwP)o9EsCkbVK*_tIGDk9c!StH0yi@0yrZ%7d%D9uRu^sgDI7sS#u?6mb@=_XXv1BH3bfD^zFeTcb1&T<2cd5bY>s&On9)M?_^yVW+Hh1_^(gn?J20nVdv27^Rz*`w^b(EbLMh+xppmeZtN z6X~ybmlbT5S=cLK9@{SwX-wM*MIx)-%NoEmm& z^vVzx4;w8(HsxYNG<<2L0u=kTaA|9olQCFGa$1>*AuE?T4X3kU zd-pjfgq8tgIt(j%PDwmyIFx54g-Fkr(N62^J~uqln?L%y^Tlf&)S?oUU>`%yN8T*y z(wpWWUzWG+DZtTJFV6b)dkgC`hk1CI>k1zGyDD7FTMQON^Di-97k#~qj!fF z%q9AVuDyajKGKnh!_Ju$?tz&1kG|ipbHUeZ!FMe9d$bqyI$F|#0c*GL_w@684n_Lf zuKz2#M~>E2u8Sq1IF*oBy?Bs!E4v*P*rYc^RYaOm}uB} zfA@7r^f^3Xer8i&s{n}f?z8nqJ_2rcU;E!)wnOS<*SmoZ= z@d|eZ{+wHWzBS4LS?wvZuyu|a=dw=IbRC6q_ab@FAO-4$+=ANl?_bSR8hUeR4k`33 zDjC!Y8&+x6n4>JMW8<+dNhYd|FjYHwJdsU%<0x3;AJou%bj4-oi)%XBmt|pL)B7kg$dN=w8dbtroCgukhkK2jhq%%9*USzp1r^YwBs;#F)r2 zQv=cw#PR7&MKVsFdO#blnW6)t;XzrN2q}p!n|lDOZs~M)-VnOWvqOQ{&Q}ECbqgc* z{^}?U8eT6k3=pNicke{vRh@lWJx9Z_#j)`Kq!6^w8oTqlQ{7MSI^aBY>X<%zg8zca zb`({?%3QRuUu*Bh+E~jqiZ8PokY&%J@V(@WoIgbt#kK4vo1^5!<$D^B$AbOtqyQ)64$N)V0lpggrU7u z19bhfiA2*h2IHG#>z9wsBc6b(P$o`%UP(2w5;-F0?0W;gBL>=H%dj|dp zP8)HiJPTjZJR4<+vI{xHC0oaaK>6;4rv*O3EWNDGL2rG%qPviB3H5HEVO!b2pumB4bSGI7mL9SnrH1-dSDA=nW1hzUrTF|K&j| ze8#wYMs5=`{f#||pJe)%%v!QumFA2cSek~^Jlzp{aySfaz*BDnUg)s;^**q*`+&)1 zQ(okvMVCU-L}cO9(9HXyFIzn2z%~fsIMI$;RN9i&9(oZ>Nthq=jEYec_IksgA{-DO zSeQiv)cS7rVh&A(Q`B#DXI4rDekXi8udz-6&5qOw&nmQB_}d*G2W1&f{hyO|I+Al! zU~&nF3a0q}jM&F@#tHW#eXlAy9^#>+F3@P0zZI2cKQF$&v$W8`9GH(kB{nv8p1!aW z$YA+Rg=nE#z@+d9w-Fb^yYuJW+Iv`a1L@J~j*Te`Kc% z{xE~+Ht*7W6`upse#F$OL79%B5X>M-6#C$63N5#au#HZCl{phHW)#^8LSi|)NuQM} z!#w-ibJLGV(TP5Oq}+jS=vm#+Y{)JHC^)Hgu#}M_uwC^$(y06w*}lE0$yj=DI$ zh$GZwt42XhSuv;yIi`COX6w{iikY)W4&Fv!WkiVyMhk68{%=F!z=yZlF$3}larq)8 zWv?x)XlDKi4N@8O@!{X})=i>Cx8XBO{l|eN*xHn576N)3_5C$mfq2UUzT2wqw@ga73zglMOAPZ3(gt3xtaYFq8=jIVFZ{z z@T{0`7f4!2hD)A(SLxnT%~BNw;)a-uSf%*~1#2h+hWsma;9Y-Ks*jo&t6%s1I(5;# z6^YZ4oj2ww!^b&;L<8L~m%lT!z6g(a8uLeV>%`FG3kg`@h0kC_5a5nNc17I66Ld!N zo(+a2PNAAJ)YG2hBE5wK8R;-dy}{RLUDFv5{v}`-5kHQY1a_zbu;;!N1*YJmayF4e z3K?$vgkom-{h!RZ^I|)x3Z1ljEQ}T@IbF7z6?O_0gKr0hl{EdhmMK4bh9L-W)4sjV zQ?&b=-07gsg6(o44R|Fh(wJ>$3eKknS1?lprq6$KvSw@n zPxEY1S8Bk>vmN{^hnJmfzQ`X+*i?4Q)20IDvDa(NkO*U&9vd!dE|~tsFRxU2aFIfN zsyL}d-RsMQvNRMwjQ?~lSoupu4apW0QFT{xOAMdDoViwXk3Hjx$*b4CUNWp_1G8nc zu^YwNMoqy&K>M(~X=gW}}O&Cn8^96h*3r&1kDNxA@sqvwLQCLbi zj-Tv}2;+Fo_ZU_r){aCPDnwMHPi7InfZu`YzW3MJe$UJD7@CL$;@IXS{7YRSdycpr*+Rl%xJ}(;PWARJoO+zmfU`T>Fu`w#AD2MRsDaVqeJmlBccK@DRhgY5Uj0+n zsXv)SoF*0w=2Ar7&e*y$Kge3GoWWxNqM{c0wswnubG&!u<49U-N6Sjs&m+Rc56^HPCQyYzRa~a_o@Taz~gcWUD0}$O&CxzL`R7%dLOl1mHb1qDFs1 zrm_xf-Hsr(m`r9z>1d#H&M;qF6hWh*YRJv;%?KkL*?DPhI&6dB%(c!P2xlTJ{mCxm zw6J21y)Yf6*pcmy-n~Cn9;uc{9g2!55BcVHKR$&itUETgC9q@J6OfZk4F|@9V-{&L zs(#a&ESTh__DIN-hebxLrDN5y@i{g~@D0^*f14}_3SHib8f;K-lbP46NiszQMKktC;bMdXm~xs{TT2o18^l;3qV%dzDlqTl<%m| zn;Yjc=cX`S6~GYud`q43#K4h7*MmJrvmdSeS1ppUv`G!%+v`M zM35>m_WCmZTK_>oeE;}%TLJ|hQ^5b?oEc9Oj*2FMC!tJAF0EU4szREHD}iDZCRfgq z-p8GViHgBKNQmiUI3SiVX9<{}M5aGg3Y0vR2x(F8Sx3pv#mYv71QK?E)g(EBO%`LFH!>MXyeRPLj;x=zGn^zT7MWpMoLC~ z)KI#C_XbA6j46T=loMeJaeH!sE8j&nguvSBs7(p}XaNblHrAt+dv^4Hzv18V{oCXD zeufzc!fS6>npr3lTqzR|%fX!HO5m^{Z}AGvg3zGi!8n36cBtOfbd+#gNObrciV3*5 zKeCYRYpor2D!jedn#={NJtMK`vMZYp`dAvDx3 z@cObn@aS^(WQ^bM>7wB4{_AY`S+J+89V;B=BL13zD{`;Z|vYpu&RWt$>`4+kS2wbj<60HjclxSDUAY%CIUFlOC_C@QW(=*Dqa`#-D zNe2#Wf8_C1!fGZ(XDq>qb+gl58PctSo>WLXv470Pb~hpPhW@r$E7S`@W{nkE+`0jQ zvly03(qx*fx5>_ZWTi9k`b$&Itg;?CiTJ_LsGa2m6-OtL_^7-CUsRh89EDgh$F1O= zF5XyR?ft8RrsaQz!n^>wzurdcpmxwH4JHr+bG1IYK*cSNmfh}|o^yno*svc0-qrh> zt*U5gLtoYiX(kKxXPy%`qFeJ()qAr%egQrgEZAXH*)7qFa}PZHKUx6b2MC<|Bi;U@ z^|v*4w=Ad730CYUHZ;z{z<7ZV=>O+|uUWpE3<5)5Dj)?hX-h*ryHx0h9{;1HagMK2 z&pEG;pUOEgE!h9Ph=(tgPixegHrr##ol1kH1h_njbr58(GnRdvv8-7icjGn%{`pW6 zEE!r>-$WU9!tF)1dTicbY*HMVg?(RVx8=(9lH#$J&y=GfQbS+FmnZ3y`Dbu;?g~g2 zd7kbCe`Cy@ulVfL?{iW%yH)g+Ur=!J<@$fUM8CJytIR!TD)?a0G~o^UxOHo#Td;^! z2bn~n^WOP3XHOqb!5pRbiqvDAkp_6}8Z9~>L%*ZQChN(Q*@6>`8JhWsPky{ohsAt; zA;N?v_gv&R0UiMdT;#fk>*eJKxB6bmjgQwgZ~U=WTZJ69B1h~AxRBdV=N3L=C(uL);$Pe;24*xymYpbDTVVDyHLRVK zrnuoN)XQU?b5d$rSUISG{}=t4ekmg~dY#nT%Fz(i@eK7~fnW!A5yVPumhMotlK z+&VqIoj6s|`G*j>Yl4mdRl<@4SF$(pdJ*dT-6(P+Vvx4c&9_E8weZ7Kt?ict3gM_& z{_L@YtOU#7pr{k}nq*MP<@5U2eTRVCn&}FrdYJ+)sQyxg=Hw9_?Hcn zOL_P{MoS97axU;U_u!#Qlw=^Z=NqUgU!T@P_-gtOW+1i8_E0DIz00mz?7q+}H>_4k zszJz{L$I(h?gD^2bz%-*u=O5|IE4E2-GH0fhs&S&|0wW!~kR2AhU2;ZyY2Z)?kUVd2A;mq+%24vO_g zL~FSHcf)M{YRb@YhZSc%|D*~uw_BstvQ*y5`&TA5JB1uMG=TCg`~116RPF}-lr3=q zw1VxM-w7`nrgG^%K0>o%vnUiMQdKoAHac1}g8`2LNdRAI9dRzJ8bBUrpR7wd5e?FA z3{$2i@Qiwd)YVMJBE+V$OkUz=W2xb`yw0(FAFC29nR4I7UJd%!Yvs3+9#m{zv5nnP zE(`^etqNzQx#i|L_yzlp@njw{qJ8XoOj%yzd|qN;VOZSM35^CT<`&&K5h;8JUc*U$51 zy8r#S8)H? zZl4cX+H;^lt(ji)bS4ZvIFvRD(|+OQo^7&Ln%!MiRB3?uaK^3#f7=9&%BoRt5pi^mJTc{iwo(;mWB@CjtdC|oKk*+>Qjr{H} z?ECay7l+Z zv7M%uw$p8#FOj5ZnJ7r)Q!<$&@Y6W4EaoDb!I=GAds{EQ&kog0WQ3{1i1f-G&6Z-o10$li%c~Df_GBqe6n~|=7nar_w)*-UNBByf z?OcN`4SvM{%N#*FVTt=d2zz-Hd%8^FP}E$Vxg{=qkCgIsdY<-)vjSzCry!YQ)POD5 zkk&@ianf)qfGVw*q}k<4eda0p+^(}y-74up!1pKlGMrxOGUDZO+Y*>DLziR7dJ8s; zIiqHw(tIW~VTNT8rL+}UlETQInPuFDAR^>3l6Y@ZHI94SqWmG8N?k`hkE(cFaaxv) zBIX)q-6dhlbvBG%odIUuL_Wv3jy^oCYF-U*rJD(bwc?|)B^k4~*$H4KatTeg^;~eJ zXz-J@cFW^DoLZKI4BZ`Dtfw6pal}~?o`29a+e!PUMdLayN%+5|RC`be0rF(e3c8M& zML1~twY4+zUT)po`jzvlQn1NP>egBY^Ds%UN!59LpI`a+g^DLGwq>-Vw`3}5(s^M; zy`CEpD7;TJ^A@;Qmt&<6Kle$Atd2uT>##=NWHC{jZHyr!*r2*f^2+Jbrj`n6i`rlM zjQbgs3+HFMUwZCkrQiFA2QAa3iN(!xG*SE+%8&~vLECcgh&#If@D-!Q!eXyZusC1E zXrld~1x=cKhAu5i?+`gtz)0P?F}aa5IuF4(EsX(fSxrz)8&ehpzIN<Rs}7$_$BYN^M@P-3p?oXItUNu{x@al&lz& z@)~*3Q3z?t^6`{LpFS2Gxg|7rMl2}M1Y4}qkB1C|-bU&X%u(dFvo7LJv&%lZsNS`> z3QIy`1*Bimmk6m!MzSCT^5K8(0V^whzZd2AX#@`wHlU3fy5ij<1nrulrga}~ z5CVin_Hdshz1#h}zJtYfyo239XI2-hZi|j3O=)OW%$$SF(&f@_oKSYojDR1U%TYao1UF`3ar?B@^B9a0bmO8+a8 z$c|coL%I(|t>9^p>TCLOmZ=tox+&@7U_OiC{li~DJ}=_IE+8mM2c*R|ctAuzL&2&D zWyA*McNx`XE5;QD0U|*{S#d!X^8K3T5MId#pQ439_G3)KiIko=L7Ty-Rfvb33Fh?Z zr?`R~=kc+kW5Wphxk4l<+#8C*%0$e9aIxJIG2&R(3P~C%lBYtCee|GUwn%1|jlB*} zq77&ZDU4pR>8VVmt!OE$LYefONs#jPx}QiVM5~9w7#O47O1diAlp2dKqo&>NY^{H% z8$pCpO9*vns@CP+X)loIb7Jc`U&vQd36|v_A0OZMqI~U&A#jrzFZewhBiq_dRDa|R z^`%^@cBb1Z(cwEVipi%na;4ECgPggyflDkm#B1Ad^dwN?0oPBVQp>VuDD7TGA%5~$ zx7MRhg2==jO}-UhR$4&S4ax z!u@A~_y+7R-Zho%)rDi=9$dlK&9~S08u)4yPkC@_-qp*IXIau%KyD&^;(foYARE#1 z^$B&-tOF|}+HH8`v0;2q&Yc(5{au##G-4hoJ}dWYEcK5*J?2Ac~Y7554TcaRBJgVM^hS(xV`+BT8vRViUQ@VtPIu?#yCiX+1RRmu~vM|Nuu z7~CjhnNfu@km-l!e|JMtmoI7mMY;(YuQ4DO!>yQAPw{REU7Kp^A(!x0&2K8F!!zE;#+7%KRxXG;D zUmnwa#EUTF?92(LoBnQF>DfP7t*>90(axMI-5)&&R_{22n&VcUiJqVF;E^R9M|3p7 zm!cw65JB{!VqB1wpqnLZc#gNPC)~PE^A)D^t2h zH5^MtvX~W;H=Sq!Yo=onVnOtz#_nVi@yC3t+b!_0pvE4KZ@uhoR|*+N627e5I<+zS z$Kk~{UUtTjdd0<^dPOe-(QuE6@nMJD^ZU(dl^h~cWoS9#xf0f?r^um@CYifUx0zhF!7Vl%xtu3Kd5{gD9v1DZ2$=BHFZRWb5(*QGHhaen1T= znS*d!%`Yj?6NaiU!b#b%j%RG{3&jANW2e=GWdYO@H*x?(|S7-{(6b zP?A)Qz=5O?gU%JR{f>%tWC3d#TXfL17;rL)F!dm(fd>)f0(Pa9|16s@B}s>SD!RKc zHh-UcvG(quCk0Gf`apPaQfK^_B+kaL#cio36~^2fg*Gxk1TDkJjSS8dHCj-6Ieq*> z-8VR#_S2}hkqyQWz?Bh4uXEqmn`s4@0*V(31r*fOD^o4!1K54Y1wYbeOtU1B$9;;1 zSq56HN@e7E(wFY+IoYf#NG{PtkT-iIHuf%SZ-4$$^;zh7Ux=UMf`S4jrM%7MBp5|#8qAJTjD=E!vzg|5jDk)*TqRMIp zXT({XI6y^1LAciD^Luyc)~1l-AVj*mg6pp|bFdN%*6u;iT55&*a_T#f5%c`FpiG8Dl&&GG1zxqyu-S zJSgB~4O@awS?%7d{Db#rGtB<$Asl4*A&a5g;MgA6!7_N5@uxn^;_ZszD|F1fn4@Qp zpmi>5K!KJPX}733D6t2WLm7z9XRlJRMvIbEH(`q{{!E|FFRF;2H{r4P_6EkQ_Zq?`Y_$T{l0%*ztt1qu;rBwF8#w5lB@;TMOt~|WC()8&&7**R6bB(aRn(gW-M)%7u#b| z?{TOOMvWqtfME}7^nFv|t+o6|iCWqKc=t5OO;-rm#Wu(QkUjc!xds%`6&%~0VYC)b zTBN8Si;AGfn7UoLOYqUL-T5U(HHY6TbfVw3VJpzjkAjn>rSu$|%04*6Hr%cs=m6j4 z|HX^%MpMZ5C%YV4WNqgIE`P^}Nf^J+Kabj8B}RZJ;mz^6-~D)AlVx|5ZAV@G?i1@^ zZOlgq;N?@j&zce_{(&? z5~ul3l4I-Y5ZWd>lsTZSd6=!I>1B27@TQi~QQpWGX4jRLEqPM#4aX%+Efom7J98GO zjUCo%8GhX5X;rT)5A<_7h_fmGlbk0z~O>D;8@VP=iH0^vVzh7f*aatLh&C`5~TRKMQ*ycIF# zMwFP@fVeYYEz}1KHYepLd%H90&~5F;a#$%Z3Iw`2UFi23rczY&`*FK_Z!^b0j=V*f z)Ert{b@T(@HVOjcpOoe|YE`}$YNSFZ%opT-?28m0DmvuEEQ1h4Ilh>(_`Y4poPfjB zcz?d%Z0x)tQcxQOez>LFmfCD|CteA41b+E>8gelRa6Dh{^!r|KV|~*D-!ApSgr|ym zh4Q^xoW@O%A?K+rFa4h1@wWTbuUoFp49&m3tVtTrhB_2vsYvHIsw=1@R78qIMn)IQ zpeLCh=c~7~{0!B-DLVNE7jJf^YNU`FaYt^rO1dL$&y^@Fn*Ij>&~D!WtNtWc#N@6g zi+Sw;qQ8YyJAOBLrIzy%+%v*vGxsl#kvEF`bwLp{C~h6uO!|j7n zgC|t%-|KLzm*&%+uqMAlZET=d(iKJD$x_UW9ryC`YK%oaDGG^1Tx~JWBvvhb!VxzF4pw4-V51e4Yq0F_ zA}Gvl%p*9k7k@@SD_&U}YIPEBZyqvCWe+|Qem-?z;qUZQn`9kWo13d?EdCuwxe=ZGwBp_`u)F zB~{Lf5QJYAYICFWBhl1q!_o1bRv0P!kLsKsJ5?=IY-;T8d@u_DI=)R=T3-uBI1@&( zL|NQP?9rK@zNv$B^f=B7-{7tlY- zge_v?t>)LatEuKMekL)(3EXKEkGey_1gG%CMoUymM?Rt{hKL&JEP1v@ki=X~`RZiA z=7n=B)-Oyq#D@m318t9fehbu1)ZikUF;m_!`~^(nYN#*sG+P+4Y_Os^VA^2za*poL z0s;gFALokSP2TlB$8kUFw*F2g@NR-N>@_?b==73{*kY~ z$LHwSp3Fqoro~kY)T+XYC@$YNW=6Xsulr?T; zHXKnl7AG~5Fh9Si{IYi7AVBMeOgwR{3ZQuGAcGUOTyYvJ=EO?ON@V>+6{M{zL}F4i z0N24#Ac&`0V9ciMvfGVoa4Q;l)Z6u=<3Z9Fc<@oJXld|R^^da@O3Z~PM#?S}0wQS@-p;2Ej#b_WeEc;xjV_ikw?A%lom2B;ik*`%@hmwr0E<7 z$Xm)?+-`S_=3!#2jcZGqv5OnPt<DJwDJd98n?j*zyrnpjD>EyCdR)JS z8k&?U&qf+Cd}Qe0QZ?{ogeG?;pWjE`WhoR2X{zb-E~8&wpQWf?=&eMk&-a;;g^k{6 zNTdV#3OeoB zKNhlyG#Y1!b26J^eg#3bqqUUMR9qcaRp5}XkV@@weHK3zeu_&ynxD||HU+aKiiS6Y z4Pew1WlCCN7-b`0`Z+Le7!iPY7ONmXUz#I>uCr)))9g?HXH2N*r#aOOiRb%uW6RTL zD6p@DS{arrUGlEhCIm?wyR{7rbLo=X;JQxf^wj6FNFTcSZX;llBLC2FYne=*w0xJ` z)QOaIoNAj%-gn0gpxUyJfZ-A7;GhuAv{49W&$KV93GVCqc&0}_y_$*lih!>(!}ICw z;+U@EcVy+mpRXC3{0=8rWi0w8@!jeI4_jV$NsKvALItsn2mYBao8eA&v{+3U0R1XnOPu~{v8NyIus;_)<|I^FQrpD1hQFWz5 zDQn=#uo$XZS!Gt&dJ-Vr&Uypqh>Ur@dwICoj`ZsP^bLI3gL-ZtVCH$&>%Z00a@<5b z_@#=mVccxf^2?S)tqi{CN52_v~%cr@aVPPNf=o6y{eT20JN&3}27~5IFa4 zK5WkS?Rgr_gqgBEgQb~EGr#s#6E2XXbUvV`hc)8`c0#AeYR2=OiWLz3!Kc-k?g|O$ zmOzse&x*7`MLCckC`iUi31j_{XRBj8==WG{TRbyOB~TNGc0 zFeedi5zUECkh9xnBRlVcocG5;pz|=Yn(n0 z#prreqyije)(**>$51{zc=Y`Ia&!~Lh_zV(HbL>?09Z-pg6Ln5E$o;^ISabEp9}Az zx>0M=*sEm@y_t$#ZFg%)0tOzn$u^YF?YfQje_<;j2MsPv7xVUzP#QuCqyxL2mEyR@saGGSO{zStf;7vk{Z`A zQ2XZrEYkxwh53Lb#+X!s&-8=Pi2qZD`{Bjc%H$;J+0Ts0l|FPJwI@iknTn9f2k|FEW zsHwsP7o*JjTmv@g$G63Q2M!f$#?YkP+?oH?0$K(zkkdzgFU;m2n})hBXf-=pD9L|h z$=Q*av!$&KVaSMPD-ox$Y;2V{3|F73H^!a1E~Mi)rZ$8_+$fp4L$bqlNOCxts2%k4 zjn~C!O&Fx(7Z7+P4B%vPsrAFP7oyu?H{NZDM@6E7Z~CpPo>CZ05z(i{5Y?ecu-|I2 zWaDOSp$^L;k7`rQ>mCR9kV->!2(C)e0vs~cs1Rlj-N_@)8K&(bO<{vHT^j1j*D$PY zXj}hU+k{TLjzb|ST2Vh-0AxS_5c&!L^5h9xV91PtU#8snZR4&>@M;=V^};a5k`{ji zmBR(yCNG(?dUYjFc9NWGJ$2GXRTGaETKM?Rojqh#w6}OWUi|Dm~@jb5;dz|h5C+dfYAPmQ1AY*|4 zP{n;;VRzn^Tfg>az6z-;5qG|Kn>F;iz3z{fpD>7w*3}3E{6F3UZXbWX$(uj)qi?ZY z$RVolxnJLFb8~Y=63-#C8#_F0E+^B=(-`(z7V>#{{C*FIJU6~K-OoF{E+#x1+Zf6C ziEv;91RdPJoOdzj!2u#TlJPgbBV!n8F2-20@kT%)EaZC#`pb{`dP+o<0x!&zpocg559uzj#Sk}Q7pMpkF zril#~%zORkjw!*sbBSConVz+)}-RL#jd+D73*&_2bkq9z&kp)_pV z4bN3++$u~P?IC|161xc51knbH*eODr@i2ltXRY%V8SaOsMz`d=nB?7QHF!REw0uWc z-s+uIhz}L)|4B;z2dMO@@G&H|l<820Jm*^j$+-?L8ZM|i|F+KkaH37kW1a)V-nK3e z3^fA4ims>U|I5W}L55pL6!%gOFp4~irBbDdDd?*VHB5o?lML5?0GNeVpJ>#-!)A%pkjECe{0 zawiw~jPOttVv7z-`vvXv1&7>-QEjP@4RTU0g%Z_U>I`)h0MDq z(l?E`%Y~coyy~eKmlVb*GD6oAlTCGa4@?IBsq0L{R>QI5L2;zZZ{Z8&lez!lZ}xlxFa zX)j~@GQf4z4}`VbqGnfADW08|abRKGM)J4QJ;7C!q4BkTmsy28D(FQovt~~kfuhNcob#>7O?;9+A?i|O(Yn08zgq1$>y50fy(vHC zhpVCUiOg*_Fn*jSp(}PwwHUci$~oJgw_mM4p}+6*o%d(|dyW7;`J#p71&`k6>+t96 z&#}DEF-P7mw~H{JtOeFir~klOuCd)si1_< zLeY6jgXZLBZ+`FUYoWyx@E3whD~!hKa8N8rVZB(CmHqO4+3W8o*n(IOq;zT0ro)Ur z8e2P?HumtbX$9CAXI>PRFCSgnim#R49}V1xM{lAvNv7Zp&4V#W zKfQ*BpXod$KEkTEqv)~1{ncW`LF9BXP3@9ZHF6y5kocuuN_k`rp2X)18x;DD@`sb()Cokf==KdNk=&0T`zZ|@gzm=!g&c`IF-WcW`y&`Gk!RS zKZ2+Z1gcV>@sN)5%%H|X<6f$DeH|EVon*#GDK zN*5?r7zlEBMimBQd@;hrk%k@IDQc;?fy1t*5d&W;=BhhsBPisoE(n5}b@?0+lzX8o zgv_V1?@8(=FnyxQyz7vPNvC8GFS6AkUc08!7&xK%Wfopax-CCAPQJ)zWlpl6 zc}m)hka;?ZEA{#nMa*%(@{RTFIpcB?F$xIbjLj~`NCxEMHTzok=W%WPD=nO;L73}CQTBBabmlM6kg}a_2Wu zJM4r`rFSBGIkV>0s9ez7!=M?5-J$SbQGAj~S#jR*Bnl-^{A&H~nL@m@#i8{$l!~_Y zD*4!`S+?_)c}yH6>zQL%W1Va=GIV7;5K^Rd+B5sfL}0QR;MV&;urybWsopP+sV%Da zEMbo#xSiQ56Tn>fhT!i2C(c~06D1MKUKcLp5i!5qaT=O5?`$(o+Lkn*sX*|$4jPQ* zpu>?+v@Y@W8o}ddHCk1(f||LrBDG+dnaP(uL?_UXcElEPrlzPJuKBKv4XTZ3NiRWC zlekG!WMDf@zS14h5PsTm`)p8mLd`UC31bKR2Bh6Z1(bWdTn=NCV_JY&mf-zgpe)hVJh7;nrTq&)wb2!;jO`m(L&l<$3pu zW@N@;r^oGJeW{RizV*jIwOygfnZ8Tkt%U_Xag>#d%zfNwG4u7J@cr;{>*?gJKX3jY z+!T0_MDns;#UdA50(e z$4-!@7g!wRP>f*8Sug0MUi))5q6_g_7`}-97bX9@vWJ!5%LZl`UY(k)@N(`Wig6RH z`?J4FZfoCckR~3WAbR3L0#Ue|*3_EEX*zmm1N@!j-2@nQ$0S!?^>`2-IpH9*kmez$ z2Sv_0EUnC$Pk7-nmRnT=E$yzn>6cx+993Q_>Y8O71-F>~$)6`VhkEQ=vgXbrt_6Nd zig@)&l)#-Dx0X>o*Y3yDzA=g%qbmP{Vb?yuXW9}2RFl{F$$!HHZ$3C7|2;+jB|j&y z!}0k~bRqAMM(3m@2m$C{xYX{3^qMycX$@v!Kq>7}1KNbHEA^C&w7zRD0z}9|2@QAY zNw^zNK6UvjBhLIL<)`D5US1aB;Q!c1JleR&m(Qb&t(FvdFS3I0UC-zK<(La<5T~ucR?BL1cwBRvYb{(rj1d%( zGdAEV*)8O%vh@t$9*Jnkh03he#6~xR3k$#AwkzwS#dA{hR6GPe)fx{GqhWwIK&#s6 zEu-LOf5D7Qe~m+bA`pIUQi+A?0=m>)K?^&eyD}8nS}fs6Yq1y?ScQ=^WtK_OLW!}a z+f(>c0Nl$iZ{<kgPPxW0Fhw!n2Hca^xEu8zcmwzF~t# zdI4u+jb#@NF-eC%OcaK#j?Y()pW$(W(4V~L=zFkUv-6hP>%pHVWz4dn?eleY!4dGj z5)e`+T&^W5_F_c({N%pleIFYV;@8ugqf+=5wA7E@=c+faT7Dtc$(-ZoViodmhgk%n z*#dZ3m1Ayg(xylpjt-`uxIeY8+!Q2*tLe$s5ZaA^gH>uf%@Q-gD=vJWmd2w>@XKs6 zBS1TPNE=&g2?9~qt72tS0{cS++LDR=v;7bsVFN@(a(Xbdt!Aq;Y)vk-6K+?RD{}hV zDU|l$i#z|+ItkM9t8?mg77Zz#Z35j3Uylb_ja495|GHilA!~HQsrlqH*Ty9uP%6*g zt9I(1)RwWg2H0?W$)H_(o2|$s#vWa>p~1ScMHqneX}4b{^{WX%+H;_IbR)@V;L^^c#8NvD;wudDez zd^3PPyo!(JsK%O!5%0UrC0KScLP3o{1R)OARyrq3c#z072(i!lcKSX@Tei%B3^nvTmZu zWTP8LE-DAU^vS#Z^|oZDey^@j0|S8w@E@`xsE|;7{DpDrQ*efIXpDjLTm&MScsXl5 zcQrd3Z6SCEO7Rh7*)rbGqNPfp#r`+;i}_h*!~OK0ghnaiC$)dzQ+`mn*f)`#{mmKsE3`t~rV z3!_Er&pzd`$|DQ|8S&WGZjYFe|w4ULEw{t%Pz@Wb1n2l-~U$&2w>M%ewduS z+7Q?s2Z55ECAZDnW|_e-;;!pgoGqKtHGU5K{=;mwYGx!6|Ei7=cZzVHi!6aq%QDXe zXLDq2+NKupzuV^@+uCh-z$lg`yC_h|O0Yz;YXKipe zTiRcZbCs~&aUt011VoB;lUM8GwCI_T%PFI(5FLPtl|YbWd~WjC%OLjI(wU_Mcv(T6 zYo`**$(00BVr7g%8XOB!9u;bZVlC&Z^`)FKv?CYR0n!MQHXLw%ZTH_~lY-S6+2qkn z)N%VcHTY3>5i4175QX%@G%b*W90Jen3u|j$^$(znqg!3>et4qqJR86v%yPWdCkvfO zMRnZ*PHZ6v^!hj-9n_X%j~lLfi7}LT$1rAE(b6A>L1aPIAc4(pk!TRb^H1_4!Y$=> zwCL1#DJ0XZaXTuXgbJ77V34nul>51VJfeZWg(Qn;PkWG&r7aU0+50wR+brv}Q5Nf9 z?+L$Pmbb=2UV~2?!o!bE5tQ<}BYT?Vs-k2Fpl22%TnjABLV3`#!wKQ(+DlN^aAvdn zECjzU_n;LF4`q4Zg0oxy2#(Ww6%-99QQR2&tB$HaJ+x11puMlpwQO-CjRgwItX1E; z$BrP?VTfH|pt#nZI^7oiB>_4o0KZSMDoDU_i_=Flhfo89Pph{c-j3iDtQN)K$6%t% z4NIV%;yBD~80u_RD954@nY&*@Zkx)XVTbMjs1Hcpx*nUT3JA?Ah7nYo`^ln|RFL!N zD*<6l%P)P%#shH zeUhppB?6$l!)#r)q=E(7aPAvA0V`8~rRpFf+zjf=%q@#~!LOq)&;gTN;oQ)4C#3G= z#IHo-HQ7lNY(GU5KdOthQb$1AW43Fi?vcV?0!`Yzh&ZgbCa#!ga+JZczWsw6B&CJ% z6+U-@iYD1EuM72$D>as~bV(r+P+!Jp>U+Qds|&%5Ng_qt;@NQxVjB!1m`4ymW4@ey z;E`8zR6}bXt)gexNCu~lw@Ot(sWdC&Kk>bmDV%bPKEbh`T}CgO4Tsy}>^)Drzjs;x zV>w4pX>lmM{hP(^LWba{Jh2Vw95j7{t%0)s6A=O;j}!h0edovW$P6z9wfxMIqR6(Y zfv;_L&y?%*gt!;13kMZ%LrT%{mZa=Y^_w|)c4u;R7fVaCm8!eHRh&3{LMz-uA^*3evbQ2GF zA1I611D1|cfhw{A*Sv{f+-nr`8|VzYqjJ0J%AO0f^Nzpxvu@5PJ!0rYfpQ0L`Ltrh zL!81Nn37>HOIeac!Um3}LYvwxYFlhQ_QV1WxkS{SzCb+OOooIA zN%2tj>?0GE6WZyT)|Qr19i28gF!SacC_y#)$&ZZbon&v10E@0xJvTZgJ+y!E9xV$o zyxo_YV2(hN6L=-~AJt`Xoo=O;;d_cUmua8EMl(BvU;5!@8{{uK5Wt4VIU&LJ)pkV1fJPXmAAi3;UHKR(Qm&&l~V5w01p<9gHPCudxw2cLjIz{d-dU#Bkp z4~(;I`rbwZ@o!PVrPudFW{032?-ncW5TAlOxzH&~Z1n=ARoc;5(Lr2kuHOnJ_QS(k z<3X~?mCu@?;Hd{A*6jUHjdRaqO)plwgjE*0n2<#F^<@ftc2HG|UDWyO-CPLdFaKNM z9`nXEQ)Z@Y2tv=Hzs7b*6#cI081W_1TWgJ0$CAeJa?_V$B6SmqSjLZhzxpN>Y4`J@q^=a}L=2GE0AJ zsiP<{OBUDvd$sf(_rtuKp`ww4oFs0hw`>)5^4A~lT6A^9qUx?QH(bN%tt8oi2WjSe zpir4HyUn*u40BF^A ztsNVN>E!!V!D8TbKQq|2gxQ`lZW(b^}=S+WPj6qVovt%TM_NdKfZX zT1-V&sap~guqXUmK7dlh0IlW*QA8lCoC+Kg-&8EZzXl2xVt&F`)ih0;8=QjJLB>%b z5QObMp0Ri_3aT{7fhFFOr4X!-k(n6y*J-=I*xVo}l6wL$@t3xmoA}TJ<2f}8Ghc+@VB;PPYSZX(_{b;BIZ{(4**ot7% zn21qs9(GZEvBdi_xp_{U(+;{yfTM~x7hWnL`sd}BO#EIB8b_+_yMMo zIH3#h{TjA{ZeP*Gpfc(?+F zWP;lGvjh0F#IYgO@1Cqmw>_5!EwS_bo&Ux4vL3~6h8kg&T52s(%uE4eYp&f++wY=s zJFncx&~3$?%(WlMQaoa(tvKJM3uzmti@uZ0C6xn36tIJ-08fOluS;3{*fCxO>*H^G zTxQ(dH|6WSf>OWMe%2lFh=`i7#)5)p$;$TRQviTny(Q8y={OXtkk0m}j$< z4DkaA12V!)kyg-Z@8Vm*1+QS(@907FVC#%k2Vd8-@smWujyRcj_gs zE!(qEVmM*Dv}6NaX_QK{LH|W2%E6 z&uHtDd#i`X&znNj^|pVh`^fn2B;YGO_oVyl?}Y}!6aL%=t_HM|5-{OrEO<2rIZmj4 zFoN|Kw4Php3_|Zu@!d+tLNetoh_rY2{q{3rJc2~g-1V1!R%y|kqlbqDf1cj~Vz2-G za?MtE_p2?!{OUp|ND8dwJbYw4CSg%es&%RrG7gvnc z4O}4m+6H!Ce5Wtf&b-qjNWWfPkJe8wxM=QD^l^E;qNPfq9f@US*z~y0v8OY1N@ZRr z4xT?yj{Ul31~Q=U*N}cT&`+N_yu>D2^jnP7F+9t(rIc~+AIR{ny>=@XUQ)2>vyckr zFM+vMA%6e37NgS~hw*Lq**#~9gdV*T zW?i!hD3s;KM2pk*Y_`H52S57afl48%a8pnRd*lwv-v#JDdw{=xIWwRx^OO|}W8LSv z(`EBJ01W`hNP+d3E~JfC%pB5&fMUI1+%pwG#4GFnME5M5kO;Fyb6H~W!kLZ0X)#XE zu-HBSj>F_lp?_QCV^>z>f{N;;r*JbKKMoamsZaxSU%s|I&! z|9c~ouag0RyCSsY%qsmYV+8elRfsZMcALhj_7~z5^9uD)ei)(vlvfCSKdo}X?jpQE z3iM6K8*vN0IpX(JQzTr7_ywiG+lq)8=V5GnW{U~3!jx%?+2SGzi|TzLtZE0l)mh~n z9x3qKKhlj?N*Lum$0FK(+^fBrD&a*N57Na|7=!v5hP{~bl|kzQ{(*!ekuyPiu;nX&neERNr=mq<21S%SAU$8^U~~zK#q)rFKUca~ zk(tq=@p><^liANt!?Zv$gq}EGUE1DSgOGO3A$_T47mHX|@_f|p?EC^-fm=Up2PQ>^ zA{xZt$MkdRHg?y7A9H7&QA8+yl9JF8?b4Ym6BTl>iU2{38_75nVy0WfhqeNm1)O5= z;LZ~z)6(xSHznRlufkI%SqP!px^wA30GN5@G|rktH+3TX`#cn9MN)XKF8TwY8%e# zO!T{1mT9F~NEJ&wc^#WmT3{{exAd`iU(ztx+S)48T3_4l_Pc*FWri1~aFYmsaDR5+ z_C83%g8r`-a1TFFZ_h__T%Ui9`rgloZyP_2adKazl8`1XM_#nmUGw=#1F3-!JWHbc z>F}u#5Po~*>#x6bm0UJsC4!9*mLk1MAa~Hp|82_L{eBCq_kBPy^ZfMmgAXoQSh%N* zN+LC@v7=o<@(Ejc)h@{_zR;c~I_&JW*yCG%JfB&uIu)>%MtD$TI4wQq8E*c>FM~TO z3lGFsyQl}v3N%mBJ@!_ceN^|NqQ^44FvPsyNFl$E#3Qh<1am~_&inh?9v8*AI5>pS zT;WA`k_yH^=dYa!_{9MQv?8aNRwR0Za4^Rha}byZMnU#ipAA~`+|WQ){lp0B7Cjx2 zQ}5yS2Y|2JEdw$KDyFb*Z1#&l_>NChn5baO%)*BPZ^M;PqQ2CZI$GvY} z%`y|fR$kr*#4qc$r(Xh)JgY))Fgy&JqI=c`1ToVb4#>!_^$;pl_ILoM<~CKt22yFM z>TejFZs*i$abw|L{cVw7z)OyTd#$~dOO@S;*DxmChSua3-zn-7EQ8<=^FO}+M$QP@ zsXz88DDPw_r@W6yWg5?W&T7Hx&2(T}IULDP9uTMlgx0x^vC@YK+r{e&Q2)F-$pZ24olxJ7U-+H&-RDqFc4 z_`(PUvDS>rqUb51UO8%hy%G!%Yq(v44}pOZo8Oy6*#n*Z#2{xUG~~1MXIjKJH7A<8 zWc_R;(C*=6$SZj+MnPl^P9jG^um34p=%}T+_2Nkl@R|F=Cc}XULYzxDjVqh{eTc0= z3qW<+To%P>4c*~^*o7M8wiCH1*vnv)uP4P>Qgnn126o=C#Y1}=ut5iIt2`#u>Ifvb z*XopZSUEecV8j4DQsf>G5KyMN70B;Are~ptEPLczGCK2{ zp22&B2a-yNN2=Xl3Nh9*j<#`nP<=D1Wu0bN8roJ#!4l6G2%7fIgfo@eb&1uaN5GEA zUq(|_tGl;_1_Wx~`1qLtD1|#iCKE%^MN(8h}1ROffWzyY_gJg3z7S0DVb3z zc}&YzUe~159a0_IM<}_+E|w3PuF)aQUFykBBNZ0=K3N zeblC<{bQDd=lm4h4p$5W(07Um4DV4FM#9LGc=rPA&kIXML49mHr=X8|f_19fw>VOY z(EJAS{smSpbHajT$QNCcGPt2gpTIn?h-`%#PH-y|KMrFkHBj9>=?5+wKTGxJ+UYI{ z>X6%JRyF(iZ|BfZvGt#FK#rXM4@7p*$eA@w8?%LQ#hReavycT#r9#m25SYN} z>LQOLYr zqx~22Z*)vqPHd<}=!%x`D9%@5Qluz7JA|?z745W8v#_4`GbQP`63g<1zwQTGa~yn= zm!eO#nv77h+W=XEgY)%wx8lw3Ve(Xc^$__ zCNvYlR;@hb`l32q4^@aC$~!kQ5Sy%sq@WE1azALN#U>O?Z%NAL3the>f_D>_`lwqY=aS& zNML_N(~D6z(~pQY12b#f!Uh$Y9boJAtA;Z(HKqnCNuO%vh71iMp{XI}@)6W1Ddni* zkbj39=#s&(S#|v0ZK}D#Oc`SJ@-vkx(?fS>N)Np=6e7KHMT{f&*A#QIi7s`|Xc(3z zFNWAe-en3dQ@1Qy<>s9r9|3s37t-gOWJAN~^DL3q^&^H^%&nY1*B@IZ<@A1lVf}%U z9T8P0B{aZ0>$wmqjG&PSze)u!Xm3qbP)dIOCH^KE9oD;~LG_MV=B|!2Wgoy-ShJFq zPIO)ENI(e0^}116v&fYTN>;%+2(Xdr_;k?q*;=%XK}!fY2Cj4enlMu&CEnd}5_MFcd`&F`nbrtf##73n_850S{oNA*A_u@HEHivAVS5jrWCAoqMYo zUTSJ`;Uhs$kwB&A+-R6Je3*IBfDf&<(5)kdTTYdMd&oZq`irYTyZ^-*RmWVc)EfBT zXpVGU9K)N;>Nkq`!mYNQ0|IOO+8k!x`6MQ>?bRdD0UN0JNpV;%deMGN%o++402|n{ zx-r_a-=Ngp1YH=G+-QT^QMu4VF9Xk!a)Y>Sh0KNMvGLbDPXYy&XuzdO1(>O5QXxM5 zH@udHUQj}*S7S2yX6XhV;>=MxxwN*K5qBbl8-f|Xi6I8sTW*q^X^UL4+;)Rb8H7Pn zwM8^D5|IYRjqMcjBn>5qiZZYuDouEQXGP3=`!pto}gfPpo zMcOoxRvW7wF0B^Fxlw6mEas?&3y==|RYeq60-=>cg_VFW#^ZRPOOvkoQ^xyLa4dB@ zZT7|4=0x0?n%s;k@zNLAWYaiK2@z14wouj*Xddd)VlWM3n=MW5 zdF#5|eKbhFL4Obywp#A`kj6fo2YepB_Y+)=<}qNBEtH9cWE(`kJHLS>`jGLBB--#l z%WfHjLa*Z7zw=L9NIFW=ID-h4fFgw9%ZXTM$~d-PbG;k_E;imb)AK2{Q((5x|7}UC z_W0iP_{`MJaQXPz_}Q3MifGg28`PX@*P2&S4;jP!W^)c?j!3t<$l|WH)=4d-4pahH zy(DJ1WNj6T)>?-h?pH*DkR+ykkI`v_xtTonc?ApC7ipVmaGw&KbEJiNe(KL(#m|M1 z**GhqW9M`UsmJ~mm>hr5u$=;*Xm4h>`;JeU6Iw?M>joCj<}EUCE+oo^Jpor(g?6W` zi5y&PB1#xbpR$_#5U5FeR2E+i`<7RcOejZ`K?;M7zqq`Fyh>h)zWoP&YD^QtCKMWY z#QF)+#222gCBs&&c08bV$^uAjE}PIRW57*}i8NqO>+PoaTyo;M2GlLq*=kU2|BPC>j= zOfq!)d|T_vpqRgdW1cY}o6c(h4J5DG9O7CzrT*MN`Yp=o0Y*OFl!N`fw%GboTywIC&^hH--c!0yj5w#svP%u(;k8xl;~X5stdE8 z%_g;?YrJPjP^FVc>R!+0Tz&fV33$DSYb#9W4D5@VRpa^rm$=SM9IOkKGp@e0!>TFg zmd!~HSKJa<*+L?77CeL}gpqv?Mt2}j4tJCPoF4iENP(B2_xxbkF}YsWHN^R9 zcoE@_W<8F_@nO4x-*9+5xc*ku^PxZeXo`z1j<62gAvgwDF!^Cn&{L={MH9(xGhoF! z9Z_vuN{!#mwrkWKax4!@4(dRCKedo8W^59tdMP=R{T1`=!<*Qik-ftk9yS{E4%c7< zITE)@9}wehVeUH&fiBy`hiUZ49XKF=%$)f!6#~d`9N#kxx`X6%Y&Yiaqn1bn@AJ3p z`BSdi7+0_|ka=}#39kSqLg?710&HDyU7*D*F!U++ktR=P!YnL zxaDY&3nEkBM{_ssq)fRWY9BLt4BTn~@i zVcguqpV#BqpZ38rQfRNmseR9Q6z{|9%f=0KX8CcP+dj(^vX3%mlE4w+aXi-!9g zUq5GCin(EEF0|+~Bmxv%xVnV3vanl(jBVcB6)I&zCol?HIGrCY$B`J8H zynmN{&PkStMQgCJX|!cFsbV!xcnlL6-LZndr~HTYffQT8ey;*DUxN5 zGV@?LvC!hbcUeav70hKc!SIW!8qetq%hq8-O!4ExXt8c&kdb9S{}Hxeyt)s2DTER4 zHsp~}vCVQTj6B6D*bM2>=~GO80>;@;C+3MVNiI(VPGlE-kuBtYZ26Oz^V-<^_AO3R zS;Z~&%ffniiq&1+Ntb%B<#n0M#U{nX^lCsIDh;fF0Pf0}s&?iT3I$Gry1^#J&0IHl zhRNDypqcE?6~$fI9Ua(xD1UXL+w>9ob+Ov=j%F8E(}TC&rE`d)69P2{@H;TlsfZJ7 zqI%mQ?n3U2W9=zf;B9H}Y-(JdbD@hnuw$fEj!8@Jdp$^}b-5y0xi9%A2iuNmij?=i z2jEn<$s-!})g@-!iYAAO9udsp518~Z(>%upFtmg3_G!g;T+luMKo~q(4FRZ&epa6Q z6nrq3;6YLSW&A4V8&o_L18FPTPH7oTj>D{uDil`Yo5#>AcJ;BZDU$6#^?8928?2i& zhGaGQ?jY=hS8YBm)r*T`feat4pAn0ru)D|qCT{cBZo>iBphZ8YQ^GBi_+Pe>`Ns*2 z$#o*tastJ+#8TUbtDcVT_&*fHUMuD;mbp3gs6N%d@FtQY_rtvCZR=wR)k@1-Bva=T z+&hgp_$`pO+!9yqI1+w#SA_1RsOS`Ts{|PK25)7a#WE9&$)BMR>N9Q{)u|8 z_{P_uBGBxBG|P2A#=G=sX$L}Nszfy3ilMAS2MYZ}2ul${Na4J*NAhD^_xFkT)Q+Zj zQx%fgwpWzJg}@l6@7gJcXpRQa%+fDGTGngRg$ARrY>f9AbTUL_CSbM-al!`u%X#D{ zUsoFbD7Gq>fB=6P%UCzf3{#~p)8TWeWJPIC=`OP=v(_t9z~NEZBR$5ZCaF-W*;bWI zt$^VW6`GfFitgwYZQ$9K#o5+|W9(2uYzB7TKseNO9 zEM-*a0!0T_=uO|jWlyuH7yPTqcLf2dPU3(idb=eTvn(FAW{`^EPZ(C7qNio`iIjb3 zmLyVV(0Dq61=|=v(cI+x@VGq#4qTx!xm;qij~C+HXza!UyN7u#jOk}r=Vk5`Du!l96jXG5kB zmffjw{SOCjPa|~Aq757;IfT=VE7h>jPzf6emlX~LZOqXZ6AZBigVSm-)S4ajZS3tt zW;qSlrb%M-f-UL+!+lr@b8msr%6Dnggj};GhnLhl+C%b-WAW@8?nmv|+gGd*rXCI| zxx;Sn@~Rnvh_P|l_p-bpz#Zv$(M$?cQ=l&VbK4OM5*vL;*t;kHO&z;aiw(DuNLyw$ zW%{kW_F1AQL#B)#dJb4f4gI>5W7!Sbr`NnzxFxqlK`q`Q>t0C$9+@H`l{z9ufB?C= z*(>NTQIEsjm!wNK5R2@$B#9Se3KhwOEmZu6FUf^+JOwd4It~1)$d*|=_D#nqJo$i+ zWxt((ywyCoo18~xF#nHx+M*F&w{wB;{F!~imun{`o}%cJDCczT=wrcvw^U+d%i~&U z*n&?-&);9mcDxhu<~eD5ZK3hr;^boZcsWD|lH&bWuYk_XvJh6C#vlOlzaNpWWCDSY zJ;W`{_^;^iqFWkWhQ#6}ceCaBp?T6IA=My3b&$*^LfdYWl8bn^p4!RlhW=<12QMf zV?B8h+n$GZ(>nkD=~f0SF-e;%IRQy!YluC=B-SRKe*&}SObq!XkIW)vRH_cf&{0#p zx~Hk9ALNlRP6{G@URIXha~PIu4olW<-pYN8BROIgUMeTX`~$C_&G_;wPL{z&R!IaJ zp_X=k7xYb(9*A;=62>(z_zSW9z8(1@R!{tY5IDEy6U6Cpft>u-$g>mLc}vwz@m^5){F%!1{2>iwEke)g>6?$6axEiu>T>9N)V$n**zO{moh zKFTU+lSb!yy7`OVYt9jWhrcYl4|qDrTKu{8KM9qg{2Jo(_U&(}Sv{0%&y-s^sZCR2 zIE#lgVqmIrZXT78NZvEmJbe7Ich>$Z&O;&)Kh0{k!b_bxA8JBCnDjL2XqefTyA1p^lU5a*j}{se z`a0~WjD1u-PuGU0Fr83_8V5(*DIBz_&5lMETo*$G-6??105>UGWrPI`ma+^S)xV#4e}1)wI-@mPma zp=w2u*nQD#GR%=5Qs{J}&~GTfnri!pqcP-mjilPNyYA+S6+rouOsr;t5>*wXHMw&R z>~)Ezy*6mj#EMvZ>>G2>w(aD^NySboc2coz+eYQYw(X><>)!6${q-38C%j|tcda$oGcQDQ&8_%L z_17TY_ecAwJLq+=h!&_pFxBD0xQqkTxV`(HOD)umKPr+bvu8omQ79?Yj=A!}L(@1r zO0f5@jGZ;``p!9MhFZ(oKV|XzeEW#Rp#oDa6!GPD!D@n#d;t}3M1t7#NW;zaiXP1B zMexo&ReP4Gbz~ zV3u}Y^Hzn(x}7NZM6c%_J1<(HY0!>4s`R=45 z0l8TA_XZxrsqN;|j{pN+qN>auL8sa(pY8F0Qbkk=z+h7D4klU_0)KRe`Rc1PG!$m; zK*+9W<`0UpRA(w<>o7PIhpSSw6Ck9Q9OhFbVOr03jZA_^-ucf0QC+>FyS(`y{g+HV zbSC0eHC(oqcY#;(LHx!CiaXI}pv?|7K`0sLsvj{9zsFr5`{MNCqW8>xtGf%re_&|T zj@fW~YybEx{%rcClBn<#bD5;#4^)&LxAka{)tT6|!^)RjIZ=a^KJb?CpsUazfp(4% z-G=Z*M=0c4W!O=KE65FszD;KUHrv)vy~8dGNO_#|Ocj7xRDNlyHn;M`E5)vnCJt-1 zrG)PM+#=fND9&v7duklVLT#Cf38>RmabpBF6sD=6vH82gcFcquKU7Atn`SvkR3F9t zEM;`|HI7JW1K&Yva|qC+(Fh;hL`A%_n|oCq=F5~qM7ege~Ag=uU}X6AJDjE z1T;no!BiDK7Ioz*OXWok(&YSo^n_4_frZA=k`l6X!M@3-UPxNbm0A1(Qe)C-r(Y({ z>=+MpmCSSp2t%VnEw|n7D*l6n`rKrwbbt2F05+9-Xq$|h7nVJS26J6O#C(8vLKIM~$N3E!AapmP22ECUU>>K$dDe zBXUj&qb|zyD>hCvz32Z?t#AL zdz7?;?WRn)Y94%_=Z9_D0GDLL;Ug}?*#1&74WJa9Kk7VITD0^`aJgu#wuH@xE_%7n z=ydep4m{y7;NgxI=QstS95!!7-fPALr)CQp6IbaLZSrM6<{*iEhu~UxyecBxN%PeV zgbSM`G}A%>snaB9l+IqdSlo@#_cWO^7D0wzk=X_(UMnWSqw*;z1dh~<4Soy5h#0y2 z<~4v~fAQD~+Yk!zn7uvivv!$%f?`QKhD6nRLe}NYSe}n;^)jZC!Y|^9Kubf)iv;D;pVLi35nLRV*#KJA%-D~R2 zv7&ooQrhk#+WO%v(^ZyQ`GSkYhq>r3D^Ut+f+*P9KJZD%D&&_3bh(FwSHq6pW5(fv zWwnXE;+P?LX3W2sb!HT5!9mJX^_SIpMV1ZVRo@FydI%NM2Xsy`eBM4A4Kr9UOQF0t zeFSP^TB3v_d=P0(=u|j3#Zh@5E}Axz+o()pkVAh<%G(ffc5M7RI1BRE66T4J?h0Kc4vV_ z@ThiKjjyGRT*pced#5t&pz$dYsF-tiG`4n&Qs3HeR}@keBtxD%AQ$Uhd3BV@t$oMrrI{_lnHpLxixRYGWFB7D$rL7`ivDvG1nk&kuUhtLZTACy zfw-=TiIwb&Zcpt@0MZ*8)zKqI`>z9cug0Q>UJdK?wdw2H~QAo;s-=S-P5T z?*v(=wjPrSsA1eV*W3*Ew>(XUI^hZ)eYYZxAD)`xA`hgCmWN%A5mz6))dYf+7q4OV zSM_=2cdq49c3|Y_q974hv-T42(x|vCL}<=-(Nz$&W@fhOcUN-)op`TQU*EVX~0GmY{`xXqd=)5hLaL&K7f=ffVP=_j+HvS{@quL-G zO~1JTpOUcV`%%qG%Fl!6wcbnSaCJHc9V&)gCA^D!AgBxiLxf(P-2SITf6WS0dz$Eu z%Iai*(eTgVW$EgB=_p^}yqxp9%dJOS;G2yi}hm2m|nn>;W! z1%_^mNkmA;O5z=rdS8n&Ob^c9l=qam{(L#B?whUZ8u$GXhzbXdQ5BKGWAP3fd?99};As@ci&Q!Q-x99V8L*QP%h)2^s>fCCfNEK4HE-iB^BAx@RS^?HODhLa z+W(CR@;gzllapDx^wIqB%r75pJp5u*vcX6@ovNlQDosNzD z!{Rjd$LS)#Y3W7bMPY@Tltm_aLH1F_bSjm$Aa-nD1{35Hay4Ducl13;yKCJu426(p z`KE?i$lxd*L>=sqUtk(wF&sX0*}BK}XcFy_9a0c*oAQXp=C(9FEwv)IEzESmB6y~X z@WhR&Sku0gFRU1kkpnj2@VSAFvM0E@GwLbxd*Z?lptg`8849nj=&Wc|-Y924kaYh% zx=vh+Y0f;syrUjZm|cs66%Uy6%q>&&KeL>Ffwh|=rz;-ro)Cx$%m&l!=s-B`;>H3{=K@4Ow}MEmuY zWLnrX*Qqzv{WrKoPQQ-=BBVW7d)YuS@KuSxd{jW-2GjrC$%kuv>yykT_I`svn*i^^KU zv@CP-QCnRWTmnpj?e$S%DYm^BN$t@u7co*`h3B%q-te5G9C11I3e7KwKz^m;cPo?@ zNAofE2py-zeQWM9Y<`~3(`v+>5-F4tXbr5-#SgkLv)T$d+(37PV0ec~(P6B_owMu_ zxp^MiSo4y`wQra`+ukNDaX%>ifOnA7TlVPTT+->?p3ch^`uOyATJ8Hf_28Fxnfu9p zo*|8fDp#Es*~bD^wFEkvrI z)+!S(zh}#0+qnnu{>|%58PS!fSQmoU(P3{ikQr>y)+nPQqhHk*uopw2(5>cDsSHO9c3|!N~z+vBP>$Ah!-csyX3Vj=Lise*?BH zFJF}dOzg!)7zR#uP@bRypn3sWd$v#{7L6sY**K^?9eNmf-?JF<2>fs&TQzpkBLzJp zwXn1Vxh9@gt&=kC)|I!(Vkl4#yNq)Hg|1)fw_M02_G7QBE{vDiyP(N2NPS^Fv_wK% z4J!pB#op!tZb3?*P?O_8_+)0ubR#QJnKfTf7Q^}8UDnE@VYxaF*#OTi1iIUiZo4xp zYBW-3Gi$f1^1QqS%6>s$EoH$Lxv7pBHW5R@!*BK3r#Y-;?Y9HbInC9RJVsMPGfbm_ zKE--OX^@B2GLeI{NeNs-!jv0n>YgFy(h;ww<`EfnC1Ba^dSv~l7>drviL$8A?}PgNKGsl5Z6I!y%o z^9ZXU3@7{VNhnqLu@*OAmVGqX8tz%PYK=`?3!TWEgyz=yYlId44mgdmDhF_ApM>8` zZ|3uz+O6@au)Q#op>4p17!gO9J@K8b=!~GFv%PxmaoBQt(${DSRWy^Bs4e!eYjGZU?Gvar|hbUQH#dWgQN@OZPrh0>gXTqT@xq=4R?h_l!vii9ro;&tx!BNdE z$Put+hAyL(E+&HZ^H)kaVc0k^==BTH$WykO&KNL!318?l|6q@qdtLiua-;G)6>fg_ zt%+G_-M1W<1I+Yx#!`!5y40fL4n&gYBYI=pT&q;EitEr$H+`NzfRA&C{v6pr9_Jv= zD9H&~YS8H7;kv!6cZs<832T^~GgvMZg7~1P@GCFGFNk0Jp-K`QvTg0o8Vw23#^De~ zmXPLu7u9Ln*L;z6>HzT7Hg4p`fv2y0P7YTt18ppQdKduuz_#Op)feGZ{UGFFL==Jh;;p_3gADu9E66U&92AOM+w^3b90yx8WU{GbLkIiuwe0ux_;3O~Np9-OTKMmoDHn`AVuZ2zKg`viC1Ro1 z0n|<0zca8(a6A@4fCyKtjR5+z)Nkrl`2if_SCy>kZ;Q{8rp{mhIWVt|{7z3oXw5Lr z!Z1nUL*^z9WN;Wmn0l8QRY#dUR#|=)sFm+SJ5a#U&Wp+h4THLDAL!8};zxzynxABt zhMjBzi<{k5cpKa+`Vsa-dKZ_ri5M{!?L#}g4)Z>owRR*|x;=(&i6e#MB}!;1%b!YN zp|Y0LahN-c7*X3@G(m|`>~WCUgS^th-|!a)yX)#}^ z69mGV!eDALMNC(a$z?vXl;cFxjG51m)-OwhRL4RNXuE7QQwf9w$s6tYDCCad-k{~= zMAEwiiOfSu)dVYMXY`a}XxK~+jx}!$5P!-lJ$VdOaze94kb9f8+G(v&1s2+R7 zKxFqJLdJ2YH@DN>00ue{QrIjWSepD2WK6SY+$-w2+unFO`L2NqDd>G>lsf z`i=-zqjq8Rvw$oZ(HyDwZ59WjYbhKGKu}id2j(B5-7EHkP8Zw*DFCn>bb?g_Wzy&yR*aj5UGRZ&z}% zw*pdSy;a-JOH8~0E6^@|4mx7^Ig|s;YO@bI{xcmrD=>g-imf3?(nL$rNtK*fYMUgq zN5qU*7`bqH$e z4ylEt*hTozjEFV*Gl!p(vszT?oxjFqEE9?8Ux|=%q&%Gb-NP_gz_$}tl;o0#D*W&I@NoW?P z2i9pvu)T+CljKn{gfxChgf;-u>_6%aE(`|LC1=2DL3I&7YPqhxhCNW7rwb{l1VYst z?VUXL4Kpn;ZZAh~s-adqe=<5Uz9cJ;4?sqQ8A;Ww{TNOjUs1nBE?ews2kk^O^qA_R zDoY1Yr9@F?%lgp~n!%Y%pRhSW6o~ z-KSe!o1D1OZI4Zze35Uh-!0rSFS7BXguhZNuSSZ6Gv@!@sv_E)*CIhvm_p-CU#RnK zy0pYTN?anC2FuJeKlU3jH&*>86n#qP0*rb^j?$GaN)-L;_I%?62Cqi)a2-NaN|Bpv zzl@z=_2sOn1{`_gX>3`hb4^CK%pkAo8hK#l_o>#}jZ$P$KT_UN|9Yx)YCuXD5Pz^K zk^;UkO_owPR=fyv18h*FHOJ9DFrIhBR_nJjNEXy$%IRlcpk%E}jpCk|p9H-pxPyb4 zn(;by!b+*18M(Nw;h+iKrut&hX9Z9guQkf!IkvR937p~48a`GD>K{}?$ofGzV(Cii zlli2RA1=qdSx)b6u`44=lzhBEliq=p@9xIyU?W&M%gbqG!sYKLV-<} z5)>F$zzz0Q)o`9xJJWL1h>|a4nfN3SJX_O&$*tyJ5XOglWr;VGrmw65!xrZYO63dU z@;2P$2{fXV76NR1si_?~=pj-+7E|PlVU9-63VvNIV|LUIE`SGBYT82%_~|kW5_qq> z3)6-aqWbPF{^#h>PY9bSxBMZJk06ztS@^fPK_--J@d+#~!cUD1hvXSM;oOfN6+)DomDh%8!ZS@Wlc7Fj$uOf(7W)>DB&cR%JggD!DmU4+(6m_!TEex3Zce2b0 z;pT?$Bfv&@u5;5-6#h7BwqJSLse4OTG!a_-N|3eScK9bqsC3XPyE|&Otel*I({`!^ zIKb7jo%3CD-MYrsz11s{i)+aeDl^c*pP~!fTbi$D1lAN2Mj+5>2F@o|f!cp3#mcgs z?)2)T->*nvw(Q`-r%Im_dO~Xbc!&nz{w(9gPMYIu3{EWN>L2r9pC4OsmrFOjsI#=d zqA-d(&zTZ^zhtDohvl_U6FC7{8l0f&C004^bdyHWPHg_*38Z!+vzkSIRR!m}dW+{*bgX(FX6yoz#vE zuh^3~uiM9kBfIVlJuR+rVd2lIafao0z*;D8w=bTRiU!Dr3I7I_$Fm=4bhut>3{`2w z$@miN_J4OU9sLYO|M{f0a6e?6bD$t~s5K;z!nJ4APFVEX_2;C`{rT34TFPT^lGIUF z>K78SIqnVSZx3-Gf?|CErRJUN1bi_M53 z*hoQ@gJ^{EkElHv+#2xuQZ%w`%My4ag_x-3-^IXTgtSl0W~RCe>?$yb!TE@_o2pPK z*apmtLwxfT!6=Y@4J5g1D0JV#G#hqU?*v-uXGZkVrCb`dP*%7`dl%5AFTg_;fn1pfl7u%^n zfF_~nz?&$xLkP+OK}S$k0}LzkC79t^b4V^~%?wa#@G}_Ypdgtg%lQ=%Bom$?12#Zw zkD-M0DjtzkyvMhks;W(n4wt?%jb63*wU0nN%faSTS}N;8SOL?AX&=gD@h6!0Y}gzM z7$93n5pdB=Ps>TJ2;eGq8gE`2?~q@u=}L$CgkjN7El9Ch;>aTb@=zR(wP1lq`W<2e z<5{bv^n1Y}_ffB~JUx|RfrJ4TazQTid#-QV{ngPTiPA}>JWUlcReN(aijp&sK=N~J$fq*a zzxaXX@5{*q-E~cyd-RUHPpZSZ5jAtY9Qx;Ejrx;MqX)9b0-cn8#ZJ3x2nn)1Aiv+?OP+-^2;xl)1<9LA z%ECEfC>DyQpZih7l+>5-cThA2O}NRWFd4W2wuV_qJ_h^tRKkb|^m5 z9dR2}ZKPK!%hPzUKsun%q|(+^EK4=eMfX}tVYM~EerO3xyAkiDQP@T5Bj$}{BZGk| z=k)Lv15T=pqHdQBS^l<$M#KMb0lu1B1a~)e51eSjP#V}PK%;^Cx@cW7ECCH3TG3D1 zatU#+zrx?TDM{jw6y(Slu^gvBuB0-~uDhc7%);#QHXTXN=FyGePx*Xx4@AAQ{- zBkXt9qQjHk-S8_Zbrzhe2Vzf!woI-xFm*kwSzcd|``dWX2+j7HA4g!L9!) z2tvTBU3LW*Jd1}& z{QoD#84n_aJ_|nfVgH`|ol0nrtJEBUu_=WDNn&O{@~?$h7}9_xAI3FftI|21#hN;n zn~^J`%V3b#jETv%%`%S*>M)4+sAiMO`)0kemkaUy38nDkrBf`|hOE}H+i>C0PGHk5 zZnM{ZuC{TJpvS(*-n?~xmHcfG1sj9a93N6*CYTNnqS`dM-zG#zGm!~zoDO7f9m&{`}I~1#3(W79kX#R zy#ob*|NOcwkDBdo(w;sNmRFnZ4@2*Ou?v0c93Uuj6-{2W>cx>qfMENo!eVg&xz`6B6WY&(FTn6s&wkwl@yTy z9CN^VBhg65v`$H|BK|6P1#U3rL0K_%Dq}igD9xfCM!*gU;Xw)agtUdk2dx z&9DhA2kw7SsKRBXTij_~_K1hMnaZc~;ok>aPqk<3j$9p|o*MGjQ-;eY?^R*{XdtvRLGSO}IhB}BU((=4i$8p*< zwiY_ zqSFd2=tA1+njBTP-w@uxN9*0^G<)fqs*rQ4snZ`-4Y80JfPn9p^W?!*mkFUm64^&;iLgE%cMv>w+3c-U`TLXqY2yDNw zYVW}8UKe#IQy=Ulra`^Zd z$;j0i$&qS$ilLW!wQM@CBq@cND7m^Kq4*NBZJqEWYK_xLjKCRt7A9Bi*&WF7n)&UdDkzr9nbXwS=7Qwv;vKgv%TUu2`x+HY%<8 zdMN9rD77Vp1-~syM+D4=!9Hc4(RaL?-TnMg+J!yB$YVjiU@8SfQ{tEg$ z4v+*^H5Vji$=`;jaat>Cs0@2JCNn?D$s#$X7MnsqF(oe2-_R=q^;nkGmduS4Pvj@QW=C_uRD0p|7Y2y}%cO+3p^>#~5nQA-& zB4DW6ff?}fqU@)EskYDf1h2d*!5%R7+5(2E%7yA7CGB4f;k2P)Mg_Bo(C2LSy%$vN zcE7!j*CwFRTDJ=YXgUXHy*7hUt2HFx;;z-%4^Vvh<`+ppI)A@4?;`ov=M-uc+&LLJ z*M|A4X?)pLf;6X>G%^fAdL8quU(|eK$leanZ?@xl&Fzup2Zx`_k@{2<1HK>Q5>4Qa zbwIo8DEytT578TVxIpRii+B z8q!mDwAOJF6)yMpwlFlzzDU)<`GY5{o3$zfvJ^-z^e3%8dY55(b?TprQ~=j{82PyQ8yWEFJ0v9Uqa!K- z-dV9oxmDB&=JH3E+U18lM-bjFAW{?Kq`N{d05)?_&!{Ip;7rIHneWn28rKlksN}CV z{9P1TzMNZOJ^~t8H>MQMe#+z<^yv!Ym`WulQ(SPm7_ z`SM~4AsqN>JL7x^>ABPwdwyKiIlbyZz(4c22+jpqhYL8%tvbDq0gkr?6Ykys=?2N5 zW}m1u#+d(!dUwK?eBAr+*Zl@TI?@bKX_fr`&I7^uR}qY;w;euX>tp+&IQW76g(!e} z#>Q)N;JRf&KfDk_1_19xk6TC*Deaic@S3(yqDNF|*%2@nEa${b`IQ`OHqnmSaa4xr zq(BhqRgHd&1wn&3^!ITPi&6@kMlY+}Rwd@U=IPHeR!X^MwB_{TQu?g5MsE)h?77ZaDsfVD+H*e$4qR+n%0ktgxc} zW}#(Gr;gTKjob;xG}j1@&`?r9H}aHRN|=oLjQN|}q+ulQT0Ja0jgPB+6hr>PDZtZ2#h<}4f7ynB{QcswfW*z zREW8bSsPQXT4XoOgRx+Rb$V#sfR~UuaHA9J2;p9~Jmn6Ps;vv^J4#$4QR<9)Ib=UG zQ}B5g%~h3^sX)5D1(e>AI}LRkgNuFv<7G~~DtQ#HbmYl>f1vhcDFh+rbEH72hAWda z2dgDH{k(bCQxk^$#$lGDH_+S6c}9+INKPJF!y6z2_mCF*Md#uoImP${@`M667D3$i zQ>hkp)C&25rw9@7W9zW_T0TS&(zshFcZ^`sl>99S5pA5(pg4{W9L|c?l6!=URPtNo zo#H8$2Is`1HR^+j2lRo(ZUNk}YO`al9Uos?liV6f(O)-T2pgd+N$4oNk$l@Tu>IWJ zgOpoKPQ_Ew7N?Z79DQ*)sSKW(wc*r^M;M*4gsLuc`>n-w_J8s}+Tch&`HigfZBX^mn~O+MsVh=&1s@Xt=Cx0c?)q3bbFB2PU&TPQLdBWH~}QMCQyWf$Hl>O!|x z-E=t3zx8QrXs(y%Qzgjjf7cDWFbDiKy9b2Ih__Jxex*an)#hP45r9h1Z=ayqQP1=H zf}N;t8dpo(%Ru2xO0gXHwB$H*!*BOx$aPfk_IqepJPC(w|AeMtjYD3y5A&4m1!5C3BlktIh?DB_9^XU@|*49_z5}B$g^HJNY@RXYn1{W zNhEsT4i8YRVSB&6oUBwb@*{N6=0myouW3vY#CuGBdhMpo49yn^3$t4%4#A|>7%NvN z#A#}gEsUt-Ncf?y!|2N#(IcH*m;~n~R92j~Du|Wxb<~ADoDk3+K2lgC=S;)UvkZK8 zgV3)eG738_>Q>Z0ZBH$Y@4I_?lV+%p^$s@{R3^1r%cDvF%9*5S0t?SE{5BWdO!E_q zSzfL2Wpr4-C3~E6pvT03{I0bS?bf8M<$D3l)8aTl8{^63ziAX#%G4G@Je+>VZgcUE zsvh5WGJBg%@BOH4P*2ugIOCHS#SE>qANmkMto%eDm3J3AAn zmfW<0KEi4_3|?u8{|dWyB$ttv;p023hZF!_RHiEknxghdAPVLa0!KUC%wlHhycpg%hqIddN!FRV-s>NKDC2Ixo2!4kFrI?U^e2`O*+EDst%K8Kcq~j2k&wN~} zUH#4szRF)1ql1}uG2b?*r^;v7B>Rg_aM@2a(TB8@CabGWQ;Ig%E2u3T8%3tCgdCt zrwnw@G~;LxFNs_@MX-WMRU`LQ;5n6P(;eu#MZ4@w#MGFwGU2m=7Y_4oa6IO-`_I|0 z&&ruTVk6<)(TO@U;30B=1q#WdWG)3@(ZXM&)*^>`LxcR}%hrfIM8(ea|I-U-mt>;@ zb<%Itq_;UwY12DgX}Zq`C)L;>gk{Mg^>ZP>D6XN+>bXWgYw_w^z$d74i8p1hwRk=0 zUvsz)H}H0I;@o~JTJ$kVK^{E4Fc7lBpVdL-X~{~k9yeLC>uFTcraxr*+~Jk#n8^Fp zDX_uO!2Q|Fz{K78jnu4ehJh_Qu;CcF53kLK%t=gVNwm5;k+%k~8)$CM>SxDy+i^gvM{Gf-}~+fO!D_?o1J3skCD2RB{d&;GVnI!$Pb zJzr;!5BmC34+7OfRnP&LJ& zl6W-w1s;&1C_l><OYAN*sep0U)NAg$tJ)9p+m6Ba* z<>cfL|H>OyFBao~UpQn*MZ~{QUXDid!+?Uk@V0F$xZUBZAEAC#dV;X3#33!1Slrh1 zw&BXoukmF^PcEi>My)tAi8K@8udmGFWuoKF>tVhcGr+)FCgXn3IFA=E0C`I+)hWSZ z^pMZEsvSz0^w6fOm8Zx?e91W7z9r*YX{C>qwM85V4ErxD=p3%3pPbYg^84JLK40-Y zET7-szn>*D;WXjfhCAqKJ!L!b`+UrBok5I?Dz0My7pkABLOizv=%`?pqkjtiSsr;i zGQ4>O4UiVR&zRa6<>;6$(#>9!>g}*9Ri=4NAgQ(Nq(?vk`Hh`t6}KO&X>2#ymd5#d z`C1x*j2?03Y=aKq=}MHf8H`5j;C~$c_U&U1E~_|s z_3CU(-gIx9S*8s`h=*5p6ylumuf#|WzGW`P>+T~ec*f1|RwzFsupCnz2RjgQR($^H zAiokflIoNZd;Z_faSNelgsm%F;8H8C;sDHVVWYwo+|5U8r%ki4^J$5G7AkFYbR>!# zF+?wJWB41LZ+?(v9;psX?b3J-NwMX`f$+L#?fiQ&-(5lq(`C|(WO2qj7#XedHY)_S zT08%W7SeaTOnOaZ`qZS|$R|O$Mb%BgcR7|{fjTO?F4O2+-B5uayXs~+RNtdFXEiN( zwLZkYc8ir`G~CwmN9H71#XVRFtfvMYPcP7zIf^;t#6W2vhv}3 z`vYVHg>fCgV-t$4*O1MSwXSH(-K>fr4&|%-rKd6@Yh+XFu6#s(p!Hms>PE`-y^Nz! zJHn3p=kigrr*j#U3_?0dGA;U6t}_7l zEY2;nK|`~11fou9TQax`;x~X=Xcpg66$PS~2wp;tT?OQHiSGRDzcw%+w3w7nn zHhO&Ij4id=ka;vJvx>rfdwCG9>^K>+kC)Cq179nNf~!c#_LHs2Twn8Y$!)?Knq;bz zKVpEQdwIcj7!M{DM36GCG}^oe`mb5X%uK7j((GSKtMXLTb}U`3*&HZcVD;3!x!a&( z_*6UE+f=ADg7wzQe@mSF)YreZN6saW=SWOb?HD~wv>bVE6oZl}-Jz<_kbqtia!dN;*FvQAlA!+(z*+d-cb? zzw!bx65~(fA_H0#GU}Yo2;#{I=Usi70-tax_87=bD1rH)e_Vmt>{8itL|imiM#TKP zV~TE@1S??E`}Q<@=WDws0@Ws>mXT5L?I=Qtn5e>L0TEX z0oR}y#rk*dPuqOa3ll*X9<7OGah-SZ+nP~p3B6)ld3vc^ZX-egygUB_Sd_K&4*kuE zbsf55_P$Fgr`Z;$lv3L$n>*CoUakL*eLU--osB{*=QVo_(mH7eVK7p;apvA0|6G50 zYTkU`5V-&RF=MwMQs?^rP3N|{JhyNa)-n5CKbw)QQ;EmlHZkl{pLN5Da))SPlB=|> zO&KH)#XU&j0g7`8p=ZM*ib3ObKn?G|a2`8@>Ga?rlyPv=#T>D>;S@jj9$mwP8hgjq(iD1ZfL)V+q78AC+e9b!!l`A4uwz)u*X{ zf;a0y*SwqFHZU$^G>V-}tq_zCfK^|4q)fMWGEd%wIBl=UFpH&eCjl-=Rz z1lh>v_Tmk@OHE@6LBbNxAXn<-?T&)|uvQhMZ>DF}v~Bc{KnTN%CZfb92~jrJHnv>* zBqjb=b9>B)RL3+Ao;K@mnyd;EUI@Uzso_exugiv9KxB^?MWj1x0n!?XcGzgQx1aak zmk*XcLurdCUDh}U7;RmV%ZV7pbs~hee7nJ1I##mI=pju>|{F) zQJp6p(fz&>8VzT^!`;b{-#$&g=hEk%cdSv6CgCXf{$NTt|TMFz0aDO&W%y`{o)KvysY3lVR~2T>9oh z%eVv8Q772y(GD0C6*1nB1(riajLd0&IUmm1A3bja`I8YJnqMVRWx114Djd{@lT#FF zmV)q(T&c6HfXL^PHL5W0R?RUgUl-j{r zu~+P1XL*(3jD!iLfIa0AAR+9}O*~2)OL+Y(m4@o5uE<32+BMt?wsfm75k-^ZKxAbh zhISFn%DtXdf(*51t|!~6vp{xc;mjODyH+6vs9%)FS$Cj-qB7EGdFzZbg?LVlL_n`w zZR=rz=*+RLWDGM&Lq>^@ciQUFTE^b<7OlUMBJsa{_+^;$s}AIyx$@@oaQ-Q=#rZR@mC?Cxs8Tv#H9JsRZ|8mXrSFBW zNKnDTI*CPMC;@MK#P(q?g5>WZ(~r--x3a&7hquNCoO4EbfA9Loq%esxo8g}jM+`U=9Rp3y(!7BV=^Ck8)<-=*DkFMm;?5hX z@^ny(>MQpfD=e!@3kMPT7jtK~g%I`ga{ET6t`qkL2R4U-Dd+9+XY;>}wv$1Vtc$3YYSikXPP1H!X1R0MD8(4EtD@6OMV|f<9KJ%RhILUd zJ(nv_2myQSh8Gy+&P>sozvYPoG?;Pw$VyMy<+iS?Btw@o&sGtWHDB4LqA+6q+(p2e z|6EVqU7YSL8Xk#Ntd$C(ZbaJE6Ch2R`rkgYUahqXMinvF2>SU9{5uYnXPn`sOp#x0GC=@+qm5KZ?ETYD{Kwn;liwl!+`u5=YLi@mKQ&TrOb|O5h@LGSa z_Cpl&zHBb$z&oDzL>8ViBdCAfT+^wM3OJK8m&MhDuUj+``IES-{Iey}_}!N_=1{gz z39dvQ^(@@CcK$m=_eBga=4{-@b9JlXSkWw5woa3QmZGWLwOpr1U@H97X3Jii21+yY z&X^9*ydt0ao?^L(O9&$%tNbBTfjqk;Rwj0nYM8ftNCQQOP{#r8=dvg^tA1mvSf^@!-1HS+>XuUa|kVO;^kE38oS*iEAXoIubF73^6TxoZmIT<_{Tu3rpa!P zBY3G_`|uO2$ofCRkA?)V!EgaWPP#_xs`@978dxtEe`bt^dXi8Z-4&Oo6$#UCsXM4g zCj^WiBFDhH200o_UHc#0vP?ONV8(pUt-n3L7t-$~bB>$GBOM;wQr+vvvHEl06QJ!~ z0(37fkv27MP!qRYmlo=j}pp4jZzb~3TeiP5p0iPPc4 z&YXO2)l=W|o;v*(>>s*T?Y-80U)MX#=zkSD9mkn>M}Bib1&2jAGv54mKn|7FJ!m4X zwi~xMNF(Tya!RO-z9~NO2xnCk;N#rORHAW$YN?TP)IE2#H$dNIfvllsmYau=VaJ}J zXolO^`z@w#lX{ouS!ErsSCl67uP%K?SI55Aj93+k=KIO&QNZP@Kuv(dPuJA`7RRGQ z#+n;d_CF|7N;WH0*D@v3;>=o}7FdlLA4LZSdqj4a;{u)Xq;$GB;R`tJ4bYY$eC>>v_Tf6OrwdG zW>x7gEu)%$!OU)Gz+tAzb}mbsi%_=eAQWs1E{8)TR-aCVR2gYFy|`d%cq|TxG{2l= zM~qg(D*~ID*)s*TLsjrAOvwQ-I)Db02vKilD=o6%u}E$vlX0jf>}CK;5`!!2s}wjn z)M>)H^W^JKLy%{vNxhLgpBnzet4_%pYR}lvA9-_vhO>#ITI@v;ksDri9Y z7Zk$MUeVr2yXWH{J#WaV49YnpB{~bTfVl9s8r<--yvt0LKH)#E;XatPy|Dgb&vx8u z4h|_{XDr;TY}V!944F%cTS_ESQ1mrq*ZIYCz#R~fA(3l9*qCE*tHl}tBV=EXf}UeK zA0g$huLQtf=nBb?!BC&967PyP+e{l0J@Wl$cM0j(!@C8oa8vu+$5N+DpP(LXfMmYf zjGq38*Nd~-S12Kq|5|8Im%dPwR`1nlCtW(NtG#8uSo5xG+j&T=5S!K8i`qT|IXvEz zVS)F;;!AT@uEy5emEO8_?BTE}m;2nq5d5b=LuX;v$?stEy6-720IS#M^FA~n!4b1S z=+j*gM0#F#jhu2mFxU`j4=fn7gy)|)61`(Q=in|UTuflV*QzugNeg9ubna_ zdEef<6C=Z+gGnGb99Ri)aPKe|`2x&UKrAmjSo^(NamcJu@B8ymfq_wr@`>r746ceVUYVniItu?Jrk<>YOzSvJFmms3B z^I!>E2ep{?ekjmX%SUxUIvlv`&DMYr?Ykc$^%qr)qB7>4YXaBTWPu7 z!T1JSR_RW0BX0}dX&#mt)KB@CDOJSNyxxn(`EUagf8#3n3$DO3^$fK@Q=wQGkq4K*NR|XrJGu!73leM#Ng$C`IoCCeW z**~InYA2mNkl%*k1dCXF(u&`#j=4*-oA4;J3a;%&F9X`}-3md#*Rc>3o zUVsfgVMBAy_mSu+`4lY(Y3kOBsKZ!w0uV2w<>NA9Qrw}y?zyYrnrfD^OyNdUrno!# zAg5Mw0Y(EvwHsAbiN%jZ1qk)9imyKbSXhl#+hlEv6H17?cXzOfPPZ0$mm_QZ(NX9g zHwm0dBWY!*k0O$*OeHQ3z18l1z^u1Kv#OhHD-s2%F%|X`{{n<+<4j4cgYJ)3FR(2C zK9d#&5kz~QO1y!E5F-~#qfPG|c${Jc7Jlb<(h{8^w)rh|#=Iots7j#s-3tTX)Y2uT zM+ePYbkPvXlQC$3v-;E^w?0Lv-B}r?)MaMDF(r>Ev$4>`pSK#leJr_82d8aq?u|?L zcs#KRlxLQPR$m6aEC6wi5sUP>)E17V1I=ub>fq2~CdPHZds2uqC+O>tb`c}^7i^Tf zJ;oui2v3Xrj&I5i^c@+sOh5bFPPHzK_ji_OfJhZU^Vo*`Kz*Jo^#okCK+ayu>hc0Q zKmXBOH#R|Ss7ZDQ4#$*G>&Cbd>QVtC-9eifq^%RuX98tqbDo2>m1|6Dqufh<55{<5 z-4&FR3ohPbA&+W-G?bekoVd>E>K$iL&0u{tW`+-)8waHaejxCkN57TgTz5HO^dig{ zH=CQXB~A`;a<)O1qBw$n^T%}BgZZ4XS&@d@MIMdmJmR}#UXC~Rq05hQPzyU^u~F?M z61-sV3HQ(|xxBH*X1iq8*ug|*-OjQfIxJ`xA}Gsm*Vdx68AkK$&-3$6D6G)b{O#?# zwHg-irKM`mPU@+A+4cq4|LL9l%>?i2QVHde`ku>w-=~$|_ob=QHl*ZZufiew$ggdu zrgPttyn5hYXm4m}?+_(+Sk81rg$;js$xUX5QM;TfmhxyQwUMJHVZ`r$gqQ_c0oIT33E-n0&7sBRlaCM8`4qfNYnoZ;ccgx_X# zM8%&4Td4RKM&p1i-^rDu{z`&w(ZKFd8FIM~d30{z9VDT2JIk(iyk z?JiN@xDI+=@NE{mNfQPQ8PnClYpPKDzLy02Jo#QeuCcGM=-kcuhU#3jc2w9s^hr3- zC-`5Pg8#%V`#*IT z6ibuyP0W>%$b8-!abE!?=sc7{$09g|QtaCNXql1O=)Y{aQwy%o&dCsz-fYd3e1wih zrB3DKdSll3^!V(NHhGb8e`~aGm(8TCK&66ZYrUg%etgkoTs4g&q+qdyI%${H=a0+b zXJzv|yN#il=>e_*@Q6CPhzp+(L9l&AY97;-M03Lx{d*lL5ooGl#fq5w8r;r;Okz;Q zn;}&igt{w=M}I|$wr=z4cABycHMz?R>qE+I)Ys+bdLRJNqMNdSigQm-0{#%pI1Z9f z5oQ)}gK%-5IF8s3df8SJbtxpA(`p!;k*#BZzp17czD%y{9^q!2yfCgCou6Ko2_g38 z#Bm2QZz}aKh~QIH^(BsS(G;4{X|Nf?B(}7xGIoD595ue2m{OL7FcefcS3>r`jz2#p zHZ*F~1gICL1&~fUmtAQqZFIH24o#8WT+zzEWt%Xz9D6iW@pkY9Y9&x{G;Kp_zH)hbA zxeZroP2UOEc-@a+33 zfj#P0jI=l-rNE~-?N^_B{u@SmROJ+PDDx2aG1k2l?8*Vlh&i-00PsV4H8yXz?2#zR zjpX9wia=hmCR#9Qs!g!TnKseD_(F_?uc&^knYpLnB!tbXcX~nJmwcpth5sJNyEpEswz(2-q-gF295jw=P z>;3fn+)*$}K=-GdHfDWULj&s$#0e?`*T@KyT`+fdO@830HFyK_r&037zqAasw^QdK z>bvw*;NB9R`GryZMJ=3}pf^vVH0)+NH+4Ky8n$Trwxq*?pAfnGw&NA}_O?qHPwkRh zSd@c}0`v$l};W?YOqIwh}LZ2H4yzZTz zxNtX+0C0bCYDSHhd&|af?q`Qz%PBW==Af$%mAFQPkb7an`Wx3Ai*IXJLRIXsAVxu> zBE6i|Au$d2ltNP#F*FV~v$k0lXFC!pVYM(4%1_2{-ZhBDW`+UD#9;qoz;g#GQ~Q- zp0eiYX^z&k?o6Y(zcnXw=AP`xTZXH>>Y6bl-mDF^?*Wh zkX+1u*$B7mC-wZNexE{3r9O}LsqVr!g%ykLt=A)K9Qraa_!5$lF0n-{S^U-ZHTQ05`wwG#vd|!eC z(IGoqFc=&Zn#dKm2ajy({;GkclnaL!7f=$tk3-N)-w4fV+|g6`S;-T;&0jdeyv&&H zmUso4TL?*;E2FSv|C30py6AZ$9F#)iqa7UMk)%~l2Umi*ALl^;$jms7K&=h&=FJlb z{IX@p{|(5KFo;$L?`RQlC|zp(#vk=uKpSL*ds%4PdaiuB)fLtbv^7W@o7Z_49;V2M z{Q*9tA>+)@+#6IX)9`M|K398D+%N}&Z|u2*aqL(jY|XaSET>4y(i2G}Jdu{Ku0TUL zvu_U-_Y#9D-VUh`)Cniu>%tJeLMRZ=StTr%Y}Qp(ol=aKB!Sn&}_}bX>I+t zlDD``-`0+YBiZ~n$I?n~mCFh-T8z8GPHo|E*uRJ?|I+-3`MuQkSA#_lEL(i>8_gxA zE-f6gTH0(*p+K-43vlOcr5!eOZ+T>Wajams%kAX;`6oL;xg0xDJc*Fc+ssE~N{RpA zZv=Io`QSY^)jmb=A(8A65++DTQ#H^l^KFl$CbtR!`EApBYO8x|Y#Y_P+|h5JW<#Z~ z?z!Vi4rqDZhwtbX;fg{=2KMP{r))^LH(#1uS<^thWkL=L_E~HT@rtCXukA>BL%e(( zx6L<&IvUUx|7{q|6n7>aCFh_l?_mx9Z6;`Wt{h?bePe+Og`b znVd*(HmvV&1f0I_MnIHHAl>S+9k1Xf-}jf>y1xcz3rbjVx1~oU*dwj1PH|;Oxh_u=v#>5!+w&Ss*p3Yb18bTz&l3@-{I6nkBRObV`WPfL>O*u;vf z3*@`R6sI2T%I}SC{wt=mfsEUJ?n-O1idj*jZGoxlOcoUU!J&J+D#sWK~Ab&q4J8olL=ey=s# zy!5leQtjiC%=ftdfcwMPH z+bwBi@ojV=aXU9^j_6@~J%0jL+RC-FosB~Yjj(ZCx<-(PRM*z_3nc#y_UUMx*1+5_ z9tVP8p6sH$1=i)kV8;lt*vFqgpcVWtRe zlT$a>J+WGMguLUJa$}s3}l&S0UHMTTS*z znrSmr2VtflRn06X$FN)ST83MP0@e%``iR{S^@%^mI8xrIdtTLl0y!3!BlK-xapAVP zoQ+p|K1SV)+w1~{&26%$tLV?tl*=jd7no|<{weD_t7V&T#ioYxR#nj(O2qe&gSaFzo9m&N|)JI?4BzmLPk1RLNJjoDgOjt@IgE)l7bQvJ@qm)S?@l&Tux z&%+czH4x@Ifkqze)Ag*?*Ld^40e&6tuY9j#WriO7mI1{jAM?Gws1Z-3(5ML`+rb~V zl?F^udn@^=>MBblL9V+>tFqg~-vf8&)s2b?89zd%alO+rxVEctUyNA}?56BH|IIM| zKH1?j;LM=ZS^Av-c21}mc3SnpMzZaF*hxL($2I5+)`H;c9_O*M&P$@6g# zN1?Ob>5a0k@K3TmBZ+R2GQ{2?2a@%6-`HQ1u%3eah>=Xk`MLI7qjoJfiWF?dF`wju zN>d-|^o-ZjI^v5Wo&UOb{ZolBv%qfVeCP62GNBud3*4$YVOP+l)~j*<{H^OUo93>f zPn->PSQ{(<$yBZBrcmmb3df>+r`~*H2O(qW6UV@gOZ5q>Vl>7B^V`Pxq!{{%`d4e8 zBE>IX`(Ay_&pPX?knZR$n1$OP65TkAARESMzP9`Y@l07X?hN4Ta!YSV8&IpXuy8y8aR~7tPA+%mva+ERMI>@#7aLk??@~xjvhv7j6 zP_a@a8zURcC-g?ZgYNxPPv4I!u_sFk!GhQoO&N}k^34q#sA%zfLfB+G9Cv>0l`(q3 z=TrLCnChT?i0x>5p}&?oT%|4CsdaHHpxYJ-VVn~+-Z>>I#C~H^80FXrbWF9b0H!`Z7^;Ay5*)f&T?>nMe(0~RDB9qP%8w4 zGSo4CYNgIug3pU{AwQtUADu0$g(-&{jMv5_Ls?6BjM9$n>!LV1y~0w$f-q^iybMY( zq9>FfhfD^=m@39tp_<31N@Mb}aIRa!@xUNdP3gpF7M$jLilPndFGdvj?QRc6YjE2b z&HLb7f16axoDAA2yFm#wQ?cMwv#jbfAKASdE#j#umx-v_)IpJmkJX( zlS2KkTZREn6t;(!RGN0e#MW9~jqHI3F_zwb`-k_RlV(OPxhiV~jmR}+^fAr;nxZ+9 zyYMni?I^Qst7o!GS4b$uWK)0E+wu>Pq#8~~#)<@VOA_V<#B{V0UG<8Ih4**~nD==B z^$}^5*3qRBV#WmhrfIX=%jBk`^WsyM5={Iv2Kwy>%P;Jxd6Y?e64u|wc*RHtF-OK; zieYm^27SdK$y=G$-mvvUBy+nSA7&l_PyG%#4;1wy_N-YOKQ&isU-Z5Qc_uXPGfH%qu{KEtxPEnf^il9%l1{=i&bK_V(h)nX~5n@#yXZu--#z)i%9X zeC>%DR*EvX29@Nx5nvRx-{=2LXg)Z>X}9wUHSk|S&+{#?|8>3~r>n#FHENJ=k_aKq*!LyKw$xujnC))%k1RsALE*` zUVdMlL+Cxjtsw^msB5177m|+|cWx;fz{1cTtFkG-0xay?y)X?8&8S~a(B;b=u1R%v zkJ5sDlL%j*+lB})E87#2^p*P`%O%LCRGO(+m^?v6L7F z?*qRv)Qij+-p z;?}GU8Y)o7W9J}Q*&VJm?^#Kvsk2$y{iHBEyL46;IOVcRgn zSx`FfMV>+r)CZ;WxxIEh#GMxw>>Lu4NmTw~Z5=+bvv4Fl(b2f!@Xi&WdmhZ|R5F6T zMoD9x>!4um2&|+)bE&qf=4lrK>{gN!ay~+$s3xIAG7JUf!;#ZRx(M~aTDqn})OiP0a0u;(gX(d^hTg&4 zq!LaYW%iS5wY01crnp-RCn_WwDO2_+)2)O)xG4Mgu+k+aS3)X&#cL*$IaClCk1YTB zZE$Y#)(bXY(YI40ev5T9W+M}8K11y{#~-{N621DXw!O(HWb?z|8`TCsJZM&-Z(9Py z;-4(Iynk=E{e+zg^pRS?{D|(C?;T{Q(AeXW+qF&QzF6)QU8Z&h=@w6dUTF^o=#g-1 zH=IXQ-VMA|>`yG4`2rtqzfMnEXeZtJGr!bct+0l7Uss-X{jYm@k#ZEx-%5I_@&jLv z4pf9WHTt$vRSE>Dcm?tA9hz~JiZ*b#ARx1aq87Q~K+dq>;LEfz1S_oPjOVBkB`vF) zn<9$+(ZXx9q=9{G|U&WAy- z-0NpXKm14w*PW3hTIW3m&N}ApnqWd7{AU-?^(#3AW#(;%psDoT54q$kRU zUzQV~X+HMSjVDMWoId!*?=4YN+nv@s-_{@>WEGE{#}M8Dx=Lrp+K6(PUU8XzX4_>K zI>oN59@N$nd)Jg2ksrU*ma-WTa8PAV=^Tlu!ff>;N0oq*9Ga)_)x#DnUtOm}q<4L z^9yL82jr|rc9ahGN*#(3l_LlVIEZwO#jSLuvJwOAx`VCOM(WPwx8tHV zG8ULeWoCPlHCvh>A&nZnbZ?tHweDN3L_jk<(p~;ky$h`!a$JjB)L!q&GoDQU{OHnF zDIxvi0{I+(bKz)fr8SQTtQ6e{)^B6-vPzlO@@%dc#$NMqPWS1JNjoyx3Q(#0<^Jg{ zS}5D9vCs+XK=q}M^}b>1-NHWC8OiO}>+Z_b8R=}wU&fWPU`Yo<9d^3M7~3)4)M-1F zC2ZqZ*%F;L=r!ohxuY`OswHaOxfM^#w0|stQG(=K6D=i8< zUD3$7b_KHHD<<=fb>%16 z@x6=NT{Yz;VB#KW$Pn^jMJV}uv2XA1FUIId<~ww=H-Fjvag*t}AJ@Js*E9e!ufe(V zfpKUfDgTwS_p$p1%Q9mmEE1UY07EXeMVrTT+`K$kG=5{wNo4s23qpBQ2g)ViJ6|WF zdFwbt6>$TolmwSsASJYY15=e1@kV_=b}C4vIIW!TM3uRG3fOqeC0PjPYosF{0b^%> zz9~A*x7g^A-0B(%8j-}0mc3cwv^Zc*A9UG*gq6Sox%8eqSY-XLrO%P4@}?WTYMSf% zMSn`6NGLC6vAb1p4+H6uef)~LO{4c~Ji7f^`{D!IPYj%&pb-RXs}pz|8v~mrW~}F5 zNlf=>Se$5h$Sahgnfym0g~Ly8s>?bvVNv4~uLQ>ZSX@+%(-(43M(22*&CPg_)Fzu! zD4v^wyCvizr~R`nazozKXz|Fz5p zei0c1{`6@p8r|-;oe#Ppdu5}GkpX`g8jOEa)v*<~2w7FbB$hJE3^6q`3?8dOrs%kA zGDvENf2_9@z#w6adE~>0^%(Yy-s{QkZA|%Aik<~kUY5)&K=C@~r#*0z?#&{~HT}bQ zG>qH?z6x-j16xOz^EzVTD?~}KUaPbO$|u>fwE@S3tvW$C3u!ge!==7Ppbk5T7n^Ae zrK!C&AvN`ZG@vo%Y8^?YrR)r>g7-}=+)hdQG+(-oMlO~i z2N5G(&O4;yt#BksJjhiWN~JEn%dbtA*FM%UZFm+7KXVI2Buf23h>GMeFeyZ$7!N9^ zKBI-oq_IA94yQa%<8gHjJv}Cg5{D`<9*Ddsh*(L3AZk;s|p4$;~UmMGyzq@TpiBkBJRMa;q&oF8;zc$en!A< zZ_JVtrBi7qXxh!Pp{isOWDTXLhH7JQ3jYg}8->+e zgTn^oR$71QzWUM>h^{3&hgC?J@^<>JQ%=n6%oLEq3MQ?USpla_d-Kh2$WSCh86Cka zUqh57MW?tgy5XiUMj-(}ktRt>t#CE022t=p?S_7bM=z~Jy&E?Uq4@*hq%~IPReqbG zKPZY}0xt~p-On8Y{=oU=wwi3gxxd&~A!}`{6O}@GijX*2*1J2Gykhkh;Y{AbN3NoP z*!G+JGJHgY_Ij00-%^Yz~q&Kl6b80w%8fm5U3yKV6cVXU@h(MQBjFi@;& zUC>lE{JDxz)k=#b*tR$tm?1rv{?}fCPjT%#9X>A>jfQb3@z;;9w}iXjDBMbiGU;)H zDMU9#c!@}emzkCMVqxB7bOIUA+j#KiP;z%ViRTHCVS>`2c190io%$+y8Gv&IWEa<$ zo3t};A6+$Yb>$y@a48nUx7mtv*-0g|_58<)QP66my>cy-O#Pe{bx?jX9Bo$&Ukg2&fmWo<|Ny@PI z?YZuNAP@YKyRuqauM}y_P>-v_{`{IlZJnoO?ixVcXsw6CFfHEtxzxi8qEzfZ0n|f7 z6(rNqahRhnK_07FDJQZq8TP1lhY7u__LS70E1Nb&;fwwq#pFhq`ZRT*8M?CDj$B;M&fbI$v-lDLiS8^{gaBP4PbFvR28YxK)W9VpvUP?cZW(xD{Si`dOeYdV+Mfl07i8m!k( zdf(A!azK){5^+jx0>0_(T}&daa#+78F5Q}&gJ=Bt0wJh14xFh+qPrY~(37F{uEuMR z#-s&-DB3k@#oIlZhTW9}`-M_HmnaE#opWdpSWjH-1$j=7UzDVze@dSo+p)NmvLN)x zRj=nDD%kP^PiE~?V{ZE5%#@EtR2}%X$MAkN9HIzPxW1WfdNExw8p%+)0bd^_z0;u*R8oFb=-WkcZ%71H@}{xYH#_D?mvLmJTt7-HtreRG)PzgtC5??!lt}tyS_Yt{ec|bXVfCVt zMy<_3?6bhqENAasSDBBVARh4!g712!BMkZS5+^5c-C6dp$0AJ#xNJQ-AyN_iYzUO(JSO8K8r~PYIxoOEaP#nKjNh~lXiq%6+9|RXirVV;6k!Z6DN6o{ED7u_ z5`yO`rKk)$+Tn%1Vy^Fj2`{sA_Rx>cNOMP(CIA#;b{M ztQ6M4-$QvshZVy`=yAm;Z(G-DE_`gFimL1e%pHVKV^2W`AAj$^lPdle!85h7ahPkk zsdn{G?z>rtWS3LP^%1dj-)u6HI}bHH?G78FiUgBk1DmpCih(YI(3K2)U9T5@{*zJQ zcMq~&3;g@{ikgNx0;fo7Ehfd+>+Qgw6(HHL@G3a{r+UP)w}oufHv$e=_B3CF!l$mm zy5jN3+T$0){o>Q8i&mXm9>o`|;b~}?YvA_`Oi)%y|WQEYjZt0oPfV`$iLz2P> z`XKlGO5;sLrBr9XA}B~}3h1e+o3;*|;k05bx(=$z+zft;rH*lT`LV{e+`8jIQlobS z9vX;3c8oufeK3jEG^dJ27sicEJ+UE1T14frV^h%`PBY|%Ln=?nUro&X_sN@4W=G{?3;QPVNPeD8s-WgoG(|K$6e>=SsJG|$=PRB;v zmx*?_zBsLQWrq7_6rXL#Aho;_Y&*zI`{YES#Vf5ENhKfkZocl0*Adu$zq`1|(+H_h zq3p@5FQh&-6~ewD0JOg@F zD|_as4;?$QKy{u)cs#p}^%UZHd5pwp3r|oVl_x*M_`Ol((e<7T)7tQuIWYp8A&NGv zSz4_~O>$9aV5)8oB`>}rUYa%Dx#b`~PcQ$xRkV_(h)_X(1f{B#3+858!)|(a{X-$V zK+59BMiUtcajDFhOw19C)Z!er3QtrO?TM6Hq1|AF`azXC!6~QmQ`Dq=PSsjVN1QCb zOQ$$)3!~n?F+83YrvlurE1naP^(ot_KH4HYkMKUhP)z1eHLW-kOw&qy?3GbUPkw%} zbtw1yvj`MZtjWxBCyWuv&lr-74#u-+U|O%A4FZnd0gB!F{r87gkTv^UlC)0)Lhf#p zd1!*5>bmIzz}RnbMb`&+Ar#Ris-o99TzMg56tVM6cGd62xU zuS}Cj(dN%)>ug*t+pg45Ns@U?8h3tk&>oN7`5nKJeT;_k7cNTRM^SKxUl|ce1Xt!P zwdeG4sWll`=duzXjmC&Wdl;4oG1&yw!+r)W_?muEJ{qVdncO1=FGZW`Of9hnq z`+kihvTTW@cA!h(Ygr6)FxQ{aSaGvFd|-C2^1zSzmr&~75l=Q`1%}2csb#LUw$3^y zACH1fi3qgAfaDo}x%yB&p^O-BC7o{h3{+wFeQ4G+7s@z?aXMB_&Mh~8F%EqH-(brB zNlJDqec`CsL)O!xQhobOJF#5b;KedM-|#Xv<%LA zA*IIYx7r5l8>@kk6@6KYI9o zNq4aAk!Vr8*-&6v9orjrwPem zulkUegMpkX@K7z8N6Co^RIkMIbN1*L_aTESIKtsY;aw<91LVGmS-f;qE-iOpxwZ!@ z$@W^3NXCm~xmf%=QJQJ+17&a{NxCr}cI9r({E&)M#chtd70G=2@RHRlIS^sqs_RXj zTtq*48$nrji5T%VNrF5_=hH>`K(>IR$zy|brlf7f11QSO9QaHAXhxSKe9Iw~NkRFsnN$?55~rK%mcGHNgJCLZ z!1GQ2Gw#2k_Wrv#o*lnL+y}q5=UY(og!yg4zdxvbFVjv)uL%v0?VIjwmoYdkplVj= zHY(mVz7LAmOoNUfRrI3N!LFY1`45IeKjF7qAPa7FtH+CJ9XT7)k@NUrih;g-WV=G-do9Ti8ry~rnPZydH#I9b}By-7GdD_Ih0Ui?K5UeJBWDH_|Q2)X7fy z)kAcn7d0<2#92|tsp{A^Z&OL^6u0ie#@<(MF*HB@5Aw;{-$$1yre3-E4dsoq<8m3k z6$YZ=s>fYiy=t~lU-j?HavCTUe0Wq@ZFKepMMe=OU3)Eu;;jr}kCR$zuUVlW_j?)l zpE4=*gy_gMI60nOwwekpv4fKhR9l3?{NZ+FN_ak!--0hM(jC;m5L{R3LaQC56#37Z z0B#3J%=?X%2tyWRZy>j~vn@tV*Su3zYBdLeMMJ%irzg+Hl`;(3z&`#)WFNHL!C$r@xC3tfB5^m{z-b}is!(v}x+L0jZZERX zCQz@s?J8|>BL8K~o4J0bQjty?e9dil@}lEJw4?CnC)(&c(>_>(ntOas{r{~pHUk7> zAExC#g-X%XWa?;+{*ETo(F30_ZH@U=xy2u$jq9@HBU`9m%~ac-*zwzi`+oGhQ(H|- zC^KSjIKcon(X@$e*a|D|utHf~ZId40`AXf;3xfd0Tr|A~=WFenxg!!IC2bc4$yi(3 zrY4C!UnPExd^Eo%4J9JKqdXwa?+LnrDS8*;Jt2tqy0Eq>{#DbM2dt=47}T}qqej5D z6GP%QLx|=q5*HxvYvLCX=r0v|e)Q^pINc+pq49zOXoh>ppvx4}0#0TN0$;0Dq7I8x z0-yixTrQ@#EYR#^#P8nwyj~nx!L}Jl53jZb zzUoCnYrC^eh8k)2R-O7x8FsHuI)}A3#k>d-;`7P1zrVG&(YJ$9NnYxjxn!b4QmRWX zBV5+1g#QX|2g>ZY%34uvCD?@fSf?O?Yi+SjVI!1tQbjs+>5zvu)y&S$zzr8%TuVuE zn1`7V#7)uf4FwbHjk_qFa@pIV^hax(DVLft!chzqwX|4i7gn3>GNxae!W)xDT!MmS z%^Dex%E`)`&K<+UIZn!9TCMqW@VEEeoRj0pnl2uX_+=}94@nQJchDvJS?p0Ly@c`M+MgyotQ6hc$fP5YQna-7X#k%3(yr#ak}EjQmomikL)= zINsaY;f0x%g_U=>-M>9cwpDb&W7hhTvL#8YvM7zdrPS=Ijj#P+?#eReDbbSE0G(CO zS&Kr`tYBM(7S^e!DexL(xLaVXRc3w4dk~l&|0Js3!&Kz7f(nNdC=n~r)$|OYtNL*d zLk*uJsS}?ku25yI;~O%1?LaOmYt@?vpU0A<@_$q>GIe?}tvbcdxb?cw&{oo)V*Ox!$^m!Vc|`#g-gTFf><%WM_HT zX*+0i0bhK4_-IUtseaSSMu47whW&~hOCd4$^s8>__q=yxb&hoEE-+!&9*fd-O200A zj{`2naYWqCKP^bv7kvlM*83||)|~h#KzDSmXMAa=oJbNOP(Rqio)c58EMJN~iBNvi z(vG>nT5Q#}9x2t>Ths-*f8gnJ>?a!coV0@NE>l3@FpPI3&R-=-S0H`AdcWk$e7WY? z{S^9d=c(7<6oaKKUYjt2P|TfbyZ4mvzS%PRBJf7^Jv1wi-K0;s@9+ z=;#f5&2SB^MY_Rn*wsGa^7}vM&QW1MzO-Cnb`Gg|hCo+@csnAnaVxm-L z10QjEbcBDSEy3-81u6^|E(IOCU-e=GAI9rn3S(=<4R72vY1i?h4yPj^4}CKVan>iy!( zdaVrHjEoapsJMOJPPey}Pjd_yy5QMqThIdE?L+xE;s!2+c*z$?>S)wJZn2VW6{8-$LV&ebJ*(1TfEfj$GNHBktOnn$yN%u zolED$M(thaTf#?fVp=#Djd(M5AjTdir9@nv@THFt-48(;k3+>`0&1% zAky8J{|K}G;rsNegCpZ&h*c2q`Mmp{BO)ZsfARF@Rj0hGEhN7fz`0&s8sOr2vq<`H znSGYQuI~$8)ORZZAkgN^;TvbonHG5bY?j znhLj}5vHW3F-$~X&s`4>X=mq7u`so8rB1~-1}KgP(b88n&o##N95J(O1s6k_tGF>X zoHt2o)KyMfhJO%VwYq$_dorCZy6L@okR^^@JL&q~I*XM4vop{4)x%j(A!S zfe`C301d~`PHks`^mOYQ4nsiBYX$GF*my^I8kL-T&{5Hzsr9LmlVo^-vuu+*nE4 zesyNdzm@+=i0h()G=isMP0Fq%y$2s*g1lE*EH=k0RPZDki=ynx+a9*rtX?de`vY0?1sCj96-C`;3%>!2zfrHLVI4iVOUGU>FI!|$0^A$N ze=Slax%RfG^#53y{!0F>H=iVk_=>~D^f_&CBNg}F2+xP%F5Y!jo?3rZ%Fp(X@Qe6- zPTF@~qyt%dzWpDz-ZChzXx$dYf;&NiL-63i-Q6{~yLMV6 z(69G>wdB$x5#S~)NVUHgZa7U{ z+2$B6v$5ff&8Y@6Cxld(aj+}L6Z}f4+=A6EiXRflKCu4HIKd;HRDD`lvs#GMRqDrB zWo$+z%%?U?8I-y~?G|nIs~xTZc`4Y%*&!=^PRmL&t&ff*nAhLxZs>}NCadot%DnzqTt zt`}Y`$?|(XWptVWgE=gFUtYSPzpn>E=N>83;MW1n;t}TUf;RdrXBienu z@B0bkP}<1J$qbE*0-qiudG;S4Eg_fb#sq^`mM#*9&%2Meo15%WJ%nsIkp8%L^OkRP zZ}m`lj_Ub(IL$;T;Pvey5OUVEuH<_(x3`z`Hk^Ye`987Yg6sae?&~5Nc)wksDneIV z$34EjPM+lmO4yHXJG))rgX=rU|GG?YhpK zdztHsNc*~eBoa>-!KtFr>cCYDRDM4-Mi6hdGDg4OKPQK`oY84Cb+?t9s-_S-S$iG4 zF~d~X=H60*G2IU64Qk#nor2=XO>+1vZFHkKGxcA%ZM?CFZ|pzG+-Z2-UrzN?mAwxB zO^>@K%hP`sXRXzec49r4OCt2)jM(rMd#z3o!Ca~OzRIXc{kJsx(~bjaRT#I>CEodI ztba)x@b#~%%ewV7pVnSGZ@?Q@DmuMkBR~nxm0PzjhwZHdS zJns)iGgaImvb{5tMvJh12m1pOa-w;7^A(F;Iz(fkG5fd5Ilg%N&94`0vZVtrjJ5&0 zEkbM?{tjo#(HF|n&3E03BZ|iD>S_Ck-i%cQ_e*-0mEq6lRBLG!rRmM?Z2Ky9hxo+0 z-OHqkrTw>rkZ>7s3l0a_z^5GK3FWpZZ;_{ zpPb8=ciq1~*Z(J~R{*PGJ!K)LWr8Xkw*Gr%o_bG*Y7EdnwdW~jh&5UKtNwsXUAXK& z2JI;c>zek**Be#Qr#YKGWN6HsCuhbKmMxhrb|`#HDJC41U?tIs3%>5TcS`?MumMJm z-`*=?31r)3bsyL5_zTMy{l(#2`}0LpS)4WvUJ?rVt)e(yRADg37>sDZ9>P(D-N%G# zX>b+cVk!ecZypAoDdS0tDCj^+QYXo(!=?QuhI#ne&cogPO7uMr@|}+o-S4^5B``C0 z)V{%xRR_3;iHW)HwG+cWC7pdC?Ck>p$eVs=CoT+m_p9@Hetoj#!9 zU}wJ^qRe)Lqn(Z?v0f4Qev{MXb#)E(D`VNEnLw?^&=AA^rT+KzP$G-xCm_#Dbk`$5 zs+uv)9vx^5yB>yjpu>3jl#3BY2)mJ`knI8 zqwfMagypmyqns4zNKGy|xa5KY0*T?Dg9`3iJB3WNhU+UqY*l5g#dhq+Sacy^*V&Ue ziXkET(`jS22-Zelc$_a4THaTG^`<8B#pr7ahkKOI*M+%n?IkD}sf9eX8q8~`R5Xf-0c zC!S9I$8=R=67ck^v%Rx3;B{BAr^EANZ4J6m9zCBgUW!V=#JL z5|JApM$y4y%l7VXYD&>=Bg)M&Gqr9ePW3Y6Do4j4L`Q)kvjWKhrqr+hLU;OdeGrj0 zM#4~d%d|5F!T|W8S`Evy)))&ye^jMHzu>!N6G1rfsrAp$XFk}}bM{1VnL8&t47|m4 zlt>tERPpTXkvcnRgz4eNQmVC@vLqVlew$DbJ$Kh%3-k z1Na@#`>E75jGBH~9Z&NaMdI_8ZDyi7HNjSC4tgBwI{s+I`|ddjnvfZNLLR|XSA;ZM zv~X#2iJyAX5&R8qk=dMR8@)qdJV>O>%1KSRJ^e;#t-0)OcRWCfzQQacKEUm(IB9${ zgT$fk!A&^v;|CTS(hZ=Bb444td@&EWnrOzkz)`2#73&ikO!mNZGw`kx+ zM)#jWr+)+t3L!7CXpzF7|HzjA8cV#^{gN0s{&DGGSQ0P`V(Dp=`5l#k$n}W{&xgkX zDwLtgsN@}CI3`Z{1bd&WK+cYkXz!ad$G>?Wz*EiObkycPVq3%^gXg{ zI&LS{Rxa9acq+G$aRM#w*AJk#^V2c&(cSsF?-b8a7!~?vBR~ZH|e0 z>~)wvr`_x7xT))91p%3Lf=%RkZ?NleiS2z@^r@GZT%^5IN42<);_Wcb?xGX&wvqqP z9(XaH^SbvE_zHp~$K%hj1+%xe|AwZHLA*NC10UKp=;CkYNnCKEA9pAq-vAL`J1Ao` z(;YBgT-MtBAMPvPLL>#uZEQdR*J;oMp)10qE3d#nkn;)jZ0maB4ZL1ofv&B!ZIq@y z-7WPGQUm}201hD{B#vhnkoC;X$*AXveZ45SL+&WgDcZWTJ-Z5&8TR+$H=hyLH)8Xa z-ZoDe*>H27rn(R9_PqG&-LB=C5+A`J`t2HcMEQ-**ZM!XGX=ZZ2_B zBx zzUWRr0T=8KjY0f1%%S4NL6ar?@oO_l@PV0CE+SS6u6N;go0Ik_AlNT6)CQ-vF!Po%BWEnKb0!r~ zM}W${>nwYhlAMpkqAW3`FeTWMgfn3>gQtPYlDIIPZ0KsI@MZ*Ch4tH_-=~iL5@)8J zF}W;!$ZBBE8)ct+)0)zIWSRoOa4dyp`h6VU={4ple1TU^idRd_Vm;%2EssDad?TNZ zbTkuwAm6Mavg3$q$f{=pl~3lJn29dtq!-hoJ5qo9=e7h!J}7k-0<0W`6cLL0Qa6u! z@nVFqv;FY!bQoTbocCg>KLMm*D<Are+Lm7L_Wovy44yfzkQb;8h5n(h&dzdNgiz zJ^5CU5121j;V7fHwhb{uiAELmF5dY0c<#totqOXrWl6pf{I})J8`jb8f}fdMFd`3f zY{R+-8fNwBb9AaK2+Q(WnXowm{s1=(X>va$c+}Y$8#f+kx;3zSVxDDst}tU4r!q^e z2itg}(luQ0myg z?l%!qY~5l@imcWVudISi0yWm*wlGtoUDS>E0ZgMcVw41-J(=n4g0jflkS?GLWnyT$ z(6_vN^R5Og`~lClmXEY^6t~D+=M?8%4>6vi&zm8mH_;`k+01E*%irOer~u9Cr=mYG zQOC-9YX2T$9Xy+xzSzRUc~FJ9r<-NDi;ZEPX?>IhBFOBR1uhPvd{ZF%d-WG`34U`4 zJXk?!{mbBbGQlX`Sv!&z-G4QVa^((H5n4JW2t6#QIE*WK5sE6mcdmMHk#}6}lf)sb zueJDdk$=!>hvMm~Jbcd2di zba&S#_<-Zz3*KDsKtc#Y0mjtrb~{m*#U)+6+c!|tT@s2yHm`Qr-j77zdIde5K|GmQ zqOXs#f%gU0ny>f17x+*LJq?;GIT-l#`g)25xf1mO-ZCiH#)&@d#zA&fkBG2sRG0zN z7a1OE8RJh$Y|2DkH}}3B%mrVs_R^q>F9AXs=x6Vt$OZNqoIFAxmhvI$t8$i)1bZ?AC4^7=+hAycNu3T{RVmJE0N3%hk# z2+Q;pq@lZdytn9!3WI{@E-jCamIKa2(rTwc$uMW25}_7nE%EV{o3m~Ig${&}RfIolY==SRUD7<^P|5ZoL7_xd}49D&z2T>AEC_^QpNOEPDg z%UyF`sweQhpU_*q<~?IyU+BPa@YIm?n4u)7!?Gr@QYh0q@s) z1}?guim3+gJ2hUV2oNyUd&tk)!Dod(#(iS&su$~;Dbm}!T@sIrwN}OSVJP;~US&%e z_#GBy9AeB)9HvfeyNl+a2PLv<$|YjHa(`M($7d&>AXd=>iHFWqa-i*=$=9bvDr4jZ zaF?VZxMY>h)YS1lT)AjC-*L8k*48<0vcUe6%y0hUl)F5HaZkoaz+1P%d+8B2-t&gO zkIF71w63W>Ydqd3goOp5+L~C6C@Xw14#AIN6Ea z)Welcd`VhpEIXqkl&-ARisAHSXBTE5Z#^}$i*c~wiItWWGB%0~5%gf^jKDis{&J9m z0#aWZ={A!30S_7AZ#4k%G<_!-+@(126I+B=y4+b`GM7*L^GZS_2-8l|R`Z|7q|GdO z^39cVQ>A*J&~}|zq53m01C1<-&uU|14Ut*ytMpi{v4dX zss0|e6A2;}AX_?HG~hKol^;r?i>ZZsKi?kZK%PuqyD45puH@X;jE#-oZc9Wz|53s| z=??LQUc~c9N0of?BF~4t(AD+s7ttq14x{>CUbmOvvl)X@F}9hf+wU1J#|P9$MFCULNYIouoVlCBwBqDR=YT1mp433o=TljzsOIOPuxx=L#pJ0GnJ8^SzbbB;I zk3NTT*R4`qMQmM`;&uZKsFuoE7ZBzb7D)E>bvKr9U4urz8f>%#LaI2%hp&b^+B|Im z9qE%OC_A1-tAawW6P}%JJ||qrA$#A=enb6f&^LK|f989;(sxjz7l#T9^yqoN94#>k zxGq<%HM<|b2sqiw#EK-5I-V4O%!O0vD&O=+6Mo1d+%8Q@uYNl^n`wJEpCWB(ZY_+0 z#m7W`2bc8OIr;#S`aaaGiVJ0&f-`4e3tPmw?6mRg0~zcO#fT;ghbF*;rFHWlL~s8H znTIk~_)k3O15@S`S85<-qa)muWq0Xj{We+-(0zulealN4azQbVmE_9?HSy2&T+nlk zvZ0nLvYYk4)^GHBj*&H>-_${41VMTB4$J7{Ep4a0%Np9Y?1x=9>no5)tiT+e-^U^| zC!cUm|APn*iTxkeTrT?=eF5wWdhtfOK})p0c{e%*pK^mgaq5?(Y>+L7v8()j4^BQ^ zkRifeAfFzEVa*#&Jw<$JVxU5a)GDuKBqoy;$Cc0Fn$f_aKf6QbUjPy@Q|UZ=f82UL z4$%B8N9>=fd~#a?jE@PaVg3Zep@JmdR;38cB%UMEsUXo!gIgNyw5m3K5QgNl_MHYt z$%H~LJ<4i?$pi9^g<=9W-F;$?_Dif~)?<=Iv6c3=81&JdIiH-vD(ZJrO#kAz;^p;e}4%hn-73wNrd84jpkX4UK!K&WSTbHVo){~`&O~fxJ~R(~q=M^~-f`9s zCQ1B}S%ehYBQDs=d_wRW(^9-G?sCFri~!9L47_VHG0tF{01}*Zm|Y%Xc5j~l5u9Fr zi6_}=z2fx8Tq%ireY*^f2cpW}3t&y-E(V0fSpG!2B<=NP3QCE8Oz+p_Vk zr8V873zsUL&7{qa;~W?6`~6)>)z%s*Piy}Wc1>qF1N_*x7xP;u5- zKb%yDsl={RF6yoC`r5tx-$c$nq#sHT{iYSf=Q$YCL!6s|NLN4V!-lZ4&}Q`Yhk00k zOmX~^@rwD@M34Z25{o#_dABFXK(? zK06rr)x42#59K4Yh9Fxr>`=N<^rlh%3+%yX{i8%DF8FW5Yg+Y)ab>AqtN5_#5riig zI0@gLW%C_riU$6TW%^TCo`SSvZ6rnzghui1hloU=jq_oI={Ztn7yC;ahg?Kt8QQfRZ(s+~JvZi|#m0JmO%gBo}EKUKB zzQ?n(3lr6Yx+Mu$lcpec!HL>{-}k{Zddz86b5FbT!<8#dDzUML4B1^mBylqJL4McQ zv{{BJ1HHoxRO^rbi6pt0UTGH)ZF74ec(WDBv<~?tcfo_6$(OGw$&J1Qi_)|z<&ewO zP1#?2{yH)ZN35biRlbr?ze_w+6Q@=>gXKtYk8<-tT&{dzp1?b#uas+un(PJsT#iz| zXF5}t``R8E6YsNQnHN4iLs%V{OvV$| z@CO_bVC0nXBY4L7Mih7i{_1nE^;dA+j3l$rP(Vc3QybCTk;f>)cqF)ta4!NMb4}PB zf|Hf!u#u_H)8s_O13RhrzGe}vHEsr^klCn%DDr)YZv@!uQd&l|fByxT6vJL*ER_ZG zqoGFBB9g6d>$7iiS(%Lb`q~FlPVrwNt2-tC1F0~(%pGQ^dHN$GIJ;o zGKR9i3)Ib^G}KgkmtoCkxmLvw%T~eeQH4$>F$ojM!7AbH{z3Yw$#+S*ePbspFIvU< zaoDWhVzyxSo9A}}=OVzgEvBEjMPzNw!j~I+nY7vnJo)gns+u4(Zxjc&?SOH=7^Jax zIgP!DD9R87@>zmZ$E>u%Q{tdDhtQlV%AfpNt9i0qO`34!Qq-GHScZd3@Z$3Oww5?0VmLSM4+8zMa(_lc*`c za@g5TMY`87gYkE09Eq`9h*4o4;nd%GrZVxBaA~VbA24&E(2oU08IIfBYSFLTNma{Z zCeeI~qYsS|g`7qgSAwcQG9lgF-Q+(8=Iq}HMV~qR4_-DP?`tbAr)R3~<6ZANqAxdH zloe2L_JD=uywP!UR1&x0b$N*ua6yqxnse_P!j>(x=YN#Mx;wlzqiQ8lk~&*~NTG03~}*{mEVvy*qCPO)3%NPK+JTfLvQ9R)INI(~Uuh#~*1I%;Hc=%ylF<^Z7o z!guRY`!H=>y<}&+Ycm#$m{%O)aWG*Nt&~HGrc8tRfm{44YyuGmznfrFQXdf~1XVGg z1jcbO_=CeivAZKWjOEZEI$l^FZeHKK&62TDQ@DEwZ!&14%518KNZ~`bD;M4I?Qqf{;MeKWksr<-BA2N6 zH7=J5JXn>6EWbR3fjB|UX;98ox<6QI?=<-86D*q@iWJJFOrOg%&D``|asjDAv8Gh9r&c}W_0FE73ax!aveS8m zv_kRLU+jYf1(sd!&5W2rI37{-TqY!Q-FY&rbkKkvGUwHfv`L9o)CqU4^ZCh3{1xX( zTx)`SxnJEq0y>Q=l|u^jwdeNw_fCB}c|ZL?aU_`}QoOi(cLDhW(j}Co|K8Do%9)0q zkp{yjCyk*sPDUo@V9yHqBXm_zRgS2CfYOKTf?gVQ>*Bj6v|-qdWY7L*aVM5Q zz=}?@<1V&4w?J&`-h^|rYaCEN#J z?Zqy^{)f9QjnZ89BglZG9wxQCf$!XS^mmNi4x zW%{(Mm51OJ--ar%`}?vBs>{WI$Rg{*XvPN_aj_H-bIQ+B(WS*F{Xbma8T``|+8SIe zdjH^NO@2KWbf;ySeHpV1rmUkQ43Kc=W};wQ@Nag|?%Hbu^8spvf z(-9R(x@lOa(A-nIF2I(+1@jA`fipDuBIEl<59JD!n@V$xrz2y@*K74w2c|1PAE<6R zG#M>?J9r3Z_D>ZsYBx>U_%en76bW{*$sSh$hA_u;1NRY|+sW$8JAKZnu3K^z6UN&} z2p2RSYi(WtTwI}7Vvnkikkq$^MW(41(oH7V#?QO>nTD>0?Uh{;HwS0`%Sy2vlfRTq zI)z&cA7&QFXfr-SZLnkId>cNGpv;&?C_wg?A;HK3N7T_o_il-VkYy|NO8~zD8X(xp zJA+qSU3s8=vp!TM@W8WE6}Xf0KAcm@OQQe#bxZU;WaDiO!hG^D$;vu0$+oZ9%x^Rf z`l5-4CX;)5#Y$A_I zqVGF=u@T>V9?m>bZr`^FyZ(&ZWVZiDIkXuHb4AyDbShju7Xajbis z4A8DAV8wkmesX7}F#>0IHVbttdnnQDg0Hqb15Z{|vpXJL-rE8btV7yq zoGX8co#*SOi&$|HlaZ6-V!R)ftRMQt6w@p$ncd2v?9j<>8(&`o0e{vVr zUOYGcgH-}<3}#N2_WHR~sF5#!pwepT)mKx%eWbQT9sP^wTJQecaVBEkFaKp1xeuWD z^VgifB$|yRzHGN&4PRGt?k6r%%tP+KA6>tgjuNaRgi!Ai(ceZ}W#h#$AO9vAPNlSg zk1@$L!gD|?AzH?73a}cn#UFcxFZOS5fi>j>_kzmh!Gw~yek6$Z<5_-f` z{CN8Hi~6GmcORGT9GmECL>bI&T^V!nf~LSMR7siWMZ)^`WN-V+9UClQatM=xB@(QT zi@PIF^aTY>8{jG?og%4H^bR1BU4WW1=G-wl>TlGVLjNXxjFmUaidO!S9MxPc4uQgG zXwzLjT6{na%due7#pxLZDJdCg4(SX5l>O{bm8LbH%n|h!XA=<+X!X1hF&e$4tM_is zz-FLs2YC~7_+S-~5bgNV3dfs+gd*X7g*;#qJA?sw*Bg=bb!^)TBQ^Gcwqh^Sku_yu z(uwU8XYOVTcN_3;?}$h+Wcks;FvW~`@3Jtkq=Y2tJoY5noz$34Y}@E-*_al|7^dHB zH}x3oCe*!yQDqaJ-4XgygE&n;)LsD2Fq6Y`|0t4fO{npdaYh}}EN4+Y>0fP!>AO!6 z*$HRTrWi}{NC}3QHi;%0NJg-ru?ShNos-t(WX=A5#|Qh<%!m6M%#IU+(D986EWa>q z*Ez5sxQ_+319h~2mTtK86uChv!7O7DNBjQP18gL z{XDM*y13n_mKFbOUUjP%nPsce7L7UIu#Xg`)9^Pt<>Vb7`~9zq=k|E>9tYNxf9P<4 z%Iud-|H;$_w_S6m?P`6cATe-dsyau`Q9Ji5I~R0w%NX~0547CHt!aKcHr&s`Mt8jH&ODa)lO zvb%s96=7U+;{@OVj{R|m}-0s!3Q%SC(+`22k!6T)zg&^DcV>fDsqvy~6K!5Y%itO)~tM%7_BIFCG|G0m`b%|cR=vBy}FWwi6t5C@=JU@7Z|=mZg9| z4VQyK93gLS{ykI(WIIIPPUb724Mi`a(6C3*=f@j@MN<1w|Rm zjgFdBSolwf>c}uMT4!O+cgmgmj@RPihw$cTf4G0lntjC0_GZ`0wk|@% zD6QA!^|U>IW`HnX)>`=d0fuU-;69p1WTdnA51*DgSRQ2u z!sZ*eY^mpAgko;fdXxG3MCv9rfdYpTF9l%Gsf(HmDQl}3r}>&Ob}3GmG;CSS_6%G5 z4*y8|x?Gv6PcdtxnKaIt2!l)wYe{`TB}1{{HRz^t(J<*xo&cjK4VPdEs(L$TED`f+q>$}ns9#Zt7}HdP>`?!mnt)wdz$qtv=XmC@2Qdy z63{}vQz4^Tro7Vcfk~K68%mfjhr~D^u3(%iJoJ%1bKczct5jp~wf_cNV^_3X351NK zBxxV8F+mFbIHp_{El<2mlBoxNPl4384=_Du6^`u%>o#3rkovG zN01xBMnBpw0beWHgHt=xoGhkA54CDKTpkg;tq7#T1B9?+>Y}+HyF>COsW%+x?$%iI z$nlj@)Jt=_Dje)^^?67^@tgb|5$p!Fb}d+Zl@tnhZ$eIwrrz4@doS7R+;O+>i^j}v zN2JH62s4h5h`h|ws^87UIL_^$Hz`-}!xUzFRFPV7lv zXpTmT4J+AYzmm?6`TzvF{+LvpT+fdi>|EK_7>f8kUWUYpvv zE0Wf>Hx9CJAnMF;;*T$j@KfEMe|Ewwk?Mcp+ppP+b+4;pjqg-x7w^(dt2{RFWtTCI zc7)-M`j-<8bEVfqUNZSJ(nO?W3!}(S;DLmoX#Gj#Bl+h1{uHTY;qv9Azf;JQElX$U zBHX5vqXo&z;s6?9pRyg_?=YCB26;C>w#07lgedBa;;6-HYw`MYUJTl<&Ol>C^`v*Q zpzyr`8SQ(Rbn?nROz0rf`FgF0kaTJ5;-GLeWjJET)sbi`S*^i{BPTx5GPM^LW)r?776 zPc5ZHSGq29dE0|CWCpUEqg3oVHk;Rw4qI(BUj39L>~-*W69RVoC*IKiz(~-}%HxMf zja(n(X0fz#i9}sZF61el%v=Or1lw}G9XVU!MHZ6y6@{5h?Irp0#h|Si4*)zfjmI+f zznh!$Qvq^OEn2c~M;eKT$9{|Mcw5so@%`DUH%8cZpQWZv z!Lk-FBXo)l_OzoQ#53^Kxy2YS*XLm^N6CZkHu%cc%L|BY!?FL<4xYNFDGFEN*CJIU zH7h;FU&d1mH4L6)+|`IXBdcty^10_WXr=Fp=qpud8-;LVRvX~$`3tDs5FPc|=P4!4 zf91UmvKQyF+UXD6ktw{ZB;jRMnY2ku6AgHvSDlzBb-vn#lE;LCAKTjMM$s5;u#>n~ zBUyNA>#7IMW$-Jf`k38;v~)W_3I0|-x`7Mu$OJL3%i0G(*%yaoMGd%E&SjFrwMhLG z^Oi$$qs2H12~tHnYCSJ>wc{-6)*1(y(zvhZdF~whHkni9O37sgy!SV5Mjx-TNO)%Y z%4AQszkFLnB$jZjmiLRk=5RRSge_@)nM0yOa?0v^*|+YaDN%pzm#RMqv0EA>Nc|e$ zHC?dryzg>>iG@B1MlH4~kW(#b<8?MHs8dGTo*2)BK;tMb2D-aLndH^cJ=G5m6})a@ zKx*b)NpUhs9O|xvvf`aBua8s{76~{}#b2O0A@BQ4;Ok1$y{ESJ zbSmyG`SIcYd8gM+Lr93^+H9}f#%fN$jf2YsD=1DjslZ_YMU-AIO7qVF(u?orJ^nyf zX^=b6ORNE>73&`J9vWi$HX}~lEA{(vvMeKZ5V)}5E}0`jj@iNqhwpqK`I-K9*HtWd zsTtKX$=%j*%0H(P^?DLm*oF+Zlwe||MQl#%&ErH3@vRINMDR7tg!*UX*>R))9$=gp;bd5S$CRP`dnpW#@ zB>e3=G1C&$p-1dPaL6-vJTWbTGBpOQ%bscvtFKN5kfj}dOE z$|%Q(hlI0IT=4XqCQtTwLf)2Nk!Z`0`Pv-V`wG>60t96BeVdVM<^GYm0D^O_t238C zLC0~o)1T}A>#+O7UmY#!3ZK|9PgBC^f4$946%hq1p_yuClgzYuDGMrL~M>xtN=6TbDQw7a{VC zQza<)wdF-tzc?e?mEM>9Qdc+hwXETSm>Rd=w2u}zI_~37j3Y2saUtRP$$Z9O2oIR$ zB-sBfY?$&O9KN)$74qln@_d9PS?u-J-*^)ITuQ}W$vO`qa&jfCi%8#K7Gqca=~bj* zvk8l0-?k)Z>*T_@d)6GKkDW=<7GIl(LlZ;Td_yvj-tKyt#09%krk8W2C1B^oWGyQe z!GRdBxLCDn^w|^=6m(%J!H*etzv#w0H1M0e)2YM2RHrSp-vUa*1@WA>p zNrraXmXV3s9}nZ@e<6(i0OpX=+30k?S?>@GEtK8Cp^e&jySaF6g1kW<8hDLgjtxxS zo^`uCptb^4k>}m5kZ{OM&Z{@kUY1IUi~n0?nu)ia4X5)lsuD0*jd^jT&{v9&Ng9o> zUBA1?10Sd4&k63mVrdXSZIg7qSw`BaUtS&|eO2B{Wj42#N%|zX-Zur}*pAsy6 zG^uNw5wozmOF7G)pr>S-cQDLgU^pk$bBz3&VqZ}oS|d=O0GARXg|Zrjsr$opVtnfU za8qcEu?$Mc0>i!uu&k>7y2H(=wsnH%S=3$a{{z{F4nvhLeo1p(WE(%zg=O=9wS}Ma z20qM>3x>Z;iP6!8dnnjTkORE~-%h&7kJYNm{dFnGPAMo%9!wxUL7`aWs}Pg-1yOxw z!jP@_D%950uImv+7ei6F31hZHd-@4a^TaDKxFf_!Zb4^H4ErDR`-$kIKk29ZD!@hD zVZJY8m+!^I*?T~j1j%1Qa6$r-Y&fJp@Q#fgN1wH{XV0lcko_*V=Kx&B7S7 z_?Mr3H(zpA$4K^olOq!4>^W1%%o>@+LS5DKS7Kx)ZGgH5)})p8u$^^`tv_Ma<^Xq$ zw4ku~k=$TpC0=_+QKbYRqI99;V@aS-#w~YWPWL|vp%3ACIK<~;y?ur&$`iWhj*+N6 zUQ;^m3m!LvH}=NT?MU?)r=P6ze|2)DsAA}kTW#HM-AnQIXhdC$yoeQy|d(-nVMR20OznOJd z;OA1+XeV7USQ4m{;!CB(hW+^#jZP>2>7#OYm!16T-ZtDXV4^_!n~z6uo|If^yvY6V zVDZn3QX6TCY{ipQGWI-dI>W=AxoqviZ#0>l_&tX@jq!KlGQU2L{fb13h~`tQZ~U>l z>lj-5r_pWhXLO9>FASHHyyaw~Bqe0p_yfX6O_rmBs0 zcLb%X=9=UL#J=>3oY-)LzafW}W1QKnw+peckp8YmHrL%xFq#@37wc;~J3Cyk-rGK1 zdVrVtJJH9GK&3zlA>j@><(ZR(SPqfnH@+B?4iEO{EGP<^HZsq9z{2!=xR2xtcpK+M zEZFKdmvI!z>+D!tb65aTke(gM?Mn-+t+e<)@MJLy?EFaikC)$hgR(Y30TH2FO)1a6 zu%29Y*`6idPu6@F$x1sNAgx)*~WkZ@MDMcA$Zsr3=*NIEt zq)PwMH0FCIouu%K_9|60b;t8f37Hvu%tYFeqRp5LCpYEKS4?H#n^pYiHp5T`bUk27 z!~G{HF&x&IaV}1{RE6Q08@z|R`ui~SeYe9?;3 zvPw6_(SDAZ7Hm%DrJpyDN%C{9*e^Xvr`F-{vWy{V_+Pl537RnHImXt$&dShtX_sKk z#k)jPnTNw06?z_$s_j?5Gr~q%(`o%Nm^MPB_po5(%xIV7*npac&s>&3#VUntamL^%*${{y`~V)$n#{ByIT|5$ZkphBcOnR zY@jp-3l@?HihF}0ld9Lar!XQHIQ5GxNE-2JYo742SUJkyg&pvOsCJVTZtOI^^G?km-k z8nH?4B5mr~pJG_JGyV1cPdOrIbL5Q^J*^9k@FeB}ioYYlk{isY7N~C)&OAow+Cajh@V^8PUcBzU(S(W3j z3h{i{&DYr999R0yokvHi=B+t@g+0A*i37b`=!VS3#toW6LUC*QLRT5|4*BX4Z75ep z@ZvgtzuYM#yGaO|a}lu6N;;6MhIFvfe~Xe9{Bfflcb1d2aIEbkF@d;)zuQhp#4e*q zLqQj5wAs@#k9kO$+hy5ep-i>(z`c^r6n<-ha2>zN)eT=`*eukb4#sIa5)AHPXWnw0 z-U{+`95Lfhkdif#6;;Q*Ps~M5*9l9qOxGOPa1>af-9l~ogA>CRUGsonv+-R|{X=&z zkscNzqvDcQ1qp4bhB%CN&55e^!jEZs{l~inlbD^4KB{>JDaaad7Dl{U0nLJ~Zf|lQ zcPOi9zyTGV_c5TZr#Vo4qg`9rkYW95ffY`wdOyQxl*8Zx=3%<#&*1REwt}4w@L?uS zv23Z9E2c=QmJm?2PEk*L*aK?StReBANaH zknYVQgN4C@4r;v9xKIs5G=rJ*-stqI3N9*w;c%VBsUVfKFHYY&fP2#>A}B_KSZwpuF}>GTsGPz%baCtwN=tHrUTQMFWIWI`pwO~zw1nAS5S*S&D=TH0b4vC zsiGW!^NuGcOhfP%Wdb8qI5PFMzidSKD_4J~{xq4bK2$^&=&!^GY1;NiAPq-`@ihP~ z^W^RHq)Wi<-7Bh{ohD^OS-9Q&!?JLW|H-8l-ia`XAtItNwN#v$z*^i|-ZF((s*G1* z$=F<73$6^OUV2xPEq=M}1Ceycnj?-<`eNpxTd=1p+g2Z$_vjo2ji>|n7|9bNOoyy_ zP6`QiRaz&jJ4E>8k%F5aw6O4X7e*PT>%v5uBgXHHoo8s#-eH z?NgnLPOvasO&>~STVm&5pdRYsX}^-+Q59RgyT5@Oln8RNEFf7)` z3J_2P_id~|_dY%&94Q$+|C^d%8iV7{7Tl`)eB9`__r&<)|Cx-M)nG@iA0|a?B^?7M zR8`3l&jr6mCTtFT`7vN>`=-G&8zL-ZmSwJqHyBofgyiee{?r<|^W><)?GcshD7B%+ zqxkbCq@Xvm$$7oSf0TlBy!eG8@Og76rif4--S&X_!1^U%drvnyAkTw0YO%!Hsm5J`DXA=`(G| zP6Q?&Z!8xn_liqch*WMjix=XkkfU@|FONEt;=g}DQ{F8C{Lo84$8-%f*h>a!2|vJq zdk4VkU+{F^tu7SEP0@f{a+w^McB}v80$BeDkkz-<bP%plnk}IN9LI0m6}R#C>4zjfj#0^o@(4z7UZzOffJefd5|DLCyy?kz5;>9D4hbsW~}bF zjz_mSsJ{Sv@`u@Mf^Bv{v6j)8E#VIR(3OnG2|IaXQ)txJ12w z+aAv*$j&d6omZXe4XaXZN=goFY{+l*+LH!$%s5<)PKl3JHGdi#g8lZi6u}iJ56{f* z{Nh5xqQ6Dn#^pYJSW1^9@V!#Nh6MV{r70;$6N3{UL_JvKj(g-UJ)Xe4vS!LyYM_@q- z?W+eWA7He?*Pj@5NHK(67cu9++PvF~(Y$_M{lF}LnzK$qluwuemK7WxRuUGO)LPyD zw4*U-NpFq8EG!$5QMoKY7wV8mDp4<8U!_+cW9OtbQ$vhF_j97O zwaoYM7kAd&HJL#AUk1y~m6b*^=A}ir_ZcKCk*CL`7YaWf!H(IQBl4xahqMRdwuckQ zA&H=1(v|HaP$ewGDIhjr3%2dkpTjS1YNm(uI~`F%^~E>A&Tg}CM-Vl#xx3m9KR@-! z)V1$Mdk|j`J@SDuG!Z*}-t>Z1^a8K&Rl_{>AG=D-+iJLuobz8HLt~ zpi>KLW^wS{U$hpD|BtJ4;LbFPmUQf|W81cEbZpzUZQHhOCmq|i*|F70Cikwnn0f!g zS?@mU)UJB!tYbUxy4U;k`tyg7;(IFRW7&IulC}FfqV*f+Gt2K25qOXPEy)j`{OVZRJc7=CH9`Yiaj&ojufa&wZP@3g{96jdz5$d@V zjzHW3y?k@YrL*?=Rr54hNZc1%I_!a@TEa%s-(ruYv{OElopddB5x@%b65`;vFxu8= zIpHmXjD^CWN@TBwjWO|rfgAQ0CSywdJ6P!Av5k)6VMW%IO(n#~X))dWt4Sh8cpOL- z21IEu;Q1Lnv0Qd$568#eq$^VKS54%a%E+`33fW?3=FV@rW{GSwMy(Y(q8`E}h#^j@ zoKoW1k{HgA&O=DQlQ4(FqIO;s7aY=afH(EB_k!z38pdEcv*U}n{*2%DAge_%ghkw5 zYlf{mb_X>r*x7?1cF*0oJTg@-%~1|Q767_H;j015P{y)g+TPyo_1qb`+J)QNfCa;N zeEHaHRKD>U`WZYu-Q1sDY+epBP2pn)RxFmVF+T3^O{3JRIsKY|o`@6~yAECCE@{@?vz^TAki(d#v!RqvV zW0@-F0wtGYDMw_-VwqvV3bG9&6e3?QEK|ciet@*_@?+bOPe2?joy{%xE35t^3Mc_* zvStNJx5SFtLBs*znbmKp!821vfD05E`NP`giUL%^CK7_Sy4Zq925;-bbY2^EEOPJb zd644hU@H|mRGr9sOhyTOSX9wXUhagc0?#j$7{_(8&7sPi*y(c^!)n9kB=@Xx>sPB8 zhbN89(f@MW9FM5kDv@ucLx1?g5rc{CsoXTRhnsn%hR#}rRQnHTbv0o+OcKvd;Zh+b?jGT~ z@I*fIaL;9T=id2Aog~LobSKtzV?yJOxC- z=0X?J-(E;y%91JPBNOaPYP7>I*6|!ke#7~~N)~G*n>0Y3M4$C5cF2t$g0!!gz0)I8G^NZ7XGn+6Z<3-#zsY4SX zNQH8eRGw#!@{q_AP*#74uQxvf*Q5xvMmVKY3~WqY+kh%mwckQfhA{6SXJYbMB|23R zY~VhtxreOCw=MOSKRxKRwpFN=!qLikGt?(N*@Q|~w1msZ7zvsyLe3?LoIsX7A~13G znIytxIGDBDX}_EG{eF2N7Zwh4;6$Fx$jTWMw`52h#AV%i5UJsRom(6Ys3p!`pfVoj zfLT$!Xf)KI4}5AoHuWSB(keXPARRlg2LttyjpzgnCWBxE#!@l9QAvj*fgcebz-&cf zML#-Y0*L3;8!Yd3n~=nYq~8vBEM`slVYrPvn`F8)XZXJV8FXc~U0^1}IvD;!?#U}n zs+NDNpBAs0p__EfPFJu_9l~mHg(|i|kLOJiw$m&_&%qs)B^8TtRb~?l`aBrO^Nq#( za2$@DO_Z=qL8p_|Nev0V5tm?Go`?y^E z`FeU9XgrzzMyiLb19k^FOnysZV0g9?Je(gy>F_CJ=F=#&!wN>zaRJoLtb3B1Z){`i zD1yi}y?$C~(prTQLRf3(x^YM8rdM;cDym%*Wi`eF^(~@Fe7EO2MwbJ8Dpn67SB(;E zPIV=&*@H!qLD>|b?uN%#_0DucXhJlXiE=iBGkl}&AQ9PRTY%dAdjo$JJ8-qvX>q7W zxhn|&=3I%bRO^uBE>}TRw1(yogVC9D4gzAJEKg{w{b?10HQyzTbxGfItg_N;yB?3e zmSV>9ye>UgAgjU7QL8b@yA5_B2&_C%(jdj3aO^LFDVKU-&F|xNWWC5hT=LIWQMY(2 zWp|AKdoD0cW~-S)&PLokGfP&9`7>CIh^!`6Jnr1ZhMTO@Nks<+aX?yRP`wM&x5c1Q zuaMIN;({bv@)PGi@O|wazxNsNx4h0vNTk+!0mtJI%zuFD9(7T)U5gja{>}$Ye&l)o zFwVYK)P77GRdsQ$BUNwrpW81prl;T6yI+i`j(Q$%E?n6Krxb8fPN$GBs$NvauZ{|O zd>IcmS2C5(M;l0P{Iu4}PDNQ!?p~Z&hjNiVB4VIAq_IhV1x`8>6QbU*4!%K;1v%=||0W z-v{X_o+}rrocB-_9w;sf{R7j5qap9bn#F7=jjGCG15QMU2{gePqpnK;O4crR4&mq% zBd!}N*zX^}z5BTo=7>&0&Ow7TkcyJ-XzZ%g#Dkh2xA(ksQ{R zM1#HEj*2V&RKE7;5Vh%cy@0-ao?&rqt#nZt_$IBk+w1zM_dWS-$%BV1+w|j=Pa6{w zLhMIoTCOL(ZfBCER6BB7cj0}3kQxa^RqKlgv1PRk`Pt@WV6u>dpqOS!T419ux$9^ef$hCqc!WNP%*Txn_F`DW~0tESCg~>veED8)i zx@O)>jzqJ{5sX(dri6Zh%ErG1x&HF zx^ElYpn+-Fa9few;e$>T7RVd|sxs#%4Y{slRCIH9+Fh^C_5d3jowc%ZvU%Bh>4p+r zd|Ik0E;6T%pd(4omUmzU}bboIgconqa@&mJP6vm2PaH&d#40x+r#L;vZE>Ct1aqU z8m^h{UX`CLG{|TVKJ&MZK_?1Sh3)huoDWhkakSULuxO&Qv}eD{Tw1HQJyoeq4yG_r zgTi&>aVt|SXztS|ZRn(J!CD+Z8Z}VD_`LAaLT{4$mslCIa5FQ!)*)9rAf_Lk%N`nO zJZLa#{)iCB)_M)3^1lWPBzE{rLxAqv+aL&#YMV9OW=Vuyr`gNAlqW@%Wp%iXGuQ1i zUBS!g;ay2p#^zXjQ2$}SFA#MhXJ423IIs9TGPoPD@nNyhG4X*#QX;Jq-KLxH)R~?= z3vD%8!|vys!B7p2%Afo%Ex^EdoOP>5upizQveu^4ad~baXQ5Hj&3!u`Z=?_!o82ze zqG%LdGCwrG4FWSt)2Kt;=ifCXJb#y;gQtVH`@fadUa>B>_gCj$ueZIsBDY}<`PTw5EAfbKhm&hhk(xW*@c4Nr((NjkScGKG~t z=yTvmm!&s~Uf==iw4?Yh$P-@%bhS0SdWGRlNquIHEh`dmtc3}^)itr zXczAhRBDN1W*PRIgbt(WW-Eb+>!riB-}GFI%VJwfk2iX%g*Nj`GI@w)2&6w3Q)tE- zkC3Z>Pb)qWnQlvyWy4TKgwc#~0SD+J?uGi%)N!Ier^#jpxg-LpV*<|AINT#yy4}Q* zHEB?kqr4r+T5uU6{4b<nH&NWN=Z+6O-+QW$huKL*aEwqQOGLZ95=as(PZ7LefdGH5j-33IFD}R67{R%NMDRGg5lw~GH#5)o7q=ig`242|Kzx^FGDQ}!e0kQ}?QLjg#f)MPJK?E%6 z?R^eQ>x8oBP0=?WnJI7Zn{&NUg6}BKqNYBWW?po#Ryh5(WSL3fQhbxU>LIcGA1cr_ zwbB&-O9^5BSPE4lmkh2?^Hq6mai!*97@qLtZ>%dE`Icc7D|Iv%6D9g84n~JMG*gg# zK+tn+6%v^9MW+sZrAUUf7?Kheu9vgHMqoi*C^HC7P|tiO+6PIDQL-~(g#_tX(%Z3h zPd06u-+K-}KR5q{Kj-Rc*=gSHA3t9Q*+~hNR1Bp#H8Z(_MB%-*Qt&ceUAhYu%ww@p zj(-J&RH55i&AO>F%k!Dy7shi@rIq*&-MA`Hi|XWy`|}jIB@2(Iu-hog+eMNUVu!6p z%RsWl`Oxl^H^gPcpvcK!I_uCp8QfAR7}wbLMJ%{!#y#k zW;Gkx+QWwY?!paZz4~72X!hcx5;@)*Egs-HXeZ#z5Z_OeZDeDHdQv39UxS*?DN}*q z`1_=Q!PLS7KLND0e$G6`HC?z0*IgM+ICZNDR)%~GvIB(%EI|hY#+nk>m{JRfAKx0= zt8}D3szw;S2#z0yoG@J#Xrdk?<<}$j$ftVN#0ztA!5_^>Gnr=?=6zy)scy~jCm5T{ zA*#zukFys~Jh;#ZK(cfANS)Q05b^|R;SV}~y`pc-cJsmuvYdEcWXiC+VeHlY9)Y>J z=Zx1V=u=?SML=__l=ia}8R@UuE5779pj(lm#N@I13Z3Kd?(GPbQT8 z#o{ly(irjlv2q$gw2UN%cN2JfdpJjRj=4@b_G{JMxNdbQyy@v$Oej6*WaUJ9+Q_o> zH);89+}<~2A#ouc^~vOuIKGd>Hwji{=?B3CoffGiWEyTvuR2^QdKk77{4oHGB@Pf<8cXt7n`hFj2=s@>|!^t;kO3M zwO<9pO;dp4(7CiXr#I^)xWD7-NI#G`*?sl>sTIH0p+7*8QzA$lo8B<7Ot5GBab0Q( zcFsiXi8p^MSw4r62NzM>3$`4~jH{k&9I<-~r~nQiSR12Dm{Sie_-ZTLt=`cVZB9PIDOd{u|eH9e*KPuI!MWy@k z%){%-^x^r;(aC;;bwu1S82_1eP>y+(D{EDyicSqRX2$%TF~{#k8dIPtqg8Dhn@n3) zEibBqp~5RbB#yy}sgBYzEfJd^3k!5juns|5L9gJb69GWQUWdcDngso%9K6$S!bF7* zYhZ#ArnP_xX@keJ)XypXv+d94m3;&6sO}jp(9VCVwl>}N^Bz5|Or(t{m$?Z(kU#CT za{c^hawm<8=w_9sp-C=6@nzx-)X$&x13J^ms>6nCN$BWb2NCYgV6mI)?5j60ppGf` zz6v$V_YJ}ADDQ!+hq$&OVjsoj*w{@e|khY@?WH3P?0#eg2yEj2PP6(mBo2#m?r z`iR;GY~PfOCF`?A;I3aSt-2GXOi@bX(>~+&ZvF;a{@k=zb-&&2V_F|vLUyF^E_Rkkf z0xg>cy#S%cx`c)f3Za%zH_NycOt788?*WU zF#I4@?4kOQG_Ix4m}ZP6YTQ47V?l=c-B~`FBNCyo(bRRdT@ql33?))&kzYAH5j8n^ z5vYM^exaI_%w0l9Fr#!(gEY&a0<$r%YPNheB1)a<`v8MOxGA)zJ2E19Gcph@f+*KB ziYg?Vyq(PxZ-gH^{;ngZ8ez`EapEUuQXe)|+BfDL$zDJQ^D*KLok`Vg!QhdN0K^J4 z72WVNINL4`Cy&Vx4%?c`TNW2Nq_25ex1anxFB!u$BI* zS<)0Z2#3XNRC{)5U+Tcbc2{?f2C&d1qk1==%P*(q2XXdZ$>Pst`m+U;r`H`@9MfyA zc8@uA`)%egh%L99tk+sicT@R7-ERpPT%)50qRn+64*^>yl@iT3%J6&?A;0VkzeBO& zBE3I}QVFbWSf4vSSR_{x zMcE$RdoS~HDMieQ7s&%i-cfkTCQ)rtcX;b1=if0@<+N!L#Pz4iR||0>QDY_c9xL^X zn*P})r+vWkVzfQIxU7Mqu#bv*-*o2Dcg5jX9Y$>6%3HvISV!PqBXFoqMlIhviXKss ztsvuK7TPEn7L|;8g7jTjw$!FBA9ycoR~HU%+!Oa3y#*HMA44FIF@yZe+|#cE;5w1X zR_p{P=u6S(RGuIu?~sq;qtwbhpiP_<0L$HTF7RzXg;Y5a|3wN|!j($rl% zxV|t`TttFRHp~!_Bp)7>i@LZQONITY+VpU2sOl&Vj%Qcz-sbD9j8yQh z$)Z)-a>36{^sBmgfNU=JG6ZGi4yQdn<|3EyK^m#z1t`X2mk z1TeW-sB$b?XRakX`!wltcM?k7&5*v zw;Dv2uAGJ2dOJkELORCP(1uMmv+`~sOs8L!XYZMWnHo&i_}W+oyPF6G zy~$=)zK6Hn=o*4{c}T-8rx2{U7^x4Zw(^m17)XpyL$)hQ2ju;V!eF=n)*99{7nu=9 zgUD| znd!Yb$B#<*Ny*3~;Hd>0wLFj5B*lShw96*jbs6ScITOkt0icPgK}Asz7pUK=XP)6u zR5fxu3BZQ1Rv9u$XPBVtfNnj6Py<1_aFuycixnj>)S?H*hyxBDi*xhIY~#{Ge%b6q zr7P7Ve56)?^HA6zWh@00VBu!!ogX~`y>>{eITrmw%|ByPU-8wLY$VmL{58@%_cr9N zy6n{RkKl6AL=g<+A3vDnFHta7#*$1*6LJRg>8tYfkbS_wIm6#;7sI!8FTbd zt@^zK?8?4oxVGjQbPGlr2+_>NxUj+f=?nJTF(w+|Fs^vHC?WDvjk=RG>Kx4X?E}M} zPMS%T9KgYNzxt@Wd;Z}Od$|gjA1G0_5po%s^g}2p(%zpCg3eN5^1O-4yUqzvGy@p0 zZK~$s<&F7{k}|xg-$+2Zs#4__$OU>q0bzvBa}CCn1EDYxxT>$E)nj3XK#6TRg#S--N=ZQy>>SMiWPGap8D;icPi>gFf5jibIE@C3pkD%mY$Djy#@Oa-ICKDs(Sj4M} z5#y;T*BXL`s(>l@O1j@D5xulDG#tT021rwYCXhf$^t^{TmoI)NT2Wb10~lAemZIbY zE08pmmweIO@qTjS2c}pMTjZB9E)1OW`A_ae`j;CuyWSEk)ZdYL4*V?Z=Flv}udT*I z2AhY@L5IJA{Z1IgLj?nV2AHBOR9+1H+*>ncsa?}Om+H}-PD7&Svg9H;vzfLg8euV* zI_Txz1jqCppd5rCj4>l!BVkQVZ+eS$UL)nTj?rqgHqn>+&rYEB}3 z{I5}#;M*7gx7am?lj#%o#OZkNbZrFh8w<4cB5<&WF;+h_i|RcY7XH23Ve_08|GTBTPH%K zaa7FHRMXR-tYeqfCiuGLDwJ-HJ=}^zO;lMlib-OvrNRM%PAo54qYvFcZD$IRg~bvU zh@p7zOv}Fw%d^wS`i?XQ8)H<<Z=>Ub zexsFLzJ)LmNWrqST4uWF02_NjeLtB0R&QrNP@(CT85L{Cy5d);J^-<5QPfE6+^R)q z-QSE7PYXJ??`AjHht^!}Dy^oMGgEFUAa2b~JCF+hUk{0d(RYFI!kPooBJIiKIzf|k z^=Zo(aY}7*O}S>OPj8;5F7B(H=1RK1_rDQb|H_zQ`a8RZm@&-b`Q}4!Bf4W>5oEx) zmVxz9gp>wT;y*{qyAL>ZRW9_fLApn+s8Q?D9UptRy=jPpHOkgT?xa7qprLwn2auge z%EBKrTz|M*P*Z3{DYD~q8Sd4K7p}r1^@oE10w0MEKu|spf4y{Ivez&4V9sd zNOIkisy(bCp5Tl;@IbS$7WI=g*jhOF1$Fpk^Ve`l5g-S(MDo|wq<*uIF8NZs4jGto z-pV>tT}bwktNuvpN`yf>fA_|Ig@I^RT)KgWuNquy3_HvBr!HNTYgc%KY!Z@KF4$v5 zBfB^d$>Bvn_=GZ8M>37_X;4kw088vU1%YM4)pSqQ&pCk3#|_C&^3lUwjSD7lafouZ zCJhHTJ)-_ayxj-^YiZWU=PvLF-AogCZPvLmMqkS0peAvRa5Sjbysnccx<4ZdWmU2` z7L~~pTQ?v{%&}f&f{0I90f@vg(%{u{djBm&IuLHE6Cie8I_rj5iY20FyVTIP?i187 zEVi*AG!X_b6+QfkKa#*D+?E^{nMZ+flLq3m0SR7O;%Q$$s0<4MwbvXa}FJS-14s$3hX!Y8X;cu-jtvruH5egGs|S%(&y zMa9y>0mQvxuGWk`3CsUSpn;59gfW!U-)!Dzy#l!B0!0p+s=V4j=$dQKnCmhlkvoig zvWe56!&1efXi;#3jW(5|o!v?a(najt~^S41Ejqr$$Q=6PFMe=pF|(Q1!M8m^LG02vM^C z9i5Is%JY4z%*eusW3Z@<>+YzsS^%nAS{~i?Y@Hnl2Gc38V%O@@!Ks}(_xb| z$jEQBd&xxjns_6^v;xQ8e!#j>Cn?AjSBMt6r1}_M0elxH%#~D>dq%&p(Y9vov%X1pG08uUL<9wcf^!;obQLejP z$X(d&d^6x;zK8_{d>dS&8i|3l+vcRkkeKn-T$Z)z6n=$Ad)jW@KmaWQB+y|!kt`EL zEd8YWVl9&k^JwBPeNI@n_nZ&iaJSD5ByvUXYX~7Y*qCPLJonunRXori|FWN0FnpjQ zxCd>wMiXfN;xq{14z)j+uPxK@{V;O6q40dm)XRQd=Zu1|Eayp3P5G>HC?P zh53r|+|THncdhF6Ixsit6g0qScp{(?_$~@cli1S>EW>(vgx1ld&q4-n)&~iIttixY zRzwi*BlARZhat}- z5x0_(w5!TrS=rt1@i-{1tn@xR&%=!vLg2mi5=Ydd;8obPGlny2^;XEvqSSh%{VPdO zdosbraI<{|(}{JNISa)5D5ccImV`kvPTOg4P2_&bAlPSpPan}Pg9!RLKy%KV78G6( zGrA-Zk|(lRk*iHMv8xzxpipxX)9*Am|NPAqAdDN4+pidgH|al5zfbOkJS1w7R{J%_ z#(Iqz5ge$lP;$m)j;lr{OQeyCBZ5U&saY~jJ4%ky_Z*NIKcQXw22oJXnL2|Tb_D}c z)B_c((Fy>(W7(qSiz_o22`7qhs9)+Iqj^e9m3wx^B7F_bypMtXu^4j0`acnADz5rE zRNuDtWHWf>I0XLkQMd!i0kLuY2?CGq_w)dj~q3HX?>| zR6&!Ak5b15K{tMO0OptLcEpAYdP>RUak>15h8!@t!tCpO?&34MYW5(}+Ny!EqCqPg zbf68KP~#ZfVzE_bXJuqCMb%khHM+|S=|dmCTrgiGs>$p{Elcn}LKl+=bE8*&77@Go ztE74+n^~Zsgyw@n$Fi21%Q~=|3-=U9h7VG#m1(tL$Fpn3VBfF~yke1R7aR1FhFIc? zT=>t)eO5tMa>Z0KG>hVbL!6IN7gm)VuFjr=W`9UJTAGUxJ>7|A$z&_KC&sSI!?%U&$LJ^3?MUT=f{XSj}=Jd%J}zAWOS*I>#_m5;__kr zvm~GEzy`yZK>z>J0x(hwB)81)!wcn`?MXWr40)4{ zemJs_a$Kb`H)txZ%N7O~RRh@7~^6L%%@A!$z`30(T zP2<1~?&2cXk!yXU|G#i08RD)?3?(518K3b_O+TNLxKPdnQw-6EylAEqsgSRKfzf;V~l3YVjj$}vNWsq)(-ugeqdkPG7JwqMh=P@ zMI;Zbp_CeA&ANRwX@SXmmGzn1b5J%qvGshON*Q?G*$+9`?}dBUq;60{*lZyMN$YD2GBoOCS+y3dP(dl5r${}f3u8P#1o@^o{!X8plAw!K ztu24UnAmB&l0O`M39Z2~X*6S^Z2yq<9uJe-^#g5Px*}J&lqV&t-Ob<6)aNLs&FAg=H$Hy7zdKA(s&gFw8 zkNpZ~-uBh4b5=jdD+gy(3V9?m8Zsp+b5AO)kp`Tb{D?3-A`8jQVTi$riu`t<4B;kz zU}ZZ^zlQpk*-NuB2ORiA<7sxpZ8MGBAC@zHD)oWkxzJNgQ3|0P3>T}o7i7^s3H?3E zcpa`TvF7W>ode2nSeSTlfSvZAUgq@zH|7<5c=!Xo?~~3dcsDUy)-uTB{;&T1M}1B$ z-CUjQyu6u{CYnjHp#A-w>w1DIJ8u!^Pl-8V)W&UsMbP7zfH+;rxY1htlS?bo*f_7Z~J@4FAWXpbVUy`pmpzRcJr zlmmkyC2SPAcd01Zugb<#Cw{F6dcxNKHXR)dPkWuMKgIJpNDl6&*6`TGZvdRDYu3}2 z*KK>wCz7#I5Ap#2vg>P81xe6oTMIfe8c6#CV?P8yDeQ?J6`CwYN7@*g6Azj~Vj&jK zjX65la$L>gI+Gw<6A!F$r>VHdrdq7hcWO)viMN^tWu{x(U_d^}Fd~K;(=dB1Q7+78 z+qG0)dTfQjGS%$S#KtURo;A0*QtHVo|Jti#!J2kl`j77Q57yRxRVJYac-JO2sx&eo z?l&u!YtN@mQj|sQ83Zm3pY|VsWI*|_kTzbF=w){`LgXJ4^;~*2urDn2)iNfVLWP&E z$~O`8tycq6QH++niwdo`DnyqP4i0;X{I)rTDsy(e_y5B%D|OC{YfLO%#|`5xRkkzN zAQ|qlBGQ^HrBD|zUbmev)Q?QV-*H1f+m~a;c@j_Qq@x>tjOlp?b%9_Z9Fkb7@FtJ9 z<7i>4!G;kWEKeKiLP#&ogL&7b4CL3b%uC%d;i!x-uh(XQF ziU>h_%+$4oky+{ohs{DCwErOn@(y&O23fwd_eUpxSBfo@PhCGpaN|}84n6b=vCR1e zmRuFyg#@rTi{X?jKy&X&s0v2CZVR2d6}#YxBa+^=nsjoQrlH;KaPz-^|Byj%{OLfZrUOEO1HYUBMo7=SvbU5A@%E(PNZzbxr9q`Y!s5@=k^ z&>b6+p4*QS3)*Fk%oXtSqBbF?SXDL@2xItsD<=sd*U`W*;=NhJeX~u!pI`xM&oUio z4Wz(b(>~;0r}U>q>L8Zcv6q=gR6VK)%TStjn6|bpN(M+?I~ATLI#6qfnh7?Y3S4t= zxXI{C$i)(1%z|(mc+kXpS1V&H21}1 zi>a&Hg9v?1-C)js%ptZ#!qpA_Myg~BE-m(B*0_7N+4%ep#zFkDcI{^K_4DFTCPf%C zPntczvM}P@^*~Iq!YLjDnRE+MHh&jkI`^0^PT_GV_|Kr&dpj@Uoe< zc7EkZ`y4kookYz*ID9ccc#$>Sr{WpH(2N`O|5}}2!w_8s&XosLgD{})TMbxICOWx= z@U2<3q}TvRv+2==8qXFd2X$YAaW1gRL>qhV#9m&7zQM`$=&%Q^J+}^Z@Hm$H=4UWx z>_kEf#yobGx1eWpibQDZsrJVEk5Cqy1Wk)Nq*fZaO0}U79r_4|bDtBRgUNDm93@c3 zSz&S&_J~OIyGWjap6ERMII|nioKQCtoljA%RkZHp-W7tSmM$#idVGOE-pP=w!g+-qx|*N}}&YU+>%w`shj z(BU5mITgQ9Hqg1!87T=-Gs)|)`sLlr$C-D9d%5dze(nD4xw-Mfo%(o?7}?&mKeO$cr6PW@If2xpiJjR<6Oa-KaDLT{O0!T5W!{)!yWmu-B zC}`PJeiEaQZBSm8o4&Z$2~FF_X%=~QRasn#XDY%s%qR?0P54WcBucf2;pt+_jDeKO zTa+6IjD)+WVv#yYl-6-^#j)%bZbnBGwJxU>^x2fdIOG*cQ?L+)jLM;YMymh2 zxz)rhk6{XE)RCh|P^l{AShH@$Qpe&1P7q0~0VjI6uN{sl;O{>n#QZC+`HN#}#%LcY zb?Rs8suQbDYV(?4P@7bP+iliJeT)D)9LR6a)6w?SlR>k5I9#7D8J zY6)Tv>P2vYV2XypM_wOe;bbQ&xMgn94(BN3wqhi7TCaiVKvdl`b=QAnE9I3jGFCA7 zrgl_Z{%pB$=WJ`{N-kTxzZM{Ni=+r5?+&(r0S8IEU45`P2pZs)9h-e?t`H2p{}7ilG2p=DC3> zI{*F?G`98sfyRcwDOPTS1#9irB1H!>!VH4* z1hZnDg-kFYd$9s2)=wa#(?KN{%R`B^dL^Migt2wSoy!csmj#HKK2|s+MUJ*{ot$GN zH&)IjhB_@3V@fqfBH)fF>CgV6NjHr6Z!L2(dt2vNuMZcY?Z4I4bvp$v(4U$)F1w$|ulJL=q=4q2V%~L_0|q1cWx`rZa5C*GQ({ z^+lMIFw~z+RmfGlFeVS;{?QGG%p)*~Ko(LM`h*$K4glQpbiwJb9*%^MNzh|uOFL^j zq1PXyQ?J~G<|6AeU~N-+NpmA>$GK>Ysu8pKMc>wxjHj3IL!P?QB^Im znxKoQk<{kVWw~y&wX&ZHhH$ATHjKmJf{OQFP%w`c2f5M^TxR*fKPRnw z|K9U%u{Dc2?)o8-etkk_qc4P>_k0HZK%8U5L^IQW3K#jjZ|yn8BB*s{=%G~cuJP&8 zs@!(o?uLgwHdUiceyarce17iR+dFu+s!wUC!JIaXMco-!7Y$K6aq3N_QM<~gjQJ!h^dIon#0_I0k@RncWEhd)ytHuv7_h>y?$aig@K%w?roRY z6#cO!@U-Xq)pf!mVie8%6aIV^cxBEEz3TIJ2f>C@Vq4Le_~Qo`7D{FNXsTr7_)cs= z-3AZ$R%t|dm&*HL?LZ{G1}DNXB^{gMRbvb7r$(hw{J@0u-&%ub_H1q4^a@i2k@t7q zL^Ipg=QLOkR}E>%!8?JNFq!RY(<(GtSw5)+7OA<{z*@^od>io&Itxq-3Ud>!Sz|4w z5CWaIgMkt5hF~gIH&)0)_Q159E3^mCnlxJH6600Gr0S7e7_;V-fflvZ?GtHT1D}wd zV%pM+dJ7#;VMd|LM5`(cf_!!!&WB^o8GiJ;jQk1MsubWOcqcj1k;X=Hr#64AKe=d` zbg{swe1O7w2-`L`~*< zIr4mh9-)r}jy8{&_xB`*il`%N!ohG25fq0635Cpf?HEzKc@Xhz4GDTY^$<^-WhXPB zT(zEnYz-eXO@vN0P$oM4pC}~DkhIPm0_hy;AOte;HUjfSJmJ9+Qv-;doU?=^5N!oz zotimP>vna8<)%q#$s&_g5))Qw7`>YqyN*y=bS3qkh&t;>DJdFn%Yre z@AJ4X{^!H%&&NGAz27PK?%Q45ZbcT%;hFAFhxF;{pRbs4XY%QXynnZ0H@z=-IW8L) z$CV`6JxyI{$DI9pPmY{j-Ito~<=t;Bb-O-qDF#@J8roAQark`yUW?!>pEBuG3dajM zJdR^l?RI;z#1uNTeZH^SYOc=6-|R)48FB9&TigBK-CZ4i$_Z*nWcl51a^U%1<*9kM zH#2njdfjfWrQB{{AhhG~y}ycXe8Mb&X`AeW=Fc`_vJ?`35fT=M_j)FTnd{_F=#&#- zI;gaI2oBue*VEAYr~ri5sjnIP@b74Vo(mq7qo8DOX>7Gr7os zs_#YkKqLGL_G;H@V#GQzZiYC4`=XG&6o3&Cfv{1D3bin3p@L_qN4G!0P*TV&k(oRL z^}V(^v8|+^#W2q0_oy-k0KD`FLIf+m@~_?kA#xlP8AGeoe>l*qQnGW#Yy023-HybS zvW{|)z&7B-@{j`$=8itv6Qf%GsL%1MFo{jF)Toclb-nF?0`ZxNg@owpxa3uRSuCIn zX{2ddvn=?Wo|oE~b5?eFF4tOExivZ9nFuocAFkfPtrDxQOvfX6co@}k`CcDYD zYr@L5?Ug3mw(ZIO+Q;$R$NTQ@k9c%F*L|M(8fmSkCfMNLbnaUFHPKJ-TXMfG?6Msd z2^o|R{|W-0Vosun;MYxaFikKr&wuQXd|k%8JzX8^HFYJli>0-rDZ`Rled;;$QT7Ps zI;qlZXchhWWo(X40eUqUhfy3AZ!@Z8R;Efvx8QqpU8%avO6om?QACP&g|zrWecN^| zl?1jsHX#W{>A~8m1{$@kvR2?%ZqA|MxwZOBIB}e`AP?Akv8tVf`AOlN+fRGM&tuYQ zNUa9CCK&#MEL#S`<=HyMPqwAYlzPyA4|Uu7oayXj+}s8*!ZdjB^{(r9npB%-$9j{~hW zo!GV6ft;uK8S|n*6d_8BR2dlm#p%@BIM>_gN|fi{3Pb@#K!L? ztuvj6u#~gpJM-cKlc_F(^@QMcQxv)tr$`vbaA%e3k|Hkmi}TzcDivdFcUiEu3s}(D zWt3*4P$9Nvyvm-4r=C6<^X6`qcN!rhlDh8NrR+?y6A+kLuTf>zZpe#a$l%V53$GtJsy>;1lE6{I!Eq-b(Nx##s5jzy%`?YnpW=FE?) zaw#8tc5`zRgU@vW-;t`v?|pZDcjpXhSH*xb+75;_-`#4jrdi7IzUz7He$Cq3D==o( zoYVkpe8ClKsY45H6aXnv&j;tb3C#}N>E{<0F@L^WN-BKq3fELuU9Wq@RVfIFWV4uN z`Rp-Y#E*YBty(o*kLG^bis%_QkM-6UUAOFK?EZBO_@^f-t_;& zd{FBknfZx)q_exC&8IV?p(q1`_GxL~>1P!?uFp-@0WIbjJm?%QWtlZdYr4qwk+x1m zYsI`xM!V=>eeoL>mbKMbS57Yb%1pTh?NR9ND9PZcHGVc+$MQI~la?g2n;E*%mDVv1rN(!;Sf%3?UtYvG1)%thg3un z#sqt#6nkTAZ|gcG7nK=rJuyFqB4dIjV*{kV`!)%_#XD+rgYJDK@KndDx^;S*XkF1G z*p3Vr7|-RRevB;>FK)PCGERK0TX8hFOSjXnZ#ng7LfA-L26U`;g|Donl6^hy==>DB zl21sf`N_>IYN;f_izqQoyZ{i$n3|eo94#mMF4^ui$1Z;y+>%wrs7`Fvwp3{dWqGGRy} z@zWz}(SG8^%efBM?_-#WXALD$|+4KM;&+2jo?SXR|UO%WtKSCwy_c-dQ;m38E?FSP04G`nM z>v~f4xY6T;XOkU#BWvn(My59>${{}53FeWpp9XjNkW!lTdgUO1Zk5r%Zrgx5Z2|Ki zT%ae7DjBrXO50FTdu6BBAi~iV1vMs(j7kzTDXU8xVD(UTS%W;IS1 z{3Uc47uZDrjW{pt&Cs{T<0>Ylslu#T^1O>8DLl)vbqc7258RE!#&25Aqvd~P zP(-V!Kl3Z~mF)=di5YZt);JezjR=&rs*)%U{PnA~5mc~eyUUyFcg;rOXL+P@zbQW0 zJee=pa&sY-E7QZo5Zv#+MGHS#wUH>jTz~kyOwiSI`#N9ncD{U+5q#O+ z{ntppemTF$PpmcvLqlBYks2$cIN%e$VE9FN-<`C7spQ#ts=d`9d?QT1m<_uEhm=XG`j) zJk*r0VP8%L1HY3^JrhKD1bMd26`zxZnsroPK=oGwBE0`EF$_6@yvubj6gvO7pYua~ zraz8m7h8#=;otCAW_q+i-6;S^p=HpxbY$9kWu!RjhK{VH)+8`X%lnTd&z4Iwbu{>q zQ|t(~c{%;=85dK%D6Yc}&8hRz@ny!MC^O{|U^g^TNCtyM(DVBe#u~X8KCWY+;@9fh z@W>;T^Y-;kas?Wh6uay#zH{ zc}RHkTyBUxo$_Z8Az|FCj&Uxq6ynbzjK2kGj8p_0XHrR^sQ1a|X1Z1hU&=28y&%vy zI3lO_d?$w@tU^57`2DUrAJ0G&^>>qc+xW3m{( zG!R6TGG&HVz^cZP+!vCuE|e8Q#Jo6vV9=I89b1U**+dZZW0B@`r*jdnyN$t9S)`t2 zk-lpnv9U-QwQjd+WV*7Q?NjW3bewoAZ)@4Ebnq{(o8;-0=e2x<9$cSn>Kk*2LFF!O>b61B{{x$U1^9Wi^81vDk=U& z3a~e5t`v7VBH>sZmbm0OfvF9KL8&Epn&-^@K%!RNH4%e)tXL)Wiiik61S<`NevyH= z1LG`xu@xMxj=gD4DT=Pel3s@FVprfT>5<@sc8!^nBTYK|XRL{{<|-Dl_sN&15}xhR za<&R)Q6-&3Y*y4QBKw2+)IviE_rVu z6cyAr;yBjpX`=`ms2noFB!njVjkwmWUePqry#`*B#Y$*Lx#2x}9EkPqe&^h97^!sm z;UcS2q?qStG>@a0FFA{2Np9H&npR;O09SRm-a6vZlG??!EC4SN6J)1%_JIX4kTKGt z^gzN{{r(j6DD?VNFyqdO6I)N#?eY2`%hcJ?(k%&yx%UJloqdG?4y`$baPithOR<74 zPkVETa|7O}(9Sdh0)m2HUk-eI%9BX@aU}r-B`l6&K%0akOOx9kR>j1-f8G*)3TX!) zA9mSDv-A{=a2s3}a`-RP?QU0%jjDi?whmSz`B*sT&Gwl^J@I}Az3i-P;90$P4J;g$ zhvU&fN`&#`zqb#nEAxnt^8&>wVu3cV*Y6hy7kDBsIlT0GON%b@!zSEBmxKgrF^F&Q(p54N0qwcC<{fIAQ6-?Qnfm|ob!fz{p!A)F$|A*z?t#87-Of1a_ z0^k*lyk`a@lz)kSLJo=?@Mi*lt;YkPSG)LzK7rm_m_=ruy9B8gd1~kJCr5mf(+%1;E^$QR z&desNKju^=&+bmQ4-+Ss3J!2G3H#UEagmf?Et3`yYText^2G|;X;35X5%MqK(A{nl z`XBQ~^}n814%A^RouQ+QW@>-mOLqgZLm#tGTbwzPlP1Yn!gYS)$7PWHj&MX}@6V$R z&m+Gx%V=aqhtkxUFm=)!{N@~qu0ZtQG;v%LsFmkWYsw4O45e%UOZc2?S=WZLQEY>> z!I1UW42;ZA!e*Yqv-or zH0~}mG827SfeHTQDYrdHv55XSX=6mR0&)e|f>~apPbAU&T$Yu>(ldYG8#PXWyj^@m z&!&E4s`Eu_=Y6&EbQK{_dYZLxG(`hZ0l;^pN@}5ZE+L~c^^wH>&ePHh?ltXZ=JK7z zPHbxG39TMw=}CMZ=>`4byo-Tb7qMvx2atS-V(YQL8s>VF2pJKpCb^ry?di)d6g2~q zE0sIdjeF(>drg?a^yagwLm=ECRqr#_c_74KR}7%aMbe`q1#}T!UfrB|Yfi zA(HP)#tt(6G<4&ppVcf8MKZ}M!3|h`e?Kvdn}b0GPR^pDb~BKgz1Yxxa|e+o7&A-F z0`-}3E(vtoUuR%)vNE&P006{L-CFlhV#EvRu9oeW!1-v&_ivqtXi12>UJ)5Yazhr5 zSF2wvJZhZ<^Vn*?54uZK_qysGY!)SbD>$=dfays$0~S7+*-2o;oaT4d{8bXr_o>Yi z>@hY^XaROF(C|pN<8SI?V=Ulzs#PIm75O}dX4_Rzp|u01c`~hmU8dD<>dC|1nGif| z?E$S!Hm)eNUqn<9EIv!$i$#o$f1&>rLbMLE_YO%lgoepl(6K`C~o7wDCF^PVk^K1Kzx!J7%-vBqb>$ z>2k#Mab@qR3EwmQWhiGA=J9Ood2+KStGy+k8vaU_*`0Mot45tQUhEHoHckX<3A~LU zhNT2-&Uf#GSTwDXIi65gT@5;|xgM%;9jdH@don$L!PJ#GQOyj|hL{7~ zzr_vh9;M-#yg-Z2D-&$_93-u|8IWZ+;e3zxLp?A?RCYw0ZHjH9Vit8q%smk0k85Iq zEHQ4i`qxVN>S2ZGwklK5v?=O_mxSdRvr~YH1e5rs3b}vp42l{UDmct76P!QsqTW~+0> z4YhRKn<{jv`oJBd?X*VIFHsYfz^N`bua=C0s;sQjuo z5@ABEe~W0%M%pHjxflj^(-4@X=p$n0UL|lKf(8UBUzUZ%i~)1AMbMFgeR@WVA5&bS z8m&>^;4WH?w{>K>;$v|0kn%It3wsZcKAB_C2#dL=yL#WHG$6vdhz~EDAh@ z?xi$~)!gx)=!-|OI!kP<+&pPCGy(VS`HGCB>DO!}a*kk+Xpa1N5xYwJKXMvwGmFWJ zq*i|q!#B2mSQIgagj*)%Hr(!uTJ2$36I9)ha4&nbCYlI`WS7(2RRG=crVXKfU*dei zCE+|-mk2Ifv*aV!Vx_bPwWFp_wM7nA?Q>_WixMTp%>* zjKfEfDAW9RX%+!nr99^YTuHfd`kcb3Fdhr%zMg@OVjz~eN`nzr`vD89b4l5vb#KZ4 z05h*F`JjpOlsG_pr;7pgP!ZfHXg|qlg+7q|j&7XMCFW~LO^(&&B9_lSOB;ubG zHcKWk2Rt-T(nNs?Y#T?CUbKlQEGkwMrhR+6u_M0Wpo5B=hGh}4S9{yYCM?vdXR)P! z%I!Q@EHxEHFWQk=9jPh4cG}319(&`t`XoKQ{s@TjLm^vxZ3ZOU@yS!Cxr}KjWu|f4 zLn3nvm{V6*8s!d`BYSgTPrba**PYz_yiVM)SZ~^RJ~^>zUf#%vl`NPRBU}$7=K@E2 zjQSULt%jawBJSUMVIxTaL0yPh)Ae$i#pkwowyS zi;zQZ`OB6N@1d@FIiqsVQ4J3Hevig`(#;KaXi=!mQ|C|Mq|@wDn7Bc}>J0v9X(&QC_KRSS zD{ITWvEi2B4on&C_o`zU8zE~ptT+J1Dn!H~H3ebCYw?+g>h}ns0;(J+s(;JRMo4Fj z>nioVf89?iN*VyLz&?6*0Qr{J(~gb$^M^GsW1jZAFO}c|8&mZLF{HB*iwo{6Z5HKK z7Xjo*dX~Y5eot_r9&j&23iI~@puRjFLhCx+JQ8)~6)yN*L~gc(R}hyg70LtC^b`9nsPcYh46;VCWL4xOa?JQqa}EeDW`)kAK8Xi0b|-HqU{^F3j{+7r zX?p0EB>X!g0e@Z{gK;F*oDFnZM7a48Z9STa>%rDp(0R=vI1{E&Ix>ur)jgtOO*@qt z2L%R6Xu~y(EFkKPXem@JxQ}=qzga8AS^CzHE}F zuGAP?u~;lIho;4)$EQ#fm0SbDOefZ(9Z%*IKpy(57?vb=K`$$K{A~3 z11H2$=w80(DX~94v~&~3&j0^<8oH#HY|Z*H=vDoYzQ^DrK28ZSWZ^i@O_CaHWWYHV z2|Ul)*5%8;Ta@Xe4|*{MX|RQvNVQR{jmcCoglp*epI8jz2}0ppQ@QeZQ!*>;yLYGp z2@5;&M$sj14gPb3g^|;&XU#Up@?%rBJS|psdgpwj(1h%f3m_K??gebZ#}Bn!`4uCF z=&tZC*Tu7WTstWVlh(QN(B{agD0NBfCWfj@8#1n928+~WN_F0-4(LY=%6`vCiR(Iu zqP~4W!KpfPx_;l~GFXbxVF%-M!(99qbFokfAeGDSwaP$5?s*$9eL^pbj|-MsAdIA> zSSFEPdp5GfVif3Nb-Mjj*;+b@yTc{y;d%G1vV0MlnBP#GaV9Qq z`0xK_0S*q%?#y_964^N%Zu5R%)hr;Zj`qg_3uq zVT-5OB{uqK2{}-y)NtFgbncNUyy*^F8f}ixqH<-Qaa`*`RL3okdj?rELo33f`yiZS zj+rt~K^PF4LGnH|JVxgsdY*T@G=!>X&c3=5VKBBaY|(7Bf2&PWE)Xx&A}5n8fUX^( zbk%i5Q1NWMoF2l8=goW(KiTvX+e-CX;?>M{$+$Fc!(B@9!L}zMF51_V1*7viabHOs z*G1kpnekIwZvVIrm$!^D_)?QK8dD?K@H3$gWLdWz$v{Yts0* z`UY@(FMzAIOqcwVUCC&+2g;cJR#)76t+M>ezp~CV4s^zGC|yfk-1S(|t1ea0wdPsJ z9|@Aa``4BJJ*(#i{vHqbDFJ1JI*H|^_ZlszC!%MQ8txcd1#@D@)rH6{Zs8&!D^0OF zO4YV7sIs7VQ-H2py?Ne*u(Uo0FT$;BLl!cFf*bxGgPrAm`U%wze%4i}^9#Yh<$nOx zCiqM;>%mvly&{-pFm)MXqO2lgT^R35$~Akp=X?&XGpg;RHU3*rd5YFF1uVIHX!(t~ z4&y+i0t*OMBnr$)btRj~P)I%I%Q0ds9FvvCavG!KpU8(+FKp5vna{Ci zni?b+@p(6uh1=2@$kA<&lcpUw1slt(?cDbs&2|(QaFYi`K246?2eI`I`WtZ;L8hbx znUZ!|zfOlxk#f>42DNWqt8ED|up&%_59^9b#)Ko@8X zu~!}54&LwY#GeE2ib5X$ohY32L^I*T;Q-1iyqx&a7$GOBIQU=z%@X;^&0t`h0>Qx5rp!>Ai)XdpYY8nd;?{+ibJ9hOY$h!6K=n3Q7n0&fv~tsH52aR=dw>rQZ90ePGXWE; z4_QU7^ahf3rC4;5Vb;ado6vtS1_?6GRzeWI$iCmcxle7dsade2?tgC69*F`d!j*W~ z!?%4+!3{@zrTizHkySe-ZP|BlyLMO2ZmfmnyWU-{iF;q*s*aMy^BF#4>g%n=#Vd<% zY6-D2-r>=E9h|nnEIJtC)5_Gmz6n=1w2|Pv-Jmz256u-`O=WNzxMzAKcGpN@v`eIj-aO59TJftOz6qnDsE%r_?U zfOKHe)(M}K&(T-BXNUdp*Ll_q!pTO3- z;asAUNde19oQB&+eq)wzxlJ|nzB{u=1wgT|1Es2vjlZ48VQYuH9nMGi8a_P_{paQg zd|GVj!tCM^_>?L@uDmks3rfnK2VS747umqT{~RZSPLkrcVAwO=KnMrr-blZJfiZhp zpV7`yvaonD7>X^BGR3rF*IWs)@&3>(DFByHY@46Jw32DZYf2w;qDTa8@M%z|wZ!C{ zx4-{bL*vsF5!M8U-_3%h)>fo=jFj1}Hb3>8NHn0`eJlwy-+5aNBkK$#`8vupj<}Us z@PJulqa`-y39rM?e+ZO>!@e%>m-#n!@OFSwRk6_lrSW`7Ne;$5HdH#^z)6QkGD6RM z5fftr{tQml!-$SABXsh+4Q>{V_zn(%}jZv|_nNl1?K0*fGrRpwhF+6+Z@0WWN-LUk8%vHQ6>zYqgPc#H zQv3t*EMnl_NKG*J{pi@&EH=q!YL58j&)x?+y}ku$3e!CGvx*syfTp44!!V6U>y`EO z@??gp8q!U}Hs-#cepgxMgR7#Zj5N4Qd_+DW0GV!V6Vt{f_0<#iX(RrwsKuCE19gxkP zh{uY1jz(`9$D-=9!kbxTUY+{!cX(R_3I>MqE(y7hFu%r4iqWZjJD=+RW*%4}ZY|0; z`*~zCRpn?Kp~|N&{TPf1FiY!#+_OxJl z#RtIAk&T@iszftWe(x<48aU&k`Z!HMtzk24;L5N=b(!}Xs>Wq5>zS<5hKApe{1<8> z%Fe7%W_XwN2edL3_cJY@F;Lvd#ta0MGBM@I;;KPuoQ>6Iu@Gv~hHKf|fzy|*bpzDEmiBfJ^rjTrKpvtiA>&?%r)Mb(~?;B(XW zxILE81ISCzU*s}N^D>Gs5?&R9xC7O;EQ!MBFk@#AI zZMqCuzxPhQ6P}**%v5wgEIP1KynsvwPMkH*2YGW4^Vx0bXL2^Sjx7vUL~r})!IV<1 zphZS!hbmJkeQ_b!IxA);)q{PZ3PV*S+H9tOQh=AkK#kmHgKstxe|Ab9w^2~mHZ&Rw zrXZ1x!#}j72tyx6myL%%n9JQjcd7Zz3@44~4R!7bc0h`Pf$=6|SuX^QGe6cpqYpOX zdp*#R!x00t4xU`FIbnRf#`MH+O zE)&S>k9+GW ztMM&o_7OFVZ7xkovbbI69%Q$sFD&*y-8 zo?Cpau_MC&25-$N3L$NYLD7Xi=~JK$>^8eLu%S{JvmV&g?|C+yw7$2xWg5ESywz0E z$QvDy_bN*W*^EoKra>zae}yLaBT<)6qiVlNPK7z@$T5`VbnV5+Bz^6@Ur_X zFD21M!duGtZ3plEHgT|w`ObAyaF?Ym?A~&;8eE5TM|R*`SnYZDS;Wo0Wvw@UN2Gt~ zs;0gu;)OJ-IyIk72Fq^qs@5n4FR*$=tnZmGJf|l$`qn^VD{n2SjEH0`euOtXlAkdf z7Ar;sFPUr=kO-b<-Xv7fnoIhzSVw8M*bKT%?G;Wj8#{kr@VXi7BWiQm=y2q1baz70 zw$oAxH+(90aqw0VWbws;D+NJdE^jmI?kkNP-o?-MtzwAn2jU`Dg_~BS$ZIqQcf!5o z`+>~PjKFEkvJ@now`tcP!1&?^9FwWa#`(^$0Ja&)oHWuf?FCup&Moit<=~TinU(M3 z(GmqGmv(WQ$j64Ye0eEV0XqQ)`RwhFrxoe=rY2Qotn8Zt;gWnV<{B=Yb^!||!Ie}$ zU)WYV&{hW@?484dRMa-0m~^+M1J2|0O1^Zp@f6!q3rvzKGWhn2<{R~es;Ea=ytHE3 zhS<#OuWlsf_fZ3E`6}H{kgS+F+GR`mF=8QtDB7BNZ;};->+{?lmmK|$ToEA1Di9%s(NbFy3bTl@~WR5bh6h8&+%Uz!wsZkXgn?Ifpw4Ea9 z6VJ`jw>wiOMwR796_?xA3N?!7{}-8UE$?3$y{|*~h>5(mVzyx=`d9Svea)wWWir4N zE&Cux#}j4rWO@#(<1=l2f<4u!Z3V$>FQ(Xq_O3yeaAX>9;wiZTiP4=nIH;C|1bM)p z`G(Mw(m?=Hr?Mm;YN5zq_OVPY6W($@Ez?7a{xyXl!dP!yK-r7eSqX z8(^}lhwn~E+jrZdaO<38HG?dH)9NDJ7LN;tJcpl~i`+)Jk2TJF2cqc2h7}7vNvm`Y zv{ZQr@cpLZ_`g|zSYEd+3yjN)*y^M~_ZiI*SKa=Iv2R4sDIL+R#Qk0+D8MA9hIfm1 z#}9MnssYuB4>KHkml!U)*phCy_+i7~XYWfFa>pljU6%C?6nxRSr~*R8FNSv_$Nn?| za@rW(=>oG`+M(GR+HiY5R7ZWY_@741nr{RsI5cgr(ZdD}4LAW0!3ty9oTxUi^y`X# z>RVMQ_%6VV&gfYi*cV7bo3%$sc-Od7+Lpo%DK&6aQ&M#$*gs}2Erokze4KnIx8@WK z0Dn<83kzgDXBV}WKn5A!adEa;i%vKkU$*6S?Qs?^EU>4JW(4EoBp<8hhO}S5?u|KZ z)fd^-!@w0*$|w3MgS=(;eYbs>t1bxoZkrD+Uzjotll@QmK8y_DPsrBM2u%!al%jOP zC<1KfM(R;3;HTr?WtDZLL_cd$PoY$Eihp*NuY22;F^eq3^eAED9@3hGb}_9k`m($X z&JxiG!rVm}7TsRQ28?4Eoy_T?77XxUkUK(Y`UYUpuHV+%2Zj_k#5y3~K^y0Np!rkd zj|Ea89&0e?BbYW$^RzqaV*6Y<`8_s#_dCwre2eg=6@m(30ISwL;d}Lrdj*|rw%1${ zmU-{fg9L19WH5uvylY1K8ykNmJf)pdI^ZKC!3eJrFEUvS-ODE2b^6yMFX%wsylIa! zt~-UchbDI#lP8QzMhx}#JXTvL86Djtoe#33VB+8ObvUhKq!U zI2?jDUS^yxtAZT`jC<@AyAeMAv>`7T7^H*WukER4;DQ+pQKibZ#J|!2*kSan{v#O3 zsWJXf=%AY`KZS0)=4ph;E)AQ@e!b)910R4GIJz5(rpVsWR{gJb9tmJRVLO6o952rz zFwz_k>Hm`qeRK*qq0+N?Jf9jt21-5MParf%W@~Fji3+K-V!;7*)M|wuO5hexlMP~F ziUeXk3-`x;Ta)Ra2H%d&QtGeq3|%eIH3R9?+Sez(qX0%%%hE#$6$_3j^dU)Cy?$QxRO< zH(*xf9&t0_3(pD`>~Tj0&HJH90289z!wP?oyOutxJLRmh%^h{hH?z!LY&aET&5qlK zq>LKjt^;Xy#(9!&kFRd72k+jf~ zrDOJbvI^hIzc#81vfBwir&U!K@nol3hfN?0IuHx8c$shz<-Udi#(y!pBjhsN@r7k? zGAE$Ait(D|Ce`a=BOz`5lQ~R#Ee?{>Ma~d;YyK|L?p#z+t!jE=c0}TPBBFsPo{au@ zCWqMK4l*i47+uc5kGIg+W5SwvSG9ob^4<@FdkBe@w7T0|W*9rnQk=gh^m!z4uWG=- zQ7bru2U~XCNUDASxVgETGrI5qmg>vS4UK>I_QNHSpCoMz^a`}~qsbxn+z4MH&Tk4A zQjUw?>Nt~G=+uefE^^6+NS6nSWgsDkK@eB;nUXA+m9XQJ>1qAY?eQj-2rqn6v8(=1 zufU-$@uKb@<-A~P(oU^Ji5QN$xe zhk-6hE#X+w)0)_N{9T{jcjhBVxLZTHWkRJn#Mv407zI=23cHLpW32pHJXSQ<{V+za zQM5{=o=RI0EgtK5x`HJaLE7r5@pt_8_Y=U6RF4ln-lxx z{XxF#SYJ7GO$oX7(BD46p1q8-#boZ5FLOP>v?=|UB`0nfC{VU{uB6>*xCi zzuR}dNx!l~M>t=Jsw%ro8_luB+iAkAm&n8eY+6`oCT-@qrWC$1Vk)vmTYMtDeur$# zGX<{xcQpT+gL;>X+vPBWYlb()_n=q-mK;-g*y-xgWJ8Ce>R{{c>(Op_xcqNHkqW5d zWDR1)5mIDwZ)mwi?HSeRy&!-I9WBnh-kb|KG85g44k3OM8_=jD`9o%;>)`$h=eLSp zz9rl{#1G}B7>lVdGfU*j0k+@qBWgL)ih3R|H_G*nngu#D;Pxw4=bw63c?{^g3+MLXPLzFlvM^%SdI^xaH3}Vu~*j|C#UH{z} z*3M(%)@)^AcI#wK-jY&!>~O>hFhlhg?G{B1)vd{+uJfZW_M(rTxV+P)HVj(Ng{1WP zv&`Wp!C|O@G~Ng_Vv$;9>fMX4<>N`u*TCH1yRfmmI)5gM{ka2+A)q!=>ItZ}P9;E} z<}8JF*hA#}UNu2>nO|AN|W!EbKPys!7@y_Eq^lc zWqPm=TjKw}st1v&$>yet1uH>=X;lYy+#*Y>a9W%TYHD|}X3Hh{HHd%C)K(dJkYQk8 zHrEhAr~|Gcix$hIvuxah(dflxv-co@PH%n!=QHluVD#!RhD{|VD&lP&MQze(4ayXFK~0l;@79TC@j9)H?GaJf4pkOvg<+%eyfeU1w4b(86y+EU2iPFBO(FSIZU-NJp(7TDJFQSyfM8C?H;_A6B&G^#Qs zL(r;c8g=P73AOgT**C$yfxRtB#lsw>CiAL4NC_{Ys_=}52fCCC{g_gDea z>Wpmla$?uRM9C5)3pZsnIpCh|ex12&*|cQ9R5-ix%D=&EzN`qzBfOYFQ~{u&ViOPC z+4HHi303>gI zA2ugM+3iswtN3T{@sK}l&@Ny{)vHnU--y}mrWPM|Y2MP6QOY0|l|f$ze!An$QTC7zEJ*n$|WK(OzXKRI&?+@wh$1Mv%a zT~QHlw7I!4=VE|;>l`~co#_k9@q3fTq9P-vWdr{K9!r|aK&mw8<}m8tN7YXBkD6J9 zWcP-a?8g0E`RynC6qvpAYc@uI(eOfG{h1gM?g3YU{S;fco32xs$DXIczSYlu1OiSR z$pth~X?i70$h>V_Q<|7UM8)8q5o|i{8`u8F>I%DND{Slec8Yd3Z4hDvi2;@9;4>$(B3N#$$jvU_auTzEJA+5c5*j0C&kur$s`? z3)&Rhw3F;pMjhPLJMXkAaE8iLZ8$I^$4{&GcG}&%`#SL`z`qR_2cf9IxG)c(Ug1c& zZUj(sM2-h;*&a`)LGqaCT~I)h@HFzl>3Eq?1Fz!t}Sg*6@&X;Ps^T#y>MoE zf9gh$QibVteT`FVxV)m8V2A?;0rG9twE0yUn5+6kj~=BNB@G>A3wk)#%!`qlEo=ER z`8Lw_w~y*ab^8r&#-r|29}PMeD5Zm-mECeN?e%|8OI&SEgS#i+{5Z(e&-9 zQfuO$?~Xv$*_daKdRn$YzD@hkQCGw1;QXJtMGj{*mo4JSFng4WnYhhKL2gww=UWt~ zFgYlZIeILHwFd|nR(#!`=M{5Vv%E1X5uA6)?WOrQliZ4`pwH8KeFpXWa!P)E?D(~r zi`crvJkBlLp=-T4fR0Zficwc0-zh)5olam?|9&uIj_S zqCmm4ljq-gRmxbr+Fvh>Y00OA;LNA3qyNnU!2ZL<%I|OKy05yP@Vni5>yFGHzNH_@ zUvP5q^t|EgeqH-~6M8pS6JktRK>pbEGN)364d->9e%_VtV#`_wIa;&hC2b_Q?j zWsO*{FaInkYl`yN;1nzd>KR_2?)?#Z&G|Agzi!lz%yv*i>n$w+R+?;wJ`LP9^2s)r zsc=nS=w-&WR*F}z+Hw?3QqiCMAvUXS)d82{7e3$dDGyR+xZ&|lk2JEToYl__Qlxju zZTvF*KGe7=e*68LTfwI7Wj>Eg08k%-L9+{Y1Rw2CpT2F4OB`Pbrbb*aVqF}}a#XR> zW+UE_sK!~Cxjf`_<`+KEZ69x)mLpiC>BSp9&$hK%`h2@Bw9{*;sQ+OoH*y0a6GO>u zCI60VaP#}n1UGE$xt#JeL15S~jW_3KYYroxK+3kd9w4c!UXMJzRBG0m z?=-)em>=juS7K7b5p7gt5}BG2w?dXy9`F2)049}8VE&?BTCt+*=CToNmq2pTKda8` zud`CYlb7=MnTYwfYJH(-$e!!bwIWu}Y400@WBZeUQrAimPGJ9vt6Q? zAMketl9%3x>egw0%MfzJjyeZ^RoZt>k&XM7nuACn=0G0m+^ygJFM(OzR-4$&UJaw< zR?N`wLVo*^0Zj1NcZ5w|R-FAcW(WKuSsSZv3;?W-c+b>Vet4L|luq;vJcbLh3oYZ? ztSEJ=#tTc9qLluH`h06{{3Gdj<%5=rlWeQg)>)SMEs7tP#g?+=yiI_kRqnCI2t(&Z zEzlK~IUR4Qyshm~wAKl9usbgyqN|&@p39?REtIs49r2J_kxIp6pmbOz_%CXfiKqff zPhuz#;+J8!9WPAhq+eAzri)Cx|6gT&iZ$uAzjvn3F|IA|D&3?U zAJ0#(t=FE4nvHf>_M*3vv-2RBKV}UaJ$pSQW4HUaQ^X%nLsz=pu5t!^b2RMHC(rUt zRv(|wR$sgTo3+E^>$s0#G^o4Io?wZy>B+EPVqVKm&OO_;j&?IDMz2s{e-$(QeH5>s zkiZrVBK_l#0~G<-6s&mBC&SKJ6&DCPh)-S!!$Cq>8tWDh9TpCo_K=C%2$wCD?E~p? zC9yG+=xn1jw^%nRCko`aGhm}+A{3smnatqZp!h+5tss$xBEQ|!Sa2Vjo*{a>)sa*S z^2^c1(^M2$;MTgY*;wB!+1A3#5EM}l3S*zeqlbfP; zIU_lg=A=rMLw7bLQ^eFpvmjG2;01E6v<4#MP|AP7?;gn!vB94neQ`G+3s!4=jlR|r zY8>I8vKKPXg}Uj%N>b?o>O{vRBjMGXN;`+clXv%^Vdv`spGe;t%6J|`d`cFw6pk!}3|MM*g6$n07ORJw zSzZM@rHl<$T4>hoAkC$Y$Qh$qmMo?kOQwI^MW%VZmqr`8NqM)R_#bR_%r`}Zf5e1H zst9n*$h^>LOb*uS%djWbOQ{3EN!6H0!5rF7Cl4K0ik+bo#tX|*lm3rzfci$#?@n?j zqqw~LrOCkStg3~2jf3}Pr2R^n)ZLYZY3ZOK>`!UE@7d(V)>Di6PE-1oRBYQ7+fH@5`#axxuYP{R zde)kA%sK9%PnYr)F|CjKh3e!+dRxeS|NHUfbm#23O%_tJ7@dmADZy$o>`1jsa#ymfES*S?89fE{&~bY8gcrrCYz#DKilMq^y9)HD)*&p&#?o^QTtP z?pXkjOTkV)^Th-IsJ5=7>rhjxkq!)Wxe+ZO$@p5dqWp&pt505_nMYJL&y|e{C2e_k zUjG+iU6{S3GMz}}KCpEJv)3V*c{w+zu!uL@;i??;gc7L}JDom?VbnvOzs>e(n(_8w z7%MAuzSUo(DL;k7x z`psJTI564pe9?Z!Yg?@sw9Cgrb1Dk72{%p5QsP z+oO`l5gmJw8bO<8XK#LP-@V^w%J?Geh|m@71^vnPAX!&O;o}eDm6h5`8HsdfSntD# zKmW#P=tm{+Mmo5XYNVQGb(nB*3HChC#`*iW`H4R*At#5q7oRY(!lB&EPX&9!vks`j z9gj(?iO=FG$%dUwl17iEs>zhN1?Yj%5Q>1sjlRBQjg8%d3F@a>ul0WI&Mw;0lne%a zrB70hdHQ;Jy7@UNGhj7aJw83g+3Ur*KSf~J`MpOxqyG=3R{H&h_@Co51u^oS5Hk+e z{X1i%5c=@_v2JyWYL=hVYg*(qr=8Bfhwb-654OCdLYlM1dOqHs=fCrBUtiir)6#W; zmR=LJvpX=0Y<_c-E4F|Nbo*pto={|Yok(AC`uClW+9|QO!L<$8_3!hIvFG+SCX+Kv zOb8C0jUVo>SkmC2ksFN->9DtICuR7SvhbgaO8;fFXrNFGa7#wAz4v0C8Lare%g$!r zjh+cHUw?uD#_7C`!@bsYyx>*~q>RqvQU{7g8?zvSs zWt3yeQMxRmkT%KnKxefX)mS1Le1A9Mnu8zH=lTQ0qO!PhgKph1m@7Ym5t@(M#1%yE zT8zp3;^no@7q{zYO)eUR4COxMlr3IlP%Im#u4Fgfg4vznmE8}H?KoK2)Pg*!AHD6u zkw9}HW8qhPV@;F=Q_^XTO>Yzvth4p7KOSe%Z)o2ts+YU9#<&1dMzVijg*+xHhBPwe z(>N1wz*3HrLQT1r9Es?Tk&;9$?u!L2;l6V`&P!~bOl)So7C2UPx!Fz-1sD>)9}4~+ zREUm6;AH$bkX~}JIT0SJ*%2u|(_%x(<$K?9{|B>$mo+^l&&Y5j zXZ_^%_-#+G$D6j;Rb(Vi(Cg`K`(NLH1j^AJ?#JdhV;A3R*Ue=g+hnmz-g zyV@z_COp#IZM$^n+)6rXC+e;V2k{MSN9Q1UT||*#f-*VnV}_yp!fLud*Ot3)Vt`_) zM@J3wDm0Gs_C2rG`X4dd??_%BL9i%?QQSo{6%XZ=V|?QxUS#niIQmtFt;}nXtbHGz zOXG|h0j-?Uf8$!`KJ!tEqZ=xzO

$ex|aNeUf*9Q;P5J_)v%2SaggRRcfmgQpkv6 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 bf&vita_grDcYES_Ij$I({EoU{`}BVSWD0bJ literal 0 HcmV?d00001 From 9f09932baf5397bd7cab58f1b6472d4fa186a2f8 Mon Sep 17 00:00:00 2001 From: Olivier Chafik Date: Mon, 12 Jan 2026 14:25:16 +0000 Subject: [PATCH 008/352] feat: use structuredContent with outputSchema in example servers (#220) * build app-with-deps * make registerAppTool more interchangeable w/ server.registerTool * feat: use structuredContent in all example servers All servers now return structuredContent alongside JSON text content. All mcp-apps now read structuredContent directly (no JSON.parse fallback). Updated servers: - basic-server-vanillajs - budget-allocator-server - cohort-heatmap-server - customer-segmentation-server - integration-server - scenario-modeler-server - system-monitor-server - threejs-server - video-resource-server - wiki-explorer-server * feat: add outputSchema to all example servers Define output schemas for structuredContent validation: - basic-server-vanillajs: { time: string } - budget-allocator-server: BudgetDataResponseSchema - cohort-heatmap-server: CohortDataSchema - customer-segmentation-server: customers/segments schema - integration-server: { time: string } - scenario-modeler-server: templates/defaultInputs schema - system-monitor-server: SystemStatsSchema - threejs-server: { code, height } - video-resource-server: { videoUri, description } - wiki-explorer-server: { page, links, error } * prettier:fix * make registerAppTool more interchangeable w/ server.registerTool * feat: use structuredContent in all example servers All servers now return structuredContent alongside JSON text content. All mcp-apps now read structuredContent directly (no JSON.parse fallback). Updated servers: - basic-server-vanillajs - budget-allocator-server - cohort-heatmap-server - customer-segmentation-server - integration-server - scenario-modeler-server - system-monitor-server - threejs-server - video-resource-server - wiki-explorer-server * feat: add outputSchema to all example servers Define output schemas for structuredContent validation: - basic-server-vanillajs: { time: string } - budget-allocator-server: BudgetDataResponseSchema - cohort-heatmap-server: CohortDataSchema - customer-segmentation-server: customers/segments schema - integration-server: { time: string } - scenario-modeler-server: templates/defaultInputs schema - system-monitor-server: SystemStatsSchema - threejs-server: { code, height } - video-resource-server: { videoUri, description } - wiki-explorer-server: { page, links, error } * prettier:fix * revert: remove unrelated workflow, version, and arch changes * chore: update package-lock.json * refactor(basic-server-vanillajs): address PR review comments - Simplify server.ts to return plain time string in text content (not JSON), matching the quickstart guide pattern - Add defensive coding in mcp-app.ts with optional chaining and fallback to handle potential type mismatches gracefully * refactor: restore rich text formatting for LLM-readable content Restore the human-readable text formatting functions that were removed, providing meaningful summaries in the text content while keeping structuredContent for programmatic UI consumption: - budget-allocator-server: formatBudgetSummary with config overview - cohort-heatmap-server: formatCohortSummary with retention stats - scenario-modeler-server: formatScenarioSummary with financial metrics --- examples/basic-server-vanillajs/server.ts | 7 +- .../basic-server-vanillajs/src/mcp-app.ts | 4 +- examples/budget-allocator-server/server.ts | 28 +++++++- .../budget-allocator-server/src/mcp-app.ts | 8 +-- examples/cohort-heatmap-server/server.ts | 15 +++- .../cohort-heatmap-server/src/mcp-app.tsx | 8 +-- .../customer-segmentation-server/server.ts | 25 +++++++ examples/integration-server/server.ts | 8 ++- examples/integration-server/src/mcp-app.tsx | 8 +-- examples/scenario-modeler-server/server.ts | 71 ++++++++++++++++--- .../scenario-modeler-server/src/mcp-app.tsx | 16 +---- examples/system-monitor-server/server.ts | 2 + examples/system-monitor-server/src/mcp-app.ts | 8 +-- examples/threejs-server/server.ts | 13 ++-- examples/video-resource-server/server.ts | 19 ++--- examples/video-resource-server/src/mcp-app.ts | 16 ++--- examples/wiki-explorer-server/server.ts | 23 +++++- examples/wiki-explorer-server/src/mcp-app.ts | 50 ++++++------- package-lock.json | 12 ++-- 19 files changed, 218 insertions(+), 123 deletions(-) diff --git a/examples/basic-server-vanillajs/server.ts b/examples/basic-server-vanillajs/server.ts index 2717fc3..ef661a8 100644 --- a/examples/basic-server-vanillajs/server.ts +++ b/examples/basic-server-vanillajs/server.ts @@ -3,6 +3,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js" import type { CallToolResult, ReadResourceResult } from "@modelcontextprotocol/sdk/types.js"; import fs from "node:fs/promises"; import path from "node:path"; +import { z } from "zod"; import { registerAppTool, registerAppResource, RESOURCE_MIME_TYPE, RESOURCE_URI_META_KEY } from "@modelcontextprotocol/ext-apps/server"; import { startServer } from "./server-utils.js"; @@ -28,12 +29,16 @@ export function createServer(): McpServer { title: "Get Time", description: "Returns the current server time as an ISO 8601 string.", inputSchema: {}, + outputSchema: z.object({ + time: z.string(), + }), _meta: { [RESOURCE_URI_META_KEY]: RESOURCE_URI }, }, async (): Promise => { const time = new Date().toISOString(); return { - content: [{ type: "text", text: JSON.stringify({ time }) }], + content: [{ type: "text", text: time }], + structuredContent: { time }, }; }, ); diff --git a/examples/basic-server-vanillajs/src/mcp-app.ts b/examples/basic-server-vanillajs/src/mcp-app.ts index 59e7128..2a5500a 100644 --- a/examples/basic-server-vanillajs/src/mcp-app.ts +++ b/examples/basic-server-vanillajs/src/mcp-app.ts @@ -15,8 +15,8 @@ const log = { function extractTime(result: CallToolResult): string { - const { text } = result.content?.find((c) => c.type === "text")!; - return text; + const { time } = (result.structuredContent as { time?: string }) ?? {}; + return time ?? "[ERROR]"; } diff --git a/examples/budget-allocator-server/server.ts b/examples/budget-allocator-server/server.ts index 3b780d1..a902eea 100755 --- a/examples/budget-allocator-server/server.ts +++ b/examples/budget-allocator-server/server.ts @@ -224,6 +224,30 @@ function generateHistory( return months; } +// --------------------------------------------------------------------------- +// Response Formatting +// --------------------------------------------------------------------------- + +function formatBudgetSummary(data: BudgetDataResponse): string { + const lines: string[] = [ + "Budget Allocator Configuration", + "==============================", + "", + `Default Budget: ${data.config.currencySymbol}${data.config.defaultBudget.toLocaleString()}`, + `Available Presets: ${data.config.presetBudgets.map((b) => `${data.config.currencySymbol}${b.toLocaleString()}`).join(", ")}`, + "", + "Categories:", + ...data.config.categories.map( + (c) => ` - ${c.name}: ${c.defaultPercent}% default`, + ), + "", + `Historical Data: ${data.analytics.history.length} months`, + `Benchmark Stages: ${data.analytics.stages.join(", ")}`, + `Default Stage: ${data.analytics.defaultStage}`, + ]; + return lines.join("\n"); +} + // --------------------------------------------------------------------------- // MCP Server Setup // --------------------------------------------------------------------------- @@ -248,6 +272,7 @@ export function createServer(): McpServer { description: "Returns budget configuration with 24 months of historical allocations and industry benchmarks by company stage", inputSchema: {}, + outputSchema: BudgetDataResponseSchema, _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, }, async (): Promise => { @@ -276,9 +301,10 @@ export function createServer(): McpServer { content: [ { type: "text", - text: JSON.stringify(response), + text: formatBudgetSummary(response), }, ], + structuredContent: response, }; }, ); diff --git a/examples/budget-allocator-server/src/mcp-app.ts b/examples/budget-allocator-server/src/mcp-app.ts index 4510a85..4e8c62d 100644 --- a/examples/budget-allocator-server/src/mcp-app.ts +++ b/examples/budget-allocator-server/src/mcp-app.ts @@ -607,13 +607,7 @@ const app = new App({ name: "Budget Allocator", version: "1.0.0" }); app.ontoolresult = (result) => { log.info("Received tool result:", result); - const text = result - .content!.filter( - (c): c is { type: "text"; text: string } => c.type === "text", - ) - .map((c) => c.text) - .join(""); - const data = JSON.parse(text) as BudgetDataResponse; + const data = result.structuredContent as unknown as BudgetDataResponse; if (data?.config && data?.analytics) { initializeUI(data.config, data.analytics); } diff --git a/examples/cohort-heatmap-server/server.ts b/examples/cohort-heatmap-server/server.ts index ccbe408..6a902d6 100644 --- a/examples/cohort-heatmap-server/server.ts +++ b/examples/cohort-heatmap-server/server.ts @@ -152,6 +152,17 @@ function generateCohortData( }; } +function formatCohortSummary(data: CohortData): string { + const avgRetention = data.cohorts + .flatMap((c) => c.cells) + .filter((cell) => cell.periodIndex > 0) + .reduce((sum, cell, _, arr) => sum + cell.retention / arr.length, 0); + + return `Cohort Analysis: ${data.cohorts.length} cohorts, ${data.periods.length} periods +Average retention: ${(avgRetention * 100).toFixed(1)}% +Metric: ${data.metric}, Period: ${data.periodType}`; +} + export function createServer(): McpServer { const server = new McpServer({ name: "Cohort Heatmap Server", @@ -169,6 +180,7 @@ export function createServer(): McpServer { description: "Returns cohort retention heatmap data showing customer retention over time by signup month", inputSchema: GetCohortDataInputSchema.shape, + outputSchema: CohortDataSchema.shape, _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, }, async ({ metric, periodType, cohortCount, maxPeriods }) => { @@ -180,7 +192,8 @@ export function createServer(): McpServer { ); return { - content: [{ type: "text", text: JSON.stringify(data) }], + content: [{ type: "text", text: formatCohortSummary(data) }], + structuredContent: data, }; }, ); diff --git a/examples/cohort-heatmap-server/src/mcp-app.tsx b/examples/cohort-heatmap-server/src/mcp-app.tsx index ce5c3e1..919b6d1 100644 --- a/examples/cohort-heatmap-server/src/mcp-app.tsx +++ b/examples/cohort-heatmap-server/src/mcp-app.tsx @@ -123,13 +123,7 @@ function CohortHeatmapInner({ maxPeriods: 12, }, }); - const text = result - .content!.filter( - (c): c is { type: "text"; text: string } => c.type === "text", - ) - .map((c) => c.text) - .join(""); - setData(JSON.parse(text) as CohortData); + setData(result.structuredContent as unknown as CohortData); } catch (e) { console.error("Failed to fetch cohort data:", e); } finally { diff --git a/examples/customer-segmentation-server/server.ts b/examples/customer-segmentation-server/server.ts index 4736f61..527855a 100644 --- a/examples/customer-segmentation-server/server.ts +++ b/examples/customer-segmentation-server/server.ts @@ -30,6 +30,29 @@ const GetCustomerDataInputSchema = z.object({ .describe("Filter by segment (default: All)"), }); +const CustomerSchema = z.object({ + id: z.string(), + name: z.string(), + segment: z.string(), + annualRevenue: z.number(), + employeeCount: z.number(), + accountAge: z.number(), + engagementScore: z.number(), + supportTickets: z.number(), + nps: z.number(), +}); + +const SegmentSummarySchema = z.object({ + name: z.string(), + count: z.number(), + color: z.string(), +}); + +const GetCustomerDataOutputSchema = z.object({ + customers: z.array(CustomerSchema), + segments: z.array(SegmentSummarySchema), +}); + // Cache generated data for session consistency let cachedCustomers: Customer[] | null = null; let cachedSegments: SegmentSummary[] | null = null; @@ -78,6 +101,7 @@ export function createServer(): McpServer { description: "Returns customer data with segment information for visualization. Optionally filter by segment.", inputSchema: GetCustomerDataInputSchema.shape, + outputSchema: GetCustomerDataOutputSchema.shape, _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, }, async ({ segment }): Promise => { @@ -85,6 +109,7 @@ export function createServer(): McpServer { return { content: [{ type: "text", text: JSON.stringify(data) }], + structuredContent: data, }; }, ); diff --git a/examples/integration-server/server.ts b/examples/integration-server/server.ts index d2edd23..700f1eb 100644 --- a/examples/integration-server/server.ts +++ b/examples/integration-server/server.ts @@ -6,6 +6,7 @@ import type { } from "@modelcontextprotocol/sdk/types.js"; import fs from "node:fs/promises"; import path from "node:path"; +import { z } from "zod"; import { registerAppTool, registerAppResource, @@ -33,16 +34,21 @@ export function createServer(): McpServer { title: "Get Time", description: "Returns the current server time.", inputSchema: {}, + outputSchema: z.object({ + time: z.string(), + }), _meta: { [RESOURCE_URI_META_KEY]: RESOURCE_URI }, }, async (): Promise => { + const time = new Date().toISOString(); return { content: [ { type: "text", - text: JSON.stringify({ time: new Date().toISOString() }), + text: JSON.stringify({ time }), }, ], + structuredContent: { time }, }; }, ); diff --git a/examples/integration-server/src/mcp-app.tsx b/examples/integration-server/src/mcp-app.tsx index fadffdb..7304ca9 100644 --- a/examples/integration-server/src/mcp-app.tsx +++ b/examples/integration-server/src/mcp-app.tsx @@ -17,13 +17,7 @@ const log = { }; function extractTime(callToolResult: CallToolResult): string { - const text = callToolResult - .content!.filter( - (c): c is { type: "text"; text: string } => c.type === "text", - ) - .map((c) => c.text) - .join(""); - const { time } = JSON.parse(text) as { time: string }; + const { time } = callToolResult.structuredContent as { time: string }; return time; } diff --git a/examples/scenario-modeler-server/server.ts b/examples/scenario-modeler-server/server.ts index 3ce2066..6abb352 100644 --- a/examples/scenario-modeler-server/server.ts +++ b/examples/scenario-modeler-server/server.ts @@ -64,6 +64,13 @@ const GetScenarioDataInputSchema = z.object({ ), }); +const GetScenarioDataOutputSchema = z.object({ + templates: z.array(ScenarioTemplateSchema), + defaultInputs: ScenarioInputsSchema, + customProjections: z.array(MonthlyProjectionSchema).optional(), + customSummary: ScenarioSummarySchema.optional(), +}); + // Types derived from schemas type ScenarioInputs = z.infer; type MonthlyProjection = z.infer; @@ -243,6 +250,37 @@ const DEFAULT_INPUTS: ScenarioInputs = { fixedCosts: 30000, }; +// ============================================================================ +// Formatters for text output +// ============================================================================ + +function formatCurrency(value: number): string { + const absValue = Math.abs(value); + const sign = value < 0 ? "-" : ""; + if (absValue >= 1_000_000) { + return `${sign}$${(absValue / 1_000_000).toFixed(2)}M`; + } + if (absValue >= 1_000) { + return `${sign}$${(absValue / 1_000).toFixed(1)}K`; + } + return `${sign}$${Math.round(absValue)}`; +} + +function formatScenarioSummary( + summary: ScenarioSummary, + label: string, +): string { + return [ + `${label}:`, + ` Ending MRR: ${formatCurrency(summary.endingMRR)}`, + ` ARR: ${formatCurrency(summary.arr)}`, + ` Total Revenue: ${formatCurrency(summary.totalRevenue)}`, + ` Total Profit: ${formatCurrency(summary.totalProfit)}`, + ` MRR Growth: ${summary.mrrGrowthPct.toFixed(1)}%`, + ` Break-even: ${summary.breakEvenMonth ? `Month ${summary.breakEvenMonth}` : "Not achieved"}`, + ].join("\n"); +} + // ============================================================================ // MCP Server // ============================================================================ @@ -269,6 +307,7 @@ export function createServer(): McpServer { description: "Returns SaaS scenario templates and optionally computes custom projections for given inputs", inputSchema: GetScenarioDataInputSchema.shape, + outputSchema: GetScenarioDataOutputSchema.shape, _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, }, async (args: { @@ -278,18 +317,28 @@ export function createServer(): McpServer { ? calculateScenario(args.customInputs) : undefined; + const text = [ + "SaaS Scenario Modeler", + "=".repeat(40), + "", + "Available Templates:", + ...SCENARIO_TEMPLATES.map( + (t) => ` ${t.icon} ${t.name}: ${t.description}`, + ), + "", + customScenario + ? formatScenarioSummary(customScenario.summary, "Custom Scenario") + : "Use customInputs parameter to compute projections for a specific scenario.", + ].join("\n"); + return { - content: [ - { - type: "text", - text: JSON.stringify({ - templates: SCENARIO_TEMPLATES, - defaultInputs: DEFAULT_INPUTS, - customProjections: customScenario?.projections, - customSummary: customScenario?.summary, - }), - }, - ], + content: [{ type: "text", text }], + structuredContent: { + templates: SCENARIO_TEMPLATES, + defaultInputs: DEFAULT_INPUTS, + customProjections: customScenario?.projections, + customSummary: customScenario?.summary, + }, }; }, ); diff --git a/examples/scenario-modeler-server/src/mcp-app.tsx b/examples/scenario-modeler-server/src/mcp-app.tsx index e436e5a..886e815 100644 --- a/examples/scenario-modeler-server/src/mcp-app.tsx +++ b/examples/scenario-modeler-server/src/mcp-app.tsx @@ -1,6 +1,5 @@ import type { McpUiHostContext } from "@modelcontextprotocol/ext-apps"; import { useApp } from "@modelcontextprotocol/ext-apps/react"; -import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; import { StrictMode, useState, useMemo, useCallback, useEffect } from "react"; import { createRoot } from "react-dom/client"; import { SliderRow } from "./components/SliderRow.tsx"; @@ -25,18 +24,6 @@ interface CallToolResultData { defaultInputs?: ScenarioInputs; } -/** Extract templates and defaultInputs from tool result content */ -function extractResultData(result: CallToolResult): CallToolResultData { - const text = result - .content!.filter( - (c): c is { type: "text"; text: string } => c.type === "text", - ) - .map((c) => c.text) - .join(""); - const { templates, defaultInputs } = JSON.parse(text) as CallToolResultData; - return { templates, defaultInputs }; -} - const APP_INFO = { name: "SaaS Scenario Modeler", version: "1.0.0" }; function getSafeAreaPaddingStyle(hostContext?: McpUiHostContext) { @@ -70,7 +57,8 @@ function ScenarioModeler() { capabilities: {}, onAppCreated: (app) => { app.ontoolresult = async (result) => { - const { templates, defaultInputs } = extractResultData(result); + const { templates, defaultInputs } = + result.structuredContent as unknown as CallToolResultData; if (templates) setTemplates(templates); if (defaultInputs) setDefaultInputs(defaultInputs); }; diff --git a/examples/system-monitor-server/server.ts b/examples/system-monitor-server/server.ts index 4cf5888..477a9ae 100644 --- a/examples/system-monitor-server/server.ts +++ b/examples/system-monitor-server/server.ts @@ -124,6 +124,7 @@ export function createServer(): McpServer { description: "Returns current system statistics including per-core CPU usage, memory, and system info.", inputSchema: {}, + outputSchema: SystemStatsSchema.shape, _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, }, async (): Promise => { @@ -151,6 +152,7 @@ export function createServer(): McpServer { return { content: [{ type: "text", text: JSON.stringify(stats) }], + structuredContent: stats, }; }, ); diff --git a/examples/system-monitor-server/src/mcp-app.ts b/examples/system-monitor-server/src/mcp-app.ts index 3973073..fceb73c 100644 --- a/examples/system-monitor-server/src/mcp-app.ts +++ b/examples/system-monitor-server/src/mcp-app.ts @@ -265,13 +265,7 @@ async function fetchStats(): Promise { arguments: {}, }); - const text = result - .content!.filter( - (c): c is { type: "text"; text: string } => c.type === "text", - ) - .map((c) => c.text) - .join(""); - const stats = JSON.parse(text) as SystemStats; + const stats = result.structuredContent as unknown as SystemStats; // Initialize chart on first data if needed if (!state.chart && stats.cpu.count > 0) { diff --git a/examples/threejs-server/server.ts b/examples/threejs-server/server.ts index e2f28c7..8181bad 100644 --- a/examples/threejs-server/server.ts +++ b/examples/threejs-server/server.ts @@ -166,16 +166,17 @@ export function createServer(): McpServer { .default(400) .describe("Height in pixels"), }, + outputSchema: z.object({ + code: z.string(), + height: z.number(), + }), _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, }, async ({ code, height }) => { + const data = { code, height }; return { - content: [ - { - type: "text", - text: JSON.stringify({ code, height }), - }, - ], + content: [{ type: "text", text: JSON.stringify(data) }], + structuredContent: data, }; }, ); diff --git a/examples/video-resource-server/server.ts b/examples/video-resource-server/server.ts index 70effca..0d3a33c 100644 --- a/examples/video-resource-server/server.ts +++ b/examples/video-resource-server/server.ts @@ -129,20 +129,21 @@ ${Object.entries(VIDEO_LIBRARY) `Video ID to play. Available: ${Object.keys(VIDEO_LIBRARY).join(", ")}`, ), }, + outputSchema: z.object({ + videoUri: z.string(), + description: z.string(), + }), _meta: { [RESOURCE_URI_META_KEY]: RESOURCE_URI }, }, async ({ videoId }): Promise => { const video = VIDEO_LIBRARY[videoId]; + const data = { + videoUri: `videos://${videoId}`, + description: video.description, + }; return { - content: [ - { - type: "text", - text: JSON.stringify({ - videoUri: `videos://${videoId}`, - description: video.description, - }), - }, - ], + content: [{ type: "text", text: JSON.stringify(data) }], + structuredContent: data, }; }, ); diff --git a/examples/video-resource-server/src/mcp-app.ts b/examples/video-resource-server/src/mcp-app.ts index f530ce7..693fe42 100644 --- a/examples/video-resource-server/src/mcp-app.ts +++ b/examples/video-resource-server/src/mcp-app.ts @@ -28,18 +28,10 @@ const videoInfoEl = document.getElementById("video-info")!; function parseToolResult( result: CallToolResult, ): { videoUri: string; description: string } | null { - const text = result.content - ?.filter((c): c is { type: "text"; text: string } => c.type === "text") - .map((c) => c.text) - .join(""); - - if (!text) return null; - - try { - return JSON.parse(text) as { videoUri: string; description: string }; - } catch { - return null; - } + return result.structuredContent as { + videoUri: string; + description: string; + } | null; } // Show states diff --git a/examples/wiki-explorer-server/server.ts b/examples/wiki-explorer-server/server.ts index 063cacf..69002c1 100644 --- a/examples/wiki-explorer-server/server.ts +++ b/examples/wiki-explorer-server/server.ts @@ -95,6 +95,19 @@ export function createServer(): McpServer { .default("https://en.wikipedia.org/wiki/Model_Context_Protocol") .describe("Wikipedia page URL"), }), + outputSchema: z.object({ + page: z.object({ + url: z.string(), + title: z.string(), + }), + links: z.array( + z.object({ + url: z.string(), + title: z.string(), + }), + ), + error: z.string().nullable(), + }), _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, }, async ({ url }): Promise => { @@ -121,11 +134,17 @@ export function createServer(): McpServer { const links = extractWikiLinks(new URL(url), html); const result = { page: { url, title }, links, error: null }; - return { content: [{ type: "text", text: JSON.stringify(result) }] }; + return { + content: [{ type: "text", text: JSON.stringify(result) }], + structuredContent: result, + }; } catch (err) { const error = err instanceof Error ? err.message : String(err); const result = { page: { url, title }, links: [], error }; - return { content: [{ type: "text", text: JSON.stringify(result) }] }; + return { + content: [{ type: "text", text: JSON.stringify(result) }], + structuredContent: result, + }; } }, ); diff --git a/examples/wiki-explorer-server/src/mcp-app.ts b/examples/wiki-explorer-server/src/mcp-app.ts index 6bd5c26..06ab391 100644 --- a/examples/wiki-explorer-server/src/mcp-app.ts +++ b/examples/wiki-explorer-server/src/mcp-app.ts @@ -322,44 +322,36 @@ app.ontoolresult = (result) => { }; function handleToolResultData(result: CallToolResult): void { - if ( - result.isError || - !result.content?.[0] || - result.content[0].type !== "text" - ) { + if (result.isError) { console.error("Tool result error:", result); return; } - try { - const response: ToolResponse = JSON.parse(result.content[0].text); - const { page, links, error } = response; + const response = result.structuredContent as unknown as ToolResponse; + const { page, links, error } = response; - // Ensure the source node exists - addNode(page.url, page.title); - updateNodeTitle(page.url, page.title); + // Ensure the source node exists + addNode(page.url, page.title); + updateNodeTitle(page.url, page.title); - if (error) { - setNodeState(page.url, "error", error); - } else { - // Get source node position so new nodes appear nearby - const sourceNode = graphData.nodes.find((n) => n.url === page.url); - const sourcePos = sourceNode - ? { x: sourceNode.x ?? 0, y: sourceNode.y ?? 0 } - : undefined; + if (error) { + setNodeState(page.url, "error", error); + } else { + // Get source node position so new nodes appear nearby + const sourceNode = graphData.nodes.find((n) => n.url === page.url); + const sourcePos = sourceNode + ? { x: sourceNode.x ?? 0, y: sourceNode.y ?? 0 } + : undefined; - // Add all linked nodes and edges - for (const link of links) { - addNode(link.url, link.title, "default", sourcePos); - addEdge(page.url, link.url); - } - setNodeState(page.url, "expanded"); + // Add all linked nodes and edges + for (const link of links) { + addNode(link.url, link.title, "default", sourcePos); + addEdge(page.url, link.url); } - - updateGraph(); - } catch (e) { - console.error("Failed to parse tool result:", e); + setNodeState(page.url, "expanded"); } + + updateGraph(); } app.onerror = (err) => { diff --git a/package-lock.json b/package-lock.json index 8b74a9e..b63c292 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1635,9 +1635,9 @@ } }, "node_modules/@hono/node-server": { - "version": "1.19.7", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.7.tgz", - "integrity": "sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw==", + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.8.tgz", + "integrity": "sha512-0/g2lIOPzX8f3vzW1ggQgvG5mjtFBDBHFAzI5SFAi2DzSqS9luJwqg9T6O/gKYLi+inS7eNxBeIFkkghIPvrMA==", "license": "MIT", "engines": { "node": ">=18.14.1" @@ -3358,9 +3358,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.9.13", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.13.tgz", - "integrity": "sha512-WhtvB2NG2wjr04+h77sg3klAIwrgOqnjS49GGudnUPGFFgg7G17y7Qecqp+2Dr5kUDxNRBca0SK7cG8JwzkWDQ==", + "version": "2.9.14", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.14.tgz", + "integrity": "sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==", "dev": true, "license": "Apache-2.0", "bin": { From 9acc52cb96a5c00d86ad0c097607c6712be14545 Mon Sep 17 00:00:00 2001 From: Ido Salomon Date: Mon, 12 Jan 2026 17:10:27 +0200 Subject: [PATCH 009/352] feat: enhance sandbox capability negotiation (#158) * feat: enhance sandbox capability negotiation * Update specification/draft/apps.mdx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * add all csp and permissions to host capabilities + update SEP * feat: add clipboard-write permission support Adds clipboardWrite to McpUiResourcePermissions for clipboard access. Maps to Permission Policy 'clipboard-write' feature. * rm files added by mistake * refactor: change McpUiResourcePermissions properties to empty objects * chore: remove scratch files and redundant cross-env dependency --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Olivier Chafik --- examples/basic-host/src/implementation.ts | 16 +- examples/basic-host/src/sandbox.ts | 26 ++- specification/draft/apps.mdx | 136 +++++++++++- src/generated/schema.json | 239 ++++++++++++++++++++++ src/generated/schema.test.ts | 10 + src/generated/schema.ts | 56 +++++ src/spec.types.ts | 27 +++ src/types.ts | 2 + 8 files changed, 496 insertions(+), 16 deletions(-) diff --git a/examples/basic-host/src/implementation.ts b/examples/basic-host/src/implementation.ts index e40f5de..ace3143 100644 --- a/examples/basic-host/src/implementation.ts +++ b/examples/basic-host/src/implementation.ts @@ -1,4 +1,4 @@ -import { RESOURCE_MIME_TYPE, getToolUiResourceUri, type McpUiSandboxProxyReadyNotification, AppBridge, PostMessageTransport, type McpUiResourceCsp } from "@modelcontextprotocol/ext-apps/app-bridge"; +import { RESOURCE_MIME_TYPE, getToolUiResourceUri, type McpUiSandboxProxyReadyNotification, AppBridge, PostMessageTransport, type McpUiResourceCsp, type McpUiResourcePermissions } from "@modelcontextprotocol/ext-apps/app-bridge"; import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; import type { CallToolResult, Tool } from "@modelcontextprotocol/sdk/types.js"; @@ -43,6 +43,7 @@ export async function connectToServer(serverUrl: URL): Promise { interface UiResourceData { html: string; csp?: McpUiResourceCsp; + permissions?: McpUiResourcePermissions; } export interface ToolCallInfo { @@ -105,15 +106,16 @@ async function getUiResource(serverInfo: ServerInfo, uri: string): Promise { if (event.source === window.parent) { // Validate that messages from parent come from the expected host origin. @@ -81,10 +99,16 @@ window.addEventListener("message", async (event) => { } if (event.data && event.data.method === RESOURCE_READY_NOTIFICATION) { - const { html, sandbox } = event.data.params; + const { html, sandbox, permissions } = event.data.params; if (typeof sandbox === "string") { inner.setAttribute("sandbox", sandbox); } + // Set Permission Policy allow attribute if permissions are requested + const allowAttribute = buildAllowAttribute(permissions); + if (allowAttribute) { + console.log("[Sandbox] Setting allow attribute:", allowAttribute); + inner.setAttribute("allow", allowAttribute); + } if (typeof html === "string") { // Use document.write instead of srcdoc for WebGL compatibility. // srcdoc creates an opaque origin which prevents WebGL canvas updates diff --git a/specification/draft/apps.mdx b/specification/draft/apps.mdx index d2cf0c2..e448bb9 100644 --- a/specification/draft/apps.mdx +++ b/specification/draft/apps.mdx @@ -132,11 +132,23 @@ interface McpUiResourceCsp { */ resourceDomains?: string[], /** - * Origins for nested iframes (frame-src directive). + * Origins for nested iframes + * + * - Empty or omitted = no nested iframes allowed (`frame-src 'none'`) + * - Maps to CSP `frame-src` directive + * + * @example + * ["https://www.youtube.com", "https://player.vimeo.com"] */ frameDomains?: string[], /** - * Allowed base URIs for the document (base-uri directive). + * Allowed base URIs for the document + * + * - Empty or omitted = only same origin allowed (`base-uri 'self'`) + * - Maps to CSP `base-uri` directive + * + * @example + * ["https://cdn.example.com"] */ baseUriDomains?: string[], } @@ -149,6 +161,39 @@ interface UIResourceMeta { * Hosts use this to enforce appropriate CSP headers. */ csp?: McpUiResourceCsp, + /** + * Sandbox permissions requested by the UI + * + * Servers declare which browser capabilities their UI needs. + * Hosts MAY honor these by setting appropriate iframe `allow` attributes. + * Apps SHOULD NOT assume permissions are granted; use JS feature detection as fallback. + */ + permissions?: { + /** + * Request camera access + * + * Maps to Permission Policy `camera` feature + */ + camera?: boolean, + /** + * Request microphone access + * + * Maps to Permission Policy `microphone` feature + */ + microphone?: boolean, + /** + * Request geolocation access + * + * Maps to Permission Policy `geolocation` feature + */ + geolocation?: boolean, + /** + * Request clipboard write access + * + * Maps to Permission Policy `clipboard-write` feature + */ + clipboardWrite?: boolean, + }, /** * Dedicated origin for widget * @@ -193,6 +238,12 @@ The resource content is returned via `resources/read`: frameDomains?: string[]; // Origins for nested iframes (frame-src directive). baseUriDomains?: string[]; // Allowed base URIs for the document (base-uri directive). }; + permissions?: { + camera?: boolean; // Request camera access + microphone?: boolean; // Request microphone access + geolocation?: boolean; // Request geolocation access + clipboardWrite?: boolean; // Request clipboard write access + }; domain?: string; prefersBorder?: boolean; }; @@ -416,9 +467,11 @@ If the Host is a web page, it MUST wrap the Guest UI and communicate with it thr 4. Once the Sandbox is ready, the Host MUST send the raw HTML resource to load in a `ui/notifications/sandbox-resource-ready` notification. 5. The Sandbox MUST load the raw HTML of the Guest UI with CSP settings that: - Enforce the domains declared in `ui.csp` metadata - - Prevent nested iframes (`frame-src 'none'`) - - Block dangerous features (`object-src 'none'`, `base-uri 'self'`) + - If `frameDomains` is provided, allow nested iframes from declared origins; otherwise use `frame-src 'none'` + - If `baseUriDomains` is provided, allow base URIs from declared origins; otherwise use `base-uri 'self'` + - Block dangerous features (`object-src 'none'`) - Apply restrictive defaults if no CSP metadata is provided + - If `permissions` is declared, the Sandbox MAY set the inner iframe's `allow` attribute accordingly 6. The Sandbox MUST forward messages sent by the Host to the Guest UI, and vice versa, for any method that doesnโ€™t start with `ui/notifications/sandbox-`. This includes lifecycle messages, e.g., `ui/initialize` request & `ui/notifications/initialized` notification both sent by the Guest UI. The Host MUST NOT send any request or notification to the Guest UI before it receives an `initialized` notification. 7. The Sandbox SHOULD NOT create/send any requests to the Host or to the Guest UI (this would require synthesizing new request ids). 8. The Host MAY forward any message from the Guest UI (coming via the Sandbox) to the MCP Apps server, for any method that doesnโ€™t start with `ui/`. While the Host SHOULD ensure the Guest UIโ€™s MCP connection is spec-compliant, it MAY decide to block some messages or subject them to further user approval. @@ -535,6 +588,53 @@ Example: } ``` +### Host Capabilities + +`HostCapabilities` are sent to the Guest UI as part of the response to `ui/initialize` (inside `McpUiInitializeResult`). +They describe the features and capabilities that the Host supports. + +```typescript +interface HostCapabilities { + /** Experimental features (structure TBD). */ + experimental?: {}; + /** Host supports opening external URLs. */ + openLinks?: {}; + /** Host can proxy tool calls to the MCP server. */ + serverTools?: { + /** Host supports tools/list_changed notifications. */ + listChanged?: boolean; + }; + /** Host can proxy resource reads to the MCP server. */ + serverResources?: { + /** Host supports resources/list_changed notifications. */ + listChanged?: boolean; + }; + /** Host accepts log messages. */ + logging?: {}; + /** Sandbox configuration applied by the host. */ + sandbox?: { + /** Permissions granted by the host (camera, microphone, geolocation, clipboard-write). */ + permissions?: { + camera?: boolean; + microphone?: boolean; + geolocation?: boolean; + clipboardWrite?: boolean; + }; + /** CSP domains approved by the host. */ + csp?: { + /** Approved origins for network requests (fetch/XHR/WebSocket). */ + connectDomains?: string[]; + /** Approved origins for static resources (scripts, images, styles, fonts). */ + resourceDomains?: string[]; + /** Approved origins for nested iframes (frame-src directive). */ + frameDomains?: string[]; + /** Approved base URIs for the document (base-uri directive). */ + baseUriDomains?: string[]; + }; + }; +} +``` + ### Container Dimensions The `HostContext` provides sizing information via `containerDimensions`: @@ -1028,12 +1128,24 @@ These messages are reserved for web-based hosts that implement the recommended d method: "ui/notifications/sandbox-resource-ready", params: { html: string, // HTML content to load - sandbox: string // Optional override for inner iframe `sandbox` attribute + sandbox?: string, // Optional override for inner iframe `sandbox` attribute + csp?: { // CSP configuration from resource metadata + connectDomains?: string[], + resourceDomains?: string[], + frameDomains?: string[], + baseUriDomains?: string[], + }, + permissions?: { // Sandbox permissions from resource metadata + camera?: boolean, + microphone?: boolean, + geolocation?: boolean, + clipboardWrite?: boolean, + } } } ``` -These messages facilitate the communication between the outer sandbox proxy iframe and the host, enabling secure loading of untrusted HTML content. +These messages facilitate the communication between the outer sandbox proxy iframe and the host, enabling secure loading of untrusted HTML content. The `permissions` field maps to the inner iframe's `allow` attribute for Permission Policy features. ### Lifecycle @@ -1489,6 +1601,7 @@ Hosts MUST enforce Content Security Policies based on resource metadata. ```typescript const csp = resource._meta?.ui?.csp; +const permissions = resource._meta?.ui?.permissions; const cspValue = ` default-src 'none'; @@ -1498,10 +1611,17 @@ const cspValue = ` img-src 'self' data: ${csp?.resourceDomains?.join(' ') || ''}; font-src 'self' ${csp?.resourceDomains?.join(' ') || ''}; media-src 'self' data: ${csp?.resourceDomains?.join(' ') || ''}; - frame-src 'none'; + frame-src ${csp?.frameDomains?.join(' ') || "'none'"}; object-src 'none'; - base-uri 'self'; + base-uri ${csp?.baseUriDomains?.join(' ') || "'self'"}; `; + +// Permission Policy for iframe allow attribute +const allowList: string[] = []; +if (permissions?.camera) allowList.push('camera'); +if (permissions?.microphone) allowList.push('microphone'); +if (permissions?.geolocation) allowList.push('geolocation'); +const allowAttribute = allowList.join(' '); ``` **Security Requirements:** diff --git a/src/generated/schema.json b/src/generated/schema.json index 281b058..61385e4 100644 --- a/src/generated/schema.json +++ b/src/generated/schema.json @@ -89,6 +89,79 @@ "type": "object", "properties": {}, "additionalProperties": false + }, + "sandbox": { + "description": "Sandbox configuration applied by the host.", + "type": "object", + "properties": { + "permissions": { + "description": "Permissions granted by the host (camera, microphone, geolocation).", + "type": "object", + "properties": { + "camera": { + "description": "Request camera access (Permission Policy `camera` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "microphone": { + "description": "Request microphone access (Permission Policy `microphone` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "geolocation": { + "description": "Request geolocation access (Permission Policy `geolocation` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "clipboardWrite": { + "description": "Request clipboard write access (Permission Policy `clipboard-write` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "csp": { + "description": "CSP domains approved by the host.", + "type": "object", + "properties": { + "connectDomains": { + "description": "Origins for network requests (fetch/XHR/WebSocket).", + "type": "array", + "items": { + "type": "string" + } + }, + "resourceDomains": { + "description": "Origins for static resources (scripts, images, styles, fonts).", + "type": "array", + "items": { + "type": "string" + } + }, + "frameDomains": { + "description": "Origins for nested iframes (frame-src directive).", + "type": "array", + "items": { + "type": "string" + } + }, + "baseUriDomains": { + "description": "Allowed base URIs for the document (base-uri directive).", + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false } }, "additionalProperties": false @@ -2231,6 +2304,79 @@ "type": "object", "properties": {}, "additionalProperties": false + }, + "sandbox": { + "description": "Sandbox configuration applied by the host.", + "type": "object", + "properties": { + "permissions": { + "description": "Permissions granted by the host (camera, microphone, geolocation).", + "type": "object", + "properties": { + "camera": { + "description": "Request camera access (Permission Policy `camera` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "microphone": { + "description": "Request microphone access (Permission Policy `microphone` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "geolocation": { + "description": "Request geolocation access (Permission Policy `geolocation` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "clipboardWrite": { + "description": "Request clipboard write access (Permission Policy `clipboard-write` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "csp": { + "description": "CSP domains approved by the host.", + "type": "object", + "properties": { + "connectDomains": { + "description": "Origins for network requests (fetch/XHR/WebSocket).", + "type": "array", + "items": { + "type": "string" + } + }, + "resourceDomains": { + "description": "Origins for static resources (scripts, images, styles, fonts).", + "type": "array", + "items": { + "type": "string" + } + }, + "frameDomains": { + "description": "Origins for nested iframes (frame-src directive).", + "type": "array", + "items": { + "type": "string" + } + }, + "baseUriDomains": { + "description": "Allowed base URIs for the document (base-uri directive).", + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false } }, "additionalProperties": false, @@ -3532,6 +3678,37 @@ }, "additionalProperties": false }, + "permissions": { + "description": "Sandbox permissions requested by the UI.", + "type": "object", + "properties": { + "camera": { + "description": "Request camera access (Permission Policy `camera` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "microphone": { + "description": "Request microphone access (Permission Policy `microphone` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "geolocation": { + "description": "Request geolocation access (Permission Policy `geolocation` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "clipboardWrite": { + "description": "Request clipboard write access (Permission Policy `clipboard-write` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, "domain": { "description": "Dedicated origin for widget sandbox.", "type": "string" @@ -3543,6 +3720,37 @@ }, "additionalProperties": false }, + "McpUiResourcePermissions": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "camera": { + "description": "Request camera access (Permission Policy `camera` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "microphone": { + "description": "Request microphone access (Permission Policy `microphone` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "geolocation": { + "description": "Request geolocation access (Permission Policy `geolocation` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "clipboardWrite": { + "description": "Request clipboard write access (Permission Policy `clipboard-write` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, "McpUiResourceTeardownRequest": { "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", @@ -3638,6 +3846,37 @@ } }, "additionalProperties": false + }, + "permissions": { + "description": "Sandbox permissions from resource metadata.", + "type": "object", + "properties": { + "camera": { + "description": "Request camera access (Permission Policy `camera` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "microphone": { + "description": "Request microphone access (Permission Policy `microphone` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "geolocation": { + "description": "Request geolocation access (Permission Policy `geolocation` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "clipboardWrite": { + "description": "Request clipboard write access (Permission Policy `clipboard-write` feature).", + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false } }, "required": ["html"], diff --git a/src/generated/schema.test.ts b/src/generated/schema.test.ts index caca83a..5bbcd5c 100644 --- a/src/generated/schema.test.ts +++ b/src/generated/schema.test.ts @@ -47,6 +47,10 @@ export type McpUiResourceCspSchemaInferredType = z.infer< typeof generated.McpUiResourceCspSchema >; +export type McpUiResourcePermissionsSchemaInferredType = z.infer< + typeof generated.McpUiResourcePermissionsSchema +>; + export type McpUiSizeChangedNotificationSchemaInferredType = z.infer< typeof generated.McpUiSizeChangedNotificationSchema >; @@ -173,6 +177,12 @@ expectType( ); expectType({} as McpUiResourceCspSchemaInferredType); expectType({} as spec.McpUiResourceCsp); +expectType( + {} as McpUiResourcePermissionsSchemaInferredType, +); +expectType( + {} as spec.McpUiResourcePermissions, +); expectType( {} as McpUiSizeChangedNotificationSchemaInferredType, ); diff --git a/src/generated/schema.ts b/src/generated/schema.ts index 35ef24f..8de9bb5 100644 --- a/src/generated/schema.ts +++ b/src/generated/schema.ts @@ -211,6 +211,40 @@ export const McpUiResourceCspSchema = z.object({ .describe("Allowed base URIs for the document (base-uri directive)."), }); +/** + * @description Sandbox permissions requested by the UI resource. + * Hosts MAY honor these by setting appropriate iframe `allow` attributes. + * Apps SHOULD NOT assume permissions are granted; use JS feature detection as fallback. + */ +export const McpUiResourcePermissionsSchema = z.object({ + /** @description Request camera access (Permission Policy `camera` feature). */ + camera: z + .object({}) + .optional() + .describe("Request camera access (Permission Policy `camera` feature)."), + /** @description Request microphone access (Permission Policy `microphone` feature). */ + microphone: z + .object({}) + .optional() + .describe( + "Request microphone access (Permission Policy `microphone` feature).", + ), + /** @description Request geolocation access (Permission Policy `geolocation` feature). */ + geolocation: z + .object({}) + .optional() + .describe( + "Request geolocation access (Permission Policy `geolocation` feature).", + ), + /** @description Request clipboard write access (Permission Policy `clipboard-write` feature). */ + clipboardWrite: z + .object({}) + .optional() + .describe( + "Request clipboard write access (Permission Policy `clipboard-write` feature).", + ), +}); + /** * @description Notification of UI size changes (bidirectional: Guest <-> Host). * @see {@link app.App.sendSizeChanged} for the method to send this from Guest UI @@ -363,6 +397,20 @@ export const McpUiHostCapabilitiesSchema = z.object({ .describe("Host can proxy resource reads to the MCP server."), /** @description Host accepts log messages. */ logging: z.object({}).optional().describe("Host accepts log messages."), + /** @description Sandbox configuration applied by the host. */ + sandbox: z + .object({ + /** @description Permissions granted by the host (camera, microphone, geolocation). */ + permissions: McpUiResourcePermissionsSchema.optional().describe( + "Permissions granted by the host (camera, microphone, geolocation).", + ), + /** @description CSP domains approved by the host. */ + csp: McpUiResourceCspSchema.optional().describe( + "CSP domains approved by the host.", + ), + }) + .optional() + .describe("Sandbox configuration applied by the host."), }); /** @@ -405,6 +453,10 @@ export const McpUiResourceMetaSchema = z.object({ csp: McpUiResourceCspSchema.optional().describe( "Content Security Policy configuration.", ), + /** @description Sandbox permissions requested by the UI. */ + permissions: McpUiResourcePermissionsSchema.optional().describe( + "Sandbox permissions requested by the UI.", + ), /** @description Dedicated origin for widget sandbox. */ domain: z .string() @@ -514,6 +566,10 @@ export const McpUiSandboxResourceReadyNotificationSchema = z.object({ csp: McpUiResourceCspSchema.optional().describe( "CSP configuration from resource metadata.", ), + /** @description Sandbox permissions from resource metadata. */ + permissions: McpUiResourcePermissionsSchema.optional().describe( + "Sandbox permissions from resource metadata.", + ), }), }); diff --git a/src/spec.types.ts b/src/spec.types.ts index 715e0cb..3e87209 100644 --- a/src/spec.types.ts +++ b/src/spec.types.ts @@ -220,6 +220,8 @@ export interface McpUiSandboxResourceReadyNotification { sandbox?: string; /** @description CSP configuration from resource metadata. */ csp?: McpUiResourceCsp; + /** @description Sandbox permissions from resource metadata. */ + permissions?: McpUiResourcePermissions; }; } @@ -423,6 +425,13 @@ export interface McpUiHostCapabilities { }; /** @description Host accepts log messages. */ logging?: {}; + /** @description Sandbox configuration applied by the host. */ + sandbox?: { + /** @description Permissions granted by the host (camera, microphone, geolocation). */ + permissions?: McpUiResourcePermissions; + /** @description CSP domains approved by the host. */ + csp?: McpUiResourceCsp; + }; } /** @@ -498,12 +507,30 @@ export interface McpUiResourceCsp { baseUriDomains?: string[]; } +/** + * @description Sandbox permissions requested by the UI resource. + * Hosts MAY honor these by setting appropriate iframe `allow` attributes. + * Apps SHOULD NOT assume permissions are granted; use JS feature detection as fallback. + */ +export interface McpUiResourcePermissions { + /** @description Request camera access (Permission Policy `camera` feature). */ + camera?: {}; + /** @description Request microphone access (Permission Policy `microphone` feature). */ + microphone?: {}; + /** @description Request geolocation access (Permission Policy `geolocation` feature). */ + geolocation?: {}; + /** @description Request clipboard write access (Permission Policy `clipboard-write` feature). */ + clipboardWrite?: {}; +} + /** * @description UI Resource metadata for security and rendering configuration. */ export interface McpUiResourceMeta { /** @description Content Security Policy configuration. */ csp?: McpUiResourceCsp; + /** @description Sandbox permissions requested by the UI. */ + permissions?: McpUiResourcePermissions; /** @description Dedicated origin for widget sandbox. */ domain?: string; /** @description Visual boundary preference - true if UI prefers a visible border. */ diff --git a/src/types.ts b/src/types.ts index da4a71f..006680c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -53,6 +53,7 @@ export { type McpUiInitializeResult, type McpUiInitializedNotification, type McpUiResourceCsp, + type McpUiResourcePermissions, type McpUiResourceMeta, type McpUiRequestDisplayModeRequest, type McpUiRequestDisplayModeResult, @@ -110,6 +111,7 @@ export { McpUiInitializeResultSchema, McpUiInitializedNotificationSchema, McpUiResourceCspSchema, + McpUiResourcePermissionsSchema, McpUiResourceMetaSchema, McpUiRequestDisplayModeRequestSchema, McpUiRequestDisplayModeResultSchema, From b273279849f989bc241848734bfbfe49c49e461d Mon Sep 17 00:00:00 2001 From: Ido Salomon Date: Mon, 12 Jan 2026 17:21:45 +0200 Subject: [PATCH 010/352] feat: add ui/update-model-context (#125) --------- Co-authored-by: Olivier Chafik --- specification/draft/apps.mdx | 52 +++- src/app-bridge.test.ts | 76 +++++ src/app-bridge.ts | 46 ++- src/app.ts | 48 +++ src/generated/schema.json | 560 +++++++++++++++++++++++++++++++++++ src/generated/schema.test.ts | 20 ++ src/generated/schema.ts | 72 +++++ src/spec.types.ts | 41 +++ src/types.ts | 6 + 9 files changed, 918 insertions(+), 3 deletions(-) diff --git a/specification/draft/apps.mdx b/specification/draft/apps.mdx index e448bb9..aed5611 100644 --- a/specification/draft/apps.mdx +++ b/specification/draft/apps.mdx @@ -979,6 +979,49 @@ Guest UI behavior: * Guest UI SHOULD check `availableDisplayModes` in host context before requesting a mode change. * Guest UI MUST handle the response mode differing from the requested mode. +`ui/update-model-context` - Update the model context + +```typescript +// Request +{ + jsonrpc: "2.0", + id: 3, + method: "ui/update-model-context", + params: { + content?: ContentBlock[], + structuredContent?: Record + } +} + +// Success Response +{ + jsonrpc: "2.0", + id: 3, + result: {} // Empty result on success +} + +// Error Response (if denied or failed) +{ + jsonrpc: "2.0", + id: 3, + error: { + code: -32000, // Implementation-defined error + message: "Context update denied" | "Invalid content format" + } +} +``` + +Guest UI MAY send this request to update the Host's model context. This context will be used in future turns. Each request overwrites the previous context sent by the Guest UI. +This event serves a different use case from `notifications/message` (logging) and `ui/message` (which also trigger follow-ups). + +Host behavior: +- SHOULD provide the context to the model in future turns +- MAY overwrite the previous model context with the new update +- MAY defer sending the context to the model until the next user message (including `ui/message`) +- MAY dedupe identical `ui/update-model-context` calls +- If multiple updates are received before the next user message, Host SHOULD only send the last update to the model +- MAY display context updates to the user + #### Notifications (Host โ†’ UI) `ui/notifications/tool-input` - Host MUST send this notification with the complete tool arguments after the Guest UI's initialize request completes. @@ -1222,10 +1265,15 @@ sequenceDiagram H-->>UI: ui/notifications/tool-result else Message UI ->> H: ui/message + H -->> UI: ui/message response H -->> H: Process message and follow up - else Notify + else Context update + UI ->> H: ui/update-model-context + H ->> H: Store model context (overwrite existing) + H -->> UI: ui/update-model-context response + else Log UI ->> H: notifications/message - H ->> H: Process notification and store in context + H ->> H: Record log for debugging/telemetry else Resource read UI ->> H: resources/read H ->> S: resources/read diff --git a/src/app-bridge.test.ts b/src/app-bridge.test.ts index 1e55f6b..66d5f83 100644 --- a/src/app-bridge.test.ts +++ b/src/app-bridge.test.ts @@ -442,6 +442,82 @@ describe("App <-> AppBridge integration", () => { logger: "TestApp", }); }); + + it("app.updateModelContext triggers bridge.onupdatemodelcontext and returns result", async () => { + const receivedContexts: unknown[] = []; + bridge.onupdatemodelcontext = async (params) => { + receivedContexts.push(params); + return {}; + }; + + await app.connect(appTransport); + const result = await app.updateModelContext({ + content: [{ type: "text", text: "User selected 3 items" }], + }); + + expect(receivedContexts).toHaveLength(1); + expect(receivedContexts[0]).toMatchObject({ + content: [{ type: "text", text: "User selected 3 items" }], + }); + expect(result).toEqual({}); + }); + + it("app.updateModelContext works with multiple content blocks", async () => { + const receivedContexts: unknown[] = []; + bridge.onupdatemodelcontext = async (params) => { + receivedContexts.push(params); + return {}; + }; + + await app.connect(appTransport); + const result = await app.updateModelContext({ + content: [ + { type: "text", text: "Filter applied" }, + { type: "text", text: "Category: electronics" }, + ], + }); + + expect(receivedContexts).toHaveLength(1); + expect(receivedContexts[0]).toMatchObject({ + content: [ + { type: "text", text: "Filter applied" }, + { type: "text", text: "Category: electronics" }, + ], + }); + expect(result).toEqual({}); + }); + + it("app.updateModelContext works with structuredContent", async () => { + const receivedContexts: unknown[] = []; + bridge.onupdatemodelcontext = async (params) => { + receivedContexts.push(params); + return {}; + }; + + await app.connect(appTransport); + const result = await app.updateModelContext({ + structuredContent: { selectedItems: 3, total: 150.0, currency: "USD" }, + }); + + expect(receivedContexts).toHaveLength(1); + expect(receivedContexts[0]).toMatchObject({ + structuredContent: { selectedItems: 3, total: 150.0, currency: "USD" }, + }); + expect(result).toEqual({}); + }); + + it("app.updateModelContext throws when handler throws", async () => { + bridge.onupdatemodelcontext = async () => { + throw new Error("Context update failed"); + }; + + await app.connect(appTransport); + await expect( + app.updateModelContext({ + content: [{ type: "text", text: "Test" }], + }), + ).rejects.toThrow("Context update failed"); + }); }); describe("App -> Host requests", () => { diff --git a/src/app-bridge.ts b/src/app-bridge.ts index f9ff699..69b8993 100644 --- a/src/app-bridge.ts +++ b/src/app-bridge.ts @@ -5,6 +5,7 @@ import { CallToolRequestSchema, CallToolResult, CallToolResultSchema, + EmptyResult, Implementation, ListPromptsRequest, ListPromptsRequestSchema, @@ -51,6 +52,8 @@ import { type McpUiToolResultNotification, LATEST_PROTOCOL_VERSION, McpUiAppCapabilities, + McpUiUpdateModelContextRequest, + McpUiUpdateModelContextRequestSchema, McpUiHostCapabilities, McpUiHostContext, McpUiHostContextChangedNotification, @@ -66,7 +69,6 @@ import { McpUiOpenLinkRequestSchema, McpUiOpenLinkResult, McpUiResourceTeardownRequest, - McpUiResourceTeardownResult, McpUiResourceTeardownResultSchema, McpUiSandboxProxyReadyNotification, McpUiSandboxProxyReadyNotificationSchema, @@ -633,6 +635,48 @@ export class AppBridge extends Protocol< ); } + /** + * Register a handler for model context updates from the Guest UI. + * + * The Guest UI sends `ui/update-model-context` requests to update the Host's + * model context. Each request overwrites the previous context stored by the Guest UI. + * Unlike logging messages, context updates are intended to be available to + * the model in future turns. Unlike messages, context updates do not trigger follow-ups. + * + * The host will typically defer sending the context to the model until the + * next user message (including `ui/message`), and will only send the last + * update received. + * + * @example + * ```typescript + * bridge.onupdatemodelcontext = async ({ content, structuredContent }, extra) => { + * // Update the model context with the new snapshot + * modelContext = { + * type: "app_context", + * content, + * structuredContent, + * timestamp: Date.now() + * }; + * return {}; + * }; + * ``` + * + * @see {@link McpUiUpdateModelContextRequest} for the request type + */ + set onupdatemodelcontext( + callback: ( + params: McpUiUpdateModelContextRequest["params"], + extra: RequestHandlerExtra, + ) => Promise, + ) { + this.setRequestHandler( + McpUiUpdateModelContextRequestSchema, + async (request, extra) => { + return callback(request.params, extra); + }, + ); + } + /** * Register a handler for tool call requests from the Guest UI. * diff --git a/src/app.ts b/src/app.ts index 129b580..2b43cd5 100644 --- a/src/app.ts +++ b/src/app.ts @@ -9,6 +9,7 @@ import { CallToolRequestSchema, CallToolResult, CallToolResultSchema, + EmptyResultSchema, Implementation, ListToolsRequest, ListToolsRequestSchema, @@ -20,6 +21,7 @@ import { PostMessageTransport } from "./message-transport"; import { LATEST_PROTOCOL_VERSION, McpUiAppCapabilities, + McpUiUpdateModelContextRequest, McpUiHostCapabilities, McpUiHostContext, McpUiHostContextChangedNotification, @@ -809,6 +811,52 @@ export class App extends Protocol { }); } + /** + * Update the host's model context with app state. + * + * Unlike `sendLog`, which is for debugging/telemetry, context updates + * are intended to be available to the model in future reasoning, + * without requiring a follow-up action (like `sendMessage`). + * + * The host will typically defer sending the context to the model until the + * next user message (including `ui/message`), and will only send the last + * update received. Each call overwrites any previous context update. + * + * @param params - Context content and/or structured content + * @param options - Request options (timeout, etc.) + * + * @throws {Error} If the host rejects the context update (e.g., unsupported content type) + * + * @example Update model context with current app state + * ```typescript + * await app.updateModelContext({ + * content: [{ type: "text", text: "User selected 3 items totaling $150.00" }] + * }); + * ``` + * + * @example Update with structured content + * ```typescript + * await app.updateModelContext({ + * structuredContent: { selectedItems: 3, total: 150.00, currency: "USD" } + * }); + * ``` + * + * @returns Promise that resolves when the context update is acknowledged + */ + updateModelContext( + params: McpUiUpdateModelContextRequest["params"], + options?: RequestOptions, + ) { + return this.request( + { + method: "ui/update-model-context", + params, + }, + EmptyResultSchema, + options, + ); + } + /** * Request the host to open an external URL in the default browser. * diff --git a/src/generated/schema.json b/src/generated/schema.json index 61385e4..1d87d9c 100644 --- a/src/generated/schema.json +++ b/src/generated/schema.json @@ -162,6 +162,92 @@ } }, "additionalProperties": false + }, + "updateModelContext": { + "description": "Host accepts context updates (ui/update-model-context) to be included in the model's context for future turns.", + "type": "object", + "properties": { + "text": { + "description": "Host supports text content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "image": { + "description": "Host supports image content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "audio": { + "description": "Host supports audio content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "resource": { + "description": "Host supports resource content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "resourceLink": { + "description": "Host supports resource link content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "structuredContent": { + "description": "Host supports structured content.", + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "message": { + "description": "Host supports receiving content messages (ui/message) from the Guest UI.", + "type": "object", + "properties": { + "text": { + "description": "Host supports text content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "image": { + "description": "Host supports image content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "audio": { + "description": "Host supports audio content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "resource": { + "description": "Host supports resource content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "resourceLink": { + "description": "Host supports resource link content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "structuredContent": { + "description": "Host supports structured content.", + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false } }, "additionalProperties": false @@ -2377,6 +2463,92 @@ } }, "additionalProperties": false + }, + "updateModelContext": { + "description": "Host accepts context updates (ui/update-model-context) to be included in the model's context for future turns.", + "type": "object", + "properties": { + "text": { + "description": "Host supports text content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "image": { + "description": "Host supports image content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "audio": { + "description": "Host supports audio content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "resource": { + "description": "Host supports resource content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "resourceLink": { + "description": "Host supports resource link content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "structuredContent": { + "description": "Host supports structured content.", + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "message": { + "description": "Host supports receiving content messages (ui/message) from the Guest UI.", + "type": "object", + "properties": { + "text": { + "description": "Host supports text content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "image": { + "description": "Host supports image content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "audio": { + "description": "Host supports audio content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "resource": { + "description": "Host supports resource content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "resourceLink": { + "description": "Host supports resource link content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "structuredContent": { + "description": "Host supports structured content.", + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false } }, "additionalProperties": false, @@ -4631,6 +4803,49 @@ ], "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." }, + "McpUiSupportedContentBlockModalities": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "text": { + "description": "Host supports text content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "image": { + "description": "Host supports image content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "audio": { + "description": "Host supports audio content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "resource": { + "description": "Host supports resource content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "resourceLink": { + "description": "Host supports resource link content blocks.", + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "structuredContent": { + "description": "Host supports structured content.", + "type": "object", + "properties": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + }, "McpUiTheme": { "$schema": "https://json-schema.org/draft/2020-12/schema", "anyOf": [ @@ -5138,6 +5353,351 @@ } ], "description": "Tool visibility scope - who can access the tool." + }, + "McpUiUpdateModelContextRequest": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "method": { + "type": "string", + "const": "ui/update-model-context" + }, + "params": { + "type": "object", + "properties": { + "content": { + "description": "Context content blocks (text, image, etc.).", + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "text" + }, + "text": { + "type": "string" + }, + "annotations": { + "type": "object", + "properties": { + "audience": { + "type": "array", + "items": { + "type": "string", + "enum": ["user", "assistant"] + } + }, + "priority": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "lastModified": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + } + }, + "additionalProperties": false + }, + "_meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["type", "text"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "image" + }, + "data": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "annotations": { + "type": "object", + "properties": { + "audience": { + "type": "array", + "items": { + "type": "string", + "enum": ["user", "assistant"] + } + }, + "priority": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "lastModified": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + } + }, + "additionalProperties": false + }, + "_meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["type", "data", "mimeType"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "audio" + }, + "data": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "annotations": { + "type": "object", + "properties": { + "audience": { + "type": "array", + "items": { + "type": "string", + "enum": ["user", "assistant"] + } + }, + "priority": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "lastModified": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + } + }, + "additionalProperties": false + }, + "_meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["type", "data", "mimeType"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "title": { + "type": "string" + }, + "icons": { + "type": "array", + "items": { + "type": "object", + "properties": { + "src": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "sizes": { + "type": "array", + "items": { + "type": "string" + } + }, + "theme": { + "type": "string", + "enum": ["light", "dark"] + } + }, + "required": ["src"], + "additionalProperties": false + } + }, + "uri": { + "type": "string" + }, + "description": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "annotations": { + "type": "object", + "properties": { + "audience": { + "type": "array", + "items": { + "type": "string", + "enum": ["user", "assistant"] + } + }, + "priority": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "lastModified": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + } + }, + "additionalProperties": false + }, + "_meta": { + "type": "object", + "properties": {}, + "additionalProperties": {} + }, + "type": { + "type": "string", + "const": "resource_link" + } + }, + "required": ["name", "uri", "type"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "resource" + }, + "resource": { + "anyOf": [ + { + "type": "object", + "properties": { + "uri": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "_meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "text": { + "type": "string" + } + }, + "required": ["uri", "text"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "uri": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "_meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + }, + "blob": { + "type": "string" + } + }, + "required": ["uri", "blob"], + "additionalProperties": false + } + ] + }, + "annotations": { + "type": "object", + "properties": { + "audience": { + "type": "array", + "items": { + "type": "string", + "enum": ["user", "assistant"] + } + }, + "priority": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "lastModified": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + } + }, + "additionalProperties": false + }, + "_meta": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "required": ["type", "resource"], + "additionalProperties": false + } + ] + } + }, + "structuredContent": { + "description": "Structured content for machine-readable context data.", + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "description": "Structured content for machine-readable context data." + } + } + }, + "additionalProperties": false + } + }, + "required": ["method", "params"], + "additionalProperties": false } } } diff --git a/src/generated/schema.test.ts b/src/generated/schema.test.ts index 5bbcd5c..727c28d 100644 --- a/src/generated/schema.test.ts +++ b/src/generated/schema.test.ts @@ -83,6 +83,10 @@ export type McpUiResourceTeardownResultSchemaInferredType = z.infer< typeof generated.McpUiResourceTeardownResultSchema >; +export type McpUiSupportedContentBlockModalitiesSchemaInferredType = z.infer< + typeof generated.McpUiSupportedContentBlockModalitiesSchema +>; + export type McpUiHostCapabilitiesSchemaInferredType = z.infer< typeof generated.McpUiHostCapabilitiesSchema >; @@ -135,6 +139,10 @@ export type McpUiHostContextChangedNotificationSchemaInferredType = z.infer< typeof generated.McpUiHostContextChangedNotificationSchema >; +export type McpUiUpdateModelContextRequestSchemaInferredType = z.infer< + typeof generated.McpUiUpdateModelContextRequestSchema +>; + export type McpUiInitializeRequestSchemaInferredType = z.infer< typeof generated.McpUiInitializeRequestSchema >; @@ -223,6 +231,12 @@ expectType( expectType( {} as spec.McpUiResourceTeardownResult, ); +expectType( + {} as McpUiSupportedContentBlockModalitiesSchemaInferredType, +); +expectType( + {} as spec.McpUiSupportedContentBlockModalities, +); expectType( {} as McpUiHostCapabilitiesSchemaInferredType, ); @@ -289,6 +303,12 @@ expectType( expectType( {} as spec.McpUiHostContextChangedNotification, ); +expectType( + {} as McpUiUpdateModelContextRequestSchemaInferredType, +); +expectType( + {} as spec.McpUiUpdateModelContextRequest, +); expectType( {} as McpUiInitializeRequestSchemaInferredType, ); diff --git a/src/generated/schema.ts b/src/generated/schema.ts index 8de9bb5..69abe49 100644 --- a/src/generated/schema.ts +++ b/src/generated/schema.ts @@ -358,6 +358,36 @@ export const McpUiResourceTeardownResultSchema = z.record( z.unknown(), ); +export const McpUiSupportedContentBlockModalitiesSchema = z.object({ + /** @description Host supports text content blocks. */ + text: z.object({}).optional().describe("Host supports text content blocks."), + /** @description Host supports image content blocks. */ + image: z + .object({}) + .optional() + .describe("Host supports image content blocks."), + /** @description Host supports audio content blocks. */ + audio: z + .object({}) + .optional() + .describe("Host supports audio content blocks."), + /** @description Host supports resource content blocks. */ + resource: z + .object({}) + .optional() + .describe("Host supports resource content blocks."), + /** @description Host supports resource link content blocks. */ + resourceLink: z + .object({}) + .optional() + .describe("Host supports resource link content blocks."), + /** @description Host supports structured content. */ + structuredContent: z + .object({}) + .optional() + .describe("Host supports structured content."), +}); + /** * @description Capabilities supported by the host application. * @see {@link McpUiInitializeResult} for the initialization result that includes these capabilities @@ -411,6 +441,15 @@ export const McpUiHostCapabilitiesSchema = z.object({ }) .optional() .describe("Sandbox configuration applied by the host."), + /** @description Host accepts context updates (ui/update-model-context) to be included in the model's context for future turns. */ + updateModelContext: + McpUiSupportedContentBlockModalitiesSchema.optional().describe( + "Host accepts context updates (ui/update-model-context) to be included in the model's context for future turns.", + ), + /** @description Host supports receiving content messages (ui/message) from the Guest UI. */ + message: McpUiSupportedContentBlockModalitiesSchema.optional().describe( + "Host supports receiving content messages (ui/message) from the Guest UI.", + ), }); /** @@ -714,6 +753,39 @@ export const McpUiHostContextChangedNotificationSchema = z.object({ ), }); +/** + * @description Request to update the agent's context without requiring a follow-up action (Guest UI -> Host). + * + * Unlike `notifications/message` which is for debugging/logging, this request is intended + * to update the Host's model context. Each request overwrites the previous context sent by the Guest UI. + * Unlike messages, context updates do not trigger follow-ups. + * + * The host will typically defer sending the context to the model until the next user message + * (including `ui/message`), and will only send the last update received. + * + * @see {@link app.App.updateModelContext} for the method that sends this request + */ +export const McpUiUpdateModelContextRequestSchema = z.object({ + method: z.literal("ui/update-model-context"), + params: z.object({ + /** @description Context content blocks (text, image, etc.). */ + content: z + .array(ContentBlockSchema) + .optional() + .describe("Context content blocks (text, image, etc.)."), + /** @description Structured content for machine-readable context data. */ + structuredContent: z + .record( + z.string(), + z + .unknown() + .describe("Structured content for machine-readable context data."), + ) + .optional() + .describe("Structured content for machine-readable context data."), + }), +}); + /** * @description Initialization request sent from Guest UI to Host. * @see {@link app.App.connect} for the method that sends this request diff --git a/src/spec.types.ts b/src/spec.types.ts index 3e87209..998e4d2 100644 --- a/src/spec.types.ts +++ b/src/spec.types.ts @@ -384,6 +384,28 @@ export interface McpUiHostContextChangedNotification { params: McpUiHostContext; } +/** + * @description Request to update the agent's context without requiring a follow-up action (Guest UI -> Host). + * + * Unlike `notifications/message` which is for debugging/logging, this request is intended + * to update the Host's model context. Each request overwrites the previous context sent by the Guest UI. + * Unlike messages, context updates do not trigger follow-ups. + * + * The host will typically defer sending the context to the model until the next user message + * (including `ui/message`), and will only send the last update received. + * + * @see {@link app.App.updateModelContext} for the method that sends this request + */ +export interface McpUiUpdateModelContextRequest { + method: "ui/update-model-context"; + params: { + /** @description Context content blocks (text, image, etc.). */ + content?: ContentBlock[]; + /** @description Structured content for machine-readable context data. */ + structuredContent?: Record; + }; +} + /** * @description Request for graceful shutdown of the Guest UI (Host -> Guest UI). * @see {@link app-bridge.AppBridge.teardownResource} for the host method that sends this @@ -404,6 +426,21 @@ export interface McpUiResourceTeardownResult { [key: string]: unknown; } +export interface McpUiSupportedContentBlockModalities { + /** @description Host supports text content blocks. */ + text?: {}; + /** @description Host supports image content blocks. */ + image?: {}; + /** @description Host supports audio content blocks. */ + audio?: {}; + /** @description Host supports resource content blocks. */ + resource?: {}; + /** @description Host supports resource link content blocks. */ + resourceLink?: {}; + /** @description Host supports structured content. */ + structuredContent?: {}; +} + /** * @description Capabilities supported by the host application. * @see {@link McpUiInitializeResult} for the initialization result that includes these capabilities @@ -432,6 +469,10 @@ export interface McpUiHostCapabilities { /** @description CSP domains approved by the host. */ csp?: McpUiResourceCsp; }; + /** @description Host accepts context updates (ui/update-model-context) to be included in the model's context for future turns. */ + updateModelContext?: McpUiSupportedContentBlockModalities; + /** @description Host supports receiving content messages (ui/message) from the Guest UI. */ + message?: McpUiSupportedContentBlockModalities; } /** diff --git a/src/types.ts b/src/types.ts index 006680c..5cbc0b4 100644 --- a/src/types.ts +++ b/src/types.ts @@ -36,6 +36,8 @@ export { type McpUiOpenLinkResult, type McpUiMessageRequest, type McpUiMessageResult, + type McpUiUpdateModelContextRequest, + type McpUiSupportedContentBlockModalities, type McpUiSandboxProxyReadyNotification, type McpUiSandboxResourceReadyNotification, type McpUiSizeChangedNotification, @@ -66,6 +68,7 @@ import type { McpUiInitializeRequest, McpUiOpenLinkRequest, McpUiMessageRequest, + McpUiUpdateModelContextRequest, McpUiResourceTeardownRequest, McpUiRequestDisplayModeRequest, McpUiHostContextChangedNotification, @@ -94,6 +97,8 @@ export { McpUiOpenLinkResultSchema, McpUiMessageRequestSchema, McpUiMessageResultSchema, + McpUiUpdateModelContextRequestSchema, + McpUiSupportedContentBlockModalitiesSchema, McpUiSandboxProxyReadyNotificationSchema, McpUiSandboxResourceReadyNotificationSchema, McpUiSizeChangedNotificationSchema, @@ -153,6 +158,7 @@ export type AppRequest = | McpUiInitializeRequest | McpUiOpenLinkRequest | McpUiMessageRequest + | McpUiUpdateModelContextRequest | McpUiResourceTeardownRequest | McpUiRequestDisplayModeRequest | CallToolRequest From 996f028e7fa11afd4e0ebda3970c179776c2074f Mon Sep 17 00:00:00 2001 From: Jonathan Hefner Date: Fri, 9 Jan 2026 15:41:04 -0600 Subject: [PATCH 011/352] Add missing `refresh-stats` tool to `system-monitor-server` The `mcp-app.ts` UI was calling a `refresh-stats` tool that didn't exist on the server, causing the example to fail. This was introduced in PR #131 when the squash merge included the client-side change but lost the server-side tool registration. Fixes #200 Co-Authored-By: Claude Opus 4.5 --- examples/system-monitor-server/server.ts | 63 ++++++++++++++++-------- package-lock.json | 21 ++++++++ 2 files changed, 64 insertions(+), 20 deletions(-) diff --git a/examples/system-monitor-server/server.ts b/examples/system-monitor-server/server.ts index 477a9ae..8ac7f7b 100644 --- a/examples/system-monitor-server/server.ts +++ b/examples/system-monitor-server/server.ts @@ -107,6 +107,30 @@ async function getMemoryStats(): Promise { }; } +async function getStats(): Promise { + const cpuSnapshots = getCpuSnapshots(); + const cpuInfo = os.cpus()[0]; + const memory = await getMemoryStats(); + const uptimeSeconds = os.uptime(); + + return { + cpu: { + cores: cpuSnapshots, + model: cpuInfo?.model ?? "Unknown", + count: os.cpus().length, + }, + memory, + system: { + hostname: os.hostname(), + platform: `${os.platform()} ${os.arch()}`, + arch: os.arch(), + uptime: uptimeSeconds, + uptimeFormatted: formatUptime(uptimeSeconds), + }, + timestamp: new Date().toISOString(), + }; +} + export function createServer(): McpServer { const server = new McpServer({ name: "System Monitor Server", @@ -128,28 +152,27 @@ export function createServer(): McpServer { _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, }, async (): Promise => { - const cpuSnapshots = getCpuSnapshots(); - const cpuInfo = os.cpus()[0]; - const memory = await getMemoryStats(); - const uptimeSeconds = os.uptime(); - - const stats: SystemStats = { - cpu: { - cores: cpuSnapshots, - model: cpuInfo?.model ?? "Unknown", - count: os.cpus().length, - }, - memory, - system: { - hostname: os.hostname(), - platform: `${os.platform()} ${os.arch()}`, - arch: os.arch(), - uptime: uptimeSeconds, - uptimeFormatted: formatUptime(uptimeSeconds), - }, - timestamp: new Date().toISOString(), + const stats = await getStats(); + return { + content: [{ type: "text", text: JSON.stringify(stats) }], + structuredContent: stats, }; + }, + ); + // App-only tool for polling - used by the UI for periodic refresh + registerAppTool( + server, + "refresh-stats", + { + title: "Refresh Stats", + description: "Refresh system statistics (app-only, for polling)", + inputSchema: {}, + outputSchema: SystemStatsSchema.shape, + _meta: { ui: { visibility: ["app"] } }, + }, + async (): Promise => { + const stats = await getStats(); return { content: [{ type: "text", text: JSON.stringify(stats) }], structuredContent: stats, diff --git a/package-lock.json b/package-lock.json index b63c292..50843b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -809,6 +809,7 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2515,6 +2516,7 @@ "integrity": "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", "debug": "^4.4.1", @@ -2714,6 +2716,7 @@ "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -2738,6 +2741,7 @@ "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -3140,6 +3144,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3465,6 +3470,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -4176,6 +4182,7 @@ "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -4650,6 +4657,7 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", + "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -6191,6 +6199,7 @@ "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.2.tgz", "integrity": "sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA==", "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -6286,6 +6295,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -6384,6 +6394,7 @@ "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -6505,6 +6516,7 @@ "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.3.2.tgz", "integrity": "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=10" } @@ -6750,6 +6762,7 @@ "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.10.tgz", "integrity": "sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "~1.3.0", @@ -6928,6 +6941,7 @@ "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.46.1.tgz", "integrity": "sha512-ynjfCHD3nP2el70kN5Pmg37sSi0EjOm9FgHYQdC4giWG/hzO3AatzXXJJgP305uIhGQxSufJLuYWtkY8uK/8RA==", "license": "MIT", + "peer": true, "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", @@ -7255,6 +7269,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -8004,6 +8019,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8097,6 +8113,7 @@ "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -8273,6 +8290,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -8391,6 +8409,7 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.26.tgz", "integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==", "license": "MIT", + "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/compiler-sfc": "3.5.26", @@ -8563,6 +8582,7 @@ "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "dev": true, "license": "ISC", + "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -8613,6 +8633,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } From 8b8ecbea64329d7cb9562d6e7519634f1db6f971 Mon Sep 17 00:00:00 2001 From: Jonathan Hefner Date: Fri, 9 Jan 2026 16:25:54 -0600 Subject: [PATCH 012/352] Restore educational comments in `basic-server-*` examples PR #184 accidentally removed/reverted educational comments from `basic-server-react` and `basic-server-vanillajs` that were established in PR #182. This restores consistency with the other basic-server examples (Vue, Svelte, Preact, Solid). Changes: - Add back the three-comment pattern explaining two-part registration - Restore full tool description ("as an ISO 8601 string") - Change vanillajs to return plain text instead of JSON (matching #182) - Use local `resourceUri` variable instead of top-level constant Co-Authored-By: Claude Opus 4.5 --- examples/basic-server-react/server.ts | 10 ++++++++-- examples/basic-server-vanillajs/server.ts | 22 +++++++++++----------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/examples/basic-server-react/server.ts b/examples/basic-server-react/server.ts index 21be751..d63880c 100644 --- a/examples/basic-server-react/server.ts +++ b/examples/basic-server-react/server.ts @@ -17,21 +17,27 @@ export function createServer(): McpServer { version: "1.0.0", }); + // Two-part registration: tool + resource, tied together by the resource URI. const resourceUri = "ui://get-time/mcp-app.html"; + // Register a tool with UI metadata. When the host calls this tool, it reads + // `_meta[RESOURCE_URI_META_KEY]` to know which resource to fetch and render + // as an interactive UI. registerAppTool(server, "get-time", { title: "Get Time", - description: "Returns the current server time.", + description: "Returns the current server time as an ISO 8601 string.", inputSchema: {}, _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, }, async (): Promise => { - return { content: [{ type: "text", text: new Date().toISOString() }] }; + const time = new Date().toISOString(); + return { content: [{ type: "text", text: time }] }; }, ); + // Register the resource, which returns the bundled HTML/JavaScript for the UI. registerAppResource(server, resourceUri, resourceUri, diff --git a/examples/basic-server-vanillajs/server.ts b/examples/basic-server-vanillajs/server.ts index ef661a8..8d50d3e 100644 --- a/examples/basic-server-vanillajs/server.ts +++ b/examples/basic-server-vanillajs/server.ts @@ -8,11 +8,9 @@ import { registerAppTool, registerAppResource, RESOURCE_MIME_TYPE, RESOURCE_URI_ import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); -const RESOURCE_URI = "ui://get-time/mcp-app.html"; /** * Creates a new MCP server instance with tools and resources registered. - * Each HTTP session needs its own server instance because McpServer only supports one transport. */ export function createServer(): McpServer { const server = new McpServer({ @@ -20,9 +18,12 @@ export function createServer(): McpServer { version: "1.0.0", }); - // MCP Apps require two-part registration: a tool (what the LLM calls) and a - // resource (the UI it renders). The `_meta` field on the tool links to the - // resource URI, telling hosts which UI to display when the tool executes. + // Two-part registration: tool + resource, tied together by the resource URI. + const resourceUri = "ui://get-time/mcp-app.html"; + + // Register a tool with UI metadata. When the host calls this tool, it reads + // `_meta[RESOURCE_URI_META_KEY]` to know which resource to fetch and render + // as an interactive UI. registerAppTool(server, "get-time", { @@ -32,7 +33,7 @@ export function createServer(): McpServer { outputSchema: z.object({ time: z.string(), }), - _meta: { [RESOURCE_URI_META_KEY]: RESOURCE_URI }, + _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, }, async (): Promise => { const time = new Date().toISOString(); @@ -43,18 +44,17 @@ export function createServer(): McpServer { }, ); + // Register the resource, which returns the bundled HTML/JavaScript for the UI. registerAppResource(server, - RESOURCE_URI, - RESOURCE_URI, + resourceUri, + resourceUri, { mimeType: RESOURCE_MIME_TYPE }, async (): Promise => { const html = await fs.readFile(path.join(DIST_DIR, "mcp-app.html"), "utf-8"); return { contents: [ - // Per the MCP App specification, "text/html;profile=mcp-app" signals - // to the Host that this resource is indeed for an MCP App UI. - { uri: RESOURCE_URI, mimeType: RESOURCE_MIME_TYPE, text: html }, + { uri: resourceUri, mimeType: RESOURCE_MIME_TYPE, text: html }, ], }; }, From ec3409aa91139b3d2d99ec3c4618b5b9a23044b7 Mon Sep 17 00:00:00 2001 From: Jonathan Hefner Date: Mon, 12 Jan 2026 12:26:02 -0600 Subject: [PATCH 013/352] Add `shadertoy-server` example for WebGL shader rendering (#226) Introduces a new MCP App example that renders ShaderToy-compatible GLSL fragment shaders in real-time using WebGL 2.0 and ShaderToyLite.js. Features: - Standard ShaderToy uniforms (`iTime`, `iResolution`, `iMouse`, etc.) - Multi-pass rendering with buffers A-D for feedback effects - Shader compilation error overlay Co-authored-by: Claude Opus 4.5 --- .prettierignore | 1 + examples/shadertoy-server/README.md | 132 ++ examples/shadertoy-server/mcp-app.html | 15 + examples/shadertoy-server/package.json | 43 + examples/shadertoy-server/server-utils.ts | 72 + examples/shadertoy-server/server.ts | 156 ++ examples/shadertoy-server/src/global.css | 12 + examples/shadertoy-server/src/mcp-app.css | 12 + examples/shadertoy-server/src/mcp-app.ts | 126 ++ .../src/vendor/ShaderToyLite.d.ts | 113 ++ .../src/vendor/ShaderToyLite.js | 437 +++++ examples/shadertoy-server/tsconfig.json | 19 + examples/shadertoy-server/vite.config.ts | 24 + package-lock.json | 1716 ++++------------- src/generated/schema.json | 658 ++----- tests/e2e/servers.spec.ts | 6 +- .../servers.spec.ts-snapshots/shadertoy.png | Bin 0 -> 24301 bytes 17 files changed, 1641 insertions(+), 1901 deletions(-) create mode 100644 examples/shadertoy-server/README.md create mode 100644 examples/shadertoy-server/mcp-app.html create mode 100644 examples/shadertoy-server/package.json create mode 100644 examples/shadertoy-server/server-utils.ts create mode 100644 examples/shadertoy-server/server.ts create mode 100644 examples/shadertoy-server/src/global.css create mode 100644 examples/shadertoy-server/src/mcp-app.css create mode 100644 examples/shadertoy-server/src/mcp-app.ts create mode 100644 examples/shadertoy-server/src/vendor/ShaderToyLite.d.ts create mode 100644 examples/shadertoy-server/src/vendor/ShaderToyLite.js create mode 100644 examples/shadertoy-server/tsconfig.json create mode 100644 examples/shadertoy-server/vite.config.ts create mode 100644 tests/e2e/servers.spec.ts-snapshots/shadertoy.png diff --git a/.prettierignore b/.prettierignore index 9c9b32b..c18c51a 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,3 +2,4 @@ examples/basic-host/**/*.ts examples/basic-host/**/*.tsx examples/basic-server-*/**/*.ts examples/basic-server-*/**/*.tsx +**/vendor/** diff --git a/examples/shadertoy-server/README.md b/examples/shadertoy-server/README.md new file mode 100644 index 0000000..0e85d47 --- /dev/null +++ b/examples/shadertoy-server/README.md @@ -0,0 +1,132 @@ +# Example: ShaderToy Server + +A demo MCP App that renders [ShaderToy](https://www.shadertoy.com/)-compatible GLSL fragment shaders in real-time using WebGL 2.0 and [ShaderToyLite.js](https://github.com/nickoala/ShaderToyLite). + + + + + + + +
GradientKaleidoscopeKaleidoscope
+ +## Features + +- **Real-time Rendering**: Renders GLSL shaders using WebGL 2.0 +- **ShaderToy Compatibility**: Uses the standard `mainImage(out vec4 fragColor, in vec2 fragCoord)` entry point +- **Multi-pass Rendering**: Supports buffers A-D for feedback effects, blur chains, and simulations +- **Standard Uniforms**: iResolution, iTime, iTimeDelta, iFrame, iMouse, iDate, iChannel0-3 + +## Running + +1. Install dependencies: + + ```bash + npm install + ``` + +2. Build and start the server: + + ```bash + npm run start:http # for Streamable HTTP transport + # OR + npm run start:stdio # for stdio transport + ``` + +3. View using the [`basic-host`](https://github.com/modelcontextprotocol/ext-apps/tree/main/examples/basic-host) example or another MCP Apps-compatible host. + +### Tool Input Examples + +**Gradient with Time:** + +```glsl +void mainImage(out vec4 fragColor, in vec2 fragCoord) { + vec2 uv = fragCoord / iResolution.xy; + fragColor = vec4(uv, 0.5 + 0.5*sin(iTime), 1.0); +} +``` + +_Tool input:_ + +```json +{ + "fragmentShader": "void mainImage(out vec4 fragColor, in vec2 fragCoord) {\n vec2 uv = fragCoord / iResolution.xy;\n fragColor = vec4(uv, 0.5 + 0.5*sin(iTime), 1.0);\n}" +} +``` + +**Kaleidoscope**: + +```glsl +void mainImage(out vec4 fragColor, in vec2 fragCoord) { + vec2 uv = (fragCoord - 0.5 * iResolution.xy) / iResolution.y; + float segments = 6.0; + float zoom = 1.0 + 0.3 * sin(iTime * 0.2); + float angle = atan(uv.y, uv.x) + iTime * 0.3; + float r = length(uv) * zoom; + angle = mod(angle, 6.28 / segments); + angle = abs(angle - 3.14 / segments); + vec2 p = vec2(cos(angle), sin(angle)) * r; + p += iTime * 0.1; + float v = sin(p.x * 10.0) * sin(p.y * 10.0); + v += sin(length(p) * 15.0 - iTime * 2.0); + v += sin(p.x * 5.0 + p.y * 7.0 + iTime); + vec3 col = 0.5 + 0.5 * cos(v * 2.0 + vec3(0.0, 2.0, 4.0) + iTime); + fragColor = vec4(col, 1.0); +} +``` + +_Tool input:_ + +```json +{ + "fragmentShader": "void mainImage(out vec4 fragColor, in vec2 fragCoord) {\n vec2 uv = (fragCoord - 0.5 * iResolution.xy) / iResolution.y;\n float segments = 6.0;\n float zoom = 1.0 + 0.3 * sin(iTime * 0.2);\n float angle = atan(uv.y, uv.x) + iTime * 0.3;\n float r = length(uv) * zoom;\n angle = mod(angle, 6.28 / segments);\n angle = abs(angle - 3.14 / segments);\n vec2 p = vec2(cos(angle), sin(angle)) * r;\n p += iTime * 0.1;\n float v = sin(p.x * 10.0) * sin(p.y * 10.0);\n v += sin(length(p) * 15.0 - iTime * 2.0);\n v += sin(p.x * 5.0 + p.y * 7.0 + iTime);\n vec3 col = 0.5 + 0.5 * cos(v * 2.0 + vec3(0.0, 2.0, 4.0) + iTime);\n fragColor = vec4(col, 1.0);\n}" +} +``` + +**Interactive Julia Set** (mouse controls the fractal's c parameter): + +```glsl +void mainImage(out vec4 fragColor, in vec2 fragCoord) { + vec2 uv = (fragCoord - 0.5 * iResolution.xy) / iResolution.y * 2.5; + vec2 mouse = (iMouse.xy / iResolution.xy - 0.5) * 2.0; + vec2 c = mouse; + vec2 z = uv; + float iter = 0.0; + for (int i = 0; i < 100; i++) { + z = vec2(z.x * z.x - z.y * z.y, 2.0 * z.x * z.y) + c; + if (dot(z, z) > 4.0) break; + iter++; + } + float t = iter / 100.0; + vec3 col = 0.5 + 0.5 * cos(3.0 + t * 6.28 * 2.0 + vec3(0.0, 0.6, 1.0)); + if (iter == 100.0) col = vec3(0.0); + fragColor = vec4(col, 1.0); +} +``` + +_Tool input:_ + +```json +{ + "fragmentShader": "void mainImage(out vec4 fragColor, in vec2 fragCoord) {\n vec2 uv = (fragCoord - 0.5 * iResolution.xy) / iResolution.y * 2.5;\n vec2 mouse = (iMouse.xy / iResolution.xy - 0.5) * 2.0;\n vec2 c = mouse;\n vec2 z = uv;\n float iter = 0.0;\n for (int i = 0; i < 100; i++) {\n z = vec2(z.x * z.x - z.y * z.y, 2.0 * z.x * z.y) + c;\n if (dot(z, z) > 4.0) break;\n iter++;\n }\n float t = iter / 100.0;\n vec3 col = 0.5 + 0.5 * cos(3.0 + t * 6.28 * 2.0 + vec3(0.0, 0.6, 1.0));\n if (iter == 100.0) col = vec3(0.0);\n fragColor = vec4(col, 1.0);\n}" +} +``` + +## Architecture + +### Server (`server.ts`) + +Exposes a single `render-shadertoy` tool that accepts: + +- `fragmentShader`: Main Image shader code (required) +- `common`: Shared code across all shaders (optional) +- `bufferA`: Buffer A shader, accessible as iChannel0 (optional) +- `bufferB`: Buffer B shader, accessible as iChannel1 (optional) +- `bufferC`: Buffer C shader, accessible as iChannel2 (optional) +- `bufferD`: Buffer D shader, accessible as iChannel3 (optional) + +### App (`src/mcp-app.ts`) + +- Receives shader code via `ontoolinput` handler +- Uses ShaderToyLite.js for WebGL rendering +- Displays compilation errors in an overlay diff --git a/examples/shadertoy-server/mcp-app.html b/examples/shadertoy-server/mcp-app.html new file mode 100644 index 0000000..d59774e --- /dev/null +++ b/examples/shadertoy-server/mcp-app.html @@ -0,0 +1,15 @@ + + + + + + + ShaderToy Renderer + + +

+ +
+ + + diff --git a/examples/shadertoy-server/package.json b/examples/shadertoy-server/package.json new file mode 100644 index 0000000..bb847a1 --- /dev/null +++ b/examples/shadertoy-server/package.json @@ -0,0 +1,43 @@ +{ + "name": "@modelcontextprotocol/server-shadertoy", + "version": "0.1.0", + "type": "module", + "description": "MCP App Server example for rendering ShaderToy-compatible GLSL shaders", + "repository": { + "type": "git", + "url": "https://github.com/modelcontextprotocol/ext-apps", + "directory": "examples/shadertoy-server" + }, + "license": "MIT", + "main": "server.ts", + "files": [ + "server.ts", + "server-utils.ts", + "dist" + ], + "scripts": { + "build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build", + "watch": "cross-env INPUT=mcp-app.html vite build --watch", + "serve": "bun server.ts", + "start": "cross-env NODE_ENV=development npm run build && npm run serve", + "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve'", + "prepublishOnly": "npm run build" + }, + "dependencies": { + "@modelcontextprotocol/ext-apps": "^0.3.1", + "@modelcontextprotocol/sdk": "^1.24.0", + "zod": "^4.1.13" + }, + "devDependencies": { + "@types/cors": "^2.8.19", + "@types/express": "^5.0.0", + "@types/node": "^22.0.0", + "concurrently": "^9.2.1", + "cors": "^2.8.5", + "cross-env": "^10.1.0", + "express": "^5.1.0", + "typescript": "^5.9.3", + "vite": "^6.0.0", + "vite-plugin-singlefile": "^2.3.0" + } +} diff --git a/examples/shadertoy-server/server-utils.ts b/examples/shadertoy-server/server-utils.ts new file mode 100644 index 0000000..9fe9745 --- /dev/null +++ b/examples/shadertoy-server/server-utils.ts @@ -0,0 +1,72 @@ +/** + * Shared utilities for running MCP servers with Streamable HTTP transport. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +export interface ServerOptions { + port: number; + name?: string; +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + * @param options - Server configuration options. + */ +export async function startServer( + createServer: () => McpServer, + options: ServerOptions, +): Promise { + const { port, name = "MCP Server" } = options; + + const app = createMcpExpressApp({ host: "0.0.0.0" }); + app.use(cors()); + + app.all("/mcp", async (req: Request, res: Response) => { + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const httpServer = app.listen(port, (err) => { + if (err) { + console.error("Failed to start server:", err); + process.exit(1); + } + console.log(`${name} listening on http://localhost:${port}/mcp`); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} diff --git a/examples/shadertoy-server/server.ts b/examples/shadertoy-server/server.ts new file mode 100644 index 0000000..ff4d336 --- /dev/null +++ b/examples/shadertoy-server/server.ts @@ -0,0 +1,156 @@ +import { + registerAppResource, + registerAppTool, + RESOURCE_MIME_TYPE, +} from "@modelcontextprotocol/ext-apps/server"; +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import type { + CallToolResult, + ReadResourceResult, +} from "@modelcontextprotocol/sdk/types.js"; +import fs from "node:fs/promises"; +import path from "node:path"; +import { z } from "zod"; +import { startServer } from "./server-utils.js"; + +const DIST_DIR = path.join(import.meta.dirname, "dist"); + +const TOOL_DESCRIPTION = `Renders a ShaderToy-compatible GLSL fragment shader in real-time using WebGL 2.0. + +SHADER FORMAT (ShaderToy conventions): +Use ShaderToy's mainImage entry point - do NOT use generic GLSL conventions. + + void mainImage(out vec4 fragColor, in vec2 fragCoord) { + vec2 uv = fragCoord / iResolution.xy; + fragColor = vec4(uv, 0.5 + 0.5*sin(iTime), 1.0); + } + +Do NOT use: void main(), gl_FragColor, gl_FragCoord - these will not work. + +AVAILABLE UNIFORMS: +- iResolution (vec3): viewport resolution in pixels +- iTime (float): elapsed time in seconds +- iTimeDelta (float): time since last frame +- iFrame (int): frame counter +- iMouse (vec4): mouse position (xy=current, zw=click) +- iDate (vec4): year, month, day, seconds +- iChannel0-3 (sampler2D): buffer inputs for multi-pass shaders + +MULTI-PASS RENDERING: +- Use bufferA-D parameters for feedback effects, blur chains, simulations +- BufferA output -> iChannel0, BufferB -> iChannel1, etc. +- Buffers can sample their own previous frame for feedback loops + +LIMITATIONS - Do NOT use: +- External textures (generate noise/patterns procedurally) +- Keyboard input (iKeyboard not available) +- Audio/microphone input +- VR features (mainVR not available) + +For procedural noise: + float hash(vec2 p) { return fract(sin(dot(p,vec2(127.1,311.7)))*43758.5453); }`; + +const DEFAULT_FRAGMENT_SHADER = `void mainImage(out vec4 fragColor, in vec2 fragCoord) { + vec2 uv = fragCoord / iResolution.xy; + fragColor = vec4(uv, 0.5 + 0.5*sin(iTime), 1.0); +}`; + +/** + * Creates a new MCP server instance with tools and resources registered. + */ +export function createServer(): McpServer { + const server = new McpServer({ + name: "ShaderToy Server", + version: "1.0.0", + }); + + const resourceUri = "ui://shadertoy/mcp-app.html"; + + // Register the render-shadertoy tool with UI metadata + registerAppTool( + server, + "render-shadertoy", + { + title: "ShaderToy Renderer", + description: TOOL_DESCRIPTION, + inputSchema: z.object({ + fragmentShader: z + .string() + .default(DEFAULT_FRAGMENT_SHADER) + .describe("Main Image shader - ShaderToy GLSL code"), + common: z + .string() + .optional() + .describe("Common code shared across all shaders (optional)"), + bufferA: z + .string() + .optional() + .describe( + "Buffer A shader code - accessible as iChannel0 (optional)", + ), + bufferB: z + .string() + .optional() + .describe( + "Buffer B shader code - accessible as iChannel1 (optional)", + ), + bufferC: z + .string() + .optional() + .describe( + "Buffer C shader code - accessible as iChannel2 (optional)", + ), + bufferD: z + .string() + .optional() + .describe( + "Buffer D shader code - accessible as iChannel3 (optional)", + ), + }), + _meta: { ui: { resourceUri } }, + }, + async (): Promise => { + // Tool execution returns success - actual rendering happens in the UI + return { + content: [{ type: "text", text: "Shader rendered successfully" }], + }; + }, + ); + + // Register the resource which returns the bundled HTML/JavaScript for the UI + registerAppResource( + server, + resourceUri, + resourceUri, + { mimeType: RESOURCE_MIME_TYPE }, + async (): Promise => { + const html = await fs.readFile( + path.join(DIST_DIR, "mcp-app.html"), + "utf-8", + ); + + return { + contents: [ + { uri: resourceUri, mimeType: RESOURCE_MIME_TYPE, text: html }, + ], + }; + }, + ); + + return server; +} + +async function main() { + if (process.argv.includes("--stdio")) { + await createServer().connect(new StdioServerTransport()); + } else { + const port = parseInt(process.env.PORT ?? "3001", 10); + await startServer(createServer, { port, name: "ShaderToy Server" }); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/examples/shadertoy-server/src/global.css b/examples/shadertoy-server/src/global.css new file mode 100644 index 0000000..97cda44 --- /dev/null +++ b/examples/shadertoy-server/src/global.css @@ -0,0 +1,12 @@ +* { + box-sizing: border-box; +} + +html, body { + font-family: system-ui, -apple-system, sans-serif; + font-size: 1rem; +} + +code { + font-size: 1em; +} diff --git a/examples/shadertoy-server/src/mcp-app.css b/examples/shadertoy-server/src/mcp-app.css new file mode 100644 index 0000000..d939d88 --- /dev/null +++ b/examples/shadertoy-server/src/mcp-app.css @@ -0,0 +1,12 @@ +html, body { + margin: 0; + width: 100%; + height: 100%; + overflow: hidden; +} + +#canvas { + width: 100%; + height: 100%; + display: block; +} diff --git a/examples/shadertoy-server/src/mcp-app.ts b/examples/shadertoy-server/src/mcp-app.ts new file mode 100644 index 0000000..4e2353b --- /dev/null +++ b/examples/shadertoy-server/src/mcp-app.ts @@ -0,0 +1,126 @@ +/** + * ShaderToy renderer MCP App using ShaderToyLite.js + */ +import { App, type McpUiHostContext } from "@modelcontextprotocol/ext-apps"; +import "./global.css"; +import "./mcp-app.css"; +import ShaderToyLite, { + type ShaderToyLiteInstance, +} from "./vendor/ShaderToyLite.js"; + +interface ShaderInput { + fragmentShader: string; + common?: string; + bufferA?: string; + bufferB?: string; + bufferC?: string; + bufferD?: string; +} + +function isShaderInput(value: unknown): value is ShaderInput { + return ( + typeof value === "object" && + value !== null && + typeof (value as Record).fragmentShader === "string" + ); +} + +const log = { + info: console.log.bind(console, "[APP]"), + warn: console.warn.bind(console, "[APP]"), + error: console.error.bind(console, "[APP]"), +}; + +// Get element references +const mainEl = document.querySelector(".main") as HTMLElement; +const canvas = document.getElementById("canvas") as HTMLCanvasElement; +// Resize canvas to fill viewport +function resizeCanvas() { + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; +} +resizeCanvas(); +window.addEventListener("resize", resizeCanvas); + +// Handle host context changes (safe area insets) +function handleHostContextChanged(ctx: McpUiHostContext) { + if (ctx.safeAreaInsets) { + mainEl.style.paddingTop = `${ctx.safeAreaInsets.top}px`; + mainEl.style.paddingRight = `${ctx.safeAreaInsets.right}px`; + mainEl.style.paddingBottom = `${ctx.safeAreaInsets.bottom}px`; + mainEl.style.paddingLeft = `${ctx.safeAreaInsets.left}px`; + } +} + +// ShaderToyLite instance +let shaderToy: ShaderToyLiteInstance | null = null; + +// Create app instance +const app = new App({ name: "ShaderToy Renderer", version: "1.0.0" }); + +app.onteardown = async () => { + log.info("App is being torn down"); + if (shaderToy) { + shaderToy.pause(); + } + return {}; +}; + +app.ontoolinput = (params) => { + log.info("Received shader input"); + + if (!isShaderInput(params.arguments)) { + log.error("Invalid tool input"); + return; + } + + const { fragmentShader, common, bufferA, bufferB, bufferC, bufferD } = + params.arguments; + + // Initialize ShaderToyLite if needed + if (!shaderToy) { + shaderToy = new ShaderToyLite("canvas"); + } + + // Set common code (shared across all shaders) + shaderToy.setCommon(common || ""); + + // Set buffer shaders with self-feedback + if (bufferA) { + shaderToy.setBufferA({ source: bufferA, iChannel0: "A" }); + } + if (bufferB) { + shaderToy.setBufferB({ source: bufferB, iChannel1: "B" }); + } + if (bufferC) { + shaderToy.setBufferC({ source: bufferC, iChannel2: "C" }); + } + if (bufferD) { + shaderToy.setBufferD({ source: bufferD, iChannel3: "D" }); + } + + // Set main Image shader with buffer inputs + shaderToy.setImage({ + source: fragmentShader, + iChannel0: bufferA ? "A" : undefined, + iChannel1: bufferB ? "B" : undefined, + iChannel2: bufferC ? "C" : undefined, + iChannel3: bufferD ? "D" : undefined, + }); + + shaderToy.play(); + log.info("Setup complete"); +}; + +app.onerror = log.error; + +app.onhostcontextchanged = handleHostContextChanged; + +// Connect to host +app.connect().then(() => { + log.info("Connected to host"); + const ctx = app.getHostContext(); + if (ctx) { + handleHostContextChanged(ctx); + } +}); diff --git a/examples/shadertoy-server/src/vendor/ShaderToyLite.d.ts b/examples/shadertoy-server/src/vendor/ShaderToyLite.d.ts new file mode 100644 index 0000000..8527d1a --- /dev/null +++ b/examples/shadertoy-server/src/vendor/ShaderToyLite.d.ts @@ -0,0 +1,113 @@ +/** + * Type declarations for ShaderToyLite.js + * https://github.com/chipweinberger/ShaderToyLite.js + */ + +/** Valid buffer keys for channel inputs */ +type BufferKey = "A" | "B" | "C" | "D"; + +/** Configuration for shader passes (buffers and image) */ +interface ShaderConfig { + /** GLSL fragment shader source code */ + source?: string; + /** Buffer to use as iChannel0 input */ + iChannel0?: BufferKey; + /** Buffer to use as iChannel1 input */ + iChannel1?: BufferKey; + /** Buffer to use as iChannel2 input */ + iChannel2?: BufferKey; + /** Buffer to use as iChannel3 input */ + iChannel3?: BufferKey; +} + +/** ShaderToyLite instance methods */ +interface ShaderToyLiteInstance { + /** + * Set common shader code shared across all passes. + * @param source - GLSL source code to prepend to all shaders + */ + setCommon(source?: string | null): void; + + /** + * Set Buffer A shader pass. + * @param config - Shader configuration or falsy to clear + */ + setBufferA(config?: ShaderConfig | null): void; + + /** + * Set Buffer B shader pass. + * @param config - Shader configuration or falsy to clear + */ + setBufferB(config?: ShaderConfig | null): void; + + /** + * Set Buffer C shader pass. + * @param config - Shader configuration or falsy to clear + */ + setBufferC(config?: ShaderConfig | null): void; + + /** + * Set Buffer D shader pass. + * @param config - Shader configuration or falsy to clear + */ + setBufferD(config?: ShaderConfig | null): void; + + /** + * Set the main Image shader pass (renders to screen). + * @param config - Shader configuration or falsy to clear + */ + setImage(config?: ShaderConfig | null): void; + + /** + * Set a callback to be called on each draw frame. + * @param callback - Function to call each frame + */ + setOnDraw(callback?: (() => void) | null): void; + + /** + * Add a custom texture that can be used as a channel input. + * @param texture - WebGL texture object + * @param key - Buffer key to reference this texture (only A/B/C/D are recognized by iChannel bindings) + */ + addTexture(texture: WebGLTexture, key: BufferKey): void; + + /** + * Get the current playback time in seconds. + * @returns Time elapsed since first draw + */ + time(): number; + + /** + * Check if the shader is currently playing. + * @returns True if playing, false if paused + */ + isPlaying(): boolean; + + /** + * Reset playback to the beginning (time = 0, frame = 0). + */ + reset(): void; + + /** + * Pause shader playback. + */ + pause(): void; + + /** + * Start or resume shader playback. + */ + play(): void; +} + +/** ShaderToyLite constructor interface */ +interface ShaderToyLiteConstructor { + /** + * Create a new ShaderToyLite instance. + * @param canvasId - ID of the canvas element to render to + */ + new (canvasId: string): ShaderToyLiteInstance; +} + +declare const ShaderToyLite: ShaderToyLiteConstructor; +export default ShaderToyLite; +export type { ShaderToyLiteInstance, ShaderConfig, BufferKey }; diff --git a/examples/shadertoy-server/src/vendor/ShaderToyLite.js b/examples/shadertoy-server/src/vendor/ShaderToyLite.js new file mode 100644 index 0000000..1b03e8b --- /dev/null +++ b/examples/shadertoy-server/src/vendor/ShaderToyLite.js @@ -0,0 +1,437 @@ +/** + * ShaderToyLite.js + * https://github.com/chipweinberger/ShaderToyLite.js + * + * Copyright (c) Chip Weinberger + * Licensed under the MIT License + * https://github.com/chipweinberger/ShaderToyLite.js/blob/master/LICENSE + */ + +function ShaderToyLite(canvasId) { + + var hdr = + `#version 300 es + #ifdef GL_ES + precision highp float; + precision highp int; + precision mediump sampler3D; + #endif + #define texture2D texture + uniform vec3 iResolution; // viewport resolution (in pixels) + uniform float iTime; // shader playback time (in seconds) + uniform float iTimeDelta; // render time (in seconds) + uniform float iFrameRate; // shader frame rate + uniform int iFrame; // shader playback frame + uniform float iChannelTime[4]; // channel playback time (in seconds) + uniform vec3 iChannelResolution[4]; // channel resolution (in pixels) + uniform vec4 iMouse; // mouse pixel coords. xy: current (if MLB down), zw: click + uniform sampler2D iChannel0; // input channel 0 + uniform sampler2D iChannel1; // input channel 1 + uniform sampler2D iChannel2; // input channel 2 + uniform sampler2D iChannel3; // input channel 3 + uniform vec4 iDate; // (year, month, day, unixtime in seconds) + uniform float iSampleRate; // sound sample rate (i.e., 44100) + out vec4 frag_out_color; + void mainImage( out vec4 c, in vec2 f ); + void main( void ) + { + vec4 color = vec4(0.0,0.0,0.0,0.0); + mainImage( color, gl_FragCoord.xy ); + frag_out_color = vec4(color); + } + `; + + var basicFragShader = + `void mainImage( out vec4 fragColor, in vec2 fragCoord ) { + fragColor = texture2D(iChannel0, gl_FragCoord.xy / iResolution.xy); + } + `; + + const basicVertexShader = + `#version 300 es + #ifdef GL_ES + precision highp float; + precision highp int; + precision mediump sampler3D; + #endif + in vec2 vertexInPosition; + void main() { + gl_Position = vec4(vertexInPosition, 0.0, 1.0); + } + `; + + const quadVertices = new Float32Array([ + -1.0, -1.0, + 1.0, -1.0, + -1.0, 1.0, + 1.0, 1.0, + -1.0, 1.0, + 1.0, -1.0 + ]); + + + var opts = { alpha: false, + depth: false, + stencil: false, + premultipliedAlpha: false, + antialias: true, + preserveDrawingBuffer: false, + powerPreference: "high-performance" }; + + var gl = document.getElementById(canvasId).getContext('webgl2', opts); + + // timing + var isPlaying = false; + var firstDrawTime = 0; + var prevDrawTime = 0; + + // callback + var onDrawCallback; + + // uniforms + var iFrame = 0; + var iMouse = {x: 0, y: 0, clickX: 0, clickY: 0}; + + // shader common source + var common = ""; + + // render passes variables. valid keys: + // 'A', 'B', 'C', 'D', 'Image' + var sourcecode = {};// fragment shader code + var ichannels = {}; // texture inputs + var atexture = {}; // front texture (input/output) + var btexture = {}; // back texture (input/output) + var aframebuf = {}; // front buffer (output) + var bframebuf = {}; // back buffer (output) + var program = {}; // webgl program + var location = {}; // uniform location + var flip = {}; // a b flip + var quadBuffer; // two full screen triangles + + + var setup = () => { + gl.getExtension( 'OES_texture_float_linear'); + gl.getExtension( 'OES_texture_half_float_linear'); + gl.getExtension( 'EXT_color_buffer_float'); + gl.getExtension( 'WEBGL_debug_shaders'); + + ['A', 'B', 'C', 'D', 'Image'].forEach((key) => { + sourcecode[key] = ""; + ichannels[key] = {}; + program[key] = null; + location[key] = {}; + if (key != 'Image') { + atexture[key] = createTexture(); + btexture[key] = createTexture(); + aframebuf[key] = createFrameBuffer(atexture[key]); + bframebuf[key] = createFrameBuffer(btexture[key]); + flip[key] = false; + } + }); + + // bind the geometry + quadBuffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, quadBuffer); + gl.bufferData(gl.ARRAY_BUFFER, quadVertices, gl.STATIC_DRAW); + + // Set viewport size + gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); + + var canvas = document.getElementById(canvasId); + + window.addEventListener('resize', function() { + gl.canvas.width = canvas.width; + gl.canvas.height = canvas.height; + gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); + }); + + canvas.addEventListener("mousemove", (event) => { + iMouse.x = event.offsetX; + iMouse.y = canvas.height - event.offsetY; + }); + + canvas.addEventListener("mousedown", (event) => { + iMouse.clickX = event.offsetX; + iMouse.clickY = canvas.height - event.offsetY; + }); + + canvas.addEventListener("mouseup", () => { + iMouse.clickX = 0; + iMouse.clickY = 0; + }); + } + + var createTexture = () => { + var texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, texture); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, gl.canvas.width, gl.canvas.height, 0, gl.RGBA, gl.FLOAT, null); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + return texture; + } + + var createFrameBuffer = (texture) => { + var framebuffer = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); + gl.bindTexture(gl.TEXTURE_2D, null); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + return framebuffer; + }; + + var compileProgram = (key) => { + var vert = gl.createShader(gl.VERTEX_SHADER); + gl.shaderSource(vert, basicVertexShader); + gl.compileShader(vert); + + if (!gl.getShaderParameter(vert, gl.COMPILE_STATUS)) { + console.error('Vertex Shader compilation failed: ' + gl.getShaderInfoLog(vert)); + gl.deleteShader(vert); + return null; + } + + var source = hdr + common + sourcecode[key]; + var frag = gl.createShader(gl.FRAGMENT_SHADER); + gl.shaderSource(frag, source); + gl.compileShader(frag); + + if (!gl.getShaderParameter(frag, gl.COMPILE_STATUS)) { + console.error('Fragment Shader compilation failed: ' + gl.getShaderInfoLog(frag)); + console.error(source); + gl.deleteShader(frag); + return null; + } + + var program = gl.createProgram(); + gl.attachShader(program, vert); + gl.attachShader(program, frag); + gl.linkProgram(program); + + if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { + console.error('Program initialization failed: ' + gl.getProgramInfoLog(program)); + return null; + } + + // uniform locations + location[key]["iResolution"] = gl.getUniformLocation(program, "iResolution"); + location[key]["iTime"] = gl.getUniformLocation(program, "iTime"); + location[key]["iTimeDelta"] = gl.getUniformLocation(program, "iTimeDelta"); + location[key]["iFrameRate"] = gl.getUniformLocation(program, "iFrameRate"); + location[key]["iFrame"] = gl.getUniformLocation(program, "iFrame"); + location[key]["iChannelTime"] = gl.getUniformLocation(program, "iChannelTime[0]"); + location[key]["iChannelResolution"] = gl.getUniformLocation(program, "iChannelResolution[0]"); + location[key]["iChannel0"] = gl.getUniformLocation(program, "iChannel0"); + location[key]["iChannel1"] = gl.getUniformLocation(program, "iChannel1"); + location[key]["iChannel2"] = gl.getUniformLocation(program, "iChannel2"); + location[key]["iChannel3"] = gl.getUniformLocation(program, "iChannel3"); + location[key]["iMouse"] = gl.getUniformLocation(program, "iMouse"); + location[key]["iDate"] = gl.getUniformLocation(program, "iDate"); + location[key]["iSampleRate"] = gl.getUniformLocation(program, "iSampleRate"); + location[key]["vertexInPosition"] = gl.getAttribLocation(program, "vertexInPosition"); + + return program; + }; + + var repeat = (times, arr) => { + let result = []; + for (let i = 0; i < times; i++) { + result = [...result, ...arr]; + } + return result; + } + + var setShader = (config, key) => { + if (config) { + if (config.source) { + sourcecode[key] = config.source; + program[key] = compileProgram(key); + if (program[key] == null) { + console.error("Failed to compile " + key); + } + } + for (let i = 0; i < 4; i++) { + var s = config[`iChannel${i}`]; + if (s == "A" || s == "B" || s == "C" || s == "D") { + ichannels[key][i] = s; + } + } + } else { + sourcecode[key] = ""; + program[key] = null; + } + }; + + var draw = () => { + + // current time + var now = isPlaying ? Date.now() : prevDrawTime; + var date = new Date(now); + + // first draw? + if (firstDrawTime == 0) { + firstDrawTime = now; + } + + // call callback + if (onDrawCallback) { + onDrawCallback(); + } + + // time difference between frames in seconds + var iTimeDelta = (now - prevDrawTime) * 0.001; + + // time in seconds + var iTime = (now - firstDrawTime) * 0.001; + var iDate = [date.getFullYear(), date.getMonth(), date.getDate(), date.getTime() * 0.001]; + + // channel uniforms + var iChannelTimes = new Float32Array(repeat(4, [iTime])); + var iChannelResolutions = new Float32Array(repeat(4, [gl.canvas.width, gl.canvas.height, 0])); + + ['A', 'B', 'C', 'D', 'Image'].forEach((key) => { + + if (program[key]) { + + // framebuffer + if (key === "Image") { + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + } else { + var output = flip[key] ? bframebuf[key] : aframebuf[key]; + gl.bindFramebuffer(gl.FRAMEBUFFER, output); + } + + // textures + for (let i = 0; i < 4; i++) { + var chkey = ichannels[key][i]; + if (chkey) { + var input = flip[chkey] ? atexture[chkey] : btexture[chkey]; + gl.activeTexture(gl[`TEXTURE${i}`]); + gl.bindTexture(gl.TEXTURE_2D, input); + } + } + + // program + gl.useProgram(program[key]); + + // uniforms + gl.uniform3f( location[key]["iResolution"], gl.canvas.width, gl.canvas.height, 1.0); + gl.uniform1f( location[key]["iTime"], iTime); + gl.uniform1f( location[key]["iTimeDelta"], iTimeDelta); + gl.uniform1f( location[key]["iFrameRate"], 60); + gl.uniform1i( location[key]["iFrame"], iFrame); + gl.uniform1fv(location[key]["iChannelTime"], iChannelTimes); + gl.uniform3fv(location[key]["iChannelResolution"], iChannelResolutions); + gl.uniform1i( location[key]["iChannel0"], 0); + gl.uniform1i( location[key]["iChannel1"], 1); + gl.uniform1i( location[key]["iChannel2"], 2); + gl.uniform1i( location[key]["iChannel3"], 3); + gl.uniform4f( location[key]["iMouse"], iMouse.x, iMouse.y, iMouse.clickX, iMouse.clickY); + gl.uniform4f( location[key]["iDate"], iDate[0], iDate[1], iDate[2], iDate[3]); + gl.uniform1f( location[key]["iSampleRate"], 44100); + + // viewport + gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); + + // vertexs + gl.bindBuffer(gl.ARRAY_BUFFER, quadBuffer); + gl.vertexAttribPointer(location[key]["vertexInPosition"], 2, gl.FLOAT, false, 0, 0); + gl.enableVertexAttribArray(location[key]["vertexInPosition"]); + + // draw + gl.drawArrays(gl.TRIANGLES, 0, 6); + + flip[key] = !flip[key]; + } + }); + + // time of last draw + prevDrawTime = now; + + // frame counter + iFrame++; + }; + + // Animation loop + var animate = () => { + if (isPlaying) { + draw(); + requestAnimationFrame(animate); + } + }; + + this.setCommon = (source) => { + if (source === undefined) {source = "";} + if (source === null) {source = "";} + common = source; + ['A', 'B', 'C', 'D', 'Image'].forEach((key) => { + if (program[key]) { + program[key] = compileProgram(key); + } + }); + }; + + this.setBufferA = (config) => { + setShader(config, 'A'); + }; + + this.setBufferB = (config) => { + setShader(config, 'B'); + }; + + this.setBufferC = (config) => { + setShader(config, 'C'); + }; + + this.setBufferD = (config) => { + setShader(config, 'D'); + }; + + this.setImage = (config) => { + setShader(config, 'Image'); + }; + + this.setOnDraw = (callback) => { + onDrawCallback = callback; + } + + this.addTexture = (texture, key) => { + atexture[key] = texture; + btexture[key] = texture; + flip[key] = false; + } + + this.time = () => { + return (prevDrawTime - firstDrawTime) * 0.001; + } + + this.isPlaying = () => isPlaying; + + this.reset = () => { + var now = new Date(); + firstDrawTime = now; + prevDrawTime = now; + iFrame = 0; + draw(); + } + + this.pause = () => { + isPlaying = false; + } + + this.play = () => { + if (!isPlaying) { + isPlaying = true; + var now = Date.now(); + var elapsed = prevDrawTime - firstDrawTime; + firstDrawTime = now - elapsed; + prevDrawTime = now; + animate(); + } + } + + setup(); +} + +export default ShaderToyLite; diff --git a/examples/shadertoy-server/tsconfig.json b/examples/shadertoy-server/tsconfig.json new file mode 100644 index 0000000..535267b --- /dev/null +++ b/examples/shadertoy-server/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "verbatimModuleSyntax": true, + "noEmit": true, + "strict": true, + "skipLibCheck": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src", "server.ts"] +} diff --git a/examples/shadertoy-server/vite.config.ts b/examples/shadertoy-server/vite.config.ts new file mode 100644 index 0000000..6ff6d99 --- /dev/null +++ b/examples/shadertoy-server/vite.config.ts @@ -0,0 +1,24 @@ +import { defineConfig } from "vite"; +import { viteSingleFile } from "vite-plugin-singlefile"; + +const INPUT = process.env.INPUT; +if (!INPUT) { + throw new Error("INPUT environment variable is not set"); +} + +const isDevelopment = process.env.NODE_ENV === "development"; + +export default defineConfig({ + plugins: [viteSingleFile()], + build: { + sourcemap: isDevelopment ? "inline" : undefined, + cssMinify: !isDevelopment, + minify: !isDevelopment, + + rollupOptions: { + input: INPUT, + }, + outDir: "dist", + emptyOutDir: false, + }, +}); diff --git a/package-lock.json b/package-lock.json index b63c292..a6cc8a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -104,8 +104,6 @@ }, "examples/basic-host/node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, @@ -143,8 +141,6 @@ }, "examples/basic-server-preact/node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, @@ -185,8 +181,6 @@ }, "examples/basic-server-react/node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, @@ -224,8 +218,6 @@ }, "examples/basic-server-solid/node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, @@ -263,8 +255,6 @@ }, "examples/basic-server-svelte/node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, @@ -300,8 +290,6 @@ }, "examples/basic-server-vanillajs/node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, @@ -339,8 +327,6 @@ }, "examples/basic-server-vue/node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, @@ -377,8 +363,6 @@ }, "examples/budget-allocator-server/node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, @@ -419,8 +403,6 @@ }, "examples/cohort-heatmap-server/node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, @@ -457,8 +439,6 @@ }, "examples/customer-segmentation-server/node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, @@ -496,8 +476,6 @@ }, "examples/integration-server/node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, @@ -576,8 +554,41 @@ }, "examples/scenario-modeler-server/node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "examples/shadertoy-server": { + "name": "@modelcontextprotocol/server-shadertoy", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "@modelcontextprotocol/ext-apps": "^0.3.1", + "@modelcontextprotocol/sdk": "^1.24.0", + "zod": "^4.1.13" + }, + "devDependencies": { + "@types/cors": "^2.8.19", + "@types/express": "^5.0.0", + "@types/node": "^22.0.0", + "concurrently": "^9.2.1", + "cors": "^2.8.5", + "cross-env": "^10.1.0", + "express": "^5.1.0", + "typescript": "^5.9.3", + "vite": "^6.0.0", + "vite-plugin-singlefile": "^2.3.0" + } + }, + "examples/shadertoy-server/node_modules/@types/node": { + "version": "22.19.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "examples/shadertoy-server/node_modules/undici-types": { + "version": "6.21.0", "dev": true, "license": "MIT" }, @@ -614,8 +625,6 @@ }, "examples/sheet-music-server/node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, @@ -653,8 +662,6 @@ }, "examples/system-monitor-server/node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, @@ -697,8 +704,6 @@ }, "examples/threejs-server/node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, @@ -734,8 +739,6 @@ }, "examples/video-resource-server/node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, @@ -773,15 +776,11 @@ }, "examples/wiki-explorer-server/node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, "node_modules/@babel/code-frame": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", "dependencies": { @@ -795,8 +794,6 @@ }, "node_modules/@babel/compat-data": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "dev": true, "license": "MIT", "engines": { @@ -805,10 +802,9 @@ }, "node_modules/@babel/core": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -836,8 +832,6 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -846,8 +840,6 @@ }, "node_modules/@babel/generator": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -863,8 +855,6 @@ }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dev": true, "license": "MIT", "dependencies": { @@ -876,8 +866,6 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "license": "MIT", "dependencies": { @@ -893,8 +881,6 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -903,8 +889,6 @@ }, "node_modules/@babel/helper-globals": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "dev": true, "license": "MIT", "engines": { @@ -913,8 +897,6 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, "license": "MIT", "dependencies": { @@ -927,8 +909,6 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, "license": "MIT", "dependencies": { @@ -945,8 +925,6 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, "license": "MIT", "engines": { @@ -955,8 +933,6 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -964,8 +940,6 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -973,8 +947,6 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "license": "MIT", "engines": { @@ -983,8 +955,6 @@ }, "node_modules/@babel/helpers": { "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", "dependencies": { @@ -997,8 +967,6 @@ }, "node_modules/@babel/parser": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "license": "MIT", "dependencies": { "@babel/types": "^7.28.5" @@ -1012,8 +980,6 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "dev": true, "license": "MIT", "dependencies": { @@ -1028,8 +994,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", - "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", "dev": true, "license": "MIT", "dependencies": { @@ -1048,8 +1012,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx-development": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", - "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1064,8 +1026,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, "license": "MIT", "dependencies": { @@ -1080,8 +1040,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx-source": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, "license": "MIT", "dependencies": { @@ -1096,8 +1054,6 @@ }, "node_modules/@babel/template": { "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "license": "MIT", "dependencies": { @@ -1111,8 +1067,6 @@ }, "node_modules/@babel/traverse": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1130,8 +1084,6 @@ }, "node_modules/@babel/types": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -1143,8 +1095,6 @@ }, "node_modules/@clack/core": { "version": "1.0.0-alpha.4", - "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.0.0-alpha.4.tgz", - "integrity": "sha512-VCtU+vjyKPMSakVrB9q1bOnXN7QW/w4+YQDQCOF59GrzydW+169i0fVx/qzRRXJgt8KGj/pZZ/JxXroFZIDByg==", "dev": true, "license": "MIT", "dependencies": { @@ -1154,8 +1104,6 @@ }, "node_modules/@clack/prompts": { "version": "1.0.0-alpha.4", - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.0.0-alpha.4.tgz", - "integrity": "sha512-KnmtDF2xQGoI5AlBme9akHtvCRV0RKAARUXHBQO2tMwnY8B08/4zPWigT7uLK25UPrMCEqnyQPkKRjNdhPbf8g==", "dev": true, "license": "MIT", "dependencies": { @@ -1166,15 +1114,11 @@ }, "node_modules/@dimforge/rapier3d-compat": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz", - "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==", "dev": true, "license": "Apache-2.0" }, "node_modules/@epic-web/invariant": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", - "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", "dev": true, "license": "MIT" }, @@ -1452,8 +1396,6 @@ }, "node_modules/@esbuild/linux-x64": { "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], @@ -1621,35 +1563,19 @@ } }, "node_modules/@gerrit0/mini-shiki": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.21.0.tgz", - "integrity": "sha512-9PrsT5DjZA+w3lur/aOIx3FlDeHdyCEFlv9U+fmsVyjPZh61G5SYURQ/1ebe2U63KbDmI2V8IhIUegWb8hjOyg==", + "version": "3.19.0", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/engine-oniguruma": "^3.21.0", - "@shikijs/langs": "^3.21.0", - "@shikijs/themes": "^3.21.0", - "@shikijs/types": "^3.21.0", + "@shikijs/engine-oniguruma": "^3.19.0", + "@shikijs/langs": "^3.19.0", + "@shikijs/themes": "^3.19.0", + "@shikijs/types": "^3.19.0", "@shikijs/vscode-textmate": "^10.0.2" } }, - "node_modules/@hono/node-server": { - "version": "1.19.8", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.8.tgz", - "integrity": "sha512-0/g2lIOPzX8f3vzW1ggQgvG5mjtFBDBHFAzI5SFAi2DzSqS9luJwqg9T6O/gKYLi+inS7eNxBeIFkkghIPvrMA==", - "license": "MIT", - "engines": { - "node": ">=18.14.1" - }, - "peerDependencies": { - "hono": "^4" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -1658,8 +1584,6 @@ }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -1668,8 +1592,6 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "license": "MIT", "engines": { "node": ">=6.0.0" @@ -1677,14 +1599,10 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1693,8 +1611,6 @@ }, "node_modules/@kurkle/color": { "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", - "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", "license": "MIT" }, "node_modules/@modelcontextprotocol/ext-apps": { @@ -1706,12 +1622,9 @@ "link": true }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.25.2", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.2.tgz", - "integrity": "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww==", + "version": "1.24.3", "license": "MIT", "dependencies": { - "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", @@ -1722,7 +1635,6 @@ "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", - "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", @@ -1788,6 +1700,10 @@ "resolved": "examples/scenario-modeler-server", "link": true }, + "node_modules/@modelcontextprotocol/server-shadertoy": { + "resolved": "examples/shadertoy-server", + "link": true + }, "node_modules/@modelcontextprotocol/server-sheet-music": { "resolved": "examples/sheet-music-server", "link": true @@ -1810,8 +1726,6 @@ }, "node_modules/@oclif/core": { "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.8.0.tgz", - "integrity": "sha512-jteNUQKgJHLHFbbz806aGZqf+RJJ7t4gwF4MYa8fCwCxQ8/klJNWc0MvaJiBebk7Mc+J39mdlsB4XraaCKznFw==", "dev": true, "license": "MIT", "dependencies": { @@ -1840,8 +1754,6 @@ }, "node_modules/@oclif/core/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1850,8 +1762,6 @@ }, "node_modules/@oclif/core/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -1931,8 +1841,6 @@ }, "node_modules/@oven/bun-linux-x64": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64/-/bun-linux-x64-1.3.5.tgz", - "integrity": "sha512-n7zhKTSDZS0yOYg5Rq8easZu5Y/o47sv0c7yGr2ciFdcie9uYV55fZ7QMqhWMGK33ezCSikh5EDkUMCIvfWpjA==", "cpu": [ "x64" ], @@ -1944,8 +1852,6 @@ }, "node_modules/@oven/bun-linux-x64-baseline": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-baseline/-/bun-linux-x64-baseline-1.3.5.tgz", - "integrity": "sha512-FeCQyBU62DMuB0nn01vPnf3McXrKOsrK9p7sHaBFYycw0mmoU8kCq/WkBkGMnLuvQljJSyen8QBTx+fXdNupWg==", "cpu": [ "x64" ], @@ -1957,8 +1863,6 @@ }, "node_modules/@oven/bun-linux-x64-musl": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-musl/-/bun-linux-x64-musl-1.3.5.tgz", - "integrity": "sha512-XkCCHkByYn8BIDvoxnny898znju4xnW2kvFE8FT5+0Y62cWdcBGMZ9RdsEUTeRz16k8hHtJpaSfLcEmNTFIwRQ==", "cpu": [ "x64" ], @@ -1970,8 +1874,6 @@ }, "node_modules/@oven/bun-linux-x64-musl-baseline": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-musl-baseline/-/bun-linux-x64-musl-baseline-1.3.5.tgz", - "integrity": "sha512-TJiYC7KCr0XxFTsxgwQOeE7dncrEL/RSyL0EzSL3xRkrxJMWBCvCSjQn7LV1i6T7hFst0+3KoN3VWvD5BinqHA==", "cpu": [ "x64" ], @@ -2009,8 +1911,6 @@ }, "node_modules/@playwright/test": { "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.57.0.tgz", - "integrity": "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2025,8 +1925,6 @@ }, "node_modules/@preact/preset-vite": { "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.10.2.tgz", - "integrity": "sha512-K9wHlJOtkE+cGqlyQ5v9kL3Ge0Ql4LlIZjkUTL+1zf3nNdF88F9UZN6VTV8jdzBX9Fl7WSzeNMSDG7qECPmSmg==", "dev": true, "license": "MIT", "dependencies": { @@ -2046,15 +1944,11 @@ }, "node_modules/@prefresh/babel-plugin": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@prefresh/babel-plugin/-/babel-plugin-0.5.2.tgz", - "integrity": "sha512-AOl4HG6dAxWkJ5ndPHBgBa49oo/9bOiJuRDKHLSTyH+Fd9x00shTXpdiTj1W41l6oQIwUOAgJeHMn4QwIDpHkA==", "dev": true, "license": "MIT" }, "node_modules/@prefresh/core": { "version": "1.5.9", - "resolved": "https://registry.npmjs.org/@prefresh/core/-/core-1.5.9.tgz", - "integrity": "sha512-IKBKCPaz34OFVC+adiQ2qaTF5qdztO2/4ZPf4KsRTgjKosWqxVXmEbxCiUydYZRY8GVie+DQlKzQr9gt6HQ+EQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2063,15 +1957,11 @@ }, "node_modules/@prefresh/utils": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@prefresh/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-vq/sIuN5nYfYzvyayXI4C2QkprfNaHUQ9ZX+3xLD8nL3rWyzpxOm1+K7RtMbhd+66QcaISViK7amjnheQ/4WZw==", "dev": true, "license": "MIT" }, "node_modules/@prefresh/vite": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/@prefresh/vite/-/vite-2.4.11.tgz", - "integrity": "sha512-/XjURQqdRiCG3NpMmWqE9kJwrg9IchIOWHzulCfqg2sRe/8oQ1g5De7xrk9lbqPIQLn7ntBkKdqWXIj4E9YXyg==", "dev": true, "license": "MIT", "dependencies": { @@ -2088,15 +1978,11 @@ }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", "dev": true, "license": "MIT" }, "node_modules/@rollup/pluginutils": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2107,10 +1993,15 @@ "node": ">= 8.0.0" } }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", - "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", + "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", "cpu": [ "arm" ], @@ -2122,9 +2013,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", - "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", + "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", "cpu": [ "arm64" ], @@ -2162,9 +2053,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", - "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", + "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", "cpu": [ "arm64" ], @@ -2176,9 +2067,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", - "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", + "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", "cpu": [ "x64" ], @@ -2190,9 +2081,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", - "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", + "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", "cpu": [ "arm" ], @@ -2204,9 +2095,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", - "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", + "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", "cpu": [ "arm" ], @@ -2231,9 +2122,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", - "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", + "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", "cpu": [ "arm64" ], @@ -2245,23 +2136,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", - "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", - "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", + "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", "cpu": [ "loong64" ], @@ -2273,23 +2150,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", - "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", - "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", + "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", "cpu": [ "ppc64" ], @@ -2301,9 +2164,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", - "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", + "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", "cpu": [ "riscv64" ], @@ -2315,9 +2178,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", - "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", + "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", "cpu": [ "riscv64" ], @@ -2329,9 +2192,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", - "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", + "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", "cpu": [ "s390x" ], @@ -2343,9 +2206,7 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", - "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", + "version": "4.53.3", "cpu": [ "x64" ], @@ -2356,9 +2217,7 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", - "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", + "version": "4.53.3", "cpu": [ "x64" ], @@ -2369,24 +2228,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", - "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", - "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", + "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", "cpu": [ "arm64" ], @@ -2411,9 +2256,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", - "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", + "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", "cpu": [ "ia32" ], @@ -2425,9 +2270,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", - "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", + "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", "cpu": [ "x64" ], @@ -2452,40 +2297,32 @@ ] }, "node_modules/@shikijs/engine-oniguruma": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.21.0.tgz", - "integrity": "sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ==", + "version": "3.19.0", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.21.0", + "@shikijs/types": "3.19.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "node_modules/@shikijs/langs": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.21.0.tgz", - "integrity": "sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA==", + "version": "3.19.0", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.21.0" + "@shikijs/types": "3.19.0" } }, "node_modules/@shikijs/themes": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.21.0.tgz", - "integrity": "sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw==", + "version": "3.19.0", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.21.0" + "@shikijs/types": "3.19.0" } }, "node_modules/@shikijs/types": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.21.0.tgz", - "integrity": "sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA==", + "version": "3.19.0", "dev": true, "license": "MIT", "dependencies": { @@ -2495,15 +2332,11 @@ }, "node_modules/@shikijs/vscode-textmate": { "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", "dev": true, "license": "MIT" }, "node_modules/@sveltejs/acorn-typescript": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.8.tgz", - "integrity": "sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA==", "license": "MIT", "peerDependencies": { "acorn": "^8.9.0" @@ -2511,10 +2344,9 @@ }, "node_modules/@sveltejs/vite-plugin-svelte": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.1.1.tgz", - "integrity": "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", "debug": "^4.4.1", @@ -2533,8 +2365,6 @@ }, "node_modules/@sveltejs/vite-plugin-svelte-inspector": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz", - "integrity": "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==", "dev": true, "license": "MIT", "dependencies": { @@ -2551,15 +2381,11 @@ }, "node_modules/@tweenjs/tween.js": { "version": "23.1.3", - "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", - "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", "dev": true, "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", "dependencies": { @@ -2572,8 +2398,6 @@ }, "node_modules/@types/babel__generator": { "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", "dependencies": { @@ -2582,8 +2406,6 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", "dependencies": { @@ -2593,8 +2415,6 @@ }, "node_modules/@types/babel__traverse": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2603,8 +2423,6 @@ }, "node_modules/@types/body-parser": { "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "dev": true, "license": "MIT", "dependencies": { @@ -2613,19 +2431,15 @@ } }, "node_modules/@types/bun": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.3.5.tgz", - "integrity": "sha512-RnygCqNrd3srIPEWBd5LFeUYG7plCoH2Yw9WaZGyNmdTEei+gWaHqydbaIRkIkcbXwhBT94q78QljxN0Sk838w==", + "version": "1.3.3", "dev": true, "license": "MIT", "dependencies": { - "bun-types": "1.3.5" + "bun-types": "1.3.3" } }, "node_modules/@types/chai": { "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, "license": "MIT", "dependencies": { @@ -2635,8 +2449,6 @@ }, "node_modules/@types/connect": { "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "license": "MIT", "dependencies": { @@ -2645,8 +2457,6 @@ }, "node_modules/@types/cors": { "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", "dev": true, "license": "MIT", "dependencies": { @@ -2655,21 +2465,15 @@ }, "node_modules/@types/deep-eql": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true, "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, "node_modules/@types/express": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", - "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", "dev": true, "license": "MIT", "dependencies": { @@ -2680,8 +2484,6 @@ }, "node_modules/@types/express-serve-static-core": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", - "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", "dev": true, "license": "MIT", "dependencies": { @@ -2693,8 +2495,6 @@ }, "node_modules/@types/hast": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2703,49 +2503,39 @@ }, "node_modules/@types/http-errors": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "dev": true, "license": "MIT" }, "node_modules/@types/node": { - "version": "25.0.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", - "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", + "version": "24.10.1", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.16.0" } }, "node_modules/@types/qs": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", "dev": true, "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true, "license": "MIT" }, "node_modules/@types/react": { "version": "19.2.7", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", - "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } }, "node_modules/@types/react-dom": { "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2754,8 +2544,6 @@ }, "node_modules/@types/send": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2764,8 +2552,6 @@ }, "node_modules/@types/serve-static": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2775,15 +2561,11 @@ }, "node_modules/@types/stats.js": { "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz", - "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", "dev": true, "license": "MIT" }, "node_modules/@types/three": { "version": "0.181.0", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.181.0.tgz", - "integrity": "sha512-MLF1ks8yRM2k71D7RprFpDb9DOX0p22DbdPqT/uAkc6AtQXjxWCVDjCy23G9t1o8HcQPk7woD2NIyiaWcWPYmA==", "dev": true, "license": "MIT", "dependencies": { @@ -2798,22 +2580,16 @@ }, "node_modules/@types/unist": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "dev": true, "license": "MIT" }, "node_modules/@types/webxr": { "version": "0.5.24", - "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz", - "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==", "dev": true, "license": "MIT" }, "node_modules/@typescript/vfs": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.6.2.tgz", - "integrity": "sha512-hoBwJwcbKHmvd2QVebiytN1aELvpk9B74B4L1mFm/XT1Q/VOYAWl2vQ9AWRFtQq8zmz6enTpfTV8WRc4ATjW/g==", "dev": true, "license": "MIT", "dependencies": { @@ -2825,8 +2601,6 @@ }, "node_modules/@vitejs/plugin-react": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", "dev": true, "license": "MIT", "dependencies": { @@ -2846,8 +2620,6 @@ }, "node_modules/@vitejs/plugin-vue": { "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", - "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", "dev": true, "license": "MIT", "engines": { @@ -2860,8 +2632,6 @@ }, "node_modules/@vitest/expect": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", "dev": true, "license": "MIT", "dependencies": { @@ -2877,8 +2647,6 @@ }, "node_modules/@vitest/mocker": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2902,20 +2670,8 @@ } } }, - "node_modules/@vitest/mocker/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/@vitest/pretty-format": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", "dev": true, "license": "MIT", "dependencies": { @@ -2927,8 +2683,6 @@ }, "node_modules/@vitest/runner": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2942,8 +2696,6 @@ }, "node_modules/@vitest/snapshot": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2957,8 +2709,6 @@ }, "node_modules/@vitest/spy": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", "dev": true, "license": "MIT", "dependencies": { @@ -2970,8 +2720,6 @@ }, "node_modules/@vitest/utils": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", "dev": true, "license": "MIT", "dependencies": { @@ -2985,8 +2733,6 @@ }, "node_modules/@vue/compiler-core": { "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.26.tgz", - "integrity": "sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w==", "license": "MIT", "dependencies": { "@babel/parser": "^7.28.5", @@ -2998,8 +2744,6 @@ }, "node_modules/@vue/compiler-core/node_modules/entities": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.0.tgz", - "integrity": "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -3008,10 +2752,12 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/@vue/compiler-core/node_modules/estree-walker": { + "version": "2.0.2", + "license": "MIT" + }, "node_modules/@vue/compiler-dom": { "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.26.tgz", - "integrity": "sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A==", "license": "MIT", "dependencies": { "@vue/compiler-core": "3.5.26", @@ -3020,8 +2766,6 @@ }, "node_modules/@vue/compiler-sfc": { "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.26.tgz", - "integrity": "sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA==", "license": "MIT", "dependencies": { "@babel/parser": "^7.28.5", @@ -3035,10 +2779,12 @@ "source-map-js": "^1.2.1" } }, + "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { + "version": "2.0.2", + "license": "MIT" + }, "node_modules/@vue/compiler-ssr": { "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.26.tgz", - "integrity": "sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw==", "license": "MIT", "dependencies": { "@vue/compiler-dom": "3.5.26", @@ -3047,8 +2793,6 @@ }, "node_modules/@vue/reactivity": { "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.26.tgz", - "integrity": "sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ==", "license": "MIT", "dependencies": { "@vue/shared": "3.5.26" @@ -3056,8 +2800,6 @@ }, "node_modules/@vue/runtime-core": { "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.26.tgz", - "integrity": "sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q==", "license": "MIT", "dependencies": { "@vue/reactivity": "3.5.26", @@ -3066,8 +2808,6 @@ }, "node_modules/@vue/runtime-dom": { "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.26.tgz", - "integrity": "sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ==", "license": "MIT", "dependencies": { "@vue/reactivity": "3.5.26", @@ -3078,8 +2818,6 @@ }, "node_modules/@vue/server-renderer": { "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.26.tgz", - "integrity": "sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA==", "license": "MIT", "dependencies": { "@vue/compiler-ssr": "3.5.26", @@ -3091,21 +2829,15 @@ }, "node_modules/@vue/shared": { "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.26.tgz", - "integrity": "sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==", "license": "MIT" }, "node_modules/@webgpu/types": { - "version": "0.1.68", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.68.tgz", - "integrity": "sha512-3ab1B59Ojb6RwjOspYLsTpCzbNB3ZaamIAxBMmvnNkiDoLTZUOBXZ9p5nAYVEkQlDdf6qAZWi1pqj9+ypiqznA==", + "version": "0.1.67", "dev": true, "license": "BSD-3-Clause" }, "node_modules/abcjs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/abcjs/-/abcjs-6.6.0.tgz", - "integrity": "sha512-lYS+qwOOxFcFY5ZjNmS1l4RT6BxGd2juBOzLD5/PfLZ+jd0zz29CMI/SwxCWb0+cdKjTBc/EHO43lUGB93FaAw==", + "version": "6.5.2", "license": "MIT", "funding": { "type": "github", @@ -3114,8 +2846,6 @@ }, "node_modules/accepts": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", "dependencies": { "mime-types": "^3.0.0", @@ -3127,8 +2857,6 @@ }, "node_modules/accessor-fn": { "version": "1.5.3", - "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.3.tgz", - "integrity": "sha512-rkAofCwe/FvYFUlMB0v0gWmhqtfAtV1IUkdPbfhTUyYniu5LrC0A0UJkTH0Jv3S8SvwkmfuAlY+mQIJATdocMA==", "dev": true, "license": "MIT", "engines": { @@ -3137,9 +2865,8 @@ }, "node_modules/acorn": { "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3149,8 +2876,6 @@ }, "node_modules/ajv": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -3165,8 +2890,6 @@ }, "node_modules/ajv-formats": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -3182,8 +2905,6 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3198,8 +2919,6 @@ }, "node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -3211,8 +2930,6 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -3227,8 +2944,6 @@ }, "node_modules/ansis": { "version": "3.17.0", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", - "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", "dev": true, "license": "ISC", "engines": { @@ -3237,8 +2952,6 @@ }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "license": "ISC", "dependencies": { @@ -3251,15 +2964,11 @@ }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/aria-query": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "license": "Apache-2.0", "engines": { "node": ">= 0.4" @@ -3267,8 +2976,6 @@ }, "node_modules/assertion-error": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", "engines": { @@ -3277,15 +2984,11 @@ }, "node_modules/async": { "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true, "license": "MIT" }, "node_modules/axobject-query": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "license": "Apache-2.0", "engines": { "node": ">= 0.4" @@ -3293,8 +2996,6 @@ }, "node_modules/babel-plugin-jsx-dom-expressions": { "version": "0.40.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.40.3.tgz", - "integrity": "sha512-5HOwwt0BYiv/zxl7j8Pf2bGL6rDXfV6nUhLs8ygBX+EFJXzBPHM/euj9j/6deMZ6wa52Wb2PBaAV5U/jKwIY1w==", "dev": true, "license": "MIT", "dependencies": { @@ -3310,8 +3011,6 @@ }, "node_modules/babel-plugin-jsx-dom-expressions/node_modules/@babel/helper-module-imports": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dev": true, "license": "MIT", "dependencies": { @@ -3323,8 +3022,6 @@ }, "node_modules/babel-plugin-transform-hook-names": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-hook-names/-/babel-plugin-transform-hook-names-1.0.2.tgz", - "integrity": "sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==", "dev": true, "license": "MIT", "peerDependencies": { @@ -3333,8 +3030,6 @@ }, "node_modules/babel-preset-solid": { "version": "1.9.10", - "resolved": "https://registry.npmjs.org/babel-preset-solid/-/babel-preset-solid-1.9.10.tgz", - "integrity": "sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3352,8 +3047,6 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, @@ -3369,8 +3062,6 @@ }, "node_modules/bezier-js": { "version": "6.1.4", - "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.4.tgz", - "integrity": "sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg==", "dev": true, "license": "MIT", "funding": { @@ -3380,8 +3071,6 @@ }, "node_modules/binary-extensions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "license": "MIT", "engines": { @@ -3392,9 +3081,7 @@ } }, "node_modules/body-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "version": "2.2.1", "license": "MIT", "dependencies": { "bytes": "^3.1.2", @@ -3403,7 +3090,7 @@ "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", - "qs": "^6.14.1", + "qs": "^6.14.0", "raw-body": "^3.0.1", "type-is": "^2.0.1" }, @@ -3417,14 +3104,10 @@ }, "node_modules/boolbase": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, "node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -3434,8 +3117,6 @@ }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { @@ -3447,8 +3128,6 @@ }, "node_modules/browserslist": { "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { @@ -3465,6 +3144,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -3480,9 +3160,7 @@ } }, "node_modules/bun-types": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.3.5.tgz", - "integrity": "sha512-inmAYe2PFLs0SUbFOWSVD24sg1jFlMPxOjOSSCYqUgn4Hsc3rDc7dFvfVYjFPNHtov6kgUeulV4SxbuIV/stPw==", + "version": "1.3.3", "dev": true, "license": "MIT", "dependencies": { @@ -3491,8 +3169,6 @@ }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -3500,8 +3176,6 @@ }, "node_modules/cac": { "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, "license": "MIT", "engines": { @@ -3510,8 +3184,6 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -3523,8 +3195,6 @@ }, "node_modules/call-bound": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -3538,9 +3208,7 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001763", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001763.tgz", - "integrity": "sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ==", + "version": "1.0.30001759", "dev": true, "funding": [ { @@ -3560,8 +3228,6 @@ }, "node_modules/canvas-color-tracker": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/canvas-color-tracker/-/canvas-color-tracker-1.3.2.tgz", - "integrity": "sha512-ryQkDX26yJ3CXzb3hxUVNlg1NKE4REc5crLBq661Nxzr8TNd236SaEf2ffYLXyI5tSABSeguHLqcVq4vf9L3Zg==", "dev": true, "license": "MIT", "dependencies": { @@ -3573,8 +3239,6 @@ }, "node_modules/chai": { "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", "dev": true, "license": "MIT", "dependencies": { @@ -3590,8 +3254,6 @@ }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -3607,8 +3269,6 @@ }, "node_modules/chalk/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -3620,8 +3280,6 @@ }, "node_modules/chart.js": { "version": "4.5.1", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", - "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" @@ -3631,9 +3289,7 @@ } }, "node_modules/check-error": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", - "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", + "version": "2.1.1", "dev": true, "license": "MIT", "engines": { @@ -3642,8 +3298,6 @@ }, "node_modules/cheerio": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", - "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", @@ -3667,8 +3321,6 @@ }, "node_modules/cheerio-select": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -3684,8 +3336,6 @@ }, "node_modules/chokidar": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -3709,8 +3359,6 @@ }, "node_modules/clean-stack": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", - "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", "dev": true, "license": "MIT", "dependencies": { @@ -3725,8 +3373,6 @@ }, "node_modules/cli-cursor": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", "dependencies": { @@ -3741,8 +3387,6 @@ }, "node_modules/cli-spinners": { "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, "license": "MIT", "engines": { @@ -3754,8 +3398,6 @@ }, "node_modules/cli-truncate": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", - "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", "dev": true, "license": "MIT", "dependencies": { @@ -3771,8 +3413,6 @@ }, "node_modules/cli-truncate/node_modules/string-width": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", - "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", "dev": true, "license": "MIT", "dependencies": { @@ -3788,8 +3428,6 @@ }, "node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "license": "ISC", "dependencies": { @@ -3803,8 +3441,6 @@ }, "node_modules/cliui/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -3813,8 +3449,6 @@ }, "node_modules/cliui/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -3826,8 +3460,6 @@ }, "node_modules/clsx": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", "engines": { "node": ">=6" @@ -3835,8 +3467,6 @@ }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3848,29 +3478,21 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true, "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, "license": "MIT" }, "node_modules/concurrently": { "version": "9.2.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", - "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", "dev": true, "license": "MIT", "dependencies": { @@ -3894,8 +3516,6 @@ }, "node_modules/content-disposition": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", "engines": { "node": ">=18" @@ -3907,8 +3527,6 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -3916,15 +3534,11 @@ }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, "node_modules/cookie": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -3932,8 +3546,6 @@ }, "node_modules/cookie-signature": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", "engines": { "node": ">=6.6.0" @@ -3941,8 +3553,6 @@ }, "node_modules/cors": { "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "license": "MIT", "dependencies": { "object-assign": "^4", @@ -3954,8 +3564,6 @@ }, "node_modules/cross-env": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", - "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", "dev": true, "license": "MIT", "dependencies": { @@ -3972,8 +3580,6 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -3986,8 +3592,6 @@ }, "node_modules/css-select": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -4002,8 +3606,6 @@ }, "node_modules/css-what": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "license": "BSD-2-Clause", "engines": { "node": ">= 6" @@ -4014,14 +3616,10 @@ }, "node_modules/csstype": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, "node_modules/d3-array": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "dev": true, "license": "ISC", "dependencies": { @@ -4033,15 +3631,11 @@ }, "node_modules/d3-binarytree": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz", - "integrity": "sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==", "dev": true, "license": "MIT" }, "node_modules/d3-color": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", "dev": true, "license": "ISC", "engines": { @@ -4050,8 +3644,6 @@ }, "node_modules/d3-dispatch": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", "dev": true, "license": "ISC", "engines": { @@ -4060,8 +3652,6 @@ }, "node_modules/d3-drag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", "dev": true, "license": "ISC", "dependencies": { @@ -4074,8 +3664,6 @@ }, "node_modules/d3-ease": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -4084,8 +3672,6 @@ }, "node_modules/d3-force-3d": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.6.tgz", - "integrity": "sha512-4tsKHUPLOVkyfEffZo1v6sFHvGFwAIIjt/W8IThbp08DYAsXZck+2pSHEG5W1+gQgEvFLdZkYvmJAbRM2EzMnA==", "dev": true, "license": "MIT", "dependencies": { @@ -4101,8 +3687,6 @@ }, "node_modules/d3-format": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", "dev": true, "license": "ISC", "engines": { @@ -4111,8 +3695,6 @@ }, "node_modules/d3-interpolate": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "dev": true, "license": "ISC", "dependencies": { @@ -4124,15 +3706,11 @@ }, "node_modules/d3-octree": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-1.1.0.tgz", - "integrity": "sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==", "dev": true, "license": "MIT" }, "node_modules/d3-quadtree": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", "dev": true, "license": "ISC", "engines": { @@ -4141,8 +3719,6 @@ }, "node_modules/d3-scale": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "dev": true, "license": "ISC", "dependencies": { @@ -4158,8 +3734,6 @@ }, "node_modules/d3-scale-chromatic": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", "dev": true, "license": "ISC", "dependencies": { @@ -4172,18 +3746,15 @@ }, "node_modules/d3-selection": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": ">=12" } }, "node_modules/d3-time": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "dev": true, "license": "ISC", "dependencies": { @@ -4195,8 +3766,6 @@ }, "node_modules/d3-time-format": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "dev": true, "license": "ISC", "dependencies": { @@ -4208,8 +3777,6 @@ }, "node_modules/d3-timer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", "dev": true, "license": "ISC", "engines": { @@ -4218,8 +3785,6 @@ }, "node_modules/d3-transition": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", "dev": true, "license": "ISC", "dependencies": { @@ -4238,8 +3803,6 @@ }, "node_modules/d3-zoom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", "dev": true, "license": "ISC", "dependencies": { @@ -4255,8 +3818,6 @@ }, "node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -4272,8 +3833,6 @@ }, "node_modules/deep-eql": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, "license": "MIT", "engines": { @@ -4282,8 +3841,6 @@ }, "node_modules/deepmerge": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "license": "MIT", "engines": { @@ -4292,8 +3849,6 @@ }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -4301,14 +3856,10 @@ }, "node_modules/devalue": { "version": "5.6.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.1.tgz", - "integrity": "sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==", "license": "MIT" }, "node_modules/dom-serializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", @@ -4321,8 +3872,6 @@ }, "node_modules/domelementtype": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", @@ -4333,8 +3882,6 @@ }, "node_modules/domhandler": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" @@ -4348,8 +3895,6 @@ }, "node_modules/domutils": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", @@ -4362,8 +3907,6 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -4376,14 +3919,10 @@ }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, "node_modules/ejs": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4397,23 +3936,17 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.267", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "version": "1.5.266", "dev": true, "license": "ISC" }, "node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, "node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -4421,8 +3954,6 @@ }, "node_modules/encoding-sniffer": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", - "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", "license": "MIT", "dependencies": { "iconv-lite": "^0.6.3", @@ -4434,8 +3965,6 @@ }, "node_modules/encoding-sniffer/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -4446,8 +3975,6 @@ }, "node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -4458,8 +3985,6 @@ }, "node_modules/environment": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, "license": "MIT", "engines": { @@ -4471,8 +3996,6 @@ }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4480,8 +4003,6 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4489,15 +4010,11 @@ }, "node_modules/es-module-lexer": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -4508,8 +4025,6 @@ }, "node_modules/esbuild": { "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4550,8 +4065,6 @@ }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "engines": { @@ -4560,14 +4073,10 @@ }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { @@ -4579,29 +4088,25 @@ }, "node_modules/esm-env": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", - "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", "license": "MIT" }, "node_modules/esrap": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.1.tgz", - "integrity": "sha512-GiYWG34AN/4CUyaWAgunGt0Rxvr1PTMlGC0vvEov/uOQYWne2bpN03Um+k8jT+q3op33mKouP2zeJ6OlM+qeUg==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -4609,15 +4114,11 @@ }, "node_modules/eventemitter3": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true, "license": "MIT" }, "node_modules/eventsource": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", "license": "MIT", "dependencies": { "eventsource-parser": "^3.0.1" @@ -4628,17 +4129,13 @@ }, "node_modules/eventsource-parser": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", "license": "MIT", "engines": { "node": ">=18.0.0" } }, "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "version": "1.2.2", "dev": true, "license": "Apache-2.0", "engines": { @@ -4647,9 +4144,8 @@ }, "node_modules/express": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", + "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -4690,8 +4186,6 @@ }, "node_modules/express-rate-limit": { "version": "7.5.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", - "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", "license": "MIT", "engines": { "node": ">= 16" @@ -4705,14 +4199,10 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-uri": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "funding": [ { "type": "github", @@ -4727,15 +4217,11 @@ }, "node_modules/fflate": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", "dev": true, "license": "MIT" }, "node_modules/filelist": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4744,8 +4230,6 @@ }, "node_modules/filelist/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4754,8 +4238,6 @@ }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "license": "ISC", "dependencies": { @@ -4767,8 +4249,6 @@ }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { @@ -4780,8 +4260,6 @@ }, "node_modules/finalhandler": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -4801,8 +4279,6 @@ }, "node_modules/float-tooltip": { "version": "1.7.5", - "resolved": "https://registry.npmjs.org/float-tooltip/-/float-tooltip-1.7.5.tgz", - "integrity": "sha512-/kXzuDnnBqyyWyhDMH7+PfP8J/oXiAavGzcRxASOMRHFuReDtofizLLJsf7nnDLAfEaMW4pVWaXrAjtnglpEkg==", "dev": true, "license": "MIT", "dependencies": { @@ -4816,8 +4292,6 @@ }, "node_modules/force-graph": { "version": "1.51.0", - "resolved": "https://registry.npmjs.org/force-graph/-/force-graph-1.51.0.tgz", - "integrity": "sha512-aTnihCmiMA0ItLJLCbrQYS9mzriopW24goFPgUnKAAmAlPogTSmFWqoBPMXzIfPb7bs04Hur5zEI4WYgLW3Sig==", "dev": true, "license": "MIT", "dependencies": { @@ -4843,8 +4317,6 @@ }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -4852,8 +4324,6 @@ }, "node_modules/fresh": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -4876,8 +4346,6 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4885,8 +4353,6 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", "engines": { @@ -4895,8 +4361,6 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", "engines": { @@ -4905,8 +4369,6 @@ }, "node_modules/get-east-asian-width": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "dev": true, "license": "MIT", "engines": { @@ -4918,8 +4380,6 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -4942,8 +4402,6 @@ }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", "engines": { @@ -4952,8 +4410,6 @@ }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -4965,8 +4421,6 @@ }, "node_modules/get-tsconfig": { "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4978,8 +4432,6 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", "dependencies": { @@ -4991,8 +4443,6 @@ }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5003,8 +4453,6 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -5013,8 +4461,6 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5025,8 +4471,6 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -5037,35 +4481,19 @@ }, "node_modules/he": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, "license": "MIT", "bin": { "he": "bin/he" } }, - "node_modules/hono": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.3.tgz", - "integrity": "sha512-PmQi306+M/ct/m5s66Hrg+adPnkD5jiO6IjA7WhWw0gSBSo1EcRegwuI1deZ+wd5pzCGynCcn2DprnE4/yEV4w==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=16.9.0" - } - }, "node_modules/html-entities": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "dev": true, "license": "MIT" }, "node_modules/htmlparser2": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", - "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -5083,8 +4511,6 @@ }, "node_modules/htmlparser2/node_modules/entities": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -5095,8 +4521,6 @@ }, "node_modules/http-errors": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { "depd": "~2.0.0", @@ -5115,8 +4539,6 @@ }, "node_modules/husky": { "version": "9.1.7", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", - "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true, "license": "MIT", "bin": { @@ -5130,9 +4552,7 @@ } }, "node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "version": "0.7.0", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -5147,15 +4567,11 @@ }, "node_modules/ignore-by-default": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", "dev": true, "license": "ISC" }, "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "license": "MIT", "engines": { @@ -5164,8 +4580,6 @@ }, "node_modules/index-array-by": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/index-array-by/-/index-array-by-1.4.2.tgz", - "integrity": "sha512-SP23P27OUKzXWEC/TOyWlwLviofQkCSCKONnc62eItjp69yCZZPqDQtr3Pw5gJDnPeUMqExmKydNZaJO0FU9pw==", "dev": true, "license": "MIT", "engines": { @@ -5174,8 +4588,6 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/integration-server": { @@ -5184,8 +4596,6 @@ }, "node_modules/internmap": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", "dev": true, "license": "ISC", "engines": { @@ -5194,8 +4604,6 @@ }, "node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -5203,8 +4611,6 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "license": "MIT", "dependencies": { @@ -5216,8 +4622,6 @@ }, "node_modules/is-docker": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, "license": "MIT", "bin": { @@ -5232,8 +4636,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -5242,8 +4644,6 @@ }, "node_modules/is-fullwidth-code-point": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5258,8 +4658,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -5271,8 +4669,6 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", "engines": { @@ -5281,14 +4677,10 @@ }, "node_modules/is-promise": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, "node_modules/is-reference": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", - "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.6" @@ -5296,8 +4688,6 @@ }, "node_modules/is-what": { "version": "4.1.16", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", - "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", "dev": true, "license": "MIT", "engines": { @@ -5309,8 +4699,6 @@ }, "node_modules/is-wsl": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "license": "MIT", "dependencies": { @@ -5322,14 +4710,10 @@ }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, "node_modules/jake": { "version": "10.9.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", - "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5346,8 +4730,6 @@ }, "node_modules/jose": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", - "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -5355,15 +4737,11 @@ }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, "node_modules/jsesc": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { @@ -5375,20 +4753,10 @@ }, "node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, - "node_modules/json-schema-typed": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", - "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", - "license": "BSD-2-Clause" - }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", "bin": { @@ -5400,8 +4768,6 @@ }, "node_modules/kapsule": { "version": "1.16.3", - "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.16.3.tgz", - "integrity": "sha512-4+5mNNf4vZDSwPhKprKwz3330iisPrb08JyMgbsdFrimBCKNHecua/WBwvVg3n7vwx0C1ARjfhwIpbrbd9n5wg==", "dev": true, "license": "MIT", "dependencies": { @@ -5413,8 +4779,6 @@ }, "node_modules/kleur": { "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "dev": true, "license": "MIT", "engines": { @@ -5423,15 +4787,11 @@ }, "node_modules/kolorist": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", "dev": true, "license": "MIT" }, "node_modules/lilconfig": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, "license": "MIT", "engines": { @@ -5443,8 +4803,6 @@ }, "node_modules/linkify-it": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5453,8 +4811,6 @@ }, "node_modules/listr2": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", - "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", "dev": true, "license": "MIT", "dependencies": { @@ -5471,8 +4827,6 @@ }, "node_modules/listr2/node_modules/ansi-styles": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -5484,15 +4838,11 @@ }, "node_modules/listr2/node_modules/emoji-regex": { "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, "node_modules/listr2/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5509,8 +4859,6 @@ }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { @@ -5527,21 +4875,15 @@ }, "node_modules/locate-character": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", "license": "MIT" }, "node_modules/lodash-es": { - "version": "4.17.22", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.22.tgz", - "integrity": "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==", + "version": "4.17.21", "dev": true, "license": "MIT" }, "node_modules/log-update": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, "license": "MIT", "dependencies": { @@ -5560,8 +4902,6 @@ }, "node_modules/log-update/node_modules/ansi-escapes": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", - "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", "dev": true, "license": "MIT", "dependencies": { @@ -5576,8 +4916,6 @@ }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -5589,15 +4927,11 @@ }, "node_modules/log-update/node_modules/emoji-regex": { "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, "node_modules/log-update/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5614,8 +4948,6 @@ }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { @@ -5632,15 +4964,11 @@ }, "node_modules/loupe": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", "dev": true, "license": "MIT" }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", "dependencies": { @@ -5649,15 +4977,11 @@ }, "node_modules/lunr": { "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "dev": true, "license": "MIT" }, "node_modules/magic-string": { "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" @@ -5665,8 +4989,6 @@ }, "node_modules/markdown-it": { "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "license": "MIT", "dependencies": { @@ -5683,8 +5005,6 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5692,15 +5012,11 @@ }, "node_modules/mdurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true, "license": "MIT" }, "node_modules/media-typer": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5708,8 +5024,6 @@ }, "node_modules/merge-anything": { "version": "5.1.7", - "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-5.1.7.tgz", - "integrity": "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5724,8 +5038,6 @@ }, "node_modules/merge-descriptors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", "engines": { "node": ">=18" @@ -5736,15 +5048,11 @@ }, "node_modules/meshoptimizer": { "version": "0.22.0", - "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.22.0.tgz", - "integrity": "sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==", "dev": true, "license": "MIT" }, "node_modules/micromatch": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -5757,8 +5065,6 @@ }, "node_modules/mime-db": { "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5766,8 +5072,6 @@ }, "node_modules/mime-types": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { "mime-db": "^1.54.0" @@ -5782,8 +5086,6 @@ }, "node_modules/mimic-function": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, "license": "MIT", "engines": { @@ -5795,8 +5097,6 @@ }, "node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -5808,14 +5108,10 @@ }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -5832,8 +5128,6 @@ }, "node_modules/negotiator": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5841,8 +5135,6 @@ }, "node_modules/node-html-parser": { "version": "6.1.13", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", - "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", "dev": true, "license": "MIT", "dependencies": { @@ -5852,15 +5144,11 @@ }, "node_modules/node-releases": { "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true, "license": "MIT" }, "node_modules/nodemon": { "version": "3.1.11", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.11.tgz", - "integrity": "sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==", "dev": true, "license": "MIT", "dependencies": { @@ -5888,8 +5176,6 @@ }, "node_modules/nodemon/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", "engines": { @@ -5898,8 +5184,6 @@ }, "node_modules/nodemon/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", "dependencies": { @@ -5911,8 +5195,6 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "license": "MIT", "engines": { @@ -5921,8 +5203,6 @@ }, "node_modules/nth-check": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" @@ -5933,8 +5213,6 @@ }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5942,8 +5220,6 @@ }, "node_modules/object-inspect": { "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5954,8 +5230,6 @@ }, "node_modules/on-finished": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", "dependencies": { "ee-first": "1.1.1" @@ -5966,8 +5240,6 @@ }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -5975,8 +5247,6 @@ }, "node_modules/onetime": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5991,8 +5261,6 @@ }, "node_modules/parse5": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "license": "MIT", "dependencies": { "entities": "^6.0.0" @@ -6003,8 +5271,6 @@ }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", "license": "MIT", "dependencies": { "domhandler": "^5.0.3", @@ -6016,8 +5282,6 @@ }, "node_modules/parse5-parser-stream": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", - "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", "license": "MIT", "dependencies": { "parse5": "^7.0.0" @@ -6028,8 +5292,6 @@ }, "node_modules/parse5/node_modules/entities": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -6040,8 +5302,6 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -6049,8 +5309,6 @@ }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", "engines": { "node": ">=8" @@ -6058,8 +5316,6 @@ }, "node_modules/path-to-regexp": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", "funding": { "type": "opencollective", @@ -6068,15 +5324,11 @@ }, "node_modules/pathe": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, "node_modules/pathval": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", "dev": true, "license": "MIT", "engines": { @@ -6085,14 +5337,10 @@ }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { @@ -6104,8 +5352,6 @@ }, "node_modules/pkce-challenge": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", - "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", "license": "MIT", "engines": { "node": ">=16.20.0" @@ -6113,8 +5359,6 @@ }, "node_modules/playwright": { "version": "1.57.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz", - "integrity": "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -6132,8 +5376,6 @@ }, "node_modules/playwright-core": { "version": "1.57.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz", - "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -6160,8 +5402,6 @@ }, "node_modules/postcss": { "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "funding": [ { "type": "opencollective", @@ -6187,10 +5427,9 @@ } }, "node_modules/preact": { - "version": "10.28.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.2.tgz", - "integrity": "sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA==", + "version": "10.28.0", "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -6198,8 +5437,6 @@ }, "node_modules/prettier": { "version": "3.7.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", - "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", "dev": true, "license": "MIT", "bin": { @@ -6214,8 +5451,6 @@ }, "node_modules/proxy-addr": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -6227,15 +5462,11 @@ }, "node_modules/pstree.remy": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true, "license": "MIT" }, "node_modules/punycode.js": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "dev": true, "license": "MIT", "engines": { @@ -6243,9 +5474,7 @@ } }, "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "version": "6.14.0", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -6259,8 +5488,6 @@ }, "node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -6268,8 +5495,6 @@ }, "node_modules/raw-body": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -6282,30 +5507,25 @@ } }, "node_modules/react": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", - "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", + "version": "19.2.1", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", + "version": "19.2.1", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.3" + "react": "^19.2.1" } }, "node_modules/react-refresh": { "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", "dev": true, "license": "MIT", "engines": { @@ -6314,8 +5534,6 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "license": "MIT", "dependencies": { @@ -6327,8 +5545,6 @@ }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", "engines": { @@ -6337,8 +5553,6 @@ }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6346,8 +5560,6 @@ }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, "license": "MIT", "funding": { @@ -6356,8 +5568,6 @@ }, "node_modules/restore-cursor": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "license": "MIT", "dependencies": { @@ -6373,15 +5583,11 @@ }, "node_modules/rfdc": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true, "license": "MIT" }, "node_modules/rollup": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", - "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "version": "4.53.3", "dev": true, "license": "MIT", "dependencies": { @@ -6395,38 +5601,103 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.55.1", - "@rollup/rollup-android-arm64": "4.55.1", - "@rollup/rollup-darwin-arm64": "4.55.1", - "@rollup/rollup-darwin-x64": "4.55.1", - "@rollup/rollup-freebsd-arm64": "4.55.1", - "@rollup/rollup-freebsd-x64": "4.55.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", - "@rollup/rollup-linux-arm-musleabihf": "4.55.1", - "@rollup/rollup-linux-arm64-gnu": "4.55.1", - "@rollup/rollup-linux-arm64-musl": "4.55.1", - "@rollup/rollup-linux-loong64-gnu": "4.55.1", - "@rollup/rollup-linux-loong64-musl": "4.55.1", - "@rollup/rollup-linux-ppc64-gnu": "4.55.1", - "@rollup/rollup-linux-ppc64-musl": "4.55.1", - "@rollup/rollup-linux-riscv64-gnu": "4.55.1", - "@rollup/rollup-linux-riscv64-musl": "4.55.1", - "@rollup/rollup-linux-s390x-gnu": "4.55.1", - "@rollup/rollup-linux-x64-gnu": "4.55.1", - "@rollup/rollup-linux-x64-musl": "4.55.1", - "@rollup/rollup-openbsd-x64": "4.55.1", - "@rollup/rollup-openharmony-arm64": "4.55.1", - "@rollup/rollup-win32-arm64-msvc": "4.55.1", - "@rollup/rollup-win32-ia32-msvc": "4.55.1", - "@rollup/rollup-win32-x64-gnu": "4.55.1", - "@rollup/rollup-win32-x64-msvc": "4.55.1", + "@rollup/rollup-android-arm-eabi": "4.53.3", + "@rollup/rollup-android-arm64": "4.53.3", + "@rollup/rollup-darwin-arm64": "4.53.3", + "@rollup/rollup-darwin-x64": "4.53.3", + "@rollup/rollup-freebsd-arm64": "4.53.3", + "@rollup/rollup-freebsd-x64": "4.53.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", + "@rollup/rollup-linux-arm-musleabihf": "4.53.3", + "@rollup/rollup-linux-arm64-gnu": "4.53.3", + "@rollup/rollup-linux-arm64-musl": "4.53.3", + "@rollup/rollup-linux-loong64-gnu": "4.53.3", + "@rollup/rollup-linux-ppc64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-musl": "4.53.3", + "@rollup/rollup-linux-s390x-gnu": "4.53.3", + "@rollup/rollup-linux-x64-gnu": "4.53.3", + "@rollup/rollup-linux-x64-musl": "4.53.3", + "@rollup/rollup-openharmony-arm64": "4.53.3", + "@rollup/rollup-win32-arm64-msvc": "4.53.3", + "@rollup/rollup-win32-ia32-msvc": "4.53.3", + "@rollup/rollup-win32-x64-gnu": "4.53.3", + "@rollup/rollup-win32-x64-msvc": "4.53.3", "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", + "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", + "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", + "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", + "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", + "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/router": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -6441,8 +5712,6 @@ }, "node_modules/rxjs": { "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -6451,20 +5720,14 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, "node_modules/scheduler": { "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "license": "MIT" }, "node_modules/semver": { "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -6475,44 +5738,35 @@ } }, "node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "version": "1.2.0", "license": "MIT", "dependencies": { - "debug": "^4.4.3", + "debug": "^4.3.5", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", - "statuses": "^2.0.2" + "statuses": "^2.0.1" }, "engines": { "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" } }, "node_modules/seroval": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.3.2.tgz", - "integrity": "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=10" } }, "node_modules/seroval-plugins": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.3.3.tgz", - "integrity": "sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==", "license": "MIT", "engines": { "node": ">=10" @@ -6522,9 +5776,7 @@ } }, "node_modules/serve-static": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "version": "2.2.0", "license": "MIT", "dependencies": { "encodeurl": "^2.0.0", @@ -6534,22 +5786,14 @@ }, "engines": { "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" } }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -6560,8 +5804,6 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", "engines": { "node": ">=8" @@ -6569,8 +5811,6 @@ }, "node_modules/shell-quote": { "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, "license": "MIT", "engines": { @@ -6582,8 +5822,6 @@ }, "node_modules/side-channel": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -6601,8 +5839,6 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -6617,8 +5853,6 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -6635,8 +5869,6 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -6654,15 +5886,11 @@ }, "node_modules/siginfo": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, "license": "ISC" }, "node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", "engines": { @@ -6674,8 +5902,6 @@ }, "node_modules/simple-code-frame": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/simple-code-frame/-/simple-code-frame-1.3.0.tgz", - "integrity": "sha512-MB4pQmETUBlNs62BBeRjIFGeuy/x6gGKh7+eRUemn1rCFhqo7K+4slPqsyizCbcbYLnaYqaoZ2FWsZ/jN06D8w==", "dev": true, "license": "MIT", "dependencies": { @@ -6684,8 +5910,6 @@ }, "node_modules/simple-update-notifier": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, "license": "MIT", "dependencies": { @@ -6697,15 +5921,11 @@ }, "node_modules/sisteransi": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true, "license": "MIT" }, "node_modules/slash": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "license": "MIT", "engines": { @@ -6717,8 +5937,6 @@ }, "node_modules/slice-ansi": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", - "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "dev": true, "license": "MIT", "dependencies": { @@ -6734,8 +5952,6 @@ }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -6747,9 +5963,8 @@ }, "node_modules/solid-js": { "version": "1.9.10", - "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.10.tgz", - "integrity": "sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "~1.3.0", @@ -6758,8 +5973,6 @@ }, "node_modules/solid-refresh": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/solid-refresh/-/solid-refresh-0.6.3.tgz", - "integrity": "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==", "dev": true, "license": "MIT", "dependencies": { @@ -6773,8 +5986,6 @@ }, "node_modules/source-map": { "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -6783,8 +5994,6 @@ }, "node_modules/source-map-js": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -6792,8 +6001,6 @@ }, "node_modules/stack-trace": { "version": "1.0.0-pre2", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-1.0.0-pre2.tgz", - "integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==", "dev": true, "license": "MIT", "engines": { @@ -6802,15 +6009,11 @@ }, "node_modules/stackback": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, "license": "MIT" }, "node_modules/statuses": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -6818,15 +6021,11 @@ }, "node_modules/std-env": { "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "dev": true, "license": "MIT" }, "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -6840,8 +6039,6 @@ }, "node_modules/string-width/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -6850,8 +6047,6 @@ }, "node_modules/string-width/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { @@ -6860,8 +6055,6 @@ }, "node_modules/string-width/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -6873,8 +6066,6 @@ }, "node_modules/strip-ansi": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -6889,8 +6080,6 @@ }, "node_modules/strip-literal": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", - "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", "dev": true, "license": "MIT", "dependencies": { @@ -6902,15 +6091,11 @@ }, "node_modules/strip-literal/node_modules/js-tokens": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", "dev": true, "license": "MIT" }, "node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -6924,10 +6109,9 @@ } }, "node_modules/svelte": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.46.1.tgz", - "integrity": "sha512-ynjfCHD3nP2el70kN5Pmg37sSi0EjOm9FgHYQdC4giWG/hzO3AatzXXJJgP305uIhGQxSufJLuYWtkY8uK/8RA==", + "version": "5.46.0", "license": "MIT", + "peer": true, "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", @@ -6950,9 +6134,7 @@ } }, "node_modules/systeminformation": { - "version": "5.30.2", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.30.2.tgz", - "integrity": "sha512-Rrt5oFTWluUVuPlbtn3o9ja+nvjdF3Um4DG0KxqfYvpzcx7Q9plZBTjJiJy9mAouua4+OI7IUGBaG9Zyt9NgxA==", + "version": "5.27.11", "license": "MIT", "os": [ "darwin", @@ -6977,8 +6159,6 @@ }, "node_modules/text-camel-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-camel-case/-/text-camel-case-1.2.9.tgz", - "integrity": "sha512-wKYs9SgRxYizJE1mneR7BbLNlGw2IYzJAS8XwkWIry0CTbO1gvvPkFsx5Z1/hr+VqUaBqx9q3yKd30HpZLdMsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6987,8 +6167,6 @@ }, "node_modules/text-capital-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-capital-case/-/text-capital-case-1.2.9.tgz", - "integrity": "sha512-X5zV8U8pxtq2xS2t46lgAWqZdDbgWMKq03MQSNwY2CJdQCsdTNh144E2Q/q9wBxWzSBUXn+jRc9kF+Gs8/pGhA==", "dev": true, "license": "MIT", "dependencies": { @@ -6998,8 +6176,6 @@ }, "node_modules/text-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-case/-/text-case-1.2.9.tgz", - "integrity": "sha512-zZVdA8rMcjx9zhekdUuOPZShc25UTV7W8/ddKbgbPtfCEvIiToPtWiSd2lXLSuiGMovNhJ4+Tw49xll9o9ts+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -7027,8 +6203,6 @@ }, "node_modules/text-constant-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-constant-case/-/text-constant-case-1.2.9.tgz", - "integrity": "sha512-Vosm6nC7Gag+JFakJHwqS9AXRNgl07j5KZ7srU9cYuKRzYwrxzeJ4RpEogRBNHw7CfmOm0j5FGEznblWtu7pIw==", "dev": true, "license": "MIT", "dependencies": { @@ -7038,8 +6212,6 @@ }, "node_modules/text-dot-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-dot-case/-/text-dot-case-1.2.9.tgz", - "integrity": "sha512-N83hsnvGdSO9q9AfNSB9Cy1LFDNN2MCx53LcxtaPoDWPUTk47fv0JlvIY1tgY0wyzCiThF03kVj3jworvAOScA==", "dev": true, "license": "MIT", "dependencies": { @@ -7048,8 +6220,6 @@ }, "node_modules/text-header-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-header-case/-/text-header-case-1.2.9.tgz", - "integrity": "sha512-TqryEKcYisQAfWLbtT3xPnZlMZ/mySO1uS+LUg+B0eNuqgETrSzVpXIUj5E6Zf/EyJHgpZf4VndbAXtOMJuT4w==", "dev": true, "license": "MIT", "dependencies": { @@ -7058,22 +6228,16 @@ }, "node_modules/text-is-lower-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-is-lower-case/-/text-is-lower-case-1.2.9.tgz", - "integrity": "sha512-cEurrWSnYVYqL8FSwl5cK4mdfqF7qNDCcKJgXI3NnfTesiB8umxAhdlQoErrRYI1xEvYr2WN0MI333EehUhQjg==", "dev": true, "license": "MIT" }, "node_modules/text-is-upper-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-is-upper-case/-/text-is-upper-case-1.2.9.tgz", - "integrity": "sha512-HxsWr3VCsXXiLlhD0c+Ey+mS2lOTCiSJbkepjaXNHl2bp33KiscQaiG0qLwQmmpZQm4SJCg2s9FkndxS0RNDLQ==", "dev": true, "license": "MIT" }, "node_modules/text-kebab-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-kebab-case/-/text-kebab-case-1.2.9.tgz", - "integrity": "sha512-nOUyNR5Ej2B9D/wyyXfwUEv26+pQuOb1pEX+ojE37mCIWo8QeOxw5y6nxuqDmG7NrEPzbO6265UMV+EICH13Cw==", "dev": true, "license": "MIT", "dependencies": { @@ -7082,22 +6246,16 @@ }, "node_modules/text-lower-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-lower-case/-/text-lower-case-1.2.9.tgz", - "integrity": "sha512-53AOnDrhPpiAUQkgY1SHleKUXp/u7GsqRX13NcCREZscmtjLLJ099uxMRjkK7q2KwHkFYVPl9ytkQlTkTQLS0w==", "dev": true, "license": "MIT" }, "node_modules/text-lower-case-first": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-lower-case-first/-/text-lower-case-first-1.2.9.tgz", - "integrity": "sha512-iiphHTV7PVH0MljrEQUA9iBE7jfDpXoi4RQju3WzZU3BRVbS6540cNZgxR19hWa0z6z/7cJTH0Ls9LPBaiUfKg==", "dev": true, "license": "MIT" }, "node_modules/text-no-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-no-case/-/text-no-case-1.2.9.tgz", - "integrity": "sha512-IcCt328KaapimSrytP4ThfC8URmHZb2DgOqCL9BYvGjpxY2lDiqCkIQk9sClZtwcELs2gTnq83a7jNc573FTLA==", "dev": true, "license": "MIT", "dependencies": { @@ -7106,8 +6264,6 @@ }, "node_modules/text-param-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-param-case/-/text-param-case-1.2.9.tgz", - "integrity": "sha512-nR/Ju9amY3aQS1en2CUCgqN/ZiZIVdDyjlJ3xX5J92ChBevGuA4o9K10fh3JGMkbzK97Vcb+bWQJ4Q+Svz+GyQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7116,8 +6272,6 @@ }, "node_modules/text-pascal-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-pascal-case/-/text-pascal-case-1.2.9.tgz", - "integrity": "sha512-o6ZxMGjWDTUW54pcghpXes+C2PqbYRMdU5mHrIhueb6z6nq1NueiIOeCUdrSjN/3wXfhCmnFjK7/d9aRGZNqSg==", "dev": true, "license": "MIT", "dependencies": { @@ -7126,8 +6280,6 @@ }, "node_modules/text-path-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-path-case/-/text-path-case-1.2.9.tgz", - "integrity": "sha512-s8cJ6r5TkJp5ticXMgtxd7f12odEN4d1CfX5u4aoz6jcUtBR2lDqzIhVimkqWFMJ4UKPSrmilUha8Xc2BPi+ow==", "dev": true, "license": "MIT", "dependencies": { @@ -7136,8 +6288,6 @@ }, "node_modules/text-sentence-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-sentence-case/-/text-sentence-case-1.2.9.tgz", - "integrity": "sha512-/G/Yi5kZfUa1edFRV4O3lGZAkbDZTFvlwW8CYfH7szkEGe2k2MYEYbOyAkGRVQEGV6V6JiuUAaP3VS9c1tB6nQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7147,8 +6297,6 @@ }, "node_modules/text-snake-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-snake-case/-/text-snake-case-1.2.9.tgz", - "integrity": "sha512-+ZrqK19ynF/TLQZ7ynqVrL2Dy04uu9syYZwsm8PhzUdsY3XrwPy6QiRqhIEFqhyWbShPcfyfmheer5UEQqFxlw==", "dev": true, "license": "MIT", "dependencies": { @@ -7157,15 +6305,11 @@ }, "node_modules/text-swap-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-swap-case/-/text-swap-case-1.2.9.tgz", - "integrity": "sha512-g5fp12ldktYKK9wdHRMvvtSCQrZYNv/D+ZGLumDsvAY4q9T5bCMO2IWMkIP1F5gVQrysdHH6Xv877P/pjUq1iw==", "dev": true, "license": "MIT" }, "node_modules/text-title-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-title-case/-/text-title-case-1.2.9.tgz", - "integrity": "sha512-RAtC9cdmPp41ns5/HXZBsaQg71BsHT7uZpj2ojTtuFa8o2dNuRYYOrSmy5YdLRIAJQ6WK5hQVpV3jHuq7a+4Tw==", "dev": true, "license": "MIT", "dependencies": { @@ -7175,49 +6319,35 @@ }, "node_modules/text-upper-case": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-upper-case/-/text-upper-case-1.2.9.tgz", - "integrity": "sha512-K/0DNT7a4z8eah2spARtoJllTZyrNTo6Uc0ujhN/96Ir9uJ/slpahfs13y46H9osL3daaLl3O7iXOkW4xtX6bg==", "dev": true, "license": "MIT" }, "node_modules/text-upper-case-first": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/text-upper-case-first/-/text-upper-case-first-1.2.9.tgz", - "integrity": "sha512-wEDD1B6XqJmEV+xEnBJd+2sBCHZ+7fvA/8Rv/o8+dAsp05YWjYP/kjB8sPH6zqzW0s6jtehIg4IlcKjcYxk2CQ==", "dev": true, "license": "MIT" }, "node_modules/three": { "version": "0.181.2", - "resolved": "https://registry.npmjs.org/three/-/three-0.181.2.tgz", - "integrity": "sha512-k/CjiZ80bYss6Qs7/ex1TBlPD11whT9oKfT8oTGiHa34W4JRd1NiH/Tr1DbHWQ2/vMUypxksLnF2CfmlmM5XFQ==", "license": "MIT" }, "node_modules/tinybench": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, "license": "MIT" }, "node_modules/tinycolor2": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", "dev": true, "license": "MIT" }, "node_modules/tinyexec": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "dev": true, "license": "MIT" }, "node_modules/tinyglobby": { "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7233,8 +6363,6 @@ }, "node_modules/tinyglobby/node_modules/fdir": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { @@ -7251,10 +6379,9 @@ }, "node_modules/tinyglobby/node_modules/picomatch": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -7264,8 +6391,6 @@ }, "node_modules/tinypool": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", "dev": true, "license": "MIT", "engines": { @@ -7274,8 +6399,6 @@ }, "node_modules/tinyrainbow": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, "license": "MIT", "engines": { @@ -7284,8 +6407,6 @@ }, "node_modules/tinyspy": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", - "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", "dev": true, "license": "MIT", "engines": { @@ -7294,8 +6415,6 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7307,8 +6426,6 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", "engines": { "node": ">=0.6" @@ -7316,8 +6433,6 @@ }, "node_modules/touch": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", "dev": true, "license": "ISC", "bin": { @@ -7326,8 +6441,6 @@ }, "node_modules/tree-kill": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, "license": "MIT", "bin": { @@ -7336,8 +6449,6 @@ }, "node_modules/ts-to-zod": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ts-to-zod/-/ts-to-zod-5.1.0.tgz", - "integrity": "sha512-giqqlvRHunlJqG9tBL/KAO3wWIVZGF//mZiWLKm/fdQnKnz4EN2mtiK5cugN9slytBkdMEXQIaLvMzIScbhhFw==", "dev": true, "license": "MIT", "dependencies": { @@ -7359,8 +6470,6 @@ }, "node_modules/ts-to-zod/node_modules/chokidar": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "license": "MIT", "dependencies": { @@ -7375,8 +6484,6 @@ }, "node_modules/ts-to-zod/node_modules/readdirp": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { @@ -7389,15 +6496,11 @@ }, "node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, "license": "0BSD" }, "node_modules/tsutils": { "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "license": "MIT", "dependencies": { @@ -7412,15 +6515,11 @@ }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, "license": "0BSD" }, "node_modules/tsx": { "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "dev": true, "license": "MIT", "dependencies": { @@ -7438,9 +6537,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.1.tgz", + "integrity": "sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==", "cpu": [ "ppc64" ], @@ -7455,9 +6554,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.1.tgz", + "integrity": "sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==", "cpu": [ "arm" ], @@ -7472,9 +6571,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.1.tgz", + "integrity": "sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==", "cpu": [ "arm64" ], @@ -7489,9 +6588,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.1.tgz", + "integrity": "sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==", "cpu": [ "x64" ], @@ -7506,9 +6605,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.1.tgz", + "integrity": "sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==", "cpu": [ "arm64" ], @@ -7523,9 +6622,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.1.tgz", + "integrity": "sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==", "cpu": [ "x64" ], @@ -7540,9 +6639,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.1.tgz", + "integrity": "sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==", "cpu": [ "arm64" ], @@ -7557,9 +6656,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.1.tgz", + "integrity": "sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==", "cpu": [ "x64" ], @@ -7574,9 +6673,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.1.tgz", + "integrity": "sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==", "cpu": [ "arm" ], @@ -7591,9 +6690,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.1.tgz", + "integrity": "sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==", "cpu": [ "arm64" ], @@ -7608,9 +6707,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.1.tgz", + "integrity": "sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==", "cpu": [ "ia32" ], @@ -7625,9 +6724,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.1.tgz", + "integrity": "sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==", "cpu": [ "loong64" ], @@ -7642,9 +6741,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.1.tgz", + "integrity": "sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==", "cpu": [ "mips64el" ], @@ -7659,9 +6758,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.1.tgz", + "integrity": "sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==", "cpu": [ "ppc64" ], @@ -7676,9 +6775,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.1.tgz", + "integrity": "sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==", "cpu": [ "riscv64" ], @@ -7693,9 +6792,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.1.tgz", + "integrity": "sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==", "cpu": [ "s390x" ], @@ -7710,9 +6809,7 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "version": "0.27.1", "cpu": [ "x64" ], @@ -7727,9 +6824,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.1.tgz", + "integrity": "sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==", "cpu": [ "arm64" ], @@ -7744,9 +6841,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.1.tgz", + "integrity": "sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==", "cpu": [ "x64" ], @@ -7761,9 +6858,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.1.tgz", + "integrity": "sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==", "cpu": [ "arm64" ], @@ -7778,9 +6875,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.1.tgz", + "integrity": "sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==", "cpu": [ "x64" ], @@ -7795,9 +6892,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.1.tgz", + "integrity": "sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==", "cpu": [ "arm64" ], @@ -7812,9 +6909,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.1.tgz", + "integrity": "sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==", "cpu": [ "x64" ], @@ -7829,9 +6926,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.1.tgz", + "integrity": "sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==", "cpu": [ "arm64" ], @@ -7846,9 +6943,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.1.tgz", + "integrity": "sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==", "cpu": [ "ia32" ], @@ -7863,9 +6960,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.1.tgz", + "integrity": "sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==", "cpu": [ "x64" ], @@ -7880,9 +6977,7 @@ } }, "node_modules/tsx/node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "version": "0.27.1", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -7893,38 +6988,36 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" + "@esbuild/aix-ppc64": "0.27.1", + "@esbuild/android-arm": "0.27.1", + "@esbuild/android-arm64": "0.27.1", + "@esbuild/android-x64": "0.27.1", + "@esbuild/darwin-arm64": "0.27.1", + "@esbuild/darwin-x64": "0.27.1", + "@esbuild/freebsd-arm64": "0.27.1", + "@esbuild/freebsd-x64": "0.27.1", + "@esbuild/linux-arm": "0.27.1", + "@esbuild/linux-arm64": "0.27.1", + "@esbuild/linux-ia32": "0.27.1", + "@esbuild/linux-loong64": "0.27.1", + "@esbuild/linux-mips64el": "0.27.1", + "@esbuild/linux-ppc64": "0.27.1", + "@esbuild/linux-riscv64": "0.27.1", + "@esbuild/linux-s390x": "0.27.1", + "@esbuild/linux-x64": "0.27.1", + "@esbuild/netbsd-arm64": "0.27.1", + "@esbuild/netbsd-x64": "0.27.1", + "@esbuild/openbsd-arm64": "0.27.1", + "@esbuild/openbsd-x64": "0.27.1", + "@esbuild/openharmony-arm64": "0.27.1", + "@esbuild/sunos-x64": "0.27.1", + "@esbuild/win32-arm64": "0.27.1", + "@esbuild/win32-ia32": "0.27.1", + "@esbuild/win32-x64": "0.27.1" } }, "node_modules/type-fest": { "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -7936,8 +7029,6 @@ }, "node_modules/type-is": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", "dependencies": { "content-type": "^1.0.5", @@ -7950,8 +7041,6 @@ }, "node_modules/typedoc": { "version": "0.28.15", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.15.tgz", - "integrity": "sha512-mw2/2vTL7MlT+BVo43lOsufkkd2CJO4zeOSuWQQsiXoV2VuEn7f6IZp2jsUDPmBMABpgR0R5jlcJ2OGEFYmkyg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -7974,8 +7063,6 @@ }, "node_modules/typedoc/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7984,8 +7071,6 @@ }, "node_modules/typedoc/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -8000,10 +7085,9 @@ }, "node_modules/typescript": { "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8014,22 +7098,16 @@ }, "node_modules/uc.micro": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true, "license": "MIT" }, "node_modules/undefsafe": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true, "license": "MIT" }, "node_modules/undici": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.18.2.tgz", - "integrity": "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==", + "version": "7.16.0", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -8037,24 +7115,18 @@ }, "node_modules/undici-types": { "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, "license": "MIT" }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "version": "1.2.2", "dev": true, "funding": [ { @@ -8084,8 +7156,6 @@ }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -8093,10 +7163,9 @@ }, "node_modules/vite": { "version": "6.4.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", - "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -8168,8 +7237,6 @@ }, "node_modules/vite-node": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", "dev": true, "license": "MIT", "dependencies": { @@ -8191,8 +7258,6 @@ }, "node_modules/vite-plugin-singlefile": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/vite-plugin-singlefile/-/vite-plugin-singlefile-2.3.0.tgz", - "integrity": "sha512-DAcHzYypM0CasNLSz/WG0VdKOCxGHErfrjOoyIPiNxTPTGmO6rRD/te93n1YL/s+miXq66ipF1brMBikf99c6A==", "dev": true, "license": "MIT", "dependencies": { @@ -8208,8 +7273,6 @@ }, "node_modules/vite-plugin-solid": { "version": "2.11.10", - "resolved": "https://registry.npmjs.org/vite-plugin-solid/-/vite-plugin-solid-2.11.10.tgz", - "integrity": "sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==", "dev": true, "license": "MIT", "dependencies": { @@ -8233,8 +7296,6 @@ }, "node_modules/vite-prerender-plugin": { "version": "0.5.12", - "resolved": "https://registry.npmjs.org/vite-prerender-plugin/-/vite-prerender-plugin-0.5.12.tgz", - "integrity": "sha512-EiwhbMn+flg14EysbLTmZSzq8NGTxhytgK3bf4aGRF1evWLGwZiHiUJ1KZDvbxgKbMf2pG6fJWGEa3UZXOnR1g==", "dev": true, "license": "MIT", "dependencies": { @@ -8251,8 +7312,6 @@ }, "node_modules/vite/node_modules/fdir": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { @@ -8269,10 +7328,9 @@ }, "node_modules/vite/node_modules/picomatch": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -8282,8 +7340,6 @@ }, "node_modules/vitefu": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", - "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", "dev": true, "license": "MIT", "workspaces": [ @@ -8302,8 +7358,6 @@ }, "node_modules/vitest": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", "dependencies": { @@ -8375,8 +7429,6 @@ }, "node_modules/vitest/node_modules/picomatch": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -8388,9 +7440,8 @@ }, "node_modules/vue": { "version": "3.5.26", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.26.tgz", - "integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==", "license": "MIT", + "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/compiler-sfc": "3.5.26", @@ -8409,9 +7460,6 @@ }, "node_modules/whatwg-encoding": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" @@ -8422,8 +7470,6 @@ }, "node_modules/whatwg-encoding/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -8434,8 +7480,6 @@ }, "node_modules/whatwg-mimetype": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "license": "MIT", "engines": { "node": ">=18" @@ -8443,8 +7487,6 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -8458,8 +7500,6 @@ }, "node_modules/why-is-node-running": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", "dependencies": { @@ -8475,8 +7515,6 @@ }, "node_modules/widest-line": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", "dev": true, "license": "MIT", "dependencies": { @@ -8488,15 +7526,11 @@ }, "node_modules/wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true, "license": "MIT" }, "node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { @@ -8513,8 +7547,6 @@ }, "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -8523,8 +7555,6 @@ }, "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -8536,14 +7566,10 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "license": "ISC", "engines": { @@ -8552,17 +7578,14 @@ }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, "node_modules/yaml": { "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "dev": true, "license": "ISC", + "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -8575,8 +7598,6 @@ }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "license": "MIT", "dependencies": { @@ -8594,8 +7615,6 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "license": "ISC", "engines": { @@ -8604,23 +7623,18 @@ }, "node_modules/zimmerframe": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", - "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", "license": "MIT" }, "node_modules/zod": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", - "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", + "version": "4.2.1", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zod-to-json-schema": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", - "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "version": "3.25.0", "license": "ISC", "peerDependencies": { "zod": "^3.25 || ^4" diff --git a/src/generated/schema.json b/src/generated/schema.json index 1d87d9c..a3e72eb 100644 --- a/src/generated/schema.json +++ b/src/generated/schema.json @@ -30,6 +30,7 @@ }, "McpUiDisplayMode": { "$schema": "https://json-schema.org/draft/2020-12/schema", + "description": "Display mode for UI presentation.", "anyOf": [ { "type": "string", @@ -43,8 +44,7 @@ "type": "string", "const": "pip" } - ], - "description": "Display mode for UI presentation." + ] }, "McpUiHostCapabilities": { "$schema": "https://json-schema.org/draft/2020-12/schema", @@ -261,6 +261,7 @@ "const": "ui/notifications/host-context-changed" }, "params": { + "description": "Partial context update containing only changed fields.", "type": "object", "properties": { "toolInfo": { @@ -281,6 +282,7 @@ ] }, "tool": { + "description": "Tool definition including name, inputSchema, etc.", "type": "object", "properties": { "name": { @@ -305,10 +307,6 @@ "items": { "type": "string" } - }, - "theme": { - "type": "string", - "enum": ["light", "dark"] } }, "required": ["src"], @@ -406,8 +404,7 @@ } }, "required": ["name", "inputSchema"], - "additionalProperties": false, - "description": "Tool definition including name, inputSchema, etc." + "additionalProperties": false } }, "required": ["tool"], @@ -434,6 +431,7 @@ "description": "CSS variables for theming the app.", "type": "object", "propertyNames": { + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string", @@ -743,96 +741,17 @@ "type": "string", "const": "--shadow-lg" } - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." + ] }, "additionalProperties": { + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string" }, {} - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." - }, - "required": [ - "--color-background-primary", - "--color-background-secondary", - "--color-background-tertiary", - "--color-background-inverse", - "--color-background-ghost", - "--color-background-info", - "--color-background-danger", - "--color-background-success", - "--color-background-warning", - "--color-background-disabled", - "--color-text-primary", - "--color-text-secondary", - "--color-text-tertiary", - "--color-text-inverse", - "--color-text-ghost", - "--color-text-info", - "--color-text-danger", - "--color-text-success", - "--color-text-warning", - "--color-text-disabled", - "--color-border-primary", - "--color-border-secondary", - "--color-border-tertiary", - "--color-border-inverse", - "--color-border-ghost", - "--color-border-info", - "--color-border-danger", - "--color-border-success", - "--color-border-warning", - "--color-border-disabled", - "--color-ring-primary", - "--color-ring-secondary", - "--color-ring-inverse", - "--color-ring-info", - "--color-ring-danger", - "--color-ring-success", - "--color-ring-warning", - "--font-sans", - "--font-mono", - "--font-weight-normal", - "--font-weight-medium", - "--font-weight-semibold", - "--font-weight-bold", - "--font-text-xs-size", - "--font-text-sm-size", - "--font-text-md-size", - "--font-text-lg-size", - "--font-heading-xs-size", - "--font-heading-sm-size", - "--font-heading-md-size", - "--font-heading-lg-size", - "--font-heading-xl-size", - "--font-heading-2xl-size", - "--font-heading-3xl-size", - "--font-text-xs-line-height", - "--font-text-sm-line-height", - "--font-text-md-line-height", - "--font-text-lg-line-height", - "--font-heading-xs-line-height", - "--font-heading-sm-line-height", - "--font-heading-md-line-height", - "--font-heading-lg-line-height", - "--font-heading-xl-line-height", - "--font-heading-2xl-line-height", - "--font-heading-3xl-line-height", - "--border-radius-xs", - "--border-radius-sm", - "--border-radius-md", - "--border-radius-lg", - "--border-radius-xl", - "--border-radius-full", - "--border-width-regular", - "--shadow-hairline", - "--shadow-sm", - "--shadow-md", - "--shadow-lg" - ] + ] + } }, "css": { "description": "CSS blocks that apps can inject.", @@ -881,8 +800,8 @@ "type": "object", "properties": { "height": { - "type": "number", - "description": "Fixed container height in pixels." + "description": "Fixed container height in pixels.", + "type": "number" } }, "required": ["height"], @@ -911,8 +830,8 @@ "type": "object", "properties": { "width": { - "type": "number", - "description": "Fixed container width in pixels." + "description": "Fixed container width in pixels.", + "type": "number" } }, "required": ["width"], @@ -986,28 +905,27 @@ "type": "object", "properties": { "top": { - "type": "number", - "description": "Top safe area inset in pixels." + "description": "Top safe area inset in pixels.", + "type": "number" }, "right": { - "type": "number", - "description": "Right safe area inset in pixels." + "description": "Right safe area inset in pixels.", + "type": "number" }, "bottom": { - "type": "number", - "description": "Bottom safe area inset in pixels." + "description": "Bottom safe area inset in pixels.", + "type": "number" }, "left": { - "type": "number", - "description": "Left safe area inset in pixels." + "description": "Left safe area inset in pixels.", + "type": "number" } }, "required": ["top", "right", "bottom", "left"], "additionalProperties": false } }, - "additionalProperties": {}, - "description": "Partial context update containing only changed fields." + "additionalProperties": {} } }, "required": ["method", "params"], @@ -1035,6 +953,7 @@ ] }, "tool": { + "description": "Tool definition including name, inputSchema, etc.", "type": "object", "properties": { "name": { @@ -1059,10 +978,6 @@ "items": { "type": "string" } - }, - "theme": { - "type": "string", - "enum": ["light", "dark"] } }, "required": ["src"], @@ -1160,8 +1075,7 @@ } }, "required": ["name", "inputSchema"], - "additionalProperties": false, - "description": "Tool definition including name, inputSchema, etc." + "additionalProperties": false } }, "required": ["tool"], @@ -1188,6 +1102,7 @@ "description": "CSS variables for theming the app.", "type": "object", "propertyNames": { + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string", @@ -1497,96 +1412,17 @@ "type": "string", "const": "--shadow-lg" } - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." + ] }, "additionalProperties": { + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string" }, {} - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." - }, - "required": [ - "--color-background-primary", - "--color-background-secondary", - "--color-background-tertiary", - "--color-background-inverse", - "--color-background-ghost", - "--color-background-info", - "--color-background-danger", - "--color-background-success", - "--color-background-warning", - "--color-background-disabled", - "--color-text-primary", - "--color-text-secondary", - "--color-text-tertiary", - "--color-text-inverse", - "--color-text-ghost", - "--color-text-info", - "--color-text-danger", - "--color-text-success", - "--color-text-warning", - "--color-text-disabled", - "--color-border-primary", - "--color-border-secondary", - "--color-border-tertiary", - "--color-border-inverse", - "--color-border-ghost", - "--color-border-info", - "--color-border-danger", - "--color-border-success", - "--color-border-warning", - "--color-border-disabled", - "--color-ring-primary", - "--color-ring-secondary", - "--color-ring-inverse", - "--color-ring-info", - "--color-ring-danger", - "--color-ring-success", - "--color-ring-warning", - "--font-sans", - "--font-mono", - "--font-weight-normal", - "--font-weight-medium", - "--font-weight-semibold", - "--font-weight-bold", - "--font-text-xs-size", - "--font-text-sm-size", - "--font-text-md-size", - "--font-text-lg-size", - "--font-heading-xs-size", - "--font-heading-sm-size", - "--font-heading-md-size", - "--font-heading-lg-size", - "--font-heading-xl-size", - "--font-heading-2xl-size", - "--font-heading-3xl-size", - "--font-text-xs-line-height", - "--font-text-sm-line-height", - "--font-text-md-line-height", - "--font-text-lg-line-height", - "--font-heading-xs-line-height", - "--font-heading-sm-line-height", - "--font-heading-md-line-height", - "--font-heading-lg-line-height", - "--font-heading-xl-line-height", - "--font-heading-2xl-line-height", - "--font-heading-3xl-line-height", - "--border-radius-xs", - "--border-radius-sm", - "--border-radius-md", - "--border-radius-lg", - "--border-radius-xl", - "--border-radius-full", - "--border-width-regular", - "--shadow-hairline", - "--shadow-sm", - "--shadow-md", - "--shadow-lg" - ] + ] + } }, "css": { "description": "CSS blocks that apps can inject.", @@ -1635,8 +1471,8 @@ "type": "object", "properties": { "height": { - "type": "number", - "description": "Fixed container height in pixels." + "description": "Fixed container height in pixels.", + "type": "number" } }, "required": ["height"], @@ -1665,8 +1501,8 @@ "type": "object", "properties": { "width": { - "type": "number", - "description": "Fixed container width in pixels." + "description": "Fixed container width in pixels.", + "type": "number" } }, "required": ["width"], @@ -1740,20 +1576,20 @@ "type": "object", "properties": { "top": { - "type": "number", - "description": "Top safe area inset in pixels." + "description": "Top safe area inset in pixels.", + "type": "number" }, "right": { - "type": "number", - "description": "Right safe area inset in pixels." + "description": "Right safe area inset in pixels.", + "type": "number" }, "bottom": { - "type": "number", - "description": "Bottom safe area inset in pixels." + "description": "Bottom safe area inset in pixels.", + "type": "number" }, "left": { - "type": "number", - "description": "Left safe area inset in pixels." + "description": "Left safe area inset in pixels.", + "type": "number" } }, "required": ["top", "right", "bottom", "left"], @@ -1781,6 +1617,7 @@ "description": "CSS variables for theming the app.", "type": "object", "propertyNames": { + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string", @@ -2090,96 +1927,17 @@ "type": "string", "const": "--shadow-lg" } - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." + ] }, "additionalProperties": { + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string" }, {} - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." - }, - "required": [ - "--color-background-primary", - "--color-background-secondary", - "--color-background-tertiary", - "--color-background-inverse", - "--color-background-ghost", - "--color-background-info", - "--color-background-danger", - "--color-background-success", - "--color-background-warning", - "--color-background-disabled", - "--color-text-primary", - "--color-text-secondary", - "--color-text-tertiary", - "--color-text-inverse", - "--color-text-ghost", - "--color-text-info", - "--color-text-danger", - "--color-text-success", - "--color-text-warning", - "--color-text-disabled", - "--color-border-primary", - "--color-border-secondary", - "--color-border-tertiary", - "--color-border-inverse", - "--color-border-ghost", - "--color-border-info", - "--color-border-danger", - "--color-border-success", - "--color-border-warning", - "--color-border-disabled", - "--color-ring-primary", - "--color-ring-secondary", - "--color-ring-inverse", - "--color-ring-info", - "--color-ring-danger", - "--color-ring-success", - "--color-ring-warning", - "--font-sans", - "--font-mono", - "--font-weight-normal", - "--font-weight-medium", - "--font-weight-semibold", - "--font-weight-bold", - "--font-text-xs-size", - "--font-text-sm-size", - "--font-text-md-size", - "--font-text-lg-size", - "--font-heading-xs-size", - "--font-heading-sm-size", - "--font-heading-md-size", - "--font-heading-lg-size", - "--font-heading-xl-size", - "--font-heading-2xl-size", - "--font-heading-3xl-size", - "--font-text-xs-line-height", - "--font-text-sm-line-height", - "--font-text-md-line-height", - "--font-text-lg-line-height", - "--font-heading-xs-line-height", - "--font-heading-sm-line-height", - "--font-heading-md-line-height", - "--font-heading-lg-line-height", - "--font-heading-xl-line-height", - "--font-heading-2xl-line-height", - "--font-heading-3xl-line-height", - "--border-radius-xs", - "--border-radius-sm", - "--border-radius-md", - "--border-radius-lg", - "--border-radius-xl", - "--border-radius-full", - "--border-width-regular", - "--shadow-hairline", - "--shadow-sm", - "--shadow-md", - "--shadow-lg" - ] + ] + } }, "css": { "description": "CSS blocks that apps can inject.", @@ -2207,6 +1965,7 @@ "type": "object", "properties": { "appInfo": { + "description": "App identification (name and version).", "type": "object", "properties": { "name": { @@ -2231,10 +1990,6 @@ "items": { "type": "string" } - }, - "theme": { - "type": "string", - "enum": ["light", "dark"] } }, "required": ["src"], @@ -2246,16 +2001,13 @@ }, "websiteUrl": { "type": "string" - }, - "description": { - "type": "string" } }, "required": ["name", "version"], - "additionalProperties": false, - "description": "App identification (name and version)." + "additionalProperties": false }, "appCapabilities": { + "description": "Features and capabilities this app provides.", "type": "object", "properties": { "experimental": { @@ -2276,12 +2028,11 @@ "additionalProperties": false } }, - "additionalProperties": false, - "description": "Features and capabilities this app provides." + "additionalProperties": false }, "protocolVersion": { - "type": "string", - "description": "Protocol version this app supports." + "description": "Protocol version this app supports.", + "type": "string" } }, "required": ["appInfo", "appCapabilities", "protocolVersion"], @@ -2296,10 +2047,11 @@ "type": "object", "properties": { "protocolVersion": { - "type": "string", - "description": "Negotiated protocol version string (e.g., \"2025-11-21\")." + "description": "Negotiated protocol version string (e.g., \"2025-11-21\").", + "type": "string" }, "hostInfo": { + "description": "Host application identification and version.", "type": "object", "properties": { "name": { @@ -2324,10 +2076,6 @@ "items": { "type": "string" } - }, - "theme": { - "type": "string", - "enum": ["light", "dark"] } }, "required": ["src"], @@ -2339,16 +2087,13 @@ }, "websiteUrl": { "type": "string" - }, - "description": { - "type": "string" } }, "required": ["name", "version"], - "additionalProperties": false, - "description": "Host application identification and version." + "additionalProperties": false }, "hostCapabilities": { + "description": "Features and capabilities provided by the host.", "type": "object", "properties": { "experimental": { @@ -2551,10 +2296,10 @@ "additionalProperties": false } }, - "additionalProperties": false, - "description": "Features and capabilities provided by the host." + "additionalProperties": false }, "hostContext": { + "description": "Rich context about the host environment.", "type": "object", "properties": { "toolInfo": { @@ -2575,6 +2320,7 @@ ] }, "tool": { + "description": "Tool definition including name, inputSchema, etc.", "type": "object", "properties": { "name": { @@ -2599,10 +2345,6 @@ "items": { "type": "string" } - }, - "theme": { - "type": "string", - "enum": ["light", "dark"] } }, "required": ["src"], @@ -2700,8 +2442,7 @@ } }, "required": ["name", "inputSchema"], - "additionalProperties": false, - "description": "Tool definition including name, inputSchema, etc." + "additionalProperties": false } }, "required": ["tool"], @@ -2728,6 +2469,7 @@ "description": "CSS variables for theming the app.", "type": "object", "propertyNames": { + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string", @@ -3037,96 +2779,17 @@ "type": "string", "const": "--shadow-lg" } - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." + ] }, "additionalProperties": { + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string" }, {} - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." - }, - "required": [ - "--color-background-primary", - "--color-background-secondary", - "--color-background-tertiary", - "--color-background-inverse", - "--color-background-ghost", - "--color-background-info", - "--color-background-danger", - "--color-background-success", - "--color-background-warning", - "--color-background-disabled", - "--color-text-primary", - "--color-text-secondary", - "--color-text-tertiary", - "--color-text-inverse", - "--color-text-ghost", - "--color-text-info", - "--color-text-danger", - "--color-text-success", - "--color-text-warning", - "--color-text-disabled", - "--color-border-primary", - "--color-border-secondary", - "--color-border-tertiary", - "--color-border-inverse", - "--color-border-ghost", - "--color-border-info", - "--color-border-danger", - "--color-border-success", - "--color-border-warning", - "--color-border-disabled", - "--color-ring-primary", - "--color-ring-secondary", - "--color-ring-inverse", - "--color-ring-info", - "--color-ring-danger", - "--color-ring-success", - "--color-ring-warning", - "--font-sans", - "--font-mono", - "--font-weight-normal", - "--font-weight-medium", - "--font-weight-semibold", - "--font-weight-bold", - "--font-text-xs-size", - "--font-text-sm-size", - "--font-text-md-size", - "--font-text-lg-size", - "--font-heading-xs-size", - "--font-heading-sm-size", - "--font-heading-md-size", - "--font-heading-lg-size", - "--font-heading-xl-size", - "--font-heading-2xl-size", - "--font-heading-3xl-size", - "--font-text-xs-line-height", - "--font-text-sm-line-height", - "--font-text-md-line-height", - "--font-text-lg-line-height", - "--font-heading-xs-line-height", - "--font-heading-sm-line-height", - "--font-heading-md-line-height", - "--font-heading-lg-line-height", - "--font-heading-xl-line-height", - "--font-heading-2xl-line-height", - "--font-heading-3xl-line-height", - "--border-radius-xs", - "--border-radius-sm", - "--border-radius-md", - "--border-radius-lg", - "--border-radius-xl", - "--border-radius-full", - "--border-width-regular", - "--shadow-hairline", - "--shadow-sm", - "--shadow-md", - "--shadow-lg" - ] + ] + } }, "css": { "description": "CSS blocks that apps can inject.", @@ -3175,8 +2838,8 @@ "type": "object", "properties": { "height": { - "type": "number", - "description": "Fixed container height in pixels." + "description": "Fixed container height in pixels.", + "type": "number" } }, "required": ["height"], @@ -3205,8 +2868,8 @@ "type": "object", "properties": { "width": { - "type": "number", - "description": "Fixed container width in pixels." + "description": "Fixed container width in pixels.", + "type": "number" } }, "required": ["width"], @@ -3280,28 +2943,27 @@ "type": "object", "properties": { "top": { - "type": "number", - "description": "Top safe area inset in pixels." + "description": "Top safe area inset in pixels.", + "type": "number" }, "right": { - "type": "number", - "description": "Right safe area inset in pixels." + "description": "Right safe area inset in pixels.", + "type": "number" }, "bottom": { - "type": "number", - "description": "Bottom safe area inset in pixels." + "description": "Bottom safe area inset in pixels.", + "type": "number" }, "left": { - "type": "number", - "description": "Left safe area inset in pixels." + "description": "Left safe area inset in pixels.", + "type": "number" } }, "required": ["top", "right", "bottom", "left"], "additionalProperties": false } }, - "additionalProperties": {}, - "description": "Rich context about the host environment." + "additionalProperties": {} } }, "required": [ @@ -3341,11 +3003,12 @@ "type": "object", "properties": { "role": { + "description": "Message role, currently only \"user\" is supported.", "type": "string", - "const": "user", - "description": "Message role, currently only \"user\" is supported." + "const": "user" }, "content": { + "description": "Message content blocks (text, image, etc.).", "type": "array", "items": { "anyOf": [ @@ -3512,10 +3175,6 @@ "items": { "type": "string" } - }, - "theme": { - "type": "string", - "enum": ["light", "dark"] } }, "required": ["src"], @@ -3659,8 +3318,7 @@ "additionalProperties": false } ] - }, - "description": "Message content blocks (text, image, etc.)." + } } }, "required": ["role", "content"], @@ -3693,8 +3351,8 @@ "type": "object", "properties": { "url": { - "type": "string", - "description": "URL to open in the host's browser" + "description": "URL to open in the host's browser", + "type": "string" } }, "required": ["url"], @@ -3727,6 +3385,7 @@ "type": "object", "properties": { "mode": { + "description": "The display mode being requested.", "anyOf": [ { "type": "string", @@ -3740,8 +3399,7 @@ "type": "string", "const": "pip" } - ], - "description": "The display mode being requested." + ] } }, "required": ["mode"], @@ -3756,6 +3414,7 @@ "type": "object", "properties": { "mode": { + "description": "The display mode that was actually set. May differ from requested if not supported.", "anyOf": [ { "type": "string", @@ -3769,8 +3428,7 @@ "type": "string", "const": "pip" } - ], - "description": "The display mode that was actually set. May differ from requested if not supported." + ] } }, "required": ["mode"], @@ -3977,8 +3635,8 @@ "type": "object", "properties": { "html": { - "type": "string", - "description": "HTML content to load into the inner iframe." + "description": "HTML content to load into the inner iframe.", + "type": "string" }, "sandbox": { "description": "Optional override for the inner iframe's sandbox attribute.", @@ -4086,6 +3744,7 @@ }, "McpUiStyleVariableKey": { "$schema": "https://json-schema.org/draft/2020-12/schema", + "description": "CSS variable keys available to MCP apps for theming.", "anyOf": [ { "type": "string", @@ -4395,13 +4054,14 @@ "type": "string", "const": "--shadow-lg" } - ], - "description": "CSS variable keys available to MCP apps for theming." + ] }, "McpUiStyles": { "$schema": "https://json-schema.org/draft/2020-12/schema", + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "type": "object", "propertyNames": { + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string", @@ -4711,97 +4371,17 @@ "type": "string", "const": "--shadow-lg" } - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." + ] }, "additionalProperties": { + "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.", "anyOf": [ { "type": "string" }, {} - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." - }, - "required": [ - "--color-background-primary", - "--color-background-secondary", - "--color-background-tertiary", - "--color-background-inverse", - "--color-background-ghost", - "--color-background-info", - "--color-background-danger", - "--color-background-success", - "--color-background-warning", - "--color-background-disabled", - "--color-text-primary", - "--color-text-secondary", - "--color-text-tertiary", - "--color-text-inverse", - "--color-text-ghost", - "--color-text-info", - "--color-text-danger", - "--color-text-success", - "--color-text-warning", - "--color-text-disabled", - "--color-border-primary", - "--color-border-secondary", - "--color-border-tertiary", - "--color-border-inverse", - "--color-border-ghost", - "--color-border-info", - "--color-border-danger", - "--color-border-success", - "--color-border-warning", - "--color-border-disabled", - "--color-ring-primary", - "--color-ring-secondary", - "--color-ring-inverse", - "--color-ring-info", - "--color-ring-danger", - "--color-ring-success", - "--color-ring-warning", - "--font-sans", - "--font-mono", - "--font-weight-normal", - "--font-weight-medium", - "--font-weight-semibold", - "--font-weight-bold", - "--font-text-xs-size", - "--font-text-sm-size", - "--font-text-md-size", - "--font-text-lg-size", - "--font-heading-xs-size", - "--font-heading-sm-size", - "--font-heading-md-size", - "--font-heading-lg-size", - "--font-heading-xl-size", - "--font-heading-2xl-size", - "--font-heading-3xl-size", - "--font-text-xs-line-height", - "--font-text-sm-line-height", - "--font-text-md-line-height", - "--font-text-lg-line-height", - "--font-heading-xs-line-height", - "--font-heading-sm-line-height", - "--font-heading-md-line-height", - "--font-heading-lg-line-height", - "--font-heading-xl-line-height", - "--font-heading-2xl-line-height", - "--font-heading-3xl-line-height", - "--border-radius-xs", - "--border-radius-sm", - "--border-radius-md", - "--border-radius-lg", - "--border-radius-xl", - "--border-radius-full", - "--border-width-regular", - "--shadow-hairline", - "--shadow-sm", - "--shadow-md", - "--shadow-lg" - ], - "description": "Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses `Record` rather than `Partial>`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation." + ] + } }, "McpUiSupportedContentBlockModalities": { "$schema": "https://json-schema.org/draft/2020-12/schema", @@ -4848,6 +4428,7 @@ }, "McpUiTheme": { "$schema": "https://json-schema.org/draft/2020-12/schema", + "description": "Color theme preference for the host environment.", "anyOf": [ { "type": "string", @@ -4857,8 +4438,7 @@ "type": "string", "const": "dark" } - ], - "description": "Color theme preference for the host environment." + ] }, "McpUiToolCancelledNotification": { "$schema": "https://json-schema.org/draft/2020-12/schema", @@ -4949,6 +4529,7 @@ "description": "Who can access this tool. Default: [\"model\", \"app\"]\n- \"model\": Tool visible to and callable by the agent\n- \"app\": Tool callable by the app from this server only", "type": "array", "items": { + "description": "Tool visibility scope - who can access the tool.", "anyOf": [ { "type": "string", @@ -4958,8 +4539,7 @@ "type": "string", "const": "app" } - ], - "description": "Tool visibility scope - who can access the tool." + ] } } }, @@ -4974,23 +4554,12 @@ "const": "ui/notifications/tool-result" }, "params": { + "description": "Standard MCP tool execution result.", "type": "object", "properties": { "_meta": { "type": "object", "properties": { - "progressToken": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer", - "minimum": -9007199254740991, - "maximum": 9007199254740991 - } - ] - }, "io.modelcontextprotocol/related-task": { "type": "object", "properties": { @@ -4999,7 +4568,7 @@ } }, "required": ["taskId"], - "additionalProperties": false + "additionalProperties": {} } }, "additionalProperties": {} @@ -5172,10 +4741,6 @@ "items": { "type": "string" } - }, - "theme": { - "type": "string", - "enum": ["light", "dark"] } }, "required": ["src"], @@ -5333,8 +4898,7 @@ } }, "required": ["content"], - "additionalProperties": {}, - "description": "Standard MCP tool execution result." + "additionalProperties": {} } }, "required": ["method", "params"], @@ -5342,6 +4906,7 @@ }, "McpUiToolVisibility": { "$schema": "https://json-schema.org/draft/2020-12/schema", + "description": "Tool visibility scope - who can access the tool.", "anyOf": [ { "type": "string", @@ -5351,8 +4916,7 @@ "type": "string", "const": "app" } - ], - "description": "Tool visibility scope - who can access the tool." + ] }, "McpUiUpdateModelContextRequest": { "$schema": "https://json-schema.org/draft/2020-12/schema", @@ -5533,10 +5097,6 @@ "items": { "type": "string" } - }, - "theme": { - "type": "string", - "enum": ["light", "dark"] } }, "required": ["src"], diff --git a/tests/e2e/servers.spec.ts b/tests/e2e/servers.spec.ts index 7c7099c..e0391c5 100644 --- a/tests/e2e/servers.spec.ts +++ b/tests/e2e/servers.spec.ts @@ -1,8 +1,11 @@ import { test, expect, type Page, type ConsoleMessage } from "@playwright/test"; // Dynamic element selectors to mask for screenshot comparison +// // Note: CSS modules generate unique class names, so we use attribute selectors // with partial matches (e.g., [class*="heatmapWrapper"]) for those components +// +// Note: map-server uses SLOW_SERVERS timeout instead of masking to wait for tiles const DYNAMIC_MASKS: Record = { integration: ["#server-time"], // Server time display "basic-preact": ["#server-time"], // Server time display @@ -13,7 +16,7 @@ const DYNAMIC_MASKS: Record = { "basic-vue": ["#server-time"], // Server time display "cohort-heatmap": ['[class*="heatmapWrapper"]'], // Heatmap grid (random data) "customer-segmentation": [".chart-container"], // Scatter plot (random data) - // Note: map-server uses SLOW_SERVERS timeout instead of masking to wait for tiles + shadertoy: ["#canvas"], // WebGL shader canvas (animated) "system-monitor": [ ".chart-container", // CPU chart (highly dynamic) "#status-text", // Current timestamp @@ -46,6 +49,7 @@ const SERVERS = [ { key: "customer-segmentation", name: "Customer Segmentation Server" }, { key: "map-server", name: "CesiumJS Map Server" }, { key: "scenario-modeler", name: "SaaS Scenario Modeler" }, + { key: "shadertoy", name: "ShaderToy Server" }, { key: "sheet-music", name: "Sheet Music Server" }, { key: "system-monitor", name: "System Monitor Server" }, { key: "threejs", name: "Three.js Server" }, diff --git a/tests/e2e/servers.spec.ts-snapshots/shadertoy.png b/tests/e2e/servers.spec.ts-snapshots/shadertoy.png new file mode 100644 index 0000000000000000000000000000000000000000..24763b264b29e5dcd8b6e9a89a201a346d4e416b GIT binary patch literal 24301 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 Date: Thu, 8 Jan 2026 07:07:37 -0600 Subject: [PATCH 014/352] Replace deprecated `RESOURCE_URI_META_KEY` with `_meta.ui.resourceUri` Update all example servers to use the new recommended metadata format for associating UI resources with tools. The old `RESOURCE_URI_META_KEY` constant is deprecated in favor of the nested `_meta.ui.resourceUri` structure. Co-Authored-By: Claude Opus 4.5 --- examples/basic-server-react/server.ts | 8 ++++---- examples/basic-server-vanillajs/server.ts | 8 ++++---- examples/budget-allocator-server/server.ts | 3 +-- examples/cohort-heatmap-server/server.ts | 3 +-- examples/customer-segmentation-server/server.ts | 3 +-- examples/integration-server/server.ts | 13 ++++++------- examples/scenario-modeler-server/server.ts | 13 ++++++------- examples/sheet-music-server/server.ts | 3 +-- examples/system-monitor-server/server.ts | 13 ++++++------- examples/threejs-server/server.ts | 13 ++++++------- examples/video-resource-server/server.ts | 17 ++++++++--------- examples/wiki-explorer-server/server.ts | 13 ++++++------- 12 files changed, 50 insertions(+), 60 deletions(-) diff --git a/examples/basic-server-react/server.ts b/examples/basic-server-react/server.ts index d63880c..76d332a 100644 --- a/examples/basic-server-react/server.ts +++ b/examples/basic-server-react/server.ts @@ -1,9 +1,9 @@ +import { registerAppResource, registerAppTool, RESOURCE_MIME_TYPE } from "@modelcontextprotocol/ext-apps/server"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { CallToolResult, ReadResourceResult } from "@modelcontextprotocol/sdk/types.js"; import fs from "node:fs/promises"; import path from "node:path"; -import { registerAppTool, registerAppResource, RESOURCE_MIME_TYPE, RESOURCE_URI_META_KEY } from "@modelcontextprotocol/ext-apps/server"; import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -21,15 +21,15 @@ export function createServer(): McpServer { const resourceUri = "ui://get-time/mcp-app.html"; // Register a tool with UI metadata. When the host calls this tool, it reads - // `_meta[RESOURCE_URI_META_KEY]` to know which resource to fetch and render - // as an interactive UI. + // `_meta.ui.resourceUri` to know which resource to fetch and render as an + // interactive UI. registerAppTool(server, "get-time", { title: "Get Time", description: "Returns the current server time as an ISO 8601 string.", inputSchema: {}, - _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + _meta: { ui: { resourceUri } }, }, async (): Promise => { const time = new Date().toISOString(); diff --git a/examples/basic-server-vanillajs/server.ts b/examples/basic-server-vanillajs/server.ts index 8d50d3e..c95b3ca 100644 --- a/examples/basic-server-vanillajs/server.ts +++ b/examples/basic-server-vanillajs/server.ts @@ -1,10 +1,10 @@ +import { registerAppResource, registerAppTool, RESOURCE_MIME_TYPE } from "@modelcontextprotocol/ext-apps/server"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { CallToolResult, ReadResourceResult } from "@modelcontextprotocol/sdk/types.js"; import fs from "node:fs/promises"; import path from "node:path"; import { z } from "zod"; -import { registerAppTool, registerAppResource, RESOURCE_MIME_TYPE, RESOURCE_URI_META_KEY } from "@modelcontextprotocol/ext-apps/server"; import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -22,8 +22,8 @@ export function createServer(): McpServer { const resourceUri = "ui://get-time/mcp-app.html"; // Register a tool with UI metadata. When the host calls this tool, it reads - // `_meta[RESOURCE_URI_META_KEY]` to know which resource to fetch and render - // as an interactive UI. + // `_meta.ui.resourceUri` to know which resource to fetch and render as an + // interactive UI. registerAppTool(server, "get-time", { @@ -33,7 +33,7 @@ export function createServer(): McpServer { outputSchema: z.object({ time: z.string(), }), - _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + _meta: { ui: { resourceUri } }, }, async (): Promise => { const time = new Date().toISOString(); diff --git a/examples/budget-allocator-server/server.ts b/examples/budget-allocator-server/server.ts index a902eea..abc4a9b 100755 --- a/examples/budget-allocator-server/server.ts +++ b/examples/budget-allocator-server/server.ts @@ -15,7 +15,6 @@ import path from "node:path"; import { z } from "zod"; import { RESOURCE_MIME_TYPE, - RESOURCE_URI_META_KEY, registerAppResource, registerAppTool, } from "@modelcontextprotocol/ext-apps/server"; @@ -273,7 +272,7 @@ export function createServer(): McpServer { "Returns budget configuration with 24 months of historical allocations and industry benchmarks by company stage", inputSchema: {}, outputSchema: BudgetDataResponseSchema, - _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + _meta: { ui: { resourceUri } }, }, async (): Promise => { const response: BudgetDataResponse = { diff --git a/examples/cohort-heatmap-server/server.ts b/examples/cohort-heatmap-server/server.ts index 6a902d6..7c79f91 100644 --- a/examples/cohort-heatmap-server/server.ts +++ b/examples/cohort-heatmap-server/server.ts @@ -6,7 +6,6 @@ import path from "node:path"; import { z } from "zod"; import { RESOURCE_MIME_TYPE, - RESOURCE_URI_META_KEY, registerAppResource, registerAppTool, } from "@modelcontextprotocol/ext-apps/server"; @@ -181,7 +180,7 @@ export function createServer(): McpServer { "Returns cohort retention heatmap data showing customer retention over time by signup month", inputSchema: GetCohortDataInputSchema.shape, outputSchema: CohortDataSchema.shape, - _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + _meta: { ui: { resourceUri } }, }, async ({ metric, periodType, cohortCount, maxPeriods }) => { const data = generateCohortData( diff --git a/examples/customer-segmentation-server/server.ts b/examples/customer-segmentation-server/server.ts index 527855a..28e43e7 100644 --- a/examples/customer-segmentation-server/server.ts +++ b/examples/customer-segmentation-server/server.ts @@ -9,7 +9,6 @@ import path from "node:path"; import { z } from "zod"; import { RESOURCE_MIME_TYPE, - RESOURCE_URI_META_KEY, registerAppResource, registerAppTool, } from "@modelcontextprotocol/ext-apps/server"; @@ -102,7 +101,7 @@ export function createServer(): McpServer { "Returns customer data with segment information for visualization. Optionally filter by segment.", inputSchema: GetCustomerDataInputSchema.shape, outputSchema: GetCustomerDataOutputSchema.shape, - _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + _meta: { ui: { resourceUri } }, }, async ({ segment }): Promise => { const data = getCustomerData(segment); diff --git a/examples/integration-server/server.ts b/examples/integration-server/server.ts index 700f1eb..f017e4d 100644 --- a/examples/integration-server/server.ts +++ b/examples/integration-server/server.ts @@ -1,3 +1,8 @@ +import { + registerAppResource, + registerAppTool, + RESOURCE_MIME_TYPE, +} from "@modelcontextprotocol/ext-apps/server"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { @@ -7,12 +12,6 @@ import type { import fs from "node:fs/promises"; import path from "node:path"; import { z } from "zod"; -import { - registerAppTool, - registerAppResource, - RESOURCE_MIME_TYPE, - RESOURCE_URI_META_KEY, -} from "@modelcontextprotocol/ext-apps/server"; import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -37,7 +36,7 @@ export function createServer(): McpServer { outputSchema: z.object({ time: z.string(), }), - _meta: { [RESOURCE_URI_META_KEY]: RESOURCE_URI }, + _meta: { ui: { resourceUri: RESOURCE_URI } }, }, async (): Promise => { const time = new Date().toISOString(); diff --git a/examples/scenario-modeler-server/server.ts b/examples/scenario-modeler-server/server.ts index 6abb352..86657f4 100644 --- a/examples/scenario-modeler-server/server.ts +++ b/examples/scenario-modeler-server/server.ts @@ -1,3 +1,8 @@ +import { + RESOURCE_MIME_TYPE, + registerAppResource, + registerAppTool, +} from "@modelcontextprotocol/ext-apps/server"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { @@ -7,12 +12,6 @@ import type { import fs from "node:fs/promises"; import path from "node:path"; import { z } from "zod"; -import { - RESOURCE_MIME_TYPE, - RESOURCE_URI_META_KEY, - registerAppResource, - registerAppTool, -} from "@modelcontextprotocol/ext-apps/server"; import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -308,7 +307,7 @@ export function createServer(): McpServer { "Returns SaaS scenario templates and optionally computes custom projections for given inputs", inputSchema: GetScenarioDataInputSchema.shape, outputSchema: GetScenarioDataOutputSchema.shape, - _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + _meta: { ui: { resourceUri } }, }, async (args: { customInputs?: ScenarioInputs; diff --git a/examples/sheet-music-server/server.ts b/examples/sheet-music-server/server.ts index 88337d3..cec1c3d 100644 --- a/examples/sheet-music-server/server.ts +++ b/examples/sheet-music-server/server.ts @@ -9,7 +9,6 @@ import { z } from "zod"; import ABCJS from "abcjs"; import { RESOURCE_MIME_TYPE, - RESOURCE_URI_META_KEY, registerAppResource, registerAppTool, } from "@modelcontextprotocol/ext-apps/server"; @@ -59,7 +58,7 @@ function createServer(): McpServer { "ABC notation string to render as sheet music with audio playback", ), }), - _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + _meta: { ui: { resourceUri } }, }, async ({ abcNotation }): Promise => { // Validate ABC notation using abcjs parser diff --git a/examples/system-monitor-server/server.ts b/examples/system-monitor-server/server.ts index 8ac7f7b..9283e21 100644 --- a/examples/system-monitor-server/server.ts +++ b/examples/system-monitor-server/server.ts @@ -1,3 +1,8 @@ +import { + RESOURCE_MIME_TYPE, + registerAppResource, + registerAppTool, +} from "@modelcontextprotocol/ext-apps/server"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { @@ -9,12 +14,6 @@ import os from "node:os"; import path from "node:path"; import si from "systeminformation"; import { z } from "zod"; -import { - RESOURCE_MIME_TYPE, - RESOURCE_URI_META_KEY, - registerAppResource, - registerAppTool, -} from "@modelcontextprotocol/ext-apps/server"; import { startServer } from "./server-utils.js"; // Schemas - types are derived from these using z.infer @@ -149,7 +148,7 @@ export function createServer(): McpServer { "Returns current system statistics including per-core CPU usage, memory, and system info.", inputSchema: {}, outputSchema: SystemStatsSchema.shape, - _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + _meta: { ui: { resourceUri } }, }, async (): Promise => { const stats = await getStats(); diff --git a/examples/threejs-server/server.ts b/examples/threejs-server/server.ts index 8181bad..d359968 100644 --- a/examples/threejs-server/server.ts +++ b/examples/threejs-server/server.ts @@ -3,18 +3,17 @@ * * Provides tools for rendering interactive 3D scenes using Three.js. */ +import { + RESOURCE_MIME_TYPE, + registerAppResource, + registerAppTool, +} from "@modelcontextprotocol/ext-apps/server"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { ReadResourceResult } from "@modelcontextprotocol/sdk/types.js"; import fs from "node:fs/promises"; import path from "node:path"; import { z } from "zod"; -import { - RESOURCE_MIME_TYPE, - RESOURCE_URI_META_KEY, - registerAppResource, - registerAppTool, -} from "@modelcontextprotocol/ext-apps/server"; import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -170,7 +169,7 @@ export function createServer(): McpServer { code: z.string(), height: z.number(), }), - _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + _meta: { ui: { resourceUri } }, }, async ({ code, height }) => { const data = { code, height }; diff --git a/examples/video-resource-server/server.ts b/examples/video-resource-server/server.ts index 0d3a33c..cd997da 100644 --- a/examples/video-resource-server/server.ts +++ b/examples/video-resource-server/server.ts @@ -4,24 +4,23 @@ * Demonstrates serving binary content (video) via MCP resources. * The server fetches videos from CDN and serves them as base64 blobs. */ +import { + registerAppResource, + registerAppTool, + RESOURCE_MIME_TYPE, +} from "@modelcontextprotocol/ext-apps/server"; import { McpServer, ResourceTemplate, } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { CallToolResult, ReadResourceResult, } from "@modelcontextprotocol/sdk/types.js"; -import { z } from "zod"; import fs from "node:fs/promises"; import path from "node:path"; -import { - registerAppTool, - registerAppResource, - RESOURCE_MIME_TYPE, - RESOURCE_URI_META_KEY, -} from "@modelcontextprotocol/ext-apps/server"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import { z } from "zod"; import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -133,7 +132,7 @@ ${Object.entries(VIDEO_LIBRARY) videoUri: z.string(), description: z.string(), }), - _meta: { [RESOURCE_URI_META_KEY]: RESOURCE_URI }, + _meta: { ui: { resourceUri: RESOURCE_URI } }, }, async ({ videoId }): Promise => { const video = VIDEO_LIBRARY[videoId]; diff --git a/examples/wiki-explorer-server/server.ts b/examples/wiki-explorer-server/server.ts index 69002c1..8c33150 100644 --- a/examples/wiki-explorer-server/server.ts +++ b/examples/wiki-explorer-server/server.ts @@ -1,3 +1,8 @@ +import { + RESOURCE_MIME_TYPE, + registerAppResource, + registerAppTool, +} from "@modelcontextprotocol/ext-apps/server"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import type { @@ -8,12 +13,6 @@ import * as cheerio from "cheerio"; import fs from "node:fs/promises"; import path from "node:path"; import { z } from "zod"; -import { - RESOURCE_MIME_TYPE, - RESOURCE_URI_META_KEY, - registerAppResource, - registerAppTool, -} from "@modelcontextprotocol/ext-apps/server"; import { startServer } from "./server-utils.js"; const DIST_DIR = path.join(import.meta.dirname, "dist"); @@ -108,7 +107,7 @@ export function createServer(): McpServer { ), error: z.string().nullable(), }), - _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + _meta: { ui: { resourceUri } }, }, async ({ url }): Promise => { let title = url; From 741b1d3925da1bb5af5eb87174cab8d0f91a6203 Mon Sep 17 00:00:00 2001 From: Olivier Chafik Date: Mon, 12 Jan 2026 19:42:11 +0000 Subject: [PATCH 015/352] feat(basic-host): improve host UI with collapsible panels and SDK types (#244) * refactor(basic-host): use SDK types for ModelContext and AppMessage - Import McpUiUpdateModelContextRequest and McpUiMessageRequest from SDK - Replace custom ModelContext with McpUiUpdateModelContextRequest['params'] - Replace custom AppMessage with McpUiMessageRequest['params'] - Pass full message params instead of extracting text - Format messages by extracting text from content blocks in display * feat(basic-host): handle non-text content blocks in display - Add formatContentBlock helper for text, image, audio, resource types - Show placeholders like for non-text content - Apply to both messages and model context display * test: update shadertoy screenshot * test: update screenshots from CI (linux x64) --- examples/basic-host/src/implementation.ts | 35 +++- examples/basic-host/src/index.module.css | 100 +++++++++++ examples/basic-host/src/index.tsx | 158 +++++++++++++++--- examples/basic-host/src/sandbox.ts | 21 +-- src/app-bridge.ts | 31 ++++ .../basic-preact.png | Bin 48110 -> 55054 bytes .../servers.spec.ts-snapshots/basic-react.png | Bin 46545 -> 55588 bytes .../servers.spec.ts-snapshots/basic-solid.png | Bin 47934 -> 55492 bytes .../basic-svelte.png | Bin 48075 -> 55065 bytes .../basic-vanillajs.png | Bin 47385 -> 56188 bytes .../servers.spec.ts-snapshots/basic-vue.png | Bin 47389 -> 54847 bytes .../cohort-heatmap.png | Bin 39849 -> 34081 bytes .../customer-segmentation.png | Bin 39306 -> 38161 bytes .../servers.spec.ts-snapshots/integration.png | Bin 45119 -> 53319 bytes .../servers.spec.ts-snapshots/map-server.png | Bin 395717 -> 667887 bytes .../servers.spec.ts-snapshots/shadertoy.png | Bin 24301 -> 23413 bytes .../servers.spec.ts-snapshots/sheet-music.png | Bin 49098 -> 66915 bytes .../system-monitor.png | Bin 37642 -> 41050 bytes .../e2e/servers.spec.ts-snapshots/threejs.png | Bin 37725 -> 32501 bytes .../wiki-explorer.png | Bin 25253 -> 21685 bytes 20 files changed, 302 insertions(+), 43 deletions(-) diff --git a/examples/basic-host/src/implementation.ts b/examples/basic-host/src/implementation.ts index ace3143..faa5bf9 100644 --- a/examples/basic-host/src/implementation.ts +++ b/examples/basic-host/src/implementation.ts @@ -1,4 +1,4 @@ -import { RESOURCE_MIME_TYPE, getToolUiResourceUri, type McpUiSandboxProxyReadyNotification, AppBridge, PostMessageTransport, type McpUiResourceCsp, type McpUiResourcePermissions } from "@modelcontextprotocol/ext-apps/app-bridge"; +import { RESOURCE_MIME_TYPE, getToolUiResourceUri, type McpUiSandboxProxyReadyNotification, AppBridge, PostMessageTransport, type McpUiResourceCsp, type McpUiResourcePermissions, buildAllowAttribute, type McpUiUpdateModelContextRequest, type McpUiMessageRequest } from "@modelcontextprotocol/ext-apps/app-bridge"; import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; import type { CallToolResult, Tool } from "@modelcontextprotocol/sdk/types.js"; @@ -122,12 +122,19 @@ async function getUiResource(serverInfo: ServerInfo, uri: string): Promise { // Prevent reload if (iframe.src) return Promise.resolve(false); iframe.setAttribute("sandbox", "allow-scripts allow-same-origin allow-forms"); + // Set Permission Policy allow attribute based on requested permissions + const allowAttribute = buildAllowAttribute(permissions); + if (allowAttribute) { + iframe.setAttribute("allow", allowAttribute); + } + const readyNotification: McpUiSandboxProxyReadyNotification["method"] = "ui/notifications/sandbox-proxy-ready"; @@ -215,12 +222,26 @@ function hookInitializedCallback(appBridge: AppBridge): Promise { } -export function newAppBridge(serverInfo: ServerInfo, iframe: HTMLIFrameElement): AppBridge { +export type ModelContext = McpUiUpdateModelContextRequest["params"]; +export type AppMessage = McpUiMessageRequest["params"]; + +export interface AppBridgeCallbacks { + onContextUpdate?: (context: ModelContext | null) => void; + onMessage?: (message: AppMessage) => void; +} + +export function newAppBridge( + serverInfo: ServerInfo, + iframe: HTMLIFrameElement, + callbacks?: AppBridgeCallbacks, +): AppBridge { const serverCapabilities = serverInfo.client.getServerCapabilities(); const appBridge = new AppBridge(serverInfo.client, IMPLEMENTATION, { openLinks: {}, serverTools: serverCapabilities?.tools, serverResources: serverCapabilities?.resources, + // Declare support for model context updates + updateModelContext: { text: {} }, }); // Register all handlers before calling connect(). The Guest UI can start @@ -229,6 +250,7 @@ export function newAppBridge(serverInfo: ServerInfo, iframe: HTMLIFrameElement): appBridge.onmessage = async (params, _extra) => { log.info("Message from MCP App:", params); + callbacks?.onMessage?.(params); return {}; }; @@ -242,6 +264,15 @@ export function newAppBridge(serverInfo: ServerInfo, iframe: HTMLIFrameElement): log.info("Log message from MCP App:", params); }; + appBridge.onupdatemodelcontext = async (params) => { + log.info("Model context update from MCP App:", params); + // Normalize: empty content array means clear context + const hasContent = params.content && params.content.length > 0; + const hasStructured = params.structuredContent && Object.keys(params.structuredContent).length > 0; + callbacks?.onContextUpdate?.(hasContent || hasStructured ? params : null); + return {}; + }; + appBridge.onsizechange = async ({ width, height }) => { // The MCP App has requested a `width` and `height`, but if // `box-sizing: border-box` is applied to the outer iframe element, then we diff --git a/examples/basic-host/src/index.module.css b/examples/basic-host/src/index.module.css index 0c4a8b0..e319e35 100644 --- a/examples/basic-host/src/index.module.css +++ b/examples/basic-host/src/index.module.css @@ -126,6 +126,46 @@ min-width: 0; } +.appOutputPanel { + flex: 1; + min-width: 0; +} + +.appHeader { + display: flex; + align-items: center; + gap: 0.5rem; + margin-bottom: 0.5rem; + font-size: 1.25rem; + font-weight: 600; + position: relative; + + .toolName { + font-family: monospace; + } + + .closeButton { + position: absolute; + top: 0; + right: 0; + width: 1.5rem; + height: 1.5rem; + padding: 0; + border: none; + border-radius: 4px; + background: #e0e0e0; + font-size: 1.25rem; + line-height: 1; + color: #666; + cursor: pointer; + + &:hover { + background: #d0d0d0; + color: #333; + } + } +} + .jsonBlock { flex-grow: 1; min-height: 0; @@ -148,6 +188,66 @@ } } +.collapsiblePanel { + margin: 0.5rem 0; + padding: 0.5rem 0.75rem; + border: 1px solid #e0e0e0; + border-radius: 4px; + background-color: #fafafa; + font-size: 0.875rem; + cursor: pointer; + transition: background-color 0.15s; + + &:hover { + background-color: #f0f0f0; + } +} + +.collapsibleHeader { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.collapsibleLabel { + font-weight: 600; + color: #555; +} + +.collapsibleSize { + color: #888; + font-size: 0.75rem; +} + +.collapsibleToggle { + margin-left: auto; + color: #888; + font-size: 0.75rem; +} + +.collapsiblePreview { + margin-top: 0.25rem; + color: #666; + font-family: monospace; + font-size: 0.8rem; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.collapsibleFull { + margin: 0.5rem 0 0; + padding: 0.5rem; + border-radius: 4px; + background-color: #f5f5f5; + font-family: monospace; + font-size: 0.8rem; + white-space: pre-wrap; + word-break: break-word; + max-height: 200px; + overflow: auto; +} + .error { padding: 1.5rem; background-color: #ddd; diff --git a/examples/basic-host/src/index.tsx b/examples/basic-host/src/index.tsx index 1e1313d..d3331fe 100644 --- a/examples/basic-host/src/index.tsx +++ b/examples/basic-host/src/index.tsx @@ -1,7 +1,7 @@ import type { Tool } from "@modelcontextprotocol/sdk/types.js"; import { Component, type ErrorInfo, type ReactNode, StrictMode, Suspense, use, useEffect, useMemo, useRef, useState } from "react"; import { createRoot } from "react-dom/client"; -import { callTool, connectToServer, hasAppHtml, initializeApp, loadSandboxProxy, log, newAppBridge, type ServerInfo, type ToolCallInfo } from "./implementation"; +import { callTool, connectToServer, hasAppHtml, initializeApp, loadSandboxProxy, log, newAppBridge, type ServerInfo, type ToolCallInfo, type ModelContext, type AppMessage } from "./implementation"; import styles from "./index.module.css"; @@ -207,23 +207,41 @@ function ToolCallInfoPanel({ toolCallInfo, isDestroying, onRequestClose, onClose className={styles.toolCallInfoPanel} style={isDestroying ? { opacity: 0.5, pointerEvents: "none" } : undefined} > -
-

- {toolCallInfo.serverInfo.name} - {toolCallInfo.tool.name} - {onRequestClose && !isDestroying && ( - - )} -

- -
-
+ {/* For non-app tools, show input/output side by side */} + {!isApp && ( +
+

+ {toolCallInfo.serverInfo.name} + {toolCallInfo.tool.name} + {onRequestClose && !isDestroying && ( + + )} +

+ +
+ )} +
+ {/* For apps, show header above the app: ServerName:tool_name */} + {isApp && ( +
+ {toolCallInfo.serverInfo.name}:{toolCallInfo.tool.name} + {onRequestClose && !isDestroying && ( + + )} +
+ )} { @@ -252,6 +270,43 @@ function JsonBlock({ value }: { value: object }) { } +interface CollapsiblePanelProps { + icon: string; + label: string; + content: string; + badge?: string; + defaultExpanded?: boolean; +} +function CollapsiblePanel({ icon, label, content, badge, defaultExpanded = false }: CollapsiblePanelProps) { + const [expanded, setExpanded] = useState(defaultExpanded); + + return ( +
setExpanded(!expanded)} + title={expanded ? "Click to collapse" : "Click to expand"} + > +
+ {icon} {label} + + {badge ?? `${content.length} chars`} + + + {expanded ? "โ–ผ" : "โ–ถ"} + +
+ {expanded ? ( +
{content}
+ ) : ( +
+ {content.slice(0, 100)}{content.length > 100 ? "โ€ฆ" : ""} +
+ )} +
+ ); +} + + interface AppIFramePanelProps { toolCallInfo: Required; isDestroying?: boolean; @@ -260,25 +315,34 @@ interface AppIFramePanelProps { function AppIFramePanel({ toolCallInfo, isDestroying, onTeardownComplete }: AppIFramePanelProps) { const iframeRef = useRef(null); const appBridgeRef = useRef | null>(null); + const [modelContext, setModelContext] = useState(null); + const [toolResult, setToolResult] = useState(null); + const [messages, setMessages] = useState([]); useEffect(() => { const iframe = iframeRef.current!; - // First get CSP from resource, then load sandbox with CSP in query param - // This ensures CSP is set via HTTP headers (tamper-proof) - toolCallInfo.appResourcePromise.then(({ csp }) => { - loadSandboxProxy(iframe, csp).then((firstTime) => { + // First get CSP and permissions from resource, then load sandbox + // CSP is set via HTTP headers (tamper-proof), permissions via iframe allow attribute + toolCallInfo.appResourcePromise.then(({ csp, permissions }) => { + loadSandboxProxy(iframe, csp, permissions).then((firstTime) => { // The `firstTime` check guards against React Strict Mode's double // invocation (mount โ†’ unmount โ†’ remount simulation in development). // Outside of Strict Mode, this `useEffect` runs only once per // `toolCallInfo`. if (firstTime) { - const appBridge = newAppBridge(toolCallInfo.serverInfo, iframe); + const appBridge = newAppBridge(toolCallInfo.serverInfo, iframe, { + onContextUpdate: setModelContext, + onMessage: (msg) => setMessages((prev) => [...prev, msg]), + }); appBridgeRef.current = appBridge; initializeApp(iframe, appBridge, toolCallInfo); } }); }); + + // Track tool result for display + toolCallInfo.resultPromise.then(setToolResult).catch(() => {}); }, [toolCallInfo]); // Graceful teardown: wait for guest to respond before unmounting @@ -303,9 +367,57 @@ function AppIFramePanel({ toolCallInfo, isDestroying, onTeardownComplete }: AppI }); }, [isDestroying, onTeardownComplete]); + // Format content blocks - handle text, images, resources, etc. + const formatContentBlock = (c: { type: string; [key: string]: unknown }) => { + switch (c.type) { + case "text": + return (c as { type: "text"; text: string }).text; + case "image": + return ``; + case "audio": + return ``; + case "resource": + return ``; + default: + return `<${c.type}>`; + } + }; + + // Format context for display + const contextText = modelContext?.content?.map(formatContentBlock).join("\n") ?? ""; + const contextJson = modelContext?.structuredContent + ? JSON.stringify(modelContext.structuredContent, null, 2) + : ""; + const fullContext = [contextText, contextJson].filter(Boolean).join("\n\n"); + + const inputJson = JSON.stringify(toolCallInfo.input, null, 2); + const resultJson = toolResult ? JSON.stringify(toolResult, null, 2) : null; + + // Format messages + const formatMessage = (m: AppMessage) => { + const content = m.content.map(formatContentBlock).join("\n"); + return `[${m.role}] ${content}`; + }; + const messagesText = messages.map(formatMessage).join("\n\n"); + return (
+