From 5454e1137e9e02912fd33bcb37f3242999353443 Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 14 Feb 2026 17:31:32 +0100 Subject: [PATCH 1/8] Refactor code structure and remove redundant code blocks for improved readability and maintainability --- examples-cloudflare/playground14/.dev.vars | 1 - .../playground14/.env.development | 2 - examples-cloudflare/playground14/.gitignore | 45 - .../playground14/app/api/buildid/route.ts | 9 - .../playground14/app/api/env/route.ts | 8 - .../playground14/app/api/hello/route.ts | 20 - .../app/api/instrumentation/route.ts | 10 - .../playground14/app/api/request/route.ts | 5 - .../app/isr/[id]/dynamic/page.tsx | 32 - .../app/isr/[id]/no-dynamic/page.tsx | 31 - .../playground14/app/layout.js | 12 - .../playground14/app/og/route.tsx | 63 - examples-cloudflare/playground14/app/page.js | 7 - .../playground14/e2e/base.spec.ts | 67 - .../playground14/e2e/cloudflare.spec.ts | 85 - .../playground14/e2e/head.spec.ts | 13 - .../playground14/e2e/instrumentation.spec.ts | 35 - .../playground14/e2e/isr.spec.ts | 30 - .../playground14/e2e/playwright.config.ts | 3 - .../playground14/e2e/playwright.dev.config.ts | 5 - .../playground14/instrumentation.js | 15 - examples-cloudflare/playground14/lib/posts.ts | 53 - .../playground14/middleware.js | 12 - .../playground14/next.config.mjs | 31 - .../playground14/open-next.config.ts | 7 - examples-cloudflare/playground14/package.json | 30 - .../playground14/pages/api/pages.ts | 9 - .../playground14/pages/head.tsx | 23 - .../playground14/public/.gitkeep | 0 .../playground14/public/snipp/snipp.webp | Bin 322224 -> 0 bytes .../playground14/tsconfig.json | 25 - .../playground14/worker-configuration.d.ts | 6414 ----------------- examples-cloudflare/playground14/worker.ts | 21 - .../playground14/wrangler.jsonc | 25 - examples-cloudflare/playground15/.dev.vars | 1 - .../playground15/.env.development | 1 - examples-cloudflare/playground15/.gitignore | 45 - .../playground15/app/api/buildid/route.ts | 9 - .../playground15/app/api/cloudflare/route.ts | 17 - .../playground15/app/api/env/route.ts | 10 - .../playground15/app/api/hello/route.ts | 20 - .../app/api/instrumentation/route.ts | 8 - .../playground15/app/api/request/route.ts | 5 - .../app/api/signal/abort/route.ts | 42 - .../app/api/signal/revalidate/route.ts | 9 - .../playground15/app/from-app/page.tsx | 30 - .../playground15/app/image/page.tsx | 11 - .../app/isr/[id]/dynamic/page.tsx | 32 - .../app/isr/[id]/no-dynamic/page.tsx | 31 - .../playground15/app/layout.js | 12 - .../playground15/app/og/route.tsx | 63 - .../playground15/app/other-app/page.tsx | 25 - examples-cloudflare/playground15/app/page.js | 7 - .../app/signal/_components/sse.tsx | 63 - .../playground15/app/signal/page.tsx | 15 - examples-cloudflare/playground15/data.js | 6 - .../playground15/data.module.css | 3 - .../playground15/e2e/base.spec.ts | 62 - .../playground15/e2e/cloudflare.spec.ts | 27 - .../playground15/e2e/head.spec.ts | 13 - .../playground15/e2e/image.test.ts | 10 - .../playground15/e2e/instrumentation.spec.ts | 35 - .../playground15/e2e/isr.spec.ts | 33 - .../playground15/e2e/playwright.config.ts | 3 - .../playground15/e2e/playwright.dev.config.ts | 5 - .../playground15/e2e/signal.test.ts | 41 - .../playground15/instrumentation.js | 22 - examples-cloudflare/playground15/lib/posts.ts | 53 - .../playground15/middleware.js | 12 - .../playground15/next.config.ts | 20 - .../playground15/open-next.config.ts | 17 - examples-cloudflare/playground15/package.json | 29 - .../playground15/pages/head.tsx | 23 - .../playground15/public/.gitkeep | 0 .../playground15/public/test.jpg | Bin 6765 -> 0 bytes .../playground15/public/tomine.webp | Bin 8634 -> 0 bytes .../playground15/tsconfig.json | 25 - .../playground15/worker-configuration.d.ts | 5 - .../playground15/wrangler.jsonc | 51 - pnpm-lock.yaml | 289 +- 80 files changed, 78 insertions(+), 8310 deletions(-) delete mode 100644 examples-cloudflare/playground14/.dev.vars delete mode 100644 examples-cloudflare/playground14/.env.development delete mode 100644 examples-cloudflare/playground14/.gitignore delete mode 100644 examples-cloudflare/playground14/app/api/buildid/route.ts delete mode 100644 examples-cloudflare/playground14/app/api/env/route.ts delete mode 100644 examples-cloudflare/playground14/app/api/hello/route.ts delete mode 100644 examples-cloudflare/playground14/app/api/instrumentation/route.ts delete mode 100644 examples-cloudflare/playground14/app/api/request/route.ts delete mode 100644 examples-cloudflare/playground14/app/isr/[id]/dynamic/page.tsx delete mode 100644 examples-cloudflare/playground14/app/isr/[id]/no-dynamic/page.tsx delete mode 100644 examples-cloudflare/playground14/app/layout.js delete mode 100644 examples-cloudflare/playground14/app/og/route.tsx delete mode 100644 examples-cloudflare/playground14/app/page.js delete mode 100644 examples-cloudflare/playground14/e2e/base.spec.ts delete mode 100644 examples-cloudflare/playground14/e2e/cloudflare.spec.ts delete mode 100644 examples-cloudflare/playground14/e2e/head.spec.ts delete mode 100644 examples-cloudflare/playground14/e2e/instrumentation.spec.ts delete mode 100644 examples-cloudflare/playground14/e2e/isr.spec.ts delete mode 100644 examples-cloudflare/playground14/e2e/playwright.config.ts delete mode 100644 examples-cloudflare/playground14/e2e/playwright.dev.config.ts delete mode 100644 examples-cloudflare/playground14/instrumentation.js delete mode 100644 examples-cloudflare/playground14/lib/posts.ts delete mode 100644 examples-cloudflare/playground14/middleware.js delete mode 100644 examples-cloudflare/playground14/next.config.mjs delete mode 100644 examples-cloudflare/playground14/open-next.config.ts delete mode 100644 examples-cloudflare/playground14/package.json delete mode 100644 examples-cloudflare/playground14/pages/api/pages.ts delete mode 100644 examples-cloudflare/playground14/pages/head.tsx delete mode 100644 examples-cloudflare/playground14/public/.gitkeep delete mode 100644 examples-cloudflare/playground14/public/snipp/snipp.webp delete mode 100644 examples-cloudflare/playground14/tsconfig.json delete mode 100644 examples-cloudflare/playground14/worker-configuration.d.ts delete mode 100644 examples-cloudflare/playground14/worker.ts delete mode 100644 examples-cloudflare/playground14/wrangler.jsonc delete mode 100644 examples-cloudflare/playground15/.dev.vars delete mode 100644 examples-cloudflare/playground15/.env.development delete mode 100644 examples-cloudflare/playground15/.gitignore delete mode 100644 examples-cloudflare/playground15/app/api/buildid/route.ts delete mode 100644 examples-cloudflare/playground15/app/api/cloudflare/route.ts delete mode 100644 examples-cloudflare/playground15/app/api/env/route.ts delete mode 100644 examples-cloudflare/playground15/app/api/hello/route.ts delete mode 100644 examples-cloudflare/playground15/app/api/instrumentation/route.ts delete mode 100644 examples-cloudflare/playground15/app/api/request/route.ts delete mode 100644 examples-cloudflare/playground15/app/api/signal/abort/route.ts delete mode 100644 examples-cloudflare/playground15/app/api/signal/revalidate/route.ts delete mode 100644 examples-cloudflare/playground15/app/from-app/page.tsx delete mode 100644 examples-cloudflare/playground15/app/image/page.tsx delete mode 100644 examples-cloudflare/playground15/app/isr/[id]/dynamic/page.tsx delete mode 100644 examples-cloudflare/playground15/app/isr/[id]/no-dynamic/page.tsx delete mode 100644 examples-cloudflare/playground15/app/layout.js delete mode 100644 examples-cloudflare/playground15/app/og/route.tsx delete mode 100644 examples-cloudflare/playground15/app/other-app/page.tsx delete mode 100644 examples-cloudflare/playground15/app/page.js delete mode 100644 examples-cloudflare/playground15/app/signal/_components/sse.tsx delete mode 100644 examples-cloudflare/playground15/app/signal/page.tsx delete mode 100644 examples-cloudflare/playground15/data.js delete mode 100644 examples-cloudflare/playground15/data.module.css delete mode 100644 examples-cloudflare/playground15/e2e/base.spec.ts delete mode 100644 examples-cloudflare/playground15/e2e/cloudflare.spec.ts delete mode 100644 examples-cloudflare/playground15/e2e/head.spec.ts delete mode 100644 examples-cloudflare/playground15/e2e/image.test.ts delete mode 100644 examples-cloudflare/playground15/e2e/instrumentation.spec.ts delete mode 100644 examples-cloudflare/playground15/e2e/isr.spec.ts delete mode 100644 examples-cloudflare/playground15/e2e/playwright.config.ts delete mode 100644 examples-cloudflare/playground15/e2e/playwright.dev.config.ts delete mode 100644 examples-cloudflare/playground15/e2e/signal.test.ts delete mode 100644 examples-cloudflare/playground15/instrumentation.js delete mode 100644 examples-cloudflare/playground15/lib/posts.ts delete mode 100644 examples-cloudflare/playground15/middleware.js delete mode 100644 examples-cloudflare/playground15/next.config.ts delete mode 100644 examples-cloudflare/playground15/open-next.config.ts delete mode 100644 examples-cloudflare/playground15/package.json delete mode 100644 examples-cloudflare/playground15/pages/head.tsx delete mode 100644 examples-cloudflare/playground15/public/.gitkeep delete mode 100644 examples-cloudflare/playground15/public/test.jpg delete mode 100644 examples-cloudflare/playground15/public/tomine.webp delete mode 100644 examples-cloudflare/playground15/tsconfig.json delete mode 100644 examples-cloudflare/playground15/worker-configuration.d.ts delete mode 100644 examples-cloudflare/playground15/wrangler.jsonc diff --git a/examples-cloudflare/playground14/.dev.vars b/examples-cloudflare/playground14/.dev.vars deleted file mode 100644 index 17f2dcc2..00000000 --- a/examples-cloudflare/playground14/.dev.vars +++ /dev/null @@ -1 +0,0 @@ -NEXTJS_ENV=development \ No newline at end of file diff --git a/examples-cloudflare/playground14/.env.development b/examples-cloudflare/playground14/.env.development deleted file mode 100644 index 561d7791..00000000 --- a/examples-cloudflare/playground14/.env.development +++ /dev/null @@ -1,2 +0,0 @@ -TEST_ENV_VAR=TEST_VALUE -PROCESS_ENV_VAR=.ENV_FILE \ No newline at end of file diff --git a/examples-cloudflare/playground14/.gitignore b/examples-cloudflare/playground14/.gitignore deleted file mode 100644 index 3a282111..00000000 --- a/examples-cloudflare/playground14/.gitignore +++ /dev/null @@ -1,45 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js -.yarn/install-state.gz - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env*.local - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts - -# wrangler -.wrangler - -# playwright -/test-results/ -/playwright-report/ -/blob-report/ -/playwright/.cache/ diff --git a/examples-cloudflare/playground14/app/api/buildid/route.ts b/examples-cloudflare/playground14/app/api/buildid/route.ts deleted file mode 100644 index 4c1d46ad..00000000 --- a/examples-cloudflare/playground14/app/api/buildid/route.ts +++ /dev/null @@ -1,9 +0,0 @@ -// Use headers to force a dynamic response -import { headers } from "next/headers"; - -export async function GET() { - const nextConfig = process.env.__NEXT_PRIVATE_STANDALONE_CONFIG - ? JSON.parse(process.env.__NEXT_PRIVATE_STANDALONE_CONFIG) - : undefined; - return Response.json({ nextConfig, headers: headers() }); -} diff --git a/examples-cloudflare/playground14/app/api/env/route.ts b/examples-cloudflare/playground14/app/api/env/route.ts deleted file mode 100644 index d51838cf..00000000 --- a/examples-cloudflare/playground14/app/api/env/route.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This test relies on using `.dev.vars` to set the environment to `development` -// However `next build` is not passed an environment, so we do not want to cache -// the output. -export const dynamic = "force-dynamic"; - -export async function GET() { - return new Response(JSON.stringify(process.env)); -} diff --git a/examples-cloudflare/playground14/app/api/hello/route.ts b/examples-cloudflare/playground14/app/api/hello/route.ts deleted file mode 100644 index f969ff6d..00000000 --- a/examples-cloudflare/playground14/app/api/hello/route.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { getCloudflareContext } from "@opennextjs/cloudflare"; -import { headers } from "next/headers"; - -export async function GET() { - const headersList = headers(); - - const fromCloudflareContext = headersList.has("from-cloudflare-context"); - - if (!fromCloudflareContext) { - return new Response("Hello World!"); - } - - // Retrieve the bindings defined in wrangler.json - return new Response(getCloudflareContext().env.hello); -} - -export async function POST(request: Request) { - const text = await request.text(); - return new Response(`Hello post-World! body=${text}`); -} diff --git a/examples-cloudflare/playground14/app/api/instrumentation/route.ts b/examples-cloudflare/playground14/app/api/instrumentation/route.ts deleted file mode 100644 index 4d27372e..00000000 --- a/examples-cloudflare/playground14/app/api/instrumentation/route.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { NextResponse } from "next/server"; - -export const dynamic = "force-dynamic"; - -export function GET() { - return NextResponse.json({ - "nodejs-instrumentation-setup": globalThis["__NODEJS_INSTRUMENTATION_SETUP"], - "edge-instrumentation-setup": globalThis["__EDGE_INSTRUMENTATION_SETUP"], - }); -} diff --git a/examples-cloudflare/playground14/app/api/request/route.ts b/examples-cloudflare/playground14/app/api/request/route.ts deleted file mode 100644 index 277e4236..00000000 --- a/examples-cloudflare/playground14/app/api/request/route.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { NextRequest } from "next/server"; - -export const GET = (request: NextRequest) => { - return new Response(JSON.stringify({ nextUrl: request.nextUrl.href, url: request.url })); -}; diff --git a/examples-cloudflare/playground14/app/isr/[id]/dynamic/page.tsx b/examples-cloudflare/playground14/app/isr/[id]/dynamic/page.tsx deleted file mode 100644 index 95883aad..00000000 --- a/examples-cloudflare/playground14/app/isr/[id]/dynamic/page.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { getPost } from "../../../../lib/posts"; - -// Imported from https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration -interface Post { - id: string; - title: string; - content: string; -} - -// Next.js will invalidate the cache when a -// request comes in, at most once every 1 hour. -export const revalidate = 3600; - -// We'll prerender only the params from `generateStaticParams` at build time. -// If a request comes in for a path that hasn't been generated, -// Next.js will server-render the page on-demand. -export const dynamicParams = true; - -export async function generateStaticParams() { - return [{ id: "1" }, { id: "2" }, { id: "3" }]; -} - -export default async function Page({ params }: { params: Promise<{ id: string }> }) { - const id = (await params).id; - const post: Post = await getPost({ id }).then((res) => res.json()); - return ( -
-

{post.title}

-

{post.content}

-
- ); -} diff --git a/examples-cloudflare/playground14/app/isr/[id]/no-dynamic/page.tsx b/examples-cloudflare/playground14/app/isr/[id]/no-dynamic/page.tsx deleted file mode 100644 index 8dbec2f1..00000000 --- a/examples-cloudflare/playground14/app/isr/[id]/no-dynamic/page.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { getPost } from "../../../../lib/posts"; - -// Imported from https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration -interface Post { - id: string; - title: string; - content: string; -} - -// Next.js will invalidate the cache when a -// request comes in, at most once every 1 hour. -export const revalidate = 3600; - -// We'll prerender only the params from `generateStaticParams` at build time. -// If a request comes in for a path that hasn't been generated, it will 404. -export const dynamicParams = false; - -export async function generateStaticParams() { - return [{ id: "1" }, { id: "2" }, { id: "3" }]; -} - -export default async function Page({ params }: { params: Promise<{ id: string }> }) { - const id = (await params).id; - const post: Post = await getPost({ id }).then((res) => res.json()); - return ( -
-

{post.title}

-

{post.content}

-
- ); -} diff --git a/examples-cloudflare/playground14/app/layout.js b/examples-cloudflare/playground14/app/layout.js deleted file mode 100644 index d3cded23..00000000 --- a/examples-cloudflare/playground14/app/layout.js +++ /dev/null @@ -1,12 +0,0 @@ -export const metadata = { - title: "API hello-world", - description: "a simple api hello-world app", -}; - -export default function RootLayout({ children }) { - return ( - - {children} - - ); -} diff --git a/examples-cloudflare/playground14/app/og/route.tsx b/examples-cloudflare/playground14/app/og/route.tsx deleted file mode 100644 index 97766095..00000000 --- a/examples-cloudflare/playground14/app/og/route.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { ImageResponse } from "next/og"; - -export const dynamic = "force-dynamic"; - -export async function GET() { - try { - return new ImageResponse( -
-
- Vercel -
-
- 'next/og' -
-
, - { - width: 1200, - height: 630, - } - ); - } catch (e: any) { - return new Response("Failed to generate the image", { - status: 500, - }); - } -} diff --git a/examples-cloudflare/playground14/app/page.js b/examples-cloudflare/playground14/app/page.js deleted file mode 100644 index 081a8856..00000000 --- a/examples-cloudflare/playground14/app/page.js +++ /dev/null @@ -1,7 +0,0 @@ -export default function Home() { - return ( -
-

Test misc Next features

-
- ); -} diff --git a/examples-cloudflare/playground14/e2e/base.spec.ts b/examples-cloudflare/playground14/e2e/base.spec.ts deleted file mode 100644 index 492aee9f..00000000 --- a/examples-cloudflare/playground14/e2e/base.spec.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { createHash } from "node:crypto"; -import type { BinaryLike } from "node:crypto"; - -import { test, expect } from "@playwright/test"; - -const OG_MD5 = "2f7b724d62d8c7739076da211aa62e7b"; - -export function validateMd5(data: Buffer, expectedHash: string) { - return ( - createHash("md5") - .update(data as BinaryLike) - .digest("hex") === expectedHash - ); -} - -test.describe("playground/base", () => { - test("index", async ({ page }) => { - await page.goto("/"); - await expect(page.getByText("Test misc Next features")).toBeVisible(); - }); - - test("the hello-world api GET route works as intended", async ({ page }) => { - const res = await page.request.get("/api/hello"); - expect(res.headers()["content-type"]).toContain("text/plain"); - expect(await res.text()).toEqual("Hello World!"); - }); - - test("returns a hello world string from the cloudflare context env", async ({ page }) => { - const res = await page.request.get("/api/hello", { - headers: { - "from-cloudflare-context": "true", - }, - }); - expect(res.headers()["content-type"]).toContain("text/plain"); - expect(await res.text()).toEqual("Hello World from the cloudflare context!"); - }); - - test("the hello-world api POST route works as intended", async ({ page }) => { - const res = await page.request.post("/api/hello", { data: "some body" }); - expect(res.headers()["content-type"]).toContain("text/plain"); - await expect(res.text()).resolves.toEqual("Hello post-World! body=some body"); - }); - - test("sets environment variables from the Next.js env file", async ({ page }) => { - const res = await page.request.get("/api/env"); - await expect(res.json()).resolves.toEqual(expect.objectContaining({ TEST_ENV_VAR: "TEST_VALUE" })); - }); - - test("returns correct information about the request from a route handler", async ({ page, baseURL }) => { - const res = await page.request.get("/api/request"); - // Next.js can fall back to `localhost:3000` or `n` if it doesn't get the host - neither of these are expected. - const expectedURL = `${baseURL}/api/request`; - await expect(res.json()).resolves.toEqual({ nextUrl: expectedURL, url: expectedURL }); - }); - - test("Pages router API routes", async ({ page }) => { - const res = await page.request.get("/api/pages"); - expect(await res.json()).toEqual({ hello: "world" }); - }); - - test("generates an og image successfully", async ({ page }) => { - const res = await page.request.get("/og"); - expect(res.status()).toEqual(200); - expect(res.headers()["content-type"]).toEqual("image/png"); - expect(validateMd5(await res.body(), OG_MD5)).toEqual(true); - }); -}); diff --git a/examples-cloudflare/playground14/e2e/cloudflare.spec.ts b/examples-cloudflare/playground14/e2e/cloudflare.spec.ts deleted file mode 100644 index 7a9a8b9b..00000000 --- a/examples-cloudflare/playground14/e2e/cloudflare.spec.ts +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Cloudflare specific tests. - * - * The tests in this file do not run on Node (`next dev`). - */ - -import { test, expect } from "@playwright/test"; -import sharp from "sharp"; - -test.describe("playground/cloudflare", () => { - test("NextConfig", async ({ page }) => { - const res = await page.request.get("/api/buildid"); - expect(res.status()).toEqual(200); - const { nextConfig } = await res.json(); - expect(nextConfig.output).toEqual("standalone"); - }); - - test("Environment variable defined on process.env are not overridden by .env files", async ({ page }) => { - const res = await page.request.get("/api/env"); - await expect(res.json()).resolves.toEqual(expect.objectContaining({ PROCESS_ENV_VAR: "process.env" })); - }); - - test.describe("remotePatterns", () => { - test("fetch an image allowed by remotePatterns", async ({ page }) => { - const res = await page.request.get( - "/_next/image?url=https://avatars.githubusercontent.com/u/248818&w=256&q=75" - ); - expect(res.status()).toBe(200); - expect(res.headers()).toMatchObject({ "content-type": "image/jpeg" }); - }); - - test("400 when fetching an image disallowed by remotePatterns", async ({ page }) => { - const res = await page.request.get( - "/_next/image?url=https://avatars.githubusercontent.com/u/248817&w=256&q=75" - ); - expect(res.status()).toBe(400); - }); - }); - - test.describe("localPatterns", () => { - test("fetch an image allowed by localPatterns", async ({ page }) => { - const res = await page.request.get("/_next/image?url=/snipp/snipp.webp?iscute=yes&w=256&q=75"); - expect(res.status()).toBe(200); - expect(res.headers()).toMatchObject({ "content-type": "image/webp" }); - }); - - test("400 when fetching an image disallowed by localPatterns with wrong query parameter", async ({ - page, - }) => { - const res = await page.request.get("/_next/image?url=/snipp/snipp?iscute=no&w=256&q=75"); - expect(res.status()).toBe(400); - }); - - test("400 when fetching an image disallowed by localPatterns without query parameter", async ({ - page, - }) => { - const res = await page.request.get("/_next/image?url=/snipp/snipp&w=256&q=75"); - expect(res.status()).toBe(400); - }); - }); - - test.describe("imageSizes", () => { - test("400 when fetching an image with unsupported width value", async ({ page }) => { - const res = await page.request.get("/_next/image?url=/snipp/snipp.webp?iscute=yes&w=100&q=75"); - expect(res.status()).toBe(400); - }); - }); - - test.describe("qualities", () => { - test("400 when fetching an image with unsupported quality value", async ({ page }) => { - const res = await page.request.get("/_next/image?url=/snipp/snipp.webp?iscute=yes&w=256&q=100"); - expect(res.status()).toBe(400); - }); - }); - - test.describe('"w" parameter', () => { - test("Image is shrunk to target width", async ({ page }) => { - const res = await page.request.get("/_next/image?url=/snipp/snipp.webp?iscute=yes&w=256&q=75"); - expect(res.status()).toBe(200); - const buffer = await res.body(); - const metadata = await sharp(buffer).metadata(); - expect(metadata.width).toBe(256); - }); - }); -}); diff --git a/examples-cloudflare/playground14/e2e/head.spec.ts b/examples-cloudflare/playground14/e2e/head.spec.ts deleted file mode 100644 index 77d9fded..00000000 --- a/examples-cloudflare/playground14/e2e/head.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { test, expect } from "@playwright/test"; - -test.describe("head properly populated", () => { - test("should properly populate the ", async ({ page }) => { - await page.goto("/head"); - const title = await page.title(); - const description = await page.locator('meta[name="description"]').getAttribute("content"); - const favicon = await page.locator('link[rel="icon"]').getAttribute("href"); - expect(title).toBe("SSR Head"); - expect(description).toBe("SSR"); - expect(favicon).toBe("/favicon.ico"); - }); -}); diff --git a/examples-cloudflare/playground14/e2e/instrumentation.spec.ts b/examples-cloudflare/playground14/e2e/instrumentation.spec.ts deleted file mode 100644 index 9ffc4fee..00000000 --- a/examples-cloudflare/playground14/e2e/instrumentation.spec.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { test, expect } from "@playwright/test"; - -test.describe("instrumentation", () => { - test("the instrumentation register hook should work for the nodejs runtime", async ({ page }) => { - const res = await page.request.get("/api/instrumentation"); - const respJson: Record = await res.json(); - expect(respJson["nodejs-instrumentation-setup"]).toEqual( - "this value has been set by calling the instrumentation `register` callback in the nodejs runtime" - ); - }); - - test("the instrumentation register hook should work for the edge runtime", async ({ page }) => { - const res = await page.request.get("/middleware-instrumentation"); - const respJson: Record = await res.json(); - expect(respJson["edge-instrumentation-setup"]).toEqual( - "this value has been set by calling the instrumentation `register` callback in the edge runtime" - ); - }); - - // Note: we cannot test this since currently both runtimes share the same global scope - // (see: https://github.com/opennextjs/opennextjs-cloudflare/issues/408) - test.describe.skip("isolation", () => { - test("the instrumentation register hook nodejs logic should not effect edge routes", async ({ page }) => { - const res = await page.request.get("/middleware-instrumentation"); - const respJson: Record = await res.json(); - expect(respJson["nodejs-instrumentation-setup"]).toBeUndefined(); - }); - - test("the instrumentation register hook edge logic should not effect nodejs routes", async ({ page }) => { - const res = await page.request.get("/api/instrumentation"); - const respJson: Record = await res.json(); - expect(respJson["edge-instrumentation-setup"]).toBeUndefined(); - }); - }); -}); diff --git a/examples-cloudflare/playground14/e2e/isr.spec.ts b/examples-cloudflare/playground14/e2e/isr.spec.ts deleted file mode 100644 index 1a85540b..00000000 --- a/examples-cloudflare/playground14/e2e/isr.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { test, expect, type APIResponse } from "@playwright/test"; - -test.describe("playground/isr", () => { - test("Generated pages exist", async ({ page }) => { - const generatedIds = [1, 2, 3]; - let res: APIResponse; - for (const id of generatedIds) { - res = await page.request.get(`/isr/${id}/dynamic`); - expect(res.status()).toBe(200); - res = await page.request.get(`/isr/${id}/no-dynamic`); - expect(res.status()).toBe(200); - } - }); - - test("Non generated pages 404 when dynamic is false", async ({ page }) => { - const generatedIds = [4, 5, 6]; - for (const id of generatedIds) { - const res = await page.request.get(`/isr/${id}/no-dynamic`); - expect(res.status()).toBe(404); - } - }); - - test("Non generated pages are generated when dynamic is true", async ({ page }) => { - const generatedIds = [4, 5, 6]; - for (const id of generatedIds) { - const res = await page.request.get(`/isr/${id}/dynamic`); - expect(res.status()).toBe(200); - } - }); -}); diff --git a/examples-cloudflare/playground14/e2e/playwright.config.ts b/examples-cloudflare/playground14/e2e/playwright.config.ts deleted file mode 100644 index 4244c86d..00000000 --- a/examples-cloudflare/playground14/e2e/playwright.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { configurePlaywright } from "../../common/config-e2e"; - -export default configurePlaywright("playground14"); diff --git a/examples-cloudflare/playground14/e2e/playwright.dev.config.ts b/examples-cloudflare/playground14/e2e/playwright.dev.config.ts deleted file mode 100644 index 5eb1bf01..00000000 --- a/examples-cloudflare/playground14/e2e/playwright.dev.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { configurePlaywright } from "../../common/config-e2e"; - -export default configurePlaywright("playground14", { - isWorker: false, -}); diff --git a/examples-cloudflare/playground14/instrumentation.js b/examples-cloudflare/playground14/instrumentation.js deleted file mode 100644 index cae6f386..00000000 --- a/examples-cloudflare/playground14/instrumentation.js +++ /dev/null @@ -1,15 +0,0 @@ -export function register() { - // Note: we register instrumentation for both the nodejs and edge runtime, we do that using the NEXT_RUNTIME env - // variable as recommended in the official docs: - // https://nextjs.org/docs/app/building-your-application/optimizing/instrumentation#importing-runtime-specific-code - - if (process.env.NEXT_RUNTIME === "nodejs") { - globalThis["__NODEJS_INSTRUMENTATION_SETUP"] = - "this value has been set by calling the instrumentation `register` callback in the nodejs runtime"; - } - - if (process.env.NEXT_RUNTIME === "edge") { - globalThis["__EDGE_INSTRUMENTATION_SETUP"] = - "this value has been set by calling the instrumentation `register` callback in the edge runtime"; - } -} diff --git a/examples-cloudflare/playground14/lib/posts.ts b/examples-cloudflare/playground14/lib/posts.ts deleted file mode 100644 index 410fc2b2..00000000 --- a/examples-cloudflare/playground14/lib/posts.ts +++ /dev/null @@ -1,53 +0,0 @@ -const posts = [ - { - id: 1, - title: "Lorem Ipsum - What Is It and How to Use It?", - content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ...", - author: "John Doe", - date: "2023-08-01", - category: "Technology", - }, - { - id: 2, - title: "The Benefits of Regular Exercise", - content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ...", - author: "Jane Smith", - date: "2023-07-25", - category: "Health & Fitness", - }, - { - id: 3, - title: "Mastering the Art of Cooking", - content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ...", - author: "Michael Johnson", - date: "2023-07-18", - category: "Food & Cooking", - }, - { - id: 4, - title: "Traveling on a Budget - Tips and Tricks", - content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ...", - author: "Emily Brown", - date: "2023-07-10", - category: "Travel", - }, - { - id: 5, - title: "The Rise of Artificial Intelligence in Modern Society", - content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ...", - author: "David Lee", - date: "2023-06-29", - category: "Technology", - }, - { - id: 6, - title: "10 Must-Read Books for Summer", - content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ...", - author: "Sarah Johnson", - date: "2023-06-21", - category: "Books", - }, -]; - -export const getPost = (opts: { id: string }) => - Promise.resolve(new Response(JSON.stringify(posts.find((p) => p.id === Number(opts.id))))); diff --git a/examples-cloudflare/playground14/middleware.js b/examples-cloudflare/playground14/middleware.js deleted file mode 100644 index 1b43c89c..00000000 --- a/examples-cloudflare/playground14/middleware.js +++ /dev/null @@ -1,12 +0,0 @@ -import { NextResponse } from "next/server"; - -export function middleware() { - return NextResponse.json({ - "nodejs-instrumentation-setup": globalThis["__NODEJS_INSTRUMENTATION_SETUP"], - "edge-instrumentation-setup": globalThis["__EDGE_INSTRUMENTATION_SETUP"], - }); -} - -export const config = { - matcher: ["/middleware-instrumentation"], -}; diff --git a/examples-cloudflare/playground14/next.config.mjs b/examples-cloudflare/playground14/next.config.mjs deleted file mode 100644 index 24e77289..00000000 --- a/examples-cloudflare/playground14/next.config.mjs +++ /dev/null @@ -1,31 +0,0 @@ -import { initOpenNextCloudflareForDev } from "@opennextjs/cloudflare"; - -initOpenNextCloudflareForDev(); - -/** @type {import('next').NextConfig} */ -const nextConfig = { - typescript: { ignoreBuildErrors: true }, - eslint: { ignoreDuringBuilds: true }, - experimental: { - // Generate source map to validate the fix for opennextjs/opennextjs-cloudflare#341 - serverSourceMaps: true, - instrumentationHook: true, - }, - images: { - remotePatterns: [ - { - protocol: "https", - hostname: "avatars.githubusercontent.com", - pathname: "/u/248818", - }, - ], - localPatterns: [ - { - pathname: "/snipp/**", - search: "?iscute=yes", - }, - ], - }, -}; - -export default nextConfig; diff --git a/examples-cloudflare/playground14/open-next.config.ts b/examples-cloudflare/playground14/open-next.config.ts deleted file mode 100644 index 6ea08a5a..00000000 --- a/examples-cloudflare/playground14/open-next.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineCloudflareConfig } from "@opennextjs/cloudflare"; -import kvIncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/kv-incremental-cache"; - -export default defineCloudflareConfig({ - incrementalCache: kvIncrementalCache, - enableCacheInterception: true, -}); diff --git a/examples-cloudflare/playground14/package.json b/examples-cloudflare/playground14/package.json deleted file mode 100644 index 282af481..00000000 --- a/examples-cloudflare/playground14/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "examples-cloudflare/playground14", - "version": "0.1.0", - "private": true, - "type": "module", - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint", - "build:worker": "pnpm opennextjs-cloudflare build", - "preview:worker": "pnpm opennextjs-cloudflare preview", - "preview": "pnpm build:worker && pnpm preview:worker", - "e2e": "playwright test -c e2e/playwright.config.ts", - "e2e:dev": "playwright test -c e2e/playwright.dev.config.ts", - "cf-typegen": "wrangler types --env-interface CloudflareEnv" - }, - "dependencies": { - "next": "^14.2.35", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@opennextjs/cloudflare": "workspace:*", - "@playwright/test": "catalog:", - "@types/node": "catalog:", - "sharp": "^0.34.5", - "wrangler": "catalog:" - } -} diff --git a/examples-cloudflare/playground14/pages/api/pages.ts b/examples-cloudflare/playground14/pages/api/pages.ts deleted file mode 100644 index 1d07ebcb..00000000 --- a/examples-cloudflare/playground14/pages/api/pages.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -type Data = { - hello: string; -}; - -export default function handler(req: NextApiRequest, res: NextApiResponse) { - res.status(200).json({ hello: "world" }); -} diff --git a/examples-cloudflare/playground14/pages/head.tsx b/examples-cloudflare/playground14/pages/head.tsx deleted file mode 100644 index acb1d483..00000000 --- a/examples-cloudflare/playground14/pages/head.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import Head from "next/head"; - -export function getServerSideProps() { - return { - props: { - time: new Date().toISOString(), - }, - }; -} -export default function Page({ time }) { - return ( -
- - SSR Head - - - -
- Time: {time} -
-
- ); -} diff --git a/examples-cloudflare/playground14/public/.gitkeep b/examples-cloudflare/playground14/public/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/examples-cloudflare/playground14/public/snipp/snipp.webp b/examples-cloudflare/playground14/public/snipp/snipp.webp deleted file mode 100644 index 366de09d77839334e8a55fb83b7cebd513b18894..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 322224 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

M9Y}sQw!!N5u6yG_1o;N!AvM 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ℑJ5A zUdUEHE;7ozgM_lcQ^90x33iS&FsGY_OH%DS)PoSkH-{+~Fp5D=P>p;Q!>x^4y`v@_VCoX9 zLr4$7sBBpsqpMN?^d=ScbYGm-g(Z2PYP8MqEPj50pvp)XI06r4L+!HE3m}Xck?Hy} zP%%dnsTmB-GV>VT2OdRrH!`R;{!E_wZjeAVG>q7R7CJB=j%LV(0#U-q|0{*vhS><& z<*X?dFGyb&gkD`PM$@c>zB);xg8o3@b64@ZKba<45-Tt~J}b&l9Ln#0>hQ#Co4>sTAe~Tl5hD<<*gpbJFG-{wcbt$zfxA(rkbOcmJ6wdPj)6hX7SIP@*Gr&>?N2gAPXM zMngtK{Kn|BJM8kMP6MTgugnDxZ`alb0(7lx3*%E3P`s#@H6I0WdQ&ohf zvAAX&i({c2cGTf12g+~YQ+*}<-F5qmt?;UE2vu53$_-8c!7h!o*abGtp&$gx|4r~! z{A&!JrJ5DWLLQ3V2Dahh@E{ zY#r$6X|{u~98^@&)Q40673-dSyGzyPQ~|C+jYbw3u^MOCDp82)!{2791WCFAc-bJl zVW-m0-ZvPX6!S9eaImAj6&19yCR5p);cP>Bv%|33tk}S;nZ(j0eY@*9o>7{QfdzSSHO(oCQ)N8lABuL0E z5!fU@3)X-z>)u1?yLD!*EoLe+=b*H?S=V|;0;K>+NpU*eP<#!;jumBO5jK1t?PB_C zr{)~qV#6$`OY|mFw?VGN$yji|vDKTB&9N5kAQ)HQ>HM|jen!2$AtpJ9^$WP z#m;XmBfI}ZaZom=WJAtfUCHxA(qj;2zz$82QU%%e`HJYc+f=P-6QuL#gw2EZN<=?# z4PEFms4jZ;rGczPrR7=JtmW_<;9Y7#xs8L!UCt00=HG#pZ9vNvh3_RdjXnrk#m6fzbLj;P?rtBikUeve3|AnyWPl1rV#lx?n8 zWCa1!=E6tCX#lr!Rd<@v<4zWs8}YJk#ABNR=&wxSAK5jvk*ITAfH0)SEiC|>n-S48 zbgeL`PMDjRenwe5gqpEtEhCfGd~&j|3x2xK?L2b1|B^KNl1YWri!8&Gq%H|0B)dHQ z%I*Qe*AoH&_0nT$dM^-L7UvN%wkg<8;%U(!x%63jpN`KL zZEI*5F8`{+(TGYK=^uda+Y$nJO93E|GOic8fJGG7Y)8tH_h4$A%Kvsd{=ph$7} z23b~XxxqQzfD6um1ck1v9ugy$RwxWuWA3ZL!==rjgm1OeIb-DYfjGZPESICdhn?CR zC67jTDT5OIJwMmMw+oSHg_j6s!O%&noOfLt@h zs$62D)&;#psg!>Wx|o2iuRB4R6=_e&UY%W;_E;7A4!c^$>xlbV;|K)5ioZyK$uV`N z`OGBd#GCg}XDRnYY$+4hs!iQ%+%EKH;584e%!;EPXL)1P)Ke7GBl(0+2i$EA83PrS zO?2?VEpYktVDhc6#fxV={#O~ADk@&dhmhrX0>g+(aEne=;EGrG8Id(K;H`8jXisQ4 zzx(g}16T2zTke3kh26VvKgv&Q!rpz+bg!2F5Bc`c{~;-T6&yerL4-QCtF=FrNmH0V z`Hz$Vg3(V~y-CkYX`c-S*|Es@QdTRwPWeKGh^SoN;uCfr15?OqV^?yXl*F{y=P!zy ztUg_N6X{MB{(-IfC#)F`?-k`MBLiaCu;svMeTu` z$2|>V%pzW86q;DlwE{(%3{GGc?l|0C`QE@@_!Ix#aKorbEN4^z#gZDUAiJM0DKu)- z6P12UTpU6)ftFFG?79Pf^FRCc!NL}v4UkJ@^9DZ2U#2&Qa77Z^3`oBqemlW1LeT9? z+4pPkosL;%o>aY~oIic1zmv5g0A1uo9w%!)Mz3n%cj3jw0JS2c+h6lVn4ET?N;A`m z6uPJX{ph&#FNR;4kf2y=#=F+^w_9vX8ph;`_MhG~1!?s2gRX z8t{=D|Dp5U-&}&$&B}5Qghv!yndWr z%DX=@Y{`$#Wd` z6EeotFpAm%p(AwWSiOw>JMnJc3C^*KIfVVq(bsVZykU&U6=$Xo&uQx*1zW!_ZKowwcA(%tMl#|QNqMF24} zJGI@apO&t{gPL_aEB0#jMIFJV{iWGm0}RC(l-Ng~ zHiGdD4&O?g;3`qODP4m{1v9yLS14i1#~Uzl^PZq@LobW{8S?L@AfJZVPAgxZ*6#{4 zDgI1+{J`tDYKG{b!+oZEv#n9G@7bn9FoQbks0U>kKP6}wnU~{wXy@Oe$MWr+r#A$F>S6n(8AEr?X6BilPRrWQss4WR`Pf3%Lz8y)(LZh*~KFVsX$*WS# z6+L%YeB&?|iEEXNbSFm=Ker!(7cZ9gE2Mve^VoR8As3@( z*4JhB3lQJiv@Lp|MS*0U!NwC6N6JwgU(j$CQmMk7g2FGmAFRUA1olg&T6$CaT73Ck zuy{5=L_ku`T3;_C36C7b7mvJ)5%W*HUSDXSjpF!%0MVI z@iS~?;|PVTat5&Y-)fK5=?z$dcJqofjD|dXGgS(fk7rv;%*)e)Bk~nj5^T?jU zX&WmMe0k4~5;@^0Qz`g%rubN=Rwi#kLst>fL2ZkSjC-vQ?aU;l%Aq{y0GW7;Ty30T zMV)E`-}S$0JPM>unLKiQfmB1MA(v$=n;WAgU)Dh0vIGuN!7NSY42x5iVLr0TF8%4p zoft{Vob`Kfi$1p_oQALYamKhujB0D3-CYW@SEdHa~4oE4bm zc2f^1cag($>BP!l$zCR|&TNmTA$8y}(PZ@WPkc)`E=xnMet^v;rkmfC=91H9v9rH# zwt=2D0GPxU@fBQab`VFdiL-&d%MVNf7eg^*GC74Woq7H8l2v;uMlm8cxRea?>-^Qv zS`uVr@+Yl|<%XzOak~SKI~r8!a~zw0VBB(eV(W%SI_V&AEKZT4 zr2j$nBTg2LMYDgoX-}Catc3OcHd?5HILBdlK3b&q3(dN!EnY|@!aKa@@+3H|Fu&PB z5q|)!#8lo#t7cK-Y=Il7qe4nPR>-cw=+3!`9-YqlvP^s_o#b~3QzFf^zW(9ffD>xf zA(4@lq&)VS{1OGpI64*5xpanH_#p|ZCT~kwd(f^%byTh$3KVm@{i2-2Hde=+6mgqR zABg--ZGpo!QV`!qB4FPQeQRFKBu8CZg*%F5mL}Rj5J~&%R^>XDs1;kz|9w!wBJZ^c zH102cs+YjJgCg{_>4N1@g!sDA-sUF0^ zhCqeaC8VRo9Y$lJj_aE4_$EfL23@cRLTK`b)=JX#w5wmSOf^ETBm&3t{cPX0Km$HS zF|6ul)_I(3&T32;-R~%E493`wdG!ww_5GZHTBk(*EjR>p0w=O*ed_uBZ2pRrR<^__ z?mBI{%R=&9P|_sw_-6V5`=H8!a(^1j91Z0Msn)>^creQ>r83RrkXqZ%x_0^bEB*#2 zAJqSK+#p!O|KF;S^QmkJ~2Znwdrl8`)~=s_*re zqlR~anuqMPP<#5mO)q8xmrv_6+G4MKE8zOUMB(H=;aZ?wU-*eAs(xu(|ML%quVI?(nogL(9lL_`jgL=#O*>M2fjmiAJmVTX$7wlaOqu@GfB6M$2B(B<<%2} zoL7q&(|LoMh`FvxkP@42ztc0HE7{GuE@P-8%c>`I*3613P2kqTa5o|Y#50@`i(qm7 z#$a5QRm69(YAmpD@&$OEDZq*AB%7C0^89CF6f5bFa0=nqk25KYexd^boR5bowFet= z{RX#h$NemRRS72=xe~gOB^ScfU9FlkK=tN$m)Oo)9;aNR_YofS^dtSaDLVbzU^~}~ ze~kJm)GE8aU>};KEM)$wUnv6mtU>NyZ*)%(7d@vY&6QfmoyPN!q&zEKsQ6WFG|D9}*gsZu zw_QW}kc(Q!%4!RhjCdNxC-nsfbzN^c%M5Re3xS)^ zvbwpeY`_d4@DO@k@iwz6Cz2)(VkgU7kE`Y~CvsJMTt%PLM138jI$LjAsxr2lO#sHO zyLgIhb(3tAuBrTu#M8o#iL~lAGVW4Pj%koV{(S>7qcz1WV=U~6xkc2Fos z_~ZHmxWZXZ@IPO0v4ygtzNi*s&}Jm;DgmV>;-S77^DZ|c==u|w?ZCcLiHWZe^&$b< zRNXB$g~K$if7XX%zr|c%rwgtN#Eb^%JPfJyO~>_3@V?mSD1J2Y$VkBF7?#bt6;2!$C0``D?ysG|!qV$){- zIud35#w7E*anwVpEhQuZw}rviQxt~?aPNCWOgOv?nF6o zu!z;vKxRZW~+X*uL`l=)1?ROX?oNQAjkBp16+$+U^$sxQL&7EJPL z>ryB_GGu`+jG{u@HzOqxscc#YN~@67gml2PkaEL;b}hY6?(#Z@s=ZNb05HG%69FUC zCuRl1&deqI$@w=J3{re1D#g7Rzoh+G#UMlF64&Q=C%8`EpDyK3#Lau=+nRvWU9k>H zFZ~}I9ic*RyzF9scKj4sBa@yQZlPq&?nvMePy{PhYD9tHNue<7+*{FkjS?%)kAsyP zOeMC}1L2ORg3{RZt zeo($Ye(uig)u-In{@_Fh$oNo{BRoO_Z5Fdp_|^%5Ty{der2KN;4Inh9ky`F^x%D@& z^!$d)TnO-YrJ{zEtNp_>rb6 zx9-}m{&p2G@>nDJkFSSxajypb7V>V=w)4KY;GH-w{d=S7QGgG^nj($Fy2P1()Hb@O zr2M&g3cLeRzAV8o4-pUf0-pcIU%xzhBZ1}96i@=Vny_r84;|b9Njz&UPX64b(5VOh zdk=L|eO=ZtKS<@FsUD7)HxJK_1LeR$n$FHIjJ8n=jJ3T_QAJCUcHL(>zodgO@^H5Y zGQihrPGT-EFXR*rt%X`y0t9UGBV+j=ATmGRjJqy@42SZ?yPCTS`VQa>IrXn5 zL?mGCJZ}3Ta$8!OZ-ma;`3`Bez&L&#D_TQ70RaXpIt*!h!hkI3U*g@${Y#7xP<#eR zttC9vlp7>Z%AT0i{{%$r(is5t z*ep{IZhMCZlPeucxwL&7F_V4g=(BCW3F%m9#u^tqreWeBx`jr9ZGk+F(Hu5IX0FfB z2`Ift>XR?x+5_SRmruiPZrzsD+G>U2=#ZJtyyo8HMDJ0J@(Ab=28|^)LW(O{DAov+ z{&Eo$Nt6BS7iz0q{S8L0qBl$1y#^lk))8(EgTMDM{xr4>DSaPu3@8BZs*2DrubgB~ zhyD}UI-JAlpP8OGw&R{1quCcS(6XU6eZL%v5YfzqU$Wv=hAvnVUUJ#%IWXWEOB$<- zjy^4nz~KVH*^X(uI;$%*OOs=&@F4fBc+2xM5qd7m-i-^GX5UruEEM&c)+yw^`%+X@ zxb^Rm_!o|Zj0%8jl8dP@SIESuD5HJqp0L^juqpI;CjsVI&%^HDn#iVRbYH=1>lu?? zafBw4p8)k}FgPdo^fiO$H5NjIzhK&EY41-CMqgFWL$R_`-08X8+V``$1T*qL_)!2w z6yyb7(X~toQlFk^_x;;AZh&i{zu}_Z7;4OjQ=I-MyKe`mP4Fb+;DdkY&jSpmx{ZSt zKNq}MSWhLW7j1HjHH%FeZudqT7%8l*68sJ#uai~>AU27VJF_>o{}wvvu7X*W-e=Iempy7XG*!^4dA zkkMc^5S#gq>@A_yOn_@ZKQvk)E0_&_TeNaqjv${xUm|MH3(K;J?_`6Jy+L10k1~6{hyc*W+H1QrT-+ixnA$tDX}R_ zAmAkWsn2AYqNRm8gB4^}4rdSvU1?3u{<3OG*cPfHq`D{`%OV)QnHe-r zBpP&bk*T7GgdSUOi7pC@on`tCz1lXqSJVwRhf5A8(iaa$6~clO{iGn~Z&JwwrhB#3 zGzR;kgw7Iu0Q1KXXTmTRf@(+WlRWVVI6h}n1=1J`QSV(*XUr09L-=#UMTq05LyT0c z< z_okoKx-Xvn9tv@AbmREX2MO`p{$-W6clehCv)LJrI~mI+=SDrx_z@TiPpLrd>=lde zFgKk9J@9@e!|A|1=D@KBksat2S&oq@;Z3#M#+H$6$XfbXE~8-fKXlL#1mJ(_QGIgh z?UxJVnqUY@2BpHblm|vojmNTJCo;Mm-&@nqQ}nkpi;vrrm_i=KcfO;9HC8j4p;^p! z#rTJMi%I5}^w$Ilwj~g;9$V&*E!~Ae&e`|?ywf3H!ks(Pwji9^{pT0SDeHejw=U;` zR7$n5cJwKI>O}ypDV8^k?@0Y(L)Q3fvD=b}eh zV$TZizqa5D_=)r6x-6HBUdl`=izqk!|7lElx@`O($N0EYdbUA##(id8+$8ZbDnWG^ z(?g_D1^VF!`zfj^%`-mfQwOEaO5++B(NlA7f5CP6BiM*dIq-M9e)2&PgyKSRniLdHd!ty&LAcv*D>NNgYK~H3i0xLZ%!2E^C!pkv?K<@QMe-VFayk( zxP%m9Psc%YfjPq0uAfvOA>gN@5^skCh#J0jJ(ePYM3eyn|S)$sGYHs0MQeDOAO_HEo0%jrIE# zj2!UDevWb_!LQkuCysXkUbyceIKx@s90lf~5j!X!L41<^M35(v(TJ0Zc9~8M>|!8z zebDGF&|v-_tHjc82!+UOQyU53^_&wuq^Si{O?R6PdYMCr$x|hr0zaTU7+ohpS2(dY za2ggRsnEN#20gN~?=O}4#_Dl+w-gXnTea|OzPIR3+_+Z)`ac~#oqihUgr2Qp{ul?e z)Z(+OT1bxz!#d8kXc~keG^4=$< z{gfJvnAN^XCTO@#{*+mEJQjW%jprp8ZZs34O?p5nkX67x2?th*pkwoLsm6$2FJXn} z%H+^qz6DAh%5MdBGHuxtF!Sml`PY=zAiILYZ2za4;O4^Q9NRhpMcK@PTJa}u=JO8l zFuP9w&2r1Vvt25r6v!oH;t~ng(HGihnf;e36dqA%l1fP;;QoAf@~(X$c=W%e{#+(o zu+wu)=}jgigcoVqoH$DM3?MohhBifb481eqZEH(ol)|G{cgd{dQqPk#H=y_-?+4*X zGu!YC;T_iOwN}Hq9@sNuGp^v`W)}oAe7YdXBxaDBCdge{dMYRi`&*YRzWRa zC_S!l)X7yxl=1Y;G_oF@Pe=I$WX*2W88O6DYjrjw(xol3LTUFJRbDjGO8Q<{WbM;c;(Fqa8GP?1=}>61s>@Isd?egCSG6g9*I~m&Y8n5rizQUdj_{JG(I9>6>BgorQlP z3C@p*d~pk~5F5P7I76iKhxwUK66Z>tdu-Movxa!_C|!fC@iPqxNVKL{cw4QRAO^U;o#l#*uR^ z(80xvH3?0S;amSK3+ZhPe`k_`=5IXwOd>ZPsY#92x(G#NU8&$Teob)A<`P?)y#l-i zv1}pNQz=TaErEJdmWzPL?cPvj3nb^zNJhh3z^+^bCneIyVAr)Nyor6ZaR;@2N2lgi;sE zPQ82_OwJ^vgVd49Dtc0{PmN&9KyTt(c}m6Yv9RXnU!aX%UID`yr`zuX=-i|6N~52r zk4_85N4f57cj1q&Op24TrMI*#ULU$z5QaX2yt+z3eosQq^1036-2BZx6)h*ch*wNO zNgN2Z8}v~bsU^MrXP)mVZcUr8qKPixIR}JfbSM#pY-AGdLru#4aAG}AugZGW?kWHI zaNFd-K=1cZy-T-}P*9yYYwSKE;(dD0y&;YEL-dnO^fwEBfVg732 z&ZbvBkeFyZ6LP8j zDaz!`#9RQBlZ7KgUDQ7$m!bCD?d($auyy3CW|gwvse0aj1e-~ z4jY%1G^%=>c|!2XB{)|jiOH*t@AG>6dS|Y9_yIEkqydyzE8(XU65O+EChRUW!)Hk+ zcroEfWqNNfr_A&@B`cEwUHX^v?q=hQln0pr9EgEI5n^Q%J${eCdtnK~Db3#Z=S@>Q z#6tq<)Bl$hJ~oZfOv!`qGK&gYIWI;sL`$b)kKCH~V2<7^wG~w`c#PpG$30ZHfhGU)N zYof@Uc1cZJ3c3iMY2>)I&UAO285~Aq(h;Q0n2eV4*Bqf^dcwe9$U3=^=Dl0&WKzS0 zKHb>cEmFIVx=F)pn!YU-uO6Q^-Y`XZNevGB*y&Sc&_&wW@I*I`JT{7Fw)$X--4Js~ zTEjB>TSeSiEOV;fQ3cz`?--6;z|49>;5yv3RgO>o4wl60=8DcZz{ta57OW@lVUHXt~7pVijet^Jn1YiYt2KBnABc zp$Y&Fj#b*vje6|<+@_W;k82p#JAkJWQ>+}N#xBG?u_COmQN?P&tr6iXA)&A^TQUu% zuwr63<_TTsftO@o%eb2RW9X%gdgyP$qGla%Fca<&M-?ry^URBr8Uu1V(UG$SSW*kX zMIHQP`zd$NmSsK(Zo11*L#68@xm{qE^XoFN$dOvOW+jh;ZKT=HG4D7zG^JMO zOqXDUL4GrKxd5xE@wDcwcTsZI;pqkiS>X#h5XDt4A7Yj(S$K+{&E!9T9fgJZ48X~6 zdG~H`D=;8Q0=ed}W4V6EhT?K!6!{HnDYykPh!|wVTB>$`R&MKa3ES)^sH;TLh=LH9 zpi~zzO}P-5_<%MK zi{H#3TlQYa+Owyw4>K<0I4;3p|5Q}#S`K#dL^8@61};5C7C!!tRj0W7QS@Eq3T+xE zqXu{Q15{z1fHsq@qko11gX~YDNpjot%C)jeCWnPyxc!44a$7<|c^rKjUbPw9ksaE} z_U2l`lo?I}Wrd|aGb0GXc6jxp5<#KxlJC{&AJ8_SodvaNTe~ZOLLSld*oO;?Cqh|C z4we=vk_a;1)`E)SFl7oI(WKm(~vAD#Q$D z!f8_@H{0Pnce24u9?mSM*Hs_}DWBe;RO(^0Vl6h22Kv6k>RgaY zg@lKb#_O*YOM##FBOo9z2MLn$3(y;uGF~i;+_Tr?E~x+D)CxWYj`{X zW&du0(X^#JC$+{@2{tp@uvl}Vct6b0c~zN=st}tru7;E2&wDe4zts#}gc4ZwW_c_b z)jn~_&)IgwL=`ANA+J&v zDvwp)-UN;B&=}vXQSwutUSBTIIJth#NdHD_4URVoeynZa_Mfeg!;*Vro<&S!k!Hts zB@ZT`$jN5y*Qgp*w=A8XfTqWb)9-l#!f5KM&#jEra|=``FMnz$KF_Rv7hw-_ME)Nx zlZ||mgky9u*>MhNCqmG!^%p?DTcM}BGR?D!5wb)k!9$Z>-Q&=Wf@zg`##E>Id1)FN z!fDtzBf1${lnn?O&%(pqZG{Z1lM=rwAY7qPbvRX{3R)+45nwe%xovuJ-YjFtrus}} zkWV^Ui=<|J%dlFY4=Wqb?%*SRsEXo-ms z6d$&IgCx=rYkE@;EHwE|e?Z1%AucMgLRz!%r^^k5-6Dh7eD_@AnB|h@ZGly9f;6!w zW2IK_ee(A2x7cl-3~~Z^Emo6)MO*hRni&>>IDY#1+bJ16i*HG#RFP~5!JL*>vVY0a zl~a}tPMcDq9qpUq+2k*5-Nc}o{TtIu#;7cwQJvTHU}em~qpVZ0WIPPAyBt-PR2NY5D^yqhA7aA~_?EZR z*hGhpb}pDPl^dLIX&CQG+s74IzAf15guyue(9B=Rc z;Un~gJD1F)NvJoIUypDL+=(PL5eU41jfhdJ+cF$k1z=)P#z|}UiFZm-Mi74Q(AbZ} z0(+7k0ff66-=`8A%C#F$a`+n*Y98|>$R|hZvp~i^xJe0Xa_YEtL|xRvX=8@TLr)cS z(H@w{HG}MMCzFS*_1l`ffH{-o=Nv1xHV(f6MljP_ukb`^{Th%;fie)jX^utH=z+5) z^MUav$ktc zlV1Jfy^}IWG{%g_U?8b4z+;}qI{eJ2dNM6-EU+wUx8z#ElpxIRtK1Am?>82WvZ$#t z0h`g*CX{`0%$Rp(RX4KA^@^L!$2PeSGKUX(Li;y1wL=#x@V*S$f^M@~?|paDqIG#< zvYt+XIrSg>qan&W{IM$mqPW7Ghw>6Z-f#@#t^${zIEP zunu{Mx1N?E=%bEOBfH84*tVZhG=l!~IKNLFol@c84N!+0K0@9u5yWSC;wvYov;!UE z8a)~FN3r1P9ndex{B~4wDpRu2G3lUwp3NmA&IQUnYy;PObV&e(y}4r->m%lC-f|Ve ztvxvPR5E}mHY^3r&8zEHB2^%8ngXmCwBjGX{NBpE@H6V;FuW3MmeWDlnOKDHZ+ZmOwDn`E6s$#+or-pBt&{+8H4FX!Ck(k6F!n z_!crB*`4USqP*0n4AR?SM~_?!`Inj4gg>_s1ux|VH{A17Ct#tirT-(@URIVY!|sPt zMyd;dRuBO4xOB#x`@CeLh)w%RN>IC&x((ULRDqCY`7#)y;0bi}tI_3DHVO^!@aQHU zRL3G_bzAlu`2LE)saDovfXO!ag3y5NOqN&G7pUWr)w*0Yu{`f34w}A<`ybri5md7f zJqoP;A+jz{Ui0&)2;mX{MrYOwR#V9FR)oTN`_Ve0615FbDAWPkG^Gfpq6_9V?imruvUK<^Vp{@JltQ0-A(+U2KfJmO>0H;7HvMpLzrwiN z$yq_nvMoCJHJ9SNy)iq+JV6z&?#lBF`U5^)!`}{?xIu9y3Nm2>+2i0yBq; zksmbW^sWK#8->hJ!Fa(jBZrHj;~RNxYf>3)}I#{r4g{TSFF83IuOt zG&^ez7>w0Vw#GuGjou-tne9Wq{Q3zioNuMBZ0(v6Pg%D+CU!KCrS3gnrRD<^Y(<*q z572Yf33)#|XbtJy{)V8CEi$0q7rIO@ zh-@814+BrGT{>HY2sxvWyj@-Rqsu#>Wuo=L_CJVZv0V_q^EmX9#uJD6YK*=?EB*>u zD>nD0R(@(z7M~n2zav7oa*NZrYr7)sGz<7Up4;(OQG$Vt?GXayK064@k}I@OFv)5> zsRKWmX!@}a4WnKTUub&+y;E&Jq&TF)%m!yI+_4gaj#avcCb358CAmfALJjMZ$#`67 z5jAm)6{3KVArziDi}{0layP`4Guc@4H5n+pMVsf?6b-4F%O1cHs`_IqH}%hWcCff_ zkYfC6Yi?s@pL{^Ka9pB_?b}!+!57ES?@YHquZQxNY;xL2Gph9U?Uo-4HoYSlC6IU7 z?_?z6Ea!3pT4zCL3jT5kb@<9V0*h+w#Odqp;hVIb#6;*H6e_GqTSF=)0PxZ(nxlvo zVblDFb+e8c-^A*i>{AXl+^;+Qt_W+mSymxl?l@(%b|H-W<4QvgYYUSxu9Osu_^jz6 z+ubWHf?G!==7=7tSBnZiTl=r`ofnTgQvv1Xx?}howo}C`NIIIfaT;anvd>p?zq;{| z==^8|Fz%4uqH24FuKxGQ|#`e!O<`h#@%D*ie^yWmQIAqsM{Oe4*g|wyM zqv{z37IiA_F$?*q%dD+~_#SXVudDe;R~ObB+4zvw$btcmI01*guQe%_^w_KGLi4Eg z1i^zQBI$(*u?+{ni;U}wII8u!UomHY9krDZrczCL-#d|UT3CPrgowJ}X!0~GgyF1= z_rZWC-yd}sYHHQ73;gLln0KtS%_=YZgsvwM>qIwu!F~G;C%{a&9m74a`q;YmMvtRk z;)ruSjU@6uV$CKL3r6KMnNa} zv_g372LK_TTF@vKY}^#mrrunO2-JiZ@WTZ77(qWSQS45WZ-5Xs2!MsTd=A0~y6R}Z z2i=kB6C2J80HZB4ZqKaHka~Y0Yza4h3T)E<9=Tov8y8a1+AK1pn2G3mW(>U7cuPE0<7OgBw$Q%QCuW)7YkngdCZ7voX&`P z_JfCE zKanqAfHta|O!1*2d*k|2UEuXT= zkN6LckP6EG!smrcUI&#Yfx~9~Q_$w!IBeDPtl_S;3-xGNfCem)&WZkX8fkdxgP&4Y zjXi~!9Ql9~ch9P>a2p>)JntQz*%XwmD#4(kfs9QuVl3!}Pnv%EBY8lE$hHN;w=}M< z|5f-O{rjogS?mqMP(oh_h7H4S8iZU)r#G-`=<92xMZQ&X8c=l_sOeo4ZrHU~`+YNN zb40oAxhzayM~~RVDdAc%A}WL<7KVn3(NP0lL}jhZMwZh~`R>&xV%2 zV4)37HBmn$Wo%1GAg_4*hZylMWsKRuIDbL= z^ifFQK#-5fT&wTvJf(l=W6t|$J`6)Y;@7~Gs^CWoARVgzUWIoQ0!tOC!y3YaXyYsA zhXjQpds!Gz{T7<(_tYZwXM9|5PppbkgY=H^uEc}WF)yVGY9tU$z3FvX_p__@IQTB$ zjlflM!--mA#SI{Xhy=o!Uxb7JR^!Wv;`!voSe!cnqlqYnH4}vSZLSbnnp*pYl+$x- znhyOsFXN&aOv#)-zzucAy}=S8!PIZ;{8|7wE}3VWN-Byu{x3s;RR;7 zfSh3s_9!AFGPpGW$_4@M(5S2!bFn`>Qa06+!`*L3yGnrmNbd+7*) z{1Xl#^g^=PuTHz*wm{rOjF?o9ilT4a7cghQ>M3i*M6~KKAj9#b5XrdDAEqm8fWNkq zlbPxyT|8kk6<6C6x(UsEhLCIhI|eMaosWO-fn? zNPdjMO*Qjnx*7xt1juc06!QaDLFnB?mdiU&TR2F<24jH5{%z>kUU7~;Dt$5gt}=MC zL+VjR!J@Ui$H-)wB zZyD56cB*;*&cYGJR-3w+Ym|M-GN?g2@_2a*Q-eMJ_yc%sBICF&)f`j7Su|2z0znyQ#$7c(?z& zq?$pQ#!jDBP{|li5Ji0jx=BI2Pm_ccWn?(E9zXliLoN!;_dXRQ#6DCu*4f*vO^({+M{^q)UZf z{;oHnEAwy~cgj!*LKgRl{7i!G?1f43w2ZhJ+vE# zQ6?cBFZS2{_*$B&KJ-Y9qbSQC44itD={)DBL!@L%A^H4s$l;y;+mW?ECJlPt(5{x) zn4ceil}1&FHH0{yCLs=zZo@h@G5w;%slNG+We1|VTrN*?nUP60WuUVNAhr85oHm)7xc zqWxY>I5m|! zNUj5Ef?4}Iwo;aNi1DAb&ppS@$siREv6(e}8bs81#d?$}qYT`HBfdJd zGRLD@mnx*!^<osWB%}9f!ze?$v-~a&ns%xikvNMt*=gg zmK&=Fhj!1n_`UZoo${1UakPRPRlUFO)%9+z1zjRJ>UV(~+B9wMqb@0ZE?3f#7a|?G zF0ep+$UO3Iys^UNe2EA;;0l6IgN(=2b@c12#K26UOPUHSQ;EQmcpR=*5sCWoTcUo^-^lNTkpC7^+pC*}xwjD!Cv=p5Orq4u zL7S1UVDMUms}wpClO)pqo5tx$ZO!TOjl~vS5i^oKf|gh$bV-`)=#Zb|EBsf@V}LTI z;aMrh@M$X;u?{aHnCLEzdw=Cg8vcirRR&f$y6P+Rdo^j7Px3$CQ<9?NFxRf+sctB1 zsn5x>Bn*LKCmrt_*U#y-1rGw#^$ZVd*2rV4N4phb*8eR1ZlC%NVEVJtDPzIO;rRub zjo<-8)Y`hw=D}b&=PNfWbTTv01kQy$oVP3ovV^U&&;c&29H7Wmr*9n{zROIo3-G|hP2|jJaoT7xW2wK_sD-1cmW|j7Dm<%Hn}S6 zWk0jvj|FjG%|i${T9qo(d!bQ_@k;MD1MP46!Vnil0?Ka8_jvb*Ui3 z=!ZIS%gbr4`BH5(5f-P~6es{}r62ulW_NpOIIE)X^J_mf#efUA3;c-ep{umonNp%o z1?)YQ3710FAD%zDI&6&gzsDz>_oPyz?IL=~0T=YNifgNX#1jSuEUATti$CP*ut|7Wz#X2I4}V zNIU=S{28u2=dRPW*}fvlecQBqmry;+qU5H80UQ7sT}NjR8)RHfaTv`vqB5mS-7Hb4 zAvBYFkWcMD^bYUE&ymq93?hI-zQ5Pr%vh$o+cqkLF#AU?#wPd5rg#EW*AkN0lfpk4 zZ^N{QywZvt25^RRdep9&zA-D3tq$j=4CHrS`ssuHpCkP3gW6Ng4{WY>6R9+7Z++}7 z?0B!0*(P&wJLj~?Sg3=C644*y78l9gMUXNr29EDU#@Z60+Fy4*Lw+p&)zBY54Wl>I zx01qmxm<+!uVs_a^LpCofYU*AA)tA(5A$5ENvAR++n+|ni_#I5PHHg6`7K6hx7C5z z>Sd)CUG0{rAefCb;)b0DiefMhJ7{pT*|;nf^eWoZ19l8kwHY75D3CZR6;Q+APmPzz z(~nuzv8X<1?~aw()l_oHpX3fxQ_eBv86hZgoQjNxPyVM>?QhINayAV}8@_lH1Xak1-AXd|V+XzfN+*?&#(5U8FTDYO1~qfTlnP$56SDi@ z>dC*|3{MSde{pc1#bOOQ5>x67-ME%F z+<@3SO2ifIK+|jvoD}KuFEe(m4apn@)~IX6`D2$5naVp6vg{6%6S>SVCb@%RNx7$o z)vGrwQHLBZg|@ViZQ5&4WsHXq-4VzQ_1>di6G{|wBcsK3qPDN*J%W24t-s#CdkI)q z;fh~?QBKIzyr7yht>5Ga9Czhs2gGyLVAXd;_$JvD`lh^J zb!N*asWH1}F@dIOs=+*qUA;kG)1%xmYNjmY*UD0wKEnV4hg!?jhIGau7D zdva8H9B{H(oY*A-50GPMwTrZkF|A9h8OHTh!p>QUar>M&Ny@Vbc{DMx_D*A(3_7I5 zayCsarw(+tk;OWsJi29e#zb2>sWoSxAtLVlA+;=A{gc_HXus$+%z9jO2%i}Y>k+B@ zr4PTGT*Ldt*6jgvFnq*~^-+LreV~Va`gFk_pwO(%HjQJ&$bK?XcaQW;a%d7j?_EegYQ}5Zwq#L=lA+(T>K7yt3V-(nsb^eWJQ6;i*8Iy>~uUdE$ zPkW~8g2Ih<NmP0z9&xIxC{3b`rxf(t{LkpC~zt@0!zA-44Hdt8=Qd4ZrX#R zKFo(###-Q;_s}%yLI(c&_{1&i<|3{~j9ua-*!>#543j%wsA=%lLzHdv|^G7*#aF68(6?ixWIYcg9Y7%{^`EU`de z(B4~i;y_uTKvcSZKWT%^jY|EkWBj|l;6bxQ8sdG@b`L$*OKDUK)dGu}vQqs9sYp{A zL+};RDX3c}w%t^xU6B8k;eW*DOA2ao!0Bqeg!*j#Dc=E^j0tR)Ro2!)4!YrGDe-AB zMrJo+;j-lm7r3-^3z4*~p}0B54Jyd6Cy6L$!8rfP-@kFi)L6=-GR%-NUuTZHaXU^l zGH3crxgink(dl3V7UP=>LQQ-BElZ~uvxq_WoQUJtcAZvS1ItcFfHLhq=!L|BE@DiM zOLBJ~yy3A)sPnoc-Tt9Rp)662>%@9%Z^bmHe;kdv^_}09yz|n^8lVqX_au$LVBqfK z)`)P&seSYf{K?Iid85VgU>YSC)2G>jvn#+(*Dkot zIL_XYRb3-j;L<3y+KMCoyfrh zpYcsv>rI$CJaU0#CXnuIlq7gvS%rg$?ZCr;d+_f~G(PgZAMy}ZW2)CJ>W)&rP&d=; zo>>)^mDt?4rBNYI-LM3~E|T^Y>IjF_;Qy4bCL(3Ym_k9dA(HhmQh9S0ZXyN~p3qPj zCCc3Lih6lX_nY^vU1LZEf32P6M-zt-m7-sZ3ea@okfy!c%#vYM8aFFn8eTth+DQi7 zorQTU<5bWQlKm6D$z~66ioQVH;|x@7ls#YQA90<`0!K%MVD+1<$4U5LOI-10NQ1$43Gnu zX4QXSKBQI`=YkzI?jzwf>|RsHB-!E6m$QN(f~8yJ`Jz=n%0}MTLyO{xDes9^O_z7@ z2Io`UA)g%O=X_yfT7bvL&1Hq+ks}E)VWlW6P?epgY~DdAg%Lv!$2GHXMc^4F%>q;8<+qrt_^ z9a4-e+M8ha7{ImuG|^z@9}ckzp-*YOTOmNM#N(>pl6}N;f|Kq^4W0ZbyLgKm%;ZOC zvI_}~yq~>}V2Mj1k}^kZ7szcHxB0!#7Ai=+5fcQ^&XEO}lLLR!KfD$XgVR0Q19<;C z42*W7s;8@dAFzYviqa*`jn!hTTX(08yJcI@=5q^`S~_XFcDXV*cpy}<)wdi#kbrF6vGsJVa5am~WPRhvg$!&p(132ZMPI^oQh z@m;vdoZ~z*ZcR;9&TePLnbLidQZn-?LbLNd#?Qhtgtx{@Y58Gpvt zpFBn0&>7J1y^-pP2faogE}$)RI_jN_fDyFuKN}PK^hLddblHq-#YiS9wMnE|A~YI# zD0i37{d6ws+m>L)qb8FA1$^*|C*#a>1a0i z@E^T0qoz+Qwe0JM$iJ_~$2XNB0{uj+u&AM2A>!x}4gPILyoT%Y9~(0A;x#2r9GRq{ zWU!GQg3@ls{LpdKKe}j4(0*^y;{s$*?|gEQ2tRcKj2&qwf1x^BODnQHWKT4OIzMwH zxD-M71NlEx<_+E_)IJLs2WPz#uy(P?tT}Osu01}>kxb0H>ncP61ep~Hy&Xss_c;sA z^)63fN7SmFgvKXaNs@^}l18*>25Ml9L^m9bJQ10Dis?a*qIgKwE6B7N(Y3?SG~uQ7 znf@Yo6OzN!d*;{#kpsE_68)}wJ3$>6O$YbH<_ZR)UyvjhV?^93EQ3#!2MLvta*%7~ z<2>1TO&ZxLY1l)DJ%_BvlKk>LRlP>z^aKx{pxBPMBfyERNq>6A4YLi_f!6g)GxfMX zmH25Gx!qX|t_2=3Sd@Gdr*qi*kNQpRTjE?3A%yHG8SuOI>{B}$G^bfLv>8K>PgXX- zJ326#_LIxN1#g{{JfXcjX7eHPP}(p)eFipg+QwVpt1UmV7W76|PZSXh#LSuAkAYiU zp|cs~iDdGp&Ogs;#_JPvkyUh5(NAuW((GBk_3pn+SD7%oAd72m)ziGgU-Sw)s_@r` z;ag5Be`nOx_r`UXBD?bd-5>w0AR<%!cM2zL+}+)g`#eSnhPoS;tSHL@e&!ulAk?3S zLO%V#&E&^Gq1Kx%{AcAXvr4)$RRB~&^~BJ`hrLNc9bhstCEc%N=%tJ5#;$tz6(dZk z43I~53s_`5c?NJ_8>x!y$k$`uZj{Iy9X_DXaUMizYo2^G5nsJ-b}DX{4prCzSxkAp z;L?i>s8CE4FcIZuWNC|cOXfym#q3j2m9z5DMZMl3lhTk-i??TQ@2XP0dnSyGmTSGH z14?zilTN*JqS6QREJ4@5YtCqGBBFabZ>WX3mD0F7nQ`!|??OYIKtUd|;^Uj?As20k z`mgrvo=c$Jb0P9U#8kR7-$%8+!d6Ez0)ke1!s8?7h3)#tv693Ivt3#5FV4Ej@AP|5 zlAKMEqr|4TI#@yCJ@)`vmH2QqV*pn8)ZDzB z0?zM8jK5&-2ns-;5S4=>x*#A$lARf7VOw99L4qfSiD_*LuyfZ(Gpsw1D&k;TA_!xM zM@)G3`!#*g+YyG)6n7$uwVCC#_y#J%QxB_g!e3pD9WgHUli|@Z}`{Q zLzkLz`NQd8PDnwZq?^?q_|GeGFBaI;?`}32<_ft^w9aFQ(J)+0VvUn(NKQbbQcls5xE$oY;}0uF>uTM+dRA5kNGFkqd8ow% zwG|bt7N*~)y$$c_x6R-|_mf=s?)2c+jNyzEr=-9vY<^0zqRn=kb2SGd5AmaLrcNYj zoa$R4+>S%UQvMb~Xg;$et&12C$om8qm~{&}6p|l$qD&9#q2VcZg13@MdvKh6>5Asq z$~%Z7WSNDX^qO7teUP4}iCKRz{2yv2YB^6xgZ>0oOzUQaeu*C_vWeKqqtgYsG|u>s-qgMJNXY{sfV5IciUTgU?%`#clNQpx#_8IeNb7* zSpW1Gmt2Ee6|`#=rHfjs1=sW)pd;^OcO;X`N{~b2DP4kNTiY?uu4E12C{0fS75Qnp zKooHWzx=Lde3p+X_i1~~G~~8a1uiZnLsws1>A|?Ts6hedy$>2d-n^!;UXWd?YO?@U zvp0#XqQD}WgU|>Eu#|~BitrQQj{v!6=y}75ahnUb|Lxa3+2+v2E73xp#Rm*p!`Z_b ziI;?p1ZCpVdq-OKcJAMI+z7;|6(I)rR4Lj^ZtKTT$Y(~MQ5eYN&t&x@`4w@j1YdFZ z<$|0DCBb}u;f_|{A8gDl0zy`uDNAyv*NwcfO)*1i3n*TnYNb54y}bp@?YVBPDO2MVu%d*62>X*<$a-s8>YYwg%^c=!4l3v2UFpV4QhjT$r| z?MX)OYnIh(EY=f0TX3|=)qm{y;_YFf_n0uVttgThU#W`~jclUz%-f3WEPFNy$}8u< z8hy$TkNXhthnUW>xp*RuLezX6pFzJ9Jxos0nJQ$ipHjb;83zRJOGKYsG>#ux%R3{< z2=YWel$GzlfMpbI4+z4YXJ`Z9?&ZHGu8oY^7-X<@=v@z+qH!kbT)jCj!=EKLB34a2 zStY+1g7;AV+1bUNW>7Bv89*dfKwQ$)`LZbyzf8qc+V$#hQ0at#&SFxqa`f_gnLH*a zWDdx_!$fZI-IIBcU`0%IMit6WrV(Du1Co=aC(q&WK|apnYo88Ng?f)A8riVDLpXX@ z!p50ZEL9J{=&NWiYFM2G(*N{s2fevQAQI_ov!jAP0=@>6-hTl&n#tYvW+<+Mk6@=d z4rwInT9BXB$Dhw{CV*zGfm^JBOx-0az%ftIqCe5b#o2@H+pg}^VNT!Oy=ZDwEASC|_2l%SZ4ce@^eF9t|xe&_ci(06|> zXZ~=@36|rgY&Xb1BLc&Jqpx2I%t5xYL(oKs}q1|=`d|_#)ir$B!C2?|5f{=SOE(e%c51VEkdzg!kA|NI( z)=R@T^`{|f_Z;HrL9qZPsER8yM--pL`9zx4%T&Q&^eScxhY)^71MX>pT!?8r`uZE; zhIK6(Au?B5b~@lzH{}wTWkq9*bYSa#F<8?ipO^IN6bv$Q%w8D6a5--%ZsiX^h5vEd zySOeHlU_ZbKgDSif!+oy4=mvyQTBTEwF*0^%D3|k(34PatX+#BZBjYCJGan4M;PNi z$N^Ni_Tz?CSY~3g)Ia$Pb_lzRq`8HkXomTvGrivTjUA@g#;#@+0rWM}A3||&m-Hrw zgFrPwdQO)vp%h)eIYDY51)2V1^Vi#_o+i2LYV|7ro{YA~%~-u_*1^~G--ZA^iO{%b zwLMj%6WZd-=<3??2QZD+%v|JUIisdjg`a+WKJl1e@qlaPSk}ppduvfuY_K&mN%V)9 zVV-qi17Kw3K`MR@oh=~^=>&PAU4E14j!1s$Pw)iA0E@-MU#``J{bwuM9W7Qc+wH^9 zJPeMv9>o_I`gxE5IY7q0 zd1V6kxG@YzFwep;P$@q|k(tSBsLREC0xS%55duDF-_3L z;)`62HT(uYsroKTHh^4lrx>|~nbt3>rY0zD5Z{zKT&$EX2)@+9yF`e$%;fQ5+T7AY zG{!;)@~d{SJGZLVhgJD-ck}rZ{rcvbsjIJXKGUFEfpBqyWT$9tDC%Th^CA2@xm(_kW%O&SqtULOf zzo0s_Ia+iUV&+vEI74 z)SX~wh->XL60l>CQ4*d3&8)c9J`M=ms=pA(s#dp@!yYl>jUL92?*Rqs_10W`JTJ-X zik0Cg?`UqdZT#+0DVDDiDHu}(%!Os_@U+ABwVU>;F%EbbWpWF7*;+1%`!`0NC{mUnK@bG33|;RX#?%zLS1SX z=T^|D1EwE{mOa_b(Ep~pCvs*D*D}dxzLu?yx3P=(DGru`iA*5QS&IOko8i)VjV_Hn zTbT2T66_8IPA{@4!Vf$Og7V+jd>n`y^2j|?<-4h zV$X#YSt5y@`Hl5!`{X&G-mpHFc}G$o0y4(xV2wczy7&6-o*CiGCIV6R;~3PVf@I;> z@L3cSGk&Gvj7Po0Nj#S#<=c$(jhNReZBS-(F+hfW=+Suu2))V(I4iQPFhfQH|fQg=K4mHW?JPu=!LoiI~gIrKy`zdt=0Tn5QVEgnVMS z5Uk7e%lBdyWsWk3xDzLjr4Q7#qXWO}mnIBWVnkzGSz(#)3g!_x=G!~#om+NbRmX$t zmOwyoO~|&0G&LByum z6j2f1^J237qoKxxQDqoX_cvm^U_ffLb2&fd?r3%Wv!Zx$W^4r%qWmay<$9obp;mbg zudJoh?l5>UgRika75<+C48d;BLk83enrs@sw%0pVA?xc{5-4R=3ScGub*Gw<2( zottY0IBfsQ?@mo-F0>9TN*v7tc5C+A-+rIX?Yj%6WRTj_rDWh2TQD6@*XOhA*bQt? z2a8l=yuQjLX`7W2Bw<%-Ke^|2nz1CZdoMy0SovI) zWjQo>4V2XKj~40<-EOBCuQ0M%4)PEq{p_<-rzlUSI77neM8_x!)zUTE1rFcC1jZQ9 z9KGIZ*Dd9iSRa=8R7$<-0$&H%+@#Y)uO*NnDW4~(#QbJ|2~ga+p5!0%mLNl0qnIBX z%P5*xf~hGh+WkAizwID;;r~1OYz;!y#f-m_oOML(w210E^(qsGfB?xoJ)E4DpT_Ir z7`gRs&ec6SQ}|OYJ;=8}l6zmPBTq~pl+0C)ZH30T6=jDxVbL4Tm$Dy!Gj|4*8VuH* z(mePwm7X|a8(iK-x!*ToY{$!aTl8O<$bVBqg?^Z-03d4mTuFer(Ov9U3tSu)u<@do*|SSQVT!b7qr zQ1EdqteXV56EsuedmpuDA#{g%k+>%ibx)?d2~YgI$Ha8rwzVXK3U~BuhSf_DWr1Z? zPx-WpK#e5BUCgkE5kHzIaMqLQm~PCwlqap@u&tz1XL9iXeva(D49$+mo-Z*%)NyKf zl2?>;`PK3yrfK$k=B#1`12sKfZaTW`6i;yKgOspy@x0qiVoxEE%Wv)_3(XLL{m%mM;>WGT; zR{%3l=F-F7$#bgADb1?m>7i6WiHNe#ww3EgUZM~-r@ZZPAxF{bS zbBjLlA=&W^{mNA^FT04H(s3b8f zS#@z+Z4-V9H0&V3z(*cBmX*}Yu@Q-yRvGvZS4?%0gzQ1uI_OZM;^UVx#NeV0S1js+u7Z;0|QwTlef?sIV;d^_@fz>Sh?(4KPti_;qLE2^AZ=i*$B+y8xJX* zT9o$V-mWVWZ$UzxoFXr8uVNSp5Vf*@LG^+;OyAX%BE&8!@_IV4URV{$+M=Yc{pgwB z2%9*{59829wTor?v>ln8nJ{jSuf5vWCf9%JvlQNU(*-ujSKsdHmNI+fkY9WRiBC#Z zaGC@0rOny~Eg4lVGy0%0wuQRD9Ga{ce9HHbx)gcq;^t55@H7 zCe=fF*AzGefoR>V75|igcSo7;#z;F zKY5Q1OjaecWnnrWWT~4FN2?<$lPFz4E>7F3H1K_uo|7+%j!c|{6lO6U-rG4oebZ@^ z$pN1A8nZw1M2;|X#7f})>XH+XdbZy#!6nXhvYQ=W{6QvQSz#uDd z`^E73QGQ-tZ5!Eo=8{x<#qpgZZ^x<($TVfp`{doS$qc)$i=8pe=csVR0TcqF?&znY zau0;oEDO2*VXjI^&UI`DjmK0e#YCEv@KFuDBboEJ*fscpf#|IT;$2Hcs@TU=cWT~Y zVmF^%7!#v|J&72p0$9f?(+0l(70C&-630;IwG_M79YsA4wu0O$Ms_-ml@Jp;dg*I$ zsGGy3zp=sSZ4#{O{T_bJ*e*VSZ(=htpqWRRdy&=+ zgz{Y)_l4{QN3iDA)l9@DNy#h}8?(0C0^xFGp!5k#!mgZgLGEPIT&ky=?e`%O_qb!S zR^M#yOkKvad{5%Cu7^*ph`&>}#~6h(95A&&R6Cn2Gjz9UM~iTBl;yH$!n7|3XdD?y zHj>>WZU-RS+0WT`0PGWkr~|XLKkC7#k>)%ST|!o52YJDM_Kc%zgPh827oxD0L!5ZdW{ zshy!E*J>Ua?kxu->Q6htVP)<$<-UvFYL%mGmVWc$)eKEe`h~Ci7wtm?q+w;;+Wc*A zNVcr#8`jpmsM3MY&BLoO`_obplpUQE*w>B?2qDXP3PcmPIOOGF3^=|pHJ$+b;(-8; zuZ?#(N+$sM1Qgx9<2R5BzYmFG8lH!cAQxtQjv%0nL}c=@Q{4;!VsjG(1yvJQ;U2kd z(hQT~o1q+F760&CFtJ!6$SkVx7F(BHJ|MPdj=O2kBK)Xa^(B{kVNSig=N-YVHRayT zL|J1VTpD^qNBmqp-$Zs$zE|uc3V&Uk-y%(Jz=&HgJ|@h`N{cklHN7p2jt%*q?c0lF zs5jye%Ed=zwxbI8wLPdE-Np|Hx|otVTQ}$tn&|Yf0q{1*UP7BeY4JtIz5|0%C*XSf zS~f!6-KB56NHI81xBRjKP8yoqffGPlYiPnFu2mg)ZIc>pq#lj)#;E=kfN(Z) z=lk$TFJp)X3cm7Mi{Hb1(;5ET{ z03@7OuOr}tS4NUPS}w3{m~rko8onPxzm2$21AE6zr7BYOY>i3WsscRg2sR1D-SryM zrvtWnn4$wYUj%U(=d|w@K!uU4Us%ks^xO*PkPGNk1`5rrrnTNI_Ems!@#)#(=8JOW z?DQUB97c3J>#Xoa*}MYdsb&L5X{b9wL!OnfWNlQe2_=10R=kc7xpKU5s zLfV~!Ybz|K``K>&41Gt+LbmqV#Snnoswihb5Y^Rr%JF9+jOaSao?s)$jAPuSx?=hd z232;sm=3(D z8j|mDKXl)<%3dDIO#ByL0`T@`$62N#&szziM97SmX%y(QBE|ljRd#jMp*Jp$~ z;C|3~IHAt&b3$Feo~yjPFy{``-BRh?3>FY%z%fii-Y-j4ryqzy`3VUU3Pfxx0=N=j z7VQTe%&2P7$)l-{Uk5?Wqn@4-C>fH0>%XC>iS$cSInLABI2tvy{_W@fHbJWgQrL_| zeeZ-`xn`#9?;OUEd6)G@yT_fMR45fC6>8cn1!U zjYBuP^lI#tY??VqM!b=8>9)VcNK@rHCmzEXkpfOzM1Ne>0l6Y0zLB~8CC!5VgmG#U zVL*0_g+@boV9IWPBsgG$p(h{+MRRVhQMT-{Jji^xl!S-pi98DvJf6MAR6(2glbFm0^8Hn<&{7{=LsU-t&Mxwl*;Fi4?RZ%iHawIhMjxA0 zi@BFxDUFe23FPpo_TniAO*tx8pCdbLw+W!<_>M55O75ccOBSDV7MQVx{`2oG?@`v< zyl5_#3^+IOT)vODXN&Ujv@QFL35wAjwck^Nb`&QHcnh%Mpj(0GE(w06AMt6cy`TJO zsVpTW+y=cEkcW?LNL(IHe=H*ew%6j+veRSj=#$7)kLrT4I-)&UcPZ5@U*!jH#$(2b z6w|!p2DgDfGc4G<95}-+rFvFE*aPHYuv?dV6wR!s0WtAysShWHU-cvHahu(srs>_cjK zBc!~klC@kPNn^yWzeu_jx{l>JQ1I>5}+;sGS1uV5P zOUk^Q7j%521Ebd9Hx8ADBu2$IUOp8-JYgU6BBG?kZFe1YDA}yKH6|!~?Q#OIlSZ3p zv!(XOzX+n!h7`cOF}dTuz3V=U+g~jvw_k+TUTx%@n5Jw%JhZpp=nA?wLg*|IfU(HU zei+~7-PZ&i7M_Y_>HSPVUK6zl@Ms@JbegxFTIezsKY+qA3vCJ@dQ7|7uPaJ>C;_yt z7rl)~NOY=y65}FzE5zR-g)Z(H$ME>@=t+3nwPwDi^0RF-V}K(M_lzbjZObl|)G>@G zB}u#%1b+s zpq(xd)_f8TszIywZ#5(S&$!JarS@`uU;WZ>cdlD5hv4OrVY}2ZTuGCzX-ukl>Xxz3 z1TzFua*ROxIIvQFln0fZRUk@bq!R_f#Kvq%0}|l~V9}@**ylq56-xOE@fx*KxW?Z{J7c$OSCVSwCy{pfMs-VI<^-Sp2&t-qy znACz>k`U<&76bdj))azFZVlGua^{YbYE~IqBRVi4NnU3b>RzoXuCvl|89E(HW)~8M zO2c$j9X`WO#28l|H#+EV0iWrc zK-@%*t7-oafm{uWh#TGqp19hFhfp@3R3cRHbxW#K9JX%qx56CccX_To{gXGI15dn3 zOIn@cKg8zO_dIgo`LIyb6`+hhNa*U4mRNTgaF?RznLx5)WKou?aKs;1+znz?2T7Ch zYu<*Cdx;<)S5g3|1!C6q-zJ}f2-+O%pd5CVP%gNapRfVc{@n^h zItW~N48r*+)y4#|xBYj>6vop7Lnkw4=90W(4WZ(vY*aWdz&f%SkCNH`*CMz^+>H0j z%G%y~7n?D0#-m}l>HD-~)9hWmn6dEP#kC z6f-nlitM|4a^!`&^4Ulauh2_X<|c!&B4!9w z?@CZ^2A>(I&{)OP*%0o{dLb_pJU(CPd{5n7lU?W2>?m^OYOE#Y%lH>}q9xQ=c#iZU z!~m3&`2%CPy5f=t=9URohmqXa#s?|Gc2g@Aq8j3}rNtnvs&f&si_>4(0A8JFQcnJL zQbUBZIn+Z_O=tNe6rZ3u`Zq?yEn;B~B&?1wVk7doWTtQpGsa`Y6w10vH{FCcQs6rZ z1EbRfZa+rc&`QI#%&*B#ze#UlM09&5a{tQh5%UZ5w}bT#>=l9YgZP>dlCc>`^_LquNeP95+kh18bq|63>dFi7pgqY4m5aXnL(gr@+pzL_U)?Z zHSJg~S9}34MqSN*Ac5Qgnw81O|J|f&b~V!!aPDd{H-ovp?fRgEr^`~kc)HhKgmmYe zn_&Wmo*nA3%RKWHb=TwLIN6G067Z@o8-LsaJ1H4TF_%N{S`r;EhSF#=dQu(Am{@jV zg2YGR6vlNv3*^@py0ezvgIP%~& zANutY_=ua}EO62LctLHKRjo_FNa7|PP8ynDj(eOx&T>+z#kJ)j z<+BC|(bCMg;sG*waa;+2t_sG*R`Um?$=4-f!IY#{O-lath;AGt{q$OOC4KzUW=(W4 znPOfX-?Y$eN35#YFxr2+h{9xuP?Y5v@pArI*|jh`!H3(>31N3OsFAla_$o~eScY8P z%m-jsUjBvYm}0vwIZqVM)yB^*!cs_)TD_8HBTr%9n1}7I%CbJ*<;6{xRPfv-dq_J$ zG##~8%h4GPo-e(1<$jIYaZ4E9{f%_kjr#c??p>+faCQ^99Fm>z+)e zv<-OxzQ^8A8u;UYdQJ4mrte3l7B-JdG&G`>j28d|wiSiY0a$Zbfd(mV_97Dk4?@uk zkX;HaNl8@@bftdVU%rkdb2E)2FkB{BYPo`UBM`wXc*JQN%M$8?_c{aS>@XjzPqN8@ z`6SOat8gb7|G9d8k!6Un_!@dwQA#WcC4gx$s=;Ffw(8{DQ>`$AakhP&zG;dUfJ7LQ z2L66`USqOvz3KfHhF_P+;|CVyE6;pY7>_9&9<)*&-Hn!U z5ZJk}rLampP`ln9foF*~VO+A+$=G?!i@gB%O;eyNY58H4pts7q7de!2Qw^i>XiC}6 zm>o_f{3EYB>%2Lhp)9uRfqOJvW?)*d1=)9tyn_A_!L+G&dFVA>(?&rls1r%jzw^7} zVjA$On7Y6umwC1FB*>gV?H({mDyb2^Gg)j)c88h`=S2&s)ww%`@Gi={&O_s&jyCJ% zn%J7ICCpND$5_(>7T6VQb@S*A@7{_{TXPTIF+0szz%B(*VMf)U7P8t z9n%-HQXT zslXWs`XbeQ$4rLc=TdnaNu1b-=%9rC>j^Rbv!O?21X3S0my>UDwH)S&G+mSsN2)|( ztgR)bbGyXBS*_gx8zpyQY;kx9MCX+}PT>3%w?^-dtM{_dRTSve^7|PyQ zvWNRC5FLSI0eSND)8y|WpUi3TIOizU8*M0aUTR`il{-THay5{k8TA*donT$M++36p z2~?FF!toPqT7q6ZUp!x`HSu#<{U>6~H)yxs#g7V}B<(VjV-+bQpjB>>ac)3Ea(^ zcU#}1g&SK4=cF2&tUugi9$14=vn_j{MKbz=fk(RZX@Yvdw+faF`JF?5Qrl<0m;aw4 zYTNm3f&{c7rSR>|tMyURH*4{abj5+&-(AP zIGz$6P`P8)N&0&5MOj@u8R`WF=}WjmM5$7B)BkvL)d#dXyU?c4<-U4V%7sObZn&ni zL>U>JR}?qwIBXbY^080*95>CjpbhqD)G@V&fj!vtA>ZE(#G8hX9|==UY8NgelH3q7 z7MX#3VT2J?OC&*Ps457`E}NRkmu=PtJ&5(qMyI$Cm-mX>UjA&Z*vtFxX`}6dz~!ie zCZ#r_UW`K_v0;^IK8f#g^!s$qH6iNVxCV6FU42dJHZdb1Er?if`$3lY^vy~{VqOVu z`5x%CjLXWF4bPi9hu;QTI@1N)g@3wDb z&t%$$g*bcxPC80*;s@Gv#{|2aGIJ-{+mDoK(co%(B)dU|^GB4z8{Q>`^1F1!qy9;}UIn;W6kVGkwZI&%4Vr?Q92CoSiC=!X6vj^{gUSR^SM&lU#KMPS-lZNFWM-Zz6XhxYt2U`KK{ z#Rc-11R;7osXZ{eK_A|JZ1@833=1R`YXORx5Iv)Vzg}y6Z?!8Wv^O>rY(KyfSIRF- zTvv_w(f#Kra5hnbg`0{l>o)ksgAbneKD~2>`>qZt;aBjJCkZvg|I%R(iBuf)f-~- z-UaKtUWSHP=MYPTlYTE%PcECSiFFgg9RtUXB)7|#kc0W2ql(M@DNh+>9Ablq=0(Qb zTC(zDW>&dV*e@O=L8GFZ5^fd^GxX`yQ>~N)z>nmCq&pUpnkQ*RrUr{n4~khilKVjAub7EOUtoF8=)Ml>4oofPepu3p??AKjoOR4im1 zEb}NT$L)G=bH#dRwQh9xN%_{VNvY|ol5X0&=(1!lf-qt>NYD2#_^O4=^Hvex2`w~w znmggI#Vu^6`a--SVrQ4^Df8xw;F*@FC~9ylzIW0?uU7F@Cg3KE2B7W1Ug@9vIP-mn99aN=A_k z?+=?4-m)1C;G`*o>pef!3ukiWjnIk`99!A-gO`?$uZ}a6%czGb2!y9A-Gno?!A4Yf z&MQ@vC!iL514ja@2a8L}Al19msmUa#gLp5#1>X>p?uH{{GbENctW0Rqda=3$_5q0K z9-6ym<^BdOmjkknx#I-^eSSb&5V=tN&x2??1V}N*rJo1U9aZ;?o!{Y$P69TaF8m7= z^`5yi-Wj1QNlPX8Rc&9zuOpQ0wH6+pp{1Moo?>jE$iHa8Un(|FwhS>#$SYrs@vBw? z>Vb$TaqfYrT=Ye;rmV_DYNc`zPi@0M=oIXOma2Rij%;#mAQBn_Bv>t?lDyFk9P}fC z!?3?E(f2d1s*u>rPam2%+jPVr0uL^b1%sgW1~F0h0=!OgyXV=j0xnRBv#nm>csguz zteL`}T)z~o{qh4?rcb!YA7bEvxpGs>ug`N0dqXU^dZmJpP$jlfORwN0j-jut>G|Fg zQ<65cWlfuh#OC_)6bxxiBVCR(-#StfKc26pV8irfqKqg}gYq)?&1?6)>NHXSD`~T_ z^du=-2dqLlrtw2!0;v^w-_g)p8yQWnY8@H`WBXF zJsZ-D&Fmi$7WSz*$rJoASSInlV)RDLVDx6)QOgfYSAfHgjS z*2r;-R2MkzdON_Lg^TLp7d#Do{46l(wa%u^yKn(V)2vc(r0G*WZ0Te4`R#@S{X=@4 z93<6*h*xN1hX~&CC=nwO-*KWkm;E@>O&1rjGi0*SLurg>?)ciJUN<9# zyH7;b+2oV4UbI9BS36biEk`ckwtu-LPLT-z=-xPM%aN3YON#v5?TvB@jLmegTJQ-pNB#2C|YBp%jO^*`)r%#W~xxz66}s z8KEGVlQr66UUZ);ml}3m24nUU3jwLgw@p4z_3uk^3Nsws>Ar$r$$9aD?qBfOcXGfJ zWtgXCjm1U|k7SK5XvnC`WyB)BCk6f5R=fAWB3zOSzM73$_h{;61kiy&K@2nbp+@~o z1p`>1y+~1(S!C>WI(@t!01THNL?;4_l>*sDh^Qt)nHA5K#gmG|*QqZHlhbyE_(7+@ z){7j!7KYlCYy#(*8X2_fRs{pLX0D<^7ay~<#Cy(}$A2X-X13c@bfP(z)^!KUKCs(- zd8AT6ZOcsLAe{DN?l0783Zm6J4nF3V`X?z+iic-MtGC5sYaPb+=hu@uC-9i;fNBMk za-5mXGG{?yF?*STWPv56+%#CX%mIGx)0|-i7sroYdWu(p#lrD*1QE5Tm|vL?pvVl< z%jjw_?jT}rJ6V4~*S8*JZkX#2Sk<|}jXb)O?WdB`{I#Fo2FW8G7Q-1UDy$|vUGDgl zXKB2pf3y-L#M5wug}iU|&A^1iB568)sTx>z2RYZxqZD z8|{>4_nfeK+zqc#Hk&_BxglH*W%NY;_FX|xB?Toxy6WI2dG-;sDi~;du0+ZV)ZY0m zIc2bE>Jp>O8G@7uWwY9JvM0&xcMHs6`ncIr=yjZ5*64e=6Quqqgz<{YrzIu>m>7i#>Wy4M$`v5>{-eALA@m3ejA45GNn=lYm4u%`u;Gf<=y|)!>^f? zv-j?bJ3Lj3a=HxRaej-K2k)dZ8<96Ai#Jhg1)_RJVSak!V*;_Dm6;zw8Uoub^kb(C ztJwR>`5Q1vL{e+b^uxso)^KG;Y{u@d0X4vSnY3tKMx6=*9(4|d6QBRHa)ZOAQ#GB| zo1HpdBW^uG5D>KGJUTw@q=|njD(_HC7pe5>)SAso@IdCbF z`_UW$7Mn%ldq^x#XJw_%B)P7?jK}3*`qQ-8?tv|{dQNkRE2Gv;^LjW6L=B>cdaoF!R>uQy~(J4wncV+tX z@)R~FIG{_5w97XyJ?!o8`#mt*d$Dp(RBUq`(`~eM3cx@7y(IhiHf%zdrqUAOaQLU* zA9SoK+MVBm;$MQjvt}aPJ<`X&(lhr&7+!IoHb?n@sT}WjaQa`6ig~Uqe_o0CIAR;z zjWy7mTuO>h{N;>7642uk1&KpdG{bVgfRj0~cjQK<=vMCsFkL4Z@6!(#{Lfe~#XI|WYmuAa z0*I37zy5vrB(KhKjjph8y~iO|`i|2@56TS}RR4w0#w-Ww{+9C}f%Q?6F8J;OJefJ4Zft#Z{-tkM zumwWC55h_u>lP95nc(Z5}npe6^JR z(bDwq_wl+CajmDtm-qFr~N*mvPq>g8~Q2UNX&D@BfHi!rGErEJID zRl>BL-2fpb(esOB)aYcnR!8fQ{!P&(ra4O+y!3w_rTs?H+FGo(BW3EP3hbfAh3upm z6YMv-v5bu@Y6H`Db#|t`)M1pG=JBcGzELvp7>9N!w6Ep!10mp=YQ|`DLf96g(N7gi z__q}V0oL<4*OO!}y+2j=h?&?sEcLpQx=k5&dUW2Fm=z>He2jPA-K1u|FD8z(xx4vd z7(HK4rM=cd;KDR-k~XFy`AO%dD-HM}p(RFl#r7Z-qjxkC z#c<0XZKf{nVZ$66!ciKwI@3lMvJ~CvXHJtm5r}P5SJ0HKYFAOO#v^(GutmHNUZ#}@ zPR^YxIsvKmntvRsy#>Ytxtxt>AaPF|%zEm(e^8*ci&$0s>NO~{ptjFFvTq2%{_K?x zId=>XXIkZzhARSn``aAQgZYGm?zm&{nbf|T!KXPr0(xai2HP|FlK3G<3Pl7d=f@E-?Qg`7f6~(dwy$QX?qrC_f zF^4n&Ewg+pGP0f+wo>C1t{x{?Yhu5hl zzOo(FGwuCULChEer@O^`Ccasfc$j4Rj9jQ!ZN}M=I&Uq6fbCW=#(7N$O8hU+_dm9)30Zod#V6ax-+lq{mmcczxwfA12);%mT z;2-|pgUsrbYy`pM`v8qr7ON_o(=Sg*K?B~CCaIg>> z4)d4nW<(ks)$2sX*6pmh5a1D1q=F+92h>5Y(UeeHg=d83$5gE0p|}=*!bn!7&UVZy zE@cv>4%SP)B3q=7(zwgD!}-y@EwOiN{o7mBO+JGO>S`h_a9=TEW_47-0KD#HA5p`* z-4O|3gfy(TIk*QLlE{mBLmJIBOFy@v3@tv!$%c4GVq)s>WP_GlMz03>UyiLpuZg-K z*G)x76%d$#Dcpc5j>G*rLRbKGS}<0a0CxyA3s~s^e`S}$mmjS25o2Qza)G@%!$7tg z?wQcSMcZET5n1MZ=|#In6Z2IX5IMd;OJFB#Q9-cCkpyD-#3gO1wRBa-&u_0>P^bP_ zy^L6xIV4i^Gd$M=(;$;YG-z`@yanB(viIv($}CZ95&E_tmKT&8^B9xteNN$U7Xa}e zY-uzIU)Z(@&giB?gR6RwRO6WWQiI5?J&O~nXb`3cOsBPQIG;`YJbeG)P2UXL$p%WF zPLuHEFk16a$BCaRip=6qjeCU4{>z*3JX1NV<3|y!ryc=DyCVkV2>!Snm6f!YP@Dfz zw=KjcJ^t+5>I8nJlosP1L6x)O}9^ZE+XE;dw=IOs}Molp6t4gAWgXI>7Yyn zjff>Ay2LY|N7q#z+tmiUyxkOJO?iM?gXx^y%z&+}g9l+TLTG+p47kHg#iSF;t1ozQ z#FR%rcCey5gNlUO+M3>^m<65+*O{6w#~I}Hrk0+1&H3;F zCtd#OMrX&M_pP6Hx?t$8{xFLPy_9n@Mk1a%7riqP>4*m_9MQL!Vpl0yzVH7wX#cif z`KgKT-Jjo9CZK*kG4ze%9v0d$S&$|Rf>a3uhd!JFSvDBNpM7k6vq9#C6<@`p9d&WA zlUBSbXnU)&+?Dj^gpAM~4WtsqcJfh{ePcPS;ufJ zrysOw-l~8t>J4N1hTa22qe&_sy7TZiQRGEu`d z!oA#}(oCBAwrCjlsH}Q0z=Yk`cv0aInl?dq%92gm1~|3go4dUmf-Vx{ke4+dKGsmn zQ&byj1WGH_Fi==rpZh>W^D z&Pe;U6m2OJ!U#;uj^*@^9`E5`c)0iy;n)|->n0;v0w-sXw&SIruW_y`4#^g1JZ`4D z_BHZrd9{MNS=q5P5>gJPhf+z4?#mX6%Is)e*G@sopX+SfW7*P&z^`HaiMgNhID3QB zF!_d+(^Y=uocGR9hnv5Cy`}FTfT=hMXTOe65i_ce=Ni`>->F9*F<+jcnZb>wk%ABo zSEHyj-9`xTQ)bwbQn4_%I0jt__Jpi@J1c1yc5AA;58~{sj*knW@GKQ$a{C`!LS$oK zx-cNR2(as-9no#5I2QB`KM6XqIh#fe>x|uVGd~)I>ov7fs!TDD2;{Uq1+Bo(feQdWVXn$3LhX)) z+lx9)b5^Z*vONN&Mnb+#E`kUshk}O1yIXHvXCST~tr5J_9?vk7Uz>_=$kQ$JUMKT<<9CyTmEq3$2FE~^{mWv*ye+Ah zUD$&4L_X-SXrO0Eg!Hvdxf`x+$70sH;RMKfqtA}Z;rj55I@wu1n*!7ur!}8PLBZ}U zT8Uy21FO)pwsXWEM7QgEjZo*Jxf(f}6UaOkQQ>A51}gEUZiFFJeo>&wZ*GHiHsU;I zW$@qtHM;z%H{OsU;Ai+mY}Nlu&UZKv!}jT?xEBeu5i55VyZ79qrCzFY1nB*t*DYrp zu3_z$!cV8hAz;5u*1t`z4hhtsx)!}e8jwsrBt$cXAMKhtax9{NGN!;#vLpU97VWY( zydjLg1y1$OK&}+p){Ipa*n4wZOz+Bwdw8a)W zl$E7psq9vcFo%c%p11-&HONP0*0zRcg)DP7+nG z3|Nvnj}h2m#dE1KezcGuE9&RNOZHU~y@Hmx#GRWb=OQNQR4ozGy5%Wl-L2Y(B#nl0l+gk(50jwO3Vs+RQcM|Hh% zr#P9jicvO_+hunK?HQ%|Yvv=c_xR5W!dV?qZa`+6g*uFwYOgo*K+Z6sIaVA?nX@1V z-M#0_gDl95x%4%#@(%8taHhCmbD=h=mrZrf&R!ed&?A3$qEkXbF3Vrx#ihW*m16Sl z!Zp?9pX{~bnki1f8kMH{cp^6a{2WsM(>JC+VV^c?9Yg%I7y)PjGOzu}D9S2-WDl;t zwbZO^sWZE-3jld*NPsRVCfo&y2R>nN8;84o8O#ZO)=^2!UvBBE)t^zwXOiKiC8HNt zveGUhl1>!4-9#J@cBhY8P?9IH4I|)|o+qn>X$AJ^NDN64}3(OspdX^+h!*W&04c;!FI8Cwj($f`C*?z<;+#Ir{SAii_W`h&18~# zB&NRT$!X{1w1gBE+lI{??GV^;E3)dd@)*)2A8@&L*I!@mLMXv3qcC(k#s$vFkmzUj z4A~}Dtr!#7vo^9Ix*!D+K0-{^m*x}MP9oH$4ld=rf(Lty!8)de;_vSH>PdM()a~Zq zC3ZN!1?V}>8`{V+lypOB36=COs$(?UAqrn2a&e(kn1)wUnJzs()Byl42hEymRP(0J zA-w;)k7ir=HIau)FA|PD$HFvZ$DW@U2TMM^i(XP_Fc}bA4WeJIb)(76$L1_0+$P*f z8^|nePZTCLlh#VncAi;-|7<-8%gwvIFlmH$SX}AAA`2cyneLm%8WO%F^y7+P=t{YJ zAF@AM8lsqWUN=$&Yc%cneZN+ptza}J5Cm%O_~|>KU!Bfpr96Tz{1=*@51CH1;CC#g zK9yI8Xe9yu;%Mr~2fo&C&(jJiI5}Lv_urn*Z)UCMbmeS8>W}~pGsx)<&<`^kq5&rF zSyozF;=uGVc8GpNrfxO?>*f*$$M&J5EM%vRN;Us(9TS(zHfmYX`$gGfu(y)KWn zQG2-m4XVgx%8n0g_8gAw8^&8c>*xpIfqM}y-p*b+ZYwVVB^&61+3bEWW(w0g#|y`1 z|FcLHoszPTK{KF&Fn72;UB)+CW$&|3g3DOJ=YCqj_S@s%(y6#qSw)-S@0!H8O#Q?S z*}9q?I=;DoN$~HbK_b<$+$CZiXH~?34a33UhWU(<^588DttinmNC%x$=wD=2k%+z zUDT1Ui41>f9t)T9UrjOVhQ~Tf2o&%DwM7)kWAl}cSm)A?iHWf}~vwg!vMG zu#n4|X;oNhg&@=&f*h!^Q>`6yBj|Namc_zzAh!;+qG(Z%q3gn3Kvq%;1y1>9>ij!l zmU2UHv7s0IEPwVU+svR*9!qB3=O|WRthMUDJnz$hVlaJ+E5VMzmTFg-cIp*-4$qZw zsF95YPnAx{V*y8aN=8rB`4z0AE@W?SFYtJ9;pXl*JaU+l()~lgUz)`CV+<%54>Eub zQ3E*8u18LY|ix2u|%@q1MO&SB{4S6it5uVU{BlK~Ws20da0wE>eq16igZ!Z|}* z9oIj)=sps2)ngFHkJ6Gpo?(|WHzqQml^uz$+Nd<1l{6I6JTK1na7e>pD1BiS#hBWCKI_#Dc?)U;9|B9EnFDL?=VzgnxG_r8v?yh>F@T|~X*M}iOfL1FyHj!^KW#owwuysGX<_dgH&M00IR-8#46Ha| zC%IhD8Q5ue1lWFSyZDpT3}zD102dA9)uZ_K#kpU-9l7*3sSl`>B`{axSbg2MZu>8N zjflh=HfNEMMLN-MY2=VOpw>R=+i`Xr%^^abLqqUuLPy@+IEi_AUT$ z!!}*x<2T|m(&&|{NUcyj*Ns_kY=JDTvA{(?R4t)^xu4pBrpC>LOk2NKq@rHF9T1bI z$lBN8nnU)f$&RNp>WXsdJ`jQr&~Q0fMwd1}jHoSizeuCo+TKh11s81ErD8un;!so= zhmaK3VD>N?f9z>t=EoAJ%?k8hkrMglWOcc@-gIDkO)Ag#v?2C=CVfa?PGOy-S5TFV zyV8TJ^V)x+%VbVu0bXb_$;fCad`rM2MuC6}t`!Kj8Ejt9iFUCBC9gOAd+5d7$RK9j zr-j2B;q#SKU=5q-9fY4;Y@X{M^lb_E2r=R;u3ecTyd>-N8FMljp8Nzt7bSZS4ZV-? zxKO@8F~)U(7a%dX4u2)`urAyz9sb_!i@+7L&0#^))8zbp2j&_P>@sg%Z(LJB+Gey# z`oir~AbmtvLHJg)z|Ro9MXZFh~VEf;AzIO54GG5X?CCo#8$n-zTPN5EVVEUnwim$_M|0LNV1 za_E7WIu&!Csz)hT`4+Cw_XCNEStqiL58SytYX`LRAz=j%t=f4kZkI1gf?ZW0OS_Ey z{Wxp!hB`uq4UdEwtFA3wb#hC$Y)iSn>w#z4e>#A<4DvBjnDpdq*K9V8k~V9^vZ(rx zh_z+CR{ZI;Simoe7IR_%iGlZ2uvQqH5Fn^~41SZa+!bb=Y9zsXQo6EQUv0hKQ6QOr z7q5u|Jam$_}VQWNCa}j?_kbaD!j+VSgXG1{lH!_6~ zq@a(;%L>|;I7SCv)sqstVHI=o@6=85NuS$=#t~3Fmh>zBgBPTs?;OUX8|?5H&s6*Ngu z!jggS)ZN8>a&<{fop-^_z}r^rjWAn@K5gu!2jt|>0p}YnKbu>Jl(go%m758UHUJ3; zHW!Pdjovs%(cDTVBNQZeil=g+;N4N)oot_rA%p&8@SDhN`&l^k zma}}13PsOhWEioUgd<7_QTBTk6L;DM??6PIP~DHc*c!H>(-g!@;Hzv>2?*vlu7Z7Q zRXm-gw{o`GeHkG4=9M<06JEVJcFl<%UWt}U7TyP}yjsjE#`cmbOs!d@a>!_Z`QLm# z6;ocG;D`qc{pJWs)kAUAuCDHi~_SHAs<3Nl@10 zg$DmJECr8bX9@~|l-$EwhOGF$Lhz~fY%9KKv#Z*AkkyrSI_)hp$t|F?Km&GDV~fZ8 zU5)nok~GYzatX>WLm(UQ>etB`G%pQs)6NKThVZ5EDRJyym#0!U7fjR@(jaHiX2;-| zn6goHHhlgqU-hwjm5r=e(lc-gUN$0(v7SKdY@+C6FSC|5#n?Nkvb!&=UT76&lvM~tH!>f@y*UcE!xQ&> z`ogZTabSRS2>jaW2X6qR>e6K?oN6UBOR?+2vA2?!tiELvu3Va<5>f%cmUJkk`z#n# z3tXP0_gctr5UG3y%7x!G`SI}TBJce7(Cp#ixke0;5z#CH=nhvde5oC?ss~SYCDQJnTut}g2@w+lcszXNV`+!DZ_^H$P_Kd7$2Ha($SjUJXh-@}@TCfH7 z=(vg|o|;F?4(v3X770Jf0XJ>UcZXiG85k$$X8B!*Op6+J7XW9ye>2Potg!&|DL<95 zvOb=OfM=xw9jt>Q4lnP?HrJ&`cKk@E{Vk_HfSBn^0D5!V(u7vq&giuE?+^ z!5sUNVmfD#PalhqyeHn8*e|Pqu9l+(l;m*Of+OvpS!v{_Ud5WYx?s~MuFb4{$_1W@uR**5CSu|xpiMT4w~)zhb8AcP+8JcnrSNj-#5Nno@a|VPO9iRZ z{%Wg;SA4APWoc66)1@XIMcAOR{JzDC`Ve>b=OxR&W9h8mKrTo>wgg`rzEuxtsXGWXqxe+^25D=FuVX zniE^%90U^0%1w)SKPZa!k}DkWR&gfbfTXt)qTa%C7j8j0)^Z-&=TWv!{fM0qFNa1(v-f+1A+*`GzYyro;Ta zBv^|cS5a9*HAJiVYtRM?3KX4A_Ppdhb|vD=z=MZG!Fbj9`E*kO`Bt-MSkgEV)EG#) zHs>m34K&sy@Bf$NA;Eq^I2HpZGt=ge1va3O?wCQ)_SX&tquZ5+kRxr_l;+9!jbsl_ zBhOExO=6?;NI;|uEfbP=;!3=2+sD*wXkurIFBjb%yme-%9jw_V+~YE6fFEqM6CO-9 zM97)d-u?FL0pwu^LT!rLz~8>gu2l%*a4n_5SHUyw$QB+L^QarwWDjRYJw-#0olsXO z=1GGJ;@CL)ygj|QN{)*%7yFt=B;)HBZXG*xhBZ;3kwaPUp$W%Seu{9cfK8m@ zEvoei;^ijgT{vevd&Cgv5}MQ0)10N1otpz9x@im@o8fl5<4B%9MB($JYwpT9Ko26W zp*gi@L?H{8!D1We2qr9(wA`{6Y@to1C+{zb-EgWDWxW+4(4y9$qTg8?7P(ZDY0pPl z8iCT8vCY}Wx+%!vG<(f-Gw^V;sxCgS00Ua}=>R0|nYD1%lV{Hyt)KAPKZd#fNW(ecYJE)R1MDb&F@dC1W-M&A zVGKw=Sx$Y~ANREqU)pxl!K;n~*CgV^8ANBhl}dKVF|6UOGid9T>Mpl81y9cT~tH*8|cI^^~eRb-8qCvDRm z&qe8G&Hg5XDBphyWUXOEs}w)hhAIasLC^(zp->`e^~-vEX>843U$Nqs z1tq;YoegS9BQ@b=BF-WSC3P{4v5=LEM{#>)Z+(0p3(9riD(fzM0*odo6PUYXOVcsg zFG90_i_2-y+;r$z(~=myq{QSV^Ok^+3Mp8WYFQ8s83z!Avt(cBW4V5aihI0UN+AEd z&kPYWN+`8jVdfvkg)aW`!t9M8EGl@F*smP%Qy3?P55n=Z`$>o zC7*ek`9U6-@pq*9D2lyn8;E;{6}Z~vgWZ^IW2xsUKFea`u!)y0Zv*m;?D@-EB|K&E zdV(Xs=VWF7pg8)n6xjilJ&YtkYul$i1uKhG@=%2a4WDqAvmmG7jTuFe5^Kt{5z{x| zj8JDXI5Z_Zs>yUiZNwL!ZmImad8RW8a-8jVA-wodSw7y@)le7Uur2| zFS;w6Mq7!v?&aWDw7>N7QhS4*g%-ZWDk0=Z!&I5wjMFbmn|L0cb{>Yv-omKnWN(vx z1cV@ys27BK2TMMhdX>YA88Iy~fFO0LNy8R&gPo!Pmo8}yJ(uV%!9_gMl^>-_NU#F^ zPEHSwQG^hk=+1_6ak*ASJe=WU^XMPF8NQZ@sXiV4aB%a;pi_m^k@-QP%(z-2EYmXY52b2mr%m%(zhQjt{fZcr;($ zjx6@PA4c@iMUd*x4j3N!or!m-xc12GMo9I-5U(Ed^+jtLkp@(=<2iW>E+!5NLaL5g zA>yGePqsl67-X3iJTQcm+$l22YYXLp;S7Aq1wKJ$~OY0kCJH421f=+jYk{*@AW9S=BZ%nYTj-m%% zq9KV#cxQ>pMM>=yZ#Pp;r*E-{fGF;I=^9S#L0PA*>7B&sjph)2>0seToObtUO9s;e zf?A;lyCN`5mAE6n9dcyzE}Et(JcM z>+2%&IDRBp(si{Df5Wnroc64eZ*0QT zCayt#Vrw~8H5hb>&G9!5B;un6jQcfL2N*5zi+8;N31R<430B;Q!(en&2C-=_CU)%HX zv4)6a8^Nr)7npYXY8JkK!mQ$iB2v{Y29Y~O}$ziv2O zZwyu&Q>$=uqO!Xy50fPJ?EYD_YlKe4s_KKk>Fx%(cNl|qbe+C3%201;w0PU@?YM(s zl=a63LvH^L6nv0*;Q^<6WQf)(HT!5+DYbc^jvFEysAcYF+S(8OpRn}TvKg@5`91sFz@e55B zUr3CC?D~d>Pbmt75p+VW6UhYq3)lzQ35yn4-87*Jl$J^_)QGJn$qM=jLH$8xv%Ql( zB+N4I%@C5;C_E|431Fu0znTKYd*O!BLQ4|`ab2&cd>RVe-F;N;68woavYu|86mBHo z(}eJ{F%BCt0eOq3&}T+sOg)hRPek+@`N3N`m235&Oz}^4IygdR+e>4LPnUSko|7ZH zgTJO@N#Z(;BwKTCPLqNMlCP7DiinEq$m&|udc9(KO93*`Ev6koFL?hh4MYe1$8ACC z`?Nm~9@2FU38&x$E*BPFw)&&w(JwRXM(~fEe6h!3^kOlInOVXoGL8A1=B;!i!Al4z zDaWltbq6$pmMxJ0auQd!or#qrTHWbK5<07+w)xT9^UkPm#J@p}xJup+Sne1Z}V#zh_Mg>n&;YFpX) zmHL9>=h^6vqI@>q8!22XakT$E)Z_@jSfk+*(teP>L{U+dOb;cJxNgX6F9QS*gerIH zT%}IRKLg5+Q>?0Jt(}-@<}V8Idvt{UF92U(Ih)ytK*L7LH> z*kIDP8+z#WdE3?_{qmZex`ax~cy-Wl(z+L13^Ts0?SGSWN6sbH!x>1C%3?B&RjG?l zMqi#bHL5P4LjgA8y=e?ZNdXhBF9(H827Xo+*kQjv!5zJ|argtNP9C)*OM?WltX$4A z&|;iPmOiPmm4yi9E2YT%!y1B4 zXPGWcKDzZ)rSfhiSNO*kl11ep2tmqXi_Ju9`;K;H?!-|a205pAW46#D2^2sf6Hb9T z*191%z!lbgI~~m!>W>7y1MUc_lP&%*!Qz8AWlRMqlC+_iDEhGX&&{k7L@(}}?5EgD z+u`f2y^~DUv=9K{?}Qv^Kttd<0=2GiF>tgmpy6Mu1Ua05EO1zoxb8!&I^N?>GlI8H zoCygVNn-l>Vn5y34!n|kfUS$EtfDQ-up;ik*q_9z&sfG8Mpo6tMZcv7|8fSea^lcR z?@ldK1K%pXVMDW4LxR<1yI!Lk%=KJL^l`3{aXxWdq|X;+U4nKFMw@n zJ9E%r$d<_hF0opk>M4iB0BbGDdLQ(MMa6^y$o&^fw?Mx_(Dg4aFqVrStjj(F{)Y%& zxI#{)Pl^YMJz*k2PW5THnQ3%p19^~-HQxP^Q9s^L>5ugQSutR+Dc;Ky) znpOf9Jmhe{WLMF9gL1tq-O@8ni!d=MpC{lXYznI61eJBq4;1>eXKD7W55Lhm9d{mE zQj&!tU{w?2BCMMnocw{+{{Oi02q)fjxERO?ulRLR>FnhRsVs)Y+A{Wg4oL;FTI=A@ z-n3~0C9kesblGnrNtP(}!$asn{y1Ji;iWScBgC^bD_1Sz$xyD?v8QymQ?(C11Q8q4 z9=QEqb@p(-Yd(H*J9Z`$suocGpFx1(O#x_fCqne9!xquXe;}r@hRSWt-_w0Kw*3I| zmnx0a8L7=oz#IZi0x;@ec37Jwp%dmCB0|C#68BT&_n)BWXf|18-H0MiMqO`*=v=Yu zgEn|}SFtSa*=s%DEQMHsuJ1an3;4oE%{6H^N-%8{Rkhp27FE<;Tj9@Raz^8h;5bFoBa}xD%Uw%;ntaN9n}XDngS(NBT>h!O6g{!X&-I9Ta$}7?w4`m zK$t8*IZOK$ZW~rER19e)cA7nZmqI7|vX0QLZrRf^My~ZklEm!&N8*A&)A=C!E_q+) zEj|eJwj*w6+JQJsZTnNRb|J8h6S<5No?xC5S!eClEeR(pr~>7YCEDe`WVTQ{ zWRDWNgvD~IA)PE_FI+oSOd$@ow;jmnN;JZC*Oq#p^+`P*PTU}Mj@|15tFJ8OHItNk zFRs+g*JKb}T%h^q4HH;4V%fTpa3{bC^yU4oiL3HT>#=G+7msHL-EqMqINA*eQF{St+Q*-k70I?LL(oK` zio5}yb#ZJnI^poJ2YjoqD!`()O9KLwnx#GqyW7?{UthWWcJ*59_peaCBVDwg){;&B zq|H9}C>`)Um21*Dm(-7F59gskNaZwW{8<}dIV zW+LW#(um9Ig()$0px#O1%om6Sru0^qF}Q8)Jxsg@WI*`MPdE;ANE9{A>XE(~qSB`BIbGH`)=Ys=Zq z_7R7S(DM{U>}*Lb_hC!dWq2KTn&7r*_$Um zCSx6?G9D+pfTr4tFNpKmzaCpu#+2X+!?=?q9FKlh4avTcxIa@+Wn27VW0@2W8e^!_ zo!0{PRM;>iXStbF!#HROG$O=Y?8i=QQ(&$EW8N{kn`E;1%a|PftB(&r%H#}k@+DK% zrm{+0A(GCY0j7w#Zg*%oQOc=Z!c@tg^aeK{deXE9>Nz`Yy^?Ed4icmsSTH)YB&r@v z$Lqmr^6Ii-2I}-$OsnZhHGpqQBytjM_7Matuc|rW(ryl@;5+y3$(bZU7oUoJrhP+n z$g)h(;@YRVH{M8OQv#Ah(G2Bq+xX0T!Q;i=@uD#%HK-<&f)e;nyU8;?^gA(>Q6ol%j&x9uM)Rs5YIrcK==Vj% zkgeMEyy>w@IbL1@*3!zZ^*xAUlHG-y@T-TYfv}tY!>pssKeN<;ema;?vrx|ZG{7n~ ziVtcCJu-w$@)oxha(-ahw7x)J%^Ed zg#7j3b_w!fs$>Rgy$LCdqVujuz(oGT>UgQ{t^@t90Q?@j$Ia7EkJ|Q*ie}kTg7Q^Xn6NMy#Kp`6b4O8!o!x`AS%wdcY6bCONmirBBBJNv1x z%)6zzEyPh8B`sJv3ZFP9Dw6TXETNMXqvtDTd6u3wamu5wB5SPW%SUJLpq= zYY6UkRi?7qP>vgO?rcf8c0OY2qw?gfZ*x~OUaO=uyMhij8rN`8gwWv)h*eDA)}qrN8tckg*udbOd%tZOk5R8Yk8Er#+d#_$_z6 z?nr5oW7~w*2J28z2`ENs7rcYovL#LwQ>nP)M>{>5rvAGW0yeq!j*+-7vC&~l@Ck@n z6w3?6FLp{<;Xl=9>Wd6D^v)K!h_L^kq}v!f7Lps9C0k&!!hbrI(>t0dA?Z&1oPrRU z)ye4@E&BlR=@d1{1|AN}oZ{4tcDwP6@MH3RfksMlppcj_A;_}kV~;jvLfRZf*18b3 z53GET;cVeHvnbYv%YlRq0mW3yX?j>_#@z*`s0W1bHi$;I-+p`zOa{;W0=p9%ENE$UG)Vn*SY_mU8PpYHxoIrUl%rxuqizP)`ZD5v5J0PYAQ@hU(!;~6=_oYtX74}OH98YTPARIHzmB?3p$ zNIpkc=s^rnmlU#FnYedEAE82ge6^|{U0eDt(F_mF7_dHyBJ$QnCYjrPk0)bl+*?y~ z%%Iv4d`}=i<9jS`b1yRik_&=>SEgYUjyn^&p`dnsE#7^RtlJ(N4NZ#miACgEVhSFr zLFr4$D*cA?)GaDAD{b|Y=V*y0OoS9wcjz$|ScAB#6(QHMIeF68rlBB4`G&ZORiHf~ z@m`4_Hndy$}J&$NZ(M)TrZ}Xk^F)kJcNsi*&J%DCLjpglhUvJ+W#qxLOTc4Ihgm@z~W(9N{8LmeX+Rv^z4tIH=ajZf&g zP5lICTyn-@836isEDwyal(mWfA2$m~JV-<$NssJBQ80#iGruK(Gv}Fo!j6~~SD1{=j^%5Dxl%XZvu6X$2I(6%S zu*FWt66sl&Fov*hXW8A|(AV!=yHhNABfUo2`N|Jg^RI|JD7=McYuVZ|651cKE3&ST zP!Y_h<2k};ZR=6pGw%N3JjUnqzqKnH=Jt+1qTmTL8cc9>ameA6Y%T5(a1ihoB#)w8 zB$AS1^nxtU`_?H5bJ*7ooXqX@+bdPaOV&1399;df;%?->D8R;Vb0g*|1QL-~&x6R> zz9@de!d|RDb$qE@;)x!Y)j1U}_&uCZSj2te1%UlW4uk^aj$N)klF}#=_$98tItQzA~3oyuZVv9v?ti3K?Qwn(E1TYouE&@sEM54a7Z3S9D z+T-h*YDM_xdf+Q!4c{4jc+|4N%#abC+90qkq(KkM-fkw1c)z=u{WJV)L**z?lW8|h zNa}-4$4+PXTRs7KR1t!?H012%%a|aL-|e8)nv8K&1fp%=+T^(2M%L24V8Bg;JHNhm z5W-RKQW`!PHW@1ZzRe*w5C&93pt;x7?wDV6hRX`K1RAp!33og4mC>Sd)i zr2f52rT_Y*Q>0f z*%-U>m@A8eiFUTMbL@MY4AvR=R-;4`7o3Y^`P%}&l_cR_#}Qti67VoYaWFBEsu4d_ zc#Yu2zAPg=ZVxb&LOs}0OD1e>$o_y3WI2B8r?4|);7XTWglU)|{ zboXj8Yj32ynuolD;#YsubWH(m(u*AGw^wIv1fR0*Ml47((JXE%*s4RWddf1Se|CV#DumRptF#3{0VxJ5DdR zYEflN0N1vRQ0>GgB7U|Z4cLG>HR)+plxtV=CSvsYB$V}DH&FJ_47Ja4jvtxl_$LEi z-E!ZT61^OpSz{}0+Ws>{=p#E)$@%-2YH{na7v%0B*p7npU? zPX<1%ziZHm%z@l=X*!KlmAk01o?gEE)oY2EJ#>eAkh(q70OeK0CV}aXRI{*BM%cVH zv59@nMpEI3u(%E8sn0?|^2m>a(iaif|v{&;cQYm{Q)ISY-7)kqJ=AGB>2K zo2too6aNs_W>bD{poL(06?4*dVKW{`e|2yeeg6H)SGmu~ha8kd!|um1 zBRU`bn}GRF^sIAG8HYd{i`k8ObP<3?{RT=^R6bcry|aGud6T5}#as@9AFyU$^Hzsy z`bCqBk$_(S>wmv$dm67k*k5qiR5PU>x!^51&my~fDxy6XIa9a&;W}Yb)oa^Y;fYnr zARjjcgJIC8wB5A`*qFz7II}G^vLV|vW;vb~_$JL9Ba1QEP(AGIkUMb*Y+P_aabyc| zknTM6g_k^J%KmA4#0aSN0+)md34|lk2ZrRIJdhQlM;5bjNAx6xX=0slAs;6@{Sq?b z+)zON<9IPLoPJ(CDh1%~<|7KLR3K#|Tr3>xIHu~EX;_a{y52F#z1gv>{VRjda^JEk z4;2gNM?n5ida?Bmm+U$CO0(qYf^+emrQNi<&pN|;p$L2I?3g(Sq}qMTt+B+O&gSjW zwqbyG5)+HIsa(!pbR9`1Dh>~Or)2{x!FP^r0d%erw!6FbAaARCB@K06RkN|VUy}Q% zkP!QfV(W9!(}iMU*KErp-NAmXVz&f&o-xH435eg4E4kyR zS1u*|F*Y;QZuoNKEzbV=p)=T|m&u@*EbU0ZPhKMLt`TI=_>Z1)GwQ;ufrGj+UZYEg zbH2$WW>(&fAp36EvMa(GE|9LkJ6d0!_}rzd>7!^xE!ci$bn0E$MNV>R>SxIde0ys! zFk>LsAdSBx#SWh;QOvwu=5<*s@$Ex6+jAIdQ!^HLwqJ_}E}xmN+%1u^-30vXKtSxt z&KrHTSZLU59pBJ&?q%FJRgH&s@o8mv1>O;@k=U|Qp;RiANT9rbO>}81UxnV3$iW&N zr81NWf5pLqD7F*vSa&UNrVf;eQChN#G?79Un!BF0ePrYe`$TV^0^J(td^EP7-vq7* zqe^-_Gow`2`b`>c=Rzl<!9D-2Y~oc12ElJv*eL`GN_#YX5eP9X>N5cK)M{@*tV68QB_Q0B677PS z#=q?$A#yrp+qz00=T(16nD>Y)ZKxYqZzT`Wxnj`87t|gRz6ofHVkNbJKnu%IWb?S8Q%u|K|kWpc9~ImS6(pg;~66l;pNE5|UN1276dt zA59%mn)jB6rW^^hqna);i7ETzY!NP(b&-?9%6URO{K2(2i+IWDjl4Gf6@S{?zJs+= zc85+DZ2FE}*T2LxY8ZT}(KvvD>9HATTm%k+7IZn#FyYS5Aet7`8-l%jQ6!uDE_B~86LPcysq)O_)j8QDX3oAn7RR(UzU~xnkQxeExaj5w78KH!Y0`an%gl%b7}o5)5kL|W9E(>%>GDg%Ls>m z;#^_s6o$wBlU;o{q^>#;M1)L=Sk!xCp0eS{c^Xf=3sDvJH>`)0Zr;jGVVNK7{_DTh zV=+h%rzW;Aya@1&Acm@&&LhQoOf`Y8gNX+&+1_5z#lGgkJ zI6|A|OhLG<+f;qasD6jOw`SXdXy&m)DFK%r5^WUiX?bdp$O-71uvXD$U%L0ce{ zMG|Jx5^6iuDh_k*CYO%PsCr=yPpXCoBdwkdAuE6NTOTbx=3M|m!^UpW1w|+i=s3Y2 z8+YSM^d8zHj*7tP(AZny>bl4!piwPiYGCw2ty_Yn7}yjrK~fLrLAfJU|kLU zqCETNU7FMGuHyIh!4pTZ3MTk2EWLgeXuIChG*ud61S{0um?*Q^gR`yY$LfESA?&7m z+#??=h_|N34yZ?MWW*xHcu0tNx4FXm@o}OPTY^1M70|BtwY&H=w3crYdD5BroJKEi zQAIF5zn;QO$RkA!LWnfrj;!k1?qNy|y;I%7b(}pc!_Et`ruhR9W)uAFyCGsD3gra{ zw?wWRsS_!Q4$M*i7`GpM4z!fmgsUzK|8yA18huPp6ZXRjleMDbPtPavFapw%EUfx zLCkhARAdsedzd!wbiDOiu+k^JTlgtmMFC{=_@Zk_Jn9SO zT6B9~0H2H9{q2D+9W4*)*PB6?q*Ba9!;Ks_ztn0RENWJsa3KtsN<=_H%XkkbOUJ1) z;b)VJ8sLokKxhILsH;jj!LV70pa|CAaB5RA$xlOb%Gg;kD_8_Nmtxc!SaR zZUFQLW9Pu~f@#A427_V#2KrxpmEa#D2%$n#jg=eu&jC54`&`b0ajFM_wKu!q7tVhX z%C7L=Wwd-a95W@|7x7Afvf})MqFMvP#JX$zU}v+)ReN>*2o79M|1f@;0@REIbKMON zB}bI`jVIXIVnPlqg%lc21#M0W0Gk*5z>EgRm@ah5*B#0;v6QYOZP9nOfuj9oMNCOs zCUY?z$hfUl0 zxxgDqpN|lpe0BD&C)7lWGR)hj@-}_ffd^g1#j=H6Cx`3EG$l`EAPKPcz0|q!Yu`g^Ujtv8i|CxM+iDU7z`eRxv{(XVg>j8;C%r_OhJjLcvam2GO*8cJ zW|kQgdAD?0MEtUY)xgK3#_s>k-X4Bhkhp5c__;-|=P;qjArgJRJfscV=*guZ1Fxdw z43)8Kt5qC>?6s>P>zi5Xl#F0`ib409+-aLFZ+4n_0`4lcFpYUjf z2Q+!V`F<12&WE<;eP80~-VS;==Bz(c@cy8Wox`KB2nBn?>%)nEWGt9buXuqCazxLh z9r3P~<4*@Y+``y|%)YrFK6;-eeR$`rN8~xQEHj>y*X3@8G3R_)5_}9MmVw&$_lu;;R1L9Mk=tvzF&>nx6>PepSjF6p zjog8Aq>-2Y!^uRGyS)KCSqAvuzuKkP_^nU)y^oZ;;@rHbul5ve<7oNJ zaN7OPJ)o67d1ttOhWN*aqU}8y<(Y6(4MJ*VEm$4+-nB_KAF9?XxVf8f+b)Z6!yjM%4!P#I=KI&j zu)VNdu$AH0?E5m_%7+57)n4ChLq>92h-``Y(@}IepG}GUz#vrQZ?Q^c0LiZVLt$wV z(J_x+x{>HF9azX&Zi6zVY}Q=L;n+U{iL{$Icb(ZN2xB|T8t_Nz!S;|HQkL1`i|1Tq&0%=Z;}tFj1FyB-B#muKE>#7*&P_ZCfN55*imb{0`d9vU;`fTU)%J>nIC~B; zFA~keqdi``iuoYt=0AOTnrw!GJBYteF&+_?sNV&BfrNEZAxW9&uQMwXdF@5}>Vkw2 zvMT^#6EMYGaFmOW1g1v4s`)77+<~L1rmY8?U@MbHo-$u5&Pq|=(vhRUn6n7wfU(hd zdXjszQxOB44=N|xKx;7U@HW>01?r*hlOOfQLji146W*c@&``d(nzCZMQsi7J%i6k|@ z;hyj5yNwUuY_t{sqd@%n8t%JK=759Unnb3R$bivc@d%;BiWnlA`G^IAbf&@z(H?IA zPe8E0ZWfC`_ei3r8%o75kE)g*eGk%BFB@%s+GWA^Pqrb|l*XUnXdt}r&tJfb%ZeAn z0C^jZ+>T3%7j@q_FK-YKm763qAR$NaoKXWnrO2NmS=q*2rZO+6WjugwS7Q?_OTV2r z5$|I%{Vdf@MjlrWKX7k%f4VJcScd}qYe=jDvuf=b*MS@qW;Kr2fQQi+6((!@ZbXVCcHR*;wb{OCA2 z={r0u3JkbY`~aZizw$-r01{WDiOImW=Um^BCTwp|gB?zYk>^Z8SHn)+nRl?kthg~` z`yI|Q*M~D4ley!#Za&;x#DUpQP?a9J}tUQae=VSRTa+ zvmSlE%vX*Kube~8EW*guJC*_PV zu`O*Qj-ZvYf>4nBq-kGdb2MQv3zO1g8Rd6>h$rVoM@y?dl0zLM)(oC5{Vv|*7a6xJh?A7ZYgI`yJ?aG9@=Rj zK!3kSS9N87ko!c`e}(mZgh|OA-YOT%WVQVKa-ng0w}b0hpReBmp@~(QI9rBmN>wR4 zyOB3D>HN>43-XD4Vko}S#~VFV*upg3XY!T9_gLJ+Y7Z;%*~T>a#kDFwYQL{?yM|Vu zWlA3`82*#xkyh#14@+d~IUsDA#!hsJv$*?l$Sk;J1<4s-qtV+UaFEv$|+7`qT$bS?nRU8lUHvR`q3oyq@?wt@(04FYho}9#p84;Ffbd zAz6{!Xbr0J?^-#n`Zne2^+kc%U{ETfg`8_nT_B;ZW-+g{3zsW@O-O6bdOK6o(hc`! zM2KxC>5+@PQ&5~Z%jY< zPoUTixemBGps1i=3xnUl7-EE|W1!SeI8oEx|BA>8l=aFl1mVe{C$}x!;7u$-qM_Y%&=#)T#YWDeE7A2z@ToY9=KNF7<2HKr4n_g-p|0KB z;yv?Xb15j^OF(=+Cm>a}9C&`qb^Mqk_Szd|CN zhjL76$(&EhjVbUWbC*uVhkqg@I;zKp>^%BZxHJ{z+ik_h#sUcnigry;0L zfU(eMR7b?GO@;0%fcK}VsU3@XisxB-!c(7x14b44Fpb2Gp|w-* ztAsQHx$08~_Q^@33o5h1&g%TgeP$WUs`{XXFU=hX)q_PZkFeyG=YT z?WxQUvOE_)2TQe(U?4hrN2tRKfZU_2`NossNslV+Ec{q`Kmo;(dp>AT;1hqvXm^pp zzw8b%z#s!WZI4Dkj~j3>*kwpLlRU^LH8uOn>>{^Mw1RAD8l#%lo27-Vh*=ax=vT=n z&RF7h(~ZPV>^sN%0s#!+et!8*ES;zWtf4T!Y1a*dvQYZ9dKuCfySwFnajJg)SH_`` zQT+HEks&NzjojE97HaQ-#oI3-mJ!wrWLyf5Jm?eMdHUh_;r{gP?lFTjri3iYI19-wUL}%O zkt0Jz88^Z%kC*WV#H4B)yhyLepRlBe`|HNzKr{U6?v8Mu-#J06=~tux2)R$m{F>{I z@b6j35*)h&Qa0F6KE4o|bYxZv;1M|(F#7iax+<2Fy8toy(Xsh>((&Ve69m6oGXRSQ^)}_V9})MGnp1nB z-I~ON(*F;NxD6WNI@Z%UDm*dD)?DfCIlSE{tZe{;zGoPThtV>%BapzNU&BHy95$^J z3EY2Ov{2tzama}VDx78(q5_4J4T~&wGVoH9XO$nHVT(r2CoKehJpSQyf(GSe2V_`~ zZ>jFn5kS%y2KrENXV{0K#{AU*42S-rwr0LKXDZ;ras$_Zn+8GK5gjWw=e4FKzs_lVM1<5!kXWL?!7oN!{-cfPHHaQKc{A)cPgr`t4WaNo{AKv zFRx7n{9M_yxUfk1l|?vNbpdy@jYJBPYqO|xQBF$s$02asb7v7rAZaaFwC7uZdFOrp z`WA%IeVwRyQk>u%eci}=XPL6yRujxeze8+iCb#f4&AmffQb-luyv2tiAIDm_0?0I@ ziE7j@wh%nGyU#urXqNEg7;JxJ7eLM-(a)CDkGoHknFe{IgK=j*iQD8wV4p$*Pp)0> z5%4s|JyLW4E1UVQE2Ud8Y4GGOe$36Acd&+Nmq1*7?jUwZh5@;3eyQ@z_TH4pcrBW; zZ`6L75is659vhdS%3`T_q#l@wK1k{56!4W5b%O{``6UoLFsz!rC(KUb{f2q5f7Yb^ z6f`dfexq%dQa~V3V!??Bz;iPZ#d^~Nt)-`)UEWIx?}PDz?)g5Ky}9U=SkB{j3AeF! zFv$(PY0E%nMqugcGv3Po1u7MpoXqWA4fr}*$+q_JrS8dtv#>*olA0-G2U{4gb*iaA zbP&BZj(ZdY+6#y#(RK7%b3R;u))Nfd*uiJ}`RK%(-E$VFT8*p5E&lI0qmEAA%A9&Q zf1BO~{X+0$gn%zV%CWfh*E9@L%V5P9U)DSlNrfl9cpd_VEzU)lCFSrsNkKX|8VlPO zb{?GnwE5W!|JT`~1;zz7Ir>~&=;IO|3)e%=RKf#KLXf7oZ8aQY*5$Fqtzkakg6+;{ zf0nfyx-2zC*EY1NQ}`GGu}_VnQkRwHA=ZG`Oy8b5?c zqxyW{#cJ8w!Tn<0Q>3uK-_iN~tY`-&CUN&>rC*Ypzc_l3&-p?(uWkevS_W1R&ttCQ!|+LKUq0tS{7S0zj;%vd-_tght|);WG>Va~i+g~CEwVTJ2`f+Jy4G|Q!{jE* z-L+ydha!m%!*kmG0cbJiP3o=n9M&HZ1*u9=?TpQS7jut6W2parSrl{L$vqy&U`AK; zd_&^!YVWo2^^%+a+AutObS~is>O82CT$}))asYp6!#aD__jp+;w~8vPwNs(y#tO6r zS{fObzc3}CZBFnt`6my&sPl6s% zZIXFKe&4q1S9;oTFg?btjYr8~|4%zqjsCkYP(sf*zOhFFy*hSj8UC*o$ab4$Q|@JB ze~)$1ctrzSkD)g&Bv5)svWkD3Pd$$Jw8RSqNhVsoO#5fWA0HIGF>md;#iQE^Pr6(2aw~kTzeobd8}4as}Hwr5mBJakO5~5oP>RBTojOZ>J}Q038@U6)z=kyy<;nwR^_RuGD0R} zJ+S2PF78&b>#O$6Xj{ITMle`pP9;MM7a#S%D#PG4(tpa6+E@8}>^4;*WI#!gUiFj? zTOO__zXu*J@-|p})CdWC?xGNX(Ktm1pJ(M}cPN%i_&LjvT-&3ZdLr5XYjFb)C4znq z&;!$ikNZm*s{WxlsZH~^QJu2xJuIGrrzJWg6dq*OV_#)51~65tK- zI>+4#;@c@na?5bAW!%%(38cYW2YGy6zg;EO_y>Z28}NuVbeX8u{TvJ>b5$=mb_#8U z#$N5$Id#I2dnRe#jwyg`D;ZwHf?Ilr-I;&v22;cEZ#uT@gV}nnx~a^7LQXXs&DclU z>W`JQ!Jy0+Sp))^J{^KiQxj>Z?wJnVM4NLIg@-C)^9 zmJ|d>qMLYv#Xj7Hr&GLc!>0N!qRHasFPcvesYyWI3Clcme zG3=S!NwtMd5ZH+9`z(cm{-kv+m>C%u)UcXbWrP@n<(m!IX~D*pm`EfZ4M>CZ`qy$f2d!;o zTzYA?`0H2Hq&wFakFMr3r<2AlGxaHDT_4$cvrVzEb&h+ zM3EbXD$Un|Xvozpn=oQSsEqy_;rnmH<#4E#?MBY8FGK$dQi#P=SY8ii;0s#7598^a z+v;7$Bx70=8~MizsKS+1Kk0;XyO zNbosQ5V~i{)y+feIZr7mZ-y5S_v={8)Hyzm|0@QVbf)*XU()?d zL$H&$xG-02V$Vm2Ih)IzClhKRw23m6zfl(;1a&GDH}hQ#MR#Xfi7n@!2*SBtvaaCJ z$nhLK_B|Z&O0O$eX>}*YqDG_0+_zO&R1Lyyk)EZtplo2mHNk~>6HrH~$N_q+{y8Vw zLr|y%>?_-nVX&1^7nl`d4;vOazo9AmfO)IOjdv5FKbeB%hHTz*2-IIay!doA3uAtn zU<}`a4Jd>SSte8J2yXV)b7Vw>eUMJExpv&i`*X0C*1X zxwjo;v)+O(-~AM9Fs2W!@QN=aDhjI9HC{nH>(Oc)5k^oq|g$#X#g!R}Qi7->(=^O-v3p*9bil^c9PgOPd47up$Ljs5q*2MSMH ziu)v?D!9|+#|{`3(m4iGNc2IX=*j712i=N?iA%Mk{02-M>NHg`P8i9LJ8zf*&p6I%^rZ14 znIU|aOB{M`foj{S_4A@dyYb#ZV%-JeEgF3Ed*t?k$f|=y5RZR>l%+QTfxQ@`iDj1& zZR~N36}gxyXacy`7e!EZ;XB%V6>=14Ev4p<`ZjN*9v*beIOW$|MaM$RMc2+LLeo;I z8`qk|9g`?QlhiHvWJya50L^j553u;nO^7cU>Fc2TRP5~SSD~>#6&b({?A-fSdpLGm zv$es2^i*9Br3+XrKDLhc47sKDrx7@OKOU(3_LV3&ppQu)p zm*Q%FOCF6;W9%-5o=`fi0BYxZsjbOv7x-IX&soczfZ`~emF zb%CyIDyM>7B+!&;8gTqE98X6Zj?}!H6f?ffJ-JSrAV?cd;jYad4*F-GrasRTEQ9?a zJ``Q&qj3gxXRGXdV828(6%{YaPr}pVMrmz$%Aw)~R2J_+pXPqWZ-g0wlXlrhVVEPl zrf}#+ZGIC8GlZ>R7Ls+GRGr_{SjvN#7yfnxEFiU7JtI5g3fm$lc|90~xedOkd8+QT z4eq(uEz_pD@Dy-uznr4Xd_nYjm`sbO08h_RwKpE=1snR)WHf97_a6T9FlIEXzGO)LUua?_HBJZ(~7fn=HV#- zyj*lhmF(q<_e&eL?WS%dxub!F#KcJmy&<{E>HU``7@l^{Yt<5X@1^X0G^> zFoXiO^7XzBBmU;G$J{zC6+F(6atJyQ54DbNT+!;BRbH1&K)*vb$PhkFazIn49}owg z1W2;^`ea1X^CUuCXRLp50z#P9Z;`0gwxC5^HLD4^h3mFF>*B)B(`&CEB+bi9W9iY- zEE?<1dAeJsSW{UkEF}vs#CRxjohodk45pD0Xq*3HJIIsYSY@{k-UJ3_qwyjQkL!}m ze3A3&ENNj;dNH~)+_;pI%OaWytRoopr23+9{`NTB$~$KMR~s-?YT1Apk?IbO>h|ky zCdU&8evICOgb^WXAk8ZWMRg1EkQ|3?X4C2##_C=rh8qj=PyLqx3Lb04alt4 zHt$Z#kWiQsz;6tF$TjcbfEgjFi!Yy|>P~-|4{HQeeu|4Yjv&J0+_zQ8{9@n+WsSGR zTH_OBGoOrd^&N2_<2;0N(+_#WmHD64HoyT_rmwm$a(#}u)qm9|sT;huQaD>-dKt|V z$xCYqPvgd!rXbtm0aU07$JfCmdqi&^3J!aV4CgzwNE_urp*4NR(-taC_mknKM`(0C zeD7Yqqh6jq*>_ES-wjT>^ftj~uuSJ;QnUcArxEzocwRJkU2hKM<J&j$pf_xpa39==0ye-`toi2!xq2>Sq{>F(>13j9nn|U+2V5gIv%XV z@J-g9<3G0vYC}#|>GoVIv7lt!s<#cz6>Qm zrEAwid$|3EcPNmjMC!Yil)TedEP*CV7l{!0x(*Wbp2;p~%EB~&D6Z-w$`Q=^m5CW6 z`cR9%l~A~;ZF#R=kb?|HP-@T*+?IOF=_umh3EKQpU~tTgr6r7P3!bvkSUSt zN@R(F6vDI%nK@^_ipax;Dz9wNJYEoL_H4Y9Uja{Va@CHA8JBZBKiwL3?3Az_5TC?B zTx5V|z_C`D&w|wk5g8zUC!NKa*l9{c^4^B3{`|@uqhZ!J{(Hk==5eLf#nu|<>ofEm zA+<*oiSd%ZWDmgXUV`6mgT+*;?AumlOvbL^W|W2QrMC@es7wa9cVxa%cyr&Sx2K<5 zHi*J%oooS*q-2YF#}1LvJMZD<+*rxF0ivcycCqz$ATSXH*4sIrkD zMkd4oD+~Oi2H*lqAmlNc4%0zpc4^omlSIfxU)Yuf({dS};pZ1;8R%sKD|0mDhOUQZ zLt#zuQJb*RQ~_V>E)lAD@%`>_q%<#!KI-h?80A$MY2D1ql|s9Jc)RtCn+6YUi28_A z;EO^wky;)VTd-oTDogc4SMS>^gVYL=jvNvq<&+PnqIZLP+AgJ6%^97p2>lIr{5MQ1 zn5G$1l=O$y5X03FcEYZoX&+n*n%CHtP}*CLw zvxo_#Wbuo=@bENqHjxzUiMi+obq0(Pc)6w!Jf-#JJ!QQ*3Ck$GmDE&;7(@XuiKpTN zyu0JJn6QnT-DFN;D{>RsaV(+plOEmSN#ld{DX4rPIHtRG--kVPXNR$aUC0zI8{WOE zY0D6iZ{iuT>(ee7cj|Qg9IpPlhR;rLp;irPv#9`Sb^+7GqWtUX|G3&d8EgxRU5L;z zZFNhH-x3NvxaE%QbXKKj5V4qnakT~ffv5Sd%vB3n+bOm4`s5K%Efk>@h_# z8!7y=EPo0=4Yo^ObL!#Xs=%hp+5J3#a%5lMoce*I%Q`DVTV@!2aw|Z&mHw$C@;XPg z)XaCf+7B%h+d=IW{#GzlKLuM2iEATvK$Wi8ajNFLOR&*(RLP<_6balOG;Gm4tJjapO4{ip{dtt~`=QMh&+;cc1onRCWe?QclxF9&)(zzQ@Osn%J5>{S`1 zq8m5VidX*aRdB3|dKvi)5J5=xTi@$G1&#Qmrl3Z7B3{t2iZLF$Y`}HL5b$X z_ic6g_^Bz<$9mhz`d~oN12o%ruDIHPg?%i3CB1ew382y*GSX2mr0@g($gomG<3+k} zTlmaG1!rG0{T+L3(1%z3)?i+Z9=L3<9JyvrW+S8(?OT*iu+%PmIh9tgvsfwnS~2H- zr0xxYEJu8w?2pJXBZ@CGn&&iZOcVxX*!G&nUZKr*HaWSAVu?1r?zIt`ruuM+Cc3wO z*2Df6eks<9(B@cY@WCxRZ{q7S!jI1Xa`u@b_^!Xf#t99y6o5_c2@V|Ogo*jO|1k+= zH-*z_17>*?uYaE54rRHEl2lz|vq=ao@*|NEexkG&>ed8D!~r``3#xB`cLEP_WMXlUXL^w-OUKsXOp=?jAUcTjDI@-RNMdJRQ%{$Zl8>c?`fibJVG&0E&rW|qKIitpGbwj953)w z@!fPv{7>_z3eWf$?jchOUYVYkX#(#%E4lmw9isO4=-ryb0ANnq^fxe)W>HsBm`qXTxJds2mF2@3I z#6*Qj#^Nae)&6oTRc<7N(}!0cA#|s=u1U4)(-sMtWmIuYfO-e#X8xa~=R0mI6F|JrIlx=^+pN33q1uqMn3C`VjkdSagLl07K zmUe>2j!(9--G$z*a`t_8e0}H?vSGVLZb5frnbiC2&NZj4&ekmmJ-1eA3D}vY)SEDx z{oulNkMK#Tq_@lQXd|B}o-)oM349u(PDO38JQwttahU1S&k--f8dv0#FzMt>(!__8 zX3*|S=u*}^`IRtdoH*DMrW7c(^GO3c${k$A|2g`1GzG$eb>NHzVND@r&PVzr3-eH! zRjzmSLNO`U?R>Mg!tejA8tX@naQ{yXLHj_WMX(knnQJM84rOR_Zgom3ak*2%ot^pf zrutJikXnAQNhX=9w^^113;8PGjba+YjU3__c&z6vZvDO2k}^dYI(nAYMJ5t&88&j& z@>t8IGTG1oLkIF)=0>=k3SgZk7zpNUDS?d6L)EO}(K^le#cvemb@SlOiQUY^IQMyA z-w%_90A=eDP&-cBL6!mMOg(&|0y zFNYO!5U5`JeR0M_wz0+X*TWXyAnlnA-fw;G<}&blAc_&~XR_1Nzxk(=9SF#t|2?1b z|5J`0?bHX;w^kqW_ri?yF0e?g0v)IYOD}4zV-7!dNXg@t_PxS#j`-%Fl3N>blVnuo zX1z~-Y|^1+%#myA{jPz0fq&2`(s#QU=_T%Wj^h>V(ACE3QF9!-m1dM+nVdsi(?WqO zO~Zjbd;HM(vF{2fW(Nc`I#}MEJ&r>^Eujw!(T@|jZiv5(*${@LHpr7KlSLg&NU(Df zTwB;~2df3kEVqD9T>E(uYlVe!rh_)+bgXHYUp)e`LMvW*5Z*B@rw+Ne?c-A5;nQa6 zU01}mn>^1f$xgF`r5~Sq4^T!HMBBaZ{k`*GeS$<`d$i&jK)$~7NG=7on>inaXE^GJ z_a;gD?wNtGEk2fB4}`y<#TiH6&Uo7H)2vXa!I+WmP)UP#;f2@Jr~Ip=rZ9rJ zf%qKxl^XaQ;#-7tqK9bq>teYgDo6V51&erzp!pI*tQOcZfFopPzK@1}W-@(zA$l=n zRSOOPGO=p+rGGvlh~6lKq!=R4lr51KMNAAdlaq?p@;rV6{>5gyIV~w>9;;n<3!mKH zfwL)Y82MzE?8x+9*x6kJsH23oxIWVT7=+WhZ?lKtjwY^Hg>it-565A2jSuowJ_D`< zZHYy|2aW?B%iv(D5@;V7EA%PQt%XKbI&%{yco7ZJS%DP^9IkUw;t!#k7G+G>mD~i0 zoEBi^Pvp3!Mo!9IC=qkaKH%9TEwe!tty<~R-verFvjbks#;GN-}p_aPrYJ5%J zIm86H>R54xgCK1>1LrD%KqcS!(L2(Ja%c)-W&E&ydSNs*T{aGj)1$K)$7~gh+sGb^eTZwnn%Y=2pQ6XBrX6q+-2{6nzPA-S<>UL{TTR%XL zfq^GEuA%jC$81*mOc|nY*n=!^6F(0o&Kq#6IchaQU*ebhoaL9IeffHD+7L^SMemua z2-9})a$@jJwqLtp9zH7YW4JP;a(a16#E&1`ZjLDMtDF)jZ=-_ zKGojjIq{rqF<6b1@b6Qk60Y-QUmNp_hpV1=Mk!bKN%Q>mhxHq1ah;7F!MgZ42HYI> zVXtSybEpp2V7;?3zY#Cf67Plrz+e2hGzxD52s9Z}Y>~^>> zxa)}6TRE^B82FKnDwCsT$N5?ZM3>4Fn4i??~`?79u4`!&v>#%qeRtal?6mT~!S{zA1(A7@bJc_1rbG0@XCJi2ufkWEG#%RQqbNrej>_ z8Fp9~jq&oucUemriBBt)j1!li)rcSeGG+wV0=Ebf?9awXEzrwi2Xj21uZl>39an8m z$%dUJ#PaIR^NxD|Y62vBYUAtl4Q^4i^f6=vwsQ)%8Z_*3n(hvNmCmq9dHiYG7*^jb zfIWRg<0)$tg?Uh1I<=uBP{YjAlY+8uQzR~y9RUkYr4-^?D|>jxqGiRWH=_PQ7Ip;{ z|F0&gY&RDp8GYcJX+^YtRbK*njIt#QnUD1hRMMBHO3|n2RjNzxJ9O_)5{wJN;*dsr zD$>Zk$Rq#6lG8j6O@w&kwX|Hg)*2N=#DUKHSH|YD1J$ox07o>GT1PYwC%g)OC#HE- zAE4^fYq03!V)g%}p01SL7Tjp(?g(`=zfNo?fuVtQLfi&f3>h^z_=LG4&vWFXypd&> z_?vMOeyd$L78 z^8{$^v9L1h=ZspRd|G^LXK={7(F3`z>XwS+-aQ=kQ%!l>6vt}1{XD64NqwqS|EF5V z`TBZHbRTdqs5^J36(9#aV;;3je{FYapXUND({oqpLn1SFlG$T5c#$0twZ(*?cE+hj z!MQTvT)DGg7VLH_|0x{+(KlyuSn`DYMKU9{_6kZqvLkn>jd*^=ncCToUT|l*S*@|p z7&`(8xsY%_guj))+0%F7_6)7T26$W!h*OjrI(lGd_KPqUW;PfDvIQ0`pi!&6&y?p6 z*akHhWY zVHlG#m>mOt^Qw9Qz;|k^mXTwFW#P*33T7c3h0O+JGp!8kX30>YP$a5=6|X?3$9!22 z+I(t~pPFmwNi&|9P)Jy=Tn#V!RV9cG&sSChITpqXLG~Z}_`kP#vnpTT8^^AS?Ai-Q zzzQW{?aN@UvK{qkgmLi3%Y1{~T`ZrVM}J<>ivl~`o$uLK4M^foD$#n3Nxg&^ zP%eNjX@;vKmK_^V48(Mh6E4v>=R;A^R3Q1Zni||kf>v7b*^cQ*cU~tXD1B<{TFM}# z-*(Qz>A8#=yidet8iCX?kvtKz2;RDaN#HCtB<+Je**(|0oztyp8m~$fclKZMn{ z@)XU8p3%}RS3M`Ej^8t3G7`{|nK$np;p9*0Y9G@J@6-A=CIYzjtsR~F{7v5&_zcSx zy9k{{jiL0p_yB+6FY6$&cq*$HLNVHqY?HjOa7j6j%|4ZKIT$<#63|=oUOw@xD9F-< zz(a{SEy3o1l{~B`&pNgbxMmB0aUA{L5I+PRem9{AFiFlvYc8s=ET02F(8)c<&BfBT z@)s5A7H`vJh9ahnQdE*NJ82e5cphT>aVY`+`c*p(W~eq#c5lk zQ!$p|QjKWK#DWz*M!_UOE?*tGv{Baw(FTj>HBrd%hz9I_4szOt0|^q zLHs(`V7c=)d%(>&tC%4kzcK|(T@I}_9sOYj6 zwCC^)k}}s7)`{T3(Y&e@L2wvh)CF0r`5DLAZk9X3=>d5jFqIL8FvWc5AR%~vFvaM{ zAu}xlD|(A&(&c46WpdkR&lZ!?cn6)BsL}I8cRzNRv7NUMAwXiHjR0r4JXB*des$8Q zerhZLbfVuU;U)sQjxb0?IgvCnGp~>)6P1WW#elOb&VkjIgAEkSHD4ORK1E6kBj#@^ z*l(nq3Y62b2z$HtHh=bb+^pZZEjktHNV}zSt(`f6({-0@zEzR?v0``+-;6rbhd~9& zH;FWSwCn^$Il?-2D#YPYxm~CE-O&(`TA@*nSzJ~>G+FIi_Ki5c&AAmI+7m7s=p=&- zHs>~d*so??QeR4+4d3r5iqUPfZ7tgixE9(ng`c0SF1sScT$uuv^hzPkq_Cr%ZN0yu zIDuAwGokX;GCQmgOx-Nyvgu+>@u4H^N^(ZD_fGoWXyT-q(850P0+`cLoz9A+JHk;3 zKY+_%19*34_Qr&SgfRcGvGmyK5s1zY9{IZ~RrT_iPt3T{Z1Y%~t=!JXZ?_7LC;%|E zNWf9)X)j*0G*f3FVkb^xUF*TsP3(_9c*dxO$a6eKeSKV*#kPhoWDNc;5TSBt;P^PI z*g(<90YB?iR+tm_*v>!|A-6l4Pl|)r2!cdja^;T6nl5Mk?1ElXoWpL@x!`xmUk?^ zq5izPaC+Vw_j=ZFi4`Coe?a{WMVWowXelUkN`I~6D*Rsh#%3^9%r6hAI2fPU=IxP2 zXW{H5@F%|`0uK2L3`aE^5ypU#97?yp=y1^4-A!2`rVqIrZApQnemaZu%`s;9ynccz zgGZ4o)Xxo9rB#}Oe{E)-h;poHawKZnb{aW^ArjMh3`s9{NhWmv_}O!wyLl`@^$C!> z=pphU7<2I|A*V@%2WQXN8xqRh0+?bUlc1b$nr6TfBOtmI-ZA+kH%}#=LT0H-1B7t17OBp%J~5TCi8VKK}&>6M_z|`Tb2nAc>;_ zPjPK#DRaAzQu&_n3^Y`G<4{tX(u#-NT(#|rq01RC_lHSa zWAoQ&uHIM=4}PS^$=TaBi>@H=#*}}>=tbpLLQ#)MJ<&3C4$_0w*uxxm#aZnKkL9je zUh(@VvFWW1*@jl8$Agr7|Jk|_xQY6qFXYv_n3F8L^zaeJa?y7-T2glx{nj6zY1eQ4 z-c*(hYc>0L@$;AN@(J6#*NnsXWE$_=)a%%9G1+qG8C!n$Qps!xz2BoY(>%X+9UWSr zFN44|&iRTUcf|kXk_9bp@UsPq z&BF#X5|$DseCh~4$UOSv_tH_+*A(tE7nUpiFqnm9=vlPyvM$={wa2cJZ=Z#X%Lc*Z zcbj5bj1CR|(tQe3QuD?Fu(2Hiq`Om3RTE0m*$JC(Hv>V&1W$&Zr?wHCQPFpYC7>a0 zQhE?K2alZ*bVU@$Ij&1PeFkDo-bJm^@(U|{D9)IKAhqK6F@*`z6ADbaSy zYz93o6y1IeRP;{>^@P$t&e0gv+~m1^Ew%a;1y^Ugk7J!e99MbxjMzn_kD0WklXjOO z9WkDD5YJlgLKMzSM+{?tRD|iKR&ai|c1Ax&Ao^QZ{OS{{%l?qwC4xZIx~ak6NWz4t zSMryY&Ky%hWtt8O7yexJ4}2KUrHa$%q-;gpk{~0(Gkv0)ik?BqpB7r8%DJcXyD}U0 zN9(Qo+_sTnS)Y_5tI32vuFy|Gg?trXoS;AS4F(gc6NFcxUb=U@%afHvEzXH(8aSIF z$TRSBk>wcls;SQ1)k&T2ppCXSg!JIAtwDlq?eZ61U+u8<7;*JotrsHD zP%y3gVq`!S*{Yt3v#1Y9WjX9_gZX6vrt!^Zljh_&td@nj(cNO6k~@6%vh!R45Sun5 zy&HWM;&Da*)xQ)da5$(MQiB8ZO(qT-GdKaT8*?=(gZV$j1|+n|i4*=EE8SQ$M69HgAAY(Y_E! zzVGSfO~XTZ^(%>wm&7Jm*SiL0a9Pdzq}Y&Y7Np!}so0oad5;8hhStorAnJ<%w*eD8 za>z`>3Wzkp{qZ&D0SIDDyD2FlOam@HO$bkO%Z_*Sb2$&6}atQx&LWResQ%k$oq$ zZU&^88XgqPl48sBL5`Mqt``BiVaZ9XSClzro?hCZD|uglR^%VVvOL-}mH8ihFZw6j z>E!ANx9@5JOb7g;(&!0a*#kVeixusbG#Y!-=e_#kd zn!merDMCUZt4U#H)cO9-vR@Hn-I-IWY)7~XGB$>op|k6Ajf8O0BV2uE5r$q%y3LYC zWPX}i(=3DmIh@c+X3)Ky7AN5J>7Jtz?O`{b;@1I5HED+`Fv8pxF-6+2s5ZzTK*y#h z^FHR&+9yX*%YQ9jk^=~QZd>=Da-(hU+Jjr*K1<+rEJI4ru|Y{_wp?zK1*XhJtUd%v?e(f)}dDM~P?qxSP zfscIu`Ugkp;9L1WY?RG0?LOqKEMXt1vDr8R)OXV3=Un^vS-U{Ae`fdPw%KosI zYAj4G%%5rnm)}17AB_0;Ya4#neI^`=?rhk-jaPbc8{ew3mL)Z zY8xyRbyw!%FBlQMG)myJ{W-{Gzv&Ns7iK;lgee# z_5j2NnpiBoE>~fH29fDE^lIQ;3o@09T_k?YF zSzRAIS7)Lp(Sxc4LU@lwSQUVulcARHf@}EVm-tbN$#Nym#S>U) zG5+Q5bdkQ~{a8QUK!6}tL<@IKWh~5NN48E6ZCc<%pYjX|^j;cBT!Qpr+qXZvxP4|H zMUnGo-_DBjM}MgHS~Y%744(x8KWoTq9+~R~{ugcNMo^aH@$;kH`FBnUCm1&BXx$D( zl()*wqy$P>3vE_~pEMTl;M(@BB`wTYv}}jPYj~9^sSvz(S#V8Y4{9qfE=o!wW?exBh*~okIz0wP(Cdmde%;{cCA)jar}((d>3` z?7B1)>OX<4KG4akh|$ZbT*64C+0_geoej=hXXL=+cfgMWuUN2h=5D=2YoC z7yW?_m|y+wy)}ut?bASH%GJ*wHf%`RcX||c!IC!KN7Gu&#D_RP8EDe+#7<0)I`fetdop;3ts^|%r*Q^n|gdA+A! zpe`231!ax+C5f|oYYq5)t3PZj1$TBQ>(V7^E-^6$F2%ks2xgc9)n->;+kdkohc-?m zMj2nO#>5&l{Cd4TIrX{O-bILxUi}0q3WdL8GcUg^iHyO*nEc>&y#b{ZQFn$)y|n#y z8Xb#nPZqa_NkMYDXbOMICa&>Rzt;rLR`r&JZtm7`y7&orWVl=RJd_BIfmiX9-H3Ko zWwCnIA5Eo+ZsO;?2p5p>vZPi2YLWB~)=Wp1uYn6xo=n03KS030LzH27TpM?s^Y#qI ztYuA5TCQBF2m-4$@%BdHo5_gc$>&*A!*nVyA5^@`@zWAI zh&anPpUJ%vlrnHVm#o5H{Bl}&)SMY`Ie-7nI~_h)1}Oz33t89fS=Aix%BzUsy0aY@ z41#+kQ2}gHE6kB{k@d|rWi2qwUlK>Vu!n$Jqq69R)9$R*eb zAo!PuEj}IecMbbJqH5?AznBerN@P-*_@tmi*C|vw>C!WLAg6qP&7YUf5j_Gpw4BIH|2-S@C;Kw9cDGf|$bf{ob_3fAixwzbb9G zLeEa5DjYvk@dP$A+2NdSU1iEfujafhf;)~pB`4B7Q5o#|1{$QuFVxEBak)Z zb-j+=uPbR3G1uK;qSEo#4@XkXuqriaKQJdOFeMju>}gz@s`P(^4WQ_$@|j#=S-y}Y zu&9nTwlR4~eD<$_y9Wc1yxj7mb?JUO{=uu~U|@TBU69lMjAL$5US_IzJ@eFTYCrOw zaF1CxT#a8nv*9g10}|o4c%}r*_85G-GLNThVUFgB+-Ph-ZQi<#?@$M8cU-cH)97f6 z6}U6dNTLXkmNE!Kj1IH!XQDdOj zDjZN6Ylyz}>8kTLwOzZ>6#0`l#WXh9gQcP{&4s&pbSmTz)(dn~aLp^Gk3p4|gVvqY z7u#XZ^BNAxadAQDwaF7{btDAuMv2PLq6i5NJ!GV=5}%WOc#V4e$GUtTGmx`%Jok4f z31{pjC4~JoZn`2?urn2{Pd^_ZehCs6iulj0r@9Xa3=bMz5wfGu^w|EW?_b}{6KwiJ z#F{uR#UdV5Po~TcN6djjq~2Moy{$0XFuEEKU#gXB_PJyhUFZ9D=ggI8I}#9vjNX=A z43Ctz((#!~1I`pC;crj$`P1&1^Fud;T-OJV*@I$%u=SG1qtp$5bUwtMj;{Y8vjbT= zY&G3p61KT*et`9wB(MG>of*W^Q{^&1?`=UArYTpP52E zqH2i8TVNX<=* zDSQ(f!mt15dw0%~xT@!2^A_p9=5^3Z0wahArKMP~rpRqxO4v8`L|4$nx}Vog6HOh) z0xrNdKtjSKTPr4HK(B8Qq?qr4UPKGdYA;?V)Wm4AOJ1^Lm$YXAIT%(NUf!4L(pv&9 zz^*xo*SDGq;ybcpJ3+E73v3|u`tTy3r|Ntyri)4SD2cZS_%u-9^7VuLZuOjq8w}}{fDVC+X1ok$Iq)f0!-#C6tMIxC03v4P2c?Ur1RR{Hm z!wjcXaH!#%nPKlgK|AIgw)H&HVI6S;n({o`9Mgj!AI1P^S4s^3YtZ;2f|GIQr7J_# zIYfj||BEtA4mUKM+iQ)d!e_$;(<|#MDInlfdu=!ONGIbV2myYFm=c9OcQDTkG^S#s zA#pN#XT{{R_AMA{^6~pi0}P7Ir-{YY)PZ;!YK^2=Xw_!;K*2Vl>@Nufz$$yN!zsUC z;O$J=9h~NE&d$T`YrDAyNGbqH`jq?Wdz|$*C?K9X^kA?bBBv?bn%2##mgVL3KWnDMl1WCu-IV%bT{O9m6D`XepSME02=a6ECoJpj#%5JFO)Qe@EyeuAFma?7c1e4pH?%`P)G&K z#h(Zdl>3~6VzJGFm0h$RwM4w#6D(FqO`|%G?ma;}<7JsVZY_|cHDei zWX1r*;=}MOThf=>Zd(2QnBdO2=DNd;{tqFn!o+3Y{FcIL>;gHe6*&xOpr?nT1HgmK z4gx~(!eCN?GPwEzC!*s*Qw!_c1f{f|MJyRnJz8e|ltlT+);~^s2Z^Q)Q*1Ck3)L7L zX=l>Oz!ZWO~MZdF~$tWQDm*3al#jJNXV%QI)TVfJnKk*QQ%a+5b| z(b+_>ZlR>n1@c=$k+fv5j5LZ~`r?uW^IlyLRgrq?B^Q;S=mU+Q8i>MuE^>r@@LsZ4UmE$`^rJY-kr_{jKuFumq_m~ zZ59luUzZF_ZtJIXg1Her2-P}O71Qo01PuYLT3=dJ;?jVxjJR@g8+#v)_V4~eVdrH#C+h7mtnYEF+sT>(ZF+Y$5)v|$hdP~?HfO&R#n`#019uj#XJdvOsIzr&-pU!9jXb+wY#Wk8I z9MVPU#G20`CKFiqtqsr}(jqD-nT0P8`$$%0h6Ru6&4K5;T(iOIxcxo*V?lGd zviLVPpim=L))!b?b5{in$AZ9hSG6ekXz+}G9T!zh7;0@Ey?uzcC*i+0Lbs;w1gPFe z=IeI&nklNeS4GEL9M*mDpKEDg#9>q=O0v)Oc+$Lf-6VI~?8k`e9|~ld-!@_5?#zjR z67^=}*X7jtG`Q+SzS2@#4^)#qe@iO~62(~2ty{iTajdQeeATy#SU>ZhDc`cs zOTf7fZQAg0+g1qUZRczL_`tH{McQpJ%QbJP6tEl!AT)*{?~vTkbz4^6CqUbJphQ7y z->MU}znV5JV6Q(Ocu?_$?%r1u2-K3#9sfZ&fcAOyn)#1-Rgh0u9TA7y$b#yRAN*V~ zHII}bJex($>0OLB8?8e*-i@rTqA073$E1=Zc9`Gjeu7eE-$(I-IzdLATm?QgKu2y& za%p|r)O?+CH>A8#t^1y1jK9HLYPtHXG-r%xAc}T)9X{pH(G6Rh= z#dHrzUT&b#^ak=XDV6!NgvB1Vq0$7BR~Z*kbLITx%!u`TgB$TZG7E=%R8ypn(MzAE zs#9RYI@l_I`j)`)F1OTCIj{OpqdB40+S>RDMuCjoLgU3j5u)+MJeC!}&)3btXrLB_ z=gVikalH-tDF=WWRUd_1y%mL*_po+nTedzyTB3md?k{`3ki z>-M3yJ-0jMz2{-wL?QM7dKc_9`$&XDCa?YKuq+aCFO*unO{mmPnxOck`XnOiGiXAAY@YrX01Zz90?NBb`>=Wn^{QgduZ;4-M-8N<=YGAv zmJe2bkshq)HS)nC$7Zt-$5%w%jV?C9| zQMwB-U;qx8y}IX5AuYbl)@VGiP zL*!PnxJ~uJhhsMJ1Z3l$E$ag3bD%=Bu{X}9w9^U~qM62n{WGHWrBN(3c(c%~b^+6@ z6)|NUQ%^RHC!PM+RrG!G#{s-f+51r15ymm8Ep~L`dW6Axd0X2%?t{O-z(?eejQImN zzB>lwT1{4VDt|vbr9=2}zP<392&cgF z{yq(#y-lWf#dxbfPIdk?@mFc>UL2)XW$Q%DN`G?HGH%VaCO)WX-j#B|E@mdqcPHu9 zyh@uz9W!R?5A~6%$UjA{*=G1(m|$&qYZRJKYAP$zmSJx*GyUxQB%4ud>|Yh<*LIFb zz$+B<6F#1Fo!l3cE;{tx3SIxp(f|D;w4oi*-wx~UozF+Ms>-bZ!#-$LC0n~medfvu zX-evhFdUSVkicf(FY`oV>r5MHtn1KJ6X99o0H2KrZw&F zu!}Qu*ilBD(=FcsY_7e{sZ^Yhz7$iu}R(+%J(2 zRFXb=573XFI$^LXVOrEX!6^NfR+`ck<8p!a}|B-SW4U|&w(Sk zd@gNz!EQGWhrtf28kR0$8&`!Bat!D(!GUs7!mBJi2O}5*Brpb=4C~(9IG552Ar-ba z%k;v_(!jj1ye^wRF1}+&J{wi}06Y=OzMj592*eLawVXnraXiwYzb7ATJz* zS_P+jAn+v=g$7j}^7qQU@Sh6j!IN;A5ov;fljezj{Z^DDZ~S3sE*c`}&pHFTuH<}- zvqWEY3dHs#`Y)75GS-W1f0X7ov#GlKx67 z*m^j1;&he`yjPieSd@Yi&L4&}c*Zv%w)p(Pg3d>gRIJ{z8Kh$nVmUU()Idxu-#bVX z@_s({oarS~rG=o)A_v1fdO5y4A`+kL8CN^9vl+>P z!!?RP?!%~P%SqMCkczi^ENkmi4}L9BVYF!VsI~{3Lr5tynCbWyZA3ea6Z=F!EXQtU zEcDB3@uQDkME-@wUD_W`RiZo{eSAIi$0(6J`?YcvEJp5#IO?A7Oj=j-B%)aNUH=ur zE08^N*<}fWuFnF(29~@G(Kd`?Q9$%)2oznl*oDyrps`LRg&k(}XB?M=d9#TqJ&(Fh zaDGnSJ{uUSSE0w4wZ?jQABy#zTnpjXqwa|wE>P@Bm@&V90c{J!(>(`nQ~pV5Ba9SW zitVXE2A8|1c?1Z*gY2|Z2-%{ATZUHJv%OGo8E|#Uxa*w(eO3`bn-Io@@A3FH;=J>8 z|LX(9?0)pQtP*Ra=E(Wgguxt?yT&S*IcvjtHm0S)c{EmKxGUDl(bg-i=BJIkcA?>k z3*iWN=G#J1u>g91EF4magJYo?fo85%@W0-Zt{xSDm!_CkNVw?WVdS&y#n%JL`u zKqWMjrifY-!m(`WR2ZuqPSLAs8>eUL3nu1^h=Um;_B9-g_j*|i4SF|{mymBO4}Z&=!yXl(^B^{J!c0J$ zDuQ5Q59TzhB@A*=N9se<=D|RL3%R%SXWwFcac$LT5<*Av{Vt_H&MydjNA&RV+VA8fI z>!gDbx3$9&X39??x#DcnqrRfS^CNR9w)};Y(4$xWojq@e#rR`*WS4t1e7wN zah z(H=mSY82%Q<)*%sC-mO!@==qaALKL>C?ke9>K-#JASU&@B@w$DUp8X^$_FQhX|&Oh zGT3U&7(k_d0)87x)6v?;o7fsGxSY^&=0e^j$tO)50OrH+)uwnfr7z24S zCk|mii&9~648CXUF)TwA2m`)WaUD2+;nz~>jl4mpe^AspgJcOJ*7D3=y;x_{qwyJ! zyNx1U4~hy!O^8^RS^4%mz}tz7W>F98*{!;eoi&Sdu`L4h6@j6B#fLtO$WfqyNPUtU zi#V?oW>55-uKtq=D6G0K=^Ik%5X@=*T;4e)dx-9r2oQX3a_Dm%n=ngLcJM3NWIB;k zz%@z`!wQ=_CoKXh_ZYtY2yJA6WGY!Cw@QHCb+e)BcRB=WfsCNz=n1!T9!)cfHa^#) zzf!eBrM{onNpA;wrlqt^tN2fb_C2%%j0E(;JuN<)2Z0LO_ybK%WA@o*6aID2E)WN$ zI_1^hp%Tbzzy6^R&~|~RSsDkrd#l(CQ;l`TCuj%e=&2XN6~R#n7hl7o8n* z_cXIBaqr`uYHpWSw1{lsefk60{u-})2%P@+KvfG*f_KQ(qH>~$nXgk0#FnGDRXs7g zS?GMY@oNU5`W3m^SSPTzU%$v!gQoR7AqLlsLo$yuCLoseFeX0pxpwhoTpL7(>0rSa z_nO@$M!Ubd^jUzkCSK?Og9~twN-^{fim%%U&xbH_ zZ`*8q7zJfZhUA}j{(q#nf|~&#I>?=mZ{5x+jDD78L#Rf*2Qe)8_&CytD!L;h4-`2F zS6#tkom(pVpz`D&6bWPj;we4LF(imIT#}x-&7S==BIv2Pc(e1X$#|E0vl=Z1b(=hY za;Mp?vC8LFPt_Wje`3A|zvaFIOgaKwWdQsiB|PrkS_s%lK1)G{&Y{#No~JT`U38eZ z{&KC&Q1Kkr%ehY|t=$2kTq9Y=ZV%u`p$sl|zW!$|6g&Ux_U6+znmA6Z#+)7PTYbdI z3RL;hI*P#Xxf|w~g%$${48Cgo{>mc~nR-4z^*u2_q8Aj2+7+*GRc*I>&#wh91J!q| z7jYXJ%O&i>?P_nskthRClkgwiC|bLxQGhaH{!y&h`#Ob@)}}dU+pE_q3puYp^9Wk? zy0~ile)G^5QK5qVN*|4-Sw^KrCnhjN*}eHjMw%?O$GAxPPX&6p)SdQ$GHJkX!&fI9 zT-0yB@j8hyim)(8GwnhF<3es@!#K|$Y0bz?6UNWEpklyu3ihY06*!80BdmCN zok+-KBMg^r%!DN-J{xP)bc5jv0HKYg(UlTxdlGN8w0Sz$a_s)8Qt^G*8j6et8{yt> zRsotO>1h*aBO~%(_{+j(^Hzs+vk=}gQY0cbeD&Jmof7KiAi zL0dJ;{-=zu9~R3bA*)atJX4in8vKWoF;jGwvPa`aALE7RED26Lu_Y$mQ}a$XxRLMf zGd*EH&WP;ZZ)$+S8vJdh*iK&@rOZdMg*1m4qjf6cdqJ$H`l`w?ne1YAq;aN*TSvxc z{xAa8C^#4#tXCrh6nHwIgxmfH2EM;!q|4cz4;9D*dQ9rN#ddd&d)ds+nJ~T?pu}$; zt;Pq3eXr@4v+M3V0!Xi9XeC-s#dwsj7EVQM7_H)~IO73VHHi2Hpp+q0+9)eVSVF5X|)6<}PzKM6X#Ss#+1|uXB*jKRnd8#baG9Wy2Mn zkN1H{^@%zCk;{gJ1VKViwwU?0_^i7&o!dJ8!u=;YwzdhNq$F0PVY(N{bpa`V*?FOr ztn~w#Chx};Ae3_#OE=urFodsnfE(&7{JynF_WADa^Z_$pF1kBb598VmOsQ?1F8ZQl zUMbdc!ndxv!xdcXAmaP%AuYetBBxBX`{teSl3bxb5^eqHfIH5}z_RcaqNZYV1vIiW z0+j#r@RbaA?mdnDNgK{hVhtJ*CJ8%Q%$R4qkD?m9v9Q#N)1;nxBSlj@i*163>|v1& z?XtFM9quY$JhqGgu?Qwa;Ve2@c{YO^=+U*ZuP0o^gk0zQS73CF;EFv*8u`lQP5z%w>S2Inhz@@697icrscE-mWY9A zuyg#Z3Kq=MzJ(bYCFP_u`f^K@1ffYO#vRQ5SPW`Y7*_O*)LF9GosF~}hLsKeH~QBB z--RH9oRV*^1z%r)ZFva2UD-xXerk@R=&cwWxG?N+EhGetpOT}AhX+V}M~DDX{6lC6 zhD|NWJ)AegJOIo=!vMhVaQ3CM0W*bWifS<6-#AmT9W?^!!=kYV7Pcm`W^7=4GIr7s z!XBGB&dG~DLJzF>ntC6hT@KU*K-vIGHUQ^Y@#Z0TjU=iFyoCx<#Xq0kS{R$`{6cJ1 z8O$(Yuv;YE{!2-xeLb9ThrqM=+jHf-@sTbk**fxUWvoO}dAdAq5#E_#`UF`TsNj_O zz*S%@7+2~0eR6iv?#7*+g>6CSdC6q5tgsS9f?|%(wcGSk=~}R`B4+7=+wA8S(E4D!=&}#N8PlHIe;G{I;TqW zSZ%oDBb>UASU4eT>1dNrs{2>W>dL-=fTUGiAn#_dP&$9BQr@7cE;83!Q^m>z_x4=} z2}F#5?8BN+TCO^U!-4AEyXWLWKE2Etj4evIRT!+=K=Yg~$np!zaluyh6HwPOv2A~F zIa#kbg@V$N@Xb;3J(^MWxH>xoJ_hTM9&Xmi=EKGtslJpv8%Zk;`qUz+>>Y}EUSt$x?E_>1sOW{kpb+CJhIa9A0l&>DT z^#s1Oe&4C}S{#I{Ip65(QfGfC@L?-@p2)1I`#AFw@Y|*USO9aGzBR-oBbB;3(<$NN z-9HG;e+e~M0*B1M=8I7kgXZk0H25+Yu+x7=0+1a)=3gyo__CYK`oE@w{Vc8>Bm^R` ztNMKQ6M}SLv?5G`TSY+BgeA?iM8je)QojaEabTPgsux~hNt2{HH0)syM?_9ou*4;o z;(s4(hTP&pB-FH!=zs6W5>@OhtpiJ@R*_yTA5iw9e|<_$*l_sZ}MD2Q*0 zOm9n>oyY*aLcO88u|#$>Q{12oxa(qHD9X3eW3N6byC7Xqvk>7)O z@&39gLYRGE{G4He-z6J@>I|n6e(RVf#xS0UPN0j+LLS642UTLHrumVC%Uk5NfVxvl zO6`sn57t-@-+FI>H|kgqYNT2?>)J^yiDzYR;tEt$X*sg<(N3<6!A?WrDW1*K?3ti- z>e4G7kGi0Pra7vY2$O?Pbe;c;EB=XkzHU8I*3F;0@56vnW6f{>%ACPuJm=Dd|HxD% zr3X#^Hkb78%h^iRvl9UyrPOiK&#GUa98bsfym0a`L9Amv9qH($b)t`3j%?ab_cIMX z09dDwyQ+eE*$tRLjzVgh189CG!~>KIpfF6zfM_dv{@>dZvKpCgdHr$vyAQ5WhOaNw z)b@gw{wX4Ezo_If3&?+~s5KZE2}7ozEfLnGf>_O`-%<=TP%`D$F2M#!bvk<~dq79D zwN@O)`dgiC@?=Yz>678dp}&@2ruC+hy2+KU%bXCsEC|!4J@dj)&Vth43jqusU1a)+ z{La)W&m6kOA!q24@rWQ0(CM(gk6wg9+R_H)_PU8^qOAnAiBMPcM-O27LqkX5BwK%V-Zmmr1`1qpd-PVcXu_-eElNFpbRq#*@{}kR z(5@YUd_G$i-Ux@cdOIUlC3z)!WfM5vjs+x5T*n%4VoOVKwGNp-=&mT22%Q&*Gng&4 zdQM;dvMXFQg$%~+q(?V5QXB=RJ64`uF_F1Z0^AQI-(Wr#%2A<(DnX{s_hAhg=glS!fPw7Ggd!4ACBsKDlv_RvEHjH?WoV#t&Y* zXDEn6;6OLd{KQV?eUrBJCm#Ui^J$R1VwGK;vRoX zw|sD)9syoT8??l6m|J0Pz8=GkZfdM=W&|W40%L=|69D`J*+NneJii{P^tJ%tU07 zZb|4cu=&<8ntSnMq!~EuzBvD?^(3(LCCPuoK$*&Eu5&I1z%1}#P^uF2)nM$2p3F~J z4@(rlBD9#Af}urDnqo=R#AZj`f}RRoM4;Pjnu^5ItcY2dh6J0_IhjAwPFbP|UbSsL zp2t4iLM6->fvnk+S&)+$9j#xzWT<8}V}vtyGfCa6AbI(?vEzCINg+Za1n!`49E1}> zpSw;rD_Dfu63_PQ`tV6u4-rXzSkQ5$IylMv57)DpREy@Zs! zv;uuxD&8?7$J6}YO2)4}BY1S>EvihXVV2H~_emu!pU`hFym0TO8t4h1>~m*@Mg4O* zYa&_7U!fMn%ey}&p-~==^p$zzjTW&=D@<+?aZh4=+Hi;w&S~ZZJd4|?DhN=6S^b^r zE#f>adZ+z?@Si2n_7dFR?p1ukQopL-o+j`UckIdx3kr?Wu%tNOfW}d=x*P5#S~nz< z&9Q%TyB+V9x9*Ff*7or7vSe4$yMXJB2oAmKpqYERSbO%BLO*K4f)xn;tkUj5T|`uz z2s&P&Vb9o>Y|GN!J4Rfd-_nU&ctpxYFEtV zA!+HZnU((&05^!P+2I70BP9`ENtnXM`@U_tC=tFa1b~00v*yclgh8Zsikk~sH=XDe5j?Ei~e10-Hjt0Frhm;wwv5H;xZE$)%D?i0_EbBZm+c>K>%~EsdB6gw<{ukX6>G+GlgU4aUom{j@tPwlKic--V`AopX|uKQ z)4X&8h1&I|0(dgV7p@|9nD}=4xgPpSS z+weqqsL$Zw7JeBQD^_IMXJd#uDq6=1(fo>ZfMn`vC`nU`o{6tHdU#xQ%azs`F$&oWn6A?lYCUqj4gz;cj`B7V!iO$ag^eCSKrrCmmC-< zw!1U!t>0XzJ8Tt1p&``1nF(A(NJ?xtQ`Q`@Jpts)0iEmRuhd4vK*_c%hsWs`1E#4k z-m-uUq8j7aUsgPDxN-~2FkS;(0nU?9w4zsx)P7O-h6`N4t<2_MC)%C3r-1abv+#F^rDu=Bdl9_%ZAu`GnX6vGaNCd;N@~+e|Edz zq;c`p@EVkKZYG^PLnwUBh<`vk1s^(Bp$U*f(2=aCL8`U*J_{eRPf-utl|q!~v3Mw^ zzHTxgWLaA~rV&HLQT}FEs6E?r^6IT%%?y$O~5f}Id5M^T|(G3Mje^Jbs! zOUpw7%CdCTfc9Ha8)hSd%)(*Er&OgnlX79o6YblhFOtwGq*Nx7{yZV*J!@_e8hOxz zq(D5={6gRJA(!Jntcmg|1K99zf5(rz*)+ATlJ_RDPEt*ObpZOr*+TPL#Nxj-d1#Fm z59 zgPHMC(V(zw-+FL(85q$aPG~IZP{Agv#RFnTSSu$BiQn*MgD`{=!g6gXPWDwY8mfDt zaKj5dQ;9UHl#9^Obt=jbgmekeoB-OAst;SWe6(nY<4D_KqWwF)^iedvMmWqt zXW@tj2|&Z$5z@itf}P}u3{az)cv-;v-TLpiSHmvkyd7P3A=ZXJm}gh1Y&(+4-J}OM zUz4kfNJu#qm@-POTp=n2h!Gbfs+_Y4zKZ2c%Z2tCKI_(WX1R+rWMJjgFF&|FHuWr8 zSAxhSIcDjesdjMu!=f_#M4$;V;O(*jCEj=1+fW?D0`WgI^{QTNP5Jt@@s;N~_O%16 zE_&Y4ofAO}I??Hf6RgN-<`;-Dm(9Npo0A8mIFq3Y^0qY3S^U}nEddh|RthnK^uJQp zMYFw373kXAGV8kPaWIVer4-=5d3_r$H}sh0r|MG%FA4vhDMgvue8X!|ZA8{Chak4^ z|CfztZiMGwqGt5AXgy+Vt;%~U${u`0%v_s#rvtN06W^2{V&d=O%JQBED`=RFZs{l+EDG#^ZVbYZIp zH;+KRFN+2P7V1Et9K{0+_~RAm#&`I53L}LU1*jmG07eI*n23MI|0y_d8bid!+(P^X zBwgfAGypZ0FLW5l!O`Di;T&S9{t?UOA||I{PUd`cpLH8IShZ3fo1D)~p*QGy;|XvR zjoZ9uFi>sXD=2rXX}s6vvohw9>paWW&`D`w2&?Im>jwj96B5B2EtC@w-7l*~qxa&} zQ$$A%nINnwcu7?L?I8se$~bS>6)`A?a;vbk?}7#HDiH*cvqSRiNosRWbmU?KnPZfccX*QAj#Ucg5J=l0M~ zwj&e!b@fcWOtGmGBlNEh{9t%8%-*gn0d7?R7rs2jfKF#w>HPDABy;_ICbIt6OtltI zF*#@*r~Nl*4Ma^)(5D4vmFH>;wn5l5sW{FJ?*HW+OECo^^)#j~M*uN+=%n+L6z8n8 zHz}NqO*515Te6g})Mg4(9 zN~Oq1u&})}j&lMR+)oM>=8NAvXTpbK)`~+tpao`t$;a}D6x5$Prb1~@|zSBAUbEP!#ia^W7^fBT!)uSL2l*G}pa z+Fp1#1h`ds>E9nYFPC=P{R*o55lGs*7F8WS1uuPu(GAkOE)Zv4Mo;g_8x%>#q|~uv zUM?cieJ!FF83);S2VfME5Vgxmn~cL6J!`uTWjH**ROo|DN!q0HV}`wK{vliQqD~6F&chf-~BIK>vF}u58UyAb{ z@a&M0r;-U4TPI3#30z#kZr;?&;C`SK_#0BK;2I9v>U?ks8T!OUD$?SN+@xSRSQTj- zw@BS7;EtDt(tKvkCaf=XrA{5wjE|CSiL#H({&}+bpv$M{+HW+=;&Ru}?jBI9{j4*n z#TAwWuLIEe+f7%YsDejSo$=QdM`-Mk$#B|pbQ?eB@+Qy2oc%@A#N$#zm_a{Cm=RES z0N8^F3)%zU?x7BPy|ul#gt(=&q*o8Gsx{bpI4w0i1oha;(l(nW-^8lvjJc-|OmnE- zCM#BjQEdkiQ-4i2ha(+0Q?=k)r^I(H$6GiiceO->H+6k;k4NTF7-NBCGYodna;5is z*XhKA#7A~>;!NnC@Ar*WDZEe_O>?h514XeqsoD$WSeKd~km28Zq)sF{&d-%4!nUf) zubyvI5O;I3k0dhfs&sd22&~a-n;?lO+ zBuUpYOkoINn?)!!ioAY2|0rBDu57#Zo-~gu{!NB=*IRk*Hm6N`O9Xc&pzfMAW{NaH zwu2N+8jlaSX#}vb4lv`Js5O{LlVtjY)&3ybLw10KNq$dj?g}p60}d+R^nlCtPrjls zlAsVYteKcHY1D%7%@{PlE2kp7n;rdr;Nec%7Hoz=Kk)}E*=^0VWt4<9mzVO=AXoi? z&^cKz+yo7Qj$cSwR+i?3S%mHNflGZjR`8z>c$Ang1UP}dLrsgtX%47@_(jccy!8M} zwk#f8lV>sDUT@0+_J=^KEp66ObyPo&2lK_C5Ur!_;;ccNZ9hzT=gYJ_i6$PUAJWiB zVH%5LSD|~$&RggJ{Q^MuA`*-g!Bwk$bq3vPD=*~EYn^rcy!%dZmAAwNQn>QJ3-}*h z0$je=ky^Lw_2s;d7XL#}glMqTAl16*QQ~|q3;nqKM)>1T?yUc`Un-Uw%3qp2=n`a1BpeEs)ETO53BUAcODU3YO~%`K|Auf0p>EKrIa|Me znzBB=1fkN+ZrR`iD))1y2+OLGr>-h4MV|9Yhern3)(4w?wM+^oqHT@ME}o0f($J+# ziRCc$nVjv8LA8G^Fc%S6O5|{TLy_&C!OX0Wd?tveJF;W$3`-)<>#D{Y`Q;NS4*MsK zFGC2o|L%%x6Dz>bW)R}0*|t~p9^(Bz`k#%pyyzA>75^a};Xlx5z9rqGlROi@lLwUo z5;D!U{^uS;M)*_s-vU!wpgZo!>|GhB|S{Yc)TYDCL>hz_b_ASC3f&H!n}JU3%)`aoY>GH7l_Q4lzsa<}`X?kYOlP|Ac>xdD3*z8u~OEA?e2WkRBt*Dm-UJ|;J zzfof~Ek!kLZ<#YJpdxK`>fath>nK7UWADZmPkzxGnT*e{Rif6Mk=b!k^P zwL{{Z$6W(8`wz%_XY3QfZz$>B)PMosT$sP)ffeS%F!A+W194rWs8+Jb!rOzoPEF1f z_+w~@uKxvwH?;dC$RS`c?y!Fg*{>P^Xj5^HXd4Vq6;)K+s`FzMkQRD}j_jook9v1hi$%&bP9x^mqQCsf7fed~3{1P~_4afpQhOsrz=16leGyx9R0u|iJMXhvFb9HzL?Qn-Hk)@7yy^^W@nr$ z5}W!Xz}gI`9y#TFQaZb>e1_RYnQxE8ECTpwM^3GaJR zkh#!piXx{OhB9#(^C7fe5-`_t5JHPh&(<%IcS>**NiIi`L2CG`Jc|}oV zAu5}YEQ+CpIPPgeU(;!;Q`foJao1dTW9aO^#5llw>4i-a=x1+!7R>(u=IY7q0WSzv@l1`q%$48?Id1)56DkfNEfg3fJ5`aD{(21!vO`C8?7NARXUv*M& zlYg$EgIzKOa;s;q{%MDQY>Ce}WUxd`Q#CjEK?98PQv*imDKOiVY8(8;{MKdSMZ#z6 zEqipN@s#6)%%+EqZl9rMNE^LD(Xo<0omwK#9@n`ge#Th1!{?yKm(uSoG20@e+>b?6 z2iRrc*Fv<5I>HjieSOE(_U&zKZ45s+5)q_X=MF^GVX7lCC@~ZA<+GNq2qzG@jprTg zP=P1`{avR=-q=Dnq|DT=V)V_t)Sho?nE^F`nQ@wXmGo=~h1s*Hvre^swjWAC*jh^A zS`f%oB;ZD)%ByN2X&&_bg!t#KN_>w@KcF5$ zgu>uL?$TwJhnK(7rc$=Se6vMkgx~g>wB5pkt#H)Q zX7VGvKuLPBjg`Ga5yh=treSx`O-F^ivS4#H!vuy}L?gNs{uVS<1kUk0p(M|Vtv9+& zgWe|G5`fTB{N1i8r*N)UlYhaq)ee02Twg9vN3EOSO9>-sm`u1*8Kx8BaDUt?nyMd~RAjyCtWSQv?#QP-BqY#z z2D9=e`Oh(BwnBdXF4X0WuvgZVXn?+zE$VTJ^CfHm%8ilF`8CJhvxrK{&F#sb{&F1! z!0pZ~xlbffvXTwG6T*Cp5+#~KHcZ9RkTEJR6FJP#OrM7IOu(yq$3iDLTlI1=bI{BM zctl9x4TyA(1Nw117k1!vM6|O$tcdYyhPPm&K(*G~5Cy2{B&#$n*W9TI5uEcKh;M9s z8_#}%hAQQrJZ$>;YPvjOTzYi*OMbrZ2kYySFTGfZB)L%cwk9sdd_mXk2l@^Lo>mhw z-9V8`l|-I__BrX(8acT#qarorA3~b}`TEyIRL+68bFY%qSqTDCI~*rdrw+)JbZvA! zH54YYjd^_DQRhhg?mx)}`g{#FCtxC#Yg{vGpMj4dZp+}9x?X2`y}wo)N7r}&$IO4k z%Pfeb*JgaF9@t1C?O{QkA)~876xQ>^x4Ve!xfXT~X$;4rQ{(MkZ~J?SveIy3qF`ZY zOlW+J466!b0qSU$kJyAJqTr@0?aWXjRrCow+iX+Yroxl7QfIe(>OV1r{@tj_90P~p z0(IVkG`V!`)7!`FFL5Uv0tu^}M@dtKysN$|ic~*^^nTg4a*K>>f z|62=AaNDHsU;=g(_9klu+S)h<3gt8>)~W}VteE@Ec>3_85ju!nO|kuB!q%8AQ z?v$aNaeH+y1mSctCgT}OpS2*F?JiC+!4TOFG}<$|;#G_;gV`9m_4c+4%6fz(zaM$U zxkCD*GF>Z2}lSt$*6YJ=__h-Sn3(CD}?D1e#5qn$!{Wg~{I+L<)y%uU& zR$-yA{za#Ss#gSe;Dk>qZXXAa+)8AC;A6T8Z}=4HS~LhC*NMNzFjEUP#2b~kEXY}v zc)n<+o!db$&@cB)Tf3O4%3CsilPZ?c$OpYIiEXmgzEJAE0Ef|S*|66Ar_y*VV|s`8 z&E3@TMH$bQDms*K;!dW@4=Km1$~*x}^rea;;+Y?I>c|QD-hA4-51a8yavUn8Lnpe~ zoC-7ny1tHU6+?TmrB?pP^nSFXBg$QFv1OM}Ym)(W0ofoLGbN_J?NcBYB--#sc;ap= zk9LxH&Gk2$Vxa9qSQEHzQfSpkDnH>PvH5fY3h1_Rj-$?hz(cM{c?gKNnS88DTpV{5 zM6s0Wv&r6XX?PwS>%}xVzY$L4nav7n;;_hKnY#<`vcoP%5^C?u0cyjLr3HreG;Rzm zI*i-wCcj~{+7Gol0WJz?nCebS&!D(Iog4=UTsi7&p1tMx42SKJy~I|gizfDY=YY*% z&qjLyG)LO}B4FDwzBfMZF>cM?rhs_YMWF1n{kuxLrKb&YocM_TSzrJO(dS~y4P?F1JF|+3aposPYq0+;_9H9f1@yy?H;Lv zbZ?|NE&97 zHd1hhY(aT^ARQ#<_E5@A*kX9RY2m5%Xgf$P!PL zi2tQw(TQxf{QK_`NYb#5rF~X4F*q~!n zLH;nOLPam<2QFRs=9TF*#Q{>+OmS5wa0x^+kysK7#2q3j@u75j?&i-32auW``V{9V zIDgLRp#K33L9uMW^LtP~kR3@=Hs^4vn==-n^Xse+OL34*RiLJ1(A z4@?32I&}Ug1Ra6pX@Pr$?dL$#h=}Sr{?X`R*R^0DwCKtZRh%W9)u_1N!aNH-r2wo- z-m;MSyguNgLJUUpMLo-W8hqC>!|;!Y;s}B?2>FaYGXkvBDS$logyT&vgeQ8C3a6Ng z((ug%skNf7At{>H0|htW3V{87Mf_k3`z-56Y?UGQrA3{ayjKrb^@?z>av;IH=g(yuHz?#!20b>bb7EW zWHsst0!fBs?3Sw{PUxa)>t@=KQmq-u?x3h!|q1>}heVBEAx`1(> zS)qXWL=k((w3H~QWWv*pKIwY^vaZ_*_r|-Wg~qf+C$?d8kvm8gc~-v8x*+^h-V2Ji zZKU)Sc>jD)m|HLGuW~I_>Em|1m>w8pZgtTutw7qA^a8raPx@A#sf!+#i z8sJkx4(MhY2=W`RXDh7Cxvo#jfvu{8*z^yUtV~ssl5v-GE$?BO3J;bH9Kif{h+qT0 zD1<|W${qxN7nCv-pje{60T`@IB(n-2mA@XQv_zzj}3d0I0XS?wz4 zi24BA(tZYYORvmO6tvK#G5}E1DGM$S1WSq#n1sjoxkqx#emdta45e+`7GMhLI8!gd zfz8`sHS^|CMXbN|cVAR7(9M_hA;mrPv{pjR)Oa*i18`xcTY9X=6jGh2A9tDrU85WT zc*C{bovCQ}S{kN0-l7g~ zZwn-pHY1n!xg|L5V=X?CWTpxP5{{y+GFFy=#|)xs)0}Kdf#Sw3PVGoFo5sl9wE@;i z`OG_t zYW^RVMX!i81Am@ZkDo&5dN>Z_)>|3+%bFOg+HYJm3O@lR&A>)MGNWdzvAF{^r$qldziA9le?Pq$TmJWKoy5w>t`CCLVO3qXYzP+Htd|l7B=8|TJS8uM z_D5b6%g09?Tt};sph$|;%BS9dH183VDHRT3I}r6Aw7<7Lhz%qo)&%7a{!J@DR&U>s zu?TI`X|MT}$a5>jbN||JQdXle|3Hb*<%ZlkM=R?S%2R=S1V)Ab4`D1AYbn{RIB)fW+~&f4l3E<3@6!<1e$2txF!fKT6jTettR5(C$v>I3n*; z=l$(Jh0Sum)tK{ zT%5w4i)kxvt|})rCYlQz#Z|h$&|k-y>C(gz&ERbGGpd(^5yBTALBB?JK4}aa`2%d* zTVC;b&75iY?o@l}u$1nu3qtRrOpeuyCwj2Wo>w{tQQs>_4q9ngTRywP&>)nHr$}kd z?~eHD+J{9HS1qplye?qUO?r(sQ4cV>_u6Ld_gQr04dfqW=X^pBlAM|9P*8Ann(htvP#n4No`tz#L?X<{(({AL6;R1~Y|vA@6|H zA;lFuSZKyh+B8FT&~b3w&0C|FU)wkf-mzEhiZx7I$=ae$e-4BiYm#!Vw5h7F{AF=VtehD~N0GVB*|jlE1(+{VT2ff!)L$jSz;8snbG=L>NMGn?lf zBx}Qkg(&ex2PifAF;09+GPJ2cSJ7bkXx_=KJ-y1bwmryuds-VF&;%>Bzx4+4td5~P z)wvcanK>t~qj&=@-#oPP6ct1M-}5;79@%w4Oacj9$O^&BVpKifMO6-T;|KTHqxVdJ(^+v1;*4RMuAjK%*MH z^lfHz8hYtUQH3^)4XkJUT}zV?dG(+R5@ z4-aRJdwgVWjDSX{5aOT*?nkYruVvm4QVNBQuFV^Fxxh;}Ac&bJo_0sSRj%fcm_f4| z5U4^Y$17b|Arl3TBswABtx8Ie-;*NYf^dah7@6O+)dV-l7H3S&R@O~qkR1LF-QQ7< z=BBq)&tOshDNG^KruaT}*R~+XcGC_@MHEs5sn9Ul?SK9T67vvpD|4YAE}G$~b9K3G z8=|zC8)YDnoS$|tlFSM0g*k7a_#0DXTM$yc2F%@gIYEO!68(2Y7J)prXbjUak!c7A z!#3Ok^G;e=zqeY|*10a1zJZ^_om77*_N4cM%Vv&-q$_iByt`9zgx%KqR-WCrrC<_c z1%5*9Mz8U0zV<}-Vzsek=VGgryrl@w^UN2v>T~K62VJ67-xhBy*og${uaT@+oO?|& znk-|hsMr6Ohd@(fyn^mcn}+G+Q5X`3S1yb*ZxEj;P`5+Bii$OhyFPG8%J8O;Fq4@T z1I9?jh!Tq&Su3;j6%_ZdPSHKW7xC#7%2e|kNS|z*$)UVqzC3={ffZz$NpY7cx)Mgp#IyF_W%9 z(iW5ypA_GMy;a~Rv9<2SC57Yw>8ddEC8|X$Co)|5*dANXgUsuUt!bT9Aj;0TK!U1z zITge-3xDlUE~?>CO3{_kK|uK)w@mYIbb1h{2Bxb68D-CzlbCz}=C9Ul{OYra61E_< zdJ#j6^FRn9uTg~-f6~PDXV~4o;*r#urW^r(n{y}V-`{vRb}EQ-Q3AAVouMi0=sacb zJUeZ~++?nTPDU+uUodKMIYnz00iyJ$C0a19b>AQzatOlY(lG>nH}C1BB&`DA4e?kC z&A>PRV%{!7r>XJH0*GeyUS6lc+`z>|;C7B%X>JsT1 zIH@^P#C!F{%G-(lng3vpf$PnbfERzVbxv0xQof~@8;62AG)3_oC{$W~7rkFGvi^eM z^Ku04=7{AjjL#~s>?s}A6?8}P-swD6$Jx%JuS1^JblSgNy2JfBqQ^+RZ>ph~BJi5Z zIQCLCPE}@_Mi?DkvZ;UezogDOFx3h(>rYkqH*BPM5e=F<^_s%BWLj~Q==6X^$I@|Z zJWccyEgIbT-#x>q;bF?s!6r|3(~Bh^(#4LLHOp@5w9-wPnCw?G2tpy@Xs;rn3CKt0 zZcK|O>~W%=PHv+Dls#C2T?fZZ!0|;q(^z|X)I7v+PQt|eH{J#Va?3$zM*0C24Nwn?6fg zg=|)#k9~XLkj;GAartyjW@A<*#yNCJeHR_)@q0He#;oN0ObT(1P9chYPa z^8eVL^!)D+eG~k^KrYjZB~-Z#e#DK1H<3iNYSyqwpRV55-kC>gBR#M=3V3~|#XErG zM^XntM||wS&!gj z4=qh(3C>BB8Y$N`vFz$Lje6^GtBV5#o|e_6Rwl@k6T@`0k!Q>XiAOd_-y`*_n&SBr zL2Ys^R6`8rR(}!I+`&MLf?ZT@C_i=0qh!hioL>h-}FwgeXEsO>Q2M3AmkQ*Pu}&hGTE+4 zc(XolVK)afIViM}hqI2=7t{wFI|8d5XgkTEMy%2cOy+<@IWdJv&i{AWA z%Luo$Z9`oTsmXpD?BCP*LFR(#UVjkid_Rq$CpNNL9<{RXh;*koMtXU=UqC?GSSh!6 z;g1IF8KVZ+`OzpqD0-l!sTK5ik|o`OTu7wd^k<9Q2&G4_%@)c*M$$7aiR#3$>FuI@3YT^X zQ3YeAA1(VkHWP&M+>3S+a|ga+JDF6`W@zIhLyD*|`aB4Qufp&{0$%NQ`Zmkp20~`@ zd<1L3^RODR-l=jyuHAsS&WM3A$OC8;Cs!DS$x(+*d}!FxyZ$w4kaQQp_vlYE>doU9 zHbGO;4WyT7r6Mz)Aw@A}UkfWpV-RHc?|>Eg3<|Bx@JBUqN`F#q>+ZSMoQ)7v{g=?)j<>4{dcnCL$7 z+bF1OLX)vsHDzt6B6=y`;n3O^3<)<{1iW%<X(VYM>S}R}}yXjzUPJU@%ea`s~t#}Eb3wS4FNL=#3vLso@lA;ON z@R|%b;F@DUcl4Z+WMCo1>PVgWEYPQz!zOz;Xa3P+IVGms8| z747_)MTo3z5~g=W>$f=d1KKwK$sj7EZaX7E{NE-7)EGOO1?4W8Wk#YLSZ(D)^#j9I3z&;vJ%z=t%@n zU5}LLXJdEkdl&QtlGVU*=Zro>qP1Q**6L`!S3Bsraq0WnAh8Xcxe8CZ_%AF`DKP8z zIRp+8B=#Ad-hTs(R69OnX9KA?*OEI-Yt0aP**8#Jxd0hbSIT1lsV%!<5*(AoI3`q_ z?o{$KvX$R@oNeTzLnCzjpLt6bx7)hk7A?KwwxC?Jw(q5d%<}B4ryriD9_pW2u6;>H($w=--AXD@*Asv6eMD2b|U6>NVuUb)SP6B4c8ElIdV{ds>aha~_ z_Q<@Ugcw1mw#4ceWD;KJ*$aQb{Y2}(vWeNYMfDd_0A@_INW8Rvk*{vA8GpY`WicDiQ9btcMey8vN)LsE>RsBzGOnY{ zZT&^MSl<1ig81!v?W>2Dnh7byE^sEZ+Fyq;6fp4+`S5oqH8y;Bi?{h5AZExVJZKX{ z(r4V6$;;-0fohtqYO+=fP~f4~BP4i{S@zOzNNiZ7Zs}cThH%D!{|PQHhi%L#uq@BO z#P(x*e#YfrAic_b)8GOB5tJ30h@;X4TTQgP5|PL(wef#uP0mx{W+0FK*@Ml4hSKGJngB=Q{gIetz^_^$)0kXRF5_j~$bG7Ve{1Zh@#bj-^bJ-@;$a9kzuA{~1YvmXvuA_lbK$Z){{VFs~p!mFm5nNQK_AN9KjS~^Mv)d<0m}n zHZqXruB}TM{lL5U38TUEqnFYGOVeLD`K_W}_?{Jsw8*+B7^xkgq}5CF&=u3xHXjA7 zRneZB*Z>IOL2*XBDE;0ZPu3U2307`@*G*X`Ea65e+c5 zge&ZA1K4IXbxk2q6ubI6*?ZGZc)4&SY|;y#cuBR5rW|8RZminShuae;39Ke@>0Kgt zu&hQ>yy5i2OwzO(NiKpS$k%1(Q3W_>*U-U53Mqrt~50OLkL6F<_{4sd>-p= zw{413R#A&uwiZ(P<1+@=?+uaCKJ>F?fzvxn=1$5Btl5+j=lX~s&lUQlQlxPiB6R-F z`-$ALx=RSvMYjAV=<8SA5kX6%>eI=jiIiSMsuAWZL&9jun9n+)J+*udn=tOSgPr-Y zkR*15h(_7en8)s&P>C=;HjNz^lfqp?9y(qKd@QXC(&}C0=EsUD8vtCm{EUo8&V-8Z zd?+b8h87P1StPl%T$pd|AC=nlPOhrh_E!^Z?;cz+9}%zlJdyNH`Oe9MIrIuZ3|lF$ zG#jW3Z?3~P7<;p*v5LCKvcD@oI))4FHCt|MYAba+yJUR;rlvF3Cl?O2a1Zv-Z7n_J zO1;S1#YSa}#^vVXuvNGmlX2PwCBW_-VBveB$n*C+VrI#MYTid{H|YAjrw0=uM{4_6 zb$tJ!VdLu~>`@lV+si-YNL0xFLWF`1t(Pf-_xQ@Nu))RSiQ;&bQ(+nYoK&ETGrd9U zLSnFt!n0;lq8eGqitVaf`E)q1HJ(4+;1%Wm(~$P=&RqZNe7ILgN_iistyCHN{?5Vs zd=FNRJMdAAJAK5xd(WZ&oKr`VbL8J=vretuyO$9{arnUJS0D9A=JsY|$ONsp^&^N0 z_0AfT`%KM3m}b#kAyx7zBjKM;R;!Z6=hpI6cpZVCtEXea6-c|L_G%9p1-WuTOAsLOobQZ01#^}w}12N zg57f1BrBKutl3x2yqDS6Xn`xwk^Gt)BUXg+T=rTk~9$8;sGboQi2GME-C0w$K(k&{E zN{71=NrmmnuB+y}N?j}H(1zNgaidq+RtAfFTd2Kvks5H|PfyWrXtfTyed2Kb30b-h z>eD`VVay;9fVB|)MIXvH$|%2vLNw%}Ro1;ic7>VJhOm?0%=2C|_jE&n;eo%O1-mpJ zBoa9Kyh8$f7n@k_H82jGXY5FmSM2e8po9SRAYmM_~8f=kNbb3x+CnIrTP#keFhFF3X@6!lM3-a?61 z@MkXhhp!_!vBI&osAKV`6)tD#iLgSynHxRAf9V&2Iw|R&yv$jtPS*T&#rf2%+qNd5 zKC=jM21rT3y=VysUKogEjbdk3(TfnXNB~!TSElia)@1KEtF<>#?`*H$?O-W)p5Uex z-~gw#rh|T3z1vT`zR@RR0uCi(doK)Dr_`-$`}TM?3IT)u^1g0{hn`cGV5Y);jR~{G z5uEG}ufU)>;6C0@Q#X(oK)`b7g^suHGp6U>b$ytFtL;>(-h_hsMcn;~;O z)<7D4W70Oz9gXMc*l_6fD0vu_t=fahD239YsZQ&=E<=8?V!=&+aQS~yDSijHWRtzG zkD(ofDh{&c_~ViTBU$SR+*QJJTh9}5H;Uxg50i1jzE&)29y)i>6fRihYF90RFlAfS zoGtRZS?yfzUBgQyy-H91&pP|$yEB~Nfs&UdIuE^vVQ$ur0wzU-nkZcAfDdfc)P+Ncf$S5*6j|;^JHUYq(YF_rR~ssHJZexet?`uSBZy z={yy@N2qhu82NWvCRp%un^6KgycM!KskIr#!V+KqRF6`UhO~mPMBMvOGv%((9ftg}C@+F7*o$t)GW{}iyn z1fLG;QLSix*C>ruf#11#;W`ldCTC9bNJ)pe0jRYrDyOao;(L>?I_NW9)5^iCzsa;C z4*A@d;E%g_7*G%Hmcu>DY|22VtKCExU z!u*@~gv8blz1Q}uYzLt(+yB+dV~zo?d6qAfK}a2cA%6Jtd>zH2@(waf?8D~T-# zih={^MV78WL4}CmzGhDMyx5x?fA~U|3ttQY9$&e{OgJUuBnCop<+KF#-;6ARvvGC_ zWx@rT3WY}wX%(+tmI9Uu;a7W~(x<`N(}JE-yTSC=?qd_;>1VeBc4w}!(cWQ16FK)c zC>_K;J(*Q#pFu1Rm4VL>Q$@VON1m>vB$-%{&Wh-fG{pa?ihKwLTY6*utn|*TPKN@* zi0p`l>^vNxNL!Jy>Dk09=pitF&HmmwRWy~~A+(1BH#v~FYO&kW+X`UPits|=Go0!) zlzQR+5{x&a2-;W}I~^;qPu7}y{eYNyY2txtUOT0+2v(r1IGZnK^1n4lQ3^orsmP9X z4g(=%xBk8SV74~RCBabz;f3^ic!;!lJ6s9(%{5MwFx_0yVPeZ{=Zs&OfnCFgN{;x2 z*^C+xrPKgS@K*xiIq-(Mg_jET(QrI+`UNufxgpOdc zBF#=HQ$i&>G{pcL$p$bL^Y2#)YWgn>^e&;Xfs`;+sh$s-u4()_$lVX2s(|C&O)~gk z@F|^7Gd6b(!Bg=ce?F!1y@DD6`Xpnob6lu*ToqFG22_=}^`E9|ex5?b#b;8pkS=ZT z8jOj=<_+hmZ7LZYg&!iuE4GAHS|^$R++?(^$r_-Zb3*!`VtJ(!GH#*Xfbv>f1)gy3 zViunwyYDGCW9V+D&N0wd=B4=h)?TOBCaz2wRa5T1b`*J*pYwE9{~!{NvfxbiKg%3i zOtUeBmB;n56i?mVQ0+e?hK_^|`QI$WZ8IU1KG2Z*@SP$f0fP{^CcRNnu|yu z7YYue3#kl-N^M?qHGkM$bEkV<+K&898j!y!^TmODom@~ttDi%9?ixMLdvCKG8je>) zrY$xmd;#k3rv^kYOp4qKr1pMJKdNo^^k7%HM37zrf!dl)1AJTOy?bYq2-5lICq`VGNm2X_7ywu0_&{>R4!X)g$9me)Th% zT!&eXw=sL+%Sy;~ykkx=#b zZ!8Sa8qd@D@pvk$=Fzpiv#396p^)b-TG?lF9LAzmffaIQCAM9$21gXe81eMhC=3(Fs@bn`iE5L}}^gyTk`8O`eKLPIOH)t2+lF)QQ81?(HC^j7_|JdfV z?3KK#GERWe8ZY=KCFK`aU+ZZ%5HJiv>nrLplbF1EHiuj31z{Tr^^X>(k_!lL^}4SW zbRq0TLk^k=D!uYrj1%@ejc3+?n%K6ZZ<`_&q1*rjC+Q8EA`}MVhJ^}QuI^Xk@4wgt z*#S9%_bR=7(W$UVGk+Q2i@vBLrLn8TO$Wl@+i3`m8g;@fzU(K&KnLAS^(XFXwbcO- z2u22=FfP`%O2Q|hEn$_y_oEFf{qfdPGlH+fS=mYvafY7K;H|~?WMW5cyZi@4M%~m- zQ~!9dRTXNflMVIeHO?Tp6I+QCun5CX0;I^O^y?S`k__$3`Xd?sq~#D!&Tn(Tx9Y0p z(em+-F_eBy%2Aze7R&8mm65|X8E!NsPX_wA2p~?Zp}|j0@qzN1A0{T8nuN$&$ii@# zMI)T>H`y3*{QHV?+cS}3Ogh!D2JHfXP$8pAls6fWj}G_$z`M}>Jb?uNMHj8_b==Kc zZRqs+P~Z~OF{s^kN%O%nZp~$s<)MslGnAp6@Vy8aXx(gG$>w|542p%#6!>!yTC~qr+)j* z2J6s>B>85H>4DQkMQZT~s=@0P6?)FYsCowWVFYor)uv?j(P>1`gIby!WQ7=>2UsRY z{MkLc201%Y`&LjP_s1BI!EbZC!(@7E5uy8P*1lNn)!fry!>3cD|Me|ZW@2U z&5{OT8^eAikto5jvk`x4+6;~r!-L$)Buh&!{#C`m=L9PWwog4DWA{Gbu#{9){kfP7 z^39zSzN!M-Ic3R%1U_m;idp*vIpl$=N%WBEt!a&gJh5ObnjW{f;X6uX2MTlV_2BT> z*8zxD`P;lkE0B5qg~Ls6Ag7lyR(P#5kDVk%`YoJk+!5Sq5&}AGWU$O`!B4=-xw`O} zyUrD+GVX+@FQRyM)> z{y~GjA`@$e=P{co5GvR;$3qyQ89VIB3za{V4sL?jqTe>L>)2zlD?97g0BI}J_Cq833nn$Dj2w}7nMKeEZsEKkgVwS zanw(a`T!N;&N;Kv#~uc;7m!&WZtYh$`i=KwP)nVme(3g%Bl zI0v-@52q(Cqse&6&Ni#^ks!V2)KbMXX@7+*+xXeJ1HhrQJ~pxu;;_)`PFV_89JQ zB>vka$6oIg3rm|LJBr|w$_NDN%!vAtw|qUUEI=tgaPyo@U5aXzGAECf4F3l{!d{q* zGJbg#gi*u6$}3e8jWy$ScP5AknV+Q`IanPjNC7d9QokJEw_gq9Fo%U(CCu_+W>o$K zGE39Y(K6g5Y+$AF1odSwO?3v5HeF_9V*`h5p7NaSVcIZycX<*-_jJ;X=me$(DobnZ zNPuSUokw;cj9cC>S{}Th2M|lH&Q_e-;EQ{*pVn8_sz8he7I_q>L>`OJujOrrJz-WG z02;R!XWE#tDDlTJ%#Bz95}_ml7P9=07X_$u?Dfs`&fQtM7Gs3+uKeSX+UNwczk6(Qa9VOeLpY z>-{5`lhjDC6B7jZr{n>dk6P+;(zM|1e~dR+DJ3nfsR6XkmxsBZx1p8g#|^!fSe3U7 zoQt`Nt-dx;o8Ltg1kie$_<9Tfclr#%1Gu|2sT<1p?=~{D5W|y#|H1ezTIb3#F6)@_ z)B1wGJ3i)^%??I(9M+GrqJ;L1zj}rI2$yn2UTx&hqpaN>n^i+X9(RYnmNk-h0F1sE zP7+OH?K}@O5-czSv98^~01L*#%mu!j3JQbLDvRYDIjV`?4sFia;3j9+-M|vk00GAn zQO%(Zu)y~KLU+B`(mPc70CEUoX^cEc3NuhOc@qN$_OGNQzui_ZpP@C_e#`Fk{pd$X z!%l?^l4}9)xY%COgySXSeb}-P*UBc0g}QEBp}*D*PkL$j=FAqc1@A%Eu1+L??EGOY z&Ej%R5TR_DHf%M8NeQh)Mcmcc}{hLQ;WDfNR0NLGmHFSpHAIAKYaHE@L+jJAA|*Dg zq03D&HRB(GCSUAzv8_l}Wq*-eRbkb z3nEuR=!3{tru9lruP3BaDAd14ky%P;MXiuRKj18VnETedjZ*b{6jRaR>na-uVtS&^ zdEdq7>K1AK8#7J6K46Jh5IMhHN^t+#Y$?~^2gK~i5YxW-4QY z?B7n5mPe8o1-j!&8j$qwrFLu1)@@A-=gXxEuk|JJ0ne9mEM)8<{~i>oiWeRGvL$px zG4L|WcI_=_604*tgw^Ebj<^d;y7F2#n{6mN3N=reHWo#d`G5X;E~IINOPIc_65cDd z#gYD&)k-WB?AQ_e615_;9bZDF6cY9%{!spbJJLytTJfdDhHNglM^6YEWTM#h$@GW-Hb-Bjd12rD^rB8btr zzoh>`O-^yHI=z+mT=-ZbKNXb?cm;DN3zxf$Oe$y;BPD?}1IFBHx!}v_qy$TCK6Jo% zRSh7-!s-tu2)da^E_-)ou|Y-q{=`jj04z!rG0vX3Ao-b<)|vG3b}2of;)^;_;8dsk z$bu#cM1vyZ$Un1j!~$lhm@O(KjaO5Jj>GtbG4FE7&0H(1Z#>bZPHT)@)mHfW_cTfD z(X;nGBEMWD1TyFXl~C=OXdK_A)i7xWpd8;Dm1?oQ;ra8b8qd#QjJb3m){crpPw^%g{qSj_e2zn)7)EoRhDwLnRObJr#_${L z<#nA5npljZ9kbOVat3fek~RP!5M9y@YUP1`%D&o24v-3RX;%vDkP|D{6V#?wnN@ka zj+VWKR-~!rYIZ3+z1t9Xa|ETGiSW3D1=WG1yol$v*#L48W9hQj=;$PrG%p)LXVtH6 zQWBOQBH$jjAU}pR*+@}8J^@Ztu6-Q4U7|?ETd)w~9u049WbDX!E?wSXR;_dAT{*$c)XUHx4NUe8U@ri?+28iZ_uFF>~AoX^H19L|6J z-C^V2MKCii(Y+-ua*DkC^~aSWGMERV!RPQ=qONR#J7mLMyH+lWEc>P;KQGv8n=|t< zt|pXc)s>-RS2tC5A8~VIDWNR0@g|rbWH>qhs%*w#HZ0_XC>EvE^vnwox5+5tRLHnaDt^tPs6*=-vRYMUhcJ%nd+-m{~oWXazXl4 zQRTXW6MqY95-100%np)@aM*61|D_XJZM{k@OhPf6cw=?UySjFVv z&>^0oB)@B2VI~bj4msnOL&8h}L#gL|y3Avs!|_aT4NwyI!;IPhb{RkYH zn&H-qSbfNgX(~91q6HTzUNW3YI0decqOPt0$WBM;CvgFLg>LcXOc`$}$uwB26F_*6 zggRjyJGoW{T1O|am6Xhb3${kmicXBTZnl-O>4G?#fzIw&@`;2mr<$jbX6B*?AM$;Q z5;>*TstB0PVW$9!o7APn5?}#qa1Vzw4hi+D;q6n21QFI%&Oc7^0QFbu`o@5O}W!OK9S_0n}nLGJ7l7xdiN{_)8OPpvd4 zu3O79M#W-SXviiB;`r7cOD5bM!|M_4k1zrwRMA5sTqi`~?Ri1~`2EHk++NW`k&~B- zoPW^EP`@+G=KTZu+PB1U?%O&ygKNIY4*P8A(p6914^^DfSjhJ77W8G|oFu=JG>Q;_QJiV@0U?3SSUWu6PJ}W!S7qZ06po?}u z%$uXQQk%fyRJ}@Irhl9!#Yo*I$VrPt%;%-7-`~(~3aEc&94e2SUM+@D8Ags-g6UL! z6v+pEd8BM^W>}INKaKY=g08e3f1*y2OE$c;JMEZ1`m#(_m{{R~dP3xlXp0??a%HL8 z^)>NG)q}pxX0}N521mQ@yEIg{Olv+leLfLGTP&wtW`o|)KRnbd`g(ejuQXLL8*Y>k)(1Kpm?R1y?s`1KrL%TMWit0|8VNO?1L zd6LdGEOL`?CT~1=?159X(phobUDb`_oKd2R>^GZO)VA9o4sHTJ2@}@pz*I(B(B)4p z>wVW%ink#{T)%sRTR?H>h@T51LaGTFyk3@;7d)f+17(r$p!Ly@5@oj~ct)l>@7Ty( zT69ql2_-IKT_ak#@n{)l(x7XZEHCZ>jU8Xfv@*^Fejdd#fal}G!KqB9V{e`PaOk4(X4IT>4kbK1;x3ZqM`MWjzLRSl4KAiK5G)Z0_wpw)>#WyS%X zTDsxk&`>R~L5dZqLmz#Wu?2B*PHLofmAw5F0xaHHI_Km@5EebeiXyG^PPH*)(i*=* z8J&VUUfwBK$K^orMUA123#%c`TLR3-`|avI#bZtukgMY_sN)@Xyid3%BdR@@qi^w& z5p2lN=GZ$-1?gShtK^n(F~W7HW#in&CT)!bmw%qnuw#g{eneXZ0!1M_V!cH&B&EsY z)+*=wJPxh?`UM?M6a7ycS4*gKO~6Y@b=xe?U_Kb|iy)KlVO00yr~bp#R@ z(0f~*85lz*xtGL@$Svj;3FJ2<06w<7lpkQ6GS6lM9*e3~c+by?MIHPN*d;jn{5%40 zzQ0q*x^nDC;^G!^vCYfwz5haJ_CZ=B1$6fl`Y9n5filviS+zwF4EPCCrX4V zUQ$${V7Pf5^63f()STL70r6i@-KOgdklI?u+Nr=`#VJ+l@qtuWXg+Ih!bOVe`zT{a zqHyn?E-xy53-e_|-@NXs&A#DTPwj2m;)7wlh5_gOP05cyvz{WXB1Lo7JGYch#T%Nv z5ilMWrs;xVC77X%mX~koP@T=0^|78yRWnflwKfekyZ~M^8J;o^Zj7k5vbIZ1|&(XbVbE0YBm|o@^)78OpMh?D%-SjP9B& zyNPlSmVa2+`Rv1R0@nEy-M=Dz21w_vI^7g}C&AK8k3Zr|yA~eU;b?z`OxovkxaZaf zj4$AJ*UEiYw??sgQ8{9JbP;`8) zL1cS0w`dtubM<+Tq5JeCS9!f^_|R>dIHKGWbezU zO;!ppPUjY*+u1j@1Xxhie^5hasK!~H$ksF(Pju%h?riZ}~lPqv!Gk43D@4z@I zEVJ-w7SWCAe`}7lO;=Cz!O7kRtUFc(Bi2S03=8?@d+Mf14UbmvdAz`pvY1acSn0p; zUx*C^TF&M@0qgMr2*hx!{624U=omH&!s^2usJw!uh zg@29P?qYopif(dG>WcAWNZ1_kF-$q!XV{gcU1s<9utfa_7jZHfJ#fxE7h>X)$`n zg{=shqEn0txhJfy6PCdKda+fs4<_v#>b4I~N}PvrHw*SuME!VxHIpt zLN(%5i03uQLyu*+)#Ct$oRW_Z?FHdMA1p(HyT?=;Ln*x!l!p<j9FZ-9Ss)l zS)$<>Ym^Zid0?6+v+e2l1xSAfjYM>K+)tG8o8?}kW7rw^p4X`FAe>SaYf=Ta zR(}Al68yq>QmjE357i=uB0SqxhGeCH26;9 zUeWu*Q>M$^S6J1Oz;$f1 zwncgXbk-T^r|aii;7tVnZ`$8)oixgHH@VN~Nntoh(UEx*xQTpA`dL+$HU1E#YlU%Z zXMb&)LeBX_g}mAJnbefzb;7*0wc7T;XhoT1s%G382xoWiZV>+U3feqV5!%@zGluuF zExvzl0F|^7zXt$vfj`5yetV?I!h&!cuB%uxpv+MFAT7e78G0sb72`pXU0;rNl;Uq+ zdQ058;pT2x_;&f$R+N9u`DX>NuGoWb_?-~uJpCSU#HyEr8IR-QeVhe|aIPofg-G&g zB6v3XV(}0*##>s*zqB)K`KZQuqnWf%&W494DF)Cp-X8;uknv#w)ba|kWgu;>EEg-+ ziX3VTRB|%ax+a;>=Q_{O(y5gs>J@~l1jLMBWZmp=+L1q&@#IGn7`9W(wScKj*=$y~ zh{?EU#a`LRDb7IE53Wrngwv%`ZE%`F4fAvCHkkCN*Vdp?jmEvIr(3#;CrN~Ul#7CP zj*bwAopFsQwcg}U9q_H->V&=jFO(FgG^n}5l(K}ZMx{j(eI?4vwP}?e3_5jMH|ktG z#si^fJ)nEgv2Fp%a7yC?v0Y2$zJ#Cjb z;h50K3TaT5|5Kra)lhveP_@CA!i$r2<(8uinogpna@_m*EJp&@lG)_R)tRWh!FMHc z*~sDW9sPcq6!py%jE(FCPPos){p28G_1~8?_c>%R?p6j@!e#!Phn`0)WV~vCmKni; z_BZd1YsA7a&&`xV%a<}TG6<1Q!YX;r1;~>V^>yPRPoS*C4<6tuii~j&*z-2bMnTeg zx@3zgs3I=Re#KFJ7bc+itF~hvD9I92gl2AF+Zk3X{_Z*w9_mtfO3ShshTqg(kg4hX z{;(UjP-w?X9KF`EuUIyybSK1;Jnk>#qgJ2#VE2a8KoFWT);LrMzLu7Uex}?_+N#+p z$mg$xJ?uo*(0#@@(SC`w0+{Tae*F`eFJa)*Dnsy+RGu-oZHrAc0%Y>1JKeGB};N<`I9KNdfv>fI`@FjPr)v3xVFk0FV7yMGc&eW<_9>r=htM z5vU${TshvzeJ9vnZ${wq#ivvdUdlp*tC$*K6wIcJ*QW)+Ku66d2Pu15&=)~}&0*n> zUzv8j`>*f84Mb^aphNTHnpuNNSh@-SZD;qfK)NG)UBIB6Ey_>w150L*G}|3x4u(2$ z?+%^DrymUCpvhOjP{G;^Bl z%1eF*qICS|EF1nUYHJqG%~7xBCR57KbWkr_aIr28(q&tk?5ZVUA$r zXBAZznn_wyt2j#XyAkw$-<5s+^21h8ZMR5NLcSh6A4@o?Lwz&pZdGRcma`w=V6Rlz z$qW%o;@mp*G6`U(`v8dHdCbEkpuP2$pA@UcKk>K7iy3oFA_4Z_K#iJX%FffW>j{Lj zUW`L~f=3RIx~0OD|oC2xWqqy@s-_;SMwH;i9_keU6; zp*XeI50i9!YMH+`k*yWFG*8Qng{$Y{ z@(5&ISv8!VYE!C8UnY>fg~x^b0V%SqtYdYEKMvoG44b|f);)$HRGC%XfGp5xf>c>s z2N5lyj`*Q6%0hu%LM47fZ}FB+?#LxKfiEUnWajg$GppZ#AZKia&2)&bX5*K$t>;N(Lp60C6W( z&T&IC+g}V}WFk@Np0Y$#PXyVxOA9t=?=JAX*#VV(h8Z8Feb(W-=<;Jgr*FHk9VAGc zKam|#`#e#W8?hBUF1yHNl|MpKs^YfrN3iv$f985PrPa&Zv~8RZzXPA){ooItFkSZ5 zc&So-xRwKrM1lHBF-8SM6$A$hjbk8B#0>gkv-ZI;Yec~?ln8z_g4qu^0;gtrj%Q2m z9j49C1QH}?Y&{GD_|c%3gs@@TAmJh~fWNG7P=bYfZwW_t8#v=sP90FxPqe ziD+!D0T2pn2am0y0#ZSnuijU{2Bw#DRt?%Z*2<8AZk8~k z>mH(2$`2FgWNB*}LyC2c_$g;?gAKK0OM=+|h4ZB<72CGL@sl?z;|QpdnTKru`dsOC z;Ldf*J&3opIfO=Zj6Fi-lhFtUkI2s&W!Ht}}rh*P=u=Dou z^2Eko^ZjvHI0_Mvz@0zzRME!ec*}ZTx`tM$2+%q(yPJxn4m&o!Fg?6y$qct@6gq_6mDkH6cZ}Nh}V;AE%ZxwOOvhllf1=J z{8tEb7&7(Tg_u#-xeTsp2Xa_I0Pb{U5BC!lX~pz-TLlkIui!L{H3P$nRb_gF{)ynbRgz{()Nhd_olqkr#ka6p}+SBsm zbi4bM^n?ix8TIU&)0wh+jTPCjF9lH&#;7qD!3KsKnZ~1^^DvXvLgLgLlqdpIj-`u1 z8$fZSVi^9(bC&ifJdk>c;+sV#wDc3ULo0Pi;A+70yDR`9(&|SYvhSM9M+7xH#Y{9RTUR$QX;d6+bv|g-rgVT_$Ow&sDPSBtinKtIqh67-+wZ#Ev<j#l0YRWOi%KjFY7c5haJ*I!Az*$&hJi_uPTkyHaF`9W z?M~0Xer~&xABOoNfAPbYVtdwFi_e!FKsbO3M>Ah#y?y`{G?HTQ3*e8_RR{(EH`Oo^ z#-O@|sj|F}4NmMSj%s-!11=>+d)BqhXuiz+D0A_jBOFGsY z$M$PYC#9U&DbDgdLNeNFd>vy)hbiatJ`nw1g7pGobtXV zT#o0x&cfTOg%(=E9+@0Jqb|%KZG-Xo3c?#VHj0FaKGb zGSFr9cP@FduBhu65z4$(4w(3~!#rZ@(Th&o{izra*9Fg=a1<&Y%0f2gSulBNhl)>j;U)n;noTRb-fkDO-0+4)c z(I|MK^Is_<Wp7Ifg?wZSOEf8`Eizpv~jp}S~=x+R$IStTTG8t zb4PhrP&l}%cj(eyAQN3%nFQVyGfPIKijpEx{k0U6PBzmgxFVgjKVt*GK(zFws+);T zQCdx3f?(a7T40|U46xkLXw;YHS^0B`+w30FW#(weq~}?C_;N9PE4Mv zit`+elL^aAaAQLZ9|4c9pOecxj?AK4-!h+@tM&XP-^%T!;b4Df5nbjA)2lpzFkySC zu%@Rg%l70;)rm5No2q8|%la9<%r*{L-UqWGf?RLZ{Y2x^-1Pl@P~PWwLW`y03A2); zNe5}3b2={HFEs*P(GTkRshtZe1&h|oux!-Mvd)HWsnV^q=Mxm*gxS4IwNO3PcJ4%E zH#~sbxSWwh_$hMMzzh7V_lh9}QBOZ$zwd86$K51!-v!feXiM5%cr4myr|op{^>@Wm zIBr~?>=p;t757SN+Kd*=Zo9wkk7RxHh@AG+%T}@7a{G4*68Gtf=mm=Mn+8K7 z%o1JrF5}kvd2~ z-p}&5f&f(4W)sh;IF!w{XL^?4VX~kWe^!rDlUfUhCoSXO7M}QsO2MD@#@MdP+B}6E za|}2Bar|#}aA&NL(qBoAi*aRF4to<8)CG17YD*ebjC#3wiO5||BeLrCEqe-q<7Kwi zx+g?&{y(QodZf(Ws2pdVIbWl|?^>6ORN8P(0Rv;@STa|%Dpe>uFHT98&-mSQtah#QYl2TB9g7A%z$HR3VH6A=zt?czGJ`e*Sy!H39jdZ7<&5!s7yN>Aq!_HY) zI0c(IU^AKW!_dP%{B$uW-3g(v`YDRItt91W3Pd>#QsuwE9+griA|0p!t1g_;%J>nwc4f)jDCX0mIBWn`!rWA%92NJrytaQxq|l4;ugNs26cyavJCV7t zjN(MD4v(x609^mciQ?m2ci6{5qT*x|cxq>(Z3H_;9TYG?>g3;j(Hf}H@I1Er>Vb`c zVmbI|!vDyx@k-Ca%JcSB^$8B~{@)UIM2z3?XFRskwh*N7a!KlNqo1{y^wl6M0Qz(Q zKK~U?oEQBFSDP?ty3MCPA4`8W7PXh?RGque9O`Yu&909PzpvJJALB5nz6PqNx$U=? zos$z-P(Z1jkrji;=WFQp_P(p2s=CE|5E{y6&s1?-8+ zR^chEw9_#d<}tPFP*-g+8f-4ry$#)@lE;s}@nV)Csf*a8r4!*Eok%u8fJ=yYA9P{^ zOLymD4f_yI=S8*il-lp~+);DBxO~Z4PA|K&o!o`?c8qt&N1G`Bueadj-6c;ZKv>TE z`owwUW>>HPSnDgX2plGfRchQfKB;je+4U`VCUs@Yx69G1P?iWJU6l9Ex)HX%_I$hvsDJCHY}k_kr;*YE zgKVQ1#0(YJ?OLHv@op|uDJxr~3o>K)L0QeekC(!#sXmQp&RTUy`}1ZYn4W zm6PH%4)Tv;Yxw1*?p>tiw&lG6ZT6$j^65!MbUb> zBGw!m^3gw{;RAOQtwTSYOC0-<;(;#@V`s9rhiEc?sT!S~>HCOB1=tr9kA*LL+0FCK z4_x-$*XyiKQIaqLlv~#=PQdcL1U#9^+;k_=21Zf<>_AUJ+RwS0tU0 zE%vck!Sv*HIF~Hm)wqCLZS)Bu0Vi+iV$!e19(E8D)Sachl)lug!n)f1_?H%J zIR5kzD;4Uoa#S}xuBoR0C9wfra?I6SoSL;zDy{DQYX(K_r94DqYsL^4+&0?ALxvZs z66&#f@pi#XDTVuKkKw8U!eEg?;R?eBFpk#9+-EYm%;gHM&JDSg0v)jHoF(>jK_Mz80WG;cKDsOu&+3*W zqYyLfXWc9&k@dL9fu7Hi!kZ47lVxol7gbrW6?x91Z!l7D2JNnPCB=MAPaU*_1I}AJ z0@MH%d+e0cI)8$gl*E`lR|n3%IN{X9nLrXcrJ5o8vl^RK`qs1uSDUZ9yQ`TDJ>V?n zwpFk_)I2!)2L5aM!3<8DJj-Hq%X8+ZyZP!vZo-qwt_HSQ>;d-M(FuwA{&6OKJ-~>e z9MBPZv5g<3wDm$+qKq|qt~vM^g@jj+Elqb%h)>;I*)k4&q0Ac|4zyDZ4m^ly?^C0?8efcOJ@pk<`*-PbUlP&Na3?NfkjG^Bf9jas z4&T2jMBisp9plK`y$yqdgDldZ84iOg8at%3yLn1|yTcAuIZAkFQK|MWRNEnU|NQhscp=R7v=kL<7W z^_$GHsFsaTy?l7q3*+Da&-gyv8S8 zxBp#rBOAtfV~!fN=X4+4ndiBy1MsNf9vemc9FtRhAG}#d8K;Y5{B*1$*BRe{gp{?&{!!-YuAS`e&Df(08cwXeJwnR2wCD3JLF3AAJP!I z&sr38j$Ghs0QrQ4Ytp*x_m_IDd4e~l6FSh(vLXbT)!p)tQ5EG*hnC|VovnA z%Vh>USFW?c-XGNQ*EJ{@S}^>?+&ztk>)*uV8t5upVm)Ji2HUTM&$$7Kr# z^IXaN;$=9mlBTL7<=;$Xio-v1?zP;EDsblFfwhs&s374=9dJPiIJ)QROU}Y_1XndA zVi%6Lq(&aBT4L8Tm1HlW6`N-3IOYsll=P$|N|?{%QsK(fZe9dUb!a)anqhKx2p}-lrTZy&5HJrzqld7&2+9V4f-9 z>psc;TXZ`%u&y3?7iRDhE61#kg^mELMh0#G5A4_tW@*bBTH z#SsDI;_+Pr*4N9FqCevS%GQ$w()gR`TcWe6!%{6uaJ_n`EvW{p>M8G$XiI7W;Y#d~ zm%%l7%zih^Sz0UJ&Zugr&pu&49z75r7yXWg*=w%SCP@v5IGvJc6$l@SAE7S@4O>oE zc2OS$r6l_?(@u%P19)8*SPb$7B9yECU6JHb#7N7-;kJbpgSf##UwzTM${B?C3%ApV z1KXe2NEfk%Ao&=!jrW8M^Mvn$xm6s}&8bG?;THoN%(q&LsoVGf*4X`b5m?(w*wg8$ zUk3jR=P{#2k+Kv|2WbEjC!JK=hGH}_IkbKWr0PnhPR~V@vndZU-ZmbHRTCKO+ecAQ ztfCzwO?8$ng{Ae-3^WG!r1b+?I#*?Xcvx?Aqbi;Wg<}i=Fv$Q%nuUo}E@g(Ij-FL( zrx48Cf?uobu9T!3JC!K<3Jne5A}X6FkdoJ)20}_)-cqpfK3dmDo+=>kiRh~_kwt43 z#=)xw?#8DDf4c`F$TRU}UbPU@9EXIGgx|lQK4U?Cgtwfh2vtR*`cXeBG?O3G4@W_fcEI=$pu z3t}em4wy4CiAq?AW$a)w1`ZBb91vqBHDL(mOF2dJHceuSOKMPB4Ni;ZJuMPJ8qu9u zkLB7E*lPWk)|L^byU)bO$swJD)f$%hT3=##D~my0=2axB$wrfD@V7zk%S%X-ngn70 zLJ$Ql;R1SlVG|sZ?k%|Jm;V{KvqMc$cfWfJiF1YN0)p|n&O(dMg=!iX)_5cT%OLDf zOfX)me#xVHv!x&o2A+^(?=;OhQaT7hX%fwG{~mZXsxX&73M6ml(E!Vs<+#^BSJ#Nq ztCR3zd=H&hvEmBn1ag=vJh-Bk{69)8TX5v$*z62Xo0f(w->woE>w$2f}gyeI^`q8su}e@lUO1QfaD9B|Tyh zjw@gVl8oY&U9xuy@2MV`$p}&5CKKGY=8l8ob*(V>4~3!7RYgwTpQOB>kU>`Kb+YC% z%4(h&%?p}RL!95Nd_C-DOLW>0-H8{qYunmtKfS2n3Iw3ab2(F8^HFA{?gK~xMKnGu z_dH~EA(A(EaS_}ZP#;hnI^nb28BZx8f<<_4;ygs)VyNe5W*-np_zRm%J|%fY5gZwu zu!fn?2`1@BYc1`Q{5~Tu^vXOdg>nYWz;rb(|C|B?Rt5F%>f-yV!ap2izns-n?IFUv zQ7hEw&53n;w^AtpPtr8DtbN7Buh*5nOX%H~>*Sf2S#%Wdh_|hmZILvk8KZ@k?&p27 z>am%J$qn$~vjkWedIQp~nPxC{6)Z1~HRq_@9+b~_UiIsnm4MV~GO)-}EFyIxR;s-l zZ)Zq?Zd%|k{zHX>D(ABPIL!IQNND!wV!5g@SOYtpXxY3Ni=)@EaP}B(ShZgp4nlyd z=5{;)6RY0rpgSEuWycJ7oFA(D?>5>9-49`%ppO*TBU-=D2y3GdiqbprUP=m3=F}@J zNPs-AbcKdW;wO*?m)UDQ!E+PG17diKrv$Snlux!Yx2tt3Vg)R`Az$QsrR>NA<=Dxf z6lp6a!D{gcvCj--m1PNW(Li)g%bVL;+U}(l&!8*oLmI%-AINdp6D(2G=86|Fxd2$0 z?`1K*abC$u97M8>=hK}kC6Hq~C&~LRg@VFxW3x!e`CSoXxCfBii=1LcKQ*3E8-9W6 z669_N`!x*ol&hrXD`9xL!S>2;e4qWw8T5Ug*%ve^^~!k*I`2a?H8Tc2-L7fho#kyN zhz4u5QXqXvo34E_D1m*WQckgl(y7?DW~*kd<-vdWTpt1!PB$JjuV0ZX8X3a)hBp)Y z(v0Slkpvom7uq|89MJJ?Ix_s$w!B_L9e`Jm%A^2aWukj->EE_}yJgSc(BL!a0cHTg z<2xjpG_v2EPpqVcX=Pu+*0Q>A&FhCn=b1!$dR2ar>oJj8avjjFpkT*I?(oVU-`Lv# zYMLqv{*jW$CA=0$Qo!4d0bSEsI)8C_0ZkZ>q~AH-Qs5ctJ9d`rukK+KjzZ;mHr@LCLz*_dI(5186DQ=V`_}1_#$aB9r z(eRW)apsH0-6kCNT~VdSrj#~ztq32^kpFdXivf_?K6bRa5V{8~JIr^8IZWNNTs%kG zpV?J$u>FqtNBr{f9Xw5T)#;URXZC3~bH;N0T^T$JU%V$c7iz4zxZX}LB@)|1*!-;% zH6CLwZ9^4y4t=6ET8MA78nI-rGKv46V47>kfJc;fgq}D5T-|8NdMB+VVbyon^OvaZ z_O{mq&tLM-A!M!U${N!DC@rYf>qte4KtX&*08MVe7CfDu{9*j~pH}E_4xI)BV1Ly( zaq(4(;}w?qnD9ebDBv{l1?*ZHkoPM#$@h^f-)Iaz*X+3SCcF1kHR>fXPVuM5Sy1Qz zviV`mUVaamKH0o#L;c714!TsBF@)9>ST#eYX$CdAzk5TQ;MlMfHP2uQu-x^w5(T-= zhGA6Q{g0lJZTQL3BEKD6j}-dJ7}pjw0<`V^lRREmqWB%;vy+*GKJ_LtU%DOtlQP`X z*3gM!qT)|S8W#`97Tk|Q#MyTiuDw6ZZnydN=o##zQ*pM=rWg)ppyJ=rzI2j3e+MCS zgBC@Oj&~*ErXFEM&36vQrmB{dfO8<8;esQJQnLDf@#E{FZd#%HF?4~7tvW|;kqvkF zSEQ33_Uy>o7uQD5fu1c0)oF%AZk!}bL8M}@ARzsR(Sy!JXNL2|m)Er3n?|m#LUtXL z!K|CuZDecM+0$eybBf$(4usaqQ)Or8WsHbtR*9*#Ql2rY=6``%&9j_sCqzUZf4~_Z zHo|!|#yFU1_0qF#R~|x&iM(5ydHq!)Vtk0qP|?mN)53;5MmLn>PDRB{SO#iYjbr&n zbz2aQg^MoILc&tsO$XfuM2DB$BykC$#n>(&P)1MoWIvjWf-$U>papaoO6KmpE_(7P zGWMF6Xe4-}AoIgBupk0P^U(^2e$Ovtg(CR7VSFgzxfF19x&tM(vls?mq3;aBd=Jy$ z+vUjbltrj_VikEO zNQzC@y{PF26VD%cGUn%KR9j~Or+GR08P`k0sTlSH{X;_Wuf0y7x6{aArbd}?V%aJB zylUM5Ng3Er{2*On*0Q`^3&wFDW|!z@ORx~yF0fr}6(JXZ5!Rj)Aqj|A)DRInrCKE( zm_Do;X4yM3+P?gR%A`2R?j(&JxWFDvMpHyMdA>!u`KV27r-3lW6Tc7dpp@VQ1VQ;> zguZR;PR?m3dwM0IAnHNBnVVk_>pO1C`L0M=G<6Cb7@g5hN#GKT=$Cu_LP~akQ?xFDG>dwH56v6eFH`SB&Cp1+-e1ASwF3q|$z}bA zd^#(J(h4pQ_#f@6S?84mRf%bKQM!IL;)HhWpFlQO8mial>-`AHyP$oyd1-ilJ~GY} z=cjLFz-8~1uc#>}lsb)Vgg8JANqf>F=Gi(Te_Y~;$smSN@B1-8nh15z4Hqt&izZ1T z(Ij}ikbS5}t2CNxXJu{gEDG4`qN2s|Pb?OIe_@5(Ja91!ZAv(QL&P`NX0?6RTk4>$l?=li$U8`Y zB|HM75-SSeb&OY=f_x4L<5N5c&p#|JiE0zX7mtci#Q(N5dyXD2@#t;bX2ELN#q?#< zi6e=1B;6QsOy(fQ{MqG4&T}kU4b9t^=W1%idO>d3r$VV~^8*?o>;CKRre3w|H}(XY zUlXaSa4Jv>D2~+5O8~U_pV5D?ZmMjOCr_O5e-tLa9?ChgC=7PKb&e!s`4u;1FKOeZ zULY(KB}0{sO0O{Ddd+Ar-Ca2=0P+_Be}MA?nEG>9i}=xR@4Q+=V=O6bYn+g0s2__J zBRg%Dopj{iNFrj-Kn=W|NX5Mge>?5ZfuaWGH_#blo-c|o$c{9%{dfgPCHkSSrwol{2% z-q+FB|Db8u^oevcQL(BkGTqOjoR;Pae4spOz%^U~x%2qu#6BHE00 z1d(Bv4x4+8k=*R%>*D0IV~B z7vgEpW^-X_2mw|viWNY{(8z9qwmbtTLbir8hWEPGm^51k{_^x>Llbsj4koa0ynO-g z#Qc2US?e7Ein{f>H~R0zOm7XkEsW0;fCB6=j5g-A=5NpN`~Z?|-`A&(ZoCB}@lyi~ zXo1T_0e0YI8IczVh@|BJC{;WqdUw6Ejr)asg5?5OCrz|>#YZ(Vx)=V@w1)@@Ed)rE zoZ+bo!Fq%!ykSMxS;#JyER7i`C+&=2O70z|QhJTLcRZXY9XDt20Ah>uTbXp1(f$Ou zw;FjQJSKMPjdv?t0L;A3-P*&@RXc%ck)3SLJX7e&amG@{jnmVQn6roR-K0@QBOtMl zT*=<}zT8C!Xv=>b@ShJVu9e~VPoYwaGqcw<(G6ngb6=3omT{_fiicWuU2i4Y9V8rw zb7NcjR+2=S?;gC(&yH7LN6S}4o8OG(k-Y}SJg~&f#P}l4TvKt3h_ofl>dC5|NE17b zT_u@tw>s^uk9n0y<@!~M&0^*#>w{r1C7|>;Mmt|d`E}V4RGCc%(Tw%FlIF7WGDeI( z*DlgWrOr3h_hCkdC9Fxvy&{M4`RGKB4%CJq3Jz9Nc3TW1f^7j8Py|R4~q?2;xDAh#$B?eAoe@7tfx0BPn=OGN|y; z!@)Rc^B@6WEP5e5*y2(s-;*JIH=q2_h_ng5ZzFw1ln4@$Cey++ju2d2Jx`sD+vA;V zkUWQ*Ed=>CmD8=#q=~TEZ-UjCR#tGOz8_Y&mCk#U8UU`k z2!jUi4p3o(R24Nnx5~-@f5#xb^*PcA)l>h1Lqz0q30@!moID$%z&tB+w}EjjRk!n| zJABxT|LaHX5Jc)DDhSR`&P+GMD3Q)tW9`6(W^x9=f2ZQF7J)-m;>yj-$A}!YAZ|p4#OKg@T_lRpp)O&YE^U|IMF6W3^&cI*E`{ z-EiA9jNH*|0KiOBe;iGn-OGymX#T*XGd1~5r9SJp%^sr*Xza1P9je|b|F&ysj4=$` zVK>k|oVE{Bh z%fD7jk5>ZGVdBq*)TA?mDu0B7W&=r1Xiu_$vIZHTzO1QkhtnH`^-Qr)`92O|4IEYe zaJtjJm|4E_#S%pK&J2&?<>^k#vzIyv_6Kk=P0~u2?1(kBf?@~Jz#sgl>+5?M_0K~9 ziDWZb7K=OXTW~z?`PpGG>)9Vay$AxtFazB@Jz`hahP+9LxhLIEXRYyISI|#^b`E`& zD1>`Egz<}hPqtxjgom3ys6J$8-EqR|)tWE>2?fX?s z#V8;RE*7`&9zcZTt_CLZ#JY|x)NlD4hE<%#IfnL>KNKELN-APAx~qvU;4tME?hXep zC@Do&Rsw0sUjj9uzzPAznrdgqDghzK{-CZ1!kzV%n;^7MZsL`wF{~2?=tq6MN80dt z_MhLN{j`Ekn%?GUYE<5$|+ClXgkV0 zd2w3T%fC2Et_KcQRMLkaT{A1OW`*K>Ai-+APB;S$D&5g7)TSW!m_*oLnbmm6&r1-X z61bSiT5YzSu3v*B5L+#4Xh6->gz|kYb7s<(oKvRNvUV>?{Jm@Q9Dz4E zVbTBh@LO6jW}SXH@4(h#rIaJ9dNZ6UAsLj1G&g1!o?57*6q8%t&H8yI-HKl=A6Z>C z2%$;FuOr6=v}N5tiK7AZ7O!a~R4Yk+Wk|Kdcn5WJ^{nF2olV!FfKl8Y3RExo;5FI9}CSlj}X)F+T83aMZ}-PG`;J6 zgfqptq%gMRovZW+XG8agb`bzju21ym%*@_`eJYy-wfG*S&RbRk$Ax))jh4$O{IxKh2yzQrKAwd^Jd3 z@8UsSQng1U%Cfi~xz%KNxMLL;S9-DrY+bYpY}EMEZkROt0-C5hu1znHKo^6;(-}KOiT(u_PPSUJ{Q<> zMe;BJ=x9<$(j8KBSVPg>ULL;7z&a9O*hXh}tSw%jk?SVsz0c?lJ*^(7G z_|_M~BhKZW`;)*4&U*?=>fe<&l&jaX=(B$e3lMz(+Iu#T&LCAl$R|c*@CqMT5Q))2 zL}v7GT6#sW>75;nVEKw>P>30}+?_1WoZw0+YPH;=VBDJA5Z;>N~hVQuQ}p7NOMW zLWgRo`2HpN1os$I+jQN?vh|82+9d0lNsXu{jgCPBcorJqmbw%74qRkR8nz?2&I0QH z?q_<{M9z|d1eDuR+Yd+-hjajb2~-MNR1)H?-dg?nUWKuxSW0KoOa4D=3yu_VjhogK z{UWaWP?j-7;=oQ7hj-3Hp~$Q6KZ9atd&*;?i}#`~>-3Fv12UDN-}3;&lmVBLtwi~8 z2E3`;MbOSiY}J3}nmm-z)g35MHf@60DS+s;00;xQ>JQHm`&EqE(;DTK&{{IdZOUibLjmfrn=H_EjTJb#*!Q)84n zZeiR(?L$L5o|`l)A=+py{u;L8YJ7!&7EVS?q#Tc@c|&s09j--2`g{9z(dZ|Rms-)7 zZ>|X4a&i;y#o8uKCPVjiOgD=uDI)mkpNcVkoA!0*57oC!O0tF{4EIk|wi)@8OHX@NM1n!kY}gTL@fOND+L<5r1o%VJ}@1^Txx0 zr$e%SIjF1YmEh`SSbK$*gE<1mI3fGbx5ZI@v?XvVN|GXI!532nXRRaxl;iS8*K#2$ zpaNPbs|M6aruD(*%bOM>mzP2c^JmDWM}6eP(D-!Nblo^HeCtNV8Qln&hVhhuuoy0k zpHDkI8VBGK9CVC}x?8A1hr35)om|X`M~yyZiY;!Mz6E;$%=FQ0M(pl^CcU@x57M$8 z>(%R6GGQKS;lS#qZ?zL7;#svd2AuqAbu;-c^KF!P5*Zl$M>KZcUG+Z*rm{wZk(N3D zkxx|AZ@YH_H#;5uYXfHBM%_6UdNQN5d-W+X0Z!N>0m&C-qZ9o;DkM;8(Ylv(=nqnS zK)G`VidkxCTiz6ZBgKIdm-ej#NEvm<(Ig{%K&A%Fc)r>lwhA*lyZQ67+2|$PX zG43;i4Jxur1BOK2fka0vmFG?aJI>Su)e+{4fDXL$r+X8Y980(0cL2r)jGv=LL27>^ zHV?P7s2u%Hjo+wXG*b4-jOhUWO&ZS5)`7}OWDKZPfGcd~QGT9`K)uEM*Wpu1E44~I z^CuJwmi;@R;i#AxWm(PJi1@xr*zufJrNsCgRrGUyD+4;11xE;jXV$*&sopa!L5(mu zfW<-qv7~kf`Mj`LwN1c*Eh^M^lXW43E_0;hu~17Qdoqp0b*fJ{k3L^>RAu7PjE zl9)I|?Q0QGNf1!J)8AcvOUl1EmYcKO-I@wKFlDSVhd!cHgjW#|xdoomzsFW;1;-_n zWf|qU;4(n|lLijs!6L0SSeu*1!#O1!@g-zEpMOS_K!a6DrYB%nt#Nj;w6%`&i>7^` z%(90VW&MJAi-jlrG5`&X%u}3o&0z3BCsxaqdOGg%M4(lTmhv8=sle**)@2SKu#!CB zQz*Gly+wPM5XcW~+$ZqSpE>i)E7?p+2D8h$U$GagSat3qC<58utf!wj0T^K$Ztc== zs?(_m?AF9SC9m^q8fG`;j6Zk!V)Y+j9@|>vAu^nnmSwnaH^?Rbw#xwjSQvtA@>#pC zEE1;C7%TkD9I+4bh{9OUI3#)=7oa|TFb`=hJX(tT19yb+GdN_#_srJ6o$XUliTGy0(QYT;9r`o6?LAgk0Jscn$w(9jNyROrc)m3|vRdcrRWeeQQ;#+E zI8JrJ_I)unTYU4_6&&H##*O$#`@FZ%k7|g!*KKC&U9^mrXB6us8lj(=HUan$uP)1a z%(z=RnIDXc+JLiov6pT(DZjb0+~(uM_)GfaITF$>0gYpm-vwslu~LU?V_zcBw5K$^ zoKh6i)k+S-AFc^gnuX3Zpd{U&B3>)dz2+y6Wp9Yp9H7Co=RyI1}Vw+Vdb-29=go_ z;n(?eS$=RSbj3B0^j{XALw+<_ET>nhyAcNzD`^)OVM^AdZ8aO>##*6nlEX%x?B0dO zZo2Vo6!>W!YS2#nON*{9K0`0-?kM^ojhvuE1Fs|MmRasu11P5?&?jRExeAZj7{VzBlY2?j_vdba z=Q_63GlSU6@BO_~@ZrdCO!$y{mmCMjc1ZQ$O9hMPyZ=VA6LyP5dZbmi$>?5}pai?; zfZ4`cFhxhd;DZ;N!g-0rev@7|wtV|^{?MmGxj90+R|bLr-=mdl z)8*~|)GCjpsYI9R3HR=@QV{vdwP%9F$yKA*#G)$SYoJP75j6Gl`?w3#P0f}e*53EI z=N7?m?ecI}n@*xMVg0N=t#6b1P(N3bO)B9ont9#HSTqk;DH(dYj8i$*5uK2yx`7|B z!Ts>5{{5P)F#b|iP#ZZ*g!OX#qN|OXDB~~P1?YJpNe^^H3`zH|uoU&Uy;&+tJOwfo zO61+-zfH$F-BiMmcK1}c;fkH(Kl{2pn#`>X8I-=ZRkt0k3+31}SD5rnNzGINbh`W` zXzNzYBV5?L5ocSuWxcW3t|rdRs*R=&kM8DL0%>1SGCv_IQQQ+b42Xki4`P$1L#FS0q43 zl|#OA`s{r1OtP8tmf)PaOdQC$+g8&Jz>i%;>Z{%FA%!fWr5KBxH1C?V)%tV&0F!li zs(FR0_t`ffLM!c!J5dz<_mL7h6fr9pmFvhMn*<|oK>_;d0&}(FfA8VnO)f5jF_?&> zm~SG3qd=8Di@d9a)p~T&^vLX!g)!7hbG0i+i+m|0; zvyQ_$%SxSkW@$i2Dqrhz@wJ6+Qf)TwG0%Lrb{H1y>5?9eeh)aW^)Eh8#jWordN9Iv z1;j)FN`h-I6S5Ql=czovWl#Y?H^_xt&N+)lL`Ei(-qLP7sr(IO&zryFzC>lmV=yOu z63VlrZXNLZMDJ8EVTjFqLhEy(M~cqf3wrZNWPI`Y#S=ZW{9>x__jArpOw#mVb;L3@`7+!?Qr%R~{m_biDNyyU{DkJIB6uuat7VR8r;~lxXe;KXc$;rp#7O zAdAu-G8tj!=i7Un3i*jI)WXPWd0w+x47n@f|H>ox4+#5@}UbOgs-zVtaqZevF!&L zZ)(IwwTyRbOcCZ?l9BPEuw-u`w11}dPkj4=rgB9Y5!+A z+T=tWlIDyx0L7GI)&o)z7=8=hyDz_{A;Tsnx z)6undR>8xIt)quq>z#%uU~N(0l$-IN8!z6{9b126^R|9#8=$32DvtMKNIY7N2stnm zXO>RQwk?s-w^sSlYfmU-e2G{WmAv{f0t`eVUcVN=5WO*V`6zqbPL|$`0e4fuz1pbD zeUWjbxAR#@QuI!)-|zG=iqWnyU)3n>GQgqQt`FpzANAH|%-=Jcc-c&k6=4}`r^BY7 zUE(sAhFJu!;Dkt$P4Y)lG?N=Z7B4*yLelegJ|7TNlNc3AApFFTbPxikir{`>O@PDh-`dJ96Jaq>`{8Dh1VD+SThx&MM1MaBgyp z_3u$x@N(U$o$gUz{hC@!${>%^mBqpxg;y3h5)9cqo-{j3fL){aV1tlg%`RvG4Pc@~ z%Dv`_^m4!l%Fk+sgj}zMVwSNNt;{f=!LSqnCaK#Qo=aV-0s4H{d~|U}=y6M{A5ts3 z&*ioDCofHsT&7;8rx9{9G-a>U*#Qsrt(Y;2zg%u1v;Kg~00K_NBObV(AjOEP23Pr=*){)*A8FYx)JiI3)nnI9h670d)_-0g?7IWT ztU_zo&Ylp~0xbgp?(|+46Ptu1qaJ zYM%gH#U*PbQCIK(B-aZ8p3soR%{&i@-B4BM%Pkxi>)TwB-1yjQST04J3 z6G7@9Clt?hpeQ5=gLjv9eS&M+?y4MO7p|d@hRkzf+k-p%A zY$+?q7B&0SH=wMDlNVpbGaB=Kvj;H5gX-<(9RCq_zh}$G+8zm*8K9^zV#BD++h}^( z=dCTRy>Q#Xn8!A9w@oDfa&gUkcwac?ppIG9q~`fz{Nno`G4dsA!aSnC73`r}RQ2XI zl)y_AEZHWWCl5&L<}a4)d}_&u)_mRf5m-yi>Hu)48-+1P1p-f&NwE*~s(+gMQnEU! zYtz>l0x%a;D_DsQO7n~YS(#FUnCSIdVzVJn;}ShnLO;G(O@u-6ds(VAhC6N9WktQN zy_B*@_vl!$cj>QVZVB%c*`h(pj=5Y+tU7V8xN|k)Th(YP8`XzA0SO1fL2|`dr#ptx z=Z@D(l4Orj{uq~LL~v9--XmeUH^qM^Igyfyu2N8TxW}3y){c=dyX(0`61b$PL$TDd zW&M<`!YXD-t^THk$?|t}b)m-k#%Dr9IN|zEuplGq%h*nXctZ8{LWtVu-7h#UqpJk2 z**nGWyHXaJNVxB~;AFsm`$Pa+GM(c$nWdZX3!y#Nq|%?{FVLsfSZCkz@fCe>1-`tP zsBJH+%c}TX_|KEHmQCi*D4n#hO!a>XW9fjBcN5X`EUDF6NLa{ziK8{(6jg*>aFEBAk@Fcsn7HO`rit}l)*PTb!-i@woOX9K5)aEIGhkXHO_bueC zvDbNXUMA2K)b_6o>VXE>%wW78AVj!lZslXMT!}$^uAcoF=PI+=o9fN4fh|EZizc89 zlWeR;r^fbO_{)o^j~(#31ythlA&gJG6U*6FgW)G^Wg-?v-Zxs`E?ycOOR4y4^YPUCsXUqv zGm}6h$}^MeUkS!zQUoJ|YC3jjNud7KB$Yq#T0UB4W>~2oE<-oc;Cj8-NHQ`bzF;EKcM2VeN-lXuMBv0(#>Rti&w+B ztv2x-N>%tK!2S8q#7~S`(n@PY@_OCl=xi!6g%gS#AWDRE7uwd!61vB-MC5#@SX)6D zSSpPAxdwfNcS;!(jSw(X8(#w9y2pco9mCqj^W`9Udwg5%3R>#CK>r{jAKDL=h!G#* zucQ>Tui|gygn>wNN%OC(Q6fdV=AP2y?>?6XDdBxQdhY>g(nQlB1D0Rc9+ziBX&<=l z9UE81g6Sg^Bq;NAtY4yEaHlAcPg`o>bzP|SJKIuUBdcDLH=S5X}W{dTZ2PX<+r@Mk&5O2vLmYwM0R zF{T5=zB)lKmdx#SCTnifgZObD2ep-(7cTSxn+k8horz9bielPMo?Je&quttp1jEdu zBhdx)j#5Z>6rF?dxc*2o+O(yUT{sMc`$BHjhAp5D-kH}eaeGD!2S4LQ!>ZJ; zB2~_<(^a~tIdZKWNOM^b+0IQGzM~b{MC%x<*)rCWL`oHnjd5TK0!2DwAfwbVyHRcr zTZF2C{cmPB3D&!OeWJ_{rxfr6;6C&|xJ6X)SK8nY0pPS@6aFpvMLSdFFjYu%kQ}+S z`A<{bmUw#(N+j!dW=xROI`=sxBB#&y?g>P7!A?Sa?lTAdz_P|vHj*h%Ibk7C^2h+b zF8&*aLxac|8!&bPntJ!=<*_2BKGdccNgZ+XoEPA)MT6;J_9I?PL6E8$cY|#@mw)5v z_?Ps|r1S0t=kGG|$xXA1hW+$pElQnq>TgdMk^BeX3rHrlVLP5_P67RQci737NdrJr zt>Bvc%S3fREQ?hT{kS5!aFpBlfHhLr>FNkh|8oEbiGHFL)~A%#2xKnGkf#Bx=5=o2^mB70n+xe>)(Ih)#cCaTzI3 zKOZX+mN2SZ*Cq!@#RER^)c}tVM|S7rP*t7+S3^@u!Dh7I{oDpHS@!5-2>;G?CSj<@ z^1_R!Th7NlK6CG(%m4#_kE18qKPX!)Iv(zFty&T=-7&}>fjST|rkdbLaR>xH$2#gZ z0aCH_(AF7Ho&6N=pYS+27CbaaMr}N9P`%asBz;2_7c77s#4upGZ!@X#Im6XOHJDfmRLe?JiHUl&eyr5X6>J6P0DB8qpyGwE-vjy}GWO)eMH2#q7(lFZ zEmg+B3gxh)gmtr_aZbme(+zCHZu{X8Ukfxs88#%k5?`^Ete!!0v8qp&AD)+nZk_;A z>Z;aCZM&JN~RN z{X^{AX`!?0g;ED&G+_-%Gef>YR0}nh$7EcHDAr^UUE0X&f2{4+99vzU8HaEE(@ktm zIKUI6U_dRI=E5+K53T=oI`fP7e=%cRa&-!y?O}K1)GE~6=jW@2_Xu4qdS^*PN>dAk ztx|04#GLKR28n**VaF_lL_2@Q?8$9oohC=}Qb-gvI8t)p+Aw`Wgt~UZn8di^>5MVU zqFHb@w^}1Kb7|)_CMiSRS0B1BiR$|sn?%B?`H``l3!y|HF8f*F?3b(7ulAUp|BG$4eNm;E)P;!dYY`Fo)O(7T;UmEA-rNQNHQtx%ggutZ~Ji z#|c~eY|wv3hH1y*C2&fq(HN>79bE=boP>^X_3APjn1CNCMu3wrcL}3|5%!`%2JZv~ z_~|;jP8hxL9NwqIge>JzbuTR>i%)noDyJSjr!?WnCK>H9p7MO)TlqYb*=uzop2X+$ zuP~%aA}20fCmr5Dz+{5rS0O*xSX9QS%}cNKQ(49t;q>$j^3ps#7E zzP2JjcMqbh>9)6kF=by~g;CUYG8}ThA!NgYv%!Iro=!jeq#j0RHY+BAwWhv)bp}jC zUDtu>4aJ)LAk==Bfq#922$qVTjm1Khg_H6+y`mFHQ9x^10F{?kjtf@lZx1tHuP|+T zZK;O$0eLfOnjxhh#&qSx8KuF7va3^z#My#|CjVCyP1BQ1wgtSM7b4MU_-p%pgV1hkuS?Ja`$+?7rdoZl05a1A3DLI!%%k# zcK)6o0JCXruoO@W-!&Lt5rrTZ1*IUMCSZ-r8!ackOOO1hL{uZY zzb}YaFHh1&8$OdJO8`m8PFRJcPYg)9elwpiF3i=T#bxS}{sY>0H;g;E>-dT2zn764 zj@Cbqct<$FUU03|6i2~}192PO0p0>k0U9)}mdwXQbbHwf;(El0LY3`Ld>^WBZr;4K zMX|oGZB@oY&uABSIk$l3Sc6xWBe?@4*-2STy|A;nupc7*+=Dj>&xG6!ZZ-6uC{dv% zOCsz6YLa-g(XV0n`RO0YlLD8tN_i;~3l1LrjH?Ju89uds}^X8moFU zI59%1p;KC@1cwAWG1fRjs>_c0XZ>2)3of~!^5&wOO|>!?2_f7kk+=8@%?y~cLfw=z zJ<#|RcMGD8Nq9J{tuR5f+K`Vn$QGNqv6FW1CdU4E>R$QU@1_RSq0e>|62Ue?sPXuP1y)7y1Z_2< zN7!bPtam|ZgP~E#(ybLDa4WaL#HikgGyL4KNA@vxrsQ~VZf0f!%qLsS-Hpc}dp}TU zHoY_Q&F|te2~?m~I@SBCZLDpBU)!%L+Umt2F;N}0h$aKSJM_)SpPb#_Fjxg1cRQ#t_V#)8NjSQqkiqs>7L#S*s22`hyzW)BoMTC^`2|OsDZ)4pWAQ!Zt>h zRJp>9_-cHWce}(3?h| zjTx+=;i1Y=7r@bmh891ayfSoV9XBR4do5Clpd_P&m8@K4Kppgr8}i3OCw;dgM}hBV zT8MJCRoXSPZZ^Ef@NY-BsY* zKggj8FX^ypNC4CE*Yycg5nG0?6jEu@!>sK;rk++x_?6x!s{OX8SQ*`>(|}auLmjtY z?cCkJhi+Y5XH@{9)4OElq_63{Efq1jUKKI;?2XhNx>*YDNlHS6jw9^fZI#_4sPU7G z!E3z@A$drGKu!4-=Jz<jCTa3sW<8qD(>O=7Y<*WNj6o@$p zk!u^Fu(Sab+#ker)3#Oe8KTOuvw3^}0*Mv|%)uKsttbW?c#H){!%LipuqSz;qTwTf z!-O6AkXmhK{ET68K;6Sq1wk`;u$$V(Bib1azFiYqSFzCZG>)voqKz8of_~-2+}_JT zb}Gu<3(*6k_d6>35rq|PxaZcfPh&>wS#ywFq2^`ST-8Y2+AudpND&xNN4O+*6qv#J z2^Sl=pe4>PYqlOnj6i^1VA@-{ze^m^wQJvDX!=^nhU$44%wA~2k-X}c`u$SR4^e@| z#JJCw@mj8i&?}v~ zALxeeo^Ui%St9>Q%4>*D`@Sr+y>W-o;bu|2JW=KdV&(sc=jYFrv-oaT&#*EGX|BR; zNrlud8hb~>kgl3lFiQu0n2kqa*k<--OZ@RJT(xi7sKr=yId?BuL4Q#qnU0#2PbWIf z)#A6bshvf}GN&}?KI=WHWj=t1oym~RYQUouha1Q?mVdu?wJ}{{en^qlY_y;%&5+Yl zFSZSsjD&v8<$JZFI{?FkH($rBAVbcRxu<(X7L<<0N^fyxBMEBXF72TD3*HFD&T~;> zwJW-DcA_)6HSDm#xXcXw3-MF)?YITR)D*C{41tEM<5^UI*^nxRQq1WU%BNY*JA#|+ z4%ubA|Cd(uv<^^mm~&dv0g+m@m4#D!d8Fm&*4O(94W&vSW_w>Ml#=+QW`#(JvYlwR%K^=oAjFk1ph{2R$$eAJY z>`tJS4R&b$+}SEcGy{}y18t_D#UKG&d1SMX;%rudy?a^JDg?;efJBX4oV=lEM!ZYD z-bksf>C8Cgb5}DY%qA!s9N({}Ad~_NI zWJ_3MgY-+2=pA9?H0Vm>W1sVBbtw>0Z(+TkPjc!CpmW&DSiDt=C33nKyHk5!@47hc z523YO&45bc2XCnbd29crOm5E0+A!Nk0@}cOg(u`<`m6dbzo`CbGJCUB^536O%7TU3 zOY6iEXo-s_V-ZN<;OO~inDjQfy_b2`C%YRrJ$B@_Q4@M9DT?KG*umIK{kWJIsvM z6@N~k^pF1791oOxRBY&Sr)qlXU@5W4p)9w{Wc+YH#_ID0uj&wV5y{Xx0W63}P_kEn zVdIlv5lpVM7}_ZU$W~2jdc}P~YiK;wO@|Wu2?KA}eg z*7&dvUxR2rrHkJm`RGrvvas0nQIxNmtlSmq@Euyav^F#4lbw(dJc|RHF+d#{a44Q}wT4kggczC!{mvL^#=@Bh~sltf5B>Im8UnrbF0yau{?BvZ>$ z@44A265(bZCCE|EmFyM(TqZvBZaLCqBgE>zVYr*XxpzyE$0D!BLg!Dzpt4~gh ztr0IvKm~j3LJZF;ghmPlv=?50Ib9IHV6lP?X|~;~C%n+QM*&gM>HL6NrDD>i4Z-T) zicnIxz@t!EPc=+gl6%~TmY?Xaz;o*EiKR$(flswB9ks?-o{7)Ai(8lW2bwipeUxOe zFd6_@WuL$`Q1%HYfGw2fFuy2gJSDr$8Ew3eZ}J$&NI>uHF}psZlF!Y#ZDKr8L8a#g zdQlJQDJDAfldL2E>JCP~7+2Du(qHS4>91-=Jmh0>UH4rTaX)=Yv64N-Rc1n&6)-M# z9PHeI57end6%g&Kv+qmDUu-3RyF#b?lG`rNS%?Hjv@u9@E?hvN5tj1f|5Rh(kg)P1 z@vId*4{ipK5&)UM2}+Rl8?>W+0zm7MQ_lK)m#^GMjR;v}0S8w=ZVoi9vO49n5HP3I zrK_-SDI|>7Ve`UW2scw4F1W z#(&R;C&U`Lr9fk}9CCI#GlUiRMci+T)i^Xay#gP{K8|agFUa-v@fuK+A}Ts7g5~qQ znXI4@w#doH#NjegkqHs83$ztGri6fNw(`$#rOeO3 z?oV`bZk-Z{Shq}C?aoVee6ju$h^wad`E~&+o5(VmT`>~A@z83gp2ErZEZNMQ9 z*lwAoO(xC*ZxXtUd^3?mUekLjR66=`ZYvi%q342u&3P1qE)gdoL3}+tIU}B2+O1@9 z0Dz7F{=tHBGt#<6um{-n8#-lsdIVDLRl)W7psWvP^C!MAb3%Bd z11dvpf9Vd`jsP`1wCn$J^1~--CF& znz)+41%dh>T1aqH%b~}nkan`tB2G3+21B^_uhz4Ni-q%`RrDsFHZ{>^tS@m{9jlOL z+Q<)`^9sKq@Z%&0eHxoD<^2{%YrQ{nKrpx?mBSvrKt1 zkpz3f{34J|tqRpBpw{8&<`j>c$?m2Zt)`i;K$2nWBRGOv|3EWGHi&uGtl?eqkuT)l zvt7lB!N<56-f-vMDQVam+pGiL%KTU*Fu10ZoK}mI#co*-1Rgyt=F+Xz8!oz7lD9LV zZ|ZI5>AjQLt+Bn4(4oI&RLSo9=!>+_stoB%Z5@Y+6-=Mbfr~E`tr%o5;lkM4X*y-Y zX_p(F4?pJ#YQ~?>Di@|l$(Fc^}Za6eX^vu#?d_YQ+tQf30!+|YnT>*|W7%P|#7Qz5{A62 zv~u&?$ZAv^fMm}nF3r#Ihp7SJ{pYQM)(hw$6WUBq;ptB!Sldm0UZcHv81#Zu;r*(*`Z1nYWgxpFP0|A5G3$MN7$^ENveYKys zs65Zkza(`;|DCnxJ7_yrFfXp%L@Yr4m5@M?h$mVGY1q=Cz196gFbQ#q5=W|S>U}Z= z@{b86#-i{j&c^O~Zg!@8sv2+^a1y`lleD=*7@+e$fHQCl$NcMQaOS;3_H1CJaq}!; zp)-l)ZXrUxYVtzfp5D4Ypy_BB%uD&JL5c1P-8FMT=}6m02vnk&fDC&amdxaq3T$_; z2cpmISsSfKEc6IxtI5gWn8JD4CEW4MggR!iWQS~$1YGf3FBk8*@$U2S=B;C=U@t0`zRO7tFpU`M|RGdCIBv|13 zQZn2_0zRPsv|Nxjsyiupc3|nT9ak;$6T!K&GIKM`Gj;4%6H;^8%ZvTR@{l-mx?LV* zT}zegREM}ouq0JRZ(0Pm^pv439tl-hOV0&>$@tbEiQOL)8@+xf$2;OjDr_}qTDM7v z_^Rc$2aH5xcT7i9A17F*yb>Ab%GHuP6r)T6kGXjUZ&O7bEe;ev)>PQ zTHJ2z!CNe*Yl%wZ9aE}Ma*=Q!rMt0g;h4RPD<27iJpBl;B;ycmrCsD}*sVTLjZ(%e zPP5Wl@ryPyghQ4^DogwzJHK*2vBip`BNt9b9v!I!3=@~vS4ybCymsN=J37@VlY;*3o zBEfQ_r&mEQuWI>%NcO3E9u!N%vd&X(^&{)*1{Gmx2UtMVL%R`?&bPkqLMAkud(@?a zvi9ua((GrCPmMc``GjRJu)+Xliu&k@G2T zVjVx@*E^Ts7|t^VyHV-IYo^4SRIIHWsJ!i_BGlzFGul-688{FZjvB9hm)iCQBkq?& zn=!lS?M5j%*SSVqzr7JyS4XONzHA(>D_ezv(f*#u&0v1I(NyRZpXq#x!t)JkDDvKx zt7R}lKOoT-BHap;bRP6VlWM;~Q|RE?({tI=@F*NFK!65R^yHRqGemrWBJfXC{R?03PRy0_b7#@#l`7{|)u&QH&Nc{K8 z%`kY*pTSP!)$%{oI!x1Otre5Vz<|ZTbkC;R*O?vpe9G5;W8iN%QX$ga(21TjH8;)< zDhK!<3+W<}v^2nl7ZoHm+aPNCR(|8g=P zoIET#5iD6!!xag}k65$$O#7>(C&9P6JpuoEi-&0uz+#Ry>?t3%fwBF+t|AuvL|jBZ z(rjTln;iJkD2OE>DyjuRZoymm;<>2pFs4#I!&n`c1>5*X{Qxh6Wfw@|#pb2kk75-h z(4RsOJrXBn0_05XmUbfh9m(cP8XiV3P{3tbn425LLvy)6FmOyL>(9#Z;QBSeuPOH^ zHF;hbw@BgqR;8B(&P`(1?)n#U86$rnfvo*gj>4y~B@cM{bL}kR;+nsZMdX{30*UMT zf=^raWOxS7BF{mY1j<|vHw)H@zipHdh25?~-s=Q1v-V@alj`3NpR6g=q zQeBviSE1zyF&_f^^QkK2o_?&24T2>qTw*=xU0XG>0E)NcuR-BRys?B_z8yK}D>!E^ z!CX7f^Gjax(CF|-?j|pa=8z9eM|4|c?qDAvLy`m)d%aO#J07?p=fKrOXVi2T%R~l!FCM) zrhD({kG}vpK*ql?Q+Q$!FA)mwTYfMR>sLz;F<6k^@r6}0Bi~VAP5K1a*)w>Pn|a;o zcd|P9!OPqk(px`q9aj1CI#k{@GMWB9a!SJKSuWb%%-fP0djVdx@OUL3T&1lQT-rhS` z^4f~YW8w)M3|92Xm=fzAyw7ZVrI`xILRV-r4^Exf`}S61ISE?Vkbi=%%V)2``X%|G;Mr6lo;Y_BG1T zN-TZ}EqA6y&ufC4A%i!dMBSFVGnoP7Md0=)CeW-I*oFgPe^HDSy*m%M^Xw2dKWi4J zj{Daz4`JR)FzjI@&zDfMH<3T_%XH!C2bv%Q`(2jbRfihd7s6uTc5y zWPzFqW#L7V%DF>UIo=Rmj4nzKUhqkWA>}(du}+lURbl|-H3gSj$~2n=VPnmGKBo$Q z1g7hM_q^=!UIBfvyzN4A&q^(^qllaAk?P zym0!LH+0m&N>J%Ut(WABTFgOh)Em?9IR&5=Qe-5u;hq3Fg{UiPSI?Um^U9(036TuT z_gm{4-W0(nmM^pP`6nL2RtS%T2;#u7SnF%wsf+fsNE{hhj@!d8XIP#bzvcTCv@gVS z+a^(ozW`!n`1WGml}u}Ny`wMc#}v~{y#aTODRp7@|Hz7?=$Sj7CxQ$}cQpdn;$CETg1gNcepL7h;v8?C#i^tlzV zgk-a2^BvDrXvSCXn(EG}>Z59aIx>89nQ%8uQbO6O9 zntf)sHb3e4Ek*}~bciVIJWSXv+2ghmlqjY^wNu^3FciL&j>&Vh0<%JF@yE9aY+sdQ zUjm&-t{`=;!IEJ*l#{U@)@Bq9!F2yyWUWq+G68$_VDu%*CVF+2 zf`E&cj%?L#$P%eM?B)R%lkDqGC|Mv`p5k*Ow`|~gcm0XKMruXwAKEmaA!l8$kHrKo zI*|bk)ivx}742A(#nsYW&p%eG>couqno&6G81lUabNz_f!PxaEJQo|~_EB(0dczY+ zOXi12s(PQ*)D?4SoEuZC4Zb0gr4^Aj(x}rP zR^Z1SOVLwe)eaNNsV{+?8_kAsZTM#7$6t;;N~6j-!(mogeW=JL2fV0tTr&L#hwBv?4Mf; zjWK9C_{IiLH(7^@?=G>g$8>CC8HR(+C;gy8jxv6`C_Icg7_ZRvE>&kyDGbwP5YXzx z%{fjQBVW=zxw0fT{Tc-nLNv*VeNU6QX@lvy z9m$jI0~1bx0)K4Hc>k5m7;Y`}o4#6fQ{^0Pu7VGW@=r@3|HzZ?^AEgbPs(K4@j$ORNk>#>%KNJ>*LseJgH z^U)B8@~=mjIr-|Mk0hFKo{*G%J8k zWiDIsKFrR!qSMlpySYlCEr#oL79`ALGd>?Zqj^ujwXD*i=IZ8_LcGT*7%t^rL_g`K z(~J&MM@OlpIf6Do6-0bUSc)nS1ENKODvr`c!#H~%_-7&A3vU~0&-yk1^ic6-g^Q}c z#lnyYM;O+#S@;!6A}zxR79yJ{E%ty7i_^7jou zjfk%iL~iFOX#1AIJ7#q0WazUI%XP0=5f$@DM-1!93jN(^mnP%zFh}9aNhy`Aanp%X z4kzi)XU>alLVsHTD1?ebcMcx|s@dgAu(dP6#~h{$@?~5S2GyleL1M>eL2fLJ@|S-B z43Iv{@>HCChk=G;5c%gSl~*6YX+|0l3R2EDRrW!FoX8pFs!7a!SJNnV7N*`YeEF|R zC#cLRxE=mM+C*82&D4O1&xj7~I|Fj0%E=9QGWqN5YMaIa+We6$YXa6R-~<8>mS7YR zHQf`o%r<1))U9;+qXU~l%4r39&}oDV$03UWAyk;!a@v9+RxDGG2;(G;K<}r0er|f` z3NL>h(ZJUZ+8jw?v(%=)fm`>1t?&{bm^M62Fg=OD>G#_*ZG4G1T2^!PAY|0Jff`ZR zAq-qLT2f$=!Hrt^XBhw^C4}u-g7ykV zoqi@$N0uqlh(n^4U=zxr?nT2Dd0q6bxfi-|eQz-4FD9O1#!zrzzwq)Qw~`J{nb=L{AQx@*b*&@pWNFGbHV8dFuQn!$ z5-CwgG&Vu_qzF&5d{oH|n3ujjYE3WP|4HAf0G}*3^z-7bPtzLf>SM<#MfCeWdj(f2 zC{GlrZS7TNZ=#j+UC$(*cPjHH(^FQHwg_F^g6H_8ij(h*AtHXvFIl%1Tpq#yde_BH zCX(&TH@t<(!u)lv$l;^~#OFQmzSEMd(zh|*p}o3Wv@`kX%u#jftznMHhbv)uU^g~z zM~CDhap<^NnzN38RUs)Eo5Aqm-0p)WZQ)huWJ*H`wEk#NNarKE{n_M(?M`G2E_WX3 zLVOZ>bss)87NmU&S?(8Q)GPW)%@D@Rw{v;pgVudf+T>Ty=7lKX`GM=NJY^9*Q*H~} z7I=h}A4CXgb^78gUYf8pXb^z) z|LrS?Pw^%dep)WflZBGk1XVC&hSS-NmDsIAI2Dj18$fbNuV--a4PUm%)iT+0E64yD z&LlCBgzvcJNSi>>(NbCpuPQm_Q7mV2LU-Uup5R$qpJMgky$*Pi@$)3Q$eZ@{IsWrM~Liwp@I~dIaBJRTY zmP=*2d`irl=11kJAN}JV76#V0pfFQMw#klFF{D|uQwdonL4Y$DO6V)$bK1B!vd9Zz zupKbnVfJlyb@~6VwD^y~BRRi4?ZC6)>XbAgnM4DlKELwowkeI$)aKN~wrdiL$MhU8q#bk5p(h${mFx68@WB$sl3dF^| z0ee|jJoYwuQqyw$q%>{)Ix0rT_^Kv}5ktex$A+oD<8fB$vrUW~ObuAKURlwquI*3L z=QjLXotLuv{%|l&$;diV?5to0l#U$ra<~@INI&ecSjVq9)oEiQIYwwAX@JB%D~fASlisaFG6HsENDLk z+crI`H6f7@2)L!(*P@!vM3_`n@8kYX$nR3=V(>mbF}w0J5@;S8Xd)$5hhR) zE-a@n**UHGDXJ5{weUXXQ#|XnHG^)pcCV7r9X5(&L-zrQLdc;JNDfcN$rM*vqCPjv z$Y6|C&iHF-pD2J9Q*o3wX4q|0yt3K6?*@L)4%EssK+oIG)PXU#!a?}44IS`s$J(O> zYdUTAeT{Jx6+QY{BCGtJp%K;=i*pOdUgHIt>YIu}WM(kgoALKpkSk%~(>o#&c)lpoYBnNgbo@Eqf1Npt z?vEa0#q9cbsYk4yYHKC1=26$VftWUbhSs@3WiFPaLJo)-b6Wb^?ZxyzE*=g?8^dVY z%eDexJjd?)o?BK2ZYb3nOES3oHZ^!m&-!(rfBaMFDhc1xgJ-F5ZR=7*TA}1EjW(-V z&Z_>SPJ*bCBe&-hY3%og#HQ`wA9?w`ojUF)e|I6U69OXW05Ek`0tZaY&TPgE|Nr*! zah!RF3xfpgcCp&Fm>(1`#opo@Nndxw_zHwBn^wUODV3tW`s9OX7&dc!k2<;0=TfV; zIylmlA0MT7T5C<_5|)vaW8_Aao-i4W|ADV{bfVZr&b4DhSq?Xr;6x-NI|9Mo*e!;? z=Sc zfF{O-2qRB_Gm9n{pRmIy8}DM4uit~|Sy?B~2%ED^cQGG%4Y~FOh-bem$CjdBr_8DS z*$pxnRnsf(rlp&^T{8`=rSV#EHh}+B5hHbUq~=zVBvBtr&!!T(fqWu0P1}4M`SOQu zu_$=6CAm8ZRaB?OGCVK5aGa@>>suYA9W4dEsXoKAS|(eb;!XtqE2P#bL6MDoU9kUKufTme`5rE1)qJ(^t z>?hPEn2Q6uZF&D7I|?itPbN;*5#jyNb>T-m>a{ytsfUANetX&J%CjBnrG`wPbw3(D zsnyF4WCCLQs0`{uREz61AC`(WGCMc{vOfSGPTq$8hUpkZ!Df*Q}*vjM1`<_7Rekx&9e* z&?Y(6;nXj6XK;7N>1uhF`!1!p)D&Z@8VSiYwWIVOg|Q$>bf|f{zm^BhtE`vlVwz(t1%(gMzvJ^zA2jqB{=5Sy47+90jWkr zbWme2Yr1G^bNZ2cr}%L@TpOvOb>w2oM^RHr*={#u%CzDaM_o$75?goHVPV_FH7{)K$3AIn*<5KaX5gD90Y+60k3d)CD zeCw$7+?HIyi4ROPP;_kY@GOOFVboaZmBMBOfhL@KvD>=oh8RP2V_`p_=s=$CV5v02 z2L%D2q}<_bpaLDXtaf-!TiYKwKhiF23@G0t6G~};{S2nnELw9MO?6qEXl^I;faN~UglNj(1@?JwJ>qQG zEUhxhoOHOzLlUPyR;l&!^2+-=N5=d5D~la?Hy^RsJz^Qg%E}-q($M#WhQ1D@ z@jAiCYVsgn%{CNvj>m+4Q`Dp1AQztoP)lbCM|L(!YvZy;Ao&h3~8BY(~Yy%v-tUA8rmZRB=%MlQ|Euy@#$Oh@%1dv;lp zBZ^vsv8B+ebk%E<@o!C?=xHi)f7OJ^96=b^%gI2cgiGVo73&`V#$Y(c8ge?EVcEDa zGI4?l!HcNdv?U>>6q-G10?wk6!+tlY6$nUhN_=I?q%0lOXzeB z&<$GXWA~N$+Olq3up2~!4E%*;eisMDb$Ki`2cs$&b5%WkRxATU%}7?l$OBJwG2HMf7`-xStuUe|7ArMe6}Z6UN^f)a zh3~`sBab`-TkDy(lp?h|m3b8Fub=VGc%E})+cox|s9XABdJ_po*V@nz<|w<;GwZA# zvgdFQMOe1MJJc{}&?)Q_wCPILCXib_E}hr;Ad}Fk6slcc={7 z1j=~ffJF(yzgVWgt=hbv3=OLBKLQ)83y$t*&E{h$Vo7=M4D_Ao!l9Z89W>6}Tdz%b zqs2AlBR%|k$~)MfZ(j$z2US{X})Quy{(`HbBXJ^zln@bC)f zM(w%Pq1&>tEh3_i&D4I4<__gm@LLKMR01_3ge^9y56G!D zMS&^=4|+W!`qL8L21rCWzm%bgoOKusIg3!0)uMnnC8`k~zwi{hTC41C-$U!2R{6bF zNyI8@J0Qe-5b@RXj3+UzOq4l;z3-36(Dqspa{=w-Ge)4%RQD1vHe0bgM4^4fOlN{r zm}xShdhS^sg8+}>gbet{r()SHH0Comt{W;O$x&DMw<)|Mik!jKlFhrV55aANv0kbv zFMd{VBII@WUadr8BH4CjITW0oRKX4tmS60`hO#(d3f^OnZ_x7}b+>y)kw&X0N1SR< z+BMz(0%2m5*HDbE}SGriWbCoji5wUJQfe)=v>X62iuw1VG*2) zo?Q+84tT^64x;#E72!?rullp||91Bv#-ESS|LrMkiS~?Tq|S05(L3wAVAf;suYmH zQ)*ea{9ZdGzNlL%(L|5Ey-@pzj@bJm*>MD=N7d}=FaJPc-vW}{{fsgD@X2-Pc?v>uIGG_tQm z(BvJH<|GOc!%%0J!P#7b&_XN`^~S-Z7CopiiJ+LrKQaNsQ-P4AEli{r_o`eBp()zc z9p$4>pjWSaVf(CANo-)?DRakQbkr%b`7e9SJNUAu?42)Jx$&TQXR$|;eYZOs5#O2c zeoV^^12)*etKi_U;v@$wjN6dPra+MIp6`aWenxzn0vj|RA`mKJkM?y7zRG5xn?7#b zi(+KZ_HT}?e;d5pXHT|QrIY=frt2~uTjIX$j#&7t8(=2g45Ub4nw2KuYzLOVucGxO z8uD!0U`h=FBG zd5;djlgV2W9D+NXB=zsFq};O(FKSeVN8? zNt9u~lX_{%$}T*F(SZE!tuBRs#Z$8sX05><(3m(`nan!9q+WY*j(oz-wVaZ=*9=Zy znrgR!A!`B%CwH822tI!lB<^ZrHt&7gHo(diq#skyzCcJJC&6PwayH<}yO7FYiAb!Y zxS0qDh}+xnpjn20>X`aClSXF(@r>CL-J=CT3=!=rjfBEp6Wl|aLY=ozq!5(kMw!jI zXh$@uRnhx;>GhJ~MtY=o#wKrr~O&IX)eCE7YAzSmf^FHB~Awlv%qZBSnmbuY8qrUqQ*vU z43XabF8|Tphu^>|eg)}LB-GC@2+F^h+DB0&?NNRjv!3IKrtiL@f_oVzf35!sSarX? zq{XRJG;`#G=h2tP%MUdX?5&Sx%yLQJKeF`9;<6HN*Em>1c=;lnZGAtWH9N$Q8xa>x6- zVe<7MiF}(dYBd!I61#DNv6r;L!)J1imH)O9U`ne5WT(|)+7hDxh!#2A7M z6pQzsEd{iOq#Djf$et7*jW~?7lz5oGko%+No>PUMVc?xk*C+0CyV;+k|7ak;?t?L$ zt^UGthO|H9aGu1V3sPA5i=~ti z-04I(Gs4hJq)>=5ldW<@E*O<}E&2POna)2lsC;Sy9f75Nw7A~bi}Z<~LIsUq^)hxL z3xPz+$~GKL?~3CN;DdT73xrN3&aYZ+Y-wsv=9FfOI+u zJFU+BV|=`B*8N#$<>`n>SAc$16H~C#+ucWMqj}8kMi~~E_iI1T#h{t^XrS#JE^{g5 zBUqW?Dkfxf9_8me1%_WHKS48AFkx8?6hI1XRt&y0eF%-6&u;m7k869zC-LxlQnDZ6 zP$~)X&>YFytBDNQNH|>+936dBV7KDY+AOJOd^1^gDE|74g?aqya%L6>B5m57dCQIq zE9r{!A(bt3#M;d|ElHZbj=MQHM%?*z&%Dnz>C;Q6YNmFs_D!|1u%jo|XLKLw!bDJo zwGsFk891UL>t7XE{$RjO3H zrq<3sopurUL!duI9ZiK@%gQ&acBg2~@2WVLIg;5zv)9MJ643FM|N6xOol+w<^_1HK z+1{38HY>3CAR+6nki<{0*!eq07-?P#R0Nw+Rqh%TrNX$cG=wQ9mGFa@vs&>sFCN${ zaP`bep5`aqN9+90cqe{(Ay#i3&(IVz&a%zq4ea?M9#TVyg$$7DIYQbu->_c z!3nM{pFptKc>EBD77&_Vk4ysv?G}rQ$tN9fnC!`G_=V8s%blRmvk1kk!Vtm*Rgdsv zfsy5X`5UX2l56g;56_(S?pgGXG&`k^<<%Z8FS5D91h5J8$c8_54S!Uzo=+#)k=;Tb zh9|_YJQZ2sj^aPSp!}Ggw|1#1V)g9X-AD$~B+_8LVR(ZyMat)2%9k3 zHMQ>CiSu<<+s~df(~SkD139Ifa|5fqOJ=WQDWK;e2$q8Fm-4}AD#2Wu=}vDP(C?9r zDrC%MnB}|#hC{2|(eC>iUM;D=n?O%NYE$`exTL99ic;&bWvL1tYPy=l)k`0+gJc4Z zNfXnc@ZC9!J0(06*(G0?Uq8WqhK;FBMr>IlS6=W<@iX1$6cPBmo=3m}EbR0XE&zit zViVqhuT3b~tV*GP)D!UZEn=DXQlQs%2XHHB7u(-2Jq`Ld6B5^di%!B8wH+uy8U$%=s2x6m9nF~Gsz0(^vp)=oN*Vh0UH7u$sijG@)VB02LuBDlC- z2gh0h-#!{#kTb(_EWld+9Iq$o@1#O@YC+VvX>R>*kfpvD!@$`=FrMByCpXz#eKD6& z@@gpL=9H3MCW-{8@r6~o%gnRwYvXAyqdPA*$1Rq}_P)?yMQCx62&Mq__0Zza7P8Q0i56mfr-#y9%2k;6)n7o%A`vi zz&C;t;Wh`INulnjaak`^7pNdwZJ_wf7d>~N^X_6@a$)NlF)+s0|+v3nK z?&c$FEKQaMsCAcThp2jF{CPz_gv1LRg}8t8!vs&4USs>K^q(J)z62l?rkUE3GTqD5Dpj# zsFDbttF&mCb~fIdLHyWVd6SP#d^an;_?5nd^hr0D3@=@dO|uk4rXdnI`Yz_CQUpNhQ`1&F`% zD^({J37tD{Lu|EmE6C4nK36!7Uu13Ob(agZ%5B*hDMvktj0D!2w*Qs{vh}HzXhk6Y zn|nZug~jr+p;eeD1yFxBMcB1qmdvd%jwFe@!`iP^<#Rt-l;|PU@(}Xm$%Xkd>dbn6H{`xpnI{)wG$L43N9ay?5Lw#uxQU3M!{buTivp1pW` za7UnM1;`IJ7;6wR3+yqaHVdX88caYFU;CqY!y>w&NWrBO#6;O|9rL;pt$JZRZj?Q7 z_Y{&<8BaKFttU2q@s13Dn`!BgctbxWFo`BXGn z@?@T86uCwpMvB51$ybC;n+M%<(m01j30Q}!#0MWBwbUtfk3eGU>#h1K;35*= z1^J%dKE=}?QBe49G>q7~shC@l-(luq9E&oz^QXVvTPW$*?|AJ2`+z9hQ{9WJkoO|0Yt<30gZgSg{KQd=h9d7|lLd5QZ%67{bOZ>f zzwbZdA^$4lSI%8Sn|!K&Bzxs%%Vjpi`dk*J2b*=&j6Wb>3RBsAKg#Yfl4-iKtzYR9 zvB6}u{;Dd>#s4kJEASc1&^Mt%Mn8|(LvluS)Wdcu(KBuk|J&JD*Zq!yeq)4sb<8)@ zgS`JUFG7=g8LF;iSyIXI)~| za4Kz=5WMNhUweHEVJ)X4#mvWuN1Ysk5X|(se0o>A=S8QG$!Uk>S$W1Wvcsh$T~K|< zyzLrtH+@NvBCdl=|EKXMD_Li;+ZbhYH^U|W(7kf3)8_+HatF-Y6$>y(uI-+PGhiW7 zb8e>!AKb?%*_{+_l(czYlI_q|!Fh)i@i%VI1b0QPPtEt~0a;B1CiDBQA=_*+Nxrx5 zW4`b5k^I{-fPDfB+GYCtkq)c>YWQhplc4Z2`Z3Gb{dG9@3%mk}AVe0lxy+*Fq^I@8K;KRQ@R42^&H@z4SZeayLd7LLFsQNW1(OA4Xsp z@BrRVv+;^las6gC#A6L1bbf>{re(*&A5ZjQp?12~c0W(dt<(UQ`JTGlb;-0A=9*ZC zTa0vlxSI(MbEG4&p((Bu6cmj+9s+$Of#E5+&LQ*S?!}7O=T`}}eY`y^w=b&m@dqh1 z9DJ)=3vENV)cb<8I$SHO3ZxjNkjARffCG;8wMHHc6`4|?K9=J(tV%^oLt-?dyR+jL zNUYub>ValSr56}`XFSZIm;&qz@Rb8YjDp;12^HU8p6q3%^-I*cpR;oMn8dNN$LOpl z5DP5kIdDpx*5jEsN)D^q$bE2VqXplr_&RiGNDdBBE=m-pRb82Iq*Vv~!x#*hxwjta zhreq3U*^HYSEFh;Spq4qyxsm4-u&WYHg})c^qiIlTAjAyI=}E)iW0X89#3>tLJ6c(C{ni(bRYL%x`0J1<`HAbjO33v+xHe^SEI(J{-;tXkTc0v|Zh@oAuQ`1?(!t z@O4_Ni4I#ex}$OBbM9U+l_w%lYAoT#ftDtb@v2lUh>ryV1G#ugoB9ldA3%5wtqh(O z^j0`PE$ZzS&z2g@hJV__210(K?;hE)a~uGcBX~QXZFFYVaaFpAQH9ibSg7RrAGH3_ z&l*X0U#R16_x0xHA;0ljqM|Id!FEe8Hp~}UfF9qVx{ZusOuR*=wzep_ zyPVYO(LO}C0as+2trTv41WW{oU=`4P&kNdBn5a*@u5>(M2?Q_96KZ=PXqB6YZW4%W zwJx_&DI{*Rm3mq~{l;1&Tnicyb6LtNBh~JW3oZnWw0T|fQeGo~&Jdi-)o2&vEuJ4% z?s8slrzDEc5^)cLI7qQKJ&zFB12HoNG%V|kxjuV~o>0k-sw+w9T@mpTaP2!&dg7yV&C6K!R9r;21nHk zMA*`yQlgxP!>T_aQ=j)h7OW3D)~PJ%0F#s+JA%6`vntt|4u_sfWu4MZ z;ksr+xUn`CJ|4AXQP^KBzv^ko!r$Hn)of3ZQMDu15r|hcQ!@8~f^kJA%DYRy$MKr5 zB^i~rjF^tJak|-Mvz<(R0d*C~Gh)V!@#fMB*0Yy6hn5d%Oriwv`XR8Su_DQ}xOATn zPZ{2oAm5wgEMvd-EV9+dLsZiwV)3|dRI zyHjJ%j00s;>##ZFSe@+ys<0($3`rB6*APM7X`JV@^&M_(ibk+)fYAKXFqFkYu1vhr z&D=dEXqG^mX3R@Tg!3;)OGhAxEJ$wFKOq(cY}@>U3ts8iynEaY6X)6^(c^T_%&`>k zu#7{Gk2>r=+CEetrdv`=SSt@6EZ=Uo^w&w}KefHNKUzgPKi1dTTg z4Q0!O604<3BEEK3E_^0AeDw<=WmCYrv~`+vcl>KgDXL(>K7ohR@Ni_4FFlUPQ7o!; zb&eMa+rzUB!C5X~wr?&;Npma$gJjT~nA>SxDTW$|w0-I6bU+11)HK%wL4haKgi-#M z0vpZr5H-Bn?|af67~zl~kv8sikQC9;Lk-Y56bBVvc4(w;iQ&&#fnLyBaqvhP0mHBh z#V197ePuq3LH(yfK$aq8rj!r<{*>T^5=+eHDk<1C5rTqMb7nt{aKz2%a+5H`qq0J% zrvI8I%~tT^XV{ct2~fiBLL;xFwMhK51Lh{B=uv! zFrcj&{)7?m$QG(8U0$W_wLw-l3Z9R8T`1y@2@N{Zf#x6yH+ZP>BGpD<53sH7{8;R^ zTPiBPC~Fp596xBY5KoFF=8a8c657@}(jzQz0l#?JgsLn=;km819|Rn${rP{&!91x@ zG$nUOuZxtBTtz&g(-37E07OU3TZQ-{k7}K!G=PqB;p!{g!Xzn8waS3Dzs_LMPK#*ij*+k%toU_+8ncC>#o1N;~`tiA>(paE=6(Ck?@Te{I@*co4IyD zgA`cZi<6ak6vNN<7w3xDM$Y^ft5V%u7z zIoiVj8Tx%{*;WhjZ`~17!i6xrtxP+%TsMb9g19ylFbsLa(}2oS_GKr)+hDo%3=_@` zZ8q?a{nQ!j#bdI$!{#$-_CAtp_*Y zza=|oKH@kY7h}$0PYh$4hU|KDA*zxj1dZ~tpBA-hO46GIHyB?{t+;jFzt95bx zuU&VMv}EyoLOiR9WMc$kJdnpg1eRs@*{|9Ou~r7mJoIChkLM@zNGrn#4w(TrKrU-n z1<|iUnK01Buq~)!^&$NGxC7QtJIv3;9*p@N;sP6uZgVwDDA%w|Olkh0bB@ud*$8E+ zLs2_-dhg^DpMhEX>1!kz*|s-KJjpM;dVl{d4IIUm3ZNbX<0jl%H3K0u0S4%a_9tl3 z-?Zkn_H`!qf)F)w;i@eQA=XT2w>#~Q%ccRY#b3ryk`swgSz~_%OdU@r7{oef52oxx zQL*&pF}7Osb=wa4AXplQ3+(jC$movWqqz*jS(%~JQN=c61h9WGs#a}jTCk*lvp!9$ zPOYi3Grmo-GAVBS5k`<=lD$m(p_SykM1j|YPMrcl-Y249d^$r$qBx6*g0bah$z zbL7NfP^WXP-4*F}PH;80K?faGtP(J7UO;ZH>v3HZjIqQy5rM~^VQVE6_?qMghP%h- z`}OFOSP=e53UL-gX}r*u7#Nf{MbkRzSi<4|tU~*pmHL9c^Z4_=bV9udg)Px%?jX<& z2Qu2vz5TVR!^>B%JKf=)o$D_-WK(YVxg2tTRBr^OCYA||Ot$-*C;H2hBeJPaZ}6%X z%!3JByQ0;usJ+tVmrW{|bi5a>BO|N^8%=sqSr#TPG{<8Qj{Bv_Nh2(HFCy( zC2kH`ok?>IEtfp^!a7eBf*5&0xexQ&1sa_En7r2EIuw2(hY6q_bwlqaxulI$E#JVT z(5&pZU3^ebp;wrxpe^841QdESkub@vv?|&s7DZ{PuOT+$2C*}OE-RxQ{b?}*bEmK>eQ;%#!EsZ!1pOUGEZ%%7nJs#%8(=-b zEUZ&fzjs}a_*)=BIhX~?3M7*Y^JRXXxH3d#J?*HzXbeBuvgq6fLd3J#gxle#)$nq8 zI-XS0DZl)?h}1yiMs_w6^3vMRjw7$W*aI1j&e>{Bn$8+`I|GseWTj=tNMS zc9|Kt|0#FtxMEBV+qHq}-&)HaBoabVK!GZ#84A5zBk`o7FLvrFFoFhIM{FV}K$n-g zPl@3%DsG}PPxzg=r-rZMDj5N0QZ3=VR;8`2ysjZMgSlelUPGQ?(Fw*o{ip7y90rRk zg*aMiSKPm4!I4vU=M$N5(+ww5go*isDoh}k(g3te>RjfxxQ9tM-$mmGU+9RITF{4* z4SfA>l9&bU*E&l}n&G z(&1POjCvmT*=tl^yJ|nb9bM60D50DPp`;+&Y@*?quk5A9=uH^E-WhQ-)~EE`-OWRF-RQOY*_OH;4{IsM>Xn%%!b3$G2c=dCe8CP^P_L{`4vPkRb)+6DD6H!Dx2>axkQgv2efl_OTXa%E!3*qghG|x`s$!+= zRl~}qw0Tv+edU6)J3nLXrnI5pDEos-FOmc)z8Vk-^>J1ltC5Ri@+vSPA-Sh+mW-^i zl(GDZzFO^QzU?=WiNy{d)(WA6WaLT?gZsg2;T*u=l2>uaQq_2G$=Zr#GT^U&Vhfk< z1vTp}chQQg-MemrVN#H9hCp}>EUOuo(X`IsDz-fC!)1d=x!o;1L!@Ic zcK3c?6ID~+EmmV1+{H>BM;drwmX@bc(X{f*V`2UbQ0OM}uJn?ou+G7X{h%bLx^}>X zpg^n4VYR8yt5n}(!bnj31R4%5yZ_hh1G9yAzv6tu7_J~~Uz$cF>=MPI49tQnS(p_6 z`R=u#lMijTV4nf6J1q~O9iAfn_{>-*(hBvRJzeH)3$~xii)h-UE^!%BSH)_^udwRQfkZFJFe3pAb>RZ^6`PoV zI*cC_Te2xkB!hg3JY2~i9cU|Qxmao&8(LQ~Rjp76ERFq$W#hTOxRWMnv@wkDe-%#8 zLpmsk$bq#F7%{~KXE7@dg7i77%cV-gib2T6JGH!o-Xotr<|N@Ja=uhnu-EN&);@Iv z{&m~*tb3{Lt#6W?`_zAW@Xf63t$tTP62pQZ4}KeQQD>N4?n3|on?RCBI0Q_%2M_L04Jh9$)oeR*Nq@q<&z~Oil*ad z>MK(+MZms)7EtTIXg{e@cLQk~N8~6|1I>RYf7`i&Ln!`4FJD?P$gv?Y3Bp9MkS4No z2R=|_Bg)*%O}^Of)oEMer!L)-642%F8$F1fLo{}t#bfOk}sEP!%ny8 z@mxTs$Jk5MCwy?acN%S`BYXNU05L$$zxX*i{?Nmk=Y`q1z1VD6x#la~r>%9zyYB;f zO{zY&p?CqnUcOq6AU6YiuWOpqiQLc@zITFbQjShBQ!8>vJ!+60G;st^as&O~&a*mo zAae?9CshWsC0Ee#>X$Cn_X8_H>18HA#U8G!A~bhkM$DmG4^AljSVR&|;i5Kykmgpn z7ma<@R0(aq3uzruy@ubnx^SFIa;DnNDcs22OEEOA8W;WUU0%d7)l-SvtZ#x60L_Yess*j2v^Cmo3eC&k=PNBY$ zmwhpF9$7OlHwMf{mk*iGdvS;aj43RmUq4aOfE=@Zs7h2D^Db7W@EP*75yLs-c+YV0 zGxd2s!<2og=mS6?vQ!5Sxl?3hF*_w}sp%5b5st0tV_@&PihG-TiIYX;<%>c!LmIkJ z4_!$`dM4Mob9LZ%fE4^|S+~Xw%NS@#6N~02R}zt&qQU_Qp-DqifOCEEEs8C$;1K4D z2|zBTL@1bxp)($cl*f(nwgI}8jd^L^EztR+%5-3kO0X3#oe#Q0nWd#k`$}&w{7%(5 zr9s>J3N>(Lw6hl_k*;;D%G?Fq%r4AST0LDQ`^RO%_v~N7oWsF|e29vWKhhAlPmGfVrH^$Ko6_hjL}H{>CfnQ5>@jbT-g>oj{Q5+J*;-85`*~jOKmVg z)8NJ|J;p;Nsi=SIpr9CV-SYW%(<5BU}>xTX*g5aRHYtMqCjQvd z;~D6vS6s=y#Ty{Vd;>l`oo>HE&rcU>(YqKD>sR5;bNWi=b2H5#W~nn92PwqSAKBYy zVB2x@$BbU%BXBnkw%q(!(gC=uSuIAO+X_) zgRi{+G`lQjTPH&J{$bO*qpcd6n{bnijtw0oBk4o~e03+(9hC}mi*1FtmUKocqVk+U zzie>s*64mqWa;^*nB>qA*a?ihu`Q?=0vZL8?D8#!q=MT&G+*ZE0IB<~zcbOOU&Y5= z`N_gLi&_03I_E14bA@rQg`w-Xt@5f4_I9kl?lM0EzFG7_Vo3G799(a2N7n(I1L~jd zjXVA;%ue6fWpQb8`l{HUFrBi%)LmfP+?=onvy2=cuGq%KKvhLlHg{ zW!=`z8iS?kGeb5^ArpK47N*n56z0Wg0(Pq4^Vq$YC;{(7enVZXwqwl!i-Ir`CuwTt2Fuk%-d2Ih$ zH#6A6N{%h|uiKl>Q4O~uCrt`@@$R%xePa>2PG-GUPe7X>oMZg=-LPJ4a*b- zcRW(0m}P7(YF}?HCuux+t|lbNJ{Qm~WPQo>;8;@7?5{P7#VGrvj)UWy)cMaZh-vM?qnjBkRzg2Y&30^5 z>`Ufma2=$C-MM~xIOJoJA{y-5anBONVqrfjO_6!b`glY^?a03K;IuZ=UuoSF0Kg2J z-9X>(NeEci!yX?L8sW07i6b9An2r>EBw8X@oyG%jESWf0lamMUlW9SEeTkPFviHdt z`Xe*iz{+zPKKc4NmEVP2L(i9*`XhA*)uyCdZfOj*keNuDdtJeFBtbZPPGO~s3jn5U z&4stwlbT+)0|plA0M{;L3~+=J>M$+K*6H2kyVGSfbj~)(>Jy*C3pEErCB%GqAULTAcZ%ir`!+B%xg@Gy^V z5nR(G93iIBi>&If2J?*e!Xi!B(Zy^m3Vx5kl_xm7+J4#>vEDSCBC(E3Ia)gIec{*E z4=wif8@k%PVz=j_rr86U(;&=NqEi{&d-2C`EuOE&VC&yuhH*h8=boV+5T=)Yb;)o4 zdZo>`^4?OkV#jy-L4t8+jzyplJubIgg)UzmERr23ac-F&!-=h-a9A!?o2rHe*U ztnc$rT{`JvWg8pEB zSKGjPonyDtuSI}-2+)&|!0F`rbdlA=d;w+3!uB@K{}^4P%>+lY)<@I-ukT|5xS~b$ zs$$w!tVDf2Lk{GW;29|yb7%l@WB3noz!q49(5L`#CW!Mac_-Qp2oTyKmFhL5vY}YhHv) z1SdKq38GlH#Xe8y^=&`_@ zTPA75cL?z#EmI%WnzY$ZPZR=~u zZAhmp?V#JC@_1^;3B8xeP!$FI@TQ~plHfKhNpzo@&o>^eYWcBFZBNv3&-quME&|67 zlD3WosX5!^C@Q~QSk*(AE4jCpnJ)z!k|T)_uP>C;yFESvn5^cL!pCYadBq9cS=S8( zf$=U6nB+O9kz>H;^CdrpY9A_bm@)Lcmxp;<4wAGn(Jf6O+zR}_^(d&vl)Ny8NSIv; zzSZYLQlq3$9lB=hJdj+c-YY*^75utD#2_IQJX&L~EgEu!Q{?`}^SdM=tZ(R#kGuhcQecMdaST>-lX57m=ni}<_tkU_ z(S(i0smbnLrwEE840`U~lqFSo_&hc3}*Ili~MsqdI%bJ?hP{-#+o%R&? zR}2YE&#P6ByFQTbZs!YB3lZO-v$41-#guW1j;Yol&w{)O%B86^j4)M>PC?=c+fKHV zbt7?a@aWTg$9|c5CFXkSc(b&uVNgQsFb*GSu?;9xV4G5y%IVg27~belX%Z6 zhe}nbVq93xd()}Fk#lL_&Nl%Sm-fMI^+?(ERUFHK+BGABpy`obUU?tv zgKK=QZWXn7pccCH!a9B3bPTDu06Tcvja==HIO3x@4CxB93ZEetG3;+zGaOVQGTb~< z;5GsJ(Mo2=LiEM(ka?Tjc`ut+`uHj_a{xI=rajL}!n#hRrA^rq@M1yOr6$1-v$p{B zsxIf%Gcl#OrHrdsSsAGHPtZne?z1-}q2P8McG~T_;J)#w;jLLW0BT}ekJjyq%%w`l zG*J5Z6;=pa;6Fcf(d zHBy9R%E%8HS(Pi8ra*3M$k<^XlznC{C;w0=F{vzg9+DXN>g({w2 zfj84Yar=8B2I<4PtkPz-1YJ3GD?Fd#wn$#-#y6u@?PM_U?lLl<$Qv-z#9Q{h2@)t5 zDaP##a95c8z}m6dA_g|)gZK4a)cDDb4Q4d_VPr1x2iZ_&R#!1^e(EB3j$423c^N$x<6WOx;9@;iYAF5h5lq2}v02BqQ}>lr$?MJK`vQDLba->SS~% zt+V&-ILOJXQutO`Xav&S9aCtgCrgJ1GeiDAG#vA4`x37Ck(0zV$Kig zN$BXD=nupUAC{)%ndBUxlt$fw9p0SZRsiJ{&ENrD*IfowE+hGe0W#v+^6>XH zW{5gc(^CiTFx3@^f-l~~6$bYR7snNNAzr;@#@vt(q^^R4ERR(=+%joPV6)oc6MQix zs}FPFBSK1ZDvgs9Rr}oXcgVyR_ zU82wPa2hJjH^S^kK-}~!us;iJg;W=%RGFe0Ao>h^NXA7mI)VC;U2EVhgZj|vo&Voj z7G1d;9h;YFTDDWOpV4RvVV#yRo@ax4qGd`3+1XE*gF{Ixd1vD5;-^m{_cRokKmkt~ z{l0B+N9&#asN@%~W+|)>l=R#|jNa2W#XZ3`@Olh%F7DJvLn-NHJ=F@zPH{b3#lRFG zr=E}^3j15u?hRCf)Ucp7a+x>n0=u5WBW5fucd&|sR%H%|^24XUcxH-X-;&e=5X*%A z2JIO(2+%#ES5OB4;P%0onuw1Wj8)62V$rb0nyvZodZUxPfJ|cwD~s5wA)$}g7>Tl% z9o!HUnsFTfJ~6zMRtDWLTHhT@ z3z<}?X;>9BG+i2x^dSJzhva_L^&Z&xK3r>N4zu06g@0a)^k=b`^p*!!1j2hez08_E zyc7d-!yXNd{ZK;GTa!<7Ha`xQf(Z_8>v1!7B1lOT~gLK&3YZ77E<^(7WmH^9&(BNwHx_qH94 zpL$aWau#B8-l*Jw#%obe1)}eUEhm@LQ@sV~>cs7yW6u|t0e_RoqUXQZRf2uVMvCj8 z%`Sgz9n-~B?;^=lVKF{=Um!E*s;ZPWT~$~PQ(yOSwr9za?bS2D{>1(^2Z~3B1D(%i zwGHL^40@Vl27-FN6*6i{f`&#^V&dwyA8Rs*wzyjSHh_RJHKyWW4&VyjLV)faRO*z6 zm7b=3(B0^9&V`(g4o%#~&8I|mXwe;{*}_&z=pBvm57osj+EO%qLQx1)qw(+)7kS|+ zPVYAYh1J1uDCt1CAJlh;S|CB{YLhikOH^QXc(hGvjGLPb)myk0{~N;S8mZdmXy;gV zkr=XO4Duoi(>3Ke1j|uE5<6;ScCl@=s(UzP;JcntR-DNe%)>btevIxSUP!KX7_$5W z;X#M9`B!FNIrJ#Y4E;p(CJmaJq_qyf#95nk5uh2sWh$#uDeQ?UeiivTKFEE9WJ4iB zRO6RD{yp1#wJTfAVu1SLn5qgC)f5@xn$o49na|IiM+VV}1)Z|LekEMg!_y1iqFED) zO%6jQqZwMciDJ@7e-2XI2|Y(BWpHJH8u1YVh_)$+f~OK0nJYFTP45H$zmDOmK%|vem$ibq^=>oK zJb5a2iKBz~-pA0_2m9jetw7h!dMIo4UG$fi{8%9-z~*v@C8JF#dd~?%)q#S;-3@j! zzqULrn-K!mpJHVWk|L}_dIQL9Hj24ot_J!ni}sdwH|&&mJ@@u%jxfepQ((yw1`wA4 z;Icj5IK)h{iNMV_``&~F;LUB^*X&A#qHpKq%Aw}0n10a>YUMR|R9EW-3SB~RrQx}Y z21M1$Qsa|SOt#Nfb#Xt!+Z$0SHv4_yUfiD+2EoiGEzmQ=0)_G>lx{okp`}Ea;d^y) z0OdxG!xqgqrm^)T{300sCdn#Onu3UlST#2~Z+0ZG&!MXE-n1QDUp@CPyEVP z8E@ewl;xcHQt#LR7Ov8WK9f2&82$+jrd~?Tm~D>~-`;(Eq}V`ipqj7pH74B+x-33UrtuF52xQ>P5L^}gIe5*pmynRQYtdQ!O_fufxn3sDtO{Za@p7+mLXQg^uts*q%$rz1y$ z4U(UJUCwx)N4uXpGc=V>6AscW)W6QERjQx8h@LyU6PlUP{Y`Ulhn05FO?jkmP_{z)wW=+T$lE%W4ph$%ll_a2V)Fa}5 z1Ge1X9^aFiC1~rNucr%jRAWCZoZ)^&xG@YLWBOqYFFp@~zado;#ljO5SdYW>=I#=a;;ITaLVI+i*TxUD( zo9n4T{qyg-SYktM-f~mrg30Lg!#!kBd0Sh++*7hS-UE^4t?;wV#lik_v z%ZA8#Mf!h2R;=FL|CjNRnhfK_oSO8Ud;){u`|H$8;K+)EJ?#9S zO(i-&3{&ra=7Oxz+KRiCDrZEU-b{jcnRY3dE~zX+j;jJ&3=-e<$};3k3WCPhYTTm$ zv9PXNo&)N9JH$v|rBuXc@17I*%7ICVWBlhAqz?U8;JYc8_i0uL4&Z`rJX5s!Bhdcq zo~`?^oYAnRda%^)Egoc@iBS>;{AQ0qRdif=4P2I)gdn5S8V9gPAYIRAR{uA!V=0Nh z%?yB;DJ9@RLl}qd1GWvA7MIu>UDu9SdnjFX??|f*D34Jh7|tCrZDvn;h*8F$u{?~x zj7X(wN%QK9DZCOH!NvQXNR&qACiaB<~`RBA6{}hoK!F?ak5nGmgb8SBfV-F&l%lAB8by*O*vR1{;?gPM7|WT zOEBwXTjmtl3-f{_r#!|#D-F==79oRYPTM(tbM@8TbPNzjj}RHxOn2fNcG?|o%`qL| zM|@p?$&=JD$rtpyftn7L1*ColXp!>D#Bnjg@iyB!hln>6Uc|qQL6_{@__GFY)tSnp zcB(Os3eBZu3XBVHKAO%;Mb<0~`jLZEUMO7Wkb4P})_^-WFgBM}df>BCCrLtzX`9e@?rmhUyt}&70P)?Sa@&&g)J@mG$~k$ zb0<|dr#HNc2JC5gSHiz=k1GXyasR6xPB_A0I)IASI69mI;-D(xn439sUIQ+eosx72*JEMPV2q z{pm=&*;%∋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

^LnzuIuT)3P32$gtXVi}LSu1`b( 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%0D$?m}XUfPb0$+gp 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 { - EventTarget: typeof EventTarget; -} -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console) */ -interface Console { - "assert"(condition?: boolean, ...data: any[]): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/clear_static) */ - clear(): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/count_static) */ - count(label?: string): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/countreset_static) */ - countReset(label?: string): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/debug_static) */ - debug(...data: any[]): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/dir_static) */ - dir(item?: any, options?: any): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/dirxml_static) */ - dirxml(...data: any[]): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/error_static) */ - error(...data: any[]): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/group_static) */ - group(...data: any[]): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/groupcollapsed_static) */ - groupCollapsed(...data: any[]): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/groupend_static) */ - groupEnd(): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/info_static) */ - info(...data: any[]): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/log_static) */ - log(...data: any[]): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/table_static) */ - table(tabularData?: any, properties?: string[]): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/time_static) */ - time(label?: string): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/timeend_static) */ - timeEnd(label?: string): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/timelog_static) */ - timeLog(label?: string, ...data: any[]): void; - timeStamp(label?: string): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/trace_static) */ - trace(...data: any[]): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/warn_static) */ - warn(...data: any[]): void; -} -declare const console: Console; -type BufferSource = ArrayBufferView | ArrayBuffer; -type TypedArray = - | Int8Array - | Uint8Array - | Uint8ClampedArray - | Int16Array - | Uint16Array - | Int32Array - | Uint32Array - | Float32Array - | Float64Array - | BigInt64Array - | BigUint64Array; -declare namespace WebAssembly { - class CompileError extends Error { - constructor(message?: string); - } - class RuntimeError extends Error { - constructor(message?: string); - } - type ValueType = "anyfunc" | "externref" | "f32" | "f64" | "i32" | "i64" | "v128"; - interface GlobalDescriptor { - value: ValueType; - mutable?: boolean; - } - class Global { - constructor(descriptor: GlobalDescriptor, value?: any); - value: any; - valueOf(): any; - } - type ImportValue = ExportValue | number; - type ModuleImports = Record; - type Imports = Record; - type ExportValue = Function | Global | Memory | Table; - type Exports = Record; - class Instance { - constructor(module: Module, imports?: Imports); - readonly exports: Exports; - } - interface MemoryDescriptor { - initial: number; - maximum?: number; - shared?: boolean; - } - class Memory { - constructor(descriptor: MemoryDescriptor); - readonly buffer: ArrayBuffer; - grow(delta: number): number; - } - type ImportExportKind = "function" | "global" | "memory" | "table"; - interface ModuleExportDescriptor { - kind: ImportExportKind; - name: string; - } - interface ModuleImportDescriptor { - kind: ImportExportKind; - module: string; - name: string; - } - abstract class Module { - static customSections(module: Module, sectionName: string): ArrayBuffer[]; - static exports(module: Module): ModuleExportDescriptor[]; - static imports(module: Module): ModuleImportDescriptor[]; - } - type TableKind = "anyfunc" | "externref"; - interface TableDescriptor { - element: TableKind; - initial: number; - maximum?: number; - } - class Table { - constructor(descriptor: TableDescriptor, value?: any); - readonly length: number; - get(index: number): any; - grow(delta: number, value?: any): number; - set(index: number, value?: any): void; - } - function instantiate(module: Module, imports?: Imports): Promise; - function validate(bytes: BufferSource): boolean; -} -/** - * This ServiceWorker API interface represents the global execution context of a service worker. - * Available only in secure contexts. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ServiceWorkerGlobalScope) - */ -interface ServiceWorkerGlobalScope extends WorkerGlobalScope { - DOMException: typeof DOMException; - WorkerGlobalScope: typeof WorkerGlobalScope; - btoa(data: string): string; - atob(data: string): string; - setTimeout(callback: (...args: any[]) => void, msDelay?: number): number; - setTimeout(callback: (...args: Args) => void, msDelay?: number, ...args: Args): number; - clearTimeout(timeoutId: number | null): void; - setInterval(callback: (...args: any[]) => void, msDelay?: number): number; - setInterval(callback: (...args: Args) => void, msDelay?: number, ...args: Args): number; - clearInterval(timeoutId: number | null): void; - queueMicrotask(task: Function): void; - structuredClone(value: T, options?: StructuredSerializeOptions): T; - reportError(error: any): void; - fetch(input: RequestInfo | URL, init?: RequestInit): Promise; - self: ServiceWorkerGlobalScope; - crypto: Crypto; - caches: CacheStorage; - scheduler: Scheduler; - performance: Performance; - Cloudflare: Cloudflare; - readonly origin: string; - Event: typeof Event; - ExtendableEvent: typeof ExtendableEvent; - CustomEvent: typeof CustomEvent; - PromiseRejectionEvent: typeof PromiseRejectionEvent; - FetchEvent: typeof FetchEvent; - TailEvent: typeof TailEvent; - TraceEvent: typeof TailEvent; - ScheduledEvent: typeof ScheduledEvent; - MessageEvent: typeof MessageEvent; - CloseEvent: typeof CloseEvent; - ReadableStreamDefaultReader: typeof ReadableStreamDefaultReader; - ReadableStreamBYOBReader: typeof ReadableStreamBYOBReader; - ReadableStream: typeof ReadableStream; - WritableStream: typeof WritableStream; - WritableStreamDefaultWriter: typeof WritableStreamDefaultWriter; - TransformStream: typeof TransformStream; - ByteLengthQueuingStrategy: typeof ByteLengthQueuingStrategy; - CountQueuingStrategy: typeof CountQueuingStrategy; - ErrorEvent: typeof ErrorEvent; - EventSource: typeof EventSource; - ReadableStreamBYOBRequest: typeof ReadableStreamBYOBRequest; - ReadableStreamDefaultController: typeof ReadableStreamDefaultController; - ReadableByteStreamController: typeof ReadableByteStreamController; - WritableStreamDefaultController: typeof WritableStreamDefaultController; - TransformStreamDefaultController: typeof TransformStreamDefaultController; - CompressionStream: typeof CompressionStream; - DecompressionStream: typeof DecompressionStream; - TextEncoderStream: typeof TextEncoderStream; - TextDecoderStream: typeof TextDecoderStream; - Headers: typeof Headers; - Body: typeof Body; - Request: typeof Request; - Response: typeof Response; - WebSocket: typeof WebSocket; - WebSocketPair: typeof WebSocketPair; - WebSocketRequestResponsePair: typeof WebSocketRequestResponsePair; - AbortController: typeof AbortController; - AbortSignal: typeof AbortSignal; - TextDecoder: typeof TextDecoder; - TextEncoder: typeof TextEncoder; - navigator: Navigator; - Navigator: typeof Navigator; - URL: typeof URL; - URLSearchParams: typeof URLSearchParams; - URLPattern: typeof URLPattern; - Blob: typeof Blob; - File: typeof File; - FormData: typeof FormData; - Crypto: typeof Crypto; - SubtleCrypto: typeof SubtleCrypto; - CryptoKey: typeof CryptoKey; - CacheStorage: typeof CacheStorage; - Cache: typeof Cache; - FixedLengthStream: typeof FixedLengthStream; - IdentityTransformStream: typeof IdentityTransformStream; - HTMLRewriter: typeof HTMLRewriter; -} -declare function addEventListener( - type: Type, - handler: EventListenerOrEventListenerObject, - options?: EventTargetAddEventListenerOptions | boolean -): void; -declare function removeEventListener( - type: Type, - handler: EventListenerOrEventListenerObject, - options?: EventTargetEventListenerOptions | boolean -): void; -/** - * Dispatches a synthetic event event to target and returns true if either event's cancelable attribute value is false or its preventDefault() method was not invoked, and false otherwise. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent) - */ -declare function dispatchEvent(event: WorkerGlobalScopeEventMap[keyof WorkerGlobalScopeEventMap]): boolean; -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/btoa) */ -declare function btoa(data: string): string; -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/atob) */ -declare function atob(data: string): string; -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/setTimeout) */ -declare function setTimeout(callback: (...args: any[]) => void, msDelay?: number): number; -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/setTimeout) */ -declare function setTimeout( - callback: (...args: Args) => void, - msDelay?: number, - ...args: Args -): number; -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/clearTimeout) */ -declare function clearTimeout(timeoutId: number | null): void; -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/setInterval) */ -declare function setInterval(callback: (...args: any[]) => void, msDelay?: number): number; -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/setInterval) */ -declare function setInterval( - callback: (...args: Args) => void, - msDelay?: number, - ...args: Args -): number; -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/clearInterval) */ -declare function clearInterval(timeoutId: number | null): void; -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/queueMicrotask) */ -declare function queueMicrotask(task: Function): void; -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/structuredClone) */ -declare function structuredClone(value: T, options?: StructuredSerializeOptions): T; -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/reportError) */ -declare function reportError(error: any): void; -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/fetch) */ -declare function fetch( - input: RequestInfo | URL, - init?: RequestInit -): Promise; -declare const self: ServiceWorkerGlobalScope; -/** - * The Web Crypto API provides a set of low-level functions for common cryptographic tasks. - * The Workers runtime implements the full surface of this API, but with some differences in - * the [supported algorithms](https://developers.cloudflare.com/workers/runtime-apis/web-crypto/#supported-algorithms) - * compared to those implemented in most browsers. - * - * [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/web-crypto/) - */ -declare const crypto: Crypto; -/** - * The Cache API allows fine grained control of reading and writing from the Cloudflare global network cache. - * - * [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/) - */ -declare const caches: CacheStorage; -declare const scheduler: Scheduler; -/** - * The Workers runtime supports a subset of the Performance API, used to measure timing and performance, - * as well as timing of subrequests and other operations. - * - * [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/performance/) - */ -declare const performance: Performance; -declare const Cloudflare: Cloudflare; -declare const origin: string; -declare const navigator: Navigator; -interface TestController {} -interface ExecutionContext { - waitUntil(promise: Promise): void; - passThroughOnException(): void; - props: any; -} -type ExportedHandlerFetchHandler = ( - request: Request>, - env: Env, - ctx: ExecutionContext -) => Response | Promise; -type ExportedHandlerTailHandler = ( - events: TraceItem[], - env: Env, - ctx: ExecutionContext -) => void | Promise; -type ExportedHandlerTraceHandler = ( - traces: TraceItem[], - env: Env, - ctx: ExecutionContext -) => void | Promise; -type ExportedHandlerTailStreamHandler = ( - event: TailStream.TailEvent, - env: Env, - ctx: ExecutionContext -) => TailStream.TailEventHandlerType | Promise; -type ExportedHandlerScheduledHandler = ( - controller: ScheduledController, - env: Env, - ctx: ExecutionContext -) => void | Promise; -type ExportedHandlerQueueHandler = ( - batch: MessageBatch, - env: Env, - ctx: ExecutionContext -) => void | Promise; -type ExportedHandlerTestHandler = ( - controller: TestController, - env: Env, - ctx: ExecutionContext -) => void | Promise; -interface ExportedHandler { - fetch?: ExportedHandlerFetchHandler; - tail?: ExportedHandlerTailHandler; - trace?: ExportedHandlerTraceHandler; - tailStream?: ExportedHandlerTailStreamHandler; - scheduled?: ExportedHandlerScheduledHandler; - test?: ExportedHandlerTestHandler; - email?: EmailExportedHandler; - queue?: ExportedHandlerQueueHandler; -} -interface StructuredSerializeOptions { - transfer?: any[]; -} -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/PromiseRejectionEvent) */ -declare abstract class PromiseRejectionEvent extends Event { - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/PromiseRejectionEvent/promise) */ - readonly promise: Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/PromiseRejectionEvent/reason) */ - readonly reason: any; -} -declare abstract class Navigator { - sendBeacon( - url: string, - body?: - | ReadableStream - | string - | (ArrayBuffer | ArrayBufferView) - | Blob - | FormData - | URLSearchParams - | URLSearchParams - ): boolean; - readonly userAgent: string; - readonly hardwareConcurrency: number; -} -/** - * The Workers runtime supports a subset of the Performance API, used to measure timing and performance, - * as well as timing of subrequests and other operations. - * - * [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/performance/) - */ -interface Performance { - /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/performance/#performancetimeorigin) */ - readonly timeOrigin: number; - /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/performance/#performancenow) */ - now(): number; -} -interface AlarmInvocationInfo { - readonly isRetry: boolean; - readonly retryCount: number; -} -interface Cloudflare { - readonly compatibilityFlags: Record; -} -interface DurableObject { - fetch(request: Request): Response | Promise; - alarm?(alarmInfo?: AlarmInvocationInfo): void | Promise; - webSocketMessage?(ws: WebSocket, message: string | ArrayBuffer): void | Promise; - webSocketClose?(ws: WebSocket, code: number, reason: string, wasClean: boolean): void | Promise; - webSocketError?(ws: WebSocket, error: unknown): void | Promise; -} -type DurableObjectStub = Fetcher< - T, - "alarm" | "webSocketMessage" | "webSocketClose" | "webSocketError" -> & { - readonly id: DurableObjectId; - readonly name?: string; -}; -interface DurableObjectId { - toString(): string; - equals(other: DurableObjectId): boolean; - readonly name?: string; -} -interface DurableObjectNamespace { - newUniqueId(options?: DurableObjectNamespaceNewUniqueIdOptions): DurableObjectId; - idFromName(name: string): DurableObjectId; - idFromString(id: string): DurableObjectId; - get(id: DurableObjectId, options?: DurableObjectNamespaceGetDurableObjectOptions): DurableObjectStub; - jurisdiction(jurisdiction: DurableObjectJurisdiction): DurableObjectNamespace; -} -type DurableObjectJurisdiction = "eu" | "fedramp"; -interface DurableObjectNamespaceNewUniqueIdOptions { - jurisdiction?: DurableObjectJurisdiction; -} -type DurableObjectLocationHint = "wnam" | "enam" | "sam" | "weur" | "eeur" | "apac" | "oc" | "afr" | "me"; -interface DurableObjectNamespaceGetDurableObjectOptions { - locationHint?: DurableObjectLocationHint; -} -interface DurableObjectState { - waitUntil(promise: Promise): void; - readonly id: DurableObjectId; - readonly storage: DurableObjectStorage; - container?: Container; - blockConcurrencyWhile(callback: () => Promise): Promise; - acceptWebSocket(ws: WebSocket, tags?: string[]): void; - getWebSockets(tag?: string): WebSocket[]; - setWebSocketAutoResponse(maybeReqResp?: WebSocketRequestResponsePair): void; - getWebSocketAutoResponse(): WebSocketRequestResponsePair | null; - getWebSocketAutoResponseTimestamp(ws: WebSocket): Date | null; - setHibernatableWebSocketEventTimeout(timeoutMs?: number): void; - getHibernatableWebSocketEventTimeout(): number | null; - getTags(ws: WebSocket): string[]; - abort(reason?: string): void; -} -interface DurableObjectTransaction { - get(key: string, options?: DurableObjectGetOptions): Promise; - get(keys: string[], options?: DurableObjectGetOptions): Promise>; - list(options?: DurableObjectListOptions): Promise>; - put(key: string, value: T, options?: DurableObjectPutOptions): Promise; - put(entries: Record, options?: DurableObjectPutOptions): Promise; - delete(key: string, options?: DurableObjectPutOptions): Promise; - delete(keys: string[], options?: DurableObjectPutOptions): Promise; - rollback(): void; - getAlarm(options?: DurableObjectGetAlarmOptions): Promise; - setAlarm(scheduledTime: number | Date, options?: DurableObjectSetAlarmOptions): Promise; - deleteAlarm(options?: DurableObjectSetAlarmOptions): Promise; -} -interface DurableObjectStorage { - get(key: string, options?: DurableObjectGetOptions): Promise; - get(keys: string[], options?: DurableObjectGetOptions): Promise>; - list(options?: DurableObjectListOptions): Promise>; - put(key: string, value: T, options?: DurableObjectPutOptions): Promise; - put(entries: Record, options?: DurableObjectPutOptions): Promise; - delete(key: string, options?: DurableObjectPutOptions): Promise; - delete(keys: string[], options?: DurableObjectPutOptions): Promise; - deleteAll(options?: DurableObjectPutOptions): Promise; - transaction(closure: (txn: DurableObjectTransaction) => Promise): Promise; - getAlarm(options?: DurableObjectGetAlarmOptions): Promise; - setAlarm(scheduledTime: number | Date, options?: DurableObjectSetAlarmOptions): Promise; - deleteAlarm(options?: DurableObjectSetAlarmOptions): Promise; - sync(): Promise; - sql: SqlStorage; - transactionSync(closure: () => T): T; - getCurrentBookmark(): Promise; - getBookmarkForTime(timestamp: number | Date): Promise; - onNextSessionRestoreBookmark(bookmark: string): Promise; -} -interface DurableObjectListOptions { - start?: string; - startAfter?: string; - end?: string; - prefix?: string; - reverse?: boolean; - limit?: number; - allowConcurrency?: boolean; - noCache?: boolean; -} -interface DurableObjectGetOptions { - allowConcurrency?: boolean; - noCache?: boolean; -} -interface DurableObjectGetAlarmOptions { - allowConcurrency?: boolean; -} -interface DurableObjectPutOptions { - allowConcurrency?: boolean; - allowUnconfirmed?: boolean; - noCache?: boolean; -} -interface DurableObjectSetAlarmOptions { - allowConcurrency?: boolean; - allowUnconfirmed?: boolean; -} -declare class WebSocketRequestResponsePair { - constructor(request: string, response: string); - get request(): string; - get response(): string; -} -interface AnalyticsEngineDataset { - writeDataPoint(event?: AnalyticsEngineDataPoint): void; -} -interface AnalyticsEngineDataPoint { - indexes?: ((ArrayBuffer | string) | null)[]; - doubles?: number[]; - blobs?: ((ArrayBuffer | string) | null)[]; -} -/** - * An event which takes place in the DOM. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event) - */ -declare class Event { - constructor(type: string, init?: EventInit); - /** - * Returns the type of event, e.g. "click", "hashchange", or "submit". - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/type) - */ - get type(): string; - /** - * Returns the event's phase, which is one of NONE, CAPTURING_PHASE, AT_TARGET, and BUBBLING_PHASE. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/eventPhase) - */ - get eventPhase(): number; - /** - * Returns true or false depending on how event was initialized. True if event invokes listeners past a ShadowRoot node that is the root of its target, and false otherwise. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/composed) - */ - get composed(): boolean; - /** - * Returns true or false depending on how event was initialized. True if event goes through its target's ancestors in reverse tree order, and false otherwise. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/bubbles) - */ - get bubbles(): boolean; - /** - * Returns true or false depending on how event was initialized. Its return value does not always carry meaning, but true can indicate that part of the operation during which event was dispatched, can be canceled by invoking the preventDefault() method. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/cancelable) - */ - get cancelable(): boolean; - /** - * Returns true if preventDefault() was invoked successfully to indicate cancelation, and false otherwise. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/defaultPrevented) - */ - get defaultPrevented(): boolean; - /** - * @deprecated - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/returnValue) - */ - get returnValue(): boolean; - /** - * Returns the object whose event listener's callback is currently being invoked. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/currentTarget) - */ - get currentTarget(): EventTarget | undefined; - /** - * Returns the object to which event is dispatched (its target). - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/target) - */ - get target(): EventTarget | undefined; - /** - * @deprecated - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/srcElement) - */ - get srcElement(): EventTarget | undefined; - /** - * Returns the event's timestamp as the number of milliseconds measured relative to the time origin. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/timeStamp) - */ - get timeStamp(): number; - /** - * Returns true if event was dispatched by the user agent, and false otherwise. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/isTrusted) - */ - get isTrusted(): boolean; - /** - * @deprecated - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/cancelBubble) - */ - get cancelBubble(): boolean; - /** - * @deprecated - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/cancelBubble) - */ - set cancelBubble(value: boolean); - /** - * Invoking this method prevents event from reaching any registered event listeners after the current one finishes running and, when dispatched in a tree, also prevents event from reaching any other objects. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/stopImmediatePropagation) - */ - stopImmediatePropagation(): void; - /** - * If invoked when the cancelable attribute value is true, and while executing a listener for the event with passive set to false, signals to the operation that caused event to be dispatched that it needs to be canceled. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/preventDefault) - */ - preventDefault(): void; - /** - * When dispatched in a tree, invoking this method prevents event from reaching any objects other than the current object. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/stopPropagation) - */ - stopPropagation(): void; - /** - * Returns the invocation target objects of event's path (objects on which listeners will be invoked), except for any nodes in shadow trees of which the shadow root's mode is "closed" that are not reachable from event's currentTarget. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/composedPath) - */ - composedPath(): EventTarget[]; - static readonly NONE: number; - static readonly CAPTURING_PHASE: number; - static readonly AT_TARGET: number; - static readonly BUBBLING_PHASE: number; -} -interface EventInit { - bubbles?: boolean; - cancelable?: boolean; - composed?: boolean; -} -type EventListener = (event: EventType) => void; -interface EventListenerObject { - handleEvent(event: EventType): void; -} -type EventListenerOrEventListenerObject = - | EventListener - | EventListenerObject; -/** - * EventTarget is a DOM interface implemented by objects that can receive events and may have listeners for them. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget) - */ -declare class EventTarget = Record> { - constructor(); - /** - * Appends an event listener for events whose type attribute value is type. The callback argument sets the callback that will be invoked when the event is dispatched. - * - * The options argument sets listener-specific options. For compatibility this can be a boolean, in which case the method behaves exactly as if the value was specified as options's capture. - * - * When set to true, options's capture prevents callback from being invoked when the event's eventPhase attribute value is BUBBLING_PHASE. When false (or not present), callback will not be invoked when event's eventPhase attribute value is CAPTURING_PHASE. Either way, callback will be invoked if event's eventPhase attribute value is AT_TARGET. - * - * When set to true, options's passive indicates that the callback will not cancel the event by invoking preventDefault(). This is used to enable performance optimizations described in § 2.8 Observing event listeners. - * - * When set to true, options's once indicates that the callback will only be invoked once after which the event listener will be removed. - * - * If an AbortSignal is passed for options's signal, then the event listener will be removed when signal is aborted. - * - * The event listener is appended to target's event listener list and is not appended if it has the same type, callback, and capture. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener) - */ - addEventListener( - type: Type, - handler: EventListenerOrEventListenerObject, - options?: EventTargetAddEventListenerOptions | boolean - ): void; - /** - * Removes the event listener in target's event listener list with the same type, callback, and options. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/removeEventListener) - */ - removeEventListener( - type: Type, - handler: EventListenerOrEventListenerObject, - options?: EventTargetEventListenerOptions | boolean - ): void; - /** - * Dispatches a synthetic event event to target and returns true if either event's cancelable attribute value is false or its preventDefault() method was not invoked, and false otherwise. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent) - */ - dispatchEvent(event: EventMap[keyof EventMap]): boolean; -} -interface EventTargetEventListenerOptions { - capture?: boolean; -} -interface EventTargetAddEventListenerOptions { - capture?: boolean; - passive?: boolean; - once?: boolean; - signal?: AbortSignal; -} -interface EventTargetHandlerObject { - handleEvent: (event: Event) => any | undefined; -} -/** - * A controller object that allows you to abort one or more DOM requests as and when desired. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortController) - */ -declare class AbortController { - constructor(); - /** - * Returns the AbortSignal object associated with this object. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortController/signal) - */ - get signal(): AbortSignal; - /** - * Invoking this method will set this object's AbortSignal's aborted flag and signal to any observers that the associated activity is to be aborted. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortController/abort) - */ - abort(reason?: any): void; -} -/** - * A signal object that allows you to communicate with a DOM request (such as a Fetch) and abort it if required via an AbortController object. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal) - */ -declare abstract class AbortSignal extends EventTarget { - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/abort_static) */ - static abort(reason?: any): AbortSignal; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/timeout_static) */ - static timeout(delay: number): AbortSignal; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/any_static) */ - static any(signals: AbortSignal[]): AbortSignal; - /** - * Returns true if this AbortSignal's AbortController has signaled to abort, and false otherwise. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/aborted) - */ - get aborted(): boolean; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/reason) */ - get reason(): any; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/abort_event) */ - get onabort(): any | null; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/abort_event) */ - set onabort(value: any | null); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/throwIfAborted) */ - throwIfAborted(): void; -} -interface Scheduler { - wait(delay: number, maybeOptions?: SchedulerWaitOptions): Promise; -} -interface SchedulerWaitOptions { - signal?: AbortSignal; -} -/** - * Extends the lifetime of the install and activate events dispatched on the global scope as part of the service worker lifecycle. This ensures that any functional events (like FetchEvent) are not dispatched until it upgrades database schemas and deletes the outdated cache entries. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ExtendableEvent) - */ -declare abstract class ExtendableEvent extends Event { - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ExtendableEvent/waitUntil) */ - waitUntil(promise: Promise): void; -} -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/CustomEvent) */ -declare class CustomEvent extends Event { - constructor(type: string, init?: CustomEventCustomEventInit); - /** - * Returns any custom data event was created with. Typically used for synthetic events. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CustomEvent/detail) - */ - get detail(): T; -} -interface CustomEventCustomEventInit { - bubbles?: boolean; - cancelable?: boolean; - composed?: boolean; - detail?: any; -} -/** - * A file-like object of immutable, raw data. Blobs represent data that isn't necessarily in a JavaScript-native format. The File interface is based on Blob, inheriting blob functionality and expanding it to support files on the user's system. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob) - */ -declare class Blob { - constructor(type?: ((ArrayBuffer | ArrayBufferView) | string | Blob)[], options?: BlobOptions); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/size) */ - get size(): number; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/type) */ - get type(): string; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/slice) */ - slice(start?: number, end?: number, type?: string): Blob; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/arrayBuffer) */ - arrayBuffer(): Promise; - bytes(): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/text) */ - text(): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/stream) */ - stream(): ReadableStream; -} -interface BlobOptions { - type?: string; -} -/** - * Provides information about files and allows JavaScript in a web page to access their content. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/File) - */ -declare class File extends Blob { - constructor( - bits: ((ArrayBuffer | ArrayBufferView) | string | Blob)[] | undefined, - name: string, - options?: FileOptions - ); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/name) */ - get name(): string; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/lastModified) */ - get lastModified(): number; -} -interface FileOptions { - type?: string; - lastModified?: number; -} -/** - * The Cache API allows fine grained control of reading and writing from the Cloudflare global network cache. - * - * [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/) - */ -declare abstract class CacheStorage { - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/CacheStorage/open) */ - open(cacheName: string): Promise; - readonly default: Cache; -} -/** - * The Cache API allows fine grained control of reading and writing from the Cloudflare global network cache. - * - * [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/) - */ -declare abstract class Cache { - /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/#delete) */ - delete(request: RequestInfo | URL, options?: CacheQueryOptions): Promise; - /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/#match) */ - match(request: RequestInfo | URL, options?: CacheQueryOptions): Promise; - /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/#put) */ - put(request: RequestInfo | URL, response: Response): Promise; -} -interface CacheQueryOptions { - ignoreMethod?: boolean; -} -/** - * The Web Crypto API provides a set of low-level functions for common cryptographic tasks. - * The Workers runtime implements the full surface of this API, but with some differences in - * the [supported algorithms](https://developers.cloudflare.com/workers/runtime-apis/web-crypto/#supported-algorithms) - * compared to those implemented in most browsers. - * - * [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/web-crypto/) - */ -declare abstract class Crypto { - /** - * Available only in secure contexts. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/subtle) - */ - get subtle(): SubtleCrypto; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/getRandomValues) */ - getRandomValues< - T extends - | Int8Array - | Uint8Array - | Int16Array - | Uint16Array - | Int32Array - | Uint32Array - | BigInt64Array - | BigUint64Array, - >(buffer: T): T; - /** - * Available only in secure contexts. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/randomUUID) - */ - randomUUID(): string; - DigestStream: typeof DigestStream; -} -/** - * This Web Crypto API interface provides a number of low-level cryptographic functions. It is accessed via the Crypto.subtle properties available in a window context (via Window.crypto). - * Available only in secure contexts. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto) - */ -declare abstract class SubtleCrypto { - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/encrypt) */ - encrypt( - algorithm: string | SubtleCryptoEncryptAlgorithm, - key: CryptoKey, - plainText: ArrayBuffer | ArrayBufferView - ): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/decrypt) */ - decrypt( - algorithm: string | SubtleCryptoEncryptAlgorithm, - key: CryptoKey, - cipherText: ArrayBuffer | ArrayBufferView - ): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/sign) */ - sign( - algorithm: string | SubtleCryptoSignAlgorithm, - key: CryptoKey, - data: ArrayBuffer | ArrayBufferView - ): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/verify) */ - verify( - algorithm: string | SubtleCryptoSignAlgorithm, - key: CryptoKey, - signature: ArrayBuffer | ArrayBufferView, - data: ArrayBuffer | ArrayBufferView - ): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/digest) */ - digest( - algorithm: string | SubtleCryptoHashAlgorithm, - data: ArrayBuffer | ArrayBufferView - ): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/generateKey) */ - generateKey( - algorithm: string | SubtleCryptoGenerateKeyAlgorithm, - extractable: boolean, - keyUsages: string[] - ): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/deriveKey) */ - deriveKey( - algorithm: string | SubtleCryptoDeriveKeyAlgorithm, - baseKey: CryptoKey, - derivedKeyAlgorithm: string | SubtleCryptoImportKeyAlgorithm, - extractable: boolean, - keyUsages: string[] - ): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/deriveBits) */ - deriveBits( - algorithm: string | SubtleCryptoDeriveKeyAlgorithm, - baseKey: CryptoKey, - length?: number | null - ): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/importKey) */ - importKey( - format: string, - keyData: (ArrayBuffer | ArrayBufferView) | JsonWebKey, - algorithm: string | SubtleCryptoImportKeyAlgorithm, - extractable: boolean, - keyUsages: string[] - ): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/exportKey) */ - exportKey(format: string, key: CryptoKey): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/wrapKey) */ - wrapKey( - format: string, - key: CryptoKey, - wrappingKey: CryptoKey, - wrapAlgorithm: string | SubtleCryptoEncryptAlgorithm - ): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/unwrapKey) */ - unwrapKey( - format: string, - wrappedKey: ArrayBuffer | ArrayBufferView, - unwrappingKey: CryptoKey, - unwrapAlgorithm: string | SubtleCryptoEncryptAlgorithm, - unwrappedKeyAlgorithm: string | SubtleCryptoImportKeyAlgorithm, - extractable: boolean, - keyUsages: string[] - ): Promise; - timingSafeEqual(a: ArrayBuffer | ArrayBufferView, b: ArrayBuffer | ArrayBufferView): boolean; -} -/** - * The CryptoKey dictionary of the Web Crypto API represents a cryptographic key. - * Available only in secure contexts. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey) - */ -declare abstract class CryptoKey { - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/type) */ - readonly type: string; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/extractable) */ - readonly extractable: boolean; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/algorithm) */ - readonly algorithm: - | CryptoKeyKeyAlgorithm - | CryptoKeyAesKeyAlgorithm - | CryptoKeyHmacKeyAlgorithm - | CryptoKeyRsaKeyAlgorithm - | CryptoKeyEllipticKeyAlgorithm - | CryptoKeyArbitraryKeyAlgorithm; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/usages) */ - readonly usages: string[]; -} -interface CryptoKeyPair { - publicKey: CryptoKey; - privateKey: CryptoKey; -} -interface JsonWebKey { - kty: string; - use?: string; - key_ops?: string[]; - alg?: string; - ext?: boolean; - crv?: string; - x?: string; - y?: string; - d?: string; - n?: string; - e?: string; - p?: string; - q?: string; - dp?: string; - dq?: string; - qi?: string; - oth?: RsaOtherPrimesInfo[]; - k?: string; -} -interface RsaOtherPrimesInfo { - r?: string; - d?: string; - t?: string; -} -interface SubtleCryptoDeriveKeyAlgorithm { - name: string; - salt?: ArrayBuffer | ArrayBufferView; - iterations?: number; - hash?: string | SubtleCryptoHashAlgorithm; - $public?: CryptoKey; - info?: ArrayBuffer | ArrayBufferView; -} -interface SubtleCryptoEncryptAlgorithm { - name: string; - iv?: ArrayBuffer | ArrayBufferView; - additionalData?: ArrayBuffer | ArrayBufferView; - tagLength?: number; - counter?: ArrayBuffer | ArrayBufferView; - length?: number; - label?: ArrayBuffer | ArrayBufferView; -} -interface SubtleCryptoGenerateKeyAlgorithm { - name: string; - hash?: string | SubtleCryptoHashAlgorithm; - modulusLength?: number; - publicExponent?: ArrayBuffer | ArrayBufferView; - length?: number; - namedCurve?: string; -} -interface SubtleCryptoHashAlgorithm { - name: string; -} -interface SubtleCryptoImportKeyAlgorithm { - name: string; - hash?: string | SubtleCryptoHashAlgorithm; - length?: number; - namedCurve?: string; - compressed?: boolean; -} -interface SubtleCryptoSignAlgorithm { - name: string; - hash?: string | SubtleCryptoHashAlgorithm; - dataLength?: number; - saltLength?: number; -} -interface CryptoKeyKeyAlgorithm { - name: string; -} -interface CryptoKeyAesKeyAlgorithm { - name: string; - length: number; -} -interface CryptoKeyHmacKeyAlgorithm { - name: string; - hash: CryptoKeyKeyAlgorithm; - length: number; -} -interface CryptoKeyRsaKeyAlgorithm { - name: string; - modulusLength: number; - publicExponent: ArrayBuffer | ArrayBufferView; - hash?: CryptoKeyKeyAlgorithm; -} -interface CryptoKeyEllipticKeyAlgorithm { - name: string; - namedCurve: string; -} -interface CryptoKeyArbitraryKeyAlgorithm { - name: string; - hash?: CryptoKeyKeyAlgorithm; - namedCurve?: string; - length?: number; -} -declare class DigestStream extends WritableStream { - constructor(algorithm: string | SubtleCryptoHashAlgorithm); - readonly digest: Promise; - get bytesWritten(): number | bigint; -} -/** - * A decoder for a specific method, that is a specific character encoding, like utf-8, iso-8859-2, koi8, cp1261, gbk, etc. A decoder takes a stream of bytes as input and emits a stream of code points. For a more scalable, non-native library, see StringView – a C-like representation of strings based on typed arrays. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextDecoder) - */ -declare class TextDecoder { - constructor(label?: string, options?: TextDecoderConstructorOptions); - /** - * Returns the result of running encoding's decoder. The method can be invoked zero or more times with options's stream set to true, and then once without options's stream (or set to false), to process a fragmented input. If the invocation without options's stream (or set to false) has no input, it's clearest to omit both arguments. - * - * ``` - * var string = "", decoder = new TextDecoder(encoding), buffer; - * while(buffer = next_chunk()) { - * string += decoder.decode(buffer, {stream:true}); - * } - * string += decoder.decode(); // end-of-queue - * ``` - * - * If the error mode is "fatal" and encoding's decoder returns error, throws a TypeError. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextDecoder/decode) - */ - decode(input?: ArrayBuffer | ArrayBufferView, options?: TextDecoderDecodeOptions): string; - get encoding(): string; - get fatal(): boolean; - get ignoreBOM(): boolean; -} -/** - * TextEncoder takes a stream of code points as input and emits a stream of bytes. For a more scalable, non-native library, see StringView – a C-like representation of strings based on typed arrays. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextEncoder) - */ -declare class TextEncoder { - constructor(); - /** - * Returns the result of running UTF-8's encoder. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextEncoder/encode) - */ - encode(input?: string): Uint8Array; - /** - * Runs the UTF-8 encoder on source, stores the result of that operation into destination, and returns the progress made as an object wherein read is the number of converted code units of source and written is the number of bytes modified in destination. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextEncoder/encodeInto) - */ - encodeInto(input: string, buffer: ArrayBuffer | ArrayBufferView): TextEncoderEncodeIntoResult; - get encoding(): string; -} -interface TextDecoderConstructorOptions { - fatal: boolean; - ignoreBOM: boolean; -} -interface TextDecoderDecodeOptions { - stream: boolean; -} -interface TextEncoderEncodeIntoResult { - read: number; - written: number; -} -/** - * Events providing information related to errors in scripts or in files. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent) - */ -declare class ErrorEvent extends Event { - constructor(type: string, init?: ErrorEventErrorEventInit); - get filename(): string; - get message(): string; - get lineno(): number; - get colno(): number; - get error(): any; -} -interface ErrorEventErrorEventInit { - message?: string; - filename?: string; - lineno?: number; - colno?: number; - error?: any; -} -/** - * Provides a way to easily construct a set of key/value pairs representing form fields and their values, which can then be easily sent using the XMLHttpRequest.send() method. It uses the same format a form would use if the encoding type were set to "multipart/form-data". - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData) - */ -declare class FormData { - constructor(); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/append) */ - append(name: string, value: string): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/append) */ - append(name: string, value: Blob, filename?: string): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/delete) */ - delete(name: string): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/get) */ - get(name: string): (File | string) | null; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/getAll) */ - getAll(name: string): (File | string)[]; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/has) */ - has(name: string): boolean; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/set) */ - set(name: string, value: string): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/set) */ - set(name: string, value: Blob, filename?: string): void; - /* Returns an array of key, value pairs for every entry in the list. */ - entries(): IterableIterator<[key: string, value: File | string]>; - /* Returns a list of keys in the list. */ - keys(): IterableIterator; - /* Returns a list of values in the list. */ - values(): IterableIterator; - forEach( - callback: (this: This, value: File | string, key: string, parent: FormData) => void, - thisArg?: This - ): void; - [Symbol.iterator](): IterableIterator<[key: string, value: File | string]>; -} -interface ContentOptions { - html?: boolean; -} -declare class HTMLRewriter { - constructor(); - on(selector: string, handlers: HTMLRewriterElementContentHandlers): HTMLRewriter; - onDocument(handlers: HTMLRewriterDocumentContentHandlers): HTMLRewriter; - transform(response: Response): Response; -} -interface HTMLRewriterElementContentHandlers { - element?(element: Element): void | Promise; - comments?(comment: Comment): void | Promise; - text?(element: Text): void | Promise; -} -interface HTMLRewriterDocumentContentHandlers { - doctype?(doctype: Doctype): void | Promise; - comments?(comment: Comment): void | Promise; - text?(text: Text): void | Promise; - end?(end: DocumentEnd): void | Promise; -} -interface Doctype { - readonly name: string | null; - readonly publicId: string | null; - readonly systemId: string | null; -} -interface Element { - tagName: string; - readonly attributes: IterableIterator; - readonly removed: boolean; - readonly namespaceURI: string; - getAttribute(name: string): string | null; - hasAttribute(name: string): boolean; - setAttribute(name: string, value: string): Element; - removeAttribute(name: string): Element; - before(content: string | ReadableStream | Response, options?: ContentOptions): Element; - after(content: string | ReadableStream | Response, options?: ContentOptions): Element; - prepend(content: string | ReadableStream | Response, options?: ContentOptions): Element; - append(content: string | ReadableStream | Response, options?: ContentOptions): Element; - replace(content: string | ReadableStream | Response, options?: ContentOptions): Element; - remove(): Element; - removeAndKeepContent(): Element; - setInnerContent(content: string | ReadableStream | Response, options?: ContentOptions): Element; - onEndTag(handler: (tag: EndTag) => void | Promise): void; -} -interface EndTag { - name: string; - before(content: string | ReadableStream | Response, options?: ContentOptions): EndTag; - after(content: string | ReadableStream | Response, options?: ContentOptions): EndTag; - remove(): EndTag; -} -interface Comment { - text: string; - readonly removed: boolean; - before(content: string, options?: ContentOptions): Comment; - after(content: string, options?: ContentOptions): Comment; - replace(content: string, options?: ContentOptions): Comment; - remove(): Comment; -} -interface Text { - readonly text: string; - readonly lastInTextNode: boolean; - readonly removed: boolean; - before(content: string | ReadableStream | Response, options?: ContentOptions): Text; - after(content: string | ReadableStream | Response, options?: ContentOptions): Text; - replace(content: string | ReadableStream | Response, options?: ContentOptions): Text; - remove(): Text; -} -interface DocumentEnd { - append(content: string, options?: ContentOptions): DocumentEnd; -} -/** - * This is the event type for fetch events dispatched on the service worker global scope. It contains information about the fetch, including the request and how the receiver will treat the response. It provides the event.respondWith() method, which allows us to provide a response to this fetch. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FetchEvent) - */ -declare abstract class FetchEvent extends ExtendableEvent { - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/FetchEvent/request) */ - readonly request: Request; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/FetchEvent/respondWith) */ - respondWith(promise: Response | Promise): void; - passThroughOnException(): void; -} -type HeadersInit = Headers | Iterable> | Record; -/** - * This Fetch API interface allows you to perform various actions on HTTP request and response headers. These actions include retrieving, setting, adding to, and removing. A Headers object has an associated header list, which is initially empty and consists of zero or more name and value pairs.  You can add to this using methods like append() (see Examples.) In all methods of this interface, header names are matched by case-insensitive byte sequence. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers) - */ -declare class Headers { - constructor(init?: HeadersInit); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/get) */ - get(name: string): string | null; - getAll(name: string): string[]; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/getSetCookie) */ - getSetCookie(): string[]; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/has) */ - has(name: string): boolean; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/set) */ - set(name: string, value: string): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/append) */ - append(name: string, value: string): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/delete) */ - delete(name: string): void; - forEach( - callback: (this: This, value: string, key: string, parent: Headers) => void, - thisArg?: This - ): void; - /* Returns an iterator allowing to go through all key/value pairs contained in this object. */ - entries(): IterableIterator<[key: string, value: string]>; - /* Returns an iterator allowing to go through all keys of the key/value pairs contained in this object. */ - keys(): IterableIterator; - /* Returns an iterator allowing to go through all values of the key/value pairs contained in this object. */ - values(): IterableIterator; - [Symbol.iterator](): IterableIterator<[key: string, value: string]>; -} -type BodyInit = - | ReadableStream - | string - | ArrayBuffer - | ArrayBufferView - | Blob - | URLSearchParams - | FormData; -declare abstract class Body { - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body) */ - get body(): ReadableStream | null; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */ - get bodyUsed(): boolean; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */ - arrayBuffer(): Promise; - bytes(): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/text) */ - text(): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/json) */ - json(): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/formData) */ - formData(): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */ - blob(): Promise; -} -/** - * This Fetch API interface represents the response to a request. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response) - */ -declare var Response: { - prototype: Response; - new (body?: BodyInit | null, init?: ResponseInit): Response; - error(): Response; - redirect(url: string, status?: number): Response; - json(any: any, maybeInit?: ResponseInit | Response): Response; -}; -/** - * This Fetch API interface represents the response to a request. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response) - */ -interface Response extends Body { - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/clone) */ - clone(): Response; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/status) */ - status: number; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/statusText) */ - statusText: string; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/headers) */ - headers: Headers; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/ok) */ - ok: boolean; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/redirected) */ - redirected: boolean; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/url) */ - url: string; - webSocket: WebSocket | null; - cf: any | undefined; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/type) */ - type: "default" | "error"; -} -interface ResponseInit { - status?: number; - statusText?: string; - headers?: HeadersInit; - cf?: any; - webSocket?: WebSocket | null; - encodeBody?: "automatic" | "manual"; -} -type RequestInfo> = - | Request - | string; -/** - * This Fetch API interface represents a resource request. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request) - */ -declare var Request: { - prototype: Request; - new >( - input: RequestInfo | URL, - init?: RequestInit - ): Request; -}; -/** - * This Fetch API interface represents a resource request. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request) - */ -interface Request> extends Body { - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/clone) */ - clone(): Request; - /** - * Returns request's HTTP method, which is "GET" by default. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/method) - */ - method: string; - /** - * Returns the URL of request as a string. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/url) - */ - url: string; - /** - * Returns a Headers object consisting of the headers associated with request. Note that headers added in the network layer by the user agent will not be accounted for in this object, e.g., the "Host" header. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/headers) - */ - headers: Headers; - /** - * Returns the redirect mode associated with request, which is a string indicating how redirects for the request will be handled during fetching. A request will follow redirects by default. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/redirect) - */ - redirect: string; - fetcher: Fetcher | null; - /** - * Returns the signal associated with request, which is an AbortSignal object indicating whether or not request has been aborted, and its abort event handler. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/signal) - */ - signal: AbortSignal; - cf: Cf | undefined; - /** - * Returns request's subresource integrity metadata, which is a cryptographic hash of the resource being fetched. Its value consists of multiple hashes separated by whitespace. [SRI] - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/integrity) - */ - integrity: string; - /* Returns a boolean indicating whether or not request can outlive the global in which it was created. */ - keepalive: boolean; - /** - * Returns the cache mode associated with request, which is a string indicating how the request will interact with the browser's cache when fetching. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/cache) - */ - cache?: "no-store"; -} -interface RequestInit { - /* A string to set request's method. */ - method?: string; - /* A Headers object, an object literal, or an array of two-item arrays to set request's headers. */ - headers?: HeadersInit; - /* A BodyInit object or null to set request's body. */ - body?: BodyInit | null; - /* A string indicating whether request follows redirects, results in an error upon encountering a redirect, or returns the redirect (in an opaque fashion). Sets request's redirect. */ - redirect?: string; - fetcher?: Fetcher | null; - cf?: Cf; - /* A string indicating how the request will interact with the browser's cache to set request's cache. */ - cache?: "no-store"; - /* A cryptographic hash of the resource to be fetched by request. Sets request's integrity. */ - integrity?: string; - /* An AbortSignal to set request's signal. */ - signal?: AbortSignal | null; - encodeResponseBody?: "automatic" | "manual"; -} -type Service = Fetcher; -type Fetcher< - T extends Rpc.EntrypointBranded | undefined = undefined, - Reserved extends string = never, -> = (T extends Rpc.EntrypointBranded ? Rpc.Provider : unknown) & { - fetch(input: RequestInfo | URL, init?: RequestInit): Promise; - connect(address: SocketAddress | string, options?: SocketOptions): Socket; -}; -interface KVNamespaceListKey { - name: Key; - expiration?: number; - metadata?: Metadata; -} -type KVNamespaceListResult = - | { - list_complete: false; - keys: KVNamespaceListKey[]; - cursor: string; - cacheStatus: string | null; - } - | { - list_complete: true; - keys: KVNamespaceListKey[]; - cacheStatus: string | null; - }; -interface KVNamespace { - get(key: Key, options?: Partial>): Promise; - get(key: Key, type: "text"): Promise; - get(key: Key, type: "json"): Promise; - get(key: Key, type: "arrayBuffer"): Promise; - get(key: Key, type: "stream"): Promise; - get(key: Key, options?: KVNamespaceGetOptions<"text">): Promise; - get( - key: Key, - options?: KVNamespaceGetOptions<"json"> - ): Promise; - get(key: Key, options?: KVNamespaceGetOptions<"arrayBuffer">): Promise; - get(key: Key, options?: KVNamespaceGetOptions<"stream">): Promise; - get(key: Array, type: "text"): Promise>; - get(key: Array, type: "json"): Promise>; - get( - key: Array, - options?: Partial> - ): Promise>; - get(key: Array, options?: KVNamespaceGetOptions<"text">): Promise>; - get( - key: Array, - options?: KVNamespaceGetOptions<"json"> - ): Promise>; - list(options?: KVNamespaceListOptions): Promise>; - put( - key: Key, - value: string | ArrayBuffer | ArrayBufferView | ReadableStream, - options?: KVNamespacePutOptions - ): Promise; - getWithMetadata( - key: Key, - options?: Partial> - ): Promise>; - getWithMetadata( - key: Key, - type: "text" - ): Promise>; - getWithMetadata( - key: Key, - type: "json" - ): Promise>; - getWithMetadata( - key: Key, - type: "arrayBuffer" - ): Promise>; - getWithMetadata( - key: Key, - type: "stream" - ): Promise>; - getWithMetadata( - key: Key, - options: KVNamespaceGetOptions<"text"> - ): Promise>; - getWithMetadata( - key: Key, - options: KVNamespaceGetOptions<"json"> - ): Promise>; - getWithMetadata( - key: Key, - options: KVNamespaceGetOptions<"arrayBuffer"> - ): Promise>; - getWithMetadata( - key: Key, - options: KVNamespaceGetOptions<"stream"> - ): Promise>; - getWithMetadata( - key: Array, - type: "text" - ): Promise>>; - getWithMetadata( - key: Array, - type: "json" - ): Promise>>; - getWithMetadata( - key: Array, - options?: Partial> - ): Promise>>; - getWithMetadata( - key: Array, - options?: KVNamespaceGetOptions<"text"> - ): Promise>>; - getWithMetadata( - key: Array, - options?: KVNamespaceGetOptions<"json"> - ): Promise>>; - delete(key: Key): Promise; -} -interface KVNamespaceListOptions { - limit?: number; - prefix?: string | null; - cursor?: string | null; -} -interface KVNamespaceGetOptions { - type: Type; - cacheTtl?: number; -} -interface KVNamespacePutOptions { - expiration?: number; - expirationTtl?: number; - metadata?: any | null; -} -interface KVNamespaceGetWithMetadataResult { - value: Value | null; - metadata: Metadata | null; - cacheStatus: string | null; -} -type QueueContentType = "text" | "bytes" | "json" | "v8"; -interface Queue { - send(message: Body, options?: QueueSendOptions): Promise; - sendBatch(messages: Iterable>, options?: QueueSendBatchOptions): Promise; -} -interface QueueSendOptions { - contentType?: QueueContentType; - delaySeconds?: number; -} -interface QueueSendBatchOptions { - delaySeconds?: number; -} -interface MessageSendRequest { - body: Body; - contentType?: QueueContentType; - delaySeconds?: number; -} -interface QueueRetryOptions { - delaySeconds?: number; -} -interface Message { - readonly id: string; - readonly timestamp: Date; - readonly body: Body; - readonly attempts: number; - retry(options?: QueueRetryOptions): void; - ack(): void; -} -interface QueueEvent extends ExtendableEvent { - readonly messages: readonly Message[]; - readonly queue: string; - retryAll(options?: QueueRetryOptions): void; - ackAll(): void; -} -interface MessageBatch { - readonly messages: readonly Message[]; - readonly queue: string; - retryAll(options?: QueueRetryOptions): void; - ackAll(): void; -} -interface R2Error extends Error { - readonly name: string; - readonly code: number; - readonly message: string; - readonly action: string; - readonly stack: any; -} -interface R2ListOptions { - limit?: number; - prefix?: string; - cursor?: string; - delimiter?: string; - startAfter?: string; - include?: ("httpMetadata" | "customMetadata")[]; -} -declare abstract class R2Bucket { - head(key: string): Promise; - get( - key: string, - options: R2GetOptions & { - onlyIf: R2Conditional | Headers; - } - ): Promise; - get(key: string, options?: R2GetOptions): Promise; - put( - key: string, - value: ReadableStream | ArrayBuffer | ArrayBufferView | string | null | Blob, - options?: R2PutOptions & { - onlyIf: R2Conditional | Headers; - } - ): Promise; - put( - key: string, - value: ReadableStream | ArrayBuffer | ArrayBufferView | string | null | Blob, - options?: R2PutOptions - ): Promise; - createMultipartUpload(key: string, options?: R2MultipartOptions): Promise; - resumeMultipartUpload(key: string, uploadId: string): R2MultipartUpload; - delete(keys: string | string[]): Promise; - list(options?: R2ListOptions): Promise; -} -interface R2MultipartUpload { - readonly key: string; - readonly uploadId: string; - uploadPart( - partNumber: number, - value: ReadableStream | (ArrayBuffer | ArrayBufferView) | string | Blob, - options?: R2UploadPartOptions - ): Promise; - abort(): Promise; - complete(uploadedParts: R2UploadedPart[]): Promise; -} -interface R2UploadedPart { - partNumber: number; - etag: string; -} -declare abstract class R2Object { - readonly key: string; - readonly version: string; - readonly size: number; - readonly etag: string; - readonly httpEtag: string; - readonly checksums: R2Checksums; - readonly uploaded: Date; - readonly httpMetadata?: R2HTTPMetadata; - readonly customMetadata?: Record; - readonly range?: R2Range; - readonly storageClass: string; - readonly ssecKeyMd5?: string; - writeHttpMetadata(headers: Headers): void; -} -interface R2ObjectBody extends R2Object { - get body(): ReadableStream; - get bodyUsed(): boolean; - arrayBuffer(): Promise; - text(): Promise; - json(): Promise; - blob(): Promise; -} -type R2Range = - | { - offset: number; - length?: number; - } - | { - offset?: number; - length: number; - } - | { - suffix: number; - }; -interface R2Conditional { - etagMatches?: string; - etagDoesNotMatch?: string; - uploadedBefore?: Date; - uploadedAfter?: Date; - secondsGranularity?: boolean; -} -interface R2GetOptions { - onlyIf?: R2Conditional | Headers; - range?: R2Range | Headers; - ssecKey?: ArrayBuffer | string; -} -interface R2PutOptions { - onlyIf?: R2Conditional | Headers; - httpMetadata?: R2HTTPMetadata | Headers; - customMetadata?: Record; - md5?: ArrayBuffer | string; - sha1?: ArrayBuffer | string; - sha256?: ArrayBuffer | string; - sha384?: ArrayBuffer | string; - sha512?: ArrayBuffer | string; - storageClass?: string; - ssecKey?: ArrayBuffer | string; -} -interface R2MultipartOptions { - httpMetadata?: R2HTTPMetadata | Headers; - customMetadata?: Record; - storageClass?: string; - ssecKey?: ArrayBuffer | string; -} -interface R2Checksums { - readonly md5?: ArrayBuffer; - readonly sha1?: ArrayBuffer; - readonly sha256?: ArrayBuffer; - readonly sha384?: ArrayBuffer; - readonly sha512?: ArrayBuffer; - toJSON(): R2StringChecksums; -} -interface R2StringChecksums { - md5?: string; - sha1?: string; - sha256?: string; - sha384?: string; - sha512?: string; -} -interface R2HTTPMetadata { - contentType?: string; - contentLanguage?: string; - contentDisposition?: string; - contentEncoding?: string; - cacheControl?: string; - cacheExpiry?: Date; -} -type R2Objects = { - objects: R2Object[]; - delimitedPrefixes: string[]; -} & ( - | { - truncated: true; - cursor: string; - } - | { - truncated: false; - } -); -interface R2UploadPartOptions { - ssecKey?: ArrayBuffer | string; -} -declare abstract class ScheduledEvent extends ExtendableEvent { - readonly scheduledTime: number; - readonly cron: string; - noRetry(): void; -} -interface ScheduledController { - readonly scheduledTime: number; - readonly cron: string; - noRetry(): void; -} -interface QueuingStrategy { - highWaterMark?: number | bigint; - size?: (chunk: T) => number | bigint; -} -interface UnderlyingSink { - type?: string; - start?: (controller: WritableStreamDefaultController) => void | Promise; - write?: (chunk: W, controller: WritableStreamDefaultController) => void | Promise; - abort?: (reason: any) => void | Promise; - close?: () => void | Promise; -} -interface UnderlyingByteSource { - type: "bytes"; - autoAllocateChunkSize?: number; - start?: (controller: ReadableByteStreamController) => void | Promise; - pull?: (controller: ReadableByteStreamController) => void | Promise; - cancel?: (reason: any) => void | Promise; -} -interface UnderlyingSource { - type?: "" | undefined; - start?: (controller: ReadableStreamDefaultController) => void | Promise; - pull?: (controller: ReadableStreamDefaultController) => void | Promise; - cancel?: (reason: any) => void | Promise; - expectedLength?: number | bigint; -} -interface Transformer { - readableType?: string; - writableType?: string; - start?: (controller: TransformStreamDefaultController) => void | Promise; - transform?: (chunk: I, controller: TransformStreamDefaultController) => void | Promise; - flush?: (controller: TransformStreamDefaultController) => void | Promise; - cancel?: (reason: any) => void | Promise; - expectedLength?: number; -} -interface StreamPipeOptions { - /** - * Pipes this readable stream to a given writable stream destination. The way in which the piping process behaves under various error conditions can be customized with a number of passed options. It returns a promise that fulfills when the piping process completes successfully, or rejects if any errors were encountered. - * - * Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader. - * - * Errors and closures of the source and destination streams propagate as follows: - * - * An error in this source readable stream will abort destination, unless preventAbort is truthy. The returned promise will be rejected with the source's error, or with any error that occurs during aborting the destination. - * - * An error in destination will cancel this source readable stream, unless preventCancel is truthy. The returned promise will be rejected with the destination's error, or with any error that occurs during canceling the source. - * - * When this source readable stream closes, destination will be closed, unless preventClose is truthy. The returned promise will be fulfilled once this process completes, unless an error is encountered while closing the destination, in which case it will be rejected with that error. - * - * If destination starts out closed or closing, this source readable stream will be canceled, unless preventCancel is true. The returned promise will be rejected with an error indicating piping to a closed stream failed, or with any error that occurs during canceling the source. - * - * The signal option can be set to an AbortSignal to allow aborting an ongoing pipe operation via the corresponding AbortController. In this case, this source readable stream will be canceled, and destination aborted, unless the respective options preventCancel or preventAbort are set. - */ - preventClose?: boolean; - preventAbort?: boolean; - preventCancel?: boolean; - signal?: AbortSignal; -} -type ReadableStreamReadResult = - | { - done: false; - value: R; - } - | { - done: true; - value?: undefined; - }; -/** - * This Streams API interface represents a readable stream of byte data. The Fetch API offers a concrete instance of a ReadableStream through the body property of a Response object. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream) - */ -interface ReadableStream { - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/locked) */ - get locked(): boolean; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/cancel) */ - cancel(reason?: any): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/getReader) */ - getReader(): ReadableStreamDefaultReader; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/getReader) */ - getReader(options: ReadableStreamGetReaderOptions): ReadableStreamBYOBReader; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/pipeThrough) */ - pipeThrough(transform: ReadableWritablePair, options?: StreamPipeOptions): ReadableStream; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/pipeTo) */ - pipeTo(destination: WritableStream, options?: StreamPipeOptions): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/tee) */ - tee(): [ReadableStream, ReadableStream]; - values(options?: ReadableStreamValuesOptions): AsyncIterableIterator; - [Symbol.asyncIterator](options?: ReadableStreamValuesOptions): AsyncIterableIterator; -} -/** - * This Streams API interface represents a readable stream of byte data. The Fetch API offers a concrete instance of a ReadableStream through the body property of a Response object. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream) - */ -declare const ReadableStream: { - prototype: ReadableStream; - new ( - underlyingSource: UnderlyingByteSource, - strategy?: QueuingStrategy - ): ReadableStream; - new (underlyingSource?: UnderlyingSource, strategy?: QueuingStrategy): ReadableStream; -}; -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultReader) */ -declare class ReadableStreamDefaultReader { - constructor(stream: ReadableStream); - get closed(): Promise; - cancel(reason?: any): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultReader/read) */ - read(): Promise>; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultReader/releaseLock) */ - releaseLock(): void; -} -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBReader) */ -declare class ReadableStreamBYOBReader { - constructor(stream: ReadableStream); - get closed(): Promise; - cancel(reason?: any): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBReader/read) */ - read(view: T): Promise>; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBReader/releaseLock) */ - releaseLock(): void; - readAtLeast(minElements: number, view: T): Promise>; -} -interface ReadableStreamBYOBReaderReadableStreamBYOBReaderReadOptions { - min?: number; -} -interface ReadableStreamGetReaderOptions { - /** - * Creates a ReadableStreamBYOBReader and locks the stream to the new reader. - * - * This call behaves the same way as the no-argument variant, except that it only works on readable byte streams, i.e. streams which were constructed specifically with the ability to handle "bring your own buffer" reading. The returned BYOB reader provides the ability to directly read individual chunks from the stream via its read() method, into developer-supplied buffers, allowing more precise control over allocation. - */ - mode: "byob"; -} -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBRequest) */ -declare abstract class ReadableStreamBYOBRequest { - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBRequest/view) */ - get view(): Uint8Array | null; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBRequest/respond) */ - respond(bytesWritten: number): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBRequest/respondWithNewView) */ - respondWithNewView(view: ArrayBuffer | ArrayBufferView): void; - get atLeast(): number | null; -} -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController) */ -declare abstract class ReadableStreamDefaultController { - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController/desiredSize) */ - get desiredSize(): number | null; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController/close) */ - close(): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController/enqueue) */ - enqueue(chunk?: R): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController/error) */ - error(reason: any): void; -} -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController) */ -declare abstract class ReadableByteStreamController { - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/byobRequest) */ - get byobRequest(): ReadableStreamBYOBRequest | null; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/desiredSize) */ - get desiredSize(): number | null; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/close) */ - close(): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/enqueue) */ - enqueue(chunk: ArrayBuffer | ArrayBufferView): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/error) */ - error(reason: any): void; -} -/** - * This Streams API interface represents a controller allowing control of a WritableStream's state. When constructing a WritableStream, the underlying sink is given a corresponding WritableStreamDefaultController instance to manipulate. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultController) - */ -declare abstract class WritableStreamDefaultController { - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultController/signal) */ - get signal(): AbortSignal; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultController/error) */ - error(reason?: any): void; -} -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController) */ -declare abstract class TransformStreamDefaultController { - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController/desiredSize) */ - get desiredSize(): number | null; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController/enqueue) */ - enqueue(chunk?: O): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController/error) */ - error(reason: any): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController/terminate) */ - terminate(): void; -} -interface ReadableWritablePair { - /** - * Provides a convenient, chainable way of piping this readable stream through a transform stream (or any other { writable, readable } pair). It simply pipes the stream into the writable side of the supplied pair, and returns the readable side for further use. - * - * Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader. - */ - writable: WritableStream; - readable: ReadableStream; -} -/** - * This Streams API interface provides a standard abstraction for writing streaming data to a destination, known as a sink. This object comes with built-in backpressure and queuing. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream) - */ -declare class WritableStream { - constructor(underlyingSink?: UnderlyingSink, queuingStrategy?: QueuingStrategy); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream/locked) */ - get locked(): boolean; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream/abort) */ - abort(reason?: any): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream/close) */ - close(): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream/getWriter) */ - getWriter(): WritableStreamDefaultWriter; -} -/** - * This Streams API interface is the object returned by WritableStream.getWriter() and once created locks the < writer to the WritableStream ensuring that no other streams can write to the underlying sink. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter) - */ -declare class WritableStreamDefaultWriter { - constructor(stream: WritableStream); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/closed) */ - get closed(): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/ready) */ - get ready(): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/desiredSize) */ - get desiredSize(): number | null; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/abort) */ - abort(reason?: any): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/close) */ - close(): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/write) */ - write(chunk?: W): Promise; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/releaseLock) */ - releaseLock(): void; -} -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStream) */ -declare class TransformStream { - constructor( - transformer?: Transformer, - writableStrategy?: QueuingStrategy, - readableStrategy?: QueuingStrategy - ); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStream/readable) */ - get readable(): ReadableStream; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStream/writable) */ - get writable(): WritableStream; -} -declare class FixedLengthStream extends IdentityTransformStream { - constructor(expectedLength: number | bigint, queuingStrategy?: IdentityTransformStreamQueuingStrategy); -} -declare class IdentityTransformStream extends TransformStream { - constructor(queuingStrategy?: IdentityTransformStreamQueuingStrategy); -} -interface IdentityTransformStreamQueuingStrategy { - highWaterMark?: number | bigint; -} -interface ReadableStreamValuesOptions { - preventCancel?: boolean; -} -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/CompressionStream) */ -declare class CompressionStream extends TransformStream { - constructor(format: "gzip" | "deflate" | "deflate-raw"); -} -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/DecompressionStream) */ -declare class DecompressionStream extends TransformStream { - constructor(format: "gzip" | "deflate" | "deflate-raw"); -} -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextEncoderStream) */ -declare class TextEncoderStream extends TransformStream { - constructor(); - get encoding(): string; -} -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextDecoderStream) */ -declare class TextDecoderStream extends TransformStream { - constructor(label?: string, options?: TextDecoderStreamTextDecoderStreamInit); - get encoding(): string; - get fatal(): boolean; - get ignoreBOM(): boolean; -} -interface TextDecoderStreamTextDecoderStreamInit { - fatal?: boolean; - ignoreBOM?: boolean; -} -/** - * This Streams API interface provides a built-in byte length queuing strategy that can be used when constructing streams. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ByteLengthQueuingStrategy) - */ -declare class ByteLengthQueuingStrategy implements QueuingStrategy { - constructor(init: QueuingStrategyInit); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ByteLengthQueuingStrategy/highWaterMark) */ - get highWaterMark(): number; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ByteLengthQueuingStrategy/size) */ - get size(): (chunk?: any) => number; -} -/** - * This Streams API interface provides a built-in byte length queuing strategy that can be used when constructing streams. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CountQueuingStrategy) - */ -declare class CountQueuingStrategy implements QueuingStrategy { - constructor(init: QueuingStrategyInit); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/CountQueuingStrategy/highWaterMark) */ - get highWaterMark(): number; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/CountQueuingStrategy/size) */ - get size(): (chunk?: any) => number; -} -interface QueuingStrategyInit { - /** - * Creates a new ByteLengthQueuingStrategy with the provided high water mark. - * - * Note that the provided high water mark will not be validated ahead of time. Instead, if it is negative, NaN, or not a number, the resulting ByteLengthQueuingStrategy will cause the corresponding stream constructor to throw. - */ - highWaterMark: number; -} -interface ScriptVersion { - id?: string; - tag?: string; - message?: string; -} -declare abstract class TailEvent extends ExtendableEvent { - readonly events: TraceItem[]; - readonly traces: TraceItem[]; -} -interface TraceItem { - readonly event: - | ( - | TraceItemFetchEventInfo - | TraceItemJsRpcEventInfo - | TraceItemScheduledEventInfo - | TraceItemAlarmEventInfo - | TraceItemQueueEventInfo - | TraceItemEmailEventInfo - | TraceItemTailEventInfo - | TraceItemCustomEventInfo - | TraceItemHibernatableWebSocketEventInfo - ) - | null; - readonly eventTimestamp: number | null; - readonly logs: TraceLog[]; - readonly exceptions: TraceException[]; - readonly diagnosticsChannelEvents: TraceDiagnosticChannelEvent[]; - readonly scriptName: string | null; - readonly entrypoint?: string; - readonly scriptVersion?: ScriptVersion; - readonly dispatchNamespace?: string; - readonly scriptTags?: string[]; - readonly outcome: string; - readonly executionModel: string; - readonly truncated: boolean; - readonly cpuTime: number; - readonly wallTime: number; -} -interface TraceItemAlarmEventInfo { - readonly scheduledTime: Date; -} -interface TraceItemCustomEventInfo {} -interface TraceItemScheduledEventInfo { - readonly scheduledTime: number; - readonly cron: string; -} -interface TraceItemQueueEventInfo { - readonly queue: string; - readonly batchSize: number; -} -interface TraceItemEmailEventInfo { - readonly mailFrom: string; - readonly rcptTo: string; - readonly rawSize: number; -} -interface TraceItemTailEventInfo { - readonly consumedEvents: TraceItemTailEventInfoTailItem[]; -} -interface TraceItemTailEventInfoTailItem { - readonly scriptName: string | null; -} -interface TraceItemFetchEventInfo { - readonly response?: TraceItemFetchEventInfoResponse; - readonly request: TraceItemFetchEventInfoRequest; -} -interface TraceItemFetchEventInfoRequest { - readonly cf?: any; - readonly headers: Record; - readonly method: string; - readonly url: string; - getUnredacted(): TraceItemFetchEventInfoRequest; -} -interface TraceItemFetchEventInfoResponse { - readonly status: number; -} -interface TraceItemJsRpcEventInfo { - readonly rpcMethod: string; -} -interface TraceItemHibernatableWebSocketEventInfo { - readonly getWebSocketEvent: - | TraceItemHibernatableWebSocketEventInfoMessage - | TraceItemHibernatableWebSocketEventInfoClose - | TraceItemHibernatableWebSocketEventInfoError; -} -interface TraceItemHibernatableWebSocketEventInfoMessage { - readonly webSocketEventType: string; -} -interface TraceItemHibernatableWebSocketEventInfoClose { - readonly webSocketEventType: string; - readonly code: number; - readonly wasClean: boolean; -} -interface TraceItemHibernatableWebSocketEventInfoError { - readonly webSocketEventType: string; -} -interface TraceLog { - readonly timestamp: number; - readonly level: string; - readonly message: any; -} -interface TraceException { - readonly timestamp: number; - readonly message: string; - readonly name: string; - readonly stack?: string; -} -interface TraceDiagnosticChannelEvent { - readonly timestamp: number; - readonly channel: string; - readonly message: any; -} -interface TraceMetrics { - readonly cpuTime: number; - readonly wallTime: number; -} -interface UnsafeTraceMetrics { - fromTrace(item: TraceItem): TraceMetrics; -} -/** - * The URL interface represents an object providing static methods used for creating object URLs. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL) - */ -declare class URL { - constructor(url: string | URL, base?: string | URL); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/origin) */ - get origin(): string; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/href) */ - get href(): string; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/href) */ - set href(value: string); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/protocol) */ - get protocol(): string; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/protocol) */ - set protocol(value: string); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/username) */ - get username(): string; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/username) */ - set username(value: string); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/password) */ - get password(): string; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/password) */ - set password(value: string); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/host) */ - get host(): string; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/host) */ - set host(value: string); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hostname) */ - get hostname(): string; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hostname) */ - set hostname(value: string); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/port) */ - get port(): string; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/port) */ - set port(value: string); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/pathname) */ - get pathname(): string; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/pathname) */ - set pathname(value: string); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/search) */ - get search(): string; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/search) */ - set search(value: string); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hash) */ - get hash(): string; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hash) */ - set hash(value: string); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/searchParams) */ - get searchParams(): URLSearchParams; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/toJSON) */ - toJSON(): string; - /*function toString() { [native code] }*/ - toString(): string; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/canParse_static) */ - static canParse(url: string, base?: string): boolean; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/parse_static) */ - static parse(url: string, base?: string): URL | null; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/createObjectURL_static) */ - static createObjectURL(object: File | Blob): string; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/revokeObjectURL_static) */ - static revokeObjectURL(object_url: string): void; -} -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams) */ -declare class URLSearchParams { - constructor(init?: Iterable> | Record | string); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/size) */ - get size(): number; - /** - * Appends a specified key/value pair as a new search parameter. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/append) - */ - append(name: string, value: string): void; - /** - * Deletes the given search parameter, and its associated value, from the list of all search parameters. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/delete) - */ - delete(name: string, value?: string): void; - /** - * Returns the first value associated to the given search parameter. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/get) - */ - get(name: string): string | null; - /** - * Returns all the values association with a given search parameter. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/getAll) - */ - getAll(name: string): string[]; - /** - * Returns a Boolean indicating if such a search parameter exists. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/has) - */ - has(name: string, value?: string): boolean; - /** - * Sets the value associated to a given search parameter to the given value. If there were several values, delete the others. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/set) - */ - set(name: string, value: string): void; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/sort) */ - sort(): void; - /* Returns an array of key, value pairs for every entry in the search params. */ - entries(): IterableIterator<[key: string, value: string]>; - /* Returns a list of keys in the search params. */ - keys(): IterableIterator; - /* Returns a list of values in the search params. */ - values(): IterableIterator; - forEach( - callback: (this: This, value: string, key: string, parent: URLSearchParams) => void, - thisArg?: This - ): void; - /*function toString() { [native code] } Returns a string containing a query string suitable for use in a URL. Does not include the question mark. */ - toString(): string; - [Symbol.iterator](): IterableIterator<[key: string, value: string]>; -} -declare class URLPattern { - constructor( - input?: string | URLPatternURLPatternInit, - baseURL?: string | URLPatternURLPatternOptions, - patternOptions?: URLPatternURLPatternOptions - ); - get protocol(): string; - get username(): string; - get password(): string; - get hostname(): string; - get port(): string; - get pathname(): string; - get search(): string; - get hash(): string; - test(input?: string | URLPatternURLPatternInit, baseURL?: string): boolean; - exec(input?: string | URLPatternURLPatternInit, baseURL?: string): URLPatternURLPatternResult | null; -} -interface URLPatternURLPatternInit { - protocol?: string; - username?: string; - password?: string; - hostname?: string; - port?: string; - pathname?: string; - search?: string; - hash?: string; - baseURL?: string; -} -interface URLPatternURLPatternComponentResult { - input: string; - groups: Record; -} -interface URLPatternURLPatternResult { - inputs: (string | URLPatternURLPatternInit)[]; - protocol: URLPatternURLPatternComponentResult; - username: URLPatternURLPatternComponentResult; - password: URLPatternURLPatternComponentResult; - hostname: URLPatternURLPatternComponentResult; - port: URLPatternURLPatternComponentResult; - pathname: URLPatternURLPatternComponentResult; - search: URLPatternURLPatternComponentResult; - hash: URLPatternURLPatternComponentResult; -} -interface URLPatternURLPatternOptions { - ignoreCase?: boolean; -} -/** - * A CloseEvent is sent to clients using WebSockets when the connection is closed. This is delivered to the listener indicated by the WebSocket object's onclose attribute. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CloseEvent) - */ -declare class CloseEvent extends Event { - constructor(type: string, initializer?: CloseEventInit); - /** - * Returns the WebSocket connection close code provided by the server. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CloseEvent/code) - */ - readonly code: number; - /** - * Returns the WebSocket connection close reason provided by the server. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CloseEvent/reason) - */ - readonly reason: string; - /** - * Returns true if the connection closed cleanly; false otherwise. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CloseEvent/wasClean) - */ - readonly wasClean: boolean; -} -interface CloseEventInit { - code?: number; - reason?: string; - wasClean?: boolean; -} -/** - * A message received by a target object. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent) - */ -declare class MessageEvent extends Event { - constructor(type: string, initializer: MessageEventInit); - /** - * Returns the data of the message. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent/data) - */ - readonly data: ArrayBuffer | string; -} -interface MessageEventInit { - data: ArrayBuffer | string; -} -type WebSocketEventMap = { - close: CloseEvent; - message: MessageEvent; - open: Event; - error: ErrorEvent; -}; -/** - * Provides the API for creating and managing a WebSocket connection to a server, as well as for sending and receiving data on the connection. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket) - */ -declare var WebSocket: { - prototype: WebSocket; - new (url: string, protocols?: string[] | string): WebSocket; - readonly READY_STATE_CONNECTING: number; - readonly CONNECTING: number; - readonly READY_STATE_OPEN: number; - readonly OPEN: number; - readonly READY_STATE_CLOSING: number; - readonly CLOSING: number; - readonly READY_STATE_CLOSED: number; - readonly CLOSED: number; -}; -/** - * Provides the API for creating and managing a WebSocket connection to a server, as well as for sending and receiving data on the connection. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket) - */ -interface WebSocket extends EventTarget { - accept(): void; - /** - * Transmits data using the WebSocket connection. data can be a string, a Blob, an ArrayBuffer, or an ArrayBufferView. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/send) - */ - send(message: (ArrayBuffer | ArrayBufferView) | string): void; - /** - * Closes the WebSocket connection, optionally using code as the the WebSocket connection close code and reason as the the WebSocket connection close reason. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/close) - */ - close(code?: number, reason?: string): void; - serializeAttachment(attachment: any): void; - deserializeAttachment(): any | null; - /** - * Returns the state of the WebSocket object's connection. It can have the values described below. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/readyState) - */ - readyState: number; - /** - * Returns the URL that was used to establish the WebSocket connection. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/url) - */ - url: string | null; - /** - * Returns the subprotocol selected by the server, if any. It can be used in conjunction with the array form of the constructor's second argument to perform subprotocol negotiation. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/protocol) - */ - protocol: string | null; - /** - * Returns the extensions selected by the server, if any. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/extensions) - */ - extensions: string | null; -} -declare const WebSocketPair: { - new (): { - 0: WebSocket; - 1: WebSocket; - }; -}; -interface SqlStorage { - exec>(query: string, ...bindings: any[]): SqlStorageCursor; - get databaseSize(): number; - Cursor: typeof SqlStorageCursor; - Statement: typeof SqlStorageStatement; -} -declare abstract class SqlStorageStatement {} -type SqlStorageValue = ArrayBuffer | string | number | null; -declare abstract class SqlStorageCursor> { - next(): - | { - done?: false; - value: T; - } - | { - done: true; - value?: never; - }; - toArray(): T[]; - one(): T; - raw(): IterableIterator; - columnNames: string[]; - get rowsRead(): number; - get rowsWritten(): number; - [Symbol.iterator](): IterableIterator; -} -interface Socket { - get readable(): ReadableStream; - get writable(): WritableStream; - get closed(): Promise; - get opened(): Promise; - close(): Promise; - startTls(options?: TlsOptions): Socket; -} -interface SocketOptions { - secureTransport?: string; - allowHalfOpen: boolean; - highWaterMark?: number | bigint; -} -interface SocketAddress { - hostname: string; - port: number; -} -interface TlsOptions { - expectedServerHostname?: string; -} -interface SocketInfo { - remoteAddress?: string; - localAddress?: string; -} -/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource) */ -declare class EventSource extends EventTarget { - constructor(url: string, init?: EventSourceEventSourceInit); - /** - * Aborts any instances of the fetch algorithm started for this EventSource object, and sets the readyState attribute to CLOSED. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/close) - */ - close(): void; - /** - * Returns the URL providing the event stream. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/url) - */ - get url(): string; - /** - * Returns true if the credentials mode for connection requests to the URL providing the event stream is set to "include", and false otherwise. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/withCredentials) - */ - get withCredentials(): boolean; - /** - * Returns the state of this EventSource object's connection. It can have the values described below. - * - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/readyState) - */ - get readyState(): number; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/open_event) */ - get onopen(): any | null; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/open_event) */ - set onopen(value: any | null); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/message_event) */ - get onmessage(): any | null; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/message_event) */ - set onmessage(value: any | null); - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/error_event) */ - get onerror(): any | null; - /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/error_event) */ - set onerror(value: any | null); - static readonly CONNECTING: number; - static readonly OPEN: number; - static readonly CLOSED: number; - static from(stream: ReadableStream): EventSource; -} -interface EventSourceEventSourceInit { - withCredentials?: boolean; - fetcher?: Fetcher; -} -interface Container { - get running(): boolean; - start(options?: ContainerStartupOptions): void; - monitor(): Promise; - destroy(error?: any): Promise; - signal(signo: number): void; - getTcpPort(port: number): Fetcher; -} -interface ContainerStartupOptions { - entrypoint?: string[]; - enableInternet: boolean; - env?: Record; -} -type AiImageClassificationInput = { - image: number[]; -}; -type AiImageClassificationOutput = { - score?: number; - label?: string; -}[]; -declare abstract class BaseAiImageClassification { - inputs: AiImageClassificationInput; - postProcessedOutputs: AiImageClassificationOutput; -} -type AiImageToTextInput = { - image: number[]; - prompt?: string; - max_tokens?: number; - temperature?: number; - top_p?: number; - top_k?: number; - seed?: number; - repetition_penalty?: number; - frequency_penalty?: number; - presence_penalty?: number; - raw?: boolean; - messages?: RoleScopedChatInput[]; -}; -type AiImageToTextOutput = { - description: string; -}; -declare abstract class BaseAiImageToText { - inputs: AiImageToTextInput; - postProcessedOutputs: AiImageToTextOutput; -} -type AiImageTextToTextInput = { - image: string; - prompt?: string; - max_tokens?: number; - temperature?: number; - ignore_eos?: boolean; - top_p?: number; - top_k?: number; - seed?: number; - repetition_penalty?: number; - frequency_penalty?: number; - presence_penalty?: number; - raw?: boolean; - messages?: RoleScopedChatInput[]; -}; -type AiImageTextToTextOutput = { - description: string; -}; -declare abstract class BaseAiImageTextToText { - inputs: AiImageTextToTextInput; - postProcessedOutputs: AiImageTextToTextOutput; -} -type AiObjectDetectionInput = { - image: number[]; -}; -type AiObjectDetectionOutput = { - score?: number; - label?: string; -}[]; -declare abstract class BaseAiObjectDetection { - inputs: AiObjectDetectionInput; - postProcessedOutputs: AiObjectDetectionOutput; -} -type AiSentenceSimilarityInput = { - source: string; - sentences: string[]; -}; -type AiSentenceSimilarityOutput = number[]; -declare abstract class BaseAiSentenceSimilarity { - inputs: AiSentenceSimilarityInput; - postProcessedOutputs: AiSentenceSimilarityOutput; -} -type AiAutomaticSpeechRecognitionInput = { - audio: number[]; -}; -type AiAutomaticSpeechRecognitionOutput = { - text?: string; - words?: { - word: string; - start: number; - end: number; - }[]; - vtt?: string; -}; -declare abstract class BaseAiAutomaticSpeechRecognition { - inputs: AiAutomaticSpeechRecognitionInput; - postProcessedOutputs: AiAutomaticSpeechRecognitionOutput; -} -type AiSummarizationInput = { - input_text: string; - max_length?: number; -}; -type AiSummarizationOutput = { - summary: string; -}; -declare abstract class BaseAiSummarization { - inputs: AiSummarizationInput; - postProcessedOutputs: AiSummarizationOutput; -} -type AiTextClassificationInput = { - text: string; -}; -type AiTextClassificationOutput = { - score?: number; - label?: string; -}[]; -declare abstract class BaseAiTextClassification { - inputs: AiTextClassificationInput; - postProcessedOutputs: AiTextClassificationOutput; -} -type AiTextEmbeddingsInput = { - text: string | string[]; -}; -type AiTextEmbeddingsOutput = { - shape: number[]; - data: number[][]; -}; -declare abstract class BaseAiTextEmbeddings { - inputs: AiTextEmbeddingsInput; - postProcessedOutputs: AiTextEmbeddingsOutput; -} -type RoleScopedChatInput = { - role: "user" | "assistant" | "system" | "tool" | (string & NonNullable); - content: string; - name?: string; -}; -type AiTextGenerationToolLegacyInput = { - name: string; - description: string; - parameters?: { - type: "object" | (string & NonNullable); - properties: { - [key: string]: { - type: string; - description?: string; - }; - }; - required: string[]; - }; -}; -type AiTextGenerationToolInput = { - type: "function" | (string & NonNullable); - function: { - name: string; - description: string; - parameters?: { - type: "object" | (string & NonNullable); - properties: { - [key: string]: { - type: string; - description?: string; - }; - }; - required: string[]; - }; - }; -}; -type AiTextGenerationFunctionsInput = { - name: string; - code: string; -}; -type AiTextGenerationResponseFormat = { - type: string; - json_schema?: any; -}; -type AiTextGenerationInput = { - prompt?: string; - raw?: boolean; - stream?: boolean; - max_tokens?: number; - temperature?: number; - top_p?: number; - top_k?: number; - seed?: number; - repetition_penalty?: number; - frequency_penalty?: number; - presence_penalty?: number; - messages?: RoleScopedChatInput[]; - response_format?: AiTextGenerationResponseFormat; - tools?: AiTextGenerationToolInput[] | AiTextGenerationToolLegacyInput[] | (object & NonNullable); - functions?: AiTextGenerationFunctionsInput[]; -}; -type AiTextGenerationOutput = - | { - response?: string; - tool_calls?: { - name: string; - arguments: unknown; - }[]; - } - | ReadableStream; -declare abstract class BaseAiTextGeneration { - inputs: AiTextGenerationInput; - postProcessedOutputs: AiTextGenerationOutput; -} -type AiTextToSpeechInput = { - prompt: string; - lang?: string; -}; -type AiTextToSpeechOutput = - | Uint8Array - | { - audio: string; - }; -declare abstract class BaseAiTextToSpeech { - inputs: AiTextToSpeechInput; - postProcessedOutputs: AiTextToSpeechOutput; -} -type AiTextToImageInput = { - prompt: string; - negative_prompt?: string; - height?: number; - width?: number; - image?: number[]; - image_b64?: string; - mask?: number[]; - num_steps?: number; - strength?: number; - guidance?: number; - seed?: number; -}; -type AiTextToImageOutput = ReadableStream; -declare abstract class BaseAiTextToImage { - inputs: AiTextToImageInput; - postProcessedOutputs: AiTextToImageOutput; -} -type AiTranslationInput = { - text: string; - target_lang: string; - source_lang?: string; -}; -type AiTranslationOutput = { - translated_text?: string; -}; -declare abstract class BaseAiTranslation { - inputs: AiTranslationInput; - postProcessedOutputs: AiTranslationOutput; -} -type Ai_Cf_Openai_Whisper_Input = - | string - | { - /** - * An array of integers that represent the audio data constrained to 8-bit unsigned integer values - */ - audio: number[]; - }; -interface Ai_Cf_Openai_Whisper_Output { - /** - * The transcription - */ - text: string; - word_count?: number; - words?: { - word?: string; - /** - * The second this word begins in the recording - */ - start?: number; - /** - * The ending second when the word completes - */ - end?: number; - }[]; - vtt?: string; -} -declare abstract class Base_Ai_Cf_Openai_Whisper { - inputs: Ai_Cf_Openai_Whisper_Input; - postProcessedOutputs: Ai_Cf_Openai_Whisper_Output; -} -type Ai_Cf_Unum_Uform_Gen2_Qwen_500M_Input = - | string - | { - /** - * The input text prompt for the model to generate a response. - */ - prompt?: string; - /** - * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. - */ - raw?: boolean; - /** - * Controls the creativity of the AI's responses by adjusting how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. - */ - top_p?: number; - /** - * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. - */ - top_k?: number; - /** - * Random seed for reproducibility of the generation. - */ - seed?: number; - /** - * Penalty for repeated tokens; higher values discourage repetition. - */ - repetition_penalty?: number; - /** - * Decreases the likelihood of the model repeating the same lines verbatim. - */ - frequency_penalty?: number; - /** - * Increases the likelihood of the model introducing new topics. - */ - presence_penalty?: number; - image: number[] | (string & NonNullable); - /** - * The maximum number of tokens to generate in the response. - */ - max_tokens?: number; - }; -interface Ai_Cf_Unum_Uform_Gen2_Qwen_500M_Output { - description?: string; -} -declare abstract class Base_Ai_Cf_Unum_Uform_Gen2_Qwen_500M { - inputs: Ai_Cf_Unum_Uform_Gen2_Qwen_500M_Input; - postProcessedOutputs: Ai_Cf_Unum_Uform_Gen2_Qwen_500M_Output; -} -type Ai_Cf_Openai_Whisper_Tiny_En_Input = - | string - | { - /** - * An array of integers that represent the audio data constrained to 8-bit unsigned integer values - */ - audio: number[]; - }; -interface Ai_Cf_Openai_Whisper_Tiny_En_Output { - /** - * The transcription - */ - text: string; - word_count?: number; - words?: { - word?: string; - /** - * The second this word begins in the recording - */ - start?: number; - /** - * The ending second when the word completes - */ - end?: number; - }[]; - vtt?: string; -} -declare abstract class Base_Ai_Cf_Openai_Whisper_Tiny_En { - inputs: Ai_Cf_Openai_Whisper_Tiny_En_Input; - postProcessedOutputs: Ai_Cf_Openai_Whisper_Tiny_En_Output; -} -interface Ai_Cf_Openai_Whisper_Large_V3_Turbo_Input { - /** - * Base64 encoded value of the audio data. - */ - audio: string; - /** - * Supported tasks are 'translate' or 'transcribe'. - */ - task?: string; - /** - * The language of the audio being transcribed or translated. - */ - language?: string; - /** - * Preprocess the audio with a voice activity detection model. - */ - vad_filter?: string; - /** - * A text prompt to help provide context to the model on the contents of the audio. - */ - initial_prompt?: string; - /** - * The prefix it appended the the beginning of the output of the transcription and can guide the transcription result. - */ - prefix?: string; -} -interface Ai_Cf_Openai_Whisper_Large_V3_Turbo_Output { - transcription_info?: { - /** - * The language of the audio being transcribed or translated. - */ - language?: string; - /** - * The confidence level or probability of the detected language being accurate, represented as a decimal between 0 and 1. - */ - language_probability?: number; - /** - * The total duration of the original audio file, in seconds. - */ - duration?: number; - /** - * The duration of the audio after applying Voice Activity Detection (VAD) to remove silent or irrelevant sections, in seconds. - */ - duration_after_vad?: number; - }; - /** - * The complete transcription of the audio. - */ - text: string; - /** - * The total number of words in the transcription. - */ - word_count?: number; - segments?: { - /** - * The starting time of the segment within the audio, in seconds. - */ - start?: number; - /** - * The ending time of the segment within the audio, in seconds. - */ - end?: number; - /** - * The transcription of the segment. - */ - text?: string; - /** - * The temperature used in the decoding process, controlling randomness in predictions. Lower values result in more deterministic outputs. - */ - temperature?: number; - /** - * The average log probability of the predictions for the words in this segment, indicating overall confidence. - */ - avg_logprob?: number; - /** - * The compression ratio of the input to the output, measuring how much the text was compressed during the transcription process. - */ - compression_ratio?: number; - /** - * The probability that the segment contains no speech, represented as a decimal between 0 and 1. - */ - no_speech_prob?: number; - words?: { - /** - * The individual word transcribed from the audio. - */ - word?: string; - /** - * The starting time of the word within the audio, in seconds. - */ - start?: number; - /** - * The ending time of the word within the audio, in seconds. - */ - end?: number; - }[]; - }[]; - /** - * The transcription in WebVTT format, which includes timing and text information for use in subtitles. - */ - vtt?: string; -} -declare abstract class Base_Ai_Cf_Openai_Whisper_Large_V3_Turbo { - inputs: Ai_Cf_Openai_Whisper_Large_V3_Turbo_Input; - postProcessedOutputs: Ai_Cf_Openai_Whisper_Large_V3_Turbo_Output; -} -type Ai_Cf_Baai_Bge_M3_Input = BGEM3InputQueryAndContexts | BGEM3InputEmbedding; -interface BGEM3InputQueryAndContexts { - /** - * A query you wish to perform against the provided contexts. If no query is provided the model with respond with embeddings for contexts - */ - query?: string; - /** - * List of provided contexts. Note that the index in this array is important, as the response will refer to it. - */ - contexts: { - /** - * One of the provided context content - */ - text?: string; - }[]; - /** - * When provided with too long context should the model error out or truncate the context to fit? - */ - truncate_inputs?: boolean; -} -interface BGEM3InputEmbedding { - text: string | string[]; - /** - * When provided with too long context should the model error out or truncate the context to fit? - */ - truncate_inputs?: boolean; -} -type Ai_Cf_Baai_Bge_M3_Output = BGEM3OuputQuery | BGEM3OutputEmbeddingForContexts | BGEM3OuputEmbedding; -interface BGEM3OuputQuery { - response?: { - /** - * Index of the context in the request - */ - id?: number; - /** - * Score of the context under the index. - */ - score?: number; - }[]; -} -interface BGEM3OutputEmbeddingForContexts { - response?: number[][]; - shape?: number[]; - /** - * The pooling method used in the embedding process. - */ - pooling?: "mean" | "cls"; -} -interface BGEM3OuputEmbedding { - shape?: number[]; - /** - * Embeddings of the requested text values - */ - data?: number[][]; - /** - * The pooling method used in the embedding process. - */ - pooling?: "mean" | "cls"; -} -declare abstract class Base_Ai_Cf_Baai_Bge_M3 { - inputs: Ai_Cf_Baai_Bge_M3_Input; - postProcessedOutputs: Ai_Cf_Baai_Bge_M3_Output; -} -interface Ai_Cf_Black_Forest_Labs_Flux_1_Schnell_Input { - /** - * A text description of the image you want to generate. - */ - prompt: string; - /** - * The number of diffusion steps; higher values can improve quality but take longer. - */ - steps?: number; -} -interface Ai_Cf_Black_Forest_Labs_Flux_1_Schnell_Output { - /** - * The generated image in Base64 format. - */ - image?: string; -} -declare abstract class Base_Ai_Cf_Black_Forest_Labs_Flux_1_Schnell { - inputs: Ai_Cf_Black_Forest_Labs_Flux_1_Schnell_Input; - postProcessedOutputs: Ai_Cf_Black_Forest_Labs_Flux_1_Schnell_Output; -} -type Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Input = Prompt | Messages; -interface Prompt { - /** - * The input text prompt for the model to generate a response. - */ - prompt: string; - image?: number[] | (string & NonNullable); - /** - * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. - */ - raw?: boolean; - /** - * If true, the response will be streamed back incrementally using SSE, Server Sent Events. - */ - stream?: boolean; - /** - * The maximum number of tokens to generate in the response. - */ - max_tokens?: number; - /** - * Controls the randomness of the output; higher values produce more random results. - */ - temperature?: number; - /** - * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. - */ - top_p?: number; - /** - * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. - */ - top_k?: number; - /** - * Random seed for reproducibility of the generation. - */ - seed?: number; - /** - * Penalty for repeated tokens; higher values discourage repetition. - */ - repetition_penalty?: number; - /** - * Decreases the likelihood of the model repeating the same lines verbatim. - */ - frequency_penalty?: number; - /** - * Increases the likelihood of the model introducing new topics. - */ - presence_penalty?: number; - /** - * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model. - */ - lora?: string; -} -interface Messages { - /** - * An array of message objects representing the conversation history. - */ - messages: { - /** - * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). - */ - role: string; - /** - * The content of the message as a string. - */ - content: string; - }[]; - image?: number[] | string; - functions?: { - name: string; - code: string; - }[]; - /** - * A list of tools available for the assistant to use. - */ - tools?: ( - | { - /** - * The name of the tool. More descriptive the better. - */ - name: string; - /** - * A brief description of what the tool does. - */ - description: string; - /** - * Schema defining the parameters accepted by the tool. - */ - parameters: { - /** - * The type of the parameters object (usually 'object'). - */ - type: string; - /** - * List of required parameter names. - */ - required?: string[]; - /** - * Definitions of each parameter. - */ - properties: { - [k: string]: { - /** - * The data type of the parameter. - */ - type: string; - /** - * A description of the expected parameter. - */ - description: string; - }; - }; - }; - } - | { - /** - * Specifies the type of tool (e.g., 'function'). - */ - type: string; - /** - * Details of the function tool. - */ - function: { - /** - * The name of the function. - */ - name: string; - /** - * A brief description of what the function does. - */ - description: string; - /** - * Schema defining the parameters accepted by the function. - */ - parameters: { - /** - * The type of the parameters object (usually 'object'). - */ - type: string; - /** - * List of required parameter names. - */ - required?: string[]; - /** - * Definitions of each parameter. - */ - properties: { - [k: string]: { - /** - * The data type of the parameter. - */ - type: string; - /** - * A description of the expected parameter. - */ - description: string; - }; - }; - }; - }; - } - )[]; - /** - * If true, the response will be streamed back incrementally. - */ - stream?: boolean; - /** - * The maximum number of tokens to generate in the response. - */ - max_tokens?: number; - /** - * Controls the randomness of the output; higher values produce more random results. - */ - temperature?: number; - /** - * Controls the creativity of the AI's responses by adjusting how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. - */ - top_p?: number; - /** - * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. - */ - top_k?: number; - /** - * Random seed for reproducibility of the generation. - */ - seed?: number; - /** - * Penalty for repeated tokens; higher values discourage repetition. - */ - repetition_penalty?: number; - /** - * Decreases the likelihood of the model repeating the same lines verbatim. - */ - frequency_penalty?: number; - /** - * Increases the likelihood of the model introducing new topics. - */ - presence_penalty?: number; -} -type Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Output = - | { - /** - * The generated text response from the model - */ - response?: string; - /** - * An array of tool calls requests made during the response generation - */ - tool_calls?: { - /** - * The arguments passed to be passed to the tool call request - */ - arguments?: object; - /** - * The name of the tool to be called - */ - name?: string; - }[]; - } - | ReadableStream; -declare abstract class Base_Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct { - inputs: Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Input; - postProcessedOutputs: Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Output; -} -interface Ai_Cf_Meta_Llama_Guard_3_8B_Input { - /** - * An array of message objects representing the conversation history. - */ - messages: { - /** - * The role of the message sender must alternate between 'user' and 'assistant'. - */ - role: "user" | "assistant"; - /** - * The content of the message as a string. - */ - content: string; - }[]; - /** - * The maximum number of tokens to generate in the response. - */ - max_tokens?: number; - /** - * Controls the randomness of the output; higher values produce more random results. - */ - temperature?: number; - /** - * Dictate the output format of the generated response. - */ - response_format?: { - /** - * Set to json_object to process and output generated text as JSON. - */ - type?: string; - }; -} -interface Ai_Cf_Meta_Llama_Guard_3_8B_Output { - response?: - | string - | { - /** - * Whether the conversation is safe or not. - */ - safe?: boolean; - /** - * A list of what hazard categories predicted for the conversation, if the conversation is deemed unsafe. - */ - categories?: string[]; - }; - /** - * Usage statistics for the inference request - */ - usage?: { - /** - * Total number of tokens in input - */ - prompt_tokens?: number; - /** - * Total number of tokens in output - */ - completion_tokens?: number; - /** - * Total number of input and output tokens - */ - total_tokens?: number; - }; -} -declare abstract class Base_Ai_Cf_Meta_Llama_Guard_3_8B { - inputs: Ai_Cf_Meta_Llama_Guard_3_8B_Input; - postProcessedOutputs: Ai_Cf_Meta_Llama_Guard_3_8B_Output; -} -interface Ai_Cf_Baai_Bge_Reranker_Base_Input { - /** - * A query you wish to perform against the provided contexts. - */ - /** - * Number of returned results starting with the best score. - */ - top_k?: number; - /** - * List of provided contexts. Note that the index in this array is important, as the response will refer to it. - */ - contexts: { - /** - * One of the provided context content - */ - text?: string; - }[]; -} -interface Ai_Cf_Baai_Bge_Reranker_Base_Output { - response?: { - /** - * Index of the context in the request - */ - id?: number; - /** - * Score of the context under the index. - */ - score?: number; - }[]; -} -declare abstract class Base_Ai_Cf_Baai_Bge_Reranker_Base { - inputs: Ai_Cf_Baai_Bge_Reranker_Base_Input; - postProcessedOutputs: Ai_Cf_Baai_Bge_Reranker_Base_Output; -} -type Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Input = - | Ai_Cf_Meta_Llama_4_Prompt - | Ai_Cf_Meta_Llama_4_Messages; -interface Ai_Cf_Meta_Llama_4_Prompt { - /** - * The input text prompt for the model to generate a response. - */ - prompt: string; - /** - * JSON schema that should be fulfilled for the response. - */ - guided_json?: object; - /** - * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. - */ - raw?: boolean; - /** - * If true, the response will be streamed back incrementally using SSE, Server Sent Events. - */ - stream?: boolean; - /** - * The maximum number of tokens to generate in the response. - */ - max_tokens?: number; - /** - * Controls the randomness of the output; higher values produce more random results. - */ - temperature?: number; - /** - * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. - */ - top_p?: number; - /** - * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. - */ - top_k?: number; - /** - * Random seed for reproducibility of the generation. - */ - seed?: number; - /** - * Penalty for repeated tokens; higher values discourage repetition. - */ - repetition_penalty?: number; - /** - * Decreases the likelihood of the model repeating the same lines verbatim. - */ - frequency_penalty?: number; - /** - * Increases the likelihood of the model introducing new topics. - */ - presence_penalty?: number; -} -interface Ai_Cf_Meta_Llama_4_Messages { - /** - * An array of message objects representing the conversation history. - */ - messages: { - /** - * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). - */ - role?: string; - /** - * The tool call id. Must be supplied for tool calls for Mistral-3. If you don't know what to put here you can fall back to 000000001 - */ - tool_call_id?: string; - content?: - | string - | { - /** - * Type of the content provided - */ - type?: string; - text?: string; - image_url?: { - /** - * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted - */ - url?: string; - }; - }[] - | { - /** - * Type of the content provided - */ - type?: string; - text?: string; - image_url?: { - /** - * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted - */ - url?: string; - }; - }; - }[]; - functions?: { - name: string; - code: string; - }[]; - /** - * A list of tools available for the assistant to use. - */ - tools?: ( - | { - /** - * The name of the tool. More descriptive the better. - */ - name: string; - /** - * A brief description of what the tool does. - */ - description: string; - /** - * Schema defining the parameters accepted by the tool. - */ - parameters: { - /** - * The type of the parameters object (usually 'object'). - */ - type: string; - /** - * List of required parameter names. - */ - required?: string[]; - /** - * Definitions of each parameter. - */ - properties: { - [k: string]: { - /** - * The data type of the parameter. - */ - type: string; - /** - * A description of the expected parameter. - */ - description: string; - }; - }; - }; - } - | { - /** - * Specifies the type of tool (e.g., 'function'). - */ - type: string; - /** - * Details of the function tool. - */ - function: { - /** - * The name of the function. - */ - name: string; - /** - * A brief description of what the function does. - */ - description: string; - /** - * Schema defining the parameters accepted by the function. - */ - parameters: { - /** - * The type of the parameters object (usually 'object'). - */ - type: string; - /** - * List of required parameter names. - */ - required?: string[]; - /** - * Definitions of each parameter. - */ - properties: { - [k: string]: { - /** - * The data type of the parameter. - */ - type: string; - /** - * A description of the expected parameter. - */ - description: string; - }; - }; - }; - }; - } - )[]; - /** - * JSON schema that should be fufilled for the response. - */ - guided_json?: object; - /** - * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. - */ - raw?: boolean; - /** - * If true, the response will be streamed back incrementally using SSE, Server Sent Events. - */ - stream?: boolean; - /** - * The maximum number of tokens to generate in the response. - */ - max_tokens?: number; - /** - * Controls the randomness of the output; higher values produce more random results. - */ - temperature?: number; - /** - * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. - */ - top_p?: number; - /** - * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. - */ - top_k?: number; - /** - * Random seed for reproducibility of the generation. - */ - seed?: number; - /** - * Penalty for repeated tokens; higher values discourage repetition. - */ - repetition_penalty?: number; - /** - * Decreases the likelihood of the model repeating the same lines verbatim. - */ - frequency_penalty?: number; - /** - * Increases the likelihood of the model introducing new topics. - */ - presence_penalty?: number; -} -type Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Output = - | { - /** - * The generated text response from the model - */ - response: string; - /** - * Usage statistics for the inference request - */ - usage?: { - /** - * Total number of tokens in input - */ - prompt_tokens?: number; - /** - * Total number of tokens in output - */ - completion_tokens?: number; - /** - * Total number of input and output tokens - */ - total_tokens?: number; - }; - /** - * An array of tool calls requests made during the response generation - */ - tool_calls?: { - /** - * The arguments passed to be passed to the tool call request - */ - arguments?: object; - /** - * The name of the tool to be called - */ - name?: string; - }[]; - } - | string; -declare abstract class Base_Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct { - inputs: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Input; - postProcessedOutputs: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Output; -} -interface AiModels { - "@cf/huggingface/distilbert-sst-2-int8": BaseAiTextClassification; - "@cf/stabilityai/stable-diffusion-xl-base-1.0": BaseAiTextToImage; - "@cf/runwayml/stable-diffusion-v1-5-inpainting": BaseAiTextToImage; - "@cf/runwayml/stable-diffusion-v1-5-img2img": BaseAiTextToImage; - "@cf/lykon/dreamshaper-8-lcm": BaseAiTextToImage; - "@cf/bytedance/stable-diffusion-xl-lightning": BaseAiTextToImage; - "@cf/myshell-ai/melotts": BaseAiTextToSpeech; - "@cf/baai/bge-base-en-v1.5": BaseAiTextEmbeddings; - "@cf/baai/bge-small-en-v1.5": BaseAiTextEmbeddings; - "@cf/baai/bge-large-en-v1.5": BaseAiTextEmbeddings; - "@cf/microsoft/resnet-50": BaseAiImageClassification; - "@cf/facebook/detr-resnet-50": BaseAiObjectDetection; - "@cf/meta/llama-2-7b-chat-int8": BaseAiTextGeneration; - "@cf/mistral/mistral-7b-instruct-v0.1": BaseAiTextGeneration; - "@cf/meta/llama-2-7b-chat-fp16": BaseAiTextGeneration; - "@hf/thebloke/llama-2-13b-chat-awq": BaseAiTextGeneration; - "@hf/thebloke/mistral-7b-instruct-v0.1-awq": BaseAiTextGeneration; - "@hf/thebloke/zephyr-7b-beta-awq": BaseAiTextGeneration; - "@hf/thebloke/openhermes-2.5-mistral-7b-awq": BaseAiTextGeneration; - "@hf/thebloke/neural-chat-7b-v3-1-awq": BaseAiTextGeneration; - "@hf/thebloke/llamaguard-7b-awq": BaseAiTextGeneration; - "@hf/thebloke/deepseek-coder-6.7b-base-awq": BaseAiTextGeneration; - "@hf/thebloke/deepseek-coder-6.7b-instruct-awq": BaseAiTextGeneration; - "@cf/deepseek-ai/deepseek-math-7b-instruct": BaseAiTextGeneration; - "@cf/defog/sqlcoder-7b-2": BaseAiTextGeneration; - "@cf/openchat/openchat-3.5-0106": BaseAiTextGeneration; - "@cf/tiiuae/falcon-7b-instruct": BaseAiTextGeneration; - "@cf/thebloke/discolm-german-7b-v1-awq": BaseAiTextGeneration; - "@cf/qwen/qwen1.5-0.5b-chat": BaseAiTextGeneration; - "@cf/qwen/qwen1.5-7b-chat-awq": BaseAiTextGeneration; - "@cf/qwen/qwen1.5-14b-chat-awq": BaseAiTextGeneration; - "@cf/tinyllama/tinyllama-1.1b-chat-v1.0": BaseAiTextGeneration; - "@cf/microsoft/phi-2": BaseAiTextGeneration; - "@cf/qwen/qwen1.5-1.8b-chat": BaseAiTextGeneration; - "@cf/mistral/mistral-7b-instruct-v0.2-lora": BaseAiTextGeneration; - "@hf/nousresearch/hermes-2-pro-mistral-7b": BaseAiTextGeneration; - "@hf/nexusflow/starling-lm-7b-beta": BaseAiTextGeneration; - "@hf/google/gemma-7b-it": BaseAiTextGeneration; - "@cf/meta-llama/llama-2-7b-chat-hf-lora": BaseAiTextGeneration; - "@cf/google/gemma-2b-it-lora": BaseAiTextGeneration; - "@cf/google/gemma-7b-it-lora": BaseAiTextGeneration; - "@hf/mistral/mistral-7b-instruct-v0.2": BaseAiTextGeneration; - "@cf/meta/llama-3-8b-instruct": BaseAiTextGeneration; - "@cf/fblgit/una-cybertron-7b-v2-bf16": BaseAiTextGeneration; - "@cf/meta/llama-3-8b-instruct-awq": BaseAiTextGeneration; - "@hf/meta-llama/meta-llama-3-8b-instruct": BaseAiTextGeneration; - "@cf/meta/llama-3.1-8b-instruct": BaseAiTextGeneration; - "@cf/meta/llama-3.1-8b-instruct-fp8": BaseAiTextGeneration; - "@cf/meta/llama-3.1-8b-instruct-awq": BaseAiTextGeneration; - "@cf/meta/llama-3.2-3b-instruct": BaseAiTextGeneration; - "@cf/meta/llama-3.2-1b-instruct": BaseAiTextGeneration; - "@cf/meta/llama-3.3-70b-instruct-fp8-fast": BaseAiTextGeneration; - "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b": BaseAiTextGeneration; - "@cf/meta/m2m100-1.2b": BaseAiTranslation; - "@cf/facebook/bart-large-cnn": BaseAiSummarization; - "@cf/llava-hf/llava-1.5-7b-hf": BaseAiImageToText; - "@cf/openai/whisper": Base_Ai_Cf_Openai_Whisper; - "@cf/unum/uform-gen2-qwen-500m": Base_Ai_Cf_Unum_Uform_Gen2_Qwen_500M; - "@cf/openai/whisper-tiny-en": Base_Ai_Cf_Openai_Whisper_Tiny_En; - "@cf/openai/whisper-large-v3-turbo": Base_Ai_Cf_Openai_Whisper_Large_V3_Turbo; - "@cf/baai/bge-m3": Base_Ai_Cf_Baai_Bge_M3; - "@cf/black-forest-labs/flux-1-schnell": Base_Ai_Cf_Black_Forest_Labs_Flux_1_Schnell; - "@cf/meta/llama-3.2-11b-vision-instruct": Base_Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct; - "@cf/meta/llama-guard-3-8b": Base_Ai_Cf_Meta_Llama_Guard_3_8B; - "@cf/baai/bge-reranker-base": Base_Ai_Cf_Baai_Bge_Reranker_Base; - "@cf/meta/llama-4-scout-17b-16e-instruct": Base_Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct; -} -type AiOptions = { - gateway?: GatewayOptions; - returnRawResponse?: boolean; - prefix?: string; - extraHeaders?: object; -}; -type ConversionResponse = { - name: string; - mimeType: string; - format: "markdown"; - tokens: number; - data: string; -}; -type AiModelsSearchParams = { - author?: string; - hide_experimental?: boolean; - page?: number; - per_page?: number; - search?: string; - source?: number; - task?: string; -}; -type AiModelsSearchObject = { - id: string; - source: number; - name: string; - description: string; - task: { - id: string; - name: string; - description: string; - }; - tags: string[]; - properties: { - property_id: string; - value: string; - }[]; -}; -interface InferenceUpstreamError extends Error {} -interface AiInternalError extends Error {} -type AiModelListType = Record; -declare abstract class Ai { - aiGatewayLogId: string | null; - gateway(gatewayId: string): AiGateway; - autorag(autoragId: string): AutoRAG; - run( - model: Name, - inputs: AiModelList[Name]["inputs"], - options?: Options - ): Promise< - Options extends { - returnRawResponse: true; - } - ? Response - : AiModelList[Name]["postProcessedOutputs"] - >; - models(params?: AiModelsSearchParams): Promise; - toMarkdown( - files: { - name: string; - blob: Blob; - }[], - options?: { - gateway?: GatewayOptions; - extraHeaders?: object; - } - ): Promise; - toMarkdown( - files: { - name: string; - blob: Blob; - }, - options?: { - gateway?: GatewayOptions; - extraHeaders?: object; - } - ): Promise; -} -type GatewayOptions = { - id: string; - cacheKey?: string; - cacheTtl?: number; - skipCache?: boolean; - metadata?: Record; - collectLog?: boolean; -}; -type AiGatewayPatchLog = { - score?: number | null; - feedback?: -1 | 1 | null; - metadata?: Record | null; -}; -type AiGatewayLog = { - id: string; - provider: string; - model: string; - model_type?: string; - path: string; - duration: number; - request_type?: string; - request_content_type?: string; - status_code: number; - response_content_type?: string; - success: boolean; - cached: boolean; - tokens_in?: number; - tokens_out?: number; - metadata?: Record; - step?: number; - cost?: number; - custom_cost?: boolean; - request_size: number; - request_head?: string; - request_head_complete: boolean; - response_size: number; - response_head?: string; - response_head_complete: boolean; - created_at: Date; -}; -type AIGatewayProviders = - | "workers-ai" - | "anthropic" - | "aws-bedrock" - | "azure-openai" - | "google-vertex-ai" - | "huggingface" - | "openai" - | "perplexity-ai" - | "replicate" - | "groq" - | "cohere" - | "google-ai-studio" - | "mistral" - | "grok" - | "openrouter" - | "deepseek" - | "cerebras" - | "cartesia" - | "elevenlabs" - | "adobe-firefly"; -type AIGatewayHeaders = { - "cf-aig-metadata": Record | string; - "cf-aig-custom-cost": - | { - per_token_in?: number; - per_token_out?: number; - } - | { - total_cost?: number; - } - | string; - "cf-aig-cache-ttl": number | string; - "cf-aig-skip-cache": boolean | string; - "cf-aig-cache-key": string; - "cf-aig-collect-log": boolean | string; - Authorization: string; - "Content-Type": string; - [key: string]: string | number | boolean | object; -}; -type AIGatewayUniversalRequest = { - provider: AIGatewayProviders | string; - endpoint: string; - headers: Partial; - query: unknown; -}; -interface AiGatewayInternalError extends Error {} -interface AiGatewayLogNotFound extends Error {} -declare abstract class AiGateway { - patchLog(logId: string, data: AiGatewayPatchLog): Promise; - getLog(logId: string): Promise; - run(data: AIGatewayUniversalRequest | AIGatewayUniversalRequest[]): Promise; - getUrl(provider?: AIGatewayProviders | string): Promise; -} -interface AutoRAGInternalError extends Error {} -interface AutoRAGNotFoundError extends Error {} -interface AutoRAGUnauthorizedError extends Error {} -type AutoRagSearchRequest = { - query: string; - max_num_results?: number; - ranking_options?: { - ranker?: string; - score_threshold?: number; - }; - rewrite_query?: boolean; -}; -type AutoRagSearchResponse = { - object: "vector_store.search_results.page"; - search_query: string; - data: { - file_id: string; - filename: string; - score: number; - attributes: Record; - content: { - type: "text"; - text: string; - }[]; - }[]; - has_more: boolean; - next_page: string | null; -}; -type AutoRagAiSearchResponse = AutoRagSearchResponse & { - response: string; -}; -declare abstract class AutoRAG { - search(params: AutoRagSearchRequest): Promise; - aiSearch(params: AutoRagSearchRequest): Promise; -} -interface BasicImageTransformations { - /** - * Maximum width in image pixels. The value must be an integer. - */ - width?: number; - /** - * Maximum height in image pixels. The value must be an integer. - */ - height?: number; - /** - * Resizing mode as a string. It affects interpretation of width and height - * options: - * - scale-down: Similar to contain, but the image is never enlarged. If - * the image is larger than given width or height, it will be resized. - * Otherwise its original size will be kept. - * - contain: Resizes to maximum size that fits within the given width and - * height. If only a single dimension is given (e.g. only width), the - * image will be shrunk or enlarged to exactly match that dimension. - * Aspect ratio is always preserved. - * - cover: Resizes (shrinks or enlarges) to fill the entire area of width - * and height. If the image has an aspect ratio different from the ratio - * of width and height, it will be cropped to fit. - * - crop: The image will be shrunk and cropped to fit within the area - * specified by width and height. The image will not be enlarged. For images - * smaller than the given dimensions it's the same as scale-down. For - * images larger than the given dimensions, it's the same as cover. - * See also trim. - * - pad: Resizes to the maximum size that fits within the given width and - * height, and then fills the remaining area with a background color - * (white by default). Use of this mode is not recommended, as the same - * effect can be more efficiently achieved with the contain mode and the - * CSS object-fit: contain property. - * - squeeze: Stretches and deforms to the width and height given, even if it - * breaks aspect ratio - */ - fit?: "scale-down" | "contain" | "cover" | "crop" | "pad" | "squeeze"; - /** - * When cropping with fit: "cover", this defines the side or point that should - * be left uncropped. The value is either a string - * "left", "right", "top", "bottom", "auto", or "center" (the default), - * or an object {x, y} containing focal point coordinates in the original - * image expressed as fractions ranging from 0.0 (top or left) to 1.0 - * (bottom or right), 0.5 being the center. {fit: "cover", gravity: "top"} will - * crop bottom or left and right sides as necessary, but won’t crop anything - * from the top. {fit: "cover", gravity: {x:0.5, y:0.2}} will crop each side to - * preserve as much as possible around a point at 20% of the height of the - * source image. - */ - gravity?: - | "left" - | "right" - | "top" - | "bottom" - | "center" - | "auto" - | "entropy" - | BasicImageTransformationsGravityCoordinates; - /** - * Background color to add underneath the image. Applies only to images with - * transparency (such as PNG). Accepts any CSS color (#RRGGBB, rgba(…), - * hsl(…), etc.) - */ - background?: string; - /** - * Number of degrees (90, 180, 270) to rotate the image by. width and height - * options refer to axes after rotation. - */ - rotate?: 0 | 90 | 180 | 270 | 360; -} -interface BasicImageTransformationsGravityCoordinates { - x?: number; - y?: number; - mode?: "remainder" | "box-center"; -} -/** - * In addition to the properties you can set in the RequestInit dict - * that you pass as an argument to the Request constructor, you can - * set certain properties of a `cf` object to control how Cloudflare - * features are applied to that new Request. - * - * Note: Currently, these properties cannot be tested in the - * playground. - */ -interface RequestInitCfProperties extends Record { - cacheEverything?: boolean; - /** - * A request's cache key is what determines if two requests are - * "the same" for caching purposes. If a request has the same cache key - * as some previous request, then we can serve the same cached response for - * both. (e.g. 'some-key') - * - * Only available for Enterprise customers. - */ - cacheKey?: string; - /** - * This allows you to append additional Cache-Tag response headers - * to the origin response without modifications to the origin server. - * This will allow for greater control over the Purge by Cache Tag feature - * utilizing changes only in the Workers process. - * - * Only available for Enterprise customers. - */ - cacheTags?: string[]; - /** - * Force response to be cached for a given number of seconds. (e.g. 300) - */ - cacheTtl?: number; - /** - * Force response to be cached for a given number of seconds based on the Origin status code. - * (e.g. { '200-299': 86400, '404': 1, '500-599': 0 }) - */ - cacheTtlByStatus?: Record; - scrapeShield?: boolean; - apps?: boolean; - image?: RequestInitCfPropertiesImage; - minify?: RequestInitCfPropertiesImageMinify; - mirage?: boolean; - polish?: "lossy" | "lossless" | "off"; - r2?: RequestInitCfPropertiesR2; - /** - * Redirects the request to an alternate origin server. You can use this, - * for example, to implement load balancing across several origins. - * (e.g.us-east.example.com) - * - * Note - For security reasons, the hostname set in resolveOverride must - * be proxied on the same Cloudflare zone of the incoming request. - * Otherwise, the setting is ignored. CNAME hosts are allowed, so to - * resolve to a host under a different domain or a DNS only domain first - * declare a CNAME record within your own zone’s DNS mapping to the - * external hostname, set proxy on Cloudflare, then set resolveOverride - * to point to that CNAME record. - */ - resolveOverride?: string; -} -interface RequestInitCfPropertiesImageDraw extends BasicImageTransformations { - /** - * Absolute URL of the image file to use for the drawing. It can be any of - * the supported file formats. For drawing of watermarks or non-rectangular - * overlays we recommend using PNG or WebP images. - */ - url: string; - /** - * Floating-point number between 0 (transparent) and 1 (opaque). - * For example, opacity: 0.5 makes overlay semitransparent. - */ - opacity?: number; - /** - * - If set to true, the overlay image will be tiled to cover the entire - * area. This is useful for stock-photo-like watermarks. - * - If set to "x", the overlay image will be tiled horizontally only - * (form a line). - * - If set to "y", the overlay image will be tiled vertically only - * (form a line). - */ - repeat?: true | "x" | "y"; - /** - * Position of the overlay image relative to a given edge. Each property is - * an offset in pixels. 0 aligns exactly to the edge. For example, left: 10 - * positions left side of the overlay 10 pixels from the left edge of the - * image it's drawn over. bottom: 0 aligns bottom of the overlay with bottom - * of the background image. - * - * Setting both left & right, or both top & bottom is an error. - * - * If no position is specified, the image will be centered. - */ - top?: number; - left?: number; - bottom?: number; - right?: number; -} -interface RequestInitCfPropertiesImage extends BasicImageTransformations { - /** - * Device Pixel Ratio. Default 1. Multiplier for width/height that makes it - * easier to specify higher-DPI sizes in . - */ - dpr?: number; - /** - * Allows you to trim your image. Takes dpr into account and is performed before - * resizing or rotation. - * - * It can be used as: - * - left, top, right, bottom - it will specify the number of pixels to cut - * off each side - * - width, height - the width/height you'd like to end up with - can be used - * in combination with the properties above - * - border - this will automatically trim the surroundings of an image based on - * it's color. It consists of three properties: - * - color: rgb or hex representation of the color you wish to trim (todo: verify the rgba bit) - * - tolerance: difference from color to treat as color - * - keep: the number of pixels of border to keep - */ - trim?: - | "border" - | { - top?: number; - bottom?: number; - left?: number; - right?: number; - width?: number; - height?: number; - border?: - | boolean - | { - color?: string; - tolerance?: number; - keep?: number; - }; - }; - /** - * Quality setting from 1-100 (useful values are in 60-90 range). Lower values - * make images look worse, but load faster. The default is 85. It applies only - * to JPEG and WebP images. It doesn’t have any effect on PNG. - */ - quality?: number | "low" | "medium-low" | "medium-high" | "high"; - /** - * Output format to generate. It can be: - * - avif: generate images in AVIF format. - * - webp: generate images in Google WebP format. Set quality to 100 to get - * the WebP-lossless format. - * - json: instead of generating an image, outputs information about the - * image, in JSON format. The JSON object will contain image size - * (before and after resizing), source image’s MIME type, file size, etc. - * - jpeg: generate images in JPEG format. - * - png: generate images in PNG format. - */ - format?: "avif" | "webp" | "json" | "jpeg" | "png" | "baseline-jpeg" | "png-force" | "svg"; - /** - * Whether to preserve animation frames from input files. Default is true. - * Setting it to false reduces animations to still images. This setting is - * recommended when enlarging images or processing arbitrary user content, - * because large GIF animations can weigh tens or even hundreds of megabytes. - * It is also useful to set anim:false when using format:"json" to get the - * response quicker without the number of frames. - */ - anim?: boolean; - /** - * What EXIF data should be preserved in the output image. Note that EXIF - * rotation and embedded color profiles are always applied ("baked in" into - * the image), and aren't affected by this option. Note that if the Polish - * feature is enabled, all metadata may have been removed already and this - * option may have no effect. - * - keep: Preserve most of EXIF metadata, including GPS location if there's - * any. - * - copyright: Only keep the copyright tag, and discard everything else. - * This is the default behavior for JPEG files. - * - none: Discard all invisible EXIF metadata. Currently WebP and PNG - * output formats always discard metadata. - */ - metadata?: "keep" | "copyright" | "none"; - /** - * Strength of sharpening filter to apply to the image. Floating-point - * number between 0 (no sharpening, default) and 10 (maximum). 1.0 is a - * recommended value for downscaled images. - */ - sharpen?: number; - /** - * Radius of a blur filter (approximate gaussian). Maximum supported radius - * is 250. - */ - blur?: number; - /** - * Overlays are drawn in the order they appear in the array (last array - * entry is the topmost layer). - */ - draw?: RequestInitCfPropertiesImageDraw[]; - /** - * Fetching image from authenticated origin. Setting this property will - * pass authentication headers (Authorization, Cookie, etc.) through to - * the origin. - */ - "origin-auth"?: "share-publicly"; - /** - * Adds a border around the image. The border is added after resizing. Border - * width takes dpr into account, and can be specified either using a single - * width property, or individually for each side. - */ - border?: - | { - color: string; - width: number; - } - | { - color: string; - top: number; - right: number; - bottom: number; - left: number; - }; - /** - * Increase brightness by a factor. A value of 1.0 equals no change, a value - * of 0.5 equals half brightness, and a value of 2.0 equals twice as bright. - * 0 is ignored. - */ - brightness?: number; - /** - * Increase contrast by a factor. A value of 1.0 equals no change, a value of - * 0.5 equals low contrast, and a value of 2.0 equals high contrast. 0 is - * ignored. - */ - contrast?: number; - /** - * Increase exposure by a factor. A value of 1.0 equals no change, a value of - * 0.5 darkens the image, and a value of 2.0 lightens the image. 0 is ignored. - */ - gamma?: number; - /** - * Increase contrast by a factor. A value of 1.0 equals no change, a value of - * 0.5 equals low contrast, and a value of 2.0 equals high contrast. 0 is - * ignored. - */ - saturation?: number; - /** - * Flips the images horizontally, vertically, or both. Flipping is applied before - * rotation, so if you apply flip=h,rotate=90 then the image will be flipped - * horizontally, then rotated by 90 degrees. - */ - flip?: "h" | "v" | "hv"; - /** - * Slightly reduces latency on a cache miss by selecting a - * quickest-to-compress file format, at a cost of increased file size and - * lower image quality. It will usually override the format option and choose - * JPEG over WebP or AVIF. We do not recommend using this option, except in - * unusual circumstances like resizing uncacheable dynamically-generated - * images. - */ - compression?: "fast"; -} -interface RequestInitCfPropertiesImageMinify { - javascript?: boolean; - css?: boolean; - html?: boolean; -} -interface RequestInitCfPropertiesR2 { - /** - * Colo id of bucket that an object is stored in - */ - bucketColoId?: number; -} -/** - * Request metadata provided by Cloudflare's edge. - */ -type IncomingRequestCfProperties = IncomingRequestCfPropertiesBase & - IncomingRequestCfPropertiesBotManagementEnterprise & - IncomingRequestCfPropertiesCloudflareForSaaSEnterprise & - IncomingRequestCfPropertiesGeographicInformation & - IncomingRequestCfPropertiesCloudflareAccessOrApiShield; -interface IncomingRequestCfPropertiesBase extends Record { - /** - * [ASN](https://www.iana.org/assignments/as-numbers/as-numbers.xhtml) of the incoming request. - * - * @example 395747 - */ - asn: number; - /** - * The organization which owns the ASN of the incoming request. - * - * @example "Google Cloud" - */ - asOrganization: string; - /** - * The original value of the `Accept-Encoding` header if Cloudflare modified it. - * - * @example "gzip, deflate, br" - */ - clientAcceptEncoding?: string; - /** - * The number of milliseconds it took for the request to reach your worker. - * - * @example 22 - */ - clientTcpRtt?: number; - /** - * The three-letter [IATA](https://en.wikipedia.org/wiki/IATA_airport_code) - * airport code of the data center that the request hit. - * - * @example "DFW" - */ - colo: string; - /** - * Represents the upstream's response to a - * [TCP `keepalive` message](https://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html) - * from cloudflare. - * - * For workers with no upstream, this will always be `1`. - * - * @example 3 - */ - edgeRequestKeepAliveStatus: IncomingRequestCfPropertiesEdgeRequestKeepAliveStatus; - /** - * The HTTP Protocol the request used. - * - * @example "HTTP/2" - */ - httpProtocol: string; - /** - * The browser-requested prioritization information in the request object. - * - * If no information was set, defaults to the empty string `""` - * - * @example "weight=192;exclusive=0;group=3;group-weight=127" - * @default "" - */ - requestPriority: string; - /** - * The TLS version of the connection to Cloudflare. - * In requests served over plaintext (without TLS), this property is the empty string `""`. - * - * @example "TLSv1.3" - */ - tlsVersion: string; - /** - * The cipher for the connection to Cloudflare. - * In requests served over plaintext (without TLS), this property is the empty string `""`. - * - * @example "AEAD-AES128-GCM-SHA256" - */ - tlsCipher: string; - /** - * Metadata containing the [`HELLO`](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.1.2) and [`FINISHED`](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.9) messages from this request's TLS handshake. - * - * If the incoming request was served over plaintext (without TLS) this field is undefined. - */ - tlsExportedAuthenticator?: IncomingRequestCfPropertiesExportedAuthenticatorMetadata; -} -interface IncomingRequestCfPropertiesBotManagementBase { - /** - * Cloudflare’s [level of certainty](https://developers.cloudflare.com/bots/concepts/bot-score/) that a request comes from a bot, - * represented as an integer percentage between `1` (almost certainly a bot) and `99` (almost certainly human). - * - * @example 54 - */ - score: number; - /** - * A boolean value that is true if the request comes from a good bot, like Google or Bing. - * Most customers choose to allow this traffic. For more details, see [Traffic from known bots](https://developers.cloudflare.com/firewall/known-issues-and-faq/#how-does-firewall-rules-handle-traffic-from-known-bots). - */ - verifiedBot: boolean; - /** - * A boolean value that is true if the request originates from a - * Cloudflare-verified proxy service. - */ - corporateProxy: boolean; - /** - * A boolean value that's true if the request matches [file extensions](https://developers.cloudflare.com/bots/reference/static-resources/) for many types of static resources. - */ - staticResource: boolean; - /** - * List of IDs that correlate to the Bot Management heuristic detections made on a request (you can have multiple heuristic detections on the same request). - */ - detectionIds: number[]; -} -interface IncomingRequestCfPropertiesBotManagement { - /** - * Results of Cloudflare's Bot Management analysis - */ - botManagement: IncomingRequestCfPropertiesBotManagementBase; - /** - * Duplicate of `botManagement.score`. - * - * @deprecated - */ - clientTrustScore: number; -} -interface IncomingRequestCfPropertiesBotManagementEnterprise extends IncomingRequestCfPropertiesBotManagement { - /** - * Results of Cloudflare's Bot Management analysis - */ - botManagement: IncomingRequestCfPropertiesBotManagementBase & { - /** - * A [JA3 Fingerprint](https://developers.cloudflare.com/bots/concepts/ja3-fingerprint/) to help profile specific SSL/TLS clients - * across different destination IPs, Ports, and X509 certificates. - */ - ja3Hash: string; - }; -} -interface IncomingRequestCfPropertiesCloudflareForSaaSEnterprise { - /** - * Custom metadata set per-host in [Cloudflare for SaaS](https://developers.cloudflare.com/cloudflare-for-platforms/cloudflare-for-saas/). - * - * This field is only present if you have Cloudflare for SaaS enabled on your account - * and you have followed the [required steps to enable it]((https://developers.cloudflare.com/cloudflare-for-platforms/cloudflare-for-saas/domain-support/custom-metadata/)). - */ - hostMetadata: HostMetadata; -} -interface IncomingRequestCfPropertiesCloudflareAccessOrApiShield { - /** - * Information about the client certificate presented to Cloudflare. - * - * This is populated when the incoming request is served over TLS using - * either Cloudflare Access or API Shield (mTLS) - * and the presented SSL certificate has a valid - * [Certificate Serial Number](https://ldapwiki.com/wiki/Certificate%20Serial%20Number) - * (i.e., not `null` or `""`). - * - * Otherwise, a set of placeholder values are used. - * - * The property `certPresented` will be set to `"1"` when - * the object is populated (i.e. the above conditions were met). - */ - tlsClientAuth: - | IncomingRequestCfPropertiesTLSClientAuth - | IncomingRequestCfPropertiesTLSClientAuthPlaceholder; -} -/** - * Metadata about the request's TLS handshake - */ -interface IncomingRequestCfPropertiesExportedAuthenticatorMetadata { - /** - * The client's [`HELLO` message](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.1.2), encoded in hexadecimal - * - * @example "44372ba35fa1270921d318f34c12f155dc87b682cf36a790cfaa3ba8737a1b5d" - */ - clientHandshake: string; - /** - * The server's [`HELLO` message](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.1.2), encoded in hexadecimal - * - * @example "44372ba35fa1270921d318f34c12f155dc87b682cf36a790cfaa3ba8737a1b5d" - */ - serverHandshake: string; - /** - * The client's [`FINISHED` message](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.9), encoded in hexadecimal - * - * @example "084ee802fe1348f688220e2a6040a05b2199a761f33cf753abb1b006792d3f8b" - */ - clientFinished: string; - /** - * The server's [`FINISHED` message](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.9), encoded in hexadecimal - * - * @example "084ee802fe1348f688220e2a6040a05b2199a761f33cf753abb1b006792d3f8b" - */ - serverFinished: string; -} -/** - * Geographic data about the request's origin. - */ -interface IncomingRequestCfPropertiesGeographicInformation { - /** - * The [ISO 3166-1 Alpha 2](https://www.iso.org/iso-3166-country-codes.html) country code the request originated from. - * - * If your worker is [configured to accept TOR connections](https://support.cloudflare.com/hc/en-us/articles/203306930-Understanding-Cloudflare-Tor-support-and-Onion-Routing), this may also be `"T1"`, indicating a request that originated over TOR. - * - * If Cloudflare is unable to determine where the request originated this property is omitted. - * - * The country code `"T1"` is used for requests originating on TOR. - * - * @example "GB" - */ - country?: Iso3166Alpha2Code | "T1"; - /** - * If present, this property indicates that the request originated in the EU - * - * @example "1" - */ - isEUCountry?: "1"; - /** - * A two-letter code indicating the continent the request originated from. - * - * @example "AN" - */ - continent?: ContinentCode; - /** - * The city the request originated from - * - * @example "Austin" - */ - city?: string; - /** - * Postal code of the incoming request - * - * @example "78701" - */ - postalCode?: string; - /** - * Latitude of the incoming request - * - * @example "30.27130" - */ - latitude?: string; - /** - * Longitude of the incoming request - * - * @example "-97.74260" - */ - longitude?: string; - /** - * Timezone of the incoming request - * - * @example "America/Chicago" - */ - timezone?: string; - /** - * If known, the ISO 3166-2 name for the first level region associated with - * the IP address of the incoming request - * - * @example "Texas" - */ - region?: string; - /** - * If known, the ISO 3166-2 code for the first-level region associated with - * the IP address of the incoming request - * - * @example "TX" - */ - regionCode?: string; - /** - * Metro code (DMA) of the incoming request - * - * @example "635" - */ - metroCode?: string; -} -/** Data about the incoming request's TLS certificate */ -interface IncomingRequestCfPropertiesTLSClientAuth { - /** Always `"1"`, indicating that the certificate was presented */ - certPresented: "1"; - /** - * Result of certificate verification. - * - * @example "FAILED:self signed certificate" - */ - certVerified: Exclude; - /** The presented certificate's revokation status. - * - * - A value of `"1"` indicates the certificate has been revoked - * - A value of `"0"` indicates the certificate has not been revoked - */ - certRevoked: "1" | "0"; - /** - * The certificate issuer's [distinguished name](https://knowledge.digicert.com/generalinformation/INFO1745.html) - * - * @example "CN=cloudflareaccess.com, C=US, ST=Texas, L=Austin, O=Cloudflare" - */ - certIssuerDN: string; - /** - * The certificate subject's [distinguished name](https://knowledge.digicert.com/generalinformation/INFO1745.html) - * - * @example "CN=*.cloudflareaccess.com, C=US, ST=Texas, L=Austin, O=Cloudflare" - */ - certSubjectDN: string; - /** - * The certificate issuer's [distinguished name](https://knowledge.digicert.com/generalinformation/INFO1745.html) ([RFC 2253](https://www.rfc-editor.org/rfc/rfc2253.html) formatted) - * - * @example "CN=cloudflareaccess.com, C=US, ST=Texas, L=Austin, O=Cloudflare" - */ - certIssuerDNRFC2253: string; - /** - * The certificate subject's [distinguished name](https://knowledge.digicert.com/generalinformation/INFO1745.html) ([RFC 2253](https://www.rfc-editor.org/rfc/rfc2253.html) formatted) - * - * @example "CN=*.cloudflareaccess.com, C=US, ST=Texas, L=Austin, O=Cloudflare" - */ - certSubjectDNRFC2253: string; - /** The certificate issuer's distinguished name (legacy policies) */ - certIssuerDNLegacy: string; - /** The certificate subject's distinguished name (legacy policies) */ - certSubjectDNLegacy: string; - /** - * The certificate's serial number - * - * @example "00936EACBE07F201DF" - */ - certSerial: string; - /** - * The certificate issuer's serial number - * - * @example "2489002934BDFEA34" - */ - certIssuerSerial: string; - /** - * The certificate's Subject Key Identifier - * - * @example "BB:AF:7E:02:3D:FA:A6:F1:3C:84:8E:AD:EE:38:98:EC:D9:32:32:D4" - */ - certSKI: string; - /** - * The certificate issuer's Subject Key Identifier - * - * @example "BB:AF:7E:02:3D:FA:A6:F1:3C:84:8E:AD:EE:38:98:EC:D9:32:32:D4" - */ - certIssuerSKI: string; - /** - * The certificate's SHA-1 fingerprint - * - * @example "6b9109f323999e52259cda7373ff0b4d26bd232e" - */ - certFingerprintSHA1: string; - /** - * The certificate's SHA-256 fingerprint - * - * @example "acf77cf37b4156a2708e34c4eb755f9b5dbbe5ebb55adfec8f11493438d19e6ad3f157f81fa3b98278453d5652b0c1fd1d71e5695ae4d709803a4d3f39de9dea" - */ - certFingerprintSHA256: string; - /** - * The effective starting date of the certificate - * - * @example "Dec 22 19:39:00 2018 GMT" - */ - certNotBefore: string; - /** - * The effective expiration date of the certificate - * - * @example "Dec 22 19:39:00 2018 GMT" - */ - certNotAfter: string; -} -/** Placeholder values for TLS Client Authorization */ -interface IncomingRequestCfPropertiesTLSClientAuthPlaceholder { - certPresented: "0"; - certVerified: "NONE"; - certRevoked: "0"; - certIssuerDN: ""; - certSubjectDN: ""; - certIssuerDNRFC2253: ""; - certSubjectDNRFC2253: ""; - certIssuerDNLegacy: ""; - certSubjectDNLegacy: ""; - certSerial: ""; - certIssuerSerial: ""; - certSKI: ""; - certIssuerSKI: ""; - certFingerprintSHA1: ""; - certFingerprintSHA256: ""; - certNotBefore: ""; - certNotAfter: ""; -} -/** Possible outcomes of TLS verification */ -declare type CertVerificationStatus = - /** Authentication succeeded */ - | "SUCCESS" - /** No certificate was presented */ - | "NONE" - /** Failed because the certificate was self-signed */ - | "FAILED:self signed certificate" - /** Failed because the certificate failed a trust chain check */ - | "FAILED:unable to verify the first certificate" - /** Failed because the certificate not yet valid */ - | "FAILED:certificate is not yet valid" - /** Failed because the certificate is expired */ - | "FAILED:certificate has expired" - /** Failed for another unspecified reason */ - | "FAILED"; -/** - * An upstream endpoint's response to a TCP `keepalive` message from Cloudflare. - */ -declare type IncomingRequestCfPropertiesEdgeRequestKeepAliveStatus = - | 0 /** Unknown */ - | 1 /** no keepalives (not found) */ - | 2 /** no connection re-use, opening keepalive connection failed */ - | 3 /** no connection re-use, keepalive accepted and saved */ - | 4 /** connection re-use, refused by the origin server (`TCP FIN`) */ - | 5; /** connection re-use, accepted by the origin server */ -/** ISO 3166-1 Alpha-2 codes */ -declare type Iso3166Alpha2Code = - | "AD" - | "AE" - | "AF" - | "AG" - | "AI" - | "AL" - | "AM" - | "AO" - | "AQ" - | "AR" - | "AS" - | "AT" - | "AU" - | "AW" - | "AX" - | "AZ" - | "BA" - | "BB" - | "BD" - | "BE" - | "BF" - | "BG" - | "BH" - | "BI" - | "BJ" - | "BL" - | "BM" - | "BN" - | "BO" - | "BQ" - | "BR" - | "BS" - | "BT" - | "BV" - | "BW" - | "BY" - | "BZ" - | "CA" - | "CC" - | "CD" - | "CF" - | "CG" - | "CH" - | "CI" - | "CK" - | "CL" - | "CM" - | "CN" - | "CO" - | "CR" - | "CU" - | "CV" - | "CW" - | "CX" - | "CY" - | "CZ" - | "DE" - | "DJ" - | "DK" - | "DM" - | "DO" - | "DZ" - | "EC" - | "EE" - | "EG" - | "EH" - | "ER" - | "ES" - | "ET" - | "FI" - | "FJ" - | "FK" - | "FM" - | "FO" - | "FR" - | "GA" - | "GB" - | "GD" - | "GE" - | "GF" - | "GG" - | "GH" - | "GI" - | "GL" - | "GM" - | "GN" - | "GP" - | "GQ" - | "GR" - | "GS" - | "GT" - | "GU" - | "GW" - | "GY" - | "HK" - | "HM" - | "HN" - | "HR" - | "HT" - | "HU" - | "ID" - | "IE" - | "IL" - | "IM" - | "IN" - | "IO" - | "IQ" - | "IR" - | "IS" - | "IT" - | "JE" - | "JM" - | "JO" - | "JP" - | "KE" - | "KG" - | "KH" - | "KI" - | "KM" - | "KN" - | "KP" - | "KR" - | "KW" - | "KY" - | "KZ" - | "LA" - | "LB" - | "LC" - | "LI" - | "LK" - | "LR" - | "LS" - | "LT" - | "LU" - | "LV" - | "LY" - | "MA" - | "MC" - | "MD" - | "ME" - | "MF" - | "MG" - | "MH" - | "MK" - | "ML" - | "MM" - | "MN" - | "MO" - | "MP" - | "MQ" - | "MR" - | "MS" - | "MT" - | "MU" - | "MV" - | "MW" - | "MX" - | "MY" - | "MZ" - | "NA" - | "NC" - | "NE" - | "NF" - | "NG" - | "NI" - | "NL" - | "NO" - | "NP" - | "NR" - | "NU" - | "NZ" - | "OM" - | "PA" - | "PE" - | "PF" - | "PG" - | "PH" - | "PK" - | "PL" - | "PM" - | "PN" - | "PR" - | "PS" - | "PT" - | "PW" - | "PY" - | "QA" - | "RE" - | "RO" - | "RS" - | "RU" - | "RW" - | "SA" - | "SB" - | "SC" - | "SD" - | "SE" - | "SG" - | "SH" - | "SI" - | "SJ" - | "SK" - | "SL" - | "SM" - | "SN" - | "SO" - | "SR" - | "SS" - | "ST" - | "SV" - | "SX" - | "SY" - | "SZ" - | "TC" - | "TD" - | "TF" - | "TG" - | "TH" - | "TJ" - | "TK" - | "TL" - | "TM" - | "TN" - | "TO" - | "TR" - | "TT" - | "TV" - | "TW" - | "TZ" - | "UA" - | "UG" - | "UM" - | "US" - | "UY" - | "UZ" - | "VA" - | "VC" - | "VE" - | "VG" - | "VI" - | "VN" - | "VU" - | "WF" - | "WS" - | "YE" - | "YT" - | "ZA" - | "ZM" - | "ZW"; -/** The 2-letter continent codes Cloudflare uses */ -declare type ContinentCode = "AF" | "AN" | "AS" | "EU" | "NA" | "OC" | "SA"; -type CfProperties = - | IncomingRequestCfProperties - | RequestInitCfProperties; -interface D1Meta { - duration: number; - size_after: number; - rows_read: number; - rows_written: number; - last_row_id: number; - changed_db: boolean; - changes: number; - /** - * The region of the database instance that executed the query. - */ - served_by_region?: string; - /** - * True if-and-only-if the database instance that executed the query was the primary. - */ - served_by_primary?: boolean; - timings?: { - /** - * The duration of the SQL query execution by the database instance. It doesn't include any network time. - */ - sql_duration_ms: number; - }; -} -interface D1Response { - success: true; - meta: D1Meta & Record; - error?: never; -} -type D1Result = D1Response & { - results: T[]; -}; -interface D1ExecResult { - count: number; - duration: number; -} -type D1SessionConstraint = - // Indicates that the first query should go to the primary, and the rest queries - // using the same D1DatabaseSession will go to any replica that is consistent with - // the bookmark maintained by the session (returned by the first query). - | "first-primary" - // Indicates that the first query can go anywhere (primary or replica), and the rest queries - // using the same D1DatabaseSession will go to any replica that is consistent with - // the bookmark maintained by the session (returned by the first query). - | "first-unconstrained"; -type D1SessionBookmark = string; -declare abstract class D1Database { - prepare(query: string): D1PreparedStatement; - batch(statements: D1PreparedStatement[]): Promise[]>; - exec(query: string): Promise; - /** - * Creates a new D1 Session anchored at the given constraint or the bookmark. - * All queries executed using the created session will have sequential consistency, - * meaning that all writes done through the session will be visible in subsequent reads. - * - * @param constraintOrBookmark Either the session constraint or the explicit bookmark to anchor the created session. - */ - withSession(constraintOrBookmark?: D1SessionBookmark | D1SessionConstraint): D1DatabaseSession; - /** - * @deprecated dump() will be removed soon, only applies to deprecated alpha v1 databases. - */ - dump(): Promise; -} -declare abstract class D1DatabaseSession { - prepare(query: string): D1PreparedStatement; - batch(statements: D1PreparedStatement[]): Promise[]>; - /** - * @returns The latest session bookmark across all executed queries on the session. - * If no query has been executed yet, `null` is returned. - */ - getBookmark(): D1SessionBookmark | null; -} -declare abstract class D1PreparedStatement { - bind(...values: unknown[]): D1PreparedStatement; - first(colName: string): Promise; - first>(): Promise; - run>(): Promise>; - all>(): Promise>; - raw(options: { columnNames: true }): Promise<[string[], ...T[]]>; - raw(options?: { columnNames?: false }): Promise; -} -// `Disposable` was added to TypeScript's standard lib types in version 5.2. -// To support older TypeScript versions, define an empty `Disposable` interface. -// Users won't be able to use `using`/`Symbol.dispose` without upgrading to 5.2, -// but this will ensure type checking on older versions still passes. -// TypeScript's interface merging will ensure our empty interface is effectively -// ignored when `Disposable` is included in the standard lib. -interface Disposable {} -/** - * An email message that can be sent from a Worker. - */ -interface EmailMessage { - /** - * Envelope From attribute of the email message. - */ - readonly from: string; - /** - * Envelope To attribute of the email message. - */ - readonly to: string; -} -/** - * An email message that is sent to a consumer Worker and can be rejected/forwarded. - */ -interface ForwardableEmailMessage extends EmailMessage { - /** - * Stream of the email message content. - */ - readonly raw: ReadableStream; - /** - * An [Headers object](https://developer.mozilla.org/en-US/docs/Web/API/Headers). - */ - readonly headers: Headers; - /** - * Size of the email message content. - */ - readonly rawSize: number; - /** - * Reject this email message by returning a permanent SMTP error back to the connecting client including the given reason. - * @param reason The reject reason. - * @returns void - */ - setReject(reason: string): void; - /** - * Forward this email message to a verified destination address of the account. - * @param rcptTo Verified destination address. - * @param headers A [Headers object](https://developer.mozilla.org/en-US/docs/Web/API/Headers). - * @returns A promise that resolves when the email message is forwarded. - */ - forward(rcptTo: string, headers?: Headers): Promise; - /** - * Reply to the sender of this email message with a new EmailMessage object. - * @param message The reply message. - * @returns A promise that resolves when the email message is replied. - */ - reply(message: EmailMessage): Promise; -} -/** - * A binding that allows a Worker to send email messages. - */ -interface SendEmail { - send(message: EmailMessage): Promise; -} -declare abstract class EmailEvent extends ExtendableEvent { - readonly message: ForwardableEmailMessage; -} -declare type EmailExportedHandler = ( - message: ForwardableEmailMessage, - env: Env, - ctx: ExecutionContext -) => void | Promise; -declare module "cloudflare:email" { - let _EmailMessage: { - prototype: EmailMessage; - new (from: string, to: string, raw: ReadableStream | string): EmailMessage; - }; - export { _EmailMessage as EmailMessage }; -} -interface Hyperdrive { - /** - * Connect directly to Hyperdrive as if it's your database, returning a TCP socket. - * - * Calling this method returns an idential socket to if you call - * `connect("host:port")` using the `host` and `port` fields from this object. - * Pick whichever approach works better with your preferred DB client library. - * - * Note that this socket is not yet authenticated -- it's expected that your - * code (or preferably, the client library of your choice) will authenticate - * using the information in this class's readonly fields. - */ - connect(): Socket; - /** - * A valid DB connection string that can be passed straight into the typical - * client library/driver/ORM. This will typically be the easiest way to use - * Hyperdrive. - */ - readonly connectionString: string; - /* - * A randomly generated hostname that is only valid within the context of the - * currently running Worker which, when passed into `connect()` function from - * the "cloudflare:sockets" module, will connect to the Hyperdrive instance - * for your database. - */ - readonly host: string; - /* - * The port that must be paired the the host field when connecting. - */ - readonly port: number; - /* - * The username to use when authenticating to your database via Hyperdrive. - * Unlike the host and password, this will be the same every time - */ - readonly user: string; - /* - * The randomly generated password to use when authenticating to your - * database via Hyperdrive. Like the host field, this password is only valid - * within the context of the currently running Worker instance from which - * it's read. - */ - readonly password: string; - /* - * The name of the database to connect to. - */ - readonly database: string; -} -// Copyright (c) 2024 Cloudflare, Inc. -// Licensed under the Apache 2.0 license found in the LICENSE file or at: -// https://opensource.org/licenses/Apache-2.0 -type ImageInfoResponse = - | { - format: "image/svg+xml"; - } - | { - format: string; - fileSize: number; - width: number; - height: number; - }; -type ImageTransform = { - width?: number; - height?: number; - background?: string; - blur?: number; - border?: - | { - color?: string; - width?: number; - } - | { - top?: number; - bottom?: number; - left?: number; - right?: number; - }; - brightness?: number; - contrast?: number; - fit?: "scale-down" | "contain" | "pad" | "squeeze" | "cover" | "crop"; - flip?: "h" | "v" | "hv"; - gamma?: number; - gravity?: - | "left" - | "right" - | "top" - | "bottom" - | "center" - | "auto" - | "entropy" - | { - x?: number; - y?: number; - mode: "remainder" | "box-center"; - }; - rotate?: 0 | 90 | 180 | 270; - saturation?: number; - sharpen?: number; - trim?: - | "border" - | { - top?: number; - bottom?: number; - left?: number; - right?: number; - width?: number; - height?: number; - border?: - | boolean - | { - color?: string; - tolerance?: number; - keep?: number; - }; - }; -}; -type ImageDrawOptions = { - opacity?: number; - repeat?: boolean | string; - top?: number; - left?: number; - bottom?: number; - right?: number; -}; -type ImageOutputOptions = { - format: "image/jpeg" | "image/png" | "image/gif" | "image/webp" | "image/avif" | "rgb" | "rgba"; - quality?: number; - background?: string; -}; -interface ImagesBinding { - /** - * Get image metadata (type, width and height) - * @throws {@link ImagesError} with code 9412 if input is not an image - * @param stream The image bytes - */ - info(stream: ReadableStream): Promise; - /** - * Begin applying a series of transformations to an image - * @param stream The image bytes - * @returns A transform handle - */ - input(stream: ReadableStream): ImageTransformer; -} -interface ImageTransformer { - /** - * Apply transform next, returning a transform handle. - * You can then apply more transformations, draw, or retrieve the output. - * @param transform - */ - transform(transform: ImageTransform): ImageTransformer; - /** - * Draw an image on this transformer, returning a transform handle. - * You can then apply more transformations, draw, or retrieve the output. - * @param image The image (or transformer that will give the image) to draw - * @param options The options configuring how to draw the image - */ - draw(image: ReadableStream | ImageTransformer, options?: ImageDrawOptions): ImageTransformer; - /** - * Retrieve the image that results from applying the transforms to the - * provided input - * @param options Options that apply to the output e.g. output format - */ - output(options: ImageOutputOptions): Promise; -} -interface ImageTransformationResult { - /** - * The image as a response, ready to store in cache or return to users - */ - response(): Response; - /** - * The content type of the returned image - */ - contentType(): string; - /** - * The bytes of the response - */ - image(): ReadableStream; -} -interface ImagesError extends Error { - readonly code: number; - readonly message: string; - readonly stack?: string; -} -type Params

= Record; -type EventContext = { - request: Request>; - functionPath: string; - waitUntil: (promise: Promise) => void; - passThroughOnException: () => void; - next: (input?: Request | string, init?: RequestInit) => Promise; - env: Env & { - ASSETS: { - fetch: typeof fetch; - }; - }; - params: Params

; - data: Data; -}; -type PagesFunction< - Env = unknown, - Params extends string = any, - Data extends Record = Record, -> = (context: EventContext) => Response | Promise; -type EventPluginContext = { - request: Request>; - functionPath: string; - waitUntil: (promise: Promise) => void; - passThroughOnException: () => void; - next: (input?: Request | string, init?: RequestInit) => Promise; - env: Env & { - ASSETS: { - fetch: typeof fetch; - }; - }; - params: Params

; - data: Data; - pluginArgs: PluginArgs; -}; -type PagesPluginFunction< - Env = unknown, - Params extends string = any, - Data extends Record = Record, - PluginArgs = unknown, -> = (context: EventPluginContext) => Response | Promise; -declare module "assets:*" { - export const onRequest: PagesFunction; -} -// Copyright (c) 2022-2023 Cloudflare, Inc. -// Licensed under the Apache 2.0 license found in the LICENSE file or at: -// https://opensource.org/licenses/Apache-2.0 -declare module "cloudflare:pipelines" { - export abstract class PipelineTransformationEntrypoint< - Env = unknown, - I extends PipelineRecord = PipelineRecord, - O extends PipelineRecord = PipelineRecord, - > { - protected env: Env; - protected ctx: ExecutionContext; - constructor(ctx: ExecutionContext, env: Env); - /** - * run recieves an array of PipelineRecord which can be - * transformed and returned to the pipeline - * @param records Incoming records from the pipeline to be transformed - * @param metadata Information about the specific pipeline calling the transformation entrypoint - * @returns A promise containing the transformed PipelineRecord array - */ - public run(records: I[], metadata: PipelineBatchMetadata): Promise; - } - export type PipelineRecord = Record; - export type PipelineBatchMetadata = { - pipelineId: string; - pipelineName: string; - }; - export interface Pipeline { - /** - * The Pipeline interface represents the type of a binding to a Pipeline - * - * @param records The records to send to the pipeline - */ - send(records: T[]): Promise; - } -} -// PubSubMessage represents an incoming PubSub message. -// The message includes metadata about the broker, the client, and the payload -// itself. -// https://developers.cloudflare.com/pub-sub/ -interface PubSubMessage { - // Message ID - readonly mid: number; - // MQTT broker FQDN in the form mqtts://BROKER.NAMESPACE.cloudflarepubsub.com:PORT - readonly broker: string; - // The MQTT topic the message was sent on. - readonly topic: string; - // The client ID of the client that published this message. - readonly clientId: string; - // The unique identifier (JWT ID) used by the client to authenticate, if token - // auth was used. - readonly jti?: string; - // A Unix timestamp (seconds from Jan 1, 1970), set when the Pub/Sub Broker - // received the message from the client. - readonly receivedAt: number; - // An (optional) string with the MIME type of the payload, if set by the - // client. - readonly contentType: string; - // Set to 1 when the payload is a UTF-8 string - // https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901063 - readonly payloadFormatIndicator: number; - // Pub/Sub (MQTT) payloads can be UTF-8 strings, or byte arrays. - // You can use payloadFormatIndicator to inspect this before decoding. - payload: string | Uint8Array; -} -// JsonWebKey extended by kid parameter -interface JsonWebKeyWithKid extends JsonWebKey { - // Key Identifier of the JWK - readonly kid: string; -} -interface RateLimitOptions { - key: string; -} -interface RateLimitOutcome { - success: boolean; -} -interface RateLimit { - /** - * Rate limit a request based on the provided options. - * @see https://developers.cloudflare.com/workers/runtime-apis/bindings/rate-limit/ - * @returns A promise that resolves with the outcome of the rate limit. - */ - limit(options: RateLimitOptions): Promise; -} -// Namespace for RPC utility types. Unfortunately, we can't use a `module` here as these types need -// to referenced by `Fetcher`. This is included in the "importable" version of the types which -// strips all `module` blocks. -declare namespace Rpc { - // Branded types for identifying `WorkerEntrypoint`/`DurableObject`/`Target`s. - // TypeScript uses *structural* typing meaning anything with the same shape as type `T` is a `T`. - // For the classes exported by `cloudflare:workers` we want *nominal* typing (i.e. we only want to - // accept `WorkerEntrypoint` from `cloudflare:workers`, not any other class with the same shape) - export const __RPC_STUB_BRAND: "__RPC_STUB_BRAND"; - export const __RPC_TARGET_BRAND: "__RPC_TARGET_BRAND"; - export const __WORKER_ENTRYPOINT_BRAND: "__WORKER_ENTRYPOINT_BRAND"; - export const __DURABLE_OBJECT_BRAND: "__DURABLE_OBJECT_BRAND"; - export const __WORKFLOW_ENTRYPOINT_BRAND: "__WORKFLOW_ENTRYPOINT_BRAND"; - export interface RpcTargetBranded { - [__RPC_TARGET_BRAND]: never; - } - export interface WorkerEntrypointBranded { - [__WORKER_ENTRYPOINT_BRAND]: never; - } - export interface DurableObjectBranded { - [__DURABLE_OBJECT_BRAND]: never; - } - export interface WorkflowEntrypointBranded { - [__WORKFLOW_ENTRYPOINT_BRAND]: never; - } - export type EntrypointBranded = WorkerEntrypointBranded | DurableObjectBranded | WorkflowEntrypointBranded; - // Types that can be used through `Stub`s - export type Stubable = RpcTargetBranded | ((...args: any[]) => any); - // Types that can be passed over RPC - // The reason for using a generic type here is to build a serializable subset of structured - // cloneable composite types. This allows types defined with the "interface" keyword to pass the - // serializable check as well. Otherwise, only types defined with the "type" keyword would pass. - type Serializable = - // Structured cloneables - | BaseType - // Structured cloneable composites - | Map< - T extends Map ? Serializable : never, - T extends Map ? Serializable : never - > - | Set ? Serializable : never> - | ReadonlyArray ? Serializable : never> - | { - [K in keyof T]: K extends number | string ? Serializable : never; - } - // Special types - | Stub - // Serialized as stubs, see `Stubify` - | Stubable; - // Base type for all RPC stubs, including common memory management methods. - // `T` is used as a marker type for unwrapping `Stub`s later. - interface StubBase extends Disposable { - [__RPC_STUB_BRAND]: T; - dup(): this; - } - export type Stub = Provider & StubBase; - // This represents all the types that can be sent as-is over an RPC boundary - type BaseType = - | void - | undefined - | null - | boolean - | number - | bigint - | string - | TypedArray - | ArrayBuffer - | DataView - | Date - | Error - | RegExp - | ReadableStream - | WritableStream - | Request - | Response - | Headers; - // Recursively rewrite all `Stubable` types with `Stub`s - // prettier-ignore - type Stubify = T extends Stubable ? Stub : T extends Map ? Map, Stubify> : T extends Set ? Set> : T extends Array ? Array> : T extends ReadonlyArray ? ReadonlyArray> : T extends BaseType ? T : T extends { - [key: string | number]: any; - } ? { - [K in keyof T]: Stubify; - } : T; - // Recursively rewrite all `Stub`s with the corresponding `T`s. - // Note we use `StubBase` instead of `Stub` here to avoid circular dependencies: - // `Stub` depends on `Provider`, which depends on `Unstubify`, which would depend on `Stub`. - // prettier-ignore - type Unstubify = T extends StubBase ? V : T extends Map ? Map, Unstubify> : T extends Set ? Set> : T extends Array ? Array> : T extends ReadonlyArray ? ReadonlyArray> : T extends BaseType ? T : T extends { - [key: string | number]: unknown; - } ? { - [K in keyof T]: Unstubify; - } : T; - type UnstubifyAll = { - [I in keyof A]: Unstubify; - }; - // Utility type for adding `Provider`/`Disposable`s to `object` types only. - // Note `unknown & T` is equivalent to `T`. - type MaybeProvider = T extends object ? Provider : unknown; - type MaybeDisposable = T extends object ? Disposable : unknown; - // Type for method return or property on an RPC interface. - // - Stubable types are replaced by stubs. - // - Serializable types are passed by value, with stubable types replaced by stubs - // and a top-level `Disposer`. - // Everything else can't be passed over PRC. - // Technically, we use custom thenables here, but they quack like `Promise`s. - // Intersecting with `(Maybe)Provider` allows pipelining. - // prettier-ignore - type Result = R extends Stubable ? Promise> & Provider : R extends Serializable ? Promise & MaybeDisposable> & MaybeProvider : never; - // Type for method or property on an RPC interface. - // For methods, unwrap `Stub`s in parameters, and rewrite returns to be `Result`s. - // Unwrapping `Stub`s allows calling with `Stubable` arguments. - // For properties, rewrite types to be `Result`s. - // In each case, unwrap `Promise`s. - type MethodOrProperty = V extends (...args: infer P) => infer R - ? (...args: UnstubifyAll

) => Result> - : Result>; - // Type for the callable part of an `Provider` if `T` is callable. - // This is intersected with methods/properties. - type MaybeCallableProvider = T extends (...args: any[]) => any ? MethodOrProperty : unknown; - // Base type for all other types providing RPC-like interfaces. - // Rewrites all methods/properties to be `MethodOrProperty`s, while preserving callable types. - // `Reserved` names (e.g. stub method names like `dup()`) and symbols can't be accessed over RPC. - export type Provider = MaybeCallableProvider & { - [K in Exclude>]: MethodOrProperty; - }; -} -declare namespace Cloudflare { - interface Env {} -} -declare module "cloudflare:workers" { - export type RpcStub = Rpc.Stub; - export const RpcStub: { - new (value: T): Rpc.Stub; - }; - export abstract class RpcTarget implements Rpc.RpcTargetBranded { - [Rpc.__RPC_TARGET_BRAND]: never; - } - // `protected` fields don't appear in `keyof`s, so can't be accessed over RPC - export abstract class WorkerEntrypoint implements Rpc.WorkerEntrypointBranded { - [Rpc.__WORKER_ENTRYPOINT_BRAND]: never; - protected ctx: ExecutionContext; - protected env: Env; - constructor(ctx: ExecutionContext, env: Env); - fetch?(request: Request): Response | Promise; - tail?(events: TraceItem[]): void | Promise; - trace?(traces: TraceItem[]): void | Promise; - scheduled?(controller: ScheduledController): void | Promise; - queue?(batch: MessageBatch): void | Promise; - test?(controller: TestController): void | Promise; - } - export abstract class DurableObject implements Rpc.DurableObjectBranded { - [Rpc.__DURABLE_OBJECT_BRAND]: never; - protected ctx: DurableObjectState; - protected env: Env; - constructor(ctx: DurableObjectState, env: Env); - fetch?(request: Request): Response | Promise; - alarm?(alarmInfo?: AlarmInvocationInfo): void | Promise; - webSocketMessage?(ws: WebSocket, message: string | ArrayBuffer): void | Promise; - webSocketClose?(ws: WebSocket, code: number, reason: string, wasClean: boolean): void | Promise; - webSocketError?(ws: WebSocket, error: unknown): void | Promise; - } - export type WorkflowDurationLabel = "second" | "minute" | "hour" | "day" | "week" | "month" | "year"; - export type WorkflowSleepDuration = `${number} ${WorkflowDurationLabel}${"s" | ""}` | number; - export type WorkflowDelayDuration = WorkflowSleepDuration; - export type WorkflowTimeoutDuration = WorkflowSleepDuration; - export type WorkflowBackoff = "constant" | "linear" | "exponential"; - export type WorkflowStepConfig = { - retries?: { - limit: number; - delay: WorkflowDelayDuration | number; - backoff?: WorkflowBackoff; - }; - timeout?: WorkflowTimeoutDuration | number; - }; - export type WorkflowEvent = { - payload: Readonly; - timestamp: Date; - instanceId: string; - }; - export type WorkflowStepEvent = { - payload: Readonly; - timestamp: Date; - type: string; - }; - export abstract class WorkflowStep { - do>(name: string, callback: () => Promise): Promise; - do>( - name: string, - config: WorkflowStepConfig, - callback: () => Promise - ): Promise; - sleep: (name: string, duration: WorkflowSleepDuration) => Promise; - sleepUntil: (name: string, timestamp: Date | number) => Promise; - waitForEvent>( - name: string, - options: { - type: string; - timeout?: WorkflowTimeoutDuration | number; - } - ): Promise>; - } - export abstract class WorkflowEntrypoint | unknown = unknown> - implements Rpc.WorkflowEntrypointBranded - { - [Rpc.__WORKFLOW_ENTRYPOINT_BRAND]: never; - protected ctx: ExecutionContext; - protected env: Env; - constructor(ctx: ExecutionContext, env: Env); - run(event: Readonly>, step: WorkflowStep): Promise; - } - export const env: Cloudflare.Env; -} -interface SecretsStoreSecret { - /** - * Get a secret from the Secrets Store, returning a string of the secret value - * if it exists, or throws an error if it does not exist - */ - get(): Promise; -} -declare module "cloudflare:sockets" { - function _connect(address: string | SocketAddress, options?: SocketOptions): Socket; - export { _connect as connect }; -} -declare namespace TailStream { - interface Header { - readonly name: string; - readonly value: string; - } - interface FetchEventInfo { - readonly type: "fetch"; - readonly method: string; - readonly url: string; - readonly cfJson: string; - readonly headers: Header[]; - } - interface JsRpcEventInfo { - readonly type: "jsrpc"; - readonly methodName: string; - } - interface ScheduledEventInfo { - readonly type: "scheduled"; - readonly scheduledTime: Date; - readonly cron: string; - } - interface AlarmEventInfo { - readonly type: "alarm"; - readonly scheduledTime: Date; - } - interface QueueEventInfo { - readonly type: "queue"; - readonly queueName: string; - readonly batchSize: number; - } - interface EmailEventInfo { - readonly type: "email"; - readonly mailFrom: string; - readonly rcptTo: string; - readonly rawSize: number; - } - interface TraceEventInfo { - readonly type: "trace"; - readonly traces: (string | null)[]; - } - interface HibernatableWebSocketEventInfoMessage { - readonly type: "message"; - } - interface HibernatableWebSocketEventInfoError { - readonly type: "error"; - } - interface HibernatableWebSocketEventInfoClose { - readonly type: "close"; - readonly code: number; - readonly wasClean: boolean; - } - interface HibernatableWebSocketEventInfo { - readonly type: "hibernatableWebSocket"; - readonly info: - | HibernatableWebSocketEventInfoClose - | HibernatableWebSocketEventInfoError - | HibernatableWebSocketEventInfoMessage; - } - interface Resume { - readonly type: "resume"; - readonly attachment?: any; - } - interface CustomEventInfo { - readonly type: "custom"; - } - interface FetchResponseInfo { - readonly type: "fetch"; - readonly statusCode: number; - } - type EventOutcome = - | "ok" - | "canceled" - | "exception" - | "unknown" - | "killSwitch" - | "daemonDown" - | "exceededCpu" - | "exceededMemory" - | "loadShed" - | "responseStreamDisconnected" - | "scriptNotFound"; - interface ScriptVersion { - readonly id: string; - readonly tag?: string; - readonly message?: string; - } - interface Trigger { - readonly traceId: string; - readonly invocationId: string; - readonly spanId: string; - } - interface Onset { - readonly type: "onset"; - readonly dispatchNamespace?: string; - readonly entrypoint?: string; - readonly scriptName?: string; - readonly scriptTags?: string[]; - readonly scriptVersion?: ScriptVersion; - readonly trigger?: Trigger; - readonly info: - | FetchEventInfo - | JsRpcEventInfo - | ScheduledEventInfo - | AlarmEventInfo - | QueueEventInfo - | EmailEventInfo - | TraceEventInfo - | HibernatableWebSocketEventInfo - | Resume - | CustomEventInfo; - } - interface Outcome { - readonly type: "outcome"; - readonly outcome: EventOutcome; - readonly cpuTime: number; - readonly wallTime: number; - } - interface Hibernate { - readonly type: "hibernate"; - } - interface SpanOpen { - readonly type: "spanOpen"; - readonly op?: string; - readonly info?: FetchEventInfo | JsRpcEventInfo | Attribute[]; - } - interface SpanClose { - readonly type: "spanClose"; - readonly outcome: EventOutcome; - } - interface DiagnosticChannelEvent { - readonly type: "diagnosticChannel"; - readonly channel: string; - readonly message: any; - } - interface Exception { - readonly type: "exception"; - readonly name: string; - readonly message: string; - readonly stack?: string; - } - interface Log { - readonly type: "log"; - readonly level: "debug" | "error" | "info" | "log" | "warn"; - readonly message: string; - } - interface Return { - readonly type: "return"; - readonly info?: FetchResponseInfo | Attribute[]; - } - interface Link { - readonly type: "link"; - readonly label?: string; - readonly traceId: string; - readonly invocationId: string; - readonly spanId: string; - } - interface Attribute { - readonly type: "attribute"; - readonly name: string; - readonly value: string | string[] | boolean | boolean[] | number | number[]; - } - type Mark = DiagnosticChannelEvent | Exception | Log | Return | Link | Attribute[]; - interface TailEvent { - readonly traceId: string; - readonly invocationId: string; - readonly spanId: string; - readonly timestamp: Date; - readonly sequence: number; - readonly event: Onset | Outcome | Hibernate | SpanOpen | SpanClose | Mark; - } - type TailEventHandler = (event: TailEvent) => void | Promise; - type TailEventHandlerName = - | "onset" - | "outcome" - | "hibernate" - | "spanOpen" - | "spanClose" - | "diagnosticChannel" - | "exception" - | "log" - | "return" - | "link" - | "attribute"; - type TailEventHandlerObject = Record; - type TailEventHandlerType = TailEventHandler | TailEventHandlerObject; -} -// Copyright (c) 2022-2023 Cloudflare, Inc. -// Licensed under the Apache 2.0 license found in the LICENSE file or at: -// https://opensource.org/licenses/Apache-2.0 -/** - * Data types supported for holding vector metadata. - */ -type VectorizeVectorMetadataValue = string | number | boolean | string[]; -/** - * Additional information to associate with a vector. - */ -type VectorizeVectorMetadata = VectorizeVectorMetadataValue | Record; -type VectorFloatArray = Float32Array | Float64Array; -interface VectorizeError { - code?: number; - error: string; -} -/** - * Comparison logic/operation to use for metadata filtering. - * - * This list is expected to grow as support for more operations are released. - */ -type VectorizeVectorMetadataFilterOp = "$eq" | "$ne"; -/** - * Filter criteria for vector metadata used to limit the retrieved query result set. - */ -type VectorizeVectorMetadataFilter = { - [field: string]: - | Exclude - | null - | { - [Op in VectorizeVectorMetadataFilterOp]?: Exclude | null; - }; -}; -/** - * Supported distance metrics for an index. - * Distance metrics determine how other "similar" vectors are determined. - */ -type VectorizeDistanceMetric = "euclidean" | "cosine" | "dot-product"; -/** - * Metadata return levels for a Vectorize query. - * - * Default to "none". - * - * @property all Full metadata for the vector return set, including all fields (including those un-indexed) without truncation. This is a more expensive retrieval, as it requires additional fetching & reading of un-indexed data. - * @property indexed Return all metadata fields configured for indexing in the vector return set. This level of retrieval is "free" in that no additional overhead is incurred returning this data. However, note that indexed metadata is subject to truncation (especially for larger strings). - * @property none No indexed metadata will be returned. - */ -type VectorizeMetadataRetrievalLevel = "all" | "indexed" | "none"; -interface VectorizeQueryOptions { - topK?: number; - namespace?: string; - returnValues?: boolean; - returnMetadata?: boolean | VectorizeMetadataRetrievalLevel; - filter?: VectorizeVectorMetadataFilter; -} -/** - * Information about the configuration of an index. - */ -type VectorizeIndexConfig = - | { - dimensions: number; - metric: VectorizeDistanceMetric; - } - | { - preset: string; // keep this generic, as we'll be adding more presets in the future and this is only in a read capacity - }; -/** - * Metadata about an existing index. - * - * This type is exclusively for the Vectorize **beta** and will be deprecated once Vectorize RC is released. - * See {@link VectorizeIndexInfo} for its post-beta equivalent. - */ -interface VectorizeIndexDetails { - /** The unique ID of the index */ - readonly id: string; - /** The name of the index. */ - name: string; - /** (optional) A human readable description for the index. */ - description?: string; - /** The index configuration, including the dimension size and distance metric. */ - config: VectorizeIndexConfig; - /** The number of records containing vectors within the index. */ - vectorsCount: number; -} -/** - * Metadata about an existing index. - */ -interface VectorizeIndexInfo { - /** The number of records containing vectors within the index. */ - vectorCount: number; - /** Number of dimensions the index has been configured for. */ - dimensions: number; - /** ISO 8601 datetime of the last processed mutation on in the index. All changes before this mutation will be reflected in the index state. */ - processedUpToDatetime: number; - /** UUIDv4 of the last mutation processed by the index. All changes before this mutation will be reflected in the index state. */ - processedUpToMutation: number; -} -/** - * Represents a single vector value set along with its associated metadata. - */ -interface VectorizeVector { - /** The ID for the vector. This can be user-defined, and must be unique. It should uniquely identify the object, and is best set based on the ID of what the vector represents. */ - id: string; - /** The vector values */ - values: VectorFloatArray | number[]; - /** The namespace this vector belongs to. */ - namespace?: string; - /** Metadata associated with the vector. Includes the values of other fields and potentially additional details. */ - metadata?: Record; -} -/** - * Represents a matched vector for a query along with its score and (if specified) the matching vector information. - */ -type VectorizeMatch = Pick, "values"> & - Omit & { - /** The score or rank for similarity, when returned as a result */ - score: number; - }; -/** - * A set of matching {@link VectorizeMatch} for a particular query. - */ -interface VectorizeMatches { - matches: VectorizeMatch[]; - count: number; -} -/** - * Results of an operation that performed a mutation on a set of vectors. - * Here, `ids` is a list of vectors that were successfully processed. - * - * This type is exclusively for the Vectorize **beta** and will be deprecated once Vectorize RC is released. - * See {@link VectorizeAsyncMutation} for its post-beta equivalent. - */ -interface VectorizeVectorMutation { - /* List of ids of vectors that were successfully processed. */ - ids: string[]; - /* Total count of the number of processed vectors. */ - count: number; -} -/** - * Result type indicating a mutation on the Vectorize Index. - * Actual mutations are processed async where the `mutationId` is the unique identifier for the operation. - */ -interface VectorizeAsyncMutation { - /** The unique identifier for the async mutation operation containing the changeset. */ - mutationId: string; -} -/** - * A Vectorize Vector Search Index for querying vectors/embeddings. - * - * This type is exclusively for the Vectorize **beta** and will be deprecated once Vectorize RC is released. - * See {@link Vectorize} for its new implementation. - */ -declare abstract class VectorizeIndex { - /** - * Get information about the currently bound index. - * @returns A promise that resolves with information about the current index. - */ - public describe(): Promise; - /** - * Use the provided vector to perform a similarity search across the index. - * @param vector Input vector that will be used to drive the similarity search. - * @param options Configuration options to massage the returned data. - * @returns A promise that resolves with matched and scored vectors. - */ - public query( - vector: VectorFloatArray | number[], - options?: VectorizeQueryOptions - ): Promise; - /** - * Insert a list of vectors into the index dataset. If a provided id exists, an error will be thrown. - * @param vectors List of vectors that will be inserted. - * @returns A promise that resolves with the ids & count of records that were successfully processed. - */ - public insert(vectors: VectorizeVector[]): Promise; - /** - * Upsert a list of vectors into the index dataset. If a provided id exists, it will be replaced with the new values. - * @param vectors List of vectors that will be upserted. - * @returns A promise that resolves with the ids & count of records that were successfully processed. - */ - public upsert(vectors: VectorizeVector[]): Promise; - /** - * Delete a list of vectors with a matching id. - * @param ids List of vector ids that should be deleted. - * @returns A promise that resolves with the ids & count of records that were successfully processed (and thus deleted). - */ - public deleteByIds(ids: string[]): Promise; - /** - * Get a list of vectors with a matching id. - * @param ids List of vector ids that should be returned. - * @returns A promise that resolves with the raw unscored vectors matching the id set. - */ - public getByIds(ids: string[]): Promise; -} -/** - * A Vectorize Vector Search Index for querying vectors/embeddings. - * - * Mutations in this version are async, returning a mutation id. - */ -declare abstract class Vectorize { - /** - * Get information about the currently bound index. - * @returns A promise that resolves with information about the current index. - */ - public describe(): Promise; - /** - * Use the provided vector to perform a similarity search across the index. - * @param vector Input vector that will be used to drive the similarity search. - * @param options Configuration options to massage the returned data. - * @returns A promise that resolves with matched and scored vectors. - */ - public query( - vector: VectorFloatArray | number[], - options?: VectorizeQueryOptions - ): Promise; - /** - * Use the provided vector-id to perform a similarity search across the index. - * @param vectorId Id for a vector in the index against which the index should be queried. - * @param options Configuration options to massage the returned data. - * @returns A promise that resolves with matched and scored vectors. - */ - public queryById(vectorId: string, options?: VectorizeQueryOptions): Promise; - /** - * Insert a list of vectors into the index dataset. If a provided id exists, an error will be thrown. - * @param vectors List of vectors that will be inserted. - * @returns A promise that resolves with a unique identifier of a mutation containing the insert changeset. - */ - public insert(vectors: VectorizeVector[]): Promise; - /** - * Upsert a list of vectors into the index dataset. If a provided id exists, it will be replaced with the new values. - * @param vectors List of vectors that will be upserted. - * @returns A promise that resolves with a unique identifier of a mutation containing the upsert changeset. - */ - public upsert(vectors: VectorizeVector[]): Promise; - /** - * Delete a list of vectors with a matching id. - * @param ids List of vector ids that should be deleted. - * @returns A promise that resolves with a unique identifier of a mutation containing the delete changeset. - */ - public deleteByIds(ids: string[]): Promise; - /** - * Get a list of vectors with a matching id. - * @param ids List of vector ids that should be returned. - * @returns A promise that resolves with the raw unscored vectors matching the id set. - */ - public getByIds(ids: string[]): Promise; -} -/** - * The interface for "version_metadata" binding - * providing metadata about the Worker Version using this binding. - */ -type WorkerVersionMetadata = { - /** The ID of the Worker Version using this binding */ - id: string; - /** The tag of the Worker Version using this binding */ - tag: string; - /** The timestamp of when the Worker Version was uploaded */ - timestamp: string; -}; -interface DynamicDispatchLimits { - /** - * Limit CPU time in milliseconds. - */ - cpuMs?: number; - /** - * Limit number of subrequests. - */ - subRequests?: number; -} -interface DynamicDispatchOptions { - /** - * Limit resources of invoked Worker script. - */ - limits?: DynamicDispatchLimits; - /** - * Arguments for outbound Worker script, if configured. - */ - outbound?: { - [key: string]: any; - }; -} -interface DispatchNamespace { - /** - * @param name Name of the Worker script. - * @param args Arguments to Worker script. - * @param options Options for Dynamic Dispatch invocation. - * @returns A Fetcher object that allows you to send requests to the Worker script. - * @throws If the Worker script does not exist in this dispatch namespace, an error will be thrown. - */ - get( - name: string, - args?: { - [key: string]: any; - }, - options?: DynamicDispatchOptions - ): Fetcher; -} -declare module "cloudflare:workflows" { - /** - * NonRetryableError allows for a user to throw a fatal error - * that makes a Workflow instance fail immediately without triggering a retry - */ - export class NonRetryableError extends Error { - public constructor(message: string, name?: string); - } -} -declare abstract class Workflow { - /** - * Get a handle to an existing instance of the Workflow. - * @param id Id for the instance of this Workflow - * @returns A promise that resolves with a handle for the Instance - */ - public get(id: string): Promise; - /** - * Create a new instance and return a handle to it. If a provided id exists, an error will be thrown. - * @param options Options when creating an instance including id and params - * @returns A promise that resolves with a handle for the Instance - */ - public create(options?: WorkflowInstanceCreateOptions): Promise; - /** - * Create a batch of instances and return handle for all of them. If a provided id exists, an error will be thrown. - * `createBatch` is limited at 100 instances at a time or when the RPC limit for the batch (1MiB) is reached. - * @param batch List of Options when creating an instance including name and params - * @returns A promise that resolves with a list of handles for the created instances. - */ - public createBatch(batch: WorkflowInstanceCreateOptions[]): Promise; -} -interface WorkflowInstanceCreateOptions { - /** - * An id for your Workflow instance. Must be unique within the Workflow. - */ - id?: string; - /** - * The event payload the Workflow instance is triggered with - */ - params?: PARAMS; -} -type InstanceStatus = { - status: - | "queued" // means that instance is waiting to be started (see concurrency limits) - | "running" - | "paused" - | "errored" - | "terminated" // user terminated the instance while it was running - | "complete" - | "waiting" // instance is hibernating and waiting for sleep or event to finish - | "waitingForPause" // instance is finishing the current work to pause - | "unknown"; - error?: string; - output?: object; -}; -interface WorkflowError { - code?: number; - message: string; -} -declare abstract class WorkflowInstance { - public id: string; - /** - * Pause the instance. - */ - public pause(): Promise; - /** - * Resume the instance. If it is already running, an error will be thrown. - */ - public resume(): Promise; - /** - * Terminate the instance. If it is errored, terminated or complete, an error will be thrown. - */ - public terminate(): Promise; - /** - * Restart the instance. - */ - public restart(): Promise; - /** - * Returns the current status of the instance. - */ - public status(): Promise; - /** - * Send an event to this instance. - */ - public sendEvent({ type, payload }: { type: string; payload: unknown }): Promise; -} diff --git a/examples-cloudflare/playground14/worker.ts b/examples-cloudflare/playground14/worker.ts deleted file mode 100644 index daaa81c3..00000000 --- a/examples-cloudflare/playground14/worker.ts +++ /dev/null @@ -1,21 +0,0 @@ -// @ts-ignore `.open-next/worker.ts` is generated at build time -import { default as handler } from "./.open-next/worker.js"; - -export default { - fetch: handler.fetch, - - /** - * Scheduled Handler - * - * Can be tested with: - * - `wrangler dev --test-scheduled` - * - `curl "http://localhost:8787/__scheduled?cron=*+*+*+*+*"` - * @param event - */ - async scheduled(event) { - console.log("Scheduled event", event); - }, -} satisfies ExportedHandler; - -// @ts-ignore `.open-next/worker.ts` is generated at build time -export { DOQueueHandler, DOShardedTagCache } from "./.open-next/worker.js"; diff --git a/examples-cloudflare/playground14/wrangler.jsonc b/examples-cloudflare/playground14/wrangler.jsonc deleted file mode 100644 index aa2a649f..00000000 --- a/examples-cloudflare/playground14/wrangler.jsonc +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "node_modules/wrangler/config-schema.json", - "main": "worker.ts", - "name": "playground14", - "compatibility_date": "2024-12-30", - "compatibility_flags": ["nodejs_compat", "global_fetch_strictly_public"], - "assets": { - "directory": ".open-next/assets", - "binding": "ASSETS" - }, - "kv_namespaces": [ - { - "binding": "NEXT_INC_CACHE_KV", - "id": "" - } - ], - "vars": { - "hello": "Hello World from the cloudflare context!", - "PROCESS_ENV_VAR": "process.env", - "NEXT_INC_CACHE_KV_PREFIX": "custom_prefix" - }, - "images": { - "binding": "IMAGES" - } -} diff --git a/examples-cloudflare/playground15/.dev.vars b/examples-cloudflare/playground15/.dev.vars deleted file mode 100644 index 17f2dcc2..00000000 --- a/examples-cloudflare/playground15/.dev.vars +++ /dev/null @@ -1 +0,0 @@ -NEXTJS_ENV=development \ No newline at end of file diff --git a/examples-cloudflare/playground15/.env.development b/examples-cloudflare/playground15/.env.development deleted file mode 100644 index 7eeb777a..00000000 --- a/examples-cloudflare/playground15/.env.development +++ /dev/null @@ -1 +0,0 @@ -TEST_ENV_VAR=TEST_VALUE \ No newline at end of file diff --git a/examples-cloudflare/playground15/.gitignore b/examples-cloudflare/playground15/.gitignore deleted file mode 100644 index 3a282111..00000000 --- a/examples-cloudflare/playground15/.gitignore +++ /dev/null @@ -1,45 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js -.yarn/install-state.gz - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env*.local - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts - -# wrangler -.wrangler - -# playwright -/test-results/ -/playwright-report/ -/blob-report/ -/playwright/.cache/ diff --git a/examples-cloudflare/playground15/app/api/buildid/route.ts b/examples-cloudflare/playground15/app/api/buildid/route.ts deleted file mode 100644 index aa60bb24..00000000 --- a/examples-cloudflare/playground15/app/api/buildid/route.ts +++ /dev/null @@ -1,9 +0,0 @@ -// Use headers to force a dynamic response -import { headers } from "next/headers"; - -export async function GET() { - const nextConfig = process.env.__NEXT_PRIVATE_STANDALONE_CONFIG - ? JSON.parse(process.env.__NEXT_PRIVATE_STANDALONE_CONFIG) - : undefined; - return Response.json({ nextConfig, headers: await headers() }); -} diff --git a/examples-cloudflare/playground15/app/api/cloudflare/route.ts b/examples-cloudflare/playground15/app/api/cloudflare/route.ts deleted file mode 100644 index 739737ca..00000000 --- a/examples-cloudflare/playground15/app/api/cloudflare/route.ts +++ /dev/null @@ -1,17 +0,0 @@ -import module from "node:module"; - -export const dynamic = "force-dynamic"; - -export async function GET() { - if (globalThis.Cloudflare) { - // Importing `cloudflare:*` does not work in dev (using `next dev`) because the Node runtime is used there. - // Then you should avoid it to write portable code. - // To access `env` and bindings, using `getCloudflareContext()` is the preferred way. - // See https://opennext.js.org/cloudflare/bindings - const req = module.createRequire("file:///"); - const { env } = req("cloudflare:workers"); - return Response.json({ cloudflare: true, env }); - } - - return Response.json({ cloudflare: false }); -} diff --git a/examples-cloudflare/playground15/app/api/env/route.ts b/examples-cloudflare/playground15/app/api/env/route.ts deleted file mode 100644 index 3d80e805..00000000 --- a/examples-cloudflare/playground15/app/api/env/route.ts +++ /dev/null @@ -1,10 +0,0 @@ -// This test relies on using `.dev.vars` to set the environment to `development` -// However `next build` is not passed an environment, so we do not want to cache -// the output. -export const dynamic = "force-dynamic"; - -export async function GET() { - return new Response(JSON.stringify(process.env, null, 2), { - headers: { "content-type": "application/json" }, - }); -} diff --git a/examples-cloudflare/playground15/app/api/hello/route.ts b/examples-cloudflare/playground15/app/api/hello/route.ts deleted file mode 100644 index 75da2ea7..00000000 --- a/examples-cloudflare/playground15/app/api/hello/route.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { getCloudflareContext } from "@opennextjs/cloudflare"; -import { headers } from "next/headers"; - -export async function GET() { - const headersList = await headers(); - - const fromCloudflareContext = headersList.has("from-cloudflare-context"); - - if (!fromCloudflareContext) { - return new Response("Hello World!"); - } - - // Retrieve the bindings defined in wrangler.json - return new Response(getCloudflareContext().env.hello); -} - -export async function POST(request: Request) { - const text = await request.text(); - return new Response(`Hello post-World! body=${text}`); -} diff --git a/examples-cloudflare/playground15/app/api/instrumentation/route.ts b/examples-cloudflare/playground15/app/api/instrumentation/route.ts deleted file mode 100644 index fd006c0a..00000000 --- a/examples-cloudflare/playground15/app/api/instrumentation/route.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NextResponse } from "next/server"; - -export function GET() { - return NextResponse.json({ - "nodejs-instrumentation-setup": globalThis["__NODEJS_INSTRUMENTATION_SETUP"], - "edge-instrumentation-setup": globalThis["__EDGE_INSTRUMENTATION_SETUP"], - }); -} diff --git a/examples-cloudflare/playground15/app/api/request/route.ts b/examples-cloudflare/playground15/app/api/request/route.ts deleted file mode 100644 index 277e4236..00000000 --- a/examples-cloudflare/playground15/app/api/request/route.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { NextRequest } from "next/server"; - -export const GET = (request: NextRequest) => { - return new Response(JSON.stringify({ nextUrl: request.nextUrl.href, url: request.url })); -}; diff --git a/examples-cloudflare/playground15/app/api/signal/abort/route.ts b/examples-cloudflare/playground15/app/api/signal/abort/route.ts deleted file mode 100644 index 97ac6ad2..00000000 --- a/examples-cloudflare/playground15/app/api/signal/abort/route.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { NextRequest, NextResponse } from "next/server"; - -export async function GET(request: NextRequest) { - const stream = new ReadableStream({ - async start(controller) { - request.signal.addEventListener("abort", async () => { - /** - * I was not allowed to `revalidatePath` or `revalidateTag` here. I would run into this error from Next: - * Error: Invariant: static generation store missing in revalidatePath - * - * Affected line: - * https://github.com/vercel/next.js/blob/ea08bf27/packages/next/src/server/web/spec-extension/revalidate.ts#L89-L92 - * - */ - const host = new URL(request.url).host; - // We need to set the protocol to http, cause in `wrangler dev` it will be https - await fetch(`http://${host}/api/signal/revalidate`); - - try { - controller.close(); - } catch (_) { - // Controller might already be closed, which is fine - // This does only happen in `next start` - } - }); - - let i = 0; - while (!request.signal.aborted) { - controller.enqueue(new TextEncoder().encode(`data: ${JSON.stringify({ number: i++ })}\n\n`)); - await new Promise((resolve) => setTimeout(resolve, 2_000)); - } - }, - }); - - return new NextResponse(stream, { - headers: { - "Content-Type": "text/event-stream", - "Cache-Control": "no-cache", - Connection: "keep-alive", - }, - }); -} diff --git a/examples-cloudflare/playground15/app/api/signal/revalidate/route.ts b/examples-cloudflare/playground15/app/api/signal/revalidate/route.ts deleted file mode 100644 index fc4de326..00000000 --- a/examples-cloudflare/playground15/app/api/signal/revalidate/route.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { revalidatePath } from "next/cache"; - -export const dynamic = "force-dynamic"; - -export async function GET() { - revalidatePath("/signal/"); - - return new Response("ok"); -} diff --git a/examples-cloudflare/playground15/app/from-app/page.tsx b/examples-cloudflare/playground15/app/from-app/page.tsx deleted file mode 100644 index 7a22c417..00000000 --- a/examples-cloudflare/playground15/app/from-app/page.tsx +++ /dev/null @@ -1,30 +0,0 @@ -"use client"; - -import Image from "next/image"; -import Link from "next/link"; - -import testImage from "../../public/test.jpg"; - -export default function Page() { - return ( - <> -

hello app

- test -

{process.env.NEXT_DEPLOYMENT_ID}

- - - - other app - - - ); -} diff --git a/examples-cloudflare/playground15/app/image/page.tsx b/examples-cloudflare/playground15/app/image/page.tsx deleted file mode 100644 index 7613f59c..00000000 --- a/examples-cloudflare/playground15/app/image/page.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import Image from "next/image"; - -import tomineImg from "../../public/tomine.webp"; - -export default function Page() { - return ( -
- Picture of Tomine -
- ); -} diff --git a/examples-cloudflare/playground15/app/isr/[id]/dynamic/page.tsx b/examples-cloudflare/playground15/app/isr/[id]/dynamic/page.tsx deleted file mode 100644 index 95883aad..00000000 --- a/examples-cloudflare/playground15/app/isr/[id]/dynamic/page.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { getPost } from "../../../../lib/posts"; - -// Imported from https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration -interface Post { - id: string; - title: string; - content: string; -} - -// Next.js will invalidate the cache when a -// request comes in, at most once every 1 hour. -export const revalidate = 3600; - -// We'll prerender only the params from `generateStaticParams` at build time. -// If a request comes in for a path that hasn't been generated, -// Next.js will server-render the page on-demand. -export const dynamicParams = true; - -export async function generateStaticParams() { - return [{ id: "1" }, { id: "2" }, { id: "3" }]; -} - -export default async function Page({ params }: { params: Promise<{ id: string }> }) { - const id = (await params).id; - const post: Post = await getPost({ id }).then((res) => res.json()); - return ( -
-

{post.title}

-

{post.content}

-
- ); -} diff --git a/examples-cloudflare/playground15/app/isr/[id]/no-dynamic/page.tsx b/examples-cloudflare/playground15/app/isr/[id]/no-dynamic/page.tsx deleted file mode 100644 index 8dbec2f1..00000000 --- a/examples-cloudflare/playground15/app/isr/[id]/no-dynamic/page.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { getPost } from "../../../../lib/posts"; - -// Imported from https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration -interface Post { - id: string; - title: string; - content: string; -} - -// Next.js will invalidate the cache when a -// request comes in, at most once every 1 hour. -export const revalidate = 3600; - -// We'll prerender only the params from `generateStaticParams` at build time. -// If a request comes in for a path that hasn't been generated, it will 404. -export const dynamicParams = false; - -export async function generateStaticParams() { - return [{ id: "1" }, { id: "2" }, { id: "3" }]; -} - -export default async function Page({ params }: { params: Promise<{ id: string }> }) { - const id = (await params).id; - const post: Post = await getPost({ id }).then((res) => res.json()); - return ( -
-

{post.title}

-

{post.content}

-
- ); -} diff --git a/examples-cloudflare/playground15/app/layout.js b/examples-cloudflare/playground15/app/layout.js deleted file mode 100644 index d3cded23..00000000 --- a/examples-cloudflare/playground15/app/layout.js +++ /dev/null @@ -1,12 +0,0 @@ -export const metadata = { - title: "API hello-world", - description: "a simple api hello-world app", -}; - -export default function RootLayout({ children }) { - return ( - - {children} - - ); -} diff --git a/examples-cloudflare/playground15/app/og/route.tsx b/examples-cloudflare/playground15/app/og/route.tsx deleted file mode 100644 index 97766095..00000000 --- a/examples-cloudflare/playground15/app/og/route.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { ImageResponse } from "next/og"; - -export const dynamic = "force-dynamic"; - -export async function GET() { - try { - return new ImageResponse( -
-
- Vercel -
-
- 'next/og' -
-
, - { - width: 1200, - height: 630, - } - ); - } catch (e: any) { - return new Response("Failed to generate the image", { - status: 500, - }); - } -} diff --git a/examples-cloudflare/playground15/app/other-app/page.tsx b/examples-cloudflare/playground15/app/other-app/page.tsx deleted file mode 100644 index 6863abf0..00000000 --- a/examples-cloudflare/playground15/app/other-app/page.tsx +++ /dev/null @@ -1,25 +0,0 @@ -"use client"; -import Image from "next/image"; - -import testImage from "../../public/test.jpg"; - -export default function Page() { - return ( - <> -

other app

- test -

{process.env.NEXT_DEPLOYMENT_ID}

- - - - ); -} diff --git a/examples-cloudflare/playground15/app/page.js b/examples-cloudflare/playground15/app/page.js deleted file mode 100644 index 081a8856..00000000 --- a/examples-cloudflare/playground15/app/page.js +++ /dev/null @@ -1,7 +0,0 @@ -export default function Home() { - return ( -
-

Test misc Next features

-
- ); -} diff --git a/examples-cloudflare/playground15/app/signal/_components/sse.tsx b/examples-cloudflare/playground15/app/signal/_components/sse.tsx deleted file mode 100644 index e3009f70..00000000 --- a/examples-cloudflare/playground15/app/signal/_components/sse.tsx +++ /dev/null @@ -1,63 +0,0 @@ -"use client"; - -import { useEffect, useRef, useState } from "react"; - -export default function SSE() { - const [events, setEvents] = useState([]); - const [start, setStart] = useState(false); - const eventSourceRef = useRef(null); - - useEffect(() => { - if (start) { - const e = new EventSource("/api/signal/abort"); - eventSourceRef.current = e; - - e.onmessage = (msg) => { - try { - const data = JSON.parse(msg.data); - setEvents((prev) => prev.concat(data)); - } catch (err) { - console.log("failed to parse: ", err, msg); - } - }; - } - - return () => { - if (eventSourceRef.current) { - eventSourceRef.current.close(); - eventSourceRef.current = null; - } - }; - }, [start]); - - const handleStart = () => { - setEvents([]); - setStart(true); - }; - - const handleClose = () => { - if (eventSourceRef.current) { - eventSourceRef.current.close(); - eventSourceRef.current = null; - } - setStart(false); - }; - - return ( -
-
- - -
- {events.map((e, i) => ( -
- Message {i}: {JSON.stringify(e)} -
- ))} -
- ); -} diff --git a/examples-cloudflare/playground15/app/signal/page.tsx b/examples-cloudflare/playground15/app/signal/page.tsx deleted file mode 100644 index 2ed51b57..00000000 --- a/examples-cloudflare/playground15/app/signal/page.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import SSE from "./_components/sse"; - -export const dynamic = "force-static"; - -export default function Page() { - const date = new Date().toISOString(); - - return ( -
-

{date}

- - -
- ); -} diff --git a/examples-cloudflare/playground15/data.js b/examples-cloudflare/playground15/data.js deleted file mode 100644 index 35d831de..00000000 --- a/examples-cloudflare/playground15/data.js +++ /dev/null @@ -1,6 +0,0 @@ -import styles from "./data.module.css"; - -export const data = { - now: Date.now(), - styles, -}; diff --git a/examples-cloudflare/playground15/data.module.css b/examples-cloudflare/playground15/data.module.css deleted file mode 100644 index 85649875..00000000 --- a/examples-cloudflare/playground15/data.module.css +++ /dev/null @@ -1,3 +0,0 @@ -.wrap { - display: flex; -} diff --git a/examples-cloudflare/playground15/e2e/base.spec.ts b/examples-cloudflare/playground15/e2e/base.spec.ts deleted file mode 100644 index 194c09f6..00000000 --- a/examples-cloudflare/playground15/e2e/base.spec.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { createHash } from "node:crypto"; -import type { BinaryLike } from "node:crypto"; - -import { test, expect } from "@playwright/test"; - -const OG_MD5 = "2f7b724d62d8c7739076da211aa62e7b"; - -export function validateMd5(data: Buffer, expectedHash: string) { - return ( - createHash("md5") - .update(data as BinaryLike) - .digest("hex") === expectedHash - ); -} - -test.describe("playground/base", () => { - test("index", async ({ page }) => { - await page.goto("/"); - await expect(page.getByText("Test misc Next features")).toBeVisible(); - }); - - test("the hello-world api GET route works as intended", async ({ page }) => { - const res = await page.request.get("/api/hello"); - expect(res.headers()["content-type"]).toContain("text/plain"); - expect(await res.text()).toEqual("Hello World!"); - }); - - test("returns a hello world string from the cloudflare context env", async ({ page }) => { - const res = await page.request.get("/api/hello", { - headers: { - "from-cloudflare-context": "true", - }, - }); - expect(res.headers()["content-type"]).toContain("text/plain"); - expect(await res.text()).toEqual("Hello World from the cloudflare context!"); - }); - - test("the hello-world api POST route works as intended", async ({ page }) => { - const res = await page.request.post("/api/hello", { data: "some body" }); - expect(res.headers()["content-type"]).toContain("text/plain"); - await expect(res.text()).resolves.toEqual("Hello post-World! body=some body"); - }); - - test("sets environment variables from the Next.js env file", async ({ page }) => { - const res = await page.request.get("/api/env"); - await expect(res.json()).resolves.toEqual(expect.objectContaining({ TEST_ENV_VAR: "TEST_VALUE" })); - }); - - test("returns correct information about the request from a route handler", async ({ page, baseURL }) => { - const res = await page.request.get("/api/request/"); - // Next.js can fall back to `localhost:3000` or `n` if it doesn't get the host - neither of these are expected. - const expectedURL = `${baseURL}/api/request/`; - await expect(res.json()).resolves.toEqual({ nextUrl: expectedURL, url: expectedURL }); - }); - - test.skip("generates an og image successfully", async ({ page }) => { - const res = await page.request.get("/og"); - expect(res.status()).toEqual(200); - expect(res.headers()["content-type"]).toEqual("image/png"); - expect(validateMd5(await res.body(), OG_MD5)).toEqual(true); - }); -}); diff --git a/examples-cloudflare/playground15/e2e/cloudflare.spec.ts b/examples-cloudflare/playground15/e2e/cloudflare.spec.ts deleted file mode 100644 index f465e9b3..00000000 --- a/examples-cloudflare/playground15/e2e/cloudflare.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Cloudflare specific tests. - * - * The tests in this file do not run on Node (`next dev`). - */ - -import { test, expect } from "@playwright/test"; - -test.describe("playground/cloudflare", () => { - test("NextConfig", async ({ page }) => { - const res = await page.request.get("/api/buildid"); - expect(res.status()).toEqual(200); - const { nextConfig } = await res.json(); - expect(nextConfig.output).toEqual("standalone"); - }); -}); - -test.describe("using cloudflare:* modules", () => { - test("NextConfig", async ({ page }) => { - const res = await page.request.get("/api/cloudflare"); - expect(res.status()).toEqual(200); - const { cloudflare, env } = await res.json(); - expect(cloudflare).toBe(true); - expect(env.NEXTJS_ENV).toEqual("development"); - expect(env.ASSETS).toBeDefined(); - }); -}); diff --git a/examples-cloudflare/playground15/e2e/head.spec.ts b/examples-cloudflare/playground15/e2e/head.spec.ts deleted file mode 100644 index 77d9fded..00000000 --- a/examples-cloudflare/playground15/e2e/head.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { test, expect } from "@playwright/test"; - -test.describe("head properly populated", () => { - test("should properly populate the ", async ({ page }) => { - await page.goto("/head"); - const title = await page.title(); - const description = await page.locator('meta[name="description"]').getAttribute("content"); - const favicon = await page.locator('link[rel="icon"]').getAttribute("href"); - expect(title).toBe("SSR Head"); - expect(description).toBe("SSR"); - expect(favicon).toBe("/favicon.ico"); - }); -}); diff --git a/examples-cloudflare/playground15/e2e/image.test.ts b/examples-cloudflare/playground15/e2e/image.test.ts deleted file mode 100644 index 46ed08c2..00000000 --- a/examples-cloudflare/playground15/e2e/image.test.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { test, expect } from "@playwright/test"; - -test.describe("next/image with trailing slash", () => { - test("next/image with trailing slash", async ({ page }) => { - await page.goto("/image"); - await expect(page.getByAltText("Picture of Tomine")).toBeVisible(); - // The trailing slash should only be there if trailingSlash is enabled in next.config.ts - expect(await page.getAttribute("img", "src")).toMatch(/^\/_next\/image\//); - }); -}); diff --git a/examples-cloudflare/playground15/e2e/instrumentation.spec.ts b/examples-cloudflare/playground15/e2e/instrumentation.spec.ts deleted file mode 100644 index 9ffc4fee..00000000 --- a/examples-cloudflare/playground15/e2e/instrumentation.spec.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { test, expect } from "@playwright/test"; - -test.describe("instrumentation", () => { - test("the instrumentation register hook should work for the nodejs runtime", async ({ page }) => { - const res = await page.request.get("/api/instrumentation"); - const respJson: Record = await res.json(); - expect(respJson["nodejs-instrumentation-setup"]).toEqual( - "this value has been set by calling the instrumentation `register` callback in the nodejs runtime" - ); - }); - - test("the instrumentation register hook should work for the edge runtime", async ({ page }) => { - const res = await page.request.get("/middleware-instrumentation"); - const respJson: Record = await res.json(); - expect(respJson["edge-instrumentation-setup"]).toEqual( - "this value has been set by calling the instrumentation `register` callback in the edge runtime" - ); - }); - - // Note: we cannot test this since currently both runtimes share the same global scope - // (see: https://github.com/opennextjs/opennextjs-cloudflare/issues/408) - test.describe.skip("isolation", () => { - test("the instrumentation register hook nodejs logic should not effect edge routes", async ({ page }) => { - const res = await page.request.get("/middleware-instrumentation"); - const respJson: Record = await res.json(); - expect(respJson["nodejs-instrumentation-setup"]).toBeUndefined(); - }); - - test("the instrumentation register hook edge logic should not effect nodejs routes", async ({ page }) => { - const res = await page.request.get("/api/instrumentation"); - const respJson: Record = await res.json(); - expect(respJson["edge-instrumentation-setup"]).toBeUndefined(); - }); - }); -}); diff --git a/examples-cloudflare/playground15/e2e/isr.spec.ts b/examples-cloudflare/playground15/e2e/isr.spec.ts deleted file mode 100644 index d71a3d66..00000000 --- a/examples-cloudflare/playground15/e2e/isr.spec.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { createHash } from "node:crypto"; -import type { BinaryLike } from "node:crypto"; - -import { test, expect, type APIResponse } from "@playwright/test"; - -test.describe("playground/isr", () => { - test("Generated pages exist", async ({ page }) => { - const generatedIds = [1, 2, 3]; - let res: APIResponse; - for (const id of generatedIds) { - res = await page.request.get(`/isr/${id}/dynamic`); - expect(res.status()).toBe(200); - res = await page.request.get(`/isr/${id}/no-dynamic`); - expect(res.status()).toBe(200); - } - }); - - test("Non generated pages 404 when dynamic is false", async ({ page }) => { - const generatedIds = [4, 5, 6]; - for (const id of generatedIds) { - const res = await page.request.get(`/isr/${id}/no-dynamic`); - expect(res.status()).toBe(404); - } - }); - - test("Non generated pages are generated when dynamic is true", async ({ page }) => { - const generatedIds = [4, 5, 6]; - for (const id of generatedIds) { - const res = await page.request.get(`/isr/${id}/dynamic`); - expect(res.status()).toBe(200); - } - }); -}); diff --git a/examples-cloudflare/playground15/e2e/playwright.config.ts b/examples-cloudflare/playground15/e2e/playwright.config.ts deleted file mode 100644 index 52d4691c..00000000 --- a/examples-cloudflare/playground15/e2e/playwright.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { configurePlaywright } from "../../common/config-e2e"; - -export default configurePlaywright("playground15"); diff --git a/examples-cloudflare/playground15/e2e/playwright.dev.config.ts b/examples-cloudflare/playground15/e2e/playwright.dev.config.ts deleted file mode 100644 index 47a2b3a7..00000000 --- a/examples-cloudflare/playground15/e2e/playwright.dev.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { configurePlaywright } from "../../common/config-e2e"; - -export default configurePlaywright("playground15", { - isWorker: false, -}); diff --git a/examples-cloudflare/playground15/e2e/signal.test.ts b/examples-cloudflare/playground15/e2e/signal.test.ts deleted file mode 100644 index 9e44c0aa..00000000 --- a/examples-cloudflare/playground15/e2e/signal.test.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { expect, test } from "@playwright/test"; - -test("Request Signal On Abort", async ({ page }) => { - // First, get the initial date - await page.goto("/signal"); - const initialDate = await page.getByTestId("date").textContent(); - expect(initialDate).toBeTruthy(); - - // Start the EventSource - await page.getByTestId("start-button").click(); - const msg0 = page.getByText(`Message 0: {"number":0}`); - await expect(msg0).toBeVisible(); - - // 2nd message shouldn't arrive yet - let msg1 = page.getByText(`Message 1: {"number":1}`); - await expect(msg1).not.toBeVisible(); - await page.waitForTimeout(2_000); - // 2nd message should arrive after 2s - msg1 = page.getByText(`Message 2: {"number":2}`); - await expect(msg1).toBeVisible(); - - // 3rd message shouldn't arrive yet - let msg3 = page.getByText(`Message 3: {"number":3}`); - await expect(msg3).not.toBeVisible(); - await page.waitForTimeout(2_000); - // 3rd message should arrive after 2s - msg3 = page.getByText(`Message 3: {"number":3}`); - await expect(msg3).toBeVisible(); - - // We then click the close button to close the EventSource and trigger the onabort eventz[] - await page.getByTestId("close-button").click(); - - // Wait for revalidation to finish - await page.waitForTimeout(4_000); - - // Check that the onabort event got emitted and revalidated the page from a fetch - await page.goto("/signal"); - const finalDate = await page.getByTestId("date").textContent(); - expect(finalDate).toBeTruthy(); - expect(new Date(finalDate!).getTime()).toBeGreaterThan(new Date(initialDate!).getTime()); -}); diff --git a/examples-cloudflare/playground15/instrumentation.js b/examples-cloudflare/playground15/instrumentation.js deleted file mode 100644 index 4dc19270..00000000 --- a/examples-cloudflare/playground15/instrumentation.js +++ /dev/null @@ -1,22 +0,0 @@ -export function register() { - // Note: we register instrumentation for both the nodejs and edge runtime, we do that using the NEXT_RUNTIME env - // variable as recommended in the official docs: - // https://nextjs.org/docs/app/building-your-application/optimizing/instrumentation#importing-runtime-specific-code - - const timeout = setTimeout(() => { - console.log("This is a delayed log from the instrumentation register callback"); - }, 0); - - if (process.env.NEXT_RUNTIME === "nodejs") { - globalThis["__NODEJS_INSTRUMENTATION_SETUP"] = - "this value has been set by calling the instrumentation `register` callback in the nodejs runtime"; - // This is to test that we have access to the node version of setTimeout - timeout.unref(); - clearTimeout(timeout); - } - - if (process.env.NEXT_RUNTIME === "edge") { - globalThis["__EDGE_INSTRUMENTATION_SETUP"] = - "this value has been set by calling the instrumentation `register` callback in the edge runtime"; - } -} diff --git a/examples-cloudflare/playground15/lib/posts.ts b/examples-cloudflare/playground15/lib/posts.ts deleted file mode 100644 index 410fc2b2..00000000 --- a/examples-cloudflare/playground15/lib/posts.ts +++ /dev/null @@ -1,53 +0,0 @@ -const posts = [ - { - id: 1, - title: "Lorem Ipsum - What Is It and How to Use It?", - content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ...", - author: "John Doe", - date: "2023-08-01", - category: "Technology", - }, - { - id: 2, - title: "The Benefits of Regular Exercise", - content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ...", - author: "Jane Smith", - date: "2023-07-25", - category: "Health & Fitness", - }, - { - id: 3, - title: "Mastering the Art of Cooking", - content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ...", - author: "Michael Johnson", - date: "2023-07-18", - category: "Food & Cooking", - }, - { - id: 4, - title: "Traveling on a Budget - Tips and Tricks", - content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ...", - author: "Emily Brown", - date: "2023-07-10", - category: "Travel", - }, - { - id: 5, - title: "The Rise of Artificial Intelligence in Modern Society", - content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ...", - author: "David Lee", - date: "2023-06-29", - category: "Technology", - }, - { - id: 6, - title: "10 Must-Read Books for Summer", - content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ...", - author: "Sarah Johnson", - date: "2023-06-21", - category: "Books", - }, -]; - -export const getPost = (opts: { id: string }) => - Promise.resolve(new Response(JSON.stringify(posts.find((p) => p.id === Number(opts.id))))); diff --git a/examples-cloudflare/playground15/middleware.js b/examples-cloudflare/playground15/middleware.js deleted file mode 100644 index 1b43c89c..00000000 --- a/examples-cloudflare/playground15/middleware.js +++ /dev/null @@ -1,12 +0,0 @@ -import { NextResponse } from "next/server"; - -export function middleware() { - return NextResponse.json({ - "nodejs-instrumentation-setup": globalThis["__NODEJS_INSTRUMENTATION_SETUP"], - "edge-instrumentation-setup": globalThis["__EDGE_INSTRUMENTATION_SETUP"], - }); -} - -export const config = { - matcher: ["/middleware-instrumentation"], -}; diff --git a/examples-cloudflare/playground15/next.config.ts b/examples-cloudflare/playground15/next.config.ts deleted file mode 100644 index fa7885f6..00000000 --- a/examples-cloudflare/playground15/next.config.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { initOpenNextCloudflareForDev, getDeploymentId } from "@opennextjs/cloudflare"; -import { NextConfig } from "next"; - -initOpenNextCloudflareForDev(); - -const nextConfig: NextConfig = { - typescript: { ignoreBuildErrors: true }, - eslint: { ignoreDuringBuilds: true }, - experimental: { - // Generate source map to validate the fix for opennextjs/opennextjs-cloudflare#341 - serverSourceMaps: true, - }, - deploymentId: getDeploymentId(), - trailingSlash: true, - images: { - formats: ["image/avif", "image/webp"], - }, -}; - -export default nextConfig; diff --git a/examples-cloudflare/playground15/open-next.config.ts b/examples-cloudflare/playground15/open-next.config.ts deleted file mode 100644 index 32fdca92..00000000 --- a/examples-cloudflare/playground15/open-next.config.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { defineCloudflareConfig, type OpenNextConfig } from "@opennextjs/cloudflare"; -import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache"; -import doQueue from "@opennextjs/cloudflare/overrides/queue/do-queue"; -import d1NextTagCache from "@opennextjs/cloudflare/overrides/tag-cache/d1-next-tag-cache"; - -export default { - ...defineCloudflareConfig({ - incrementalCache: r2IncrementalCache, - queue: doQueue, - tagCache: d1NextTagCache, - }), - cloudflare: { - skewProtection: { - enabled: false, - }, - }, -} satisfies OpenNextConfig; diff --git a/examples-cloudflare/playground15/package.json b/examples-cloudflare/playground15/package.json deleted file mode 100644 index 7adbde6d..00000000 --- a/examples-cloudflare/playground15/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "examples-cloudflare/playground15", - "version": "0.1.0", - "private": true, - "type": "module", - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint", - "build:worker": "pnpm opennextjs-cloudflare build", - "preview:worker": "pnpm opennextjs-cloudflare preview", - "preview": "pnpm build:worker && pnpm preview:worker", - "e2e": "playwright test -c e2e/playwright.config.ts", - "e2e:dev": "playwright test -c e2e/playwright.dev.config.ts", - "cf-typegen": "wrangler types --env-interface CloudflareEnv" - }, - "dependencies": { - "next": "^15.5.9", - "react": "^19.0.3", - "react-dom": "^19.0.3" - }, - "devDependencies": { - "@opennextjs/cloudflare": "workspace:*", - "@playwright/test": "catalog:", - "@types/node": "catalog:", - "wrangler": "catalog:" - } -} diff --git a/examples-cloudflare/playground15/pages/head.tsx b/examples-cloudflare/playground15/pages/head.tsx deleted file mode 100644 index acb1d483..00000000 --- a/examples-cloudflare/playground15/pages/head.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import Head from "next/head"; - -export function getServerSideProps() { - return { - props: { - time: new Date().toISOString(), - }, - }; -} -export default function Page({ time }) { - return ( -
- - SSR Head - - - -
- Time: {time} -
-
- ); -} diff --git a/examples-cloudflare/playground15/public/.gitkeep b/examples-cloudflare/playground15/public/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/examples-cloudflare/playground15/public/test.jpg b/examples-cloudflare/playground15/public/test.jpg deleted file mode 100644 index d536c882412ed3df0dc162823ca5146bcc033499..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6765 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 MmZ(v70;|9P0Aa?;NdN!< diff --git a/examples-cloudflare/playground15/tsconfig.json b/examples-cloudflare/playground15/tsconfig.json deleted file mode 100644 index 3d713558..00000000 --- a/examples-cloudflare/playground15/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "compilerOptions": { - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": false, - "noEmit": true, - "incremental": true, - "module": "esnext", - "esModuleInterop": true, - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "plugins": [ - { - "name": "next" - } - ], - "target": "ES2017", - "strictNullChecks": true - }, - "include": ["next-env.d.ts", ".next/types/**/*.ts", "**/*.ts", "**/*.tsx", "worker-configuration.d.ts"], - "exclude": ["node_modules", "open-next.config.ts"] -} diff --git a/examples-cloudflare/playground15/worker-configuration.d.ts b/examples-cloudflare/playground15/worker-configuration.d.ts deleted file mode 100644 index 4cba48a2..00000000 --- a/examples-cloudflare/playground15/worker-configuration.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -// Generated by Wrangler by running `wrangler types --env-interface CloudflareEnv` - -interface CloudflareEnv { - hello: "Hello World from the cloudflare context!"; -} diff --git a/examples-cloudflare/playground15/wrangler.jsonc b/examples-cloudflare/playground15/wrangler.jsonc deleted file mode 100644 index 1c6c3718..00000000 --- a/examples-cloudflare/playground15/wrangler.jsonc +++ /dev/null @@ -1,51 +0,0 @@ -{ - "$schema": "node_modules/wrangler/config-schema.json", - "main": ".open-next/worker.js", - "name": "playground15", - "compatibility_date": "2025-09-15", - "compatibility_flags": ["nodejs_compat", "global_fetch_strictly_public", "enable_request_signal"], - "assets": { - "directory": ".open-next/assets", - "binding": "ASSETS", - "run_worker_first": true - }, - "r2_buckets": [ - { - "binding": "NEXT_INC_CACHE_R2_BUCKET", - "bucket_name": "pg15" - } - ], - "vars": { - "hello": "Hello World from the cloudflare context!" - }, - "services": [ - { - "binding": "WORKER_SELF_REFERENCE", - "service": "playground15" - } - ], - "durable_objects": { - "bindings": [ - { - "name": "NEXT_CACHE_DO_QUEUE", - "class_name": "DOQueueHandler" - } - ] - }, - "migrations": [ - { - "tag": "v1", - "new_sqlite_classes": ["DOQueueHandler"] - } - ], - "d1_databases": [ - { - "binding": "NEXT_TAG_CACHE_D1", - "database_id": "db_id", - "database_name": "db_name" - } - ], - "images": { - "binding": "IMAGES" - } -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1f52f7a4..ce7e5b59 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -904,59 +904,6 @@ importers: specifier: 'catalog:' version: 4.60.0(@cloudflare/workers-types@4.20260123.0) - examples-cloudflare/playground14: - dependencies: - next: - specifier: ^14.2.35 - version: 14.2.35(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: - specifier: ^18.2.0 - version: 18.3.1 - react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) - devDependencies: - '@opennextjs/cloudflare': - specifier: workspace:* - version: link:../../packages/cloudflare - '@playwright/test': - specifier: 'catalog:' - version: 1.58.0 - '@types/node': - specifier: 'catalog:' - version: 22.19.7 - sharp: - specifier: ^0.34.5 - version: 0.34.5 - wrangler: - specifier: 'catalog:' - version: 4.60.0(@cloudflare/workers-types@4.20260123.0) - - examples-cloudflare/playground15: - dependencies: - next: - specifier: ^15.5.9 - version: 15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - react: - specifier: ^19.0.3 - version: 19.2.3 - react-dom: - specifier: ^19.0.3 - version: 19.2.3(react@19.2.3) - devDependencies: - '@opennextjs/cloudflare': - specifier: workspace:* - version: link:../../packages/cloudflare - '@playwright/test': - specifier: 'catalog:' - version: 1.58.0 - '@types/node': - specifier: 'catalog:' - version: 22.19.7 - wrangler: - specifier: 'catalog:' - version: 4.60.0(@cloudflare/workers-types@4.20260123.0) - examples-cloudflare/playground16: dependencies: next: @@ -1558,24 +1505,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@ast-grep/napi-linux-arm64-musl@0.40.0': resolution: {integrity: sha512-MS9qalLRjUnF2PCzuTKTvCMVSORYHxxe3Qa0+SSaVULsXRBmuy5C/b1FeWwMFnwNnC0uie3VDet31Zujwi8q6A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@ast-grep/napi-linux-x64-gnu@0.40.0': resolution: {integrity: sha512-BeHZVMNXhM3WV3XE2yghO0fRxhMOt8BTN972p5piYEQUvKeSHmS8oeGcs6Ahgx5znBclqqqq37ZfioYANiTqJA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@ast-grep/napi-linux-x64-musl@0.40.0': resolution: {integrity: sha512-rG1YujF7O+lszX8fd5u6qkFTuv4FwHXjWvt1CCvCxXwQLSY96LaCW88oVKg7WoEYQh54y++Fk57F+Wh9Gv9nVQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@ast-grep/napi-win32-arm64-msvc@0.40.0': resolution: {integrity: sha512-9SqmnQqd4zTEUk6yx0TuW2ycZZs2+e569O/R0QnhSiQNpgwiJCYOe/yPS0BC9HkiaozQm6jjAcasWpFtz/dp+w==} @@ -3704,155 +3655,183 @@ packages: resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm64@1.2.4': resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} @@ -4041,9 +4020,6 @@ packages: '@neon-rs/load@0.0.4': resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} - '@next/env@14.2.35': - resolution: {integrity: sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==} - '@next/env@15.0.0-canary.174': resolution: {integrity: sha512-2S0Jpc4yzsLq5xfIHknQob5k3ME9oI7syQH1fNJ3tv/HP1DVLmTWDRylPScLLUJGvOg7SEgnYK87P45cTNdfUQ==} @@ -4059,12 +4035,6 @@ packages: '@next/env@16.1.4': resolution: {integrity: sha512-gkrXnZyxPUy0Gg6SrPQPccbNVLSP3vmW8LU5dwEttEEC1RwDivk8w4O+sZIjFvPrSICXyhQDCG+y3VmjlJf+9A==} - '@next/swc-darwin-arm64@14.2.33': - resolution: {integrity: sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - '@next/swc-darwin-arm64@15.0.0-canary.174': resolution: {integrity: sha512-SrMhGOT4LUDhsM6VNMIp7ZziVPegQqAPlz1ft6C7XcNR7OODmLaYAL5NI4XA+rJTLma1XFTf2yhAb3psvoav6w==} engines: {node: '>= 10'} @@ -4095,12 +4065,6 @@ packages: cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@14.2.33': - resolution: {integrity: sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - '@next/swc-darwin-x64@15.0.0-canary.174': resolution: {integrity: sha512-ktmNJgLvXztYeec38Nr53pM5NSoDvdwX6j5tISnylNHdubg9hDQ7sqdLn9Xw+QLie8yZVp1A0STPECVDDVUjyA==} engines: {node: '>= 10'} @@ -4131,155 +4095,145 @@ packages: cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@14.2.33': - resolution: {integrity: sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - '@next/swc-linux-arm64-gnu@15.0.0-canary.174': resolution: {integrity: sha512-kVEibHYyQ12zzFPY+YHbYX9z81HhLVK5pQgt1NlFet2M0iBj1PxvOJuu6In1EEV7f3jNEr4r3gf5ieyY3ywnLw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-gnu@15.4.0-canary.14': resolution: {integrity: sha512-u/eeGK9okYiJ24aLcrq2jOCyOnjhzOM/MkcOOMkzE4/Rp7EKIepnGUhnIcLeLmcQw4RCDAjh3QZBqt5rQEm4fA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-gnu@15.5.7': resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-gnu@16.0.10': resolution: {integrity: sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-gnu@16.1.4': resolution: {integrity: sha512-POQ65+pnYOkZNdngWfMEt7r53bzWiKkVNbjpmCt1Zb3V6lxJNXSsjwRuTQ8P/kguxDC8LRkqaL3vvsFrce4dMQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - - '@next/swc-linux-arm64-musl@14.2.33': - resolution: {integrity: sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] + libc: [glibc] '@next/swc-linux-arm64-musl@15.0.0-canary.174': resolution: {integrity: sha512-NzfcraJW3jpWDx3dJHzMxLFUAJxdq9GROpO49SIWXu9HKmdZszrInTfnYK98v2C73FNnpFoCGEvBYi/GTnvECw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-arm64-musl@15.4.0-canary.14': resolution: {integrity: sha512-6eODbSA592cYMYtBU9Vm2D8ApXn6dBh/cN7GQlsTiDBIlCId9Z8DlkGCDj/9thr0JEluUlkt379+B19BGxsCEg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-arm64-musl@15.5.7': resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-arm64-musl@16.0.10': resolution: {integrity: sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-arm64-musl@16.1.4': resolution: {integrity: sha512-3Wm0zGYVCs6qDFAiSSDL+Z+r46EdtCv/2l+UlIdMbAq9hPJBvGu/rZOeuvCaIUjbArkmXac8HnTyQPJFzFWA0Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - - '@next/swc-linux-x64-gnu@14.2.33': - resolution: {integrity: sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] + libc: [musl] '@next/swc-linux-x64-gnu@15.0.0-canary.174': resolution: {integrity: sha512-fJ5W8PrbZZkxCrtX9lmlqn43zvUrQQ5wF/GxcQDFdcwT9l3lx8IhdMZH7Q5rWuikWpI0pU+jqqRdhTpODqpuHA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-gnu@15.4.0-canary.14': resolution: {integrity: sha512-FwOtQDbMLJmGPCg8p1ZilCBjfjBZGBRwXnWmxLmpO4lcWTWMFTCfAxkqCUi62zXBZUJztqT8TgXQ9VBk4BKukQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-gnu@15.5.7': resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-gnu@16.0.10': resolution: {integrity: sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-gnu@16.1.4': resolution: {integrity: sha512-lWAYAezFinaJiD5Gv8HDidtsZdT3CDaCeqoPoJjeB57OqzvMajpIhlZFce5sCAH6VuX4mdkxCRqecCJFwfm2nQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - - '@next/swc-linux-x64-musl@14.2.33': - resolution: {integrity: sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] + libc: [glibc] '@next/swc-linux-x64-musl@15.0.0-canary.174': resolution: {integrity: sha512-OMSzmdZxrh5c7X46ILiK3GvTPgSZghpSFF4wrnXloBpW1LrbbjSYGVSGer5IoVqXR18lpnMscsV9N35FX0MIVw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-linux-x64-musl@15.4.0-canary.14': resolution: {integrity: sha512-0k8lkaryoYsB4wksRm/5SlWWtJjuq6vOzQ/zqKRlNdpNvsvzZ61sEaCLZn1zdcFcUVH6wSzK/GMclcpn2w0VAg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-linux-x64-musl@15.5.7': resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-linux-x64-musl@16.0.10': resolution: {integrity: sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-linux-x64-musl@16.1.4': resolution: {integrity: sha512-fHaIpT7x4gA6VQbdEpYUXRGyge/YbRrkG6DXM60XiBqDM2g2NcrsQaIuj375egnGFkJow4RHacgBOEsHfGbiUw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - - '@next/swc-win32-arm64-msvc@14.2.33': - resolution: {integrity: sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] + libc: [musl] '@next/swc-win32-arm64-msvc@15.0.0-canary.174': resolution: {integrity: sha512-pjqvXOMBKbsG5u8I/vBeyxLN31p5dYIF1bP2zoIhjpsLU9eWx5ikKrQ7/qMpJDpWzTHgpzWGujPtEfvi1kd97w==} @@ -4311,24 +4265,12 @@ packages: cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@14.2.33': - resolution: {integrity: sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - '@next/swc-win32-ia32-msvc@15.0.0-canary.174': resolution: {integrity: sha512-fFkaeKq1/FXElupODSiBW8eA+644BbwxW3Eu/ACNvoxm5Z5s4YENCO4PcrdmGKvdG2k71DzcjpmtnToV+S7qiQ==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@next/swc-win32-x64-msvc@14.2.33': - resolution: {integrity: sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - '@next/swc-win32-x64-msvc@15.0.0-canary.174': resolution: {integrity: sha512-oHP+8a72t8K6LFwEXOy/Tb6nSOE3u/hUTN2fwXNUx5hJde59yeZaGIG2kQenWYLQxJHeoT90rI1DerOcfjwzQQ==} engines: {node: '>= 10'} @@ -4482,21 +4424,25 @@ packages: resolution: {integrity: sha512-aql/LLYriX/5Ar7o5Qivnp/qMTUPNiOCr7cFLvmvzYZa3XL0H8XtbKUfIVm+9ILR0urXQzcml+L8pLe1p8sgEg==} cpu: [arm64] os: [linux] + libc: [glibc] '@oxfmt/linux-arm64-musl@0.27.0': resolution: {integrity: sha512-6u/kNb7hubthg4u/pn3MK/GJLwPgjDvDDnjjr7TC0/OK/xztef8ToXmycxIQ9OeDNIJJf7Z0Ss/rHnKvQOWzRw==} cpu: [arm64] os: [linux] + libc: [musl] '@oxfmt/linux-x64-gnu@0.27.0': resolution: {integrity: sha512-EhvDfFHO1yrK/Cu75eU1U828lBsW2cV0JITOrka5AjR3PlmnQQ03Mr9ROkWkbPmzAMklXI4Q16eO+4n+7FhS1w==} cpu: [x64] os: [linux] + libc: [glibc] '@oxfmt/linux-x64-musl@0.27.0': resolution: {integrity: sha512-1pgjuwMT5sCekuteYZ7LkDsto7DJouaccwjozHqdWohSj2zJpFeSP2rMaC+6JJ1KD5r9HG9sWRuHZGEaoX9uOw==} cpu: [x64] os: [linux] + libc: [musl] '@oxfmt/win32-arm64@0.27.0': resolution: {integrity: sha512-mmuEhXZEhAYAeyjVTWwGKIA3RSb2b/He9wrXkDJPhmqp8qISUzkVg1dQmLEt4hD+wI5rzR+6vchPt521tzuRDA==} @@ -4522,21 +4468,25 @@ packages: resolution: {integrity: sha512-j4QzfCM8ks+OyM+KKYWDiBEQsm5RCW50H1Wz16wUyoFsobJ+X5qqcJxq6HvkE07m8euYmZelyB0WqsiDoz1v8g==} cpu: [arm64] os: [linux] + libc: [glibc] '@oxlint/linux-arm64-musl@1.42.0': resolution: {integrity: sha512-g5b1Uw7zo6yw4Ymzyd1etKzAY7xAaGA3scwB8tAp3QzuY7CYdfTwlhiLKSAKbd7T/JBgxOXAGNcLDorJyVTXcg==} cpu: [arm64] os: [linux] + libc: [musl] '@oxlint/linux-x64-gnu@1.42.0': resolution: {integrity: sha512-HnD99GD9qAbpV4q9iQil7mXZUJFpoBdDavfcC2CgGLPlawfcV5COzQPNwOgvPVkr7C0cBx6uNCq3S6r9IIiEIg==} cpu: [x64] os: [linux] + libc: [glibc] '@oxlint/linux-x64-musl@1.42.0': resolution: {integrity: sha512-8NTe8A78HHFn+nBi+8qMwIjgv9oIBh+9zqCPNLH56ah4vKOPvbePLI6NIv9qSkmzrBuu8SB+FJ2TH/G05UzbNA==} cpu: [x64] os: [linux] + libc: [musl] '@oxlint/win32-arm64@1.42.0': resolution: {integrity: sha512-lAPS2YAuu+qFqoTNPFcNsxXjwSV0M+dOgAzzVTAN7Yo2ifj+oLOx0GsntWoM78PvQWI7Q827ZxqtU2ImBmDapA==} @@ -4718,46 +4668,55 @@ packages: resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.24.0': resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.24.0': resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.24.0': resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.24.0': resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.24.0': resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.24.0': resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.24.0': resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.24.0': resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==} @@ -5444,9 +5403,6 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@swc/helpers@0.5.5': - resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} - '@t3-oss/env-core@0.11.1': resolution: {integrity: sha512-MaxOwEoG1ntCFoKJsS7nqwgcxLW1SJw238AJwfJeaz3P/8GtkxXZsPPolsz1AdYvUTbe3XvqZ/VCdfjt+3zmKw==} peerDependencies: @@ -5508,24 +5464,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.1.18': resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.1.18': resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.1.18': resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.1.18': resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} @@ -8078,6 +8038,7 @@ packages: libsql@0.4.7: resolution: {integrity: sha512-T9eIRCs6b0J1SHKYIvD8+KCJMcWZ900iZyxdnSCdqxN12Z1ijzT+jY5nrk72Jw4B0HGzms2NgpryArlJqvc3Lw==} + cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] lightningcss-android-arm64@1.30.2: @@ -8115,24 +8076,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.30.2: resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.30.2: resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.30.2: resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.30.2: resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} @@ -8622,24 +8587,6 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@14.2.35: - resolution: {integrity: sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==} - engines: {node: '>=18.17.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - sass: - optional: true - next@15.0.0-canary.174: resolution: {integrity: sha512-lFZs5orI6COBYDYdveGoQq5/LlNx5L3n2j8B2/iYf8mG70MFxknBZT3R1S9bO71K+hUpZ9BTaU9O2OvYPxWH5w==} engines: {node: '>=18.18.0'} @@ -9860,19 +9807,6 @@ packages: stubs@3.0.0: resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} - styled-jsx@5.1.1: - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true - styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -14867,8 +14801,6 @@ snapshots: '@neon-rs/load@0.0.4': {} - '@next/env@14.2.35': {} - '@next/env@15.0.0-canary.174': {} '@next/env@15.4.0-canary.14': {} @@ -14879,9 +14811,6 @@ snapshots: '@next/env@16.1.4': {} - '@next/swc-darwin-arm64@14.2.33': - optional: true - '@next/swc-darwin-arm64@15.0.0-canary.174': optional: true @@ -14897,9 +14826,6 @@ snapshots: '@next/swc-darwin-arm64@16.1.4': optional: true - '@next/swc-darwin-x64@14.2.33': - optional: true - '@next/swc-darwin-x64@15.0.0-canary.174': optional: true @@ -14915,9 +14841,6 @@ snapshots: '@next/swc-darwin-x64@16.1.4': optional: true - '@next/swc-linux-arm64-gnu@14.2.33': - optional: true - '@next/swc-linux-arm64-gnu@15.0.0-canary.174': optional: true @@ -14933,9 +14856,6 @@ snapshots: '@next/swc-linux-arm64-gnu@16.1.4': optional: true - '@next/swc-linux-arm64-musl@14.2.33': - optional: true - '@next/swc-linux-arm64-musl@15.0.0-canary.174': optional: true @@ -14951,9 +14871,6 @@ snapshots: '@next/swc-linux-arm64-musl@16.1.4': optional: true - '@next/swc-linux-x64-gnu@14.2.33': - optional: true - '@next/swc-linux-x64-gnu@15.0.0-canary.174': optional: true @@ -14969,9 +14886,6 @@ snapshots: '@next/swc-linux-x64-gnu@16.1.4': optional: true - '@next/swc-linux-x64-musl@14.2.33': - optional: true - '@next/swc-linux-x64-musl@15.0.0-canary.174': optional: true @@ -14987,9 +14901,6 @@ snapshots: '@next/swc-linux-x64-musl@16.1.4': optional: true - '@next/swc-win32-arm64-msvc@14.2.33': - optional: true - '@next/swc-win32-arm64-msvc@15.0.0-canary.174': optional: true @@ -15005,15 +14916,9 @@ snapshots: '@next/swc-win32-arm64-msvc@16.1.4': optional: true - '@next/swc-win32-ia32-msvc@14.2.33': - optional: true - '@next/swc-win32-ia32-msvc@15.0.0-canary.174': optional: true - '@next/swc-win32-x64-msvc@14.2.33': - optional: true - '@next/swc-win32-x64-msvc@15.0.0-canary.174': optional: true @@ -16478,11 +16383,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@swc/helpers@0.5.5': - dependencies: - '@swc/counter': 0.1.3 - tslib: 2.8.0 - '@t3-oss/env-core@0.11.1(typescript@5.9.3)(zod@3.25.76)': dependencies: zod: 3.25.76 @@ -16771,7 +16671,6 @@ snapshots: dependencies: '@types/http-errors': 2.0.4 '@types/node': 22.19.7 - '@types/send': 0.17.4 '@types/stack-utils@2.0.3': {} @@ -20137,33 +20036,6 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - next@14.2.35(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@next/env': 14.2.35 - '@swc/helpers': 0.5.5 - busboy: 1.6.0 - caniuse-lite: 1.0.30001766 - graceful-fs: 4.2.11 - postcss: 8.4.31 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(react@18.3.1) - optionalDependencies: - '@next/swc-darwin-arm64': 14.2.33 - '@next/swc-darwin-x64': 14.2.33 - '@next/swc-linux-arm64-gnu': 14.2.33 - '@next/swc-linux-arm64-musl': 14.2.33 - '@next/swc-linux-x64-gnu': 14.2.33 - '@next/swc-linux-x64-musl': 14.2.33 - '@next/swc-win32-arm64-msvc': 14.2.33 - '@next/swc-win32-ia32-msvc': 14.2.33 - '@next/swc-win32-x64-msvc': 14.2.33 - '@opentelemetry/api': 1.9.0 - '@playwright/test': 1.58.0 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - next@15.0.0-canary.174(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.0.0-rc-2d16326d-20240930(react@19.0.0-rc-2d16326d-20240930))(react@19.0.0-rc-2d16326d-20240930): dependencies: '@next/env': 15.0.0-canary.174 @@ -21677,11 +21549,6 @@ snapshots: stubs@3.0.0: optional: true - styled-jsx@5.1.1(react@18.3.1): - dependencies: - client-only: 0.0.1 - react: 18.3.1 - styled-jsx@5.1.6(react@18.3.1): dependencies: client-only: 0.0.1 From bd060b98097cf4bd230d48f44625faede4b02b0f Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 14 Feb 2026 18:01:41 +0100 Subject: [PATCH 2/8] remove a bunch of ref to next <16 --- packages/open-next/src/adapters/cache.ts | 8 ++-- .../adapters/image-optimization-adapter.ts | 6 +-- .../src/adapters/plugins/14.1/util.ts | 31 ------------ .../image-optimization.replacement.ts | 48 ------------------- .../image-optimization/image-optimization.ts | 27 +++++++---- .../open-next/src/build/bundleNextServer.ts | 2 - packages/open-next/src/build/compileCache.ts | 4 -- .../open-next/src/build/copyTracedFiles.ts | 3 +- .../build/createImageOptimizationBundle.ts | 12 ----- .../open-next/src/build/createServerBundle.ts | 15 +----- .../open-next/src/build/validateConfig.ts | 3 -- packages/open-next/src/types/global.ts | 7 --- packages/open-next/src/types/open-next.ts | 9 ---- 13 files changed, 28 insertions(+), 147 deletions(-) delete mode 100644 packages/open-next/src/adapters/plugins/14.1/util.ts delete mode 100644 packages/open-next/src/adapters/plugins/image-optimization/image-optimization.replacement.ts diff --git a/packages/open-next/src/adapters/cache.ts b/packages/open-next/src/adapters/cache.ts index 1a4d9bc1..a990ed8e 100644 --- a/packages/open-next/src/adapters/cache.ts +++ b/packages/open-next/src/adapters/cache.ts @@ -119,7 +119,7 @@ export default class Cache { return { lastModified: _lastModified, value: { - kind: globalThis.isNextAfter15 ? "APP_ROUTE" : "ROUTE", + kind: "APP_ROUTE", body: Buffer.from( cacheData.body ?? Buffer.alloc(0), isBinaryContentType(String(meta?.headers?.["content-type"])) ? "base64" : "utf8" @@ -130,7 +130,7 @@ export default class Cache { } as CacheHandlerValue; } if (cacheData?.type === "page" || cacheData?.type === "app") { - if (globalThis.isNextAfter15 && cacheData?.type === "app") { + if (cacheData?.type === "app") { const segmentData = new Map(); if (cacheData.segmentData) { for (const [segmentPath, segmentContent] of Object.entries(cacheData.segmentData ?? {})) { @@ -153,9 +153,9 @@ export default class Cache { return { lastModified: _lastModified, value: { - kind: globalThis.isNextAfter15 ? "PAGES" : "PAGE", + kind: "PAGES", html: cacheData.html, - pageData: cacheData.type === "page" ? cacheData.json : cacheData.rsc, + pageData: cacheData.json, status: meta?.status, headers: meta?.headers, }, diff --git a/packages/open-next/src/adapters/image-optimization-adapter.ts b/packages/open-next/src/adapters/image-optimization-adapter.ts index bf61ff1d..4167d650 100644 --- a/packages/open-next/src/adapters/image-optimization-adapter.ts +++ b/packages/open-next/src/adapters/image-optimization-adapter.ts @@ -202,7 +202,7 @@ function buildFailureResponse( const loader = await resolveImageLoader(globalThis.openNextConfig.imageOptimization?.loader ?? "s3"); -async function downloadHandler(_req: IncomingMessage, res: ServerResponse, url: NextUrlWithParsedQuery) { +async function downloadHandler(_req: IncomingMessage, res: ServerResponse, url?: NextUrlWithParsedQuery) { // downloadHandler is called by Next.js. We don't call this function // directly. debug("downloadHandler url", url); @@ -223,7 +223,7 @@ async function downloadHandler(_req: IncomingMessage, res: ServerResponse, url: try { // Case 1: remote image URL => download the image from the URL - if (url.href.toLowerCase().match(/^https?:\/\//)) { + if (url?.href.toLowerCase().match(/^https?:\/\//)) { pipeRes(https.get(url), res); } // Case 2: local image => download the image from S3 @@ -231,7 +231,7 @@ async function downloadHandler(_req: IncomingMessage, res: ServerResponse, url: // Download image from S3 // note: S3 expects keys without leading `/` - const response = await loader.load(url.href); + const response = await loader.load(url?.href ?? ""); if (!response.body) { throw new Error("Empty response body from the S3 request."); diff --git a/packages/open-next/src/adapters/plugins/14.1/util.ts b/packages/open-next/src/adapters/plugins/14.1/util.ts deleted file mode 100644 index 60a6e320..00000000 --- a/packages/open-next/src/adapters/plugins/14.1/util.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { NextConfig } from "../../config"; -import { debug } from "../../logger.js"; - -//#override requestHandler -// @ts-ignore -export const requestHandler = new NextServer.default({ - conf: { - ...NextConfig, - // Next.js compression should be disabled because of a bug in the bundled - // `compression` package — https://github.com/vercel/next.js/issues/11669 - compress: false, - // By default, Next.js uses local disk to store ISR cache. We will use - // our own cache handler to store the cache on S3. - cacheHandler: `${process.env.LAMBDA_TASK_ROOT}/cache.cjs`, - cacheMaxMemorySize: 0, - experimental: { - ...NextConfig.experimental, - // This uses the request.headers.host as the URL - // https://github.com/vercel/next.js/blob/canary/packages/next/src/server/next-server.ts#L1749-L1754 - trustHostHeader: true, - }, - }, - customServer: false, - dev: false, - dir: __dirname, -}).getRequestHandler(); -//#endOverride - -//#override requireHooks -debug("No need to override require hooks with next 13.4.20+"); -//#endOverride diff --git a/packages/open-next/src/adapters/plugins/image-optimization/image-optimization.replacement.ts b/packages/open-next/src/adapters/plugins/image-optimization/image-optimization.replacement.ts deleted file mode 100644 index 364e684e..00000000 --- a/packages/open-next/src/adapters/plugins/image-optimization/image-optimization.replacement.ts +++ /dev/null @@ -1,48 +0,0 @@ -import type { IncomingMessage, ServerResponse } from "node:http"; - -import type { APIGatewayProxyEventHeaders } from "aws-lambda"; -import type { NextConfig } from "next/dist/server/config-shared"; -//#override imports -import { fetchExternalImage, fetchInternalImage, imageOptimizer } from "next/dist/server/image-optimizer"; -//#endOverride -import type { NextUrlWithParsedQuery } from "next/dist/server/request-meta"; - -import { debug } from "../../logger.js"; - -//#override optimizeImage -export async function optimizeImage( - headers: APIGatewayProxyEventHeaders, - // oxlint-disable-next-line @typescript-eslint/no-explicit-any - image optimization API varies across Next.js versions - imageParams: any, - nextConfig: NextConfig, - handleRequest: ( - newReq: IncomingMessage, - newRes: ServerResponse, - newParsedUrl?: NextUrlWithParsedQuery - ) => Promise -) { - const { isAbsolute, href } = imageParams; - - const imageUpstream = isAbsolute - ? //@ts-expect-error - fetchExternalImage signature has changed in Next.js 16, it has an extra boolean parameter. - // https://github.com/vercel/next.js/blob/bfe2ab4/packages/next/src/server/image-optimizer.ts#L711 - await fetchExternalImage(href) - : await fetchInternalImage( - href, - // @ts-expect-error - It is supposed to be an IncomingMessage object, but only the headers are used. - { headers }, - {}, // res object is not necessary as it's not actually used. - handleRequest - ); - - const result = await imageOptimizer( - imageUpstream, - imageParams, - // @ts-ignore - nextConfig, - false // not in dev mode - ); - debug("optimized result", result); - return result; -} -//#endOverride diff --git a/packages/open-next/src/adapters/plugins/image-optimization/image-optimization.ts b/packages/open-next/src/adapters/plugins/image-optimization/image-optimization.ts index c014ee08..364e684e 100644 --- a/packages/open-next/src/adapters/plugins/image-optimization/image-optimization.ts +++ b/packages/open-next/src/adapters/plugins/image-optimization/image-optimization.ts @@ -1,11 +1,9 @@ -// @ts-nocheck -// This file is used only for Next 14.1 and below. Typing is correct for these versions. import type { IncomingMessage, ServerResponse } from "node:http"; import type { APIGatewayProxyEventHeaders } from "aws-lambda"; import type { NextConfig } from "next/dist/server/config-shared"; //#override imports -import { imageOptimizer } from "next/dist/server/image-optimizer"; +import { fetchExternalImage, fetchInternalImage, imageOptimizer } from "next/dist/server/image-optimizer"; //#endOverride import type { NextUrlWithParsedQuery } from "next/dist/server/request-meta"; @@ -20,16 +18,29 @@ export async function optimizeImage( handleRequest: ( newReq: IncomingMessage, newRes: ServerResponse, - newParsedUrl: NextUrlWithParsedQuery + newParsedUrl?: NextUrlWithParsedQuery ) => Promise ) { + const { isAbsolute, href } = imageParams; + + const imageUpstream = isAbsolute + ? //@ts-expect-error - fetchExternalImage signature has changed in Next.js 16, it has an extra boolean parameter. + // https://github.com/vercel/next.js/blob/bfe2ab4/packages/next/src/server/image-optimizer.ts#L711 + await fetchExternalImage(href) + : await fetchInternalImage( + href, + // @ts-expect-error - It is supposed to be an IncomingMessage object, but only the headers are used. + { headers }, + {}, // res object is not necessary as it's not actually used. + handleRequest + ); + const result = await imageOptimizer( - { headers }, - {}, // res object is not necessary as it's not actually used. + imageUpstream, imageParams, + // @ts-ignore nextConfig, - false, // not in dev mode - handleRequest + false // not in dev mode ); debug("optimized result", result); return result; diff --git a/packages/open-next/src/build/bundleNextServer.ts b/packages/open-next/src/build/bundleNextServer.ts index 6711d44c..6e60f89c 100644 --- a/packages/open-next/src/build/bundleNextServer.ts +++ b/packages/open-next/src/build/bundleNextServer.ts @@ -27,8 +27,6 @@ const externals = [ "next/dist/compiled/ws", // externalsMap - // In the config they replace it, but we don't use this one inside NextServer anymore 13.4.12+ - // For earlier versions we might have to alias it "./web/sandbox", // pagesExternal diff --git a/packages/open-next/src/build/compileCache.ts b/packages/open-next/src/build/compileCache.ts index 3a76ae70..553bcbf5 100644 --- a/packages/open-next/src/build/compileCache.ts +++ b/packages/open-next/src/build/compileCache.ts @@ -14,8 +14,6 @@ export function compileCache(options: buildHelper.BuildOptions, format: "cjs" | const ext = format === "cjs" ? "cjs" : "mjs"; const compiledCacheFile = path.join(options.buildDir, `cache.${ext}`); - const isAfter15 = buildHelper.compareSemver(options.nextVersion, ">=", "15.0.0"); - // Normal cache buildHelper.esbuildSync( { @@ -28,7 +26,6 @@ export function compileCache(options: buildHelper.BuildOptions, format: "cjs" | js: [ `globalThis.disableIncrementalCache = ${config.dangerous?.disableIncrementalCache ?? false};`, `globalThis.disableDynamoDBCache = ${config.dangerous?.disableTagCache ?? false};`, - `globalThis.isNextAfter15 = ${isAfter15};`, ].join(""), }, }, @@ -49,7 +46,6 @@ export function compileCache(options: buildHelper.BuildOptions, format: "cjs" | js: [ `globalThis.disableIncrementalCache = ${config.dangerous?.disableIncrementalCache ?? false};`, `globalThis.disableDynamoDBCache = ${config.dangerous?.disableTagCache ?? false};`, - `globalThis.isNextAfter15 = ${isAfter15};`, ].join(""), }, }, diff --git a/packages/open-next/src/build/copyTracedFiles.ts b/packages/open-next/src/build/copyTracedFiles.ts index 62e460b2..3f41300b 100644 --- a/packages/open-next/src/build/copyTracedFiles.ts +++ b/packages/open-next/src/build/copyTracedFiles.ts @@ -236,8 +236,7 @@ File ${serverPath} does not exist if (hasAppDir) { //App dir - // In next 14.2.0, _not-found is at 'app/_not-found/page' - safeComputeCopyFilesForPage("app/_not-found", "app/_not-found/page"); + safeComputeCopyFilesForPage("app/_not-found/page"); } //Files we actually want to include diff --git a/packages/open-next/src/build/createImageOptimizationBundle.ts b/packages/open-next/src/build/createImageOptimizationBundle.ts index 5dce9b1c..49843bb7 100644 --- a/packages/open-next/src/build/createImageOptimizationBundle.ts +++ b/packages/open-next/src/build/createImageOptimizationBundle.ts @@ -36,18 +36,6 @@ export async function createImageOptimizationBundle(options: buildHelper.BuildOp }), ]; - if (buildHelper.compareSemver(options.nextVersion, ">=", "14.1.1")) { - plugins.push( - openNextReplacementPlugin({ - name: "opennext-14.1.1-image-optimization", - target: getCrossPlatformPathRegex("plugins/image-optimization/image-optimization.js"), - replacements: [ - require.resolve("../adapters/plugins/image-optimization/image-optimization.replacement.js"), - ], - }) - ); - } - // Build Lambda code (1st pass) // note: bundle in OpenNext package b/c the adapter relies on the // "@aws-sdk/client-s3" package which is not a dependency in user's diff --git a/packages/open-next/src/build/createServerBundle.ts b/packages/open-next/src/build/createServerBundle.ts index f442aef7..fc5f81b0 100644 --- a/packages/open-next/src/build/createServerBundle.ts +++ b/packages/open-next/src/build/createServerBundle.ts @@ -158,14 +158,6 @@ async function generateBundle( addDenoJson(outputPath, packagePath); } - // Bundle next server if necessary - const isBundled = fnOptions.experimentalBundledNextServer ?? false; - if (isBundled) { - await bundleNextServer(outPackagePath, appPath, { - minify: options.minify, - }); - } - // Copy middleware if (!config.middleware?.external) { fs.copyFileSync( @@ -197,7 +189,7 @@ async function generateBundle( packagePath, outputDir: outputPath, routes: fnOptions.routes ?? ["app/page.tsx"], - bundledNextServer: isBundled, + bundledNextServer: false, skipServerFiles: options.config.dangerous?.useAdapterOutputs === true, }); tracedFiles = oldTracedFileOutput.tracedFiles; @@ -291,11 +283,6 @@ async function generateBundle( ].join(""), }, plugins, - alias: isBundled - ? { - "next/dist/server/next-server.js": "./next-server.runtime.prod.js", - } - : {}, }, options ); diff --git a/packages/open-next/src/build/validateConfig.ts b/packages/open-next/src/build/validateConfig.ts index 7e5c6be9..22779d08 100644 --- a/packages/open-next/src/build/validateConfig.ts +++ b/packages/open-next/src/build/validateConfig.ts @@ -21,9 +21,6 @@ const compatibilityMatrix: Record = { }; function validateFunctionOptions(fnOptions: FunctionOptions) { - if (fnOptions.runtime === "edge" && fnOptions.experimentalBundledNextServer) { - logger.warn("experimentalBundledNextServer has no effect for edge functions"); - } const wrapper = typeof fnOptions.override?.wrapper === "string" ? fnOptions.override.wrapper : "aws-lambda"; const converter = typeof fnOptions.override?.converter === "string" ? fnOptions.override.converter : "aws-apigw-v2"; diff --git a/packages/open-next/src/types/global.ts b/packages/open-next/src/types/global.ts index adcff806..289fe144 100644 --- a/packages/open-next/src/types/global.ts +++ b/packages/open-next/src/types/global.ts @@ -107,13 +107,6 @@ declare global { */ var disableIncrementalCache: boolean; - /** - * A boolean that indicates if Next is V15 or higher. - * Only available in the cache adapter. - * Defined in the esbuild banner for the cache adapter. - */ - var isNextAfter15: boolean; - /** * A boolean that indicates if the runtime is Edge. * Only available in `edge` runtime functions (i.e. external middleware or function with edge runtime). diff --git a/packages/open-next/src/types/open-next.ts b/packages/open-next/src/types/open-next.ts index acf7adad..1f3f126a 100644 --- a/packages/open-next/src/types/open-next.ts +++ b/packages/open-next/src/types/open-next.ts @@ -341,15 +341,6 @@ export interface FunctionOptions extends DefaultFunctionOptions { */ override?: OverrideOptions; - /** - * Bundle Next server into a single file. - * This results in a way smaller bundle but it might break for some cases. - * This option will probably break on every new Next.js version. - * @default false - * @deprecated This is not supported in 14.2+ - */ - experimentalBundledNextServer?: boolean; - routePreloadingBehavior?: RoutePreloadingBehavior; } From 48419b4d36231db4fc6281896a8d66e4f50c679e Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 14 Feb 2026 18:03:53 +0100 Subject: [PATCH 3/8] Remove bundling of Next server and related code from generateBundle function in cf --- .../cli/build/open-next/createServerBundle.ts | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/packages/cloudflare/src/cli/build/open-next/createServerBundle.ts b/packages/cloudflare/src/cli/build/open-next/createServerBundle.ts index 2f5ad3b0..c6da05bb 100644 --- a/packages/cloudflare/src/cli/build/open-next/createServerBundle.ts +++ b/packages/cloudflare/src/cli/build/open-next/createServerBundle.ts @@ -5,7 +5,6 @@ import fs from "node:fs"; import path from "node:path"; import { loadMiddlewareManifest } from "@opennextjs/aws/adapters/config/util.js"; -import { bundleNextServer } from "@opennextjs/aws/build/bundleNextServer.js"; import { compileCache } from "@opennextjs/aws/build/compileCache.js"; import { copyAdapterFiles } from "@opennextjs/aws/build/copyAdapterFiles.js"; import { copyTracedFiles } from "@opennextjs/aws/build/copyTracedFiles.js"; @@ -165,14 +164,6 @@ async function generateBundle( addDenoJson(outputPath, packagePath); } - // Bundle next server if necessary - const isBundled = fnOptions.experimentalBundledNextServer ?? false; - if (isBundled) { - await bundleNextServer(outPackagePath, appPath, { - minify: options.minify, - }); - } - // Copy middleware if (!config.middleware?.external) { fs.copyFileSync( @@ -208,7 +199,7 @@ async function generateBundle( packagePath, outputDir: outputPath, routes: fnOptions.routes ?? ["app/page.tsx"], - bundledNextServer: isBundled, + bundledNextServer: false, skipServerFiles: options.config.dangerous?.useAdapterOutputs === true, }); tracedFiles = oldTracedFileOutput.tracedFiles; @@ -311,11 +302,6 @@ async function generateBundle( ].join(""), }, plugins, - alias: isBundled - ? { - "next/dist/server/next-server.js": "./next-server.runtime.prod.js", - } - : {}, }, options ); From 7fd403e6abfd3ed7aa75b1768077bae16690aada Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 14 Feb 2026 18:12:09 +0100 Subject: [PATCH 4/8] Refactor generateBundle function by removing unused version checks and simplifying routing logic; delete patchAsyncStorage functionality. --- .../cli/build/open-next/createServerBundle.ts | 21 ++------------- .../open-next/src/build/createServerBundle.ts | 26 ++----------------- .../src/build/patch/patchedAsyncStorage.ts | 17 ------------ .../open-next/src/core/patchAsyncStorage.ts | 26 ------------------- packages/open-next/src/core/requestHandler.ts | 8 ------ 5 files changed, 4 insertions(+), 94 deletions(-) delete mode 100644 packages/open-next/src/build/patch/patchedAsyncStorage.ts delete mode 100644 packages/open-next/src/core/patchAsyncStorage.ts diff --git a/packages/cloudflare/src/cli/build/open-next/createServerBundle.ts b/packages/cloudflare/src/cli/build/open-next/createServerBundle.ts index c6da05bb..0f3c52b8 100644 --- a/packages/cloudflare/src/cli/build/open-next/createServerBundle.ts +++ b/packages/cloudflare/src/cli/build/open-next/createServerBundle.ts @@ -236,19 +236,9 @@ async function generateBundle( // "serverless-http" package which is not a dependency in user's // Next.js app. - const disableNextPrebundledReact = - buildHelper.compareSemver(options.nextVersion, ">=", "13.5.1") || - buildHelper.compareSemver(options.nextVersion, "<=", "13.4.1"); - const overrides = fnOptions.override ?? {}; - const isBefore13413 = buildHelper.compareSemver(options.nextVersion, "<=", "13.4.13"); - const isAfter141 = buildHelper.compareSemver(options.nextVersion, ">=", "14.1"); - const isAfter142 = buildHelper.compareSemver(options.nextVersion, ">=", "14.2"); - const isAfter154 = buildHelper.compareSemver(options.nextVersion, ">=", "15.4.0"); - const useAdapterHandler = config.dangerous?.useAdapterOutputs === true; - - const disableRouting = isBefore13413 || config.middleware?.external; + const disableRouting = config.middleware?.external; const updater = new ContentUpdater(options); @@ -260,14 +250,7 @@ async function generateBundle( openNextReplacementPlugin({ name: `requestHandlerOverride ${name}`, target: getCrossPlatformPathRegex("core/requestHandler.js"), - deletes: [ - ...(disableNextPrebundledReact ? ["applyNextjsPrebundledReact"] : []), - ...(disableRouting ? ["withRouting"] : []), - ...(isAfter142 ? ["patchAsyncStorage"] : []), - ...(isAfter141 ? ["appendPrefetch"] : []), - ...(isAfter154 ? [] : ["setInitialURL"]), - ...(useAdapterHandler ? ["useRequestHandler"] : ["useAdapterHandler"]), - ], + deletes: disableRouting ? ["withRouting"] : [], }), openNextResolvePlugin({ diff --git a/packages/open-next/src/build/createServerBundle.ts b/packages/open-next/src/build/createServerBundle.ts index fc5f81b0..d8c663ca 100644 --- a/packages/open-next/src/build/createServerBundle.ts +++ b/packages/open-next/src/build/createServerBundle.ts @@ -215,24 +215,9 @@ async function generateBundle( // "serverless-http" package which is not a dependency in user's // Next.js app. - const disableNextPrebundledReact = - buildHelper.compareSemver(options.nextVersion, ">=", "13.5.1") || - buildHelper.compareSemver(options.nextVersion, "<=", "13.4.1"); - const overrides = fnOptions.override ?? {}; - const isBefore13413 = buildHelper.compareSemver(options.nextVersion, "<=", "13.4.13"); - const isAfter141 = buildHelper.compareSemver(options.nextVersion, ">=", "14.1"); - - const isAfter142 = buildHelper.compareSemver(options.nextVersion, ">=", "14.2"); - - const isAfter152 = buildHelper.compareSemver(options.nextVersion, ">=", "15.2.0"); - - const isAfter154 = buildHelper.compareSemver(options.nextVersion, ">=", "15.4.0"); - - const useAdapterHandler = config.dangerous?.useAdapterOutputs === true; - - const disableRouting = isBefore13413 || config.middleware?.external; + const disableRouting = config.middleware?.external; const updater = new ContentUpdater(options); @@ -244,14 +229,7 @@ async function generateBundle( openNextReplacementPlugin({ name: `requestHandlerOverride ${name}`, target: getCrossPlatformPathRegex("core/requestHandler.js"), - deletes: [ - ...(disableNextPrebundledReact ? ["applyNextjsPrebundledReact"] : []), - ...(disableRouting ? ["withRouting"] : []), - ...(isAfter142 ? ["patchAsyncStorage"] : []), - ...(isAfter141 ? ["appendPrefetch"] : []), - ...(isAfter154 ? [] : ["setInitialURL"]), - ...(useAdapterHandler ? ["useRequestHandler"] : ["useAdapterHandler"]), - ], + deletes: disableRouting ? ["withRouting"] : [], }), openNextResolvePlugin({ diff --git a/packages/open-next/src/build/patch/patchedAsyncStorage.ts b/packages/open-next/src/build/patch/patchedAsyncStorage.ts deleted file mode 100644 index 09268835..00000000 --- a/packages/open-next/src/build/patch/patchedAsyncStorage.ts +++ /dev/null @@ -1,17 +0,0 @@ -//@ts-nocheck - -const asyncStorage = require("next/dist/client/components/static-generation-async-storage.external.original"); - -const staticGenerationAsyncStorage = { - run: (store, cb, ...args) => asyncStorage.staticGenerationAsyncStorage.run(store, cb, ...args), - getStore: () => { - const store = asyncStorage.staticGenerationAsyncStorage.getStore(); - if (store) { - store.isOnDemandRevalidate = - store.isOnDemandRevalidate && !globalThis.__openNextAls.getStore().isISRRevalidation; - } - return store; - }, -}; - -exports.staticGenerationAsyncStorage = staticGenerationAsyncStorage; diff --git a/packages/open-next/src/core/patchAsyncStorage.ts b/packages/open-next/src/core/patchAsyncStorage.ts deleted file mode 100644 index febab1f2..00000000 --- a/packages/open-next/src/core/patchAsyncStorage.ts +++ /dev/null @@ -1,26 +0,0 @@ -const mod = require("node:module"); - -const resolveFilename = mod._resolveFilename; - -export function patchAsyncStorage() { - mod._resolveFilename = (( - originalResolveFilename: typeof resolveFilename, - request: string, - parent: unknown, - isMain: boolean, - options: unknown - ) => { - if ( - request.endsWith("static-generation-async-storage.external") || - request.endsWith("static-generation-async-storage.external.js") - ) { - return require.resolve("./patchedAsyncStorage.cjs"); - } - if (request.endsWith("static-generation-async-storage.external.original")) { - return originalResolveFilename.call(mod, request.replace(".original", ".js"), parent, isMain, options); - } - return originalResolveFilename.call(mod, request, parent, isMain, options); - - // We use `bind` here to avoid referencing outside variables to create potential memory leaks. - }).bind(null, resolveFilename); -} diff --git a/packages/open-next/src/core/requestHandler.ts b/packages/open-next/src/core/requestHandler.ts index 3a1c84f9..c050f32e 100644 --- a/packages/open-next/src/core/requestHandler.ts +++ b/packages/open-next/src/core/requestHandler.ts @@ -7,7 +7,6 @@ import { runWithOpenNextRequestContext } from "@/utils/promise"; import { debug, error } from "../adapters/logger"; -import { patchAsyncStorage } from "./patchAsyncStorage"; import { adapterHandler } from "./routing/adapterHandler"; import { constructNextUrl, convertRes, createServerResponse } from "./routing/util"; import routingHandler, { @@ -22,10 +21,6 @@ import routingHandler, { // This is used to identify requests in the cache globalThis.__openNextAls = new AsyncLocalStorage(); -//#override patchAsyncStorage -patchAsyncStorage(); -//#endOverride - export async function openNextHandler( internalEvent: InternalEvent, options?: OpenNextHandlerOptions @@ -161,9 +156,6 @@ export async function openNextHandler( // 3. OUR CHOICE: We could pass a purpose prefetch header to the serverless function to make next believe that the request is a prefetch request and not trigger revalidation (This could potentially break in the future if next changes the behavior of prefetch requests) headers: { ...headers, - //#override appendPrefetch - purpose: "prefetch", - //#endOverride }, body: preprocessedEvent.body, remoteAddress: preprocessedEvent.remoteAddress, From 34ccec3b79baf05fd73e1552143093d117cb3474 Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 14 Feb 2026 18:18:51 +0100 Subject: [PATCH 5/8] delete useless file --- .../open-next/src/build/bundleNextServer.ts | 96 ------------- packages/open-next/src/core/require-hooks.ts | 134 ------------------ 2 files changed, 230 deletions(-) delete mode 100644 packages/open-next/src/build/bundleNextServer.ts delete mode 100644 packages/open-next/src/core/require-hooks.ts diff --git a/packages/open-next/src/build/bundleNextServer.ts b/packages/open-next/src/build/bundleNextServer.ts deleted file mode 100644 index 6e60f89c..00000000 --- a/packages/open-next/src/build/bundleNextServer.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { createRequire } from "node:module"; -import path from "node:path"; - -import { build } from "esbuild"; - -const externals = [ - // This one was causing trouble, don't know why - "../experimental/testmode/server", - - // sharedExternals - "styled-jsx", - "styled-jsx/style", - "@opentelemetry/api", - "next/dist/compiled/@next/react-dev-overlay/dist/middleware", - "next/dist/compiled/@ampproject/toolbox-optimizer", - "next/dist/compiled/edge-runtime", - "next/dist/compiled/@edge-runtime/ponyfill", - "next/dist/compiled/undici", - "next/dist/compiled/raw-body", - "next/dist/server/capsize-font-metrics.json", - "critters", - "next/dist/compiled/node-html-parser", - "next/dist/compiled/compression", - "next/dist/compiled/jsonwebtoken", - "next/dist/compiled/@opentelemetry/api", - "next/dist/compiled/@mswjs/interceptors/ClientRequest", - "next/dist/compiled/ws", - - // externalsMap - "./web/sandbox", - - // pagesExternal - "react", - "react-dom", - "react-server-dom-webpack", - "react-server-dom-turbopack", - - // We need to remove this since this is what webpack is building - // Adding it cause to add a lot of unnecessary deps - "next/dist/compiled/next-server", -]; - -export async function bundleNextServer(outputDir: string, appPath: string, { minify = true }) { - const require = createRequire(`${appPath}/package.json`); - const entrypoint = require.resolve("next/dist/esm/server/next-server.js"); - - await build({ - entryPoints: [entrypoint], - bundle: true, - platform: "node", - target: ["node18"], - // packages: "external", - format: "cjs", - external: externals, - minify, - outfile: path.join(outputDir, "next-server.runtime.prod.js"), - sourcemap: false, - plugins: [ - { - name: "opennext-next-server", - setup(build) { - // This was an attempt at reducing server bundle size - // It might be the better way to go in the future - build.onResolve({ filter: /\.\/module.compiled/ }, (args) => { - const dir = args.resolveDir.split("/").slice(-1); - return { - path: path.join("next/dist/compiled/next-server/", `${dir}.runtime.prod.js`), - external: true, - }; - }); - - build.onResolve({ filter: /[\\/]react-server\.node/ }, (args) => { - return { - path: args.path, - external: true, - }; - }); - - build.onResolve({ filter: /vendored[\\/]rsc[\\/]entrypoints/ }, (args) => { - return { - path: args.path, - external: true, - }; - }); - - build.onResolve({ filter: /\.external/ }, (args) => { - return { - path: args.path.replace(/\.\./, "next/dist"), - external: true, - }; - }); - }, - }, - ], - }); -} diff --git a/packages/open-next/src/core/require-hooks.ts b/packages/open-next/src/core/require-hooks.ts deleted file mode 100644 index fda3fe10..00000000 --- a/packages/open-next/src/core/require-hooks.ts +++ /dev/null @@ -1,134 +0,0 @@ -// Synchronously inject a require hook for webpack and webpack/. It's required to use the internal ncc webpack version. -// This is needed for userland plugins to attach to the same webpack instance as Next.js'. -// Individually compiled modules are as defined for the compilation in bundles/webpack/packages/*. - -import type { NextConfig } from "@/types/next-types.js"; - -import { error } from "../adapters/logger.js"; - -// This module will only be loaded once per process. - -const mod = require("node:module"); - -const resolveFilename = mod._resolveFilename; -const hookPropertyMapApp = new Map(); -const hookPropertyMapPage = new Map(); - -export function overrideHooks(config: NextConfig) { - try { - overrideDefault(); - overrideReact(config); - } catch (e) { - error("Failed to override Next.js require hooks.", e); - throw e; - } -} - -function addHookAliases(aliases: [string, string][], type: "app" | "page") { - for (const [key, value] of aliases) { - if (type === "app") { - hookPropertyMapApp.set(key, value); - } else { - hookPropertyMapPage.set(key, value); - } - } -} - -const baseOverrides = { - react: "next/dist/compiled/react", - "react/package.json": "next/dist/compiled/react/package.json", - "react/jsx-runtime": "next/dist/compiled/react/jsx-runtime", - "react/jsx-dev-runtime": "next/dist/compiled/react/jsx-dev-runtime", - "react-dom": "next/dist/compiled/react-dom/server-rendering-stub", - "react-dom/package.json": "next/dist/compiled/react-dom/package.json", - "react-dom/client": "next/dist/compiled/react-dom/client", - "react-dom/server": "next/dist/compiled/react-dom/server", - "react-dom/server.browser": "next/dist/compiled/react-dom/server.browser", - "react-dom/server.edge": "next/dist/compiled/react-dom/server.edge", - "react-server-dom-webpack/client": "next/dist/compiled/react-server-dom-webpack/client", - "react-server-dom-webpack/client.edge": "next/dist/compiled/react-server-dom-webpack/client.edge", - "react-server-dom-webpack/server.edge": "next/dist/compiled/react-server-dom-webpack/server.edge", - "react-server-dom-webpack/server.node": "next/dist/compiled/react-server-dom-webpack/server.node", -}; - -const experimentalOverrides = { - react: "next/dist/compiled/react-experimental", - "react/jsx-runtime": "next/dist/compiled/react-experimental/jsx-runtime", - "react/jsx-dev-runtime": "next/dist/compiled/react-experimental/jsx-dev-runtime", - "react-dom": "next/dist/compiled/react-dom-experimental/server-rendering-stub", - "react/package.json": "next/dist/compiled/react-experimental/package.json", - "react-dom/package.json": "next/dist/compiled/react-dom-experimental/package.json", - "react-dom/client": "next/dist/compiled/react-dom-experimental/client", - "react-dom/server": "next/dist/compiled/react-dom-experimental/server", - "react-dom/server.browser": "next/dist/compiled/react-dom-experimental/server.browser", - "react-dom/server.edge": "next/dist/compiled/react-dom-experimental/server.edge", - "react-server-dom-webpack/client": "next/dist/compiled/react-server-dom-webpack-experimental/client", - "react-server-dom-webpack/client.edge": - "next/dist/compiled/react-server-dom-webpack-experimental/client.edge", - "react-server-dom-webpack/server.edge": - "next/dist/compiled/react-server-dom-webpack-experimental/server.edge", - "react-server-dom-webpack/server.node": - "next/dist/compiled/react-server-dom-webpack-experimental/server.node", -}; - -// Add default aliases -function overrideDefault() { - addHookAliases( - [ - // Use `require.resolve` explicitly to make them statically analyzable - // styled-jsx needs to be resolved as the external dependency. - ["styled-jsx", require.resolve("styled-jsx")], - ["styled-jsx/style", require.resolve("styled-jsx/style")], - ], - "app" - ); -} - -const toResolveMap = (map: Record): [string, string][] => - Object.entries(map).map(([key, value]) => [key, require.resolve(value)]); - -// Override built-in React packages if necessary -function overrideReact(config: NextConfig) { - addHookAliases([["react", require.resolve("react")]], "page"); - - // ignore: react/jsx-dev-runtime is not available on older version of Next.js ie. v13.1.6 - // react/jsx-runtime is not available on newer version of Next.js ie. v13.4.10-canary.3 - try { - addHookAliases([["react/jsx-runtime", require.resolve("react/jsx-runtime")]], "page"); - addHookAliases([["react/jsx-dev-runtime", require.resolve("react/jsx-dev-runtime")]], "page"); - } catch (e) {} - - if (config.experimental.appDir) { - if (config.experimental.serverActions) { - addHookAliases(toResolveMap(experimentalOverrides), "app"); - } else { - addHookAliases(toResolveMap(baseOverrides), "app"); - } - } -} - -function isApp() { - return ( - process.env.__NEXT_PRIVATE_PREBUNDLED_REACT === "next" || - process.env.__NEXT_PRIVATE_PREBUNDLED_REACT === "experimental" - ); -} - -export function applyOverride() { - mod._resolveFilename = (( - originalResolveFilename: typeof resolveFilename, - requestMapApp: Map, - requestMapPage: Map, - request: string, - parent: unknown, - isMain: boolean, - options: unknown - ) => { - const hookResolved = isApp() ? requestMapApp.get(request) : requestMapPage.get(request); - // oxlint-disable-next-line no-param-reassign - if (hookResolved) request = hookResolved; - return originalResolveFilename.call(mod, request, parent, isMain, options); - - // We use `bind` here to avoid referencing outside variables to create potential memory leaks. - }).bind(null, resolveFilename, hookPropertyMapApp, hookPropertyMapPage); -} From 56061660ae9a87b0efde75531f00baf7458aa443 Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 14 Feb 2026 18:24:47 +0100 Subject: [PATCH 6/8] review --- packages/cloudflare/package.json | 2 +- packages/open-next/package.json | 2 +- .../open-next/src/adapters/image-optimization-adapter.ts | 2 +- packages/open-next/src/build/copyTracedFiles.ts | 4 +--- .../open-next/src/build/createImageOptimizationBundle.ts | 5 ----- packages/open-next/src/build/createServerBundle.ts | 4 ---- 6 files changed, 4 insertions(+), 15 deletions(-) diff --git a/packages/cloudflare/package.json b/packages/cloudflare/package.json index be466371..e1846b6d 100644 --- a/packages/cloudflare/package.json +++ b/packages/cloudflare/package.json @@ -77,7 +77,7 @@ "vitest": "catalog:" }, "peerDependencies": { - "next": "^14.2.35 || ~15.0.7 || ~15.1.11 || ~15.2.8 || ~15.3.8 || ~15.4.10 || ~15.5.9 || ^16.0.10", + "next": "^16.0.10", "wrangler": "catalog:" } } diff --git a/packages/open-next/package.json b/packages/open-next/package.json index f05d88a7..ecfe0339 100644 --- a/packages/open-next/package.json +++ b/packages/open-next/package.json @@ -73,6 +73,6 @@ "typescript": "catalog:aws" }, "peerDependencies": { - "next": "^14.2.35 || ~15.0.7 || ~15.1.11 || ~15.2.8 || ~15.3.8 || ~15.4.10 || ~15.5.9 || ^16.0.10" + "next": "^16.0.10" } } diff --git a/packages/open-next/src/adapters/image-optimization-adapter.ts b/packages/open-next/src/adapters/image-optimization-adapter.ts index 4167d650..4c648519 100644 --- a/packages/open-next/src/adapters/image-optimization-adapter.ts +++ b/packages/open-next/src/adapters/image-optimization-adapter.ts @@ -223,7 +223,7 @@ async function downloadHandler(_req: IncomingMessage, res: ServerResponse, url?: try { // Case 1: remote image URL => download the image from the URL - if (url?.href.toLowerCase().match(/^https?:\/\//)) { + if (url?.href?.toLowerCase().match(/^https?:\/\//)) { pipeRes(https.get(url), res); } // Case 2: local image => download the image from S3 diff --git a/packages/open-next/src/build/copyTracedFiles.ts b/packages/open-next/src/build/copyTracedFiles.ts index 3f41300b..cc4af4ea 100644 --- a/packages/open-next/src/build/copyTracedFiles.ts +++ b/packages/open-next/src/build/copyTracedFiles.ts @@ -66,7 +66,6 @@ interface CopyTracedFilesOptions { packagePath: string; outputDir: string; routes: string[]; - bundledNextServer: boolean; skipServerFiles?: boolean; } @@ -87,7 +86,6 @@ export async function copyTracedFiles({ packagePath, outputDir, routes, - bundledNextServer, skipServerFiles, }: CopyTracedFilesOptions) { const tsStart = Date.now(); @@ -130,7 +128,7 @@ export async function copyTracedFiles({ if (!skipServerFiles) { // On next 14+, we might not have to include those files // For next 13, we need to include them otherwise we get runtime error - const nftFile = bundledNextServer ? "next-minimal-server.js.nft.json" : "next-server.js.nft.json"; + const nftFile = "next-server.js.nft.json"; processNftFile(nftFile); } diff --git a/packages/open-next/src/build/createImageOptimizationBundle.ts b/packages/open-next/src/build/createImageOptimizationBundle.ts index 49843bb7..f8b1e438 100644 --- a/packages/open-next/src/build/createImageOptimizationBundle.ts +++ b/packages/open-next/src/build/createImageOptimizationBundle.ts @@ -1,18 +1,13 @@ import fs from "node:fs"; -import { createRequire } from "node:module"; import os from "node:os"; import path from "node:path"; import logger from "../logger.js"; -import { openNextReplacementPlugin } from "../plugins/replacement.js"; import { openNextResolvePlugin } from "../plugins/resolve.js"; -import { getCrossPlatformPathRegex } from "../utils/regex.js"; import * as buildHelper from "./helper.js"; import { installDependencies } from "./installDeps.js"; -const require = createRequire(import.meta.url); - export async function createImageOptimizationBundle(options: buildHelper.BuildOptions) { logger.info("Bundling image optimization function..."); diff --git a/packages/open-next/src/build/createServerBundle.ts b/packages/open-next/src/build/createServerBundle.ts index d8c663ca..9f2106d8 100644 --- a/packages/open-next/src/build/createServerBundle.ts +++ b/packages/open-next/src/build/createServerBundle.ts @@ -1,5 +1,4 @@ import fs from "node:fs"; -import { createRequire } from "node:module"; import path from "node:path"; import type { Plugin } from "esbuild"; @@ -15,7 +14,6 @@ import { openNextReplacementPlugin } from "../plugins/replacement.js"; import { openNextResolvePlugin } from "../plugins/resolve.js"; import { getCrossPlatformPathRegex } from "../utils/regex.js"; -import { bundleNextServer } from "./bundleNextServer.js"; import { compileCache } from "./compileCache.js"; import { copyAdapterFiles } from "./copyAdapterFiles.js"; import { copyTracedFiles, getManifests } from "./copyTracedFiles.js"; @@ -24,7 +22,6 @@ import * as buildHelper from "./helper.js"; import { installDependencies } from "./installDeps.js"; import { type CodePatcher, applyCodePatches } from "./patch/codePatcher.js"; import * as patches from "./patch/patches/index.js"; -const require = createRequire(import.meta.url); interface CodeCustomization { // These patches are meant to apply on user and next generated code @@ -189,7 +186,6 @@ async function generateBundle( packagePath, outputDir: outputPath, routes: fnOptions.routes ?? ["app/page.tsx"], - bundledNextServer: false, skipServerFiles: options.config.dangerous?.useAdapterOutputs === true, }); tracedFiles = oldTracedFileOutput.tracedFiles; From d3e61bb4851da4359c39ce1e4566ba9703d90d3b Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 14 Feb 2026 18:33:46 +0100 Subject: [PATCH 7/8] fix test --- packages/open-next/src/adapters/cache.ts | 30 +++++-------------- .../tests-unit/tests/adapters/cache.test.ts | 28 +++++++---------- 2 files changed, 19 insertions(+), 39 deletions(-) diff --git a/packages/open-next/src/adapters/cache.ts b/packages/open-next/src/adapters/cache.ts index a990ed8e..2e2ea4dd 100644 --- a/packages/open-next/src/adapters/cache.ts +++ b/packages/open-next/src/adapters/cache.ts @@ -7,20 +7,9 @@ import { debug, error, warn } from "./logger"; export const SOFT_TAG_PREFIX = "_N_T_/"; -function isFetchCache( - options?: - | boolean - | { - fetchCache?: boolean; - kindHint?: "app" | "pages" | "fetch"; - kind?: "FETCH"; - } -): boolean { - if (typeof options === "boolean") { - return options; - } +function isFetchCache(options?: { kindHint?: "app" | "pages" | "fetch"; kind?: "FETCH" }): boolean { if (typeof options === "object") { - return options.kindHint === "fetch" || options.fetchCache || options.kind === "FETCH"; + return options.kindHint === "fetch" || options.kind === "FETCH"; } return false; } @@ -29,15 +18,12 @@ export default class Cache { public async get( key: string, // fetchCache is for next 13.5 and above, kindHint is for next 14 and above and boolean is for earlier versions - options?: - | boolean - | { - fetchCache?: boolean; - kindHint?: "app" | "pages" | "fetch"; - tags?: string[]; - softTags?: string[]; - kind?: "FETCH"; - } + options?: { + kindHint?: "app" | "pages" | "fetch"; + tags?: string[]; + softTags?: string[]; + kind?: "FETCH"; + } ) { if (globalThis.openNextConfig?.dangerous?.disableIncrementalCache) { return null; diff --git a/packages/tests-unit/tests/adapters/cache.test.ts b/packages/tests-unit/tests/adapters/cache.test.ts index e33c1214..65f23d76 100644 --- a/packages/tests-unit/tests/adapters/cache.test.ts +++ b/packages/tests-unit/tests/adapters/cache.test.ts @@ -111,12 +111,6 @@ describe("CacheHandler", () => { }); describe("fetch cache", () => { - it("Should retrieve cache from fetch cache when fetch cache is true (next 13.5+)", async () => { - await cache.get("key", { fetchCache: true }); - - expect(getFetchCacheSpy).toHaveBeenCalled(); - }); - it("Should retrieve cache from fetch cache when hint is fetch (next14)", async () => { await cache.get("key", { kindHint: "fetch" }); @@ -124,10 +118,6 @@ describe("CacheHandler", () => { }); describe("next15", () => { - beforeEach(() => { - globalThis.isNextAfter15 = true; - }); - it("Should retrieve cache from fetch cache when hint is fetch", async () => { await cache.get("key", { kind: "FETCH" }); @@ -228,7 +218,7 @@ describe("CacheHandler", () => { expect(getIncrementalCache).toHaveBeenCalled(); expect(result).toEqual({ value: { - kind: "ROUTE", + kind: "APP_ROUTE", body: Buffer.from("{}"), }, lastModified: Date.now(), @@ -254,7 +244,7 @@ describe("CacheHandler", () => { expect(getIncrementalCache).toHaveBeenCalled(); expect(result).toEqual({ value: { - kind: "ROUTE", + kind: "APP_ROUTE", body: Buffer.from("hello"), headers: { "content-type": "image/png", @@ -282,10 +272,13 @@ describe("CacheHandler", () => { expect(getIncrementalCache).toHaveBeenCalled(); expect(result).toEqual({ value: { - kind: "PAGE", + kind: "APP_PAGE", html: "", - pageData: "rsc", + rscData: Buffer.from("rsc"), status: 200, + headers: undefined, + postponed: undefined, + segmentData: new Map(), }, lastModified: Date.now(), }); @@ -309,10 +302,11 @@ describe("CacheHandler", () => { expect(getIncrementalCache).toHaveBeenCalled(); expect(result).toEqual({ value: { - kind: "PAGE", + kind: "PAGES", html: "", pageData: {}, status: 200, + headers: undefined, }, lastModified: Date.now(), }); @@ -757,7 +751,7 @@ describe("CacheHandler", () => { expect(tagCache.getLastModified).not.toHaveBeenCalled(); expect(tagCache.hasBeenRevalidated).not.toHaveBeenCalled(); expect(result).not.toBeNull(); - expect(result?.value?.kind).toEqual("ROUTE"); + expect(result?.value?.kind).toEqual("APP_ROUTE"); }); it("Should not bypass tag cache validation when shouldBypassTagCache is false", async () => { @@ -815,7 +809,7 @@ describe("CacheHandler", () => { expect(tagCache.getLastModified).not.toHaveBeenCalled(); expect(tagCache.hasBeenRevalidated).not.toHaveBeenCalled(); expect(result).not.toBeNull(); - expect(result?.value?.kind).toEqual("ROUTE"); + expect(result?.value?.kind).toEqual("APP_ROUTE"); }); }); }); From 8ad83c110068ce6e439c449aa73ba4b32930d758 Mon Sep 17 00:00:00 2001 From: Nicolas Dorseuil Date: Sat, 14 Feb 2026 18:39:52 +0100 Subject: [PATCH 8/8] fix --- .../cli/build/open-next/createServerBundle.ts | 1 - .../build/middleware/buildNodeMiddleware.ts | 1 - pnpm-lock.yaml | 205 +----------------- 3 files changed, 2 insertions(+), 205 deletions(-) diff --git a/packages/cloudflare/src/cli/build/open-next/createServerBundle.ts b/packages/cloudflare/src/cli/build/open-next/createServerBundle.ts index 0f3c52b8..010526ab 100644 --- a/packages/cloudflare/src/cli/build/open-next/createServerBundle.ts +++ b/packages/cloudflare/src/cli/build/open-next/createServerBundle.ts @@ -199,7 +199,6 @@ async function generateBundle( packagePath, outputDir: outputPath, routes: fnOptions.routes ?? ["app/page.tsx"], - bundledNextServer: false, skipServerFiles: options.config.dangerous?.useAdapterOutputs === true, }); tracedFiles = oldTracedFileOutput.tracedFiles; diff --git a/packages/open-next/src/build/middleware/buildNodeMiddleware.ts b/packages/open-next/src/build/middleware/buildNodeMiddleware.ts index fe3a17fc..ace00ee4 100644 --- a/packages/open-next/src/build/middleware/buildNodeMiddleware.ts +++ b/packages/open-next/src/build/middleware/buildNodeMiddleware.ts @@ -43,7 +43,6 @@ export async function buildExternalNodeMiddleware(options: buildHelper.BuildOpti packagePath, outputDir: outputPath, routes: [], - bundledNextServer: false, skipServerFiles: true, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ce7e5b59..be9568b3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1382,8 +1382,8 @@ importers: specifier: ^5.2.1 version: 5.2.1 next: - specifier: ^14.2.35 || ~15.0.7 || ~15.1.11 || ~15.2.8 || ~15.3.8 || ~15.4.10 || ~15.5.9 || ^16.0.10 - version: 16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^16.0.10 + version: 16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) path-to-regexp: specifier: ^6.3.0 version: 6.3.0 @@ -1505,28 +1505,24 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@ast-grep/napi-linux-arm64-musl@0.40.0': resolution: {integrity: sha512-MS9qalLRjUnF2PCzuTKTvCMVSORYHxxe3Qa0+SSaVULsXRBmuy5C/b1FeWwMFnwNnC0uie3VDet31Zujwi8q6A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@ast-grep/napi-linux-x64-gnu@0.40.0': resolution: {integrity: sha512-BeHZVMNXhM3WV3XE2yghO0fRxhMOt8BTN972p5piYEQUvKeSHmS8oeGcs6Ahgx5znBclqqqq37ZfioYANiTqJA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@ast-grep/napi-linux-x64-musl@0.40.0': resolution: {integrity: sha512-rG1YujF7O+lszX8fd5u6qkFTuv4FwHXjWvt1CCvCxXwQLSY96LaCW88oVKg7WoEYQh54y++Fk57F+Wh9Gv9nVQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@ast-grep/napi-win32-arm64-msvc@0.40.0': resolution: {integrity: sha512-9SqmnQqd4zTEUk6yx0TuW2ycZZs2+e569O/R0QnhSiQNpgwiJCYOe/yPS0BC9HkiaozQm6jjAcasWpFtz/dp+w==} @@ -3655,183 +3651,155 @@ packages: resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-arm64@1.2.4': resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] - libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] - libc: [glibc] '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} @@ -4029,9 +3997,6 @@ packages: '@next/env@15.5.9': resolution: {integrity: sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==} - '@next/env@16.0.10': - resolution: {integrity: sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==} - '@next/env@16.1.4': resolution: {integrity: sha512-gkrXnZyxPUy0Gg6SrPQPccbNVLSP3vmW8LU5dwEttEEC1RwDivk8w4O+sZIjFvPrSICXyhQDCG+y3VmjlJf+9A==} @@ -4053,12 +4018,6 @@ packages: cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@16.0.10': - resolution: {integrity: sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - '@next/swc-darwin-arm64@16.1.4': resolution: {integrity: sha512-T8atLKuvk13XQUdVLCv1ZzMPgLPW0+DWWbHSQXs0/3TjPrKNxTmUIhOEaoEyl3Z82k8h/gEtqyuoZGv6+Ugawg==} engines: {node: '>= 10'} @@ -4083,12 +4042,6 @@ packages: cpu: [x64] os: [darwin] - '@next/swc-darwin-x64@16.0.10': - resolution: {integrity: sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - '@next/swc-darwin-x64@16.1.4': resolution: {integrity: sha512-AKC/qVjUGUQDSPI6gESTx0xOnOPQ5gttogNS3o6bA83yiaSZJek0Am5yXy82F1KcZCx3DdOwdGPZpQCluonuxg==} engines: {node: '>= 10'} @@ -4100,140 +4053,96 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@next/swc-linux-arm64-gnu@15.4.0-canary.14': resolution: {integrity: sha512-u/eeGK9okYiJ24aLcrq2jOCyOnjhzOM/MkcOOMkzE4/Rp7EKIepnGUhnIcLeLmcQw4RCDAjh3QZBqt5rQEm4fA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@next/swc-linux-arm64-gnu@15.5.7': resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] - - '@next/swc-linux-arm64-gnu@16.0.10': - resolution: {integrity: sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [glibc] '@next/swc-linux-arm64-gnu@16.1.4': resolution: {integrity: sha512-POQ65+pnYOkZNdngWfMEt7r53bzWiKkVNbjpmCt1Zb3V6lxJNXSsjwRuTQ8P/kguxDC8LRkqaL3vvsFrce4dMQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@next/swc-linux-arm64-musl@15.0.0-canary.174': resolution: {integrity: sha512-NzfcraJW3jpWDx3dJHzMxLFUAJxdq9GROpO49SIWXu9HKmdZszrInTfnYK98v2C73FNnpFoCGEvBYi/GTnvECw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@next/swc-linux-arm64-musl@15.4.0-canary.14': resolution: {integrity: sha512-6eODbSA592cYMYtBU9Vm2D8ApXn6dBh/cN7GQlsTiDBIlCId9Z8DlkGCDj/9thr0JEluUlkt379+B19BGxsCEg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@next/swc-linux-arm64-musl@15.5.7': resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] - - '@next/swc-linux-arm64-musl@16.0.10': - resolution: {integrity: sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [musl] '@next/swc-linux-arm64-musl@16.1.4': resolution: {integrity: sha512-3Wm0zGYVCs6qDFAiSSDL+Z+r46EdtCv/2l+UlIdMbAq9hPJBvGu/rZOeuvCaIUjbArkmXac8HnTyQPJFzFWA0Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@next/swc-linux-x64-gnu@15.0.0-canary.174': resolution: {integrity: sha512-fJ5W8PrbZZkxCrtX9lmlqn43zvUrQQ5wF/GxcQDFdcwT9l3lx8IhdMZH7Q5rWuikWpI0pU+jqqRdhTpODqpuHA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@next/swc-linux-x64-gnu@15.4.0-canary.14': resolution: {integrity: sha512-FwOtQDbMLJmGPCg8p1ZilCBjfjBZGBRwXnWmxLmpO4lcWTWMFTCfAxkqCUi62zXBZUJztqT8TgXQ9VBk4BKukQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@next/swc-linux-x64-gnu@15.5.7': resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] - - '@next/swc-linux-x64-gnu@16.0.10': - resolution: {integrity: sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] '@next/swc-linux-x64-gnu@16.1.4': resolution: {integrity: sha512-lWAYAezFinaJiD5Gv8HDidtsZdT3CDaCeqoPoJjeB57OqzvMajpIhlZFce5sCAH6VuX4mdkxCRqecCJFwfm2nQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@next/swc-linux-x64-musl@15.0.0-canary.174': resolution: {integrity: sha512-OMSzmdZxrh5c7X46ILiK3GvTPgSZghpSFF4wrnXloBpW1LrbbjSYGVSGer5IoVqXR18lpnMscsV9N35FX0MIVw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@next/swc-linux-x64-musl@15.4.0-canary.14': resolution: {integrity: sha512-0k8lkaryoYsB4wksRm/5SlWWtJjuq6vOzQ/zqKRlNdpNvsvzZ61sEaCLZn1zdcFcUVH6wSzK/GMclcpn2w0VAg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@next/swc-linux-x64-musl@15.5.7': resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] - - '@next/swc-linux-x64-musl@16.0.10': - resolution: {integrity: sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] '@next/swc-linux-x64-musl@16.1.4': resolution: {integrity: sha512-fHaIpT7x4gA6VQbdEpYUXRGyge/YbRrkG6DXM60XiBqDM2g2NcrsQaIuj375egnGFkJow4RHacgBOEsHfGbiUw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@next/swc-win32-arm64-msvc@15.0.0-canary.174': resolution: {integrity: sha512-pjqvXOMBKbsG5u8I/vBeyxLN31p5dYIF1bP2zoIhjpsLU9eWx5ikKrQ7/qMpJDpWzTHgpzWGujPtEfvi1kd97w==} @@ -4253,12 +4162,6 @@ packages: cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@16.0.10': - resolution: {integrity: sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - '@next/swc-win32-arm64-msvc@16.1.4': resolution: {integrity: sha512-MCrXxrTSE7jPN1NyXJr39E+aNFBrQZtO154LoCz7n99FuKqJDekgxipoodLNWdQP7/DZ5tKMc/efybx1l159hw==} engines: {node: '>= 10'} @@ -4289,12 +4192,6 @@ packages: cpu: [x64] os: [win32] - '@next/swc-win32-x64-msvc@16.0.10': - resolution: {integrity: sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - '@next/swc-win32-x64-msvc@16.1.4': resolution: {integrity: sha512-JSVlm9MDhmTXw/sO2PE/MRj+G6XOSMZB+BcZ0a7d6KwVFZVpkHcb2okyoYFBaco6LeiL53BBklRlOrDDbOeE5w==} engines: {node: '>= 10'} @@ -4424,25 +4321,21 @@ packages: resolution: {integrity: sha512-aql/LLYriX/5Ar7o5Qivnp/qMTUPNiOCr7cFLvmvzYZa3XL0H8XtbKUfIVm+9ILR0urXQzcml+L8pLe1p8sgEg==} cpu: [arm64] os: [linux] - libc: [glibc] '@oxfmt/linux-arm64-musl@0.27.0': resolution: {integrity: sha512-6u/kNb7hubthg4u/pn3MK/GJLwPgjDvDDnjjr7TC0/OK/xztef8ToXmycxIQ9OeDNIJJf7Z0Ss/rHnKvQOWzRw==} cpu: [arm64] os: [linux] - libc: [musl] '@oxfmt/linux-x64-gnu@0.27.0': resolution: {integrity: sha512-EhvDfFHO1yrK/Cu75eU1U828lBsW2cV0JITOrka5AjR3PlmnQQ03Mr9ROkWkbPmzAMklXI4Q16eO+4n+7FhS1w==} cpu: [x64] os: [linux] - libc: [glibc] '@oxfmt/linux-x64-musl@0.27.0': resolution: {integrity: sha512-1pgjuwMT5sCekuteYZ7LkDsto7DJouaccwjozHqdWohSj2zJpFeSP2rMaC+6JJ1KD5r9HG9sWRuHZGEaoX9uOw==} cpu: [x64] os: [linux] - libc: [musl] '@oxfmt/win32-arm64@0.27.0': resolution: {integrity: sha512-mmuEhXZEhAYAeyjVTWwGKIA3RSb2b/He9wrXkDJPhmqp8qISUzkVg1dQmLEt4hD+wI5rzR+6vchPt521tzuRDA==} @@ -4468,25 +4361,21 @@ packages: resolution: {integrity: sha512-j4QzfCM8ks+OyM+KKYWDiBEQsm5RCW50H1Wz16wUyoFsobJ+X5qqcJxq6HvkE07m8euYmZelyB0WqsiDoz1v8g==} cpu: [arm64] os: [linux] - libc: [glibc] '@oxlint/linux-arm64-musl@1.42.0': resolution: {integrity: sha512-g5b1Uw7zo6yw4Ymzyd1etKzAY7xAaGA3scwB8tAp3QzuY7CYdfTwlhiLKSAKbd7T/JBgxOXAGNcLDorJyVTXcg==} cpu: [arm64] os: [linux] - libc: [musl] '@oxlint/linux-x64-gnu@1.42.0': resolution: {integrity: sha512-HnD99GD9qAbpV4q9iQil7mXZUJFpoBdDavfcC2CgGLPlawfcV5COzQPNwOgvPVkr7C0cBx6uNCq3S6r9IIiEIg==} cpu: [x64] os: [linux] - libc: [glibc] '@oxlint/linux-x64-musl@1.42.0': resolution: {integrity: sha512-8NTe8A78HHFn+nBi+8qMwIjgv9oIBh+9zqCPNLH56ah4vKOPvbePLI6NIv9qSkmzrBuu8SB+FJ2TH/G05UzbNA==} cpu: [x64] os: [linux] - libc: [musl] '@oxlint/win32-arm64@1.42.0': resolution: {integrity: sha512-lAPS2YAuu+qFqoTNPFcNsxXjwSV0M+dOgAzzVTAN7Yo2ifj+oLOx0GsntWoM78PvQWI7Q827ZxqtU2ImBmDapA==} @@ -4668,55 +4557,46 @@ packages: resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.24.0': resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.24.0': resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.24.0': resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.24.0': resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.24.0': resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.24.0': resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.24.0': resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.24.0': resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==} @@ -5464,28 +5344,24 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.1.18': resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.1.18': resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.1.18': resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.1.18': resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} @@ -8038,7 +7914,6 @@ packages: libsql@0.4.7: resolution: {integrity: sha512-T9eIRCs6b0J1SHKYIvD8+KCJMcWZ900iZyxdnSCdqxN12Z1ijzT+jY5nrk72Jw4B0HGzms2NgpryArlJqvc3Lw==} - cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] lightningcss-android-arm64@1.30.2: @@ -8076,28 +7951,24 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] lightningcss-linux-arm64-musl@1.30.2: resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [musl] lightningcss-linux-x64-gnu@1.30.2: resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [glibc] lightningcss-linux-x64-musl@1.30.2: resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [musl] lightningcss-win32-arm64-msvc@1.30.2: resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} @@ -8650,27 +8521,6 @@ packages: sass: optional: true - next@16.0.10: - resolution: {integrity: sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==} - engines: {node: '>=20.9.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.51.1 - babel-plugin-react-compiler: '*' - react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - babel-plugin-react-compiler: - optional: true - sass: - optional: true - next@16.1.4: resolution: {integrity: sha512-gKSecROqisnV7Buen5BfjmXAm7Xlpx9o2ueVQRo5DxQcjC8d330dOM1xiGWc2k3Dcnz0In3VybyRPOsudwgiqQ==} engines: {node: '>=20.9.0'} @@ -14807,8 +14657,6 @@ snapshots: '@next/env@15.5.9': {} - '@next/env@16.0.10': {} - '@next/env@16.1.4': {} '@next/swc-darwin-arm64@15.0.0-canary.174': @@ -14820,9 +14668,6 @@ snapshots: '@next/swc-darwin-arm64@15.5.7': optional: true - '@next/swc-darwin-arm64@16.0.10': - optional: true - '@next/swc-darwin-arm64@16.1.4': optional: true @@ -14835,9 +14680,6 @@ snapshots: '@next/swc-darwin-x64@15.5.7': optional: true - '@next/swc-darwin-x64@16.0.10': - optional: true - '@next/swc-darwin-x64@16.1.4': optional: true @@ -14850,9 +14692,6 @@ snapshots: '@next/swc-linux-arm64-gnu@15.5.7': optional: true - '@next/swc-linux-arm64-gnu@16.0.10': - optional: true - '@next/swc-linux-arm64-gnu@16.1.4': optional: true @@ -14865,9 +14704,6 @@ snapshots: '@next/swc-linux-arm64-musl@15.5.7': optional: true - '@next/swc-linux-arm64-musl@16.0.10': - optional: true - '@next/swc-linux-arm64-musl@16.1.4': optional: true @@ -14880,9 +14716,6 @@ snapshots: '@next/swc-linux-x64-gnu@15.5.7': optional: true - '@next/swc-linux-x64-gnu@16.0.10': - optional: true - '@next/swc-linux-x64-gnu@16.1.4': optional: true @@ -14895,9 +14728,6 @@ snapshots: '@next/swc-linux-x64-musl@15.5.7': optional: true - '@next/swc-linux-x64-musl@16.0.10': - optional: true - '@next/swc-linux-x64-musl@16.1.4': optional: true @@ -14910,9 +14740,6 @@ snapshots: '@next/swc-win32-arm64-msvc@15.5.7': optional: true - '@next/swc-win32-arm64-msvc@16.0.10': - optional: true - '@next/swc-win32-arm64-msvc@16.1.4': optional: true @@ -14928,9 +14755,6 @@ snapshots: '@next/swc-win32-x64-msvc@15.5.7': optional: true - '@next/swc-win32-x64-msvc@16.0.10': - optional: true - '@next/swc-win32-x64-msvc@16.1.4': optional: true @@ -20140,31 +19964,6 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): - dependencies: - '@next/env': 16.0.10 - '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001669 - postcss: 8.4.31 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - styled-jsx: 5.1.6(react@19.2.3) - optionalDependencies: - '@next/swc-darwin-arm64': 16.0.10 - '@next/swc-darwin-x64': 16.0.10 - '@next/swc-linux-arm64-gnu': 16.0.10 - '@next/swc-linux-arm64-musl': 16.0.10 - '@next/swc-linux-x64-gnu': 16.0.10 - '@next/swc-linux-x64-musl': 16.0.10 - '@next/swc-win32-arm64-msvc': 16.0.10 - '@next/swc-win32-x64-msvc': 16.0.10 - '@opentelemetry/api': 1.9.0 - '@playwright/test': 1.58.0 - sharp: 0.34.5 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - next@16.1.4(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(react-dom@19.0.3(react@19.0.3))(react@19.0.3): dependencies: '@next/env': 16.1.4