diff --git a/js/plugins/vercel-ai-sdk/.npmignore b/js/plugins/vercel-ai-sdk/.npmignore new file mode 100644 index 0000000000..8738dcd658 --- /dev/null +++ b/js/plugins/vercel-ai-sdk/.npmignore @@ -0,0 +1,3 @@ +node_modules +tsconfig.json +tsup.config.ts diff --git a/js/plugins/vercel-ai-sdk/README.md b/js/plugins/vercel-ai-sdk/README.md new file mode 100644 index 0000000000..70ef39dc63 --- /dev/null +++ b/js/plugins/vercel-ai-sdk/README.md @@ -0,0 +1,154 @@ +# @genkit-ai/vercel-ai-sdk + +Adapter helpers that connect [Genkit](https://genkit.dev) streaming flows to the [Vercel AI SDK](https://sdk.vercel.ai) UI hooks: `useChat()`, `useCompletion()`, and `useObject()`. + +Each handler returns a standard `(req: Request) => Promise` compatible with any Fetch API framework — Next.js App Router, Hono, SvelteKit, Cloudflare Workers, etc. + +## Installation + +```bash +npm install @genkit-ai/vercel-ai-sdk +``` + +**Peer dependencies:** `ai >= 6.0.0`, `genkit`, `zod` + +## Handlers + +### `chatHandler` — `useChat()` + +Wraps a flow that takes `MessagesSchema` as input and emits `StreamChunkSchema` stream chunks. + +```ts +// src/app/api/chat/route.ts +import { chatHandler } from '@genkit-ai/vercel-ai-sdk'; +import { chatFlow } from '@/genkit/chat'; + +export const POST = chatHandler(chatFlow); +``` + +```ts +// src/genkit/chat.ts +import { + FlowOutputSchema, MessagesSchema, StreamChunkSchema, + toFlowOutput, toStreamChunks, +} from '@genkit-ai/vercel-ai-sdk'; + +export const chatFlow = ai.defineFlow( + { + name: 'chat', + inputSchema: MessagesSchema, + outputSchema: FlowOutputSchema, + streamSchema: StreamChunkSchema, + }, + async (input, { sendChunk }) => { + const { stream, response } = ai.generateStream({ + messages: input.messages, + }); + for await (const chunk of stream) { + for (const c of toStreamChunks(chunk)) sendChunk(c); + } + return toFlowOutput(await response); + } +); +``` + +### `completionHandler` — `useCompletion()` + +Wraps a flow that takes `z.string()` as input and uses `StreamChunkSchema` as `streamSchema`. Supports both SSE (`'data'`) and plain text (`'text'`) stream protocols — in text mode only `{ type: 'text', delta }` chunks are forwarded; all other chunk types are skipped. + +```ts +// src/app/api/completion/route.ts +import { completionHandler } from '@genkit-ai/vercel-ai-sdk'; +import { completionFlow } from '@/genkit/completion'; + +export const POST = completionHandler(completionFlow); +// Or for streamProtocol: 'text': +// export const POST = completionHandler(completionFlow, { streamProtocol: 'text' }); +``` + +### `objectHandler` — `useObject()` + +Wraps a flow that streams raw JSON text fragments. `useObject` reassembles them into a typed partial object in real time. + +```ts +// src/app/api/notifications/route.ts +import { objectHandler } from '@genkit-ai/vercel-ai-sdk'; +import { notificationsFlow } from '@/genkit/notifications'; + +export const POST = objectHandler(notificationsFlow); +``` + +## StreamChunkSchema + +A discriminated union flows can use as `streamSchema` to drive the full UI Message Stream protocol: + +| Chunk type | Wire events emitted | +|---|---| +| `{ type: 'text', delta }` | `text-start` (lazy) + `text-delta` | +| `{ type: 'reasoning', delta }` | `reasoning-start` (lazy) + `reasoning-delta` | +| `{ type: 'tool-request', toolCallId, toolName, inputDelta? \| input? }` | `tool-input-start` + `tool-input-delta` or `tool-input-available` | +| `{ type: 'tool-result', toolCallId, output }` | `tool-output-available` | +| `{ type: 'tool-input-error', toolCallId, toolName, input, errorText }` | `tool-input-start` + `tool-input-error` | +| `{ type: 'tool-output-error', toolCallId, errorText }` | `tool-output-error` | +| `{ type: 'tool-output-denied', toolCallId }` | `tool-output-denied` | +| `{ type: 'tool-approval-request', approvalId, toolCallId }` | `tool-approval-request` | +| `{ type: 'file', url, mediaType }` | `file` | +| `{ type: 'source-url', sourceId, url, title? }` | `source-url` | +| `{ type: 'source-document', sourceId, mediaType, title, filename? }` | `source-document` | +| `{ type: 'data', id, value }` | `data-${id}` | +| `{ type: 'step-start' }` | `start-step` | +| `{ type: 'step-end' }` | `finish-step` + closes open blocks | + +In `completionHandler` with `streamProtocol: 'text'`, only `{ type: 'text', delta }` chunks are forwarded; all other chunk types are skipped. + +## Auth / Context + +All three handlers accept a `contextProvider` to extract server-side context (e.g. from auth headers) and forward it to the flow: + +```ts +export const POST = chatHandler(chatFlow, { + contextProvider: async ({ headers }) => { + const token = headers['authorization']?.slice(7); + if (!token) throw Object.assign(new Error('Unauthorized'), { status: 401 }); + return { userId: await verifyToken(token) }; + }, +}); +``` + +## Client-supplied context + +### `useChat` body passthrough + +Extra fields sent by the client via `useChat({ body: { ... } })` are forwarded to the flow as `input.body`: + +```ts +// Client +const { messages } = useChat({ api: '/api/chat', body: { sessionId: 'abc' } }); + +// Flow receives: { messages: [...], body: { sessionId: 'abc' } } +``` + +### `useCompletion` body passthrough + +Extra fields sent via `useCompletion({ body: { ... } })` are available in `contextProvider`. Place anything the flow needs into the returned context object — Genkit stores it in async-local storage so `ai.generate()` calls and tools within the flow can access it automatically: + +```ts +export const POST = completionHandler(completionFlow, { + contextProvider: async ({ headers, input }) => { + const token = headers['authorization']?.slice(7); + return { userId: await verifyToken(token), sessionId: input.sessionId }; + }, +}); +``` + +## Framework compatibility + +Handlers return a standard Fetch API `Response` and work in any runtime that supports the Web Platform APIs: + +- **Next.js** App Router (Node.js and Edge) +- **Hono**, **SvelteKit**, **Remix**, **Astro** +- **Cloudflare Workers**, **Deno**, **Bun** + +## License + +Apache 2.0 diff --git a/js/plugins/vercel-ai-sdk/package.json b/js/plugins/vercel-ai-sdk/package.json new file mode 100644 index 0000000000..632a4cfe90 --- /dev/null +++ b/js/plugins/vercel-ai-sdk/package.json @@ -0,0 +1,58 @@ +{ + "name": "@genkit-ai/vercel-ai-sdk", + "description": "Genkit adapters for the Vercel AI SDK UI hooks (useChat, useCompletion, useObject)", + "keywords": [ + "genkit", + "genkit-plugin", + "ai", + "genai", + "generative-ai", + "vercel", + "ai-sdk", + "useChat", + "useCompletion", + "useObject" + ], + "version": "1.0.0", + "type": "commonjs", + "scripts": { + "check": "tsc", + "compile": "tsup-node", + "build:clean": "rimraf ./lib", + "build": "npm-run-all build:clean check compile", + "build:watch": "tsup-node --watch", + "test": "node --import tsx --test tests/*_test.ts" + }, + "repository": { + "type": "git", + "url": "https://github.com/genkit-ai/genkit.git", + "directory": "js/plugins/vercel-ai-sdk" + }, + "author": "genkit", + "license": "Apache-2.0", + "peerDependencies": { + "ai": ">=6.0.0", + "genkit": "workspace:^", + "zod": "^3.24.1" + }, + "devDependencies": { + "@types/node": "^20.11.16", + "ai": "^6.0.156", + "genkit": "workspace:^", + "npm-run-all": "^4.1.5", + "rimraf": "^6.0.1", + "tsup": "^8.3.5", + "tsx": "^4.19.2", + "typescript": "^5.9.3", + "zod": "^3.24.1" + }, + "types": "./lib/index.d.ts", + "exports": { + ".": { + "require": "./lib/index.js", + "default": "./lib/index.js", + "import": "./lib/index.mjs", + "types": "./lib/index.d.ts" + } + } +} diff --git a/js/plugins/vercel-ai-sdk/src/chat.ts b/js/plugins/vercel-ai-sdk/src/chat.ts new file mode 100644 index 0000000000..0b2b47fba9 --- /dev/null +++ b/js/plugins/vercel-ai-sdk/src/chat.ts @@ -0,0 +1,182 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { type ContextProvider } from 'genkit/context'; +import { toGenkitMessages, type UIMessage } from './convert.js'; +import { createSSEResponse } from './stream.js'; +import { headersToRecord, resolveStatus } from './utils.js'; + +/** + * Shape of the input `chatHandler` will pass to the flow. + * + * Kept as an **interface** (not `z.infer<>` alias) so that TypeScript + * preserves the name in error messages — a user who passes a string-input + * flow sees `'string' is not assignable to 'ChatFlowInput'` rather than a + * wall of expanded Zod generics. + */ +interface ChatFlowInput { + messages: unknown[]; + body?: Record; +} + +/** + * A Genkit flow compatible with `chatHandler`. + * + * Your flow must use: + * - `inputSchema: MessagesSchema` + * - `streamSchema: StreamChunkSchema` + * + * The `outputSchema` is unconstrained (use `FlowOutputSchema` to populate + * `finishReason` and `usage` in the finish SSE event, or omit it). + */ +export type ChatFlow = { + stream( + input?: ChatFlowInput, + opts?: any + ): { stream: AsyncIterable; output: Promise }; +}; + +/** + * Options for `chatHandler`. + * + * @typeParam Ctx - Shape of the context object returned by `contextProvider`. + * TypeScript infers this from your `contextProvider` implementation. + */ +export interface ChatHandlerOptions< + Ctx extends Record = Record, +> { + /** + * Called on unhandled errors thrown by the flow. Return a string to surface + * a message to the client; return `void` (or nothing) to use the default + * "An error occurred." message. + */ + onError?: (err: unknown) => string | void; + /** + * Extract auth/session context from the incoming request. The derived + * context is forwarded to the flow via `ActionRunOptions.context`. + * + * Throw from this function to reject the request — the HTTP status is + * derived from the error using Genkit's standard `getHttpStatus()`. + */ + contextProvider?: ContextProvider; +} + +/** + * Wraps a Genkit streaming flow and returns a Fetch API-compatible route + * handler that speaks the Vercel AI SDK + * {@link https://sdk.vercel.ai/docs/reference/ai-sdk-ui/use-chat `useChat()`} + * protocol. + * + * ## Flow contract + * + * The flow must use `MessagesSchema` as `inputSchema` and `StreamChunkSchema` + * as `streamSchema` to drive the full protocol (tools, reasoning, file output, + * source citations, step markers, custom data). + * + * The optional `body` field in `MessagesSchema` carries any extra fields the + * client sends via + * {@link https://sdk.vercel.ai/docs/reference/ai-sdk-ui/use-chat#body `useChat({ body: {...} })`}, + * accessible as `input.body`. + * + * ## Client-side tool execution + * + * When `useChat` is configured with + * {@link https://sdk.vercel.ai/docs/ai-sdk-ui/chatbot-with-tool-calling client-side tools}, + * the browser executes each tool and submits results via `addToolOutput()`. + * This triggers a new POST with the tool results already folded into the + * `messages` array as `tool-invocation` parts (`state: 'result'`). + * `chatHandler` converts these automatically to Genkit tool-response messages + * via `toGenkitMessages()`, so no special handling is required in your flow. + * + * ```ts + * // src/app/api/chat/route.ts + * export const POST = chatHandler(chatFlow, { + * contextProvider: async ({ headers }) => { + * const token = headers['authorization']?.slice(7); + * if (!token) throw Object.assign(new Error('Unauthorized'), { status: 401 }); + * return { userId: await verifyToken(token) }; + * }, + * }); + * ``` + * + * - Request: `POST` with `{ messages: UIMessage[], ...extraFields }` + * - Response: {@link https://sdk.vercel.ai/docs/ai-sdk-ui/stream-protocol#ui-message-stream-protocol UI Message Stream} (SSE) + * + * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-ui/use-chat useChat() reference} + * @see {@link https://sdk.vercel.ai/docs/ai-sdk-ui/chatbot Chatbot guide} + */ +export function chatHandler< + Ctx extends Record = Record, +>( + flow: ChatFlow, + opts?: ChatHandlerOptions +): (req: Request) => Promise { + return async (req: Request): Promise => { + // ---- Parse & validate request body ------------------------------------ + let body: Record; + try { + body = await req.json(); + } catch { + return new Response( + JSON.stringify({ error: 'Invalid JSON in request body' }), + { status: 400, headers: { 'Content-Type': 'application/json' } } + ); + } + + if (!Array.isArray(body.messages)) { + return new Response( + JSON.stringify({ error: 'Invalid request: messages array required' }), + { status: 400, headers: { 'Content-Type': 'application/json' } } + ); + } + + const uiMessages: UIMessage[] = body.messages as UIMessage[]; + const genkitMessages = toGenkitMessages(uiMessages); + + // Extra request body fields → forwarded as input.body + const { messages: _messages, ...extraBody } = body; + const flowInput = { + messages: genkitMessages, + ...(Object.keys(extraBody).length ? { body: extraBody } : {}), + }; + + // ---- Auth context ----------------------------------------------------- + let context: Record = {}; + if (opts?.contextProvider) { + try { + context = await opts.contextProvider({ + method: 'POST', + headers: headersToRecord(req.headers), + input: flowInput, + }); + } catch (err) { + return new Response(JSON.stringify({ error: String(err) }), { + status: resolveStatus(err), + headers: { 'Content-Type': 'application/json' }, + }); + } + } + + // ---- Stream ----------------------------------------------------------- + return createSSEResponse({ + flow, + input: flowInput, + context, + request: req, + onError: opts?.onError, + }); + }; +} diff --git a/js/plugins/vercel-ai-sdk/src/completion.ts b/js/plugins/vercel-ai-sdk/src/completion.ts new file mode 100644 index 0000000000..05d30649ce --- /dev/null +++ b/js/plugins/vercel-ai-sdk/src/completion.ts @@ -0,0 +1,208 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createTextStreamResponse } from 'ai'; +import { type ContextProvider } from 'genkit/context'; +import { StreamChunkSchema } from './schema.js'; +import { createSSEResponse } from './stream.js'; +import { headersToRecord, resolveStatus } from './utils.js'; + +/** + * A Genkit flow compatible with `completionHandler`. + * + * Your flow must use: + * - `inputSchema: z.string()` + * - `streamSchema: StreamChunkSchema` + * + * The `outputSchema` is unconstrained (use `FlowOutputSchema` to populate + * `finishReason` and `usage` in the finish SSE event, or omit it). + */ +export type CompletionFlow = { + stream( + input?: string, + opts?: any + ): { stream: AsyncIterable; output: Promise }; +}; + +/** + * Options for `completionHandler`. + * + * @typeParam Ctx - Shape of the context object returned by `contextProvider`. + * TypeScript infers this from your `contextProvider` implementation. + */ +export interface CompletionHandlerOptions< + Ctx extends Record = Record, +> { + /** + * Called on unhandled errors thrown by the flow. Return a string to surface + * a message to the client; return `void` (or nothing) to use the default + * "An error occurred." message. + */ + onError?: (err: unknown) => string | void; + /** + * Extract auth/session context from the incoming request. + * Throw to reject the request; status is derived via `getHttpStatus()`. + */ + contextProvider?: ContextProvider; + /** + * Stream protocol to use in the response. + * + * - **`'data'`** (default) — Vercel AI SDK + * {@link https://sdk.vercel.ai/docs/ai-sdk-ui/stream-protocol#ui-message-stream-protocol UI Message Stream} + * format (SSE). Use with the default `useCompletion()` configuration. + * - **`'text'`** — Raw `text/plain` streaming. + * Use when `useCompletion` is configured with + * {@link https://sdk.vercel.ai/docs/reference/ai-sdk-ui/use-completion#streamProtocol `streamProtocol: 'text'`}. + * In this mode only `{ type: 'text', delta }` chunks are forwarded; + * other typed chunks are ignored. + */ + streamProtocol?: 'data' | 'text'; +} + +/** + * Wraps a Genkit streaming flow and returns a Fetch API-compatible route + * handler that speaks the Vercel AI SDK + * {@link https://sdk.vercel.ai/docs/reference/ai-sdk-ui/use-completion `useCompletion()`} + * protocol. + * + * The flow must accept `z.string()` as `inputSchema` and use + * `StreamChunkSchema` as `streamSchema`. In `'data'` mode all chunk types + * are forwarded; in `'text'` mode only `{ type: 'text', delta }` chunks are + * forwarded and all others are silently skipped. + * + * ## Client-supplied context + * + * Extra fields sent by the client via + * {@link https://sdk.vercel.ai/docs/reference/ai-sdk-ui/use-completion#body `useCompletion({ body: {...} })`} + * are available in `contextProvider` as `input.fieldName`. Place anything + * the flow needs (session ID, user preferences, etc.) into the returned + * context object — Genkit stores it in async-local storage so `ai.generate()` + * calls and tools within the flow can access it automatically. + * + * ```ts + * export const POST = completionHandler(completionFlow, { + * contextProvider: async ({ headers, input }) => { + * const userId = await verifyToken(headers['authorization']?.slice(7)); + * return { userId, sessionId: input.sessionId }; + * }, + * }); + * ``` + * + * ```ts + * // src/app/api/completion/route.ts (default SSE mode) + * export const POST = completionHandler(completionFlow); + * + * // src/app/api/completion/route.ts (text mode) + * export const POST = completionHandler(completionFlow, { streamProtocol: 'text' }); + * ``` + * + * - Request: `POST` with `{ prompt: string }` + * - Response: {@link https://sdk.vercel.ai/docs/ai-sdk-ui/stream-protocol#ui-message-stream-protocol UI Message Stream} (`'data'`) or `text/plain` (`'text'`) + * + * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-ui/use-completion useCompletion() reference} + */ +export function completionHandler< + Ctx extends Record = Record, +>( + flow: CompletionFlow, + opts?: CompletionHandlerOptions +): (req: Request) => Promise { + return async (req: Request): Promise => { + // ---- Parse & validate request body ------------------------------------ + let body: Record; + try { + body = await req.json(); + } catch { + return new Response( + JSON.stringify({ error: 'Invalid JSON in request body' }), + { status: 400, headers: { 'Content-Type': 'application/json' } } + ); + } + + if (typeof body.prompt !== 'string') { + return new Response( + JSON.stringify({ error: 'Invalid request: prompt string required' }), + { status: 400, headers: { 'Content-Type': 'application/json' } } + ); + } + + const prompt = body.prompt; + + // ---- Auth context ----------------------------------------------------- + let context: Record = {}; + if (opts?.contextProvider) { + try { + context = await opts.contextProvider({ + method: 'POST', + headers: headersToRecord(req.headers), + input: body, + }); + } catch (err) { + return new Response(JSON.stringify({ error: String(err) }), { + status: resolveStatus(err), + headers: { 'Content-Type': 'application/json' }, + }); + } + } + + // ---- Text mode -------------------------------------------------------- + if (opts?.streamProtocol === 'text') { + const { readable, writable } = new TransformStream(); + const writer = writable.getWriter(); + + (async () => { + try { + const { stream } = flow.stream(prompt, { + context, + abortSignal: req.signal, + }); + for await (const chunk of stream) { + const parsed = StreamChunkSchema.safeParse(chunk); + if ( + parsed.success && + parsed.data.type === 'text' && + parsed.data.delta + ) { + await writer.write(parsed.data.delta); + } + } + } catch (err) { + const message = + (opts?.onError ? opts.onError(err) : undefined) ?? + 'An error occurred.'; + await writer.write(message); + } finally { + try { + await writer.close(); + } catch { + // Stream already closed (e.g. client aborted the request). + } + } + })(); + + return createTextStreamResponse({ textStream: readable }); + } + + // ---- SSE mode (default) ----------------------------------------------- + return createSSEResponse({ + flow, + input: prompt, + context, + request: req, + onError: opts?.onError, + }); + }; +} diff --git a/js/plugins/vercel-ai-sdk/src/convert.ts b/js/plugins/vercel-ai-sdk/src/convert.ts new file mode 100644 index 0000000000..331edc1437 --- /dev/null +++ b/js/plugins/vercel-ai-sdk/src/convert.ts @@ -0,0 +1,204 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Conversion utilities: Vercel AI SDK UIMessage[] → Genkit MessageData[]. + */ + +import type { MessageData, Part } from 'genkit'; + +// --------------------------------------------------------------------------- +// Vercel AI SDK UIMessage types (vendored — no runtime dep on `ai`) +// Based on AI SDK v6.0 UIMessage format. Audit for drift when upgrading. +// +// In v6, tool parts use `dynamic-tool` (or `tool-${name}` for statically +// typed tools) with states: input-streaming, input-available, +// output-available, output-error, output-denied. Fields: `input` / `output`. +// This replaced the v4/v5 `tool-invocation` with `call`/`result` states and +// `args`/`result` fields. +// --------------------------------------------------------------------------- + +/** A single content part inside a UIMessage (AI SDK v6). */ +export interface UIMessagePart { + type: string; + text?: string; + [key: string]: unknown; +} + +/** + * A tool part inside an assistant UIMessage (AI SDK v6). + * Covers both `dynamic-tool` and `tool-${name}` part types. + */ +interface ToolPart { + type: string; // 'dynamic-tool' or 'tool-${name}' + toolCallId: string; + toolName?: string; // present on dynamic-tool; derived from type on static + state: + | 'input-streaming' + | 'input-available' + | 'output-available' + | 'output-error' + | 'output-denied'; + input?: unknown; + output?: unknown; +} + +/** A file/image attachment part inside a user UIMessage. */ +interface FilePart { + type: 'file'; + url: string; // data: URI or https: URL + mediaType?: string; // MIME type + filename?: string; +} + +/** + * A message in the Vercel AI SDK UIMessage format, as sent by `useChat()`. + * https://ai-sdk.dev/docs/reference/ai-sdk-ui/use-chat + */ +export interface UIMessage { + id: string; + role: 'user' | 'assistant' | 'system'; + parts: UIMessagePart[]; + /** @deprecated Legacy flat content field — prefer `parts`. */ + content?: string; +} + +// --------------------------------------------------------------------------- +// Conversion +// --------------------------------------------------------------------------- + +/** + * Convert a Vercel AI SDK `UIMessage[]` (as sent by `useChat()`) to Genkit + * `MessageData[]` for use as the `messages` parameter of `generateStream()`. + * + * Handles: + * - `text` parts → text part + * - `file` / image attachment parts → media part + * - `dynamic-tool` / `tool-${name}` parts in assistant messages: + * - state `input-available` / `input-streaming` → appended as `toolRequest` to the model message + * - state `output-available` → model message with `toolRequest` + separate `tool` message with `toolResponse` + * - `system` role → passed through as-is + * - Legacy flat `content` string → treated as a single text part + */ +export function toGenkitMessages(messages: UIMessage[]): MessageData[] { + const result: MessageData[] = []; + + for (const msg of messages) { + switch (msg.role) { + case 'system': + result.push({ role: 'system', content: extractParts(msg) }); + break; + + case 'user': + result.push({ role: 'user', content: extractParts(msg) }); + break; + + case 'assistant': { + // Collect all content parts for the model message. + // Tool parts with state=output-available also generate a separate tool message. + const modelParts: Part[] = []; + const toolMessages: MessageData[] = []; + + for (const part of msg.parts ?? []) { + if (part.type === 'text' && typeof part.text === 'string') { + modelParts.push({ text: part.text }); + } else if (isToolPart(part)) { + const tp = part as unknown as ToolPart; + const toolName = tp.toolName ?? tp.type.replace(/^tool-/, ''); + modelParts.push({ + toolRequest: { + ref: tp.toolCallId, + name: toolName, + input: tp.input, + }, + }); + if (tp.state === 'output-available') { + toolMessages.push({ + role: 'tool', + content: [ + { + toolResponse: { + ref: tp.toolCallId, + name: toolName, + output: tp.output, + }, + }, + ], + }); + } + } + // Other part types (reasoning, step-start, etc.) are not forwarded + // to the model — they're output-only artifacts. + } + + // Fall back to legacy flat content string if parts is empty. + const legacyContent = (msg as { content?: string }).content; + if (modelParts.length === 0 && legacyContent) { + modelParts.push({ text: legacyContent }); + } + + if (modelParts.length > 0) { + result.push({ role: 'model', content: modelParts }); + } + result.push(...toolMessages); + break; + } + } + } + + return result; +} + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +/** + * Returns true for AI SDK v6 tool parts: `dynamic-tool` or `tool-${name}`. + * Static tool parts have the format `tool-${toolName}` (never just `tool`). + */ +function isToolPart(part: UIMessagePart): boolean { + return ( + part.type === 'dynamic-tool' || + (part.type.startsWith('tool-') && 'toolCallId' in part) + ); +} + +/** Extract Genkit parts from the text and file parts of a UIMessage. */ +function extractParts(msg: UIMessage): Part[] { + const parts: Part[] = []; + + if (msg.parts?.length) { + for (const part of msg.parts) { + if (part.type === 'text' && typeof part.text === 'string') { + parts.push({ text: part.text }); + } else if (part.type === 'file') { + const fp = part as unknown as FilePart; + parts.push({ + media: { url: fp.url, contentType: fp.mediaType }, + }); + } + } + } + + // Fall back to legacy flat content string. + const legacyContent = (msg as { content?: string }).content; + if (parts.length === 0 && legacyContent) { + parts.push({ text: legacyContent }); + } + + return parts; +} diff --git a/js/plugins/vercel-ai-sdk/src/generate.ts b/js/plugins/vercel-ai-sdk/src/generate.ts new file mode 100644 index 0000000000..e721a1f955 --- /dev/null +++ b/js/plugins/vercel-ai-sdk/src/generate.ts @@ -0,0 +1,99 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { GenerateResponse, GenerateResponseChunk } from 'genkit'; +import type { FlowOutput, StreamChunk } from './schema.js'; + +/** + * Converts a Genkit {@link https://genkit.dev/docs/models GenerateResponseChunk} + * into an array of {@link StreamChunk} values ready to pass to `sendChunk()` in + * a flow that uses `StreamChunkSchema` as its `streamSchema`. + * + * Handles text deltas, reasoning/thinking deltas, media parts, and + * tool-request parts. Returns an empty array for chunks that carry none of + * these (e.g. pure metadata chunks). + * + * ```ts + * import { toStreamChunks } from '@genkit-ai/vercel-ai-sdk'; + * + * const chatFlow = ai.defineFlow( + * { name: 'chat', inputSchema: MessagesSchema, streamSchema: StreamChunkSchema }, + * async (input, { sendChunk }) => { + * const { stream, response } = ai.generateStream({ ... }); + * for await (const chunk of stream) { + * for (const c of toStreamChunks(chunk)) sendChunk(c); + * } + * return toFlowOutput(await response); + * } + * ); + * ``` + * + * @see {@link https://sdk.vercel.ai/docs/ai-sdk-ui/stream-protocol#ui-message-stream-protocol UI Message Stream protocol} + */ +export function toStreamChunks(chunk: GenerateResponseChunk): StreamChunk[] { + const chunks: StreamChunk[] = []; + + if (chunk.reasoning) { + chunks.push({ type: 'reasoning', delta: chunk.reasoning }); + } + + if (chunk.text) { + chunks.push({ type: 'text', delta: chunk.text }); + } + + for (const part of chunk.content) { + if ('media' in part && part.media?.url) { + chunks.push({ + type: 'file', + url: part.media.url, + mediaType: part.media.contentType ?? 'application/octet-stream', + }); + } else if ('toolRequest' in part && part.toolRequest) { + const { ref, name, input } = part.toolRequest; + chunks.push({ + type: 'tool-request', + toolCallId: ref ?? name, + toolName: name, + input, + }); + } + } + + return chunks; +} + +/** + * Extracts {@link FlowOutput} from a Genkit {@link GenerateResponse}, ready + * to return from a flow that uses `FlowOutputSchema` as its `outputSchema`. + * + * Surfaces `finishReason` and `usage` so `chatHandler` and + * `completionHandler` can populate the + * {@link https://sdk.vercel.ai/docs/ai-sdk-ui/stream-protocol#finish-chunk `finish`} + * SSE event. + * + * ```ts + * return toFlowOutput(await response); + * // equivalent to: + * // const res = await response; + * // return { finishReason: res.finishReason, usage: res.usage }; + * ``` + */ +export function toFlowOutput(response: GenerateResponse): FlowOutput { + return { + finishReason: response.finishReason ?? undefined, + usage: response.usage as Record, + }; +} diff --git a/js/plugins/vercel-ai-sdk/src/index.ts b/js/plugins/vercel-ai-sdk/src/index.ts new file mode 100644 index 0000000000..e0bca096df --- /dev/null +++ b/js/plugins/vercel-ai-sdk/src/index.ts @@ -0,0 +1,47 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @genkit-ai/vercel-ai-sdk + * + * Adapter helpers that make Genkit flows work as backends for the Vercel AI + * SDK UI hooks: `useChat()`, `useCompletion()`, and `useObject()`. + * + * Each handler returns a standard `(req: Request) => Promise` that + * can be dropped into any framework that follows the Fetch API conventions — + * Next.js App Router, Hono, SvelteKit, etc. + */ + +export { chatHandler, type ChatHandlerOptions } from './chat.js'; +export { + completionHandler, + type CompletionHandlerOptions, +} from './completion.js'; +export { + toGenkitMessages, + type UIMessage, + type UIMessagePart, +} from './convert.js'; +export { toFlowOutput, toStreamChunks } from './generate.js'; +export { objectHandler, type ObjectHandlerOptions } from './object.js'; +export { + FlowOutputSchema, + MessagesSchema, + StreamChunkSchema, + type FlowOutput, + type Messages, + type StreamChunk, +} from './schema.js'; diff --git a/js/plugins/vercel-ai-sdk/src/object.ts b/js/plugins/vercel-ai-sdk/src/object.ts new file mode 100644 index 0000000000..a8ed2703a4 --- /dev/null +++ b/js/plugins/vercel-ai-sdk/src/object.ts @@ -0,0 +1,168 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { type ContextProvider } from 'genkit/context'; +import { headersToRecord, resolveStatus } from './utils.js'; + +/** + * A Genkit flow compatible with `objectHandler`. + * + * Your flow must use `streamSchema: z.string()` — each chunk emitted via + * `sendChunk` should be a fragment of the JSON string being produced. + * The `inputSchema` is unconstrained (any JSON body is accepted). + */ +export type ObjectFlow = { + stream( + input?: any, + opts?: any + ): { stream: AsyncIterable; output: Promise }; +}; + +/** + * Options for `objectHandler`. + * + * @typeParam Ctx - Shape of the context object returned by `contextProvider`. + * TypeScript infers this from your `contextProvider` implementation. + */ +export interface ObjectHandlerOptions< + Ctx extends Record = Record, +> { + /** + * Called on mid-stream error for logging/reporting. The stream is closed + * immediately after — unlike `chatHandler`, any return value is ignored + * because appending text to a partial JSON stream would corrupt it. + */ + onError?: (err: unknown) => string | void; + /** + * Extract auth/session context from the incoming request. + * Throw to reject the request before the stream opens; status is derived + * via `getHttpStatus()`. Mid-stream errors cannot be cleanly signaled due + * to the `useObject()` protocol using raw text/plain — this is a protocol + * constraint, not a Genkit limitation. + */ + contextProvider?: ContextProvider; +} + +/** + * Wraps a Genkit streaming flow and returns a Fetch API-compatible route + * handler that speaks the Vercel AI SDK + * {@link https://sdk.vercel.ai/docs/reference/ai-sdk-ui/use-object `useObject()`} + * protocol. + * + * The flow must have `streamSchema: z.string()` — each chunk emitted via + * `streamingCallback` should be a fragment of the JSON string being produced. + * The flow's `outputSchema` should describe the full object shape for + * client-side type safety with + * {@link https://sdk.vercel.ai/docs/reference/ai-sdk-ui/use-object#schema `useObject({ schema })`}. + * + * Unlike `chatHandler` and `completionHandler`, the response is raw + * `text/plain` streaming partial JSON. `useObject()` reassembles fragments + * incrementally — each chunk does not need to be valid JSON on its own. + * + * Note: mid-stream errors cannot be surfaced to the client via a dedicated + * error channel — this is a + * {@link https://sdk.vercel.ai/docs/ai-sdk-ui/stream-protocol protocol constraint} + * of the `useObject()` text stream format. Pre-stream errors (auth failures, + * bad input) still return a non-2xx HTTP status. + * + * ```ts + * // src/app/api/notifications/route.ts + * export const POST = objectHandler(notificationsFlow); + * ``` + * + * - Request: `POST` with any JSON body (passed verbatim as flow input) + * - Response: `text/plain` streaming partial JSON + * + * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-ui/use-object useObject() reference} + * @see {@link https://sdk.vercel.ai/docs/ai-sdk-ui/object-generation Object generation guide} + */ +export function objectHandler< + Ctx extends Record = Record, +>( + flow: ObjectFlow, + opts?: ObjectHandlerOptions +): (req: Request) => Promise { + return async (req: Request): Promise => { + // ---- Parse request body ----------------------------------------------- + let input: unknown; + try { + input = await req.json(); + } catch { + return new Response( + JSON.stringify({ error: 'Invalid JSON in request body' }), + { status: 400, headers: { 'Content-Type': 'application/json' } } + ); + } + + // ---- Auth context ----------------------------------------------------- + let context: Record = {}; + if (opts?.contextProvider) { + try { + context = await opts.contextProvider({ + method: 'POST', + headers: headersToRecord(req.headers), + input, + }); + } catch (err) { + return new Response(JSON.stringify({ error: String(err) }), { + status: resolveStatus(err), + headers: { 'Content-Type': 'application/json' }, + }); + } + } + + // ---- Stream ----------------------------------------------------------- + const encoder = new TextEncoder(); + const { readable, writable } = new TransformStream< + Uint8Array, + Uint8Array + >(); + const writer = writable.getWriter(); + + (async () => { + try { + const { stream } = flow.stream(input, { + context, + abortSignal: req.signal, + }); + + for await (const chunk of stream) { + if (chunk) { + await writer.write(encoder.encode(String(chunk))); + } + } + } catch (err) { + // Do not write to the stream — any appended text would corrupt the + // partial JSON already sent. Close the stream so useObject fires onError. + opts?.onError?.(err); + } finally { + try { + await writer.close(); + } catch { + // Stream already closed (e.g. client aborted the request). + } + } + })(); + + return new Response(readable, { + status: 200, + headers: { + 'Content-Type': 'text/plain; charset=utf-8', + 'Cache-Control': 'no-cache', + }, + }); + }; +} diff --git a/js/plugins/vercel-ai-sdk/src/schema.ts b/js/plugins/vercel-ai-sdk/src/schema.ts new file mode 100644 index 0000000000..0697106c15 --- /dev/null +++ b/js/plugins/vercel-ai-sdk/src/schema.ts @@ -0,0 +1,260 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { MessageSchema, z } from 'genkit/beta'; + +// --------------------------------------------------------------------------- +// StreamChunkSchema +// --------------------------------------------------------------------------- + +/** + * Discriminated union of all chunk types a flow can emit via + * `streamingCallback` to drive the full Vercel AI SDK + * {@link https://sdk.vercel.ai/docs/ai-sdk-ui/stream-protocol#ui-message-stream-protocol UI Message Stream} + * protocol. Use this as `streamSchema` in `ai.defineFlow(...)`. + * + * Each variant maps to one or more wire events understood by + * {@link https://sdk.vercel.ai/docs/reference/ai-sdk-ui/use-chat `useChat()`} and + * {@link https://sdk.vercel.ai/docs/reference/ai-sdk-ui/use-completion `useCompletion()`}. + * + * ```ts + * import { StreamChunkSchema } from '@genkit-ai/vercel-ai-sdk'; + * + * const chatFlow = ai.defineFlow( + * { name: 'chat', inputSchema: MessagesSchema, streamSchema: StreamChunkSchema }, + * async (input, sc) => { + * const { stream, response } = ai.generateStream({ messages: input.messages }); + * for await (const chunk of stream) { + * if (chunk.text) sc({ type: 'text', delta: chunk.text }); + * for (const tr of chunk.toolRequests) { + * sc({ type: 'tool-request', toolCallId: tr.toolRequest.ref ?? tr.toolRequest.name, + * toolName: tr.toolRequest.name, input: tr.toolRequest.input }); + * } + * } + * return (await response).text; + * } + * ); + * ``` + */ +export const StreamChunkSchema = z.discriminatedUnion('type', [ + /** A text delta — maps to `text-start` (lazy) + `text-delta` wire events. */ + z.object({ + type: z.literal('text'), + delta: z.string(), + }), + + /** + * A reasoning/thinking delta — maps to `reasoning-start` (lazy) + + * `reasoning-delta` wire events. + * @see {@link https://sdk.vercel.ai/docs/ai-sdk-ui/chatbot#reasoning Reasoning guide} + */ + z.object({ + type: z.literal('reasoning'), + delta: z.string(), + }), + + /** + * A tool invocation. Supply either `inputDelta` (streaming partial JSON + * input) or `input` (full input object) — not both. + * + * - `inputDelta` → `tool-input-start` (first time) + `tool-input-delta` + * - `input` → `tool-input-start` (if not already open) + `tool-input-available` + * + * @see {@link https://sdk.vercel.ai/docs/ai-sdk-ui/chatbot-with-tool-calling Tool calling guide} + */ + z.object({ + type: z.literal('tool-request'), + toolCallId: z.string(), + toolName: z.string(), + inputDelta: z.string().optional(), + input: z.unknown().optional(), + }), + + /** + * A tool result — maps to `tool-output-available`. + * @see {@link https://sdk.vercel.ai/docs/ai-sdk-ui/chatbot-with-tool-calling Tool calling guide} + */ + z.object({ + type: z.literal('tool-result'), + toolCallId: z.string(), + output: z.unknown(), + }), + + /** + * A tool input parsing error — maps to `tool-input-error`. + * Emitted when a tool's input fails validation or parsing. + * @see {@link https://sdk.vercel.ai/docs/ai-sdk-ui/chatbot-with-tool-calling Tool calling guide} + */ + z.object({ + type: z.literal('tool-input-error'), + toolCallId: z.string(), + toolName: z.string(), + input: z.unknown(), + errorText: z.string(), + }), + + /** + * A tool execution error — maps to `tool-output-error`. + * Emitted when a tool call fails during execution. + * @see {@link https://sdk.vercel.ai/docs/ai-sdk-ui/chatbot-with-tool-calling Tool calling guide} + */ + z.object({ + type: z.literal('tool-output-error'), + toolCallId: z.string(), + errorText: z.string(), + }), + + /** + * A tool output denied — maps to `tool-output-denied`. + * Emitted when a tool's output is blocked or denied. + * @see {@link https://sdk.vercel.ai/docs/ai-sdk-ui/chatbot-with-tool-calling Tool calling guide} + */ + z.object({ + type: z.literal('tool-output-denied'), + toolCallId: z.string(), + }), + + /** + * A tool approval request — maps to `tool-approval-request`. + * Emitted to request human-in-the-loop approval before executing a tool. + * @see {@link https://sdk.vercel.ai/docs/ai-sdk-ui/chatbot-with-tool-calling Tool calling guide} + */ + z.object({ + type: z.literal('tool-approval-request'), + approvalId: z.string(), + toolCallId: z.string(), + }), + + /** + * Arbitrary custom data — maps to a `data-${id}` wire event. + * Accessible on the client via the `onData` callback in `useChat`. + * @see {@link https://sdk.vercel.ai/docs/ai-sdk-ui/stream-protocol#ui-message-stream-protocol UI Message Stream protocol} + */ + z.object({ + type: z.literal('data'), + id: z.string(), + value: z.unknown(), + }), + + /** + * A file or image to surface in the chat UI — maps to a `file` wire event. + * Note: the AI SDK wire format does not support a filename field. + * @see {@link https://sdk.vercel.ai/docs/ai-sdk-ui/chatbot#file-attachments File attachments} + */ + z.object({ + type: z.literal('file'), + url: z.string(), + mediaType: z.string(), + }), + + /** + * A web source citation — maps to a `source-url` wire event. + * Renders as a clickable source card alongside the response. + * @see {@link https://sdk.vercel.ai/docs/ai-sdk-ui/chatbot#sources Sources} + */ + z.object({ + type: z.literal('source-url'), + sourceId: z.string(), + url: z.string(), + title: z.string().optional(), + }), + + /** + * A document source citation — maps to a `source-document` wire event. + * Use for RAG responses where the source is a local/retrieved document + * rather than a live web URL. + * @see {@link https://sdk.vercel.ai/docs/ai-sdk-ui/chatbot#sources Sources} + */ + z.object({ + type: z.literal('source-document'), + sourceId: z.string(), + mediaType: z.string(), + title: z.string(), + filename: z.string().optional(), + }), + + /** + * Begin a logical step (e.g. one LLM call in a multi-step agent loop). + * @see {@link https://sdk.vercel.ai/docs/ai-sdk-ui/chatbot#multi-step-generation Multi-step generation} + */ + z.object({ type: z.literal('step-start') }), + + /** + * End the current logical step. Closes any open text/reasoning blocks. + * @see {@link https://sdk.vercel.ai/docs/ai-sdk-ui/chatbot#multi-step-generation Multi-step generation} + */ + z.object({ type: z.literal('step-end') }), +]); + +export type StreamChunk = z.infer; + +// --------------------------------------------------------------------------- +// MessagesSchema (extended) +// --------------------------------------------------------------------------- + +/** + * Zod schema for the multi-turn chat input accepted by `chatHandler()`. + * Use this as the `inputSchema` of your chat flow. + * + * Uses Genkit's own `MessageSchema` directly, so `input.messages` can be + * passed straight to `ai.generateStream({ messages: input.messages })` + * without type casts. + * + * The optional `body` field carries any extra fields the client sends via + * {@link https://sdk.vercel.ai/docs/reference/ai-sdk-ui/use-chat#body `useChat({ body: {...} })`}, + * so flows can access per-request metadata (e.g. a session ID, selected + * persona, or RAG filter) via `input.body`. + * + * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-ui/use-chat useChat() reference} + */ +export const MessagesSchema = z.object({ + messages: z.array(MessageSchema), + /** Extra fields sent by the client via useChat({ body: {...} }). */ + body: z.record(z.unknown()).optional(), +}); + +export type Messages = z.infer; + +// --------------------------------------------------------------------------- +// FlowOutputSchema +// --------------------------------------------------------------------------- + +/** + * Optional structured output schema for chat and completion flows. When a + * flow returns a value matching this shape, `chatHandler` and + * `completionHandler` will populate the + * {@link https://sdk.vercel.ai/docs/ai-sdk-ui/stream-protocol#finish-chunk `finish`} + * SSE event with `finishReason` and `usage`. + * + * ```ts + * const chatFlow = ai.defineFlow( + * { name: 'chat', inputSchema: MessagesSchema, + * streamSchema: StreamChunkSchema, outputSchema: FlowOutputSchema }, + * async (input, sc) => { + * const { stream, response } = ai.generateStream({ ... }); + * for await (const chunk of stream) { ... } + * const res = await response; + * return { finishReason: res.finishReason, usage: res.usage }; + * } + * ); + * ``` + */ +export const FlowOutputSchema = z.object({ + finishReason: z.string().optional(), + usage: z.record(z.unknown()).optional(), +}); + +export type FlowOutput = z.infer; diff --git a/js/plugins/vercel-ai-sdk/src/stream.ts b/js/plugins/vercel-ai-sdk/src/stream.ts new file mode 100644 index 0000000000..e871f3a756 --- /dev/null +++ b/js/plugins/vercel-ai-sdk/src/stream.ts @@ -0,0 +1,368 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * SSE streaming layer: maps {@link StreamChunk} values to + * `UIMessageStreamWriter.write()` calls and orchestrates the full + * SSE response lifecycle (start → chunks → finish/abort). + */ + +import { + createUIMessageStream, + createUIMessageStreamResponse, + type UIMessageStreamWriter, +} from 'ai'; +import { + FlowOutputSchema, + StreamChunkSchema, + type StreamChunk, +} from './schema.js'; +import { normalizeFinishReason } from './utils.js'; + +// --------------------------------------------------------------------------- +// Dispatch state +// --------------------------------------------------------------------------- + +interface DispatchState { + openTextId: string | null; + openReasoningId: string | null; + /** Tool call IDs for which tool-input-start has been written. */ + openToolCallIds: Set; +} + +function createDispatchState(): DispatchState { + return { + openTextId: null, + openReasoningId: null, + openToolCallIds: new Set(), + }; +} + +// --------------------------------------------------------------------------- +// Chunk dispatch +// --------------------------------------------------------------------------- + +/** + * Dispatch a single `StreamChunk` from a flow's stream to the AI SDK + * `UIMessageStreamWriter`. Unknown shapes are silently dropped. + */ +function dispatchChunk( + writer: UIMessageStreamWriter, + rawChunk: unknown, + state: DispatchState +): void { + const parsed = StreamChunkSchema.safeParse(rawChunk); + if (!parsed.success) return; + const chunk: StreamChunk = parsed.data; + + switch (chunk.type) { + case 'text': { + if (!chunk.delta) return; + ensureTextOpen(writer, state); + writer.write({ + type: 'text-delta', + id: state.openTextId!, + delta: chunk.delta, + }); + break; + } + + case 'reasoning': { + if (!chunk.delta) return; + closeTextBlock(writer, state); + ensureReasoningOpen(writer, state); + writer.write({ + type: 'reasoning-delta', + id: state.openReasoningId!, + delta: chunk.delta, + }); + break; + } + + case 'tool-request': { + closeTextBlock(writer, state); + closeReasoningBlock(writer, state); + const { toolCallId, toolName } = chunk; + if (!state.openToolCallIds.has(toolCallId)) { + state.openToolCallIds.add(toolCallId); + writer.write({ type: 'tool-input-start', toolCallId, toolName }); + } + if (chunk.inputDelta !== undefined) { + writer.write({ + type: 'tool-input-delta', + toolCallId, + inputTextDelta: chunk.inputDelta, + }); + } else if (chunk.input !== undefined) { + writer.write({ + type: 'tool-input-available', + toolCallId, + toolName, + input: chunk.input, + }); + state.openToolCallIds.delete(toolCallId); + } + break; + } + + case 'tool-result': { + writer.write({ + type: 'tool-output-available', + toolCallId: chunk.toolCallId, + output: chunk.output, + }); + break; + } + + case 'tool-input-error': { + closeTextBlock(writer, state); + closeReasoningBlock(writer, state); + const { toolCallId, toolName } = chunk; + if (!state.openToolCallIds.has(toolCallId)) { + state.openToolCallIds.add(toolCallId); + writer.write({ type: 'tool-input-start', toolCallId, toolName }); + } + writer.write({ + type: 'tool-input-error', + toolCallId, + toolName, + input: chunk.input, + errorText: chunk.errorText, + }); + state.openToolCallIds.delete(toolCallId); + break; + } + + case 'tool-output-error': { + writer.write({ + type: 'tool-output-error', + toolCallId: chunk.toolCallId, + errorText: chunk.errorText, + }); + break; + } + + case 'tool-output-denied': { + writer.write({ + type: 'tool-output-denied', + toolCallId: chunk.toolCallId, + }); + break; + } + + case 'tool-approval-request': { + writer.write({ + type: 'tool-approval-request', + approvalId: chunk.approvalId, + toolCallId: chunk.toolCallId, + }); + break; + } + + case 'file': { + writer.write({ + type: 'file', + url: chunk.url, + mediaType: chunk.mediaType, + }); + break; + } + + case 'source-url': { + writer.write({ + type: 'source-url', + sourceId: chunk.sourceId, + url: chunk.url, + ...(chunk.title ? { title: chunk.title } : {}), + }); + break; + } + + case 'source-document': { + writer.write({ + type: 'source-document', + sourceId: chunk.sourceId, + mediaType: chunk.mediaType, + title: chunk.title, + ...(chunk.filename ? { filename: chunk.filename } : {}), + }); + break; + } + + case 'data': { + // The AI SDK writer types `data-*` events via `z.custom<\`data-${string}\`>()`, + // which TypeScript cannot express as a literal template type on the write() overload. + // The cast is safe: any `data-${string}` value is accepted at runtime. + writer.write({ + type: `data-${chunk.id}` as `data-${string}`, + data: chunk.value, + }); + break; + } + + case 'step-start': { + closeTextBlock(writer, state); + closeReasoningBlock(writer, state); + writer.write({ type: 'start-step' }); + break; + } + + case 'step-end': { + closeOpenBlocks(writer, state); + writer.write({ type: 'finish-step' }); + break; + } + } +} + +// --------------------------------------------------------------------------- +// Block state helpers +// --------------------------------------------------------------------------- + +function closeOpenBlocks( + writer: UIMessageStreamWriter, + state: DispatchState +): void { + closeTextBlock(writer, state); + closeReasoningBlock(writer, state); +} + +function ensureTextOpen( + writer: UIMessageStreamWriter, + state: DispatchState +): void { + closeReasoningBlock(writer, state); + if (!state.openTextId) { + state.openTextId = globalThis.crypto.randomUUID(); + writer.write({ type: 'text-start', id: state.openTextId }); + } +} + +function ensureReasoningOpen( + writer: UIMessageStreamWriter, + state: DispatchState +): void { + if (!state.openReasoningId) { + state.openReasoningId = globalThis.crypto.randomUUID(); + writer.write({ type: 'reasoning-start', id: state.openReasoningId }); + } +} + +function closeTextBlock( + writer: UIMessageStreamWriter, + state: DispatchState +): void { + if (state.openTextId) { + writer.write({ type: 'text-end', id: state.openTextId }); + state.openTextId = null; + } +} + +function closeReasoningBlock( + writer: UIMessageStreamWriter, + state: DispatchState +): void { + if (state.openReasoningId) { + writer.write({ type: 'reasoning-end', id: state.openReasoningId }); + state.openReasoningId = null; + } +} + +// --------------------------------------------------------------------------- +// SSE response factory +// --------------------------------------------------------------------------- + +/** Options for {@link createSSEResponse}. */ +export interface SSEStreamOptions { + /** The flow to stream from. */ + flow: { + stream( + input: any, + opts: any + ): { stream: AsyncIterable; output: Promise }; + }; + /** Input to pass to `flow.stream()`. */ + input: unknown; + /** Context from `contextProvider`. */ + context: Record; + /** The incoming request (provides `signal` for abort). */ + request: Request; + /** Optional error handler; return a string for the client or void for the default. */ + onError?: (err: unknown) => string | void; +} + +/** + * Creates a Fetch API `Response` that streams UI Message Stream SSE events + * from a Genkit flow. Used by both `chatHandler` and `completionHandler`. + * + * Emits: + * - `start` — opens the message + * - chunk events via `dispatchChunk` (text, reasoning, tools, files, etc.) + * - `finish` — includes `finishReason` and `usage` when available + * + * If the flow's stream throws an `AbortError` (from `req.signal`), an `abort` + * event is emitted instead of an error. + */ +export function createSSEResponse(opts: SSEStreamOptions): Response { + const stream = createUIMessageStream({ + execute: async ({ writer }) => { + writer.write({ type: 'start' }); + + const { stream: chunkStream, output } = opts.flow.stream(opts.input, { + context: opts.context, + abortSignal: opts.request.signal, + }); + + const state = createDispatchState(); + try { + for await (const chunk of chunkStream) { + dispatchChunk(writer, chunk, state); + } + } catch (err) { + closeOpenBlocks(writer, state); + if (isAbortError(err)) { + writer.write({ type: 'abort' }); + return; + } + throw err; + } + closeOpenBlocks(writer, state); + + const finalOutput = await output.catch(() => undefined); + const parsed = FlowOutputSchema.safeParse(finalOutput); + if (parsed.success) { + const finishReason = normalizeFinishReason(parsed.data.finishReason); + const usage = parsed.data.usage; + writer.write({ + type: 'finish', + ...(finishReason ? { finishReason } : {}), + ...(usage ? { messageMetadata: { usage } } : {}), + }); + } else { + writer.write({ type: 'finish' }); + } + }, + onError: opts.onError + ? (err: unknown) => opts.onError!(err) ?? 'An error occurred.' + : undefined, + }); + + return createUIMessageStreamResponse({ stream }); +} + +function isAbortError(err: unknown): boolean { + return err instanceof DOMException && err.name === 'AbortError'; +} diff --git a/js/plugins/vercel-ai-sdk/src/utils.ts b/js/plugins/vercel-ai-sdk/src/utils.ts new file mode 100644 index 0000000000..ce0ed207eb --- /dev/null +++ b/js/plugins/vercel-ai-sdk/src/utils.ts @@ -0,0 +1,67 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { FinishReason } from 'ai'; +import { getHttpStatus } from 'genkit/context'; + +// --------------------------------------------------------------------------- +// HTTP helpers +// --------------------------------------------------------------------------- + +/** Convert a Fetch API `Headers` object to a plain `Record`. */ +export function headersToRecord(headers: Headers): Record { + const out: Record = {}; + headers.forEach((value, key) => { + out[key] = value; + }); + return out; +} + +/** + * `getHttpStatus` only handles `GenkitError`; also accept plain + * `{ status: number }` errors (e.g. from custom context providers). + */ +export function resolveStatus(err: unknown): number { + const s = getHttpStatus(err); + if (s !== 500) return s; + const plain = (err as any)?.status; + return typeof plain === 'number' && plain >= 100 && plain < 600 ? plain : 500; +} + +// --------------------------------------------------------------------------- +// Finish reason normalisation +// --------------------------------------------------------------------------- + +const VALID_FINISH_REASONS: readonly FinishReason[] = [ + 'stop', + 'length', + 'content-filter', + 'tool-calls', + 'error', + 'other', +]; + +/** Map an arbitrary Genkit `finishReason` string to a known AI SDK value, or `undefined`. */ +export function normalizeFinishReason( + reason: string | undefined +): FinishReason | undefined { + if (reason == null) return undefined; + if ((VALID_FINISH_REASONS as string[]).includes(reason)) + return reason as FinishReason; + if (reason === 'blocked') return 'content-filter'; + if (reason === 'unknown') return 'other'; + return undefined; +} diff --git a/js/plugins/vercel-ai-sdk/tests/chat_test.ts b/js/plugins/vercel-ai-sdk/tests/chat_test.ts new file mode 100644 index 0000000000..46af284fac --- /dev/null +++ b/js/plugins/vercel-ai-sdk/tests/chat_test.ts @@ -0,0 +1,681 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import assert from 'node:assert'; +import { describe, it } from 'node:test'; +import { chatHandler } from '../src/chat.js'; +import { type UIMessage } from '../src/convert.js'; +import { type StreamChunk } from '../src/schema.js'; + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +function fakeFlow(chunks: (string | StreamChunk)[], finalOutput?: unknown) { + return { + stream(_input: unknown, _opts?: unknown) { + return { + stream: (async function* () { + for (const c of chunks) yield c; + })(), + output: Promise.resolve(finalOutput ?? ''), + }; + }, + } as any; +} + +async function parseSSE(res: Response): Promise> { + const text = await res.text(); + return text + .split('\n') + .filter((l) => l.startsWith('data: ')) + .map((l) => { + const payload = l.slice('data: '.length); + return payload === '[DONE]' ? '[DONE]' : JSON.parse(payload); + }); +} + +function eventsOfType(events: Array, type: string) { + return events.filter( + (e) => typeof e === 'object' && (e as any).type === type + ); +} + +const userMsg: UIMessage = { + id: '1', + role: 'user', + parts: [{ type: 'text', text: 'Hi' }], +}; + +function makeRequest( + messages: UIMessage[], + extra: Record = {} +) { + return new Request('http://localhost/api/chat', { + method: 'POST', + body: JSON.stringify({ messages, ...extra }), + }); +} + +// --------------------------------------------------------------------------- +// Lifecycle +// --------------------------------------------------------------------------- + +describe('chatHandler — lifecycle events', () => { + it('starts with a start event and ends with [DONE]', async () => { + const events = await parseSSE( + await chatHandler(fakeFlow(['hi']))(makeRequest([userMsg])) + ); + assert.equal((events[0] as any).type, 'start'); + assert.equal(events[events.length - 1], '[DONE]'); + }); + + it('returns 200 with correct headers', async () => { + const res = await chatHandler(fakeFlow([]))(makeRequest([userMsg])); + assert.equal(res.status, 200); + assert.equal(res.headers.get('Content-Type'), 'text/event-stream'); + assert.equal(res.headers.get('X-Vercel-AI-UI-Message-Stream'), 'v1'); + assert.equal(res.headers.get('X-Accel-Buffering'), 'no'); + }); +}); + +// --------------------------------------------------------------------------- +// Text streaming +// --------------------------------------------------------------------------- + +describe('chatHandler — text streaming', () => { + it('handles {type:text} chunks', async () => { + const events = await parseSSE( + await chatHandler( + fakeFlow([ + { type: 'text', delta: 'Hi' } as StreamChunk, + { type: 'text', delta: '!' } as StreamChunk, + ]) + )(makeRequest([userMsg])) + ); + assert.equal(eventsOfType(events, 'text-start').length, 1); + assert.equal(eventsOfType(events, 'text-delta').length, 2); + assert.equal(eventsOfType(events, 'text-end').length, 1); + }); + + it('skips empty text delta chunks', async () => { + const events = await parseSSE( + await chatHandler( + fakeFlow([ + { type: 'text', delta: '' } as StreamChunk, + { type: 'text', delta: 'hi' } as StreamChunk, + { type: 'text', delta: '' } as StreamChunk, + ]) + )(makeRequest([userMsg])) + ); + assert.equal((eventsOfType(events, 'text-delta') as any[]).length, 1); + }); +}); + +// --------------------------------------------------------------------------- +// Reasoning +// --------------------------------------------------------------------------- + +describe('chatHandler — reasoning chunks', () => { + it('emits reasoning-start / reasoning-delta / reasoning-end', async () => { + const events = await parseSSE( + await chatHandler( + fakeFlow([ + { type: 'reasoning', delta: 'hmm...' } as StreamChunk, + { type: 'text', delta: 'Answer' } as StreamChunk, + ]) + )(makeRequest([userMsg])) + ); + assert.equal(eventsOfType(events, 'reasoning-start').length, 1); + assert.equal(eventsOfType(events, 'reasoning-delta').length, 1); + assert.equal(eventsOfType(events, 'reasoning-end').length, 1); + assert.equal(eventsOfType(events, 'text-start').length, 1); + }); +}); + +// --------------------------------------------------------------------------- +// Tool chunks +// --------------------------------------------------------------------------- + +describe('chatHandler — tool chunks', () => { + it('emits tool-input-start + tool-input-delta', async () => { + const events = await parseSSE( + await chatHandler( + fakeFlow([ + { + type: 'tool-request', + toolCallId: 'tc1', + toolName: 'search', + inputDelta: '{"q":', + } as StreamChunk, + { + type: 'tool-request', + toolCallId: 'tc1', + toolName: 'search', + inputDelta: '"hi"}', + } as StreamChunk, + ]) + )(makeRequest([userMsg])) + ); + assert.equal(eventsOfType(events, 'tool-input-start').length, 1); + assert.equal(eventsOfType(events, 'tool-input-delta').length, 2); + }); + + it('emits tool-input-available for full input', async () => { + const events = await parseSSE( + await chatHandler( + fakeFlow([ + { + type: 'tool-request', + toolCallId: 'tc1', + toolName: 'search', + input: { q: 'genkit' }, + } as StreamChunk, + ]) + )(makeRequest([userMsg])) + ); + assert.equal(eventsOfType(events, 'tool-input-available').length, 1); + assert.deepEqual( + (eventsOfType(events, 'tool-input-available')[0] as any).input, + { q: 'genkit' } + ); + }); + + it('emits tool-output-available for tool-result', async () => { + const events = await parseSSE( + await chatHandler( + fakeFlow([ + { + type: 'tool-result', + toolCallId: 'tc1', + output: { hits: 3 }, + } as StreamChunk, + ]) + )(makeRequest([userMsg])) + ); + assert.deepEqual( + (eventsOfType(events, 'tool-output-available')[0] as any).output, + { hits: 3 } + ); + }); +}); + +// --------------------------------------------------------------------------- +// Tool errors and approval +// --------------------------------------------------------------------------- + +describe('chatHandler — tool errors and approval', () => { + it('emits tool-input-error with errorText', async () => { + const events = await parseSSE( + await chatHandler( + fakeFlow([ + { + type: 'tool-input-error', + toolCallId: 'tc1', + toolName: 'search', + input: '{"bad', + errorText: 'Invalid JSON', + } as StreamChunk, + ]) + )(makeRequest([userMsg])) + ); + // Should emit tool-input-start then tool-input-error + assert.equal(eventsOfType(events, 'tool-input-start').length, 1); + const e = eventsOfType(events, 'tool-input-error')[0] as any; + assert.ok(e); + assert.equal(e.toolCallId, 'tc1'); + assert.equal(e.toolName, 'search'); + assert.equal(e.errorText, 'Invalid JSON'); + }); + + it('emits tool-output-error with errorText', async () => { + const events = await parseSSE( + await chatHandler( + fakeFlow([ + { + type: 'tool-output-error', + toolCallId: 'tc1', + errorText: 'Tool execution failed', + } as StreamChunk, + ]) + )(makeRequest([userMsg])) + ); + const e = eventsOfType(events, 'tool-output-error')[0] as any; + assert.ok(e); + assert.equal(e.toolCallId, 'tc1'); + assert.equal(e.errorText, 'Tool execution failed'); + }); + + it('emits tool-output-denied', async () => { + const events = await parseSSE( + await chatHandler( + fakeFlow([ + { + type: 'tool-output-denied', + toolCallId: 'tc1', + } as StreamChunk, + ]) + )(makeRequest([userMsg])) + ); + const e = eventsOfType(events, 'tool-output-denied')[0] as any; + assert.ok(e); + assert.equal(e.toolCallId, 'tc1'); + }); + + it('emits tool-approval-request', async () => { + const events = await parseSSE( + await chatHandler( + fakeFlow([ + { + type: 'tool-approval-request', + approvalId: 'a1', + toolCallId: 'tc1', + } as StreamChunk, + ]) + )(makeRequest([userMsg])) + ); + const e = eventsOfType(events, 'tool-approval-request')[0] as any; + assert.ok(e); + assert.equal(e.approvalId, 'a1'); + assert.equal(e.toolCallId, 'tc1'); + }); +}); + +// --------------------------------------------------------------------------- +// File output +// --------------------------------------------------------------------------- + +describe('chatHandler — file output', () => { + it('emits file events with url and mediaType', async () => { + const events = await parseSSE( + await chatHandler( + fakeFlow([ + { + type: 'file', + url: 'data:image/png;base64,abc', + mediaType: 'image/png', + } as StreamChunk, + ]) + )(makeRequest([userMsg])) + ); + const f = eventsOfType(events, 'file')[0] as any; + assert.equal(f.url, 'data:image/png;base64,abc'); + assert.equal(f.mediaType, 'image/png'); + // filename is not part of the AI SDK wire format (strictObject schema) + assert.ok(!('filename' in f)); + }); +}); + +// --------------------------------------------------------------------------- +// Source citations +// --------------------------------------------------------------------------- + +describe('chatHandler — source citations', () => { + it('emits source-url event', async () => { + const events = await parseSSE( + await chatHandler( + fakeFlow([ + { + type: 'source-url', + sourceId: 's1', + url: 'https://genkit.dev', + title: 'Genkit Docs', + } as StreamChunk, + ]) + )(makeRequest([userMsg])) + ); + const e = eventsOfType(events, 'source-url')[0] as any; + assert.equal(e.sourceId, 's1'); + assert.equal(e.url, 'https://genkit.dev'); + assert.equal(e.title, 'Genkit Docs'); + }); + + it('emits source-document event', async () => { + const events = await parseSSE( + await chatHandler( + fakeFlow([ + { + type: 'source-document', + sourceId: 's2', + mediaType: 'application/pdf', + title: 'Report', + filename: 'report.pdf', + } as StreamChunk, + ]) + )(makeRequest([userMsg])) + ); + const e = eventsOfType(events, 'source-document')[0] as any; + assert.equal(e.sourceId, 's2'); + assert.equal(e.mediaType, 'application/pdf'); + assert.equal(e.filename, 'report.pdf'); + }); +}); + +// --------------------------------------------------------------------------- +// Custom data +// --------------------------------------------------------------------------- + +describe('chatHandler — custom data', () => { + it('emits data-* events', async () => { + const events = await parseSSE( + await chatHandler( + fakeFlow([ + { + type: 'data', + id: 'usage', + value: { inputTokens: 10 }, + } as StreamChunk, + ]) + )(makeRequest([userMsg])) + ); + const e = events.find( + (e) => typeof e === 'object' && (e as any).type === 'data-usage' + ) as any; + assert.ok(e); + assert.deepEqual(e.data, { inputTokens: 10 }); + }); +}); + +// --------------------------------------------------------------------------- +// Step markers +// --------------------------------------------------------------------------- + +describe('chatHandler — step markers', () => { + it('emits start-step and finish-step', async () => { + const events = await parseSSE( + await chatHandler( + fakeFlow([ + { type: 'step-start' } as StreamChunk, + { type: 'text', delta: 'hi' } as StreamChunk, + { type: 'step-end' } as StreamChunk, + ]) + )(makeRequest([userMsg])) + ); + assert.equal(eventsOfType(events, 'start-step').length, 1); + assert.equal(eventsOfType(events, 'finish-step').length, 1); + }); + + it('closes open text block at step-end', async () => { + const events = await parseSSE( + await chatHandler( + fakeFlow([ + { type: 'text', delta: 'A' } as StreamChunk, + { type: 'step-end' } as StreamChunk, + { type: 'text', delta: 'B' } as StreamChunk, + ]) + )(makeRequest([userMsg])) + ); + assert.equal(eventsOfType(events, 'text-start').length, 2); + assert.equal(eventsOfType(events, 'text-end').length, 2); + }); +}); + +// --------------------------------------------------------------------------- +// finish-message with usage data +// --------------------------------------------------------------------------- + +describe('chatHandler — finish data', () => { + it('emits finish with finishReason and usage in messageMetadata', async () => { + const flow = fakeFlow([{ type: 'text', delta: 'hi' } as StreamChunk], { + finishReason: 'stop', + usage: { inputTokens: 5, outputTokens: 10 }, + }); + const events = await parseSSE( + await chatHandler(flow)(makeRequest([userMsg])) + ); + const f = eventsOfType(events, 'finish')[0] as any; + assert.equal(f.finishReason, 'stop'); + assert.deepEqual(f.messageMetadata?.usage, { + inputTokens: 5, + outputTokens: 10, + }); + }); + + it('emits bare finish event when flow returns plain string (no structured output)', async () => { + const flow = fakeFlow( + [{ type: 'text', delta: 'hi' } as StreamChunk], + 'plain string output' + ); + const events = await parseSSE( + await chatHandler(flow)(makeRequest([userMsg])) + ); + const finish = eventsOfType(events, 'finish'); + assert.equal(finish.length, 1); + // No finishReason or usage — just the type + assert.equal((finish[0] as any).finishReason, undefined); + assert.equal((finish[0] as any).messageMetadata, undefined); + }); +}); + +// --------------------------------------------------------------------------- +// Extra body fields +// --------------------------------------------------------------------------- + +describe('chatHandler — body passthrough', () => { + it('passes extra request fields as input.body to the flow', async () => { + let capturedInput: any; + const flow = { + stream(input: unknown) { + capturedInput = input; + return { + stream: (async function* () {})(), + output: Promise.resolve(''), + }; + }, + } as any; + + const res = await chatHandler(flow)( + makeRequest([userMsg], { sessionId: 'xyz', persona: 'helpful' }) + ); + await res.text(); // drain stream so flow.stream() runs before asserting + assert.deepEqual(capturedInput.body, { + sessionId: 'xyz', + persona: 'helpful', + }); + }); + + it('does not include body in input when no extra fields', async () => { + let capturedInput: any; + const flow = { + stream(input: unknown) { + capturedInput = input; + return { + stream: (async function* () {})(), + output: Promise.resolve(''), + }; + }, + } as any; + + const res2 = await chatHandler(flow)(makeRequest([userMsg])); + await res2.text(); // drain + assert.ok(!('body' in capturedInput)); + }); +}); + +// --------------------------------------------------------------------------- +// Request validation +// --------------------------------------------------------------------------- + +describe('chatHandler — request validation', () => { + it('returns 400 for malformed JSON', async () => { + const req = new Request('http://localhost/api/chat', { + method: 'POST', + body: 'not json', + }); + const res = await chatHandler(fakeFlow([]))(req); + assert.equal(res.status, 400); + }); + + it('returns 400 when messages is missing', async () => { + const req = new Request('http://localhost/api/chat', { + method: 'POST', + body: JSON.stringify({}), + }); + const res = await chatHandler(fakeFlow([]))(req); + assert.equal(res.status, 400); + }); + + it('returns 400 when messages is not an array', async () => { + const req = new Request('http://localhost/api/chat', { + method: 'POST', + body: JSON.stringify({ messages: 'oops' }), + }); + const res = await chatHandler(fakeFlow([]))(req); + assert.equal(res.status, 400); + }); +}); + +// --------------------------------------------------------------------------- +// Context provider (auth) +// --------------------------------------------------------------------------- + +describe('chatHandler — contextProvider', () => { + it('forwards derived context to the flow', async () => { + let capturedOpts: any; + const flow = { + stream(_input: unknown, opts: unknown) { + capturedOpts = opts; + return { + stream: (async function* () {})(), + output: Promise.resolve(''), + }; + }, + } as any; + + const res = await chatHandler(flow, { + contextProvider: async () => ({ userId: 'u1' }), + })(makeRequest([userMsg])); + await res.text(); // drain + + assert.deepEqual(capturedOpts.context, { userId: 'u1' }); + }); + + it('returns 401 when contextProvider throws', async () => { + const err = Object.assign(new Error('Unauthorized'), { status: 401 }); + const res = await chatHandler(fakeFlow([]), { + contextProvider: async () => { + throw err; + }, + })(makeRequest([userMsg])); + assert.equal(res.status, 401); + }); +}); + +// --------------------------------------------------------------------------- +// Abort signal +// --------------------------------------------------------------------------- + +describe('chatHandler — abort signal', () => { + it('passes req.signal to flow.stream()', async () => { + let capturedOpts: any; + const flow = { + stream(_input: unknown, opts: unknown) { + capturedOpts = opts; + return { + stream: (async function* () {})(), + output: Promise.resolve(''), + }; + }, + } as any; + + const req = new Request('http://localhost/api/chat', { + method: 'POST', + body: JSON.stringify({ messages: [userMsg] }), + }); + + const res = await chatHandler(flow)(req); + await res.text(); // drain + assert.ok(capturedOpts.abortSignal instanceof AbortSignal); + }); +}); + +// --------------------------------------------------------------------------- +// onError / mid-stream errors +// --------------------------------------------------------------------------- + +describe('chatHandler — onError', () => { + it('surfaces custom onError string in the error SSE event', async () => { + const throwingFlow = { + stream(_input: unknown, _opts?: unknown) { + return { + stream: (async function* () { + yield { type: 'text', delta: 'partial' } as StreamChunk; + throw new Error('boom'); + })(), + output: Promise.resolve(undefined), + }; + }, + } as any; + + const events = await parseSSE( + await chatHandler(throwingFlow, { + onError: () => 'something went wrong', + })(makeRequest([userMsg])) + ); + const errEvent = events.find( + (e) => typeof e === 'object' && (e as any).type === 'error' + ) as any; + assert.ok(errEvent, 'expected an error event'); + assert.equal(errEvent.errorText, 'something went wrong'); + }); + + it('uses default message when onError returns void', async () => { + const throwingFlow = { + stream(_input: unknown, _opts?: unknown) { + return { + stream: (async function* () { + throw new Error('boom'); + })(), + output: Promise.resolve(undefined), + }; + }, + } as any; + + const events = await parseSSE( + await chatHandler(throwingFlow, { onError: () => {} })( + makeRequest([userMsg]) + ) + ); + const errEvent = events.find( + (e) => typeof e === 'object' && (e as any).type === 'error' + ) as any; + assert.ok(errEvent); + assert.equal(errEvent.errorText, 'An error occurred.'); + }); +}); + +// --------------------------------------------------------------------------- +// finish-reason normalisation +// --------------------------------------------------------------------------- + +describe('chatHandler — finish-reason normalisation', () => { + it('omits finishReason from finish event when flow returns unknown reason', async () => { + const flow = fakeFlow([], { + finishReason: 'cancelled', // not a valid AI SDK finish reason + usage: {}, + }); + const events = await parseSSE( + await chatHandler(flow)(makeRequest([userMsg])) + ); + const f = eventsOfType(events, 'finish')[0] as any; + assert.ok(f, 'expected finish event'); + assert.ok(!('finishReason' in f), 'finishReason should be omitted'); + }); +}); + +// --------------------------------------------------------------------------- +// Response format +// --------------------------------------------------------------------------- diff --git a/js/plugins/vercel-ai-sdk/tests/completion_test.ts b/js/plugins/vercel-ai-sdk/tests/completion_test.ts new file mode 100644 index 0000000000..98351760ec --- /dev/null +++ b/js/plugins/vercel-ai-sdk/tests/completion_test.ts @@ -0,0 +1,368 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import assert from 'node:assert'; +import { describe, it } from 'node:test'; +import { completionHandler } from '../src/completion.js'; +import { type StreamChunk } from '../src/schema.js'; + +function fakeFlow(chunks: (string | StreamChunk)[], finalOutput?: unknown) { + return { + stream(_input: unknown, _opts?: unknown) { + return { + stream: (async function* () { + for (const c of chunks) yield c; + })(), + output: Promise.resolve( + finalOutput ?? chunks.filter((c) => typeof c === 'string').join('') + ), + }; + }, + } as any; +} + +async function parseSSE(res: Response): Promise> { + const text = await res.text(); + return text + .split('\n') + .filter((l) => l.startsWith('data: ')) + .map((l) => { + const payload = l.slice('data: '.length); + return payload === '[DONE]' ? '[DONE]' : JSON.parse(payload); + }); +} + +function eventsOfType(events: Array, type: string) { + return events.filter( + (e) => typeof e === 'object' && (e as any).type === type + ); +} + +function makeReq(prompt: string) { + return new Request('http://localhost/api/completion', { + method: 'POST', + body: JSON.stringify({ prompt }), + }); +} + +describe('completionHandler — lifecycle', () => { + it('emits start, text events, and [DONE]', async () => { + const events = await parseSSE( + await completionHandler( + fakeFlow([ + { type: 'text', delta: 'Once' } as StreamChunk, + { type: 'text', delta: ' upon' } as StreamChunk, + ]) + )(makeReq('tell me a story')) + ); + assert.equal((events[0] as any).type, 'start'); + assert.equal(eventsOfType(events, 'text-start').length, 1); + assert.equal(eventsOfType(events, 'text-delta').length, 2); + assert.equal(eventsOfType(events, 'text-end').length, 1); + assert.equal(events[events.length - 1], '[DONE]'); + }); + + it('skips empty text delta chunks', async () => { + const events = await parseSSE( + await completionHandler( + fakeFlow([ + { type: 'text', delta: '' } as StreamChunk, + { type: 'text', delta: 'hello' } as StreamChunk, + { type: 'text', delta: '' } as StreamChunk, + ]) + )(makeReq('hi')) + ); + assert.equal((eventsOfType(events, 'text-delta') as any[]).length, 1); + }); +}); + +describe('completionHandler — rich chunks (StreamChunkSchema)', () => { + it('handles reasoning chunks', async () => { + const events = await parseSSE( + await completionHandler( + fakeFlow([ + { type: 'reasoning', delta: 'thinking...' } as StreamChunk, + { type: 'text', delta: 'answer' } as StreamChunk, + ]) + )(makeReq('prompt')) + ); + assert.equal(eventsOfType(events, 'reasoning-start').length, 1); + assert.equal(eventsOfType(events, 'reasoning-delta').length, 1); + assert.equal(eventsOfType(events, 'text-start').length, 1); + }); + + it('handles file chunks', async () => { + const events = await parseSSE( + await completionHandler( + fakeFlow([ + { + type: 'file', + url: 'data:image/png;base64,abc', + mediaType: 'image/png', + } as StreamChunk, + ]) + )(makeReq('prompt')) + ); + assert.equal(eventsOfType(events, 'file').length, 1); + }); + + it('handles source-url chunks', async () => { + const events = await parseSSE( + await completionHandler( + fakeFlow([ + { + type: 'source-url', + sourceId: 's1', + url: 'https://genkit.dev', + } as StreamChunk, + ]) + )(makeReq('prompt')) + ); + assert.equal(eventsOfType(events, 'source-url').length, 1); + }); +}); + +describe('completionHandler — finish data', () => { + it('populates finish with finishReason from FlowOutputSchema output', async () => { + const flow = fakeFlow([], { + finishReason: 'stop', + usage: { inputTokens: 3 }, + }); + const events = await parseSSE(await completionHandler(flow)(makeReq('hi'))); + const f = eventsOfType(events, 'finish')[0] as any; + assert.equal(f.finishReason, 'stop'); + assert.deepEqual(f.messageMetadata?.usage, { inputTokens: 3 }); + }); +}); + +describe('completionHandler — request validation', () => { + it('returns 400 for malformed JSON', async () => { + const req = new Request('http://localhost/api/completion', { + method: 'POST', + body: 'bad', + }); + const res = await completionHandler(fakeFlow([]))(req); + assert.equal(res.status, 400); + }); + + it('returns 400 when prompt is missing', async () => { + const req = new Request('http://localhost/api/completion', { + method: 'POST', + body: JSON.stringify({}), + }); + const res = await completionHandler(fakeFlow([]))(req); + assert.equal(res.status, 400); + }); + + it('returns 400 when prompt is not a string', async () => { + const req = new Request('http://localhost/api/completion', { + method: 'POST', + body: JSON.stringify({ prompt: 42 }), + }); + const res = await completionHandler(fakeFlow([]))(req); + assert.equal(res.status, 400); + }); +}); + +describe('completionHandler — contextProvider', () => { + it('forwards context to the flow', async () => { + let capturedOpts: any; + const flow = { + stream(_: unknown, opts: unknown) { + capturedOpts = opts; + return { + stream: (async function* () {})(), + output: Promise.resolve(''), + }; + }, + } as any; + const res = await completionHandler(flow, { + contextProvider: async () => ({ userId: 'u1' }), + })(makeReq('hi')); + await res.text(); // drain + assert.deepEqual(capturedOpts.context, { userId: 'u1' }); + }); + + it('returns error status when contextProvider throws', async () => { + const err = Object.assign(new Error('Forbidden'), { status: 403 }); + const res = await completionHandler(fakeFlow([]), { + contextProvider: async () => { + throw err; + }, + })(makeReq('hi')); + assert.equal(res.status, 403); + }); +}); + +describe('completionHandler — abort signal', () => { + it('passes req.signal to flow.stream()', async () => { + let capturedOpts: any; + const flow = { + stream(_: unknown, opts: unknown) { + capturedOpts = opts; + return { + stream: (async function* () {})(), + output: Promise.resolve(''), + }; + }, + } as any; + const res = await completionHandler(flow)(makeReq('hi')); + await res.text(); // drain + assert.ok(capturedOpts.abortSignal instanceof AbortSignal); + }); +}); + +describe('completionHandler — onError (SSE mode)', () => { + it('surfaces custom onError string in the error SSE event', async () => { + const throwingFlow = { + stream(_input: unknown, _opts?: unknown) { + return { + stream: (async function* () { + throw new Error('boom'); + })(), + output: Promise.resolve(undefined), + }; + }, + } as any; + + const events = await parseSSE( + await completionHandler(throwingFlow, { + onError: () => 'oops', + })(makeReq('hi')) + ); + const errEvent = events.find( + (e) => typeof e === 'object' && (e as any).type === 'error' + ) as any; + assert.ok(errEvent, 'expected an error event'); + assert.equal(errEvent.errorText, 'oops'); + }); + + it('uses default message when onError returns void', async () => { + const throwingFlow = { + stream(_input: unknown, _opts?: unknown) { + return { + stream: (async function* () { + throw new Error('boom'); + })(), + output: Promise.resolve(undefined), + }; + }, + } as any; + + const events = await parseSSE( + await completionHandler(throwingFlow, { onError: () => {} })( + makeReq('hi') + ) + ); + const errEvent = events.find( + (e) => typeof e === 'object' && (e as any).type === 'error' + ) as any; + assert.ok(errEvent); + assert.equal(errEvent.errorText, 'An error occurred.'); + }); +}); + +describe('completionHandler — onError (text mode)', () => { + it('writes custom error message to text stream', async () => { + const throwingFlow = { + stream(_input: unknown, _opts?: unknown) { + return { + stream: (async function* () { + yield 'partial'; + throw new Error('boom'); + })(), + output: Promise.resolve(undefined), + }; + }, + } as any; + + const res = await completionHandler(throwingFlow, { + streamProtocol: 'text', + onError: () => ' [error]', + })(makeReq('hi')); + const text = await res.text(); + assert.ok(text.endsWith(' [error]')); + }); + + it('uses default error message when onError returns void (text mode)', async () => { + const throwingFlow = { + stream(_input: unknown, _opts?: unknown) { + return { + stream: (async function* () { + throw new Error('boom'); + })(), + output: Promise.resolve(undefined), + }; + }, + } as any; + + const res = await completionHandler(throwingFlow, { + streamProtocol: 'text', + onError: () => {}, + })(makeReq('hi')); + assert.equal(await res.text(), 'An error occurred.'); + }); +}); + +describe('completionHandler — response format', () => { + it('returns 200 with correct AI SDK headers', async () => { + const res = await completionHandler(fakeFlow([]))(makeReq('hi')); + assert.equal(res.status, 200); + assert.equal(res.headers.get('Content-Type'), 'text/event-stream'); + assert.equal(res.headers.get('X-Vercel-AI-UI-Message-Stream'), 'v1'); + assert.equal(res.headers.get('X-Accel-Buffering'), 'no'); + await res.text(); // drain + }); +}); + +describe('completionHandler — streamProtocol: text', () => { + it('returns text/plain and forwards text chunk deltas', async () => { + const res = await completionHandler( + fakeFlow([ + { type: 'text', delta: 'Hello' } as StreamChunk, + { type: 'text', delta: ', ' } as StreamChunk, + { type: 'text', delta: 'world!' } as StreamChunk, + ]), + { streamProtocol: 'text' } + )(makeReq('hi')); + assert.equal(res.status, 200); + assert.ok(res.headers.get('Content-Type')?.includes('text/plain')); + assert.equal(await res.text(), 'Hello, world!'); + }); + + it('ignores non-text typed chunks', async () => { + const res = await completionHandler( + fakeFlow([ + { type: 'reasoning', delta: 'thinking...' } as StreamChunk, + { type: 'text', delta: 'answer' } as StreamChunk, + ]), + { streamProtocol: 'text' } + )(makeReq('hi')); + assert.equal(await res.text(), 'answer'); + }); + + it('skips empty text deltas', async () => { + const res = await completionHandler( + fakeFlow([ + { type: 'text', delta: '' } as StreamChunk, + { type: 'text', delta: 'ok' } as StreamChunk, + { type: 'text', delta: '' } as StreamChunk, + ]), + { streamProtocol: 'text' } + )(makeReq('hi')); + assert.equal(await res.text(), 'ok'); + }); +}); diff --git a/js/plugins/vercel-ai-sdk/tests/convert_test.ts b/js/plugins/vercel-ai-sdk/tests/convert_test.ts new file mode 100644 index 0000000000..a1c3ccc778 --- /dev/null +++ b/js/plugins/vercel-ai-sdk/tests/convert_test.ts @@ -0,0 +1,184 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import assert from 'node:assert'; +import { describe, it } from 'node:test'; +import { toGenkitMessages, type UIMessage } from '../src/convert.js'; + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +function msg( + role: UIMessage['role'], + parts: UIMessage['parts'], + content?: string +): UIMessage { + return { + id: 'x', + role, + parts, + ...(content !== undefined ? { content } : {}), + }; +} + +// --------------------------------------------------------------------------- +// Tests +// --------------------------------------------------------------------------- + +describe('toGenkitMessages', () => { + it('converts plain text user message', () => { + const result = toGenkitMessages([ + msg('user', [{ type: 'text', text: 'Hello' }]), + ]); + assert.equal(result.length, 1); + assert.equal(result[0].role, 'user'); + assert.deepEqual(result[0].content, [{ text: 'Hello' }]); + }); + + it('falls back to legacy content string', () => { + const result = toGenkitMessages([msg('user', [], 'Fallback')]); + assert.equal(result[0].role, 'user'); + assert.deepEqual(result[0].content, [{ text: 'Fallback' }]); + }); + + it('converts assistant text → model role', () => { + const result = toGenkitMessages([ + msg('assistant', [{ type: 'text', text: 'Hi there' }]), + ]); + assert.equal(result[0].role, 'model'); + assert.deepEqual(result[0].content, [{ text: 'Hi there' }]); + }); + + it('converts file attachment → media part', () => { + const result = toGenkitMessages([ + msg('user', [ + { type: 'text', text: 'What is this?' }, + { + type: 'file', + url: 'data:image/png;base64,abc', + mediaType: 'image/png', + } as any, + ]), + ]); + assert.deepEqual(result[0].content, [ + { text: 'What is this?' }, + { media: { url: 'data:image/png;base64,abc', contentType: 'image/png' } }, + ]); + }); + + it('converts dynamic-tool (state: input-available) → toolRequest only', () => { + const result = toGenkitMessages([ + msg('assistant', [ + { + type: 'dynamic-tool', + toolCallId: 'tc1', + toolName: 'search', + state: 'input-available', + input: { q: 'genkit' }, + } as any, + ]), + ]); + assert.equal(result.length, 1); + assert.equal(result[0].role, 'model'); + assert.deepEqual(result[0].content, [ + { toolRequest: { ref: 'tc1', name: 'search', input: { q: 'genkit' } } }, + ]); + }); + + it('converts dynamic-tool (state: output-available) → model + tool messages', () => { + const result = toGenkitMessages([ + msg('assistant', [ + { + type: 'dynamic-tool', + toolCallId: 'tc1', + toolName: 'search', + state: 'output-available', + input: { q: 'genkit' }, + output: { hits: 5 }, + } as any, + ]), + ]); + assert.equal(result.length, 2); + assert.equal(result[0].role, 'model'); + assert.deepEqual(result[0].content, [ + { toolRequest: { ref: 'tc1', name: 'search', input: { q: 'genkit' } } }, + ]); + assert.equal(result[1].role, 'tool'); + assert.deepEqual(result[1].content, [ + { toolResponse: { ref: 'tc1', name: 'search', output: { hits: 5 } } }, + ]); + }); + + it('converts static tool-${name} part → toolRequest', () => { + const result = toGenkitMessages([ + msg('assistant', [ + { + type: 'tool-search', + toolCallId: 'tc1', + state: 'input-available', + input: { q: 'genkit' }, + } as any, + ]), + ]); + assert.equal(result.length, 1); + assert.equal(result[0].role, 'model'); + assert.deepEqual(result[0].content, [ + { toolRequest: { ref: 'tc1', name: 'search', input: { q: 'genkit' } } }, + ]); + }); + + it('passes system messages through', () => { + const result = toGenkitMessages([ + msg('system', [{ type: 'text', text: 'Be helpful.' }]), + ]); + assert.equal(result[0].role, 'system'); + assert.deepEqual(result[0].content, [{ text: 'Be helpful.' }]); + }); + + it('preserves message order across mixed conversation', () => { + const result = toGenkitMessages([ + msg('system', [{ type: 'text', text: 'sys' }]), + msg('user', [{ type: 'text', text: 'Q' }]), + msg('assistant', [{ type: 'text', text: 'A' }]), + ]); + assert.deepEqual( + result.map((m) => m.role), + ['system', 'user', 'model'] + ); + }); + + it('handles assistant with text + tool output-available → model + tool messages', () => { + const result = toGenkitMessages([ + msg('assistant', [ + { type: 'text', text: 'Let me check...' }, + { + type: 'dynamic-tool', + toolCallId: 'tc2', + toolName: 'calc', + state: 'output-available', + input: { expr: '2+2' }, + output: 4, + } as any, + ]), + ]); + // model message (text + toolRequest) + tool message (toolResponse) + assert.equal(result.length, 2); + assert.equal(result[0].role, 'model'); + assert.equal(result[0].content.length, 2); + assert.equal(result[1].role, 'tool'); + }); +}); diff --git a/js/plugins/vercel-ai-sdk/tests/generate_test.ts b/js/plugins/vercel-ai-sdk/tests/generate_test.ts new file mode 100644 index 0000000000..59e6372ee4 --- /dev/null +++ b/js/plugins/vercel-ai-sdk/tests/generate_test.ts @@ -0,0 +1,179 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import assert from 'node:assert'; +import { describe, it } from 'node:test'; +import { toFlowOutput, toStreamChunks } from '../src/generate.js'; + +function fakeChunk({ + text = '', + reasoning = '', + content = [] as any[], + toolRequests = [] as any[], +} = {}) { + return { text, reasoning, content, toolRequests } as any; +} + +function fakeResponse(opts: { finishReason?: string; usage?: any } = {}) { + return { finishReason: opts.finishReason, usage: opts.usage ?? {} } as any; +} + +describe('toStreamChunks', () => { + it('returns empty array for empty chunk', () => { + assert.deepEqual(toStreamChunks(fakeChunk()), []); + }); + + it('maps media parts to file chunks', () => { + const result = toStreamChunks( + fakeChunk({ + content: [ + { + media: { + url: 'data:image/png;base64,abc', + contentType: 'image/png', + }, + }, + ], + }) + ); + assert.deepEqual(result, [ + { + type: 'file', + url: 'data:image/png;base64,abc', + mediaType: 'image/png', + }, + ]); + }); + + it('uses application/octet-stream when contentType is missing', () => { + const result = toStreamChunks( + fakeChunk({ content: [{ media: { url: 'data:image/png;base64,abc' } }] }) + ); + assert.equal((result[0] as any).mediaType, 'application/octet-stream'); + }); + + it('maps multiple media parts', () => { + const result = toStreamChunks( + fakeChunk({ + content: [ + { media: { url: 'u1', contentType: 'image/png' } }, + { media: { url: 'u2', contentType: 'image/jpeg' } }, + ], + }) + ); + assert.equal(result.length, 2); + assert.equal((result[0] as any).url, 'u1'); + assert.equal((result[1] as any).url, 'u2'); + }); + + it('ignores non-media content parts', () => { + const result = toStreamChunks( + fakeChunk({ content: [{ text: 'hi' }, { data: {} }], text: 'hi' }) + ); + assert.equal(result.filter((c) => c.type === 'file').length, 0); + }); + + it('maps text to a text chunk', () => { + const result = toStreamChunks(fakeChunk({ text: 'hello' })); + assert.deepEqual(result, [{ type: 'text', delta: 'hello' }]); + }); + + it('maps reasoning before text', () => { + const result = toStreamChunks(fakeChunk({ reasoning: 'hmm', text: 'ok' })); + assert.equal(result[0].type, 'reasoning'); + assert.equal(result[1].type, 'text'); + }); + + it('maps tool requests using ref as toolCallId', () => { + const result = toStreamChunks( + fakeChunk({ + content: [ + { + toolRequest: { + ref: 'call-1', + name: 'search', + input: { q: 'genkit' }, + }, + }, + ], + }) + ); + assert.deepEqual(result, [ + { + type: 'tool-request', + toolCallId: 'call-1', + toolName: 'search', + input: { q: 'genkit' }, + }, + ]); + }); + + it('falls back to name when ref is missing', () => { + const result = toStreamChunks( + fakeChunk({ + content: [{ toolRequest: { name: 'search', input: {} } }], + }) + ); + assert.equal((result[0] as any).toolCallId, 'search'); + }); + + it('handles multiple tool requests', () => { + const result = toStreamChunks( + fakeChunk({ + content: [ + { toolRequest: { ref: 'c1', name: 'a', input: {} } }, + { toolRequest: { ref: 'c2', name: 'b', input: {} } }, + ], + }) + ); + assert.equal(result.length, 2); + assert.equal((result[0] as any).toolCallId, 'c1'); + assert.equal((result[1] as any).toolCallId, 'c2'); + }); + + it('emits media before tool requests', () => { + const result = toStreamChunks( + fakeChunk({ + content: [ + { media: { url: 'u1', contentType: 'image/png' } }, + { toolRequest: { ref: 'c1', name: 'a', input: {} } }, + ], + }) + ); + assert.equal(result[0].type, 'file'); + assert.equal(result[1].type, 'tool-request'); + }); +}); + +describe('toFlowOutput', () => { + it('extracts finishReason and usage', () => { + const result = toFlowOutput( + fakeResponse({ finishReason: 'stop', usage: { inputTokens: 5 } }) + ); + assert.equal(result.finishReason, 'stop'); + assert.deepEqual(result.usage, { inputTokens: 5 }); + }); + + it('handles undefined finishReason', () => { + const result = toFlowOutput(fakeResponse({ finishReason: undefined })); + assert.equal(result.finishReason, undefined); + }); + + it('returns empty usage object when usage is empty', () => { + const result = toFlowOutput(fakeResponse({ usage: {} })); + assert.deepEqual(result.usage, {}); + }); +}); diff --git a/js/plugins/vercel-ai-sdk/tests/object_test.ts b/js/plugins/vercel-ai-sdk/tests/object_test.ts new file mode 100644 index 0000000000..09f9159b11 --- /dev/null +++ b/js/plugins/vercel-ai-sdk/tests/object_test.ts @@ -0,0 +1,175 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import assert from 'node:assert'; +import { describe, it } from 'node:test'; +import { objectHandler } from '../src/object.js'; + +function fakeFlow(chunks: string[]) { + return { + stream(_input: unknown, _opts?: unknown) { + return { + stream: (async function* () { + for (const c of chunks) yield c; + })(), + output: Promise.resolve(chunks.join('')), + }; + }, + } as any; +} + +describe('objectHandler — streaming', () => { + it('returns text/plain response', async () => { + const res = await objectHandler(fakeFlow(['{}']))( + new Request('http://localhost/api/object', { + method: 'POST', + body: JSON.stringify({}), + }) + ); + assert.equal(res.status, 200); + assert.ok(res.headers.get('Content-Type')?.includes('text/plain')); + }); + + it('pipes partial JSON verbatim', async () => { + const res = await objectHandler(fakeFlow(['{"items":[', '"a","b"', ']}']))( + new Request('http://localhost/api/object', { + method: 'POST', + body: JSON.stringify({ topic: 'fruit' }), + }) + ); + assert.equal(await res.text(), '{"items":["a","b"]}'); + }); + + it('skips empty chunks', async () => { + const res = await objectHandler(fakeFlow(['', '{"ok":true}', '']))( + new Request('http://localhost/api/object', { + method: 'POST', + body: JSON.stringify({}), + }) + ); + assert.equal(await res.text(), '{"ok":true}'); + }); +}); + +describe('objectHandler — request validation', () => { + it('returns 400 for malformed JSON', async () => { + const res = await objectHandler(fakeFlow([]))( + new Request('http://localhost/api/object', { + method: 'POST', + body: 'not json', + }) + ); + assert.equal(res.status, 400); + }); +}); + +describe('objectHandler — contextProvider', () => { + it('forwards context to the flow', async () => { + let capturedOpts: any; + const flow = { + stream(_: unknown, opts: unknown) { + capturedOpts = opts; + return { + stream: (async function* () {})(), + output: Promise.resolve(''), + }; + }, + } as any; + + const res = await objectHandler(flow, { + contextProvider: async () => ({ userId: 'u1' }), + })( + new Request('http://localhost/api/object', { + method: 'POST', + body: JSON.stringify({}), + }) + ); + await res.text(); // drain + assert.deepEqual(capturedOpts.context, { userId: 'u1' }); + }); + + it('returns error status when contextProvider throws before stream opens', async () => { + const err = Object.assign(new Error('Unauthorized'), { status: 401 }); + const res = await objectHandler(fakeFlow([]), { + contextProvider: async () => { + throw err; + }, + })( + new Request('http://localhost/api/object', { + method: 'POST', + body: JSON.stringify({}), + }) + ); + assert.equal(res.status, 401); + }); +}); + +describe('objectHandler — mid-stream errors', () => { + it('closes the stream without appending text so partial JSON is not corrupted', async () => { + let onErrorCalled = false; + const flow = { + stream(_: unknown, __: unknown) { + return { + stream: (async function* () { + yield '{"item":'; + throw new Error('mid-stream failure'); + })(), + output: Promise.resolve(''), + }; + }, + } as any; + + const res = await objectHandler(flow, { + onError: () => { + onErrorCalled = true; + }, + })( + new Request('http://localhost/api/object', { + method: 'POST', + body: JSON.stringify({}), + }) + ); + + const text = await res.text(); + // Should not have appended any error JSON — the partial JSON stands alone + assert.equal(text, '{"item":'); + assert.ok(onErrorCalled); + }); +}); + +describe('objectHandler — abort signal', () => { + it('passes req.signal to flow.stream()', async () => { + let capturedOpts: any; + const flow = { + stream(_: unknown, opts: unknown) { + capturedOpts = opts; + return { + stream: (async function* () {})(), + output: Promise.resolve(''), + }; + }, + } as any; + + const res = await objectHandler(flow)( + new Request('http://localhost/api/object', { + method: 'POST', + body: JSON.stringify({}), + }) + ); + await res.text(); // drain + assert.ok(capturedOpts.abortSignal instanceof AbortSignal); + }); +}); diff --git a/js/plugins/vercel-ai-sdk/tests/schema_test.ts b/js/plugins/vercel-ai-sdk/tests/schema_test.ts new file mode 100644 index 0000000000..a597b70dde --- /dev/null +++ b/js/plugins/vercel-ai-sdk/tests/schema_test.ts @@ -0,0 +1,349 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import assert from 'node:assert'; +import { describe, it } from 'node:test'; +import { + FlowOutputSchema, + MessagesSchema, + StreamChunkSchema, +} from '../src/schema.js'; + +// --------------------------------------------------------------------------- +// MessagesSchema +// --------------------------------------------------------------------------- + +describe('MessagesSchema', () => { + it('accepts text parts (Genkit-native format)', () => { + assert.ok( + MessagesSchema.safeParse({ + messages: [{ role: 'user', content: [{ text: 'Hello' }] }], + }).success + ); + }); + + it('accepts array of text parts for multiple messages', () => { + assert.ok( + MessagesSchema.safeParse({ + messages: [ + { role: 'user', content: [{ text: 'Hi' }] }, + { role: 'model', content: [{ text: 'Hello!' }] }, + ], + }).success + ); + }); + + it('accepts media parts', () => { + assert.ok( + MessagesSchema.safeParse({ + messages: [ + { + role: 'user', + content: [ + { text: 'What is this?' }, + { + media: { + url: 'data:image/png;base64,abc', + contentType: 'image/png', + }, + }, + ], + }, + ], + }).success + ); + }); + + it('accepts toolRequest and toolResponse parts', () => { + assert.ok( + MessagesSchema.safeParse({ + messages: [ + { + role: 'model', + content: [ + { + toolRequest: { name: 'search', ref: 'tc1', input: { q: 'hi' } }, + }, + ], + }, + { + role: 'tool', + content: [ + { + toolResponse: { + name: 'search', + ref: 'tc1', + output: { result: 'ok' }, + }, + }, + ], + }, + ], + }).success + ); + }); + + it('accepts all four roles', () => { + assert.ok( + MessagesSchema.safeParse({ + messages: [ + { role: 'system', content: [{ text: 'sys' }] }, + { role: 'user', content: [{ text: 'hi' }] }, + { role: 'model', content: [{ text: 'hello' }] }, + { + role: 'tool', + content: [{ toolResponse: { name: 'f', ref: 'x', output: {} } }], + }, + ], + }).success + ); + }); + + it('accepts optional body field with arbitrary fields', () => { + const r = MessagesSchema.safeParse({ + messages: [{ role: 'user', content: [{ text: 'hi' }] }], + body: { sessionId: 'abc', persona: 'helpful', count: 3 }, + }); + assert.ok(r.success); + assert.deepEqual(r.data!.body, { + sessionId: 'abc', + persona: 'helpful', + count: 3, + }); + }); + + it('body field is optional', () => { + assert.ok( + MessagesSchema.safeParse({ + messages: [{ role: 'user', content: [{ text: 'hi' }] }], + }).success + ); + }); + + it('rejects unknown roles', () => { + assert.ok( + !MessagesSchema.safeParse({ + messages: [{ role: 'assistant', content: [{ text: 'hi' }] }], + }).success + ); + }); +}); + +// --------------------------------------------------------------------------- +// StreamChunkSchema +// --------------------------------------------------------------------------- + +describe('StreamChunkSchema', () => { + it('accepts text chunk', () => { + assert.ok( + StreamChunkSchema.safeParse({ type: 'text', delta: 'Hello' }).success + ); + }); + + it('accepts reasoning chunk', () => { + assert.ok( + StreamChunkSchema.safeParse({ type: 'reasoning', delta: 'I think...' }) + .success + ); + }); + + it('accepts tool-request with inputDelta', () => { + assert.ok( + StreamChunkSchema.safeParse({ + type: 'tool-request', + toolCallId: 'tc1', + toolName: 'search', + inputDelta: '{"q":', + }).success + ); + }); + + it('accepts tool-request with full input', () => { + assert.ok( + StreamChunkSchema.safeParse({ + type: 'tool-request', + toolCallId: 'tc1', + toolName: 'search', + input: { q: 'genkit' }, + }).success + ); + }); + + it('accepts tool-result', () => { + assert.ok( + StreamChunkSchema.safeParse({ + type: 'tool-result', + toolCallId: 'tc1', + output: { answer: 42 }, + }).success + ); + }); + + it('accepts file chunk', () => { + assert.ok( + StreamChunkSchema.safeParse({ + type: 'file', + url: 'data:image/png;base64,abc', + mediaType: 'image/png', + }).success + ); + }); + + it('accepts file chunk with filename', () => { + assert.ok( + StreamChunkSchema.safeParse({ + type: 'file', + url: 'https://example.com/img.png', + mediaType: 'image/png', + filename: 'img.png', + }).success + ); + }); + + it('accepts source-url chunk', () => { + assert.ok( + StreamChunkSchema.safeParse({ + type: 'source-url', + sourceId: 's1', + url: 'https://example.com', + }).success + ); + }); + + it('accepts source-url with title', () => { + assert.ok( + StreamChunkSchema.safeParse({ + type: 'source-url', + sourceId: 's1', + url: 'https://example.com', + title: 'Example', + }).success + ); + }); + + it('accepts source-document chunk', () => { + assert.ok( + StreamChunkSchema.safeParse({ + type: 'source-document', + sourceId: 's2', + mediaType: 'application/pdf', + title: 'Report', + }).success + ); + }); + + it('accepts source-document with filename', () => { + assert.ok( + StreamChunkSchema.safeParse({ + type: 'source-document', + sourceId: 's2', + mediaType: 'application/pdf', + title: 'Report', + filename: 'report.pdf', + }).success + ); + }); + + it('accepts data chunk', () => { + assert.ok( + StreamChunkSchema.safeParse({ + type: 'data', + id: 'usage', + value: { inputTokens: 10 }, + }).success + ); + }); + + it('accepts tool-input-error', () => { + assert.ok( + StreamChunkSchema.safeParse({ + type: 'tool-input-error', + toolCallId: 'tc1', + toolName: 'search', + input: '{"bad', + errorText: 'Invalid JSON', + }).success + ); + }); + + it('accepts tool-output-error', () => { + assert.ok( + StreamChunkSchema.safeParse({ + type: 'tool-output-error', + toolCallId: 'tc1', + errorText: 'Tool execution failed', + }).success + ); + }); + + it('accepts tool-output-denied', () => { + assert.ok( + StreamChunkSchema.safeParse({ + type: 'tool-output-denied', + toolCallId: 'tc1', + }).success + ); + }); + + it('accepts tool-approval-request', () => { + assert.ok( + StreamChunkSchema.safeParse({ + type: 'tool-approval-request', + approvalId: 'a1', + toolCallId: 'tc1', + }).success + ); + }); + + it('accepts step-start and step-end', () => { + assert.ok(StreamChunkSchema.safeParse({ type: 'step-start' }).success); + assert.ok(StreamChunkSchema.safeParse({ type: 'step-end' }).success); + }); + + it('rejects unknown type', () => { + assert.ok( + !StreamChunkSchema.safeParse({ type: 'unknown-future-type' }).success + ); + }); +}); + +// --------------------------------------------------------------------------- +// FlowOutputSchema +// --------------------------------------------------------------------------- + +describe('FlowOutputSchema', () => { + it('accepts finishReason and usage', () => { + const r = FlowOutputSchema.safeParse({ + finishReason: 'stop', + usage: { inputTokens: 10, outputTokens: 20 }, + }); + assert.ok(r.success); + assert.equal(r.data!.finishReason, 'stop'); + assert.deepEqual(r.data!.usage, { inputTokens: 10, outputTokens: 20 }); + }); + + it('accepts partial output (only finishReason)', () => { + assert.ok(FlowOutputSchema.safeParse({ finishReason: 'length' }).success); + }); + + it('accepts empty object', () => { + assert.ok(FlowOutputSchema.safeParse({}).success); + }); + + it('rejects non-object output (plain string)', () => { + assert.ok(!FlowOutputSchema.safeParse('done').success); + }); +}); diff --git a/js/plugins/vercel-ai-sdk/tests/tsconfig.typecheck.json b/js/plugins/vercel-ai-sdk/tests/tsconfig.typecheck.json new file mode 100644 index 0000000000..23a53b5501 --- /dev/null +++ b/js/plugins/vercel-ai-sdk/tests/tsconfig.typecheck.json @@ -0,0 +1,4 @@ +{ + "extends": "../tsconfig.json", + "include": ["../src", "type_check.ts"] +} diff --git a/js/plugins/vercel-ai-sdk/tests/type_check.ts b/js/plugins/vercel-ai-sdk/tests/type_check.ts new file mode 100644 index 0000000000..683bb60eb2 --- /dev/null +++ b/js/plugins/vercel-ai-sdk/tests/type_check.ts @@ -0,0 +1,71 @@ +/** + * Copyright 2026 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * This file is NOT a runtime test — it only exercises compile-time type checks. + * Run: npx tsc --noEmit -p tests/tsconfig.typecheck.json + * + * Every line marked @ts-expect-error MUST produce a type error. + * If tsc passes with zero errors this file is working correctly. + */ + +import { z, type Action } from 'genkit/beta'; +import { chatHandler } from '../src/chat.js'; +import { completionHandler } from '../src/completion.js'; +import { objectHandler } from '../src/object.js'; +import { MessagesSchema, StreamChunkSchema } from '../src/schema.js'; + +// ---- chatHandler: correct usage (should compile) ------------------------- +declare const goodChat: Action< + typeof MessagesSchema, + any, + typeof StreamChunkSchema +>; +chatHandler(goodChat); + +// ---- chatHandler: wrong inputSchema -------------------------------------- +declare const badChatInput: Action; +// @ts-expect-error inputSchema must accept Messages (not string) +chatHandler(badChatInput); + +// ---- chatHandler: wrong inputSchema (number) ----------------------------- +declare const badChatNumber: Action; +// @ts-expect-error inputSchema must accept Messages (not number) +chatHandler(badChatNumber); + +// ---- completionHandler: correct usage (should compile) ------------------- +declare const goodCompletion: Action< + z.ZodString, + any, + typeof StreamChunkSchema +>; +completionHandler(goodCompletion); + +// ---- completionHandler: wrong inputSchema -------------------------------- +declare const badCompInput: Action< + z.ZodObject, + any, + typeof StreamChunkSchema +>; +// @ts-expect-error inputSchema must accept string (not object) +completionHandler(badCompInput); + +// ---- objectHandler: correct usage (should compile) ----------------------- +declare const goodObject: Action; +objectHandler(goodObject); + +// objectHandler accepts any input schema, so no wrong-input test needed. +// The stream schema constraint (must produce strings) is enforced at runtime. diff --git a/js/plugins/vercel-ai-sdk/tsconfig.json b/js/plugins/vercel-ai-sdk/tsconfig.json new file mode 100644 index 0000000000..8b18d61e76 --- /dev/null +++ b/js/plugins/vercel-ai-sdk/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.json", + "include": ["src"], + "compilerOptions": { + "skipLibCheck": true + } +} diff --git a/js/plugins/vercel-ai-sdk/tsup.config.ts b/js/plugins/vercel-ai-sdk/tsup.config.ts new file mode 100644 index 0000000000..d55507161f --- /dev/null +++ b/js/plugins/vercel-ai-sdk/tsup.config.ts @@ -0,0 +1,22 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { defineConfig, type Options } from 'tsup'; +import { defaultOptions } from '../../tsup.common'; + +export default defineConfig({ + ...(defaultOptions as Options), +}); diff --git a/js/pnpm-lock.yaml b/js/pnpm-lock.yaml index 7d7b031429..01a16ff459 100644 --- a/js/pnpm-lock.yaml +++ b/js/pnpm-lock.yaml @@ -187,7 +187,7 @@ importers: version: 4.1.1 '@genkit-ai/firebase': specifier: ^1.16.1 - version: 1.29.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)(genkit@1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)) + version: 1.29.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)(genkit@1.31.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)) doc-snippets: dependencies: @@ -950,6 +950,36 @@ importers: specifier: ^5.9.3 version: 5.9.3 + plugins/vercel-ai-sdk: + devDependencies: + '@types/node': + specifier: ^20.11.16 + version: 20.19.37 + ai: + specifier: ^6.0.156 + version: 6.0.156(zod@3.25.76) + genkit: + specifier: workspace:^ + version: link:../../genkit + npm-run-all: + specifier: ^4.1.5 + version: 4.1.5 + rimraf: + specifier: ^6.0.1 + version: 6.1.3 + tsup: + specifier: ^8.3.5 + version: 8.5.1(postcss@8.4.31)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.2) + tsx: + specifier: ^4.19.2 + version: 4.20.3 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + zod: + specifier: ^3.24.1 + version: 3.25.76 + plugins/vertexai: dependencies: '@anthropic-ai/sdk': @@ -1904,6 +1934,49 @@ importers: specifier: ^5.9.3 version: 5.9.3 + testapps/vercel-ai-sdk-next: + dependencies: + '@ai-sdk/react': + specifier: ^3.0.158 + version: 3.0.158(react@19.2.4)(zod@3.25.76) + '@genkit-ai/google-genai': + specifier: workspace:* + version: link:../../plugins/google-genai + '@genkit-ai/vercel-ai-sdk': + specifier: workspace:* + version: link:../../plugins/vercel-ai-sdk + ai: + specifier: ^6.0.156 + version: 6.0.156(zod@3.25.76) + genkit: + specifier: workspace:* + version: link:../../genkit + next: + specifier: ^15.5.14 + version: 15.5.14(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: + specifier: ^19.0.0 + version: 19.2.4 + react-dom: + specifier: ^19.0.0 + version: 19.2.4(react@19.2.4) + zod: + specifier: ^3.24.1 + version: 3.25.76 + devDependencies: + '@types/react': + specifier: ^19.0.0 + version: 19.2.7 + '@types/react-dom': + specifier: ^19.0.0 + version: 19.2.3(@types/react@19.2.7) + rimraf: + specifier: ^6.0.1 + version: 6.1.3 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + testapps/vertexai-modelgarden: dependencies: '@genkit-ai/firebase': @@ -2115,6 +2188,28 @@ importers: packages: + '@ai-sdk/gateway@3.0.95': + resolution: {integrity: sha512-ZmUNNbZl3V42xwQzPaNUi+s8eqR2lnrxf0bvB6YbLXpLjHYv0k2Y78t12cNOfY0bxGeuVVTLyk856uLuQIuXEQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@4.0.23': + resolution: {integrity: sha512-z8GlDaCmRSDlqkMF2f4/RFgWxdarvIbyuk+m6WXT1LYgsnGiXRJGTD2Z1+SDl3LqtFuRtGX1aghYvQLoHL/9pg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider@3.0.8': + resolution: {integrity: sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==} + engines: {node: '>=18'} + + '@ai-sdk/react@3.0.158': + resolution: {integrity: sha512-U8LENItz0c91dEIT9vwhKiXIjIXMqdTZWwzveBxdJDcBYHicyq1ohsKnebdj7B7GjG21nREK1AGif0m0pxcqRw==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ~19.0.1 || ~19.1.2 || ^19.2.1 + '@anthropic-ai/sdk@0.71.2': resolution: {integrity: sha512-TGNDEUuEstk/DKu0/TflXAEt+p+p/WhTlFzEnoosvbaDU2LTjm42igSdlL0VijrKpWejtOKxX0b8A7uc+XiSAQ==} hasBin: true @@ -2871,11 +2966,11 @@ packages: resolution: {integrity: sha512-Lm/ZLhDZcBECta3TmCQSngiQykFdfw+QtI1/GYMsZd4l3nG+P8WLB16XuS7WaBGLQ+9E+cOcWQsth9cayuGt8g==} engines: {node: ^20.17.0 || >=22.9.0} - '@genkit-ai/ai@1.30.1': - resolution: {integrity: sha512-uaf9H8BSUHGBRg0THg6tDLCEEz+FRHTLY4RjOqhVvg0gqZOOaZuccKF3yOb6AU8FptvQE12p7wgDf5yPNBIXGA==} + '@genkit-ai/ai@1.31.0': + resolution: {integrity: sha512-SWkqCxJzHjxxIaZj/8tNt9AfcLBXInT/Q+RwW1LkBpO04E3gRguQ3cDSyMQ5TteRT/pAelJPHie6iyJRsyEkeA==} - '@genkit-ai/core@1.30.1': - resolution: {integrity: sha512-tW+FjvVpX8cdslHLM85PBe83M5xCsvMazRpN9+XJGalqymtUVc/L3xqAKCL7iGEVveqcJTsjBFfgSBwee80JLg==} + '@genkit-ai/core@1.31.0': + resolution: {integrity: sha512-DKY9KByiAB+Gy9hkVMH7jOhZqYsyRTZ24etjPq2WqVCwFLxUvGTvishaOmzDCI9tfpvc/qr8uCMda0viMmTSrg==} '@genkit-ai/express@1.29.0': resolution: {integrity: sha512-+Mf8e45RbAlvns3a3hvIDpUAjNyWTIu1cy7vV86+6NvpPqPhkEaPkptgIX7KIXsPBEwiwsEM4SXx80M/TRbmTg==} @@ -3786,13 +3881,6 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/exporter-jaeger@1.30.1': - resolution: {integrity: sha512-7Ki+x7cZ/PEQxp3UyB+CWkWBqLk22yRGQ4AWIGwZlEs6rpCOdWwIFOyQDO9DdeyWtTPTvO3An/7chPZcRHOgzQ==} - engines: {node: '>=14'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - peerDependencies: - '@opentelemetry/api': ^1.0.0 - '@opentelemetry/exporter-trace-otlp-grpc@0.52.1': resolution: {integrity: sha512-pVkSH20crBwMTqB3nIN4jpQKUEoB0Z94drIHpYyEqs7UBr+I0cpYyOR3bqjA/UasQUMROb3GX8ZX4/9cVRqGBQ==} engines: {node: '>=14'} @@ -4139,12 +4227,6 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/resources@1.30.1': - resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-logs@0.52.1': resolution: {integrity: sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA==} engines: {node: '>=14'} @@ -4169,12 +4251,6 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-trace-base@1.30.1': - resolution: {integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-trace-node@1.25.1': resolution: {integrity: sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ==} engines: {node: '>=14'} @@ -4424,6 +4500,9 @@ packages: '@so-ric/colorspace@1.1.6': resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} @@ -4551,6 +4630,11 @@ packages: '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + '@types/react@19.2.7': resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} @@ -4623,6 +4707,10 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} + '@vercel/oidc@3.1.0': + resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==} + engines: {node: '>= 20'} + abbrev@4.0.0: resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==} engines: {node: ^20.17.0 || >=22.9.0} @@ -4661,6 +4749,12 @@ packages: resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} engines: {node: '>= 8.0.0'} + ai@6.0.156: + resolution: {integrity: sha512-uyi/5LYbugHQxZsR2PeAFOZEL4WqKkzZw4pv0nQvvdgxgVOsM7snOmGrYkp5fShxH/vnd08SXvHCVTX7oUW7xQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -4683,9 +4777,6 @@ packages: ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - ansi-color@0.2.2: - resolution: {integrity: sha512-qPx7iZZDHITYrrfzaUFXQpIcF2xYifcQHQflP1pFz8yY3lfU6GgCHb0+hJD7nimYKO7f2iaYYwBpZ+GaNcAhcA==} - ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -4883,6 +4974,7 @@ packages: basic-ftp@5.2.0: resolution: {integrity: sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==} engines: {node: '>=10.0.0'} + deprecated: Security vulnerability fixed in 5.2.1, please upgrade big.js@6.2.2: resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} @@ -4963,10 +5055,6 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - bufrw@1.4.0: - resolution: {integrity: sha512-sWm8iPbqvL9+5SiYxXH73UOkyEbGQg7kyHQmReF89WJHQJw2eV4P/yZ0E+b71cczJ4pPobVhXxgQcmfSTgGHxQ==} - engines: {node: '>= 0.10.x'} - bundle-require@5.1.0: resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -5425,6 +5513,10 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -5543,9 +5635,6 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - error@7.0.2: - resolution: {integrity: sha512-UtVv4l5MhijsYUxPJo4390gzfZvAnTHreNnDjnTZaKIiZ/SemXxAhBkYSKtWa5RtBXbLP8tMgn/n0RUa/H7jXw==} - es-abstract@1.24.0: resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} @@ -5901,8 +5990,8 @@ packages: resolution: {integrity: sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==} engines: {node: '>=18'} - genkit@1.30.1: - resolution: {integrity: sha512-+v+IuE0SxoCC4AYMAuPi0YkEAT/Tm/oJhYECB+xFieebaxsdBUJ4FEp2u3HrDSyWv1Gj28unh8Og332ZdFJGRQ==} + genkit@1.31.0: + resolution: {integrity: sha512-9rvD1LcdwohGmMBiewo6lxY9U7hpJUoELAtvf/juxR/c81OxWpQrbuyLWLk3xEPqvcEqj7V+/aRjMgO4zS9vtA==} genkitx-openai@0.30.0: resolution: {integrity: sha512-6Dt3o6f+cKrZ1njSzYj2rm0U8SE5nQDwpz5VbFuLjaloE5BBj2c9OSlPGegdcz4PN5wBocGKiNsaKn0t5PpJdA==} @@ -6081,11 +6170,6 @@ packages: resolution: {integrity: sha512-EQfezRg0NCZGNlhlDR3Evrw1FVL2G3LhU7EgPoxufQKruNBSYA8MiRPHeWbU+36o+Fhel0wMwM+sLEiBAlNLJA==} engines: {node: '>=10.0.0'} - hexer@1.5.0: - resolution: {integrity: sha512-dyrPC8KzBzUJ19QTIo1gXNqIISRXQ0NwteW6OeQHRN4ZuZeHkdODfj0zHBdOlHbRY8GqbqK57C9oWSvQZizFsg==} - engines: {node: '>= 0.10.x'} - hasBin: true - highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} @@ -6453,10 +6537,6 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jaeger-client@3.19.0: - resolution: {integrity: sha512-M0c7cKHmdyEUtjemnJyx/y9uX16XHocL46yQvyqDlPdvAcwPDbHrIbKjQdBqtiE4apQ/9dmr+ZLJYYPGnurgpw==} - engines: {node: '>=10'} - jake@10.9.4: resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} engines: {node: '>=10'} @@ -7017,10 +7097,6 @@ packages: resolution: {integrity: sha512-TU6nAF5SdasnTr28c7e74P4Crbn9o3/zwo1pM22Wvg2i2vlZ4Eelxwu4QT7j21z0sDBlJDEnEZjXTZg2J8WJrg==} engines: {node: '>=0.6'} - long@2.4.0: - resolution: {integrity: sha512-ijUtjmO/n2A5PaosNG9ZGDsQ3vxJg7ZW8vsY8Kp0f2yIZWhSJvjmegV7t+9RPQKxKrvj8yKGehhS+po14hPLGQ==} - engines: {node: '>=0.6'} - long@5.3.2: resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} @@ -7476,10 +7552,6 @@ packages: openapi3-ts@3.2.0: resolution: {integrity: sha512-/ykNWRV5Qs0Nwq7Pc0nJ78fgILvOT/60OxEmB3v7yQ8a8Bwcm43D4diaYazG/KBn6czA+52XYy931WFLMCUeSg==} - opentracing@0.14.7: - resolution: {integrity: sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q==} - engines: {node: '>=0.10'} - ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} @@ -7766,10 +7838,6 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - process@0.10.1: - resolution: {integrity: sha512-dyIett8dgGIZ/TXKUzeYExt7WA6ldDzys9vTDU/cCA9L17Ypme+KzS+NjQCjpn9xsvi/shbMC+yP/BcFMBz0NA==} - engines: {node: '>= 0.6.0'} - process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -8247,9 +8315,6 @@ packages: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} - string-template@0.2.1: - resolution: {integrity: sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -8360,6 +8425,11 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + swr@2.4.1: + resolution: {integrity: sha512-2CC6CiKQtEwaEeNiqWTAw9PGykW8SR5zZX8MZk6TeAvEAnVS7Visz8WzphqgtQ8v2xz/4Q5K+j+SeMaKXeeQIA==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + tar-stream@3.1.8: resolution: {integrity: sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==} @@ -8407,10 +8477,9 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - thriftrw@3.11.4: - resolution: {integrity: sha512-UcuBd3eanB3T10nXWRRMwfwoaC6VMk7qe3/5YIWP2Jtw+EbHqJ0p1/K3x8ixiR5dozKSSfcg1W+0e33G1Di3XA==} - engines: {node: '>= 0.10.x'} - hasBin: true + throttleit@2.1.0: + resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} + engines: {node: '>=18'} through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} @@ -8677,6 +8746,11 @@ packages: url-template@2.0.8: resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -8867,9 +8941,6 @@ packages: resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} engines: {node: '>=8'} - xorshift@1.2.0: - resolution: {integrity: sha512-iYgNnGyeeJ4t6U11NpA/QiKy+PXn5Aa3Azg5qkwIFz1tBLllQrjjsk9yzD7IAK0naNU4JxdeDgqW9ov4u/hc4g==} - xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -8935,6 +9006,34 @@ packages: snapshots: + '@ai-sdk/gateway@3.0.95(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.23(zod@3.25.76) + '@vercel/oidc': 3.1.0 + zod: 3.25.76 + + '@ai-sdk/provider-utils@4.0.23(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.0.6 + zod: 3.25.76 + + '@ai-sdk/provider@3.0.8': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/react@3.0.158(react@19.2.4)(zod@3.25.76)': + dependencies: + '@ai-sdk/provider-utils': 4.0.23(zod@3.25.76) + ai: 6.0.156(zod@3.25.76) + react: 19.2.4 + swr: 2.4.1(react@19.2.4) + throttleit: 2.1.0 + transitivePeerDependencies: + - zod + '@anthropic-ai/sdk@0.71.2(zod@3.25.76)': dependencies: json-schema-to-ts: 3.1.1 @@ -9700,13 +9799,14 @@ snapshots: retry: 0.13.1 optional: true - '@genkit-ai/ai@1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)(genkit@1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0))': + '@genkit-ai/ai@1.31.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)(genkit@1.31.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0))': dependencies: - '@genkit-ai/core': 1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)(genkit@1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)) + '@genkit-ai/core': 1.31.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)(genkit@1.31.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)) '@opentelemetry/api': 1.9.0 '@types/node': 20.19.37 colorette: 2.0.20 dotprompt: 1.1.2 + handlebars: 4.7.8 json5: 2.2.3 node-fetch: 3.3.2 partial-json: 0.1.7 @@ -9714,19 +9814,20 @@ snapshots: uuid: 10.0.0 transitivePeerDependencies: - '@google-cloud/firestore' + - bufferutil - encoding - firebase - firebase-admin - genkit - supports-color + - utf-8-validate optional: true - '@genkit-ai/core@1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)(genkit@1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0))': + '@genkit-ai/core@1.31.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)(genkit@1.31.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0))': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 1.25.1(@opentelemetry/api@1.9.0) '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-jaeger': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-node': 0.52.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) @@ -9739,18 +9840,21 @@ snapshots: express: 4.22.1 get-port: 5.1.1 json-schema: 0.4.0 + ws: 8.19.0 zod: 3.25.76 zod-to-json-schema: 3.25.1(zod@3.25.76) optionalDependencies: '@cfworker/json-schema': 4.1.1 - '@genkit-ai/firebase': 1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)(genkit@1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)) + '@genkit-ai/firebase': 1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)(genkit@1.31.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)) transitivePeerDependencies: - '@google-cloud/firestore' + - bufferutil - encoding - firebase - firebase-admin - genkit - supports-color + - utf-8-validate optional: true '@genkit-ai/express@1.29.0(express@5.2.1)(genkit@genkit)': @@ -9762,12 +9866,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@genkit-ai/firebase@1.29.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)(genkit@1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0))': + '@genkit-ai/firebase@1.29.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)(genkit@1.31.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0))': dependencies: - '@genkit-ai/google-cloud': 1.30.1(encoding@0.1.13)(genkit@1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)) + '@genkit-ai/google-cloud': 1.30.1(encoding@0.1.13)(genkit@1.31.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)) '@google-cloud/firestore': 7.11.6(encoding@0.1.13) firebase-admin: 13.7.0(encoding@0.1.13) - genkit: 1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0) + genkit: 1.31.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0) optionalDependencies: firebase: 11.10.0 transitivePeerDependencies: @@ -9775,12 +9879,12 @@ snapshots: - supports-color optional: true - '@genkit-ai/firebase@1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)(genkit@1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0))': + '@genkit-ai/firebase@1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)(genkit@1.31.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0))': dependencies: - '@genkit-ai/google-cloud': 1.30.1(encoding@0.1.13)(genkit@1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)) + '@genkit-ai/google-cloud': 1.30.1(encoding@0.1.13)(genkit@1.31.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)) '@google-cloud/firestore': 7.11.6(encoding@0.1.13) firebase-admin: 13.7.0(encoding@0.1.13) - genkit: 1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0) + genkit: 1.31.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0) optionalDependencies: firebase: 11.10.0 transitivePeerDependencies: @@ -9788,7 +9892,7 @@ snapshots: - supports-color optional: true - '@genkit-ai/google-cloud@1.30.1(encoding@0.1.13)(genkit@1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0))': + '@genkit-ai/google-cloud@1.30.1(encoding@0.1.13)(genkit@1.31.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0))': dependencies: '@google-cloud/logging-winston': 6.0.1(encoding@0.1.13)(winston@3.19.0) '@google-cloud/modelarmor': 0.4.1 @@ -9805,7 +9909,7 @@ snapshots: '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-node': 0.52.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) - genkit: 1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0) + genkit: 1.31.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0) google-auth-library: 9.15.1(encoding@0.1.13) node-fetch: 3.3.2 winston: 3.19.0 @@ -10689,15 +10793,6 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.28.0 - '@opentelemetry/exporter-jaeger@1.30.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.28.0 - jaeger-client: 3.19.0 - optional: true - '@opentelemetry/exporter-trace-otlp-grpc@0.52.1(@opentelemetry/api@1.9.0)': dependencies: '@grpc/grpc-js': 1.14.3 @@ -11173,13 +11268,6 @@ snapshots: '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.25.1 - '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.28.0 - optional: true - '@opentelemetry/sdk-logs@0.52.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -11220,14 +11308,6 @@ snapshots: '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.25.1 - '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.28.0 - optional: true - '@opentelemetry/sdk-trace-node@1.25.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -11427,6 +11507,8 @@ snapshots: color: 5.0.3 text-hex: 1.0.0 + '@standard-schema/spec@1.1.0': {} + '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 @@ -11585,6 +11667,10 @@ snapshots: '@types/range-parser@1.2.7': {} + '@types/react-dom@19.2.3(@types/react@19.2.7)': + dependencies: + '@types/react': 19.2.7 + '@types/react@19.2.7': dependencies: csstype: 3.2.3 @@ -11661,6 +11747,8 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 + '@vercel/oidc@3.1.0': {} + abbrev@4.0.0: optional: true @@ -11696,6 +11784,14 @@ snapshots: dependencies: humanize-ms: 1.2.1 + ai@6.0.156(zod@3.25.76): + dependencies: + '@ai-sdk/gateway': 3.0.95(zod@3.25.76) + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.23(zod@3.25.76) + '@opentelemetry/api': 1.9.0 + zod: 3.25.76 + ajv-formats@2.1.1(ajv@8.18.0): optionalDependencies: ajv: 8.18.0 @@ -11715,9 +11811,6 @@ snapshots: dependencies: string-width: 4.2.3 - ansi-color@0.2.2: - optional: true - ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -12049,14 +12142,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bufrw@1.4.0: - dependencies: - ansi-color: 0.2.2 - error: 7.0.2 - hexer: 1.5.0 - xtend: 4.0.2 - optional: true - bundle-require@5.1.0(esbuild@0.27.4): dependencies: esbuild: 0.27.4 @@ -12500,6 +12585,8 @@ snapshots: depd@2.0.0: {} + dequal@2.0.3: {} + destroy@1.2.0: {} detect-libc@2.1.2: @@ -12597,12 +12684,6 @@ snapshots: dependencies: is-arrayish: 0.2.1 - error@7.0.2: - dependencies: - string-template: 0.2.1 - xtend: 4.0.2 - optional: true - es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 @@ -13292,17 +13373,19 @@ snapshots: transitivePeerDependencies: - supports-color - genkit@1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0): + genkit@1.31.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0): dependencies: - '@genkit-ai/ai': 1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)(genkit@1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)) - '@genkit-ai/core': 1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)(genkit@1.30.1(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)) + '@genkit-ai/ai': 1.31.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)(genkit@1.31.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)) + '@genkit-ai/core': 1.31.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)(genkit@1.31.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.7.0(encoding@0.1.13))(firebase@11.10.0)) uuid: 10.0.0 transitivePeerDependencies: - '@google-cloud/firestore' + - bufferutil - encoding - firebase - firebase-admin - supports-color + - utf-8-validate optional: true genkitx-openai@0.30.0(genkit@genkit)(ws@8.19.0)(zod@3.25.76): @@ -13553,14 +13636,6 @@ snapshots: heap-js@2.7.1: {} - hexer@1.5.0: - dependencies: - ansi-color: 0.2.2 - minimist: 1.2.8 - process: 0.10.1 - xtend: 4.0.2 - optional: true - highlight.js@10.7.3: {} hono@4.12.7: {} @@ -13943,15 +14018,6 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jaeger-client@3.19.0: - dependencies: - node-int64: 0.4.0 - opentracing: 0.14.7 - thriftrw: 3.11.4 - uuid: 8.3.2 - xorshift: 1.2.0 - optional: true - jake@10.9.4: dependencies: async: 3.2.6 @@ -14614,9 +14680,6 @@ snapshots: long@1.1.5: {} - long@2.4.0: - optional: true - long@5.3.2: {} lru-cache@10.4.3: {} @@ -15000,7 +15063,7 @@ snapshots: chalk: 2.4.2 cross-spawn: 7.0.6 memorystream: 0.3.1 - minimatch: 3.1.2 + minimatch: 3.1.5 pidtree: 0.3.1 read-pkg: 3.0.0 shell-quote: 1.8.3 @@ -15086,9 +15149,6 @@ snapshots: dependencies: yaml: 2.8.0 - opentracing@0.14.7: - optional: true - ora@5.4.1: dependencies: bl: 4.1.0 @@ -15369,9 +15429,6 @@ snapshots: process-nextick-args@2.0.1: {} - process@0.10.1: - optional: true - process@0.11.10: {} progress@2.0.3: {} @@ -16013,9 +16070,6 @@ snapshots: char-regex: 1.0.2 strip-ansi: 6.0.1 - string-template@0.2.1: - optional: true - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -16152,6 +16206,12 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + swr@2.4.1(react@19.2.4): + dependencies: + dequal: 2.0.3 + react: 19.2.4 + use-sync-external-store: 1.6.0(react@19.2.4) + tar-stream@3.1.8: dependencies: b4a: 1.8.0 @@ -16239,12 +16299,7 @@ snapshots: dependencies: any-promise: 1.3.0 - thriftrw@3.11.4: - dependencies: - bufrw: 1.4.0 - error: 7.0.2 - long: 2.4.0 - optional: true + throttleit@2.1.0: {} through2@2.0.5: dependencies: @@ -16540,6 +16595,10 @@ snapshots: url-template@2.0.8: {} + use-sync-external-store@1.6.0(react@19.2.4): + dependencies: + react: 19.2.4 + util-deprecate@1.0.2: {} util@0.10.4: @@ -16741,9 +16800,6 @@ snapshots: xdg-basedir@4.0.0: {} - xorshift@1.2.0: - optional: true - xtend@4.0.2: {} y18n@5.0.8: {} diff --git a/js/testapps/vercel-ai-sdk-next/.gitignore b/js/testapps/vercel-ai-sdk-next/.gitignore new file mode 100644 index 0000000000..983380352a --- /dev/null +++ b/js/testapps/vercel-ai-sdk-next/.gitignore @@ -0,0 +1,4 @@ +.env.local +.env*.local +.next/ +node_modules/ diff --git a/js/testapps/vercel-ai-sdk-next/README.md b/js/testapps/vercel-ai-sdk-next/README.md new file mode 100644 index 0000000000..fd60ba514b --- /dev/null +++ b/js/testapps/vercel-ai-sdk-next/README.md @@ -0,0 +1,90 @@ +# vercel-ai-sdk-next + +Sample Next.js app demonstrating the `@genkit-ai/vercel-ai-sdk` plugin. Shows how to wire Genkit flows to the Vercel AI SDK UI hooks using the three adapter handlers. + +## What's demonstrated + +| Page | Hook | Handler | Flow | +|------|------|---------|------| +| `/chat` | `useChat` | `chatHandler` | Multi-turn chat with streaming text via `MessagesSchema` + `StreamChunkSchema` | +| `/completion` | `useCompletion` | `completionHandler` | Single-turn text completion with SSE streaming | +| `/object` | `useObject` | `objectHandler` | Structured JSON streaming — generates typed notification objects in real time | + +## Prerequisites + +- **Node.js** v18+ +- **pnpm** +- A **Gemini API key** — get one at [aistudio.google.com](https://aistudio.google.com) + +## Setup + +From the repo root, install all workspace dependencies: + +```bash +pnpm install +``` + +Set your API key: + +```bash +export GEMINI_API_KEY=your_api_key_here +``` + +## Run + +```bash +cd js/testapps/vercel-ai-sdk-next +pnpm dev +``` + +The app starts at [http://localhost:3000](http://localhost:3000). + +## Project structure + +``` +src/ + app/ + api/ + chat/route.ts # POST handler using chatHandler() + completion/route.ts # POST handler using completionHandler() + object/route.ts # POST handler using objectHandler() + chat/page.tsx # useChat demo UI + completion/page.tsx # useCompletion demo UI + object/page.tsx # useObject demo UI + genkit/ + index.ts # Genkit + googleAI plugin initialization + chat.ts # chatFlow: MessagesSchema + StreamChunkSchema + completion.ts # completionFlow: z.string() stream + object.ts # notificationsFlow: structured JSON streaming + schemas.ts # Shared Zod schemas (NotificationsSchema) +``` + +## How it works + +Each API route is a one-liner that wraps a Genkit flow: + +```ts +// src/app/api/chat/route.ts +import { chatHandler } from '@genkit-ai/vercel-ai-sdk'; +import { chatFlow } from '@/genkit/chat'; + +export const POST = chatHandler(chatFlow); +``` + +The flow defines its input and stream schemas using types from the plugin: + +```ts +// src/genkit/chat.ts +export const chatFlow = ai.defineFlow( + { + inputSchema: MessagesSchema, // receives UIMessage[] converted to Genkit format + streamSchema: StreamChunkSchema, // drives the full useChat protocol + outputSchema: FlowOutputSchema, // surfaces finishReason + usage + }, + async (input, { sendChunk }) => { ... } +); +``` + +## License + +Apache 2.0 diff --git a/js/testapps/vercel-ai-sdk-next/package.json b/js/testapps/vercel-ai-sdk-next/package.json new file mode 100644 index 0000000000..972f735862 --- /dev/null +++ b/js/testapps/vercel-ai-sdk-next/package.json @@ -0,0 +1,28 @@ +{ + "name": "vercel-ai-sdk-next-sample", + "type": "module", + "version": "0.0.1-dev.1", + "description": "Sample Next.js app demonstrating @genkit-ai/vercel-ai-sdk adapters with useChat, useCompletion, and useObject", + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start" + }, + "dependencies": { + "@genkit-ai/google-genai": "workspace:*", + "@genkit-ai/vercel-ai-sdk": "workspace:*", + "@ai-sdk/react": "^3.0.158", + "ai": "^6.0.156", + "genkit": "workspace:*", + "next": "^15.5.14", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "zod": "^3.24.1" + }, + "devDependencies": { + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "rimraf": "^6.0.1", + "typescript": "^5.9.3" + } +} diff --git a/js/testapps/vercel-ai-sdk-next/src/app/api/chat/route.ts b/js/testapps/vercel-ai-sdk-next/src/app/api/chat/route.ts new file mode 100644 index 0000000000..dca07bd8da --- /dev/null +++ b/js/testapps/vercel-ai-sdk-next/src/app/api/chat/route.ts @@ -0,0 +1,33 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { chatFlow } from '@/genkit/chat'; +import { chatHandler } from '@genkit-ai/vercel-ai-sdk'; + +/** + * useChat endpoint. + * + * The chatHandler adapter: + * 1. Parses the UIMessage[] from the request body + * 2. Converts them to Genkit MessageData[] via toGenkitMessages() + * 3. Streams the flow output as Vercel AI SDK data-stream SSE events + * + * Client usage: + * const { messages, input, handleInputChange, handleSubmit } = useChat({ + * api: '/api/chat', + * }); + */ +export const POST = chatHandler(chatFlow); diff --git a/js/testapps/vercel-ai-sdk-next/src/app/api/completion/route.ts b/js/testapps/vercel-ai-sdk-next/src/app/api/completion/route.ts new file mode 100644 index 0000000000..cd412fb202 --- /dev/null +++ b/js/testapps/vercel-ai-sdk-next/src/app/api/completion/route.ts @@ -0,0 +1,35 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { completionFlow } from '@/genkit/completion'; +import { completionHandler } from '@genkit-ai/vercel-ai-sdk'; + +/** + * useCompletion endpoint — SSE data-stream mode (default). + * + * The completionHandler adapter: + * 1. Reads { prompt: string } from the POST body + * 2. Streams text/typed chunks as Vercel AI SDK data-stream SSE events + * + * Client usage: + * const { completion, input, handleInputChange, handleSubmit } = useCompletion({ + * api: '/api/completion', + * }); + * + * To use plain text streaming instead, set streamProtocol: 'text' in + * both completionHandler options and the useCompletion client options. + */ +export const POST = completionHandler(completionFlow); diff --git a/js/testapps/vercel-ai-sdk-next/src/app/api/object/route.ts b/js/testapps/vercel-ai-sdk-next/src/app/api/object/route.ts new file mode 100644 index 0000000000..3e408e855f --- /dev/null +++ b/js/testapps/vercel-ai-sdk-next/src/app/api/object/route.ts @@ -0,0 +1,37 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { notificationsFlow } from '@/genkit/object'; +import { objectHandler } from '@genkit-ai/vercel-ai-sdk'; + +/** + * useObject endpoint. + * + * The objectHandler adapter: + * 1. Parses any JSON from the POST body and passes it as flow input + * 2. Streams raw text/plain JSON fragments from the flow's streamingCallback + * + * useObject reassembles the fragments incrementally and updates the + * partial object in the UI as the stream arrives. + * + * Client usage: + * const { object, submit, isLoading } = useObject({ + * api: '/api/object', + * schema: NotificationsSchema, + * }); + * submit({ topic: 'weather' }); + */ +export const POST = objectHandler(notificationsFlow); diff --git a/js/testapps/vercel-ai-sdk-next/src/app/chat/page.tsx b/js/testapps/vercel-ai-sdk-next/src/app/chat/page.tsx new file mode 100644 index 0000000000..d067bdfada --- /dev/null +++ b/js/testapps/vercel-ai-sdk-next/src/app/chat/page.tsx @@ -0,0 +1,181 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use client'; + +/** + * useChat demo + * + * Server: src/app/api/chat/route.ts → chatHandler(chatFlow) + * Flow: src/genkit/chat.ts → MessagesSchema + StreamChunkSchema + * + * Demonstrates: + * - Text streaming via toStreamChunks() + * - Tool calls: ask "What's the weather in Tokyo?" to trigger getWeather + * - Custom data chunks: token usage displayed below each assistant message + * - Reasoning parts (if the model emits extended thinking) + */ + +import { useChat } from '@ai-sdk/react'; +import { useState } from 'react'; + +type Part = { type: string; [key: string]: unknown }; + +function MessageParts({ parts }: { parts: Part[] }) { + return ( + <> + {parts.map((p, i) => { + if (p.type === 'text') { + return ( + + {p.text as string} + + ); + } + if (p.type === 'reasoning') { + return ( +
+ Reasoning +
+                {p.reasoning as string}
+              
+
+ ); + } + if (p.type === 'tool-invocation') { + const ti = p.toolInvocation as { + toolName: string; + state: string; + args?: unknown; + result?: unknown; + }; + return ( +
+ {ti.toolName} + {ti.state === 'result' ? ( + <> + ({JSON.stringify(ti.args)}) →{' '} + + {JSON.stringify(ti.result)} + + + ) : ( + (calling…) + )} +
+ ); + } + return null; + })} + + ); +} + +export default function ChatPage() { + const [input, setInput] = useState(''); + const { messages, sendMessage, status, data } = useChat({ + api: '/api/chat', + } as any); + + const isLoading = status === 'streaming' || status === 'submitted'; + + // Latest usage data from custom `data` chunks emitted by the flow. + const latestUsage = (data as unknown[]) + ?.filter( + (d): d is { type: string; value: Record } => + typeof d === 'object' && + d !== null && + (d as Record).type === 'usage' + ) + .at(-1)?.value; + + function handleSubmit(e: React.FormEvent) { + e.preventDefault(); + const text = input.trim(); + if (!text) return; + setInput(''); + void sendMessage({ text }); + } + + return ( +
+ + +

useChat demo

+

+ Backed by chatHandler + StreamChunkSchema. + Try: “What's the weather in Tokyo?” to trigger + a tool call. +

+ +
+ {messages.length === 0 && ( + + No messages yet — say something! + + )} + {messages.map((m) => ( +
+ {m.role} + + + +
+ ))} + {isLoading && ( +
+ assistant + + Thinking… + +
+ )} +
+ + {latestUsage && ( +

+ Tokens — in: {latestUsage.inputTokens ?? '?'} / out:{' '} + {latestUsage.outputTokens ?? '?'} +

+ )} + +
+ setInput(e.target.value)} + placeholder="Type a message…" + disabled={isLoading} + /> + +
+
+ ); +} diff --git a/js/testapps/vercel-ai-sdk-next/src/app/completion/page.tsx b/js/testapps/vercel-ai-sdk-next/src/app/completion/page.tsx new file mode 100644 index 0000000000..18eaf0916f --- /dev/null +++ b/js/testapps/vercel-ai-sdk-next/src/app/completion/page.tsx @@ -0,0 +1,74 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use client'; + +/** + * useCompletion demo + * + * Server: src/app/api/completion/route.ts → completionHandler(completionFlow) + * Flow: src/genkit/completion.ts → z.string() + z.string() stream + * + * useCompletion POSTs { prompt: string } to /api/completion and streams the + * response text delta-by-delta. The adapter wraps each delta in the Vercel + * AI SDK data-stream SSE format. + * + * To switch to plain-text streaming: + * 1. Add streamProtocol: 'text' to the useCompletion options below. + * 2. Add streamProtocol: 'text' to completionHandler options in route.ts. + */ + +import { useCompletion } from '@ai-sdk/react'; + +export default function CompletionPage() { + const { completion, input, handleInputChange, handleSubmit, isLoading } = + useCompletion({ api: '/api/completion' }); + + return ( +
+ + +

useCompletion demo

+

+ Backed by completionHandler + a Genkit flow with{' '} + inputSchema: z.string(). Reads the prompt{' '} + field and streams plain text deltas. +

+ +
+ + +
+ +
+ {completion || ( + Output will appear here… + )} +
+
+ ); +} diff --git a/js/testapps/vercel-ai-sdk-next/src/app/globals.css b/js/testapps/vercel-ai-sdk-next/src/app/globals.css new file mode 100644 index 0000000000..43482b591a --- /dev/null +++ b/js/testapps/vercel-ai-sdk-next/src/app/globals.css @@ -0,0 +1,201 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + background: #f8f9fa; + color: #1a1a1a; + font-family: + system-ui, + -apple-system, + sans-serif; + line-height: 1.5; +} + +a { + color: #0070f3; + text-decoration: none; +} +a:hover { + text-decoration: underline; +} + +.container { + margin: 0 auto; + max-width: 720px; + padding: 2rem 1rem; +} + +h1 { + font-size: 1.75rem; + margin-bottom: 0.5rem; +} +h2 { + color: #444; + font-size: 1.25rem; + margin-bottom: 1rem; +} +p { + color: #555; + margin-bottom: 1rem; +} + +nav { + display: flex; + gap: 1rem; + margin-bottom: 2rem; +} +nav a { + background: #0070f3; + border-radius: 6px; + color: white; + font-size: 0.9rem; + padding: 0.4rem 0.9rem; +} +nav a:hover { + background: #005bb5; + text-decoration: none; +} + +/* Chat */ +.messages { + background: white; + border: 1px solid #ddd; + border-radius: 8px; + display: flex; + flex-direction: column; + gap: 0.75rem; + margin-bottom: 1rem; + max-height: 400px; + min-height: 200px; + overflow-y: auto; + padding: 1rem; +} + +.message { + display: flex; + flex-direction: column; + gap: 0.2rem; +} +.message .role { + color: #888; + font-size: 0.75rem; + font-weight: 600; + letter-spacing: 0.05em; + text-transform: uppercase; +} +.message.user .role { + color: #0070f3; +} +.message.assistant .role { + color: #444; +} +.message .text { + white-space: pre-wrap; +} + +/* Input row */ +.input-row { + display: flex; + gap: 0.5rem; +} + +.input-row input, +.input-row textarea { + background: white; + border: 1px solid #ddd; + border-radius: 6px; + flex: 1; + font-size: 1rem; + padding: 0.6rem 0.8rem; +} + +button { + background: #0070f3; + border: none; + border-radius: 6px; + color: white; + cursor: pointer; + font-size: 1rem; + padding: 0.6rem 1.2rem; + white-space: nowrap; +} +button:hover { + background: #005bb5; +} +button:disabled { + background: #aaa; + cursor: default; +} + +/* Completion output */ +.output { + background: white; + border: 1px solid #ddd; + border-radius: 8px; + color: #333; + font-size: 0.95rem; + margin-top: 1rem; + min-height: 80px; + padding: 1rem; + white-space: pre-wrap; +} + +/* Object cards */ +.cards { + display: flex; + flex-direction: column; + gap: 0.75rem; + margin-top: 1rem; +} + +.card { + align-items: flex-start; + background: white; + border: 1px solid #ddd; + border-radius: 8px; + display: flex; + gap: 0.75rem; + padding: 1rem; +} + +.card .icon { + flex-shrink: 0; + font-size: 2rem; + line-height: 1; +} +.card .card-body { + flex: 1; +} +.card .card-title { + font-weight: 600; + margin-bottom: 0.2rem; +} +.card .card-text { + color: #555; + font-size: 0.9rem; +} + +.status { + color: #888; + font-size: 0.85rem; + margin-top: 0.5rem; +} diff --git a/js/testapps/vercel-ai-sdk-next/src/app/layout.tsx b/js/testapps/vercel-ai-sdk-next/src/app/layout.tsx new file mode 100644 index 0000000000..e462655c83 --- /dev/null +++ b/js/testapps/vercel-ai-sdk-next/src/app/layout.tsx @@ -0,0 +1,35 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { Metadata } from 'next'; +import './globals.css'; + +export const metadata: Metadata = { + title: '@genkit-ai/vercel-ai-sdk demos', + description: 'useChat, useCompletion, and useObject with Genkit flows', +}; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + {children} + + ); +} diff --git a/js/testapps/vercel-ai-sdk-next/src/app/object/page.tsx b/js/testapps/vercel-ai-sdk-next/src/app/object/page.tsx new file mode 100644 index 0000000000..de9b78a41a --- /dev/null +++ b/js/testapps/vercel-ai-sdk-next/src/app/object/page.tsx @@ -0,0 +1,101 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use client'; + +/** + * useObject demo + * + * Server: src/app/api/object/route.ts → objectHandler(notificationsFlow) + * Flow: src/genkit/object.ts → { topic } input + z.string() stream + * + * The objectHandler adapter streams raw JSON text fragments. useObject + * reassembles them incrementally using the provided Zod schema, updating + * `object` as each fragment arrives. The UI renders partial data in real time. + * + * Note: errors that happen mid-stream cannot be surfaced cleanly to the client + * because the useObject protocol uses raw text/plain with no error channel. + * Pre-stream errors (auth failures, bad input) still return a non-2xx status. + */ + +import { NotificationsSchema, type Notification } from '@/schemas'; +import { experimental_useObject as useObject } from '@ai-sdk/react'; +import { useState } from 'react'; + +export default function ObjectPage() { + const [topic, setTopic] = useState(''); + + const { object, submit, isLoading } = useObject({ + api: '/api/object', + schema: NotificationsSchema, + }); + + function handleSubmit(e: React.FormEvent) { + e.preventDefault(); + if (topic.trim()) submit({ topic: topic.trim() }); + } + + return ( +
+ + +

useObject demo

+

+ Backed by objectHandler + a Genkit flow that streams raw + JSON fragments. useObject reassembles them incrementally — + cards appear and fill in as the stream arrives. +

+ +
+ setTopic(e.target.value)} + placeholder="Notification topic (e.g. weather, fitness, news)…" + disabled={isLoading} + /> + +
+ + {object?.notifications && object.notifications.length > 0 ? ( +
+ {object.notifications.map( + (n: Partial | undefined, i: number) => ( +
+ {n?.icon ?? '🔔'} +
+
{n?.title ?? '…'}
+
{n?.body ?? ''}
+
+
+ ) + )} +
+ ) : ( + !isLoading && ( +

Enter a topic and click Generate.

+ ) + )} + + {isLoading &&

Generating notifications…

} +
+ ); +} diff --git a/js/testapps/vercel-ai-sdk-next/src/app/page.tsx b/js/testapps/vercel-ai-sdk-next/src/app/page.tsx new file mode 100644 index 0000000000..edd6434711 --- /dev/null +++ b/js/testapps/vercel-ai-sdk-next/src/app/page.tsx @@ -0,0 +1,58 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export default function Home() { + return ( +
+

@genkit-ai/vercel-ai-sdk demos

+

+ These demos show how to use Genkit flows as backends for the Vercel AI + SDK UI hooks. Each page has a live demo and links to the relevant source + files. +

+

+ Set GEMINI_API_KEY before running pnpm dev. +

+ + + +

How it works

+

+ chatHandler — wraps a Genkit flow that uses{' '} + MessagesSchema as inputSchema and{' '} + StreamChunkSchema as streamSchema. Converts + UIMessage history on every request and streams all Vercel AI SDK + data-stream event types (text, reasoning, tools, citations, step + markers, custom data). +

+

+ completionHandler — wraps a flow with{' '} + inputSchema: z.string(). Reads the prompt{' '} + field and streams plain text deltas or rich chunks. Supports both SSE + and streamProtocol: 'text' mode. +

+

+ objectHandler — wraps a flow that streams raw JSON text + fragments. useObject reassembles them into a typed partial + object in real time. +

+
+ ); +} diff --git a/js/testapps/vercel-ai-sdk-next/src/genkit/chat.ts b/js/testapps/vercel-ai-sdk-next/src/genkit/chat.ts new file mode 100644 index 0000000000..f78179c6ea --- /dev/null +++ b/js/testapps/vercel-ai-sdk-next/src/genkit/chat.ts @@ -0,0 +1,101 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + FlowOutputSchema, + MessagesSchema, + StreamChunkSchema, + toFlowOutput, + toStreamChunks, +} from '@genkit-ai/vercel-ai-sdk'; +import { z } from 'genkit'; +import { ai } from './index'; + +/** + * A toy weather tool that the model can call. The result is fed back to the + * model automatically by Genkit's multi-step generate loop, exercising the + * tool-request → tool-result path through toStreamChunks(). + */ +const getWeather = ai.defineTool( + { + name: 'getWeather', + description: 'Get the current weather conditions for a city.', + inputSchema: z.object({ city: z.string().describe('City name') }), + outputSchema: z.object({ + temperatureC: z.number(), + condition: z.string(), + }), + }, + async ({ city }) => { + // Simulated — replace with a real API call as needed. + const conditions = ['sunny', 'cloudy', 'rainy', 'windy']; + return { + temperatureC: 15 + Math.floor(Math.abs(city.charCodeAt(0)) % 20), + condition: conditions[city.charCodeAt(0) % conditions.length], + }; + } +); + +/** + * Chat flow for use with chatHandler + useChat. + * + * inputSchema: MessagesSchema — receives the full conversation history + * (already converted from UIMessage[] by chatHandler). + * streamSchema: StreamChunkSchema — drives the full useChat protocol + * (text, reasoning, tools, citations, step markers, etc.). + * outputSchema: FlowOutputSchema — populates finish event with + * finishReason and token usage. + * + * Demonstrates: + * - toStreamChunks() for text, reasoning, and tool-request/tool-result chunks + * - A custom `data` chunk carrying model metadata on every response + */ +export const chatFlow = ai.defineFlow( + { + name: 'chat', + inputSchema: MessagesSchema, + outputSchema: FlowOutputSchema, + streamSchema: StreamChunkSchema, + }, + async (input, { sendChunk }) => { + const { stream, response } = ai.generateStream({ + system: + 'You are a helpful assistant. Be concise. ' + + 'You have access to a getWeather tool — use it when weather is mentioned.', + messages: input.messages, + tools: [getWeather], + }); + + for await (const chunk of stream) { + for (const c of toStreamChunks(chunk)) { + sendChunk(c); + } + } + + const res = await response; + + // Emit a custom data chunk with usage metadata so the client can display it. + if (res.usage) { + sendChunk({ + type: 'data', + id: 'usage', + value: res.usage, + }); + } + + return toFlowOutput(res); + } +); diff --git a/js/testapps/vercel-ai-sdk-next/src/genkit/completion.ts b/js/testapps/vercel-ai-sdk-next/src/genkit/completion.ts new file mode 100644 index 0000000000..fbdb7b261c --- /dev/null +++ b/js/testapps/vercel-ai-sdk-next/src/genkit/completion.ts @@ -0,0 +1,55 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + FlowOutputSchema, + StreamChunkSchema, + toFlowOutput, + toStreamChunks, +} from '@genkit-ai/vercel-ai-sdk'; +import { z } from 'genkit'; +import { ai } from './index'; + +/** + * Completion flow for use with completionHandler + useCompletion. + * + * inputSchema: z.string() — the raw prompt string sent by useCompletion. + * streamSchema: StreamChunkSchema — typed chunks for the full SSE protocol. + * outputSchema: FlowOutputSchema — finishReason + usage for the finish event. + * + * Extra fields sent by the client via useCompletion({ body: {...} }) are + * available in the flow's context (set by completionHandler's contextProvider). + * Access them via ai.currentContext() or pass them to ai.generateStream(). + */ +export const completionFlow = ai.defineFlow( + { + name: 'completion', + inputSchema: z.string(), + outputSchema: FlowOutputSchema, + streamSchema: StreamChunkSchema, + }, + async (prompt, { sendChunk }) => { + const { stream, response } = ai.generateStream(prompt); + + for await (const chunk of stream) { + for (const sc of toStreamChunks(chunk)) { + sendChunk(sc); + } + } + + return toFlowOutput(await response); + } +); diff --git a/js/testapps/vercel-ai-sdk-next/src/genkit/index.ts b/js/testapps/vercel-ai-sdk-next/src/genkit/index.ts new file mode 100644 index 0000000000..a81d372e6c --- /dev/null +++ b/js/testapps/vercel-ai-sdk-next/src/genkit/index.ts @@ -0,0 +1,27 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { googleAI } from '@genkit-ai/google-genai'; +import { genkit } from 'genkit'; +import { disableOTelRootSpanDetection } from 'genkit/tracing'; + +// Suppress "root span" warnings in Next.js dev mode. +disableOTelRootSpanDetection(); + +export const ai = genkit({ + plugins: [googleAI()], + model: googleAI.model('gemini-flash-latest'), +}); diff --git a/js/testapps/vercel-ai-sdk-next/src/genkit/object.ts b/js/testapps/vercel-ai-sdk-next/src/genkit/object.ts new file mode 100644 index 0000000000..eea4534643 --- /dev/null +++ b/js/testapps/vercel-ai-sdk-next/src/genkit/object.ts @@ -0,0 +1,58 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { z } from 'genkit'; +import { NotificationsSchema } from '../schemas'; +import { ai } from './index'; + +export { NotificationsSchema }; + +/** + * Object flow for use with objectHandler + useObject. + * + * inputSchema: z.object({ topic: z.string() }) — the POST body from useObject. + * outputSchema: NotificationsSchema — the final structured value. + * streamSchema: z.string() — raw JSON text fragments. + * + * Each sendChunk call emits a fragment of the final JSON string. useObject + * reassembles fragments incrementally and updates the partial object in the UI. + */ +export const notificationsFlow = ai.defineFlow( + { + name: 'notifications', + inputSchema: z.object({ topic: z.string() }), + outputSchema: NotificationsSchema, + streamSchema: z.string(), + }, + async ({ topic }, { sendChunk }) => { + const { stream, response } = ai.generateStream({ + output: { schema: NotificationsSchema }, + prompt: `Generate 3 mobile app notifications about: "${topic}". +Return ONLY valid JSON (no markdown, no explanation) matching this structure: +{"notifications":[{"title":"...","body":"...","icon":""}]} +Use a single relevant emoji for the icon field.`, + }); + + for await (const chunk of stream) { + if (chunk.text) { + sendChunk(chunk.text); + } + } + + const text = (await response).text.replace(/```json\n?|\n?```/g, '').trim(); + return JSON.parse(text) as z.infer; // eslint-disable-line @typescript-eslint/no-unsafe-return + } +); diff --git a/js/testapps/vercel-ai-sdk-next/src/schemas.ts b/js/testapps/vercel-ai-sdk-next/src/schemas.ts new file mode 100644 index 0000000000..aee78450f5 --- /dev/null +++ b/js/testapps/vercel-ai-sdk-next/src/schemas.ts @@ -0,0 +1,29 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { z } from 'zod'; + +export const NotificationSchema = z.object({ + icon: z.string().optional(), + title: z.string(), + body: z.string(), +}); + +export type Notification = z.infer; + +export const NotificationsSchema = z.object({ + notifications: z.array(NotificationSchema), +}); diff --git a/js/testapps/vercel-ai-sdk-next/tsconfig.json b/js/testapps/vercel-ai-sdk-next/tsconfig.json new file mode 100644 index 0000000000..bfe360674f --- /dev/null +++ b/js/testapps/vercel-ai-sdk-next/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "es2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [{ "name": "next" }], + "baseUrl": ".", + "paths": { "@/*": ["src/*"] } + }, + "include": ["src", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/js/testapps/vercel-ai-sdk-next/tsconfig.tsbuildinfo b/js/testapps/vercel-ai-sdk-next/tsconfig.tsbuildinfo new file mode 100644 index 0000000000..54383ea1d4 --- /dev/null +++ b/js/testapps/vercel-ai-sdk-next/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.iterator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.float16.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.error.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/typealiases.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/index.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/zoderror.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseutil.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/enumutil.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorutil.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/partialutil.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/standard-schema.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/external.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/index.d.cts","./src/schemas.ts","../../node_modules/.pnpm/@types+react@19.2.7/node_modules/@types/react/global.d.ts","../../node_modules/.pnpm/csstype@3.2.3/node_modules/csstype/index.d.ts","../../node_modules/.pnpm/@types+react@19.2.7/node_modules/@types/react/index.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/styled-jsx/types/css.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/styled-jsx/types/macro.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/styled-jsx/types/style.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/styled-jsx/types/global.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/styled-jsx/types/index.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/amp.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/amp.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/get-page-files.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/compatibility/disposable.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/compatibility/indexable.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/compatibility/index.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/.pnpm/buffer@5.7.1/node_modules/buffer/index.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/header.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/readable.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/file.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/fetch.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/formdata.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/connector.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/client.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/errors.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/dispatcher.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/global-origin.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/pool-stats.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/pool.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/handlers.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/agent.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/mock-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/mock-client.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/mock-pool.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/mock-errors.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/retry-handler.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/retry-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/api.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/interceptors.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/util.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/cookies.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/patch.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/websocket.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/eventsource.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/filereader.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/content-type.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/cache.d.ts","../../../node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/index.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/globals.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/assert.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/assert/strict.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/async_hooks.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/buffer.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/child_process.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/cluster.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/console.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/constants.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/crypto.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/dgram.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/dns.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/dns/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/domain.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/dom-events.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/events.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/fs.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/fs/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/http.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/http2.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/https.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/inspector.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/module.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/net.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/os.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/path.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/process.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/punycode.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/querystring.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/readline.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/readline/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/repl.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/sea.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/sqlite.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/stream.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/stream/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/stream/web.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/string_decoder.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/test.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/timers.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/timers/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/tls.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/trace_events.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/tty.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/url.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/util.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/v8.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/vm.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/wasi.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/worker_threads.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/zlib.d.ts","../../../node_modules/.pnpm/@types+node@22.10.5/node_modules/@types/node/index.d.ts","../../node_modules/.pnpm/@types+react@19.2.7/node_modules/@types/react/canary.d.ts","../../node_modules/.pnpm/@types+react@19.2.7/node_modules/@types/react/experimental.d.ts","../../node_modules/.pnpm/@types+react-dom@19.2.3_@types+react@19.2.7/node_modules/@types/react-dom/index.d.ts","../../node_modules/.pnpm/@types+react-dom@19.2.3_@types+react@19.2.7/node_modules/@types/react-dom/canary.d.ts","../../node_modules/.pnpm/@types+react-dom@19.2.3_@types+react@19.2.7/node_modules/@types/react-dom/experimental.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/lib/fallback.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/compiled/webpack/webpack.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/config.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/lib/load-custom-routes.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/image-config.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/body-streams.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/lib/cache-control.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/lib/setup-exception-listeners.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/lib/worker.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/lib/constants.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/app-router-headers.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/rendering-mode.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/lib/router-utils/build-prefetch-segment-data-route.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/require-hook.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/lib/experimental/ppr.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/webpack/plugins/app-build-manifest-plugin.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/lib/page-types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/segment-config/app/app-segment-config.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/segment-config/pages/pages-segment-config.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/analysis/get-page-static-info.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/node-polyfill-crypto.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/node-environment-baseline.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/node-environment-extensions/error-inspect.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/node-environment-extensions/random.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/node-environment-extensions/date.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/node-environment-extensions/web-crypto.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/node-environment-extensions/node-crypto.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/node-environment.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/page-extensions-type.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/instrumentation/types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/lib/coalesced-function.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/lib/router-utils/types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/constants.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/trace/types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/trace/trace.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/trace/shared.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/trace/index.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/load-jsconfig.d.ts","../../node_modules/.pnpm/@next+env@15.5.14/node_modules/@next/env/dist/index.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/webpack/plugins/telemetry-plugin/use-cache-tracker-utils.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/webpack/plugins/telemetry-plugin/telemetry-plugin.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/telemetry/storage.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/build-context.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/bloom-filter.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/webpack-config.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-kind.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-definitions/route-definition.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/swc/generated-native.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/swc/types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/dev/parse-version-info.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/next-devtools/shared/types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/dev/dev-indicator-server-state.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/lib/parse-stack.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/next-devtools/server/shared.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/next-devtools/shared/stack-frame.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/next-devtools/dev-overlay/utils/get-error-by-type.d.ts","../../node_modules/.pnpm/@types+react@19.2.7/node_modules/@types/react/jsx-runtime.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/next-devtools/dev-overlay/container/runtime-error/render-error.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/next-devtools/dev-overlay/shared.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/dev/hot-reloader-types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/lib/cache-handlers/types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/response-cache/types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/resume-data-cache/cache-store.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/resume-data-cache/resume-data-cache.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/render-result.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/lib/i18n-provider.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/web/next-url.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/web/spec-extension/cookies.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/web/spec-extension/request.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/after/builtin-request-context.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/web/spec-extension/response.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/segment-config/middleware/middleware-config.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/web/types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/base-http/node.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-definitions/locale-route-definition.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-definitions/pages-route-definition.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/mitt.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/with-router.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/router.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/route-loader.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/page-loader.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/router/router.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-definitions/app-page-route-definition.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/webpack/loaders/next-app-loader/index.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/lib/app-dir-module.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/app-render/cache-signal.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/app-render/dynamic-rendering.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/request/fallback-params.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/app-render/work-unit-async-storage-instance.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/response-cache/index.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/lib/lazy-result.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/lib/implicit-tags.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/app-render/work-unit-async-storage.external.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/deep-readonly.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/router/utils/parse-relative-url.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/app-render/app-render.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/amp-context.shared-runtime.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/entrypoints.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-modules/app-page/module.compiled.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/error-boundary.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/layout-router.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/render-from-template-context.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/app-render/action-async-storage-instance.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/app-render/action-async-storage.external.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/client-page.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/client-segment.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/request/search-params.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/hooks-server-context.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/http-access-fallback/error-boundary.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/lib/metadata/types/extra-types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/lib/metadata/types/resolvers.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/lib/metadata/types/icons.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/lib/metadata/resolve-metadata.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/lib/metadata/metadata.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/lib/framework/boundary-components.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/app-render/rsc/preloads.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/app-render/rsc/postpone.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/app-render/rsc/taint.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/segment-cache/segment-value-encoding.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/app-render/collect-segment-data.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/next-devtools/userspace/app/segment-explorer-node.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/app-render/entry-base.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/templates/app-page.d.ts","../../node_modules/.pnpm/@types+react@19.2.7/node_modules/@types/react/jsx-dev-runtime.d.ts","../../node_modules/.pnpm/@types+react@19.2.7/node_modules/@types/react/compiler-runtime.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/entrypoints.d.ts","../../node_modules/.pnpm/@types+react-dom@19.2.3_@types+react@19.2.7/node_modules/@types/react-dom/client.d.ts","../../node_modules/.pnpm/@types+react-dom@19.2.3_@types+react@19.2.7/node_modules/@types/react-dom/static.d.ts","../../node_modules/.pnpm/@types+react-dom@19.2.3_@types+react@19.2.7/node_modules/@types/react-dom/server.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/entrypoints.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-modules/app-page/module.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/web/adapter.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/use-cache/cache-life.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/app-render/types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/flight-data-helpers.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-modules/pages/vendored/contexts/entrypoints.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-modules/pages/module.compiled.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/templates/pages.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-modules/pages/module.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/next-devtools/userspace/pages/pages-dev-overlay-setup.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/render.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-definitions/pages-api-route-definition.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-matches/pages-api-route-match.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-matchers/route-matcher.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-matcher-providers/route-matcher-provider.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-matcher-managers/route-matcher-manager.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/normalizers/normalizer.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/normalizers/locale-route-normalizer.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/normalizers/request/pathname-normalizer.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/normalizers/request/suffix.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/normalizers/request/rsc.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/normalizers/request/prefetch-rsc.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/normalizers/request/next-data.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/normalizers/request/segment-prefix-rsc.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/static-paths/types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/base-server.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/lib/async-callback-set.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","../../node_modules/.pnpm/sharp@0.34.5/node_modules/sharp/lib/index.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/image-optimizer.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/next-server.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/lib/types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/lib/lru-cache.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/lib/dev-bundler-service.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/dev/static-paths-worker.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/dev/next-dev-server.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/next.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/lib/render-server.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/lib/router-server.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/router/utils/path-match.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/lib/router-utils/filesystem.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/lib/router-utils/router-server-context.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-modules/route-module.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/load-components.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-definitions/app-route-route-definition.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/async-storage/work-store.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/web/http.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-modules/app-route/shared-modules.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/redirect-status-code.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/redirect-error.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/templates/app-route.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-modules/app-route/module.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-modules/app-route/module.compiled.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/segment-config/app/app-segments.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/utils.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/turborepo-access-trace/types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/turborepo-access-trace/result.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/turborepo-access-trace/helpers.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/turborepo-access-trace/index.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/export/routes/types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/export/types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/export/worker.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/worker.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/build/index.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/lib/incremental-cache/index.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/after/after.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/after/after-context.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/app-render/work-async-storage-instance.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/app-render/work-async-storage.external.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/request/params.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/route-matches/route-match.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/request-meta.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/cli/next-test.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/config-shared.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/base-http/index.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/api-utils/index.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/utils.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/pages/_app.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/app.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/web/spec-extension/revalidate.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/use-cache/cache-tag.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/cache.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/runtime-config.external.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/config.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/pages/_document.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/document.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/dynamic.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dynamic.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/pages/_error.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/error.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/head.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/head.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/request/cookies.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/request/headers.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/request/draft-mode.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/headers.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/get-img-props.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/image-component.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/shared/lib/image-external.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/image.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/link.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/link.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/redirect.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/not-found.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/forbidden.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/unauthorized.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/unstable-rethrow.server.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/unstable-rethrow.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/navigation.react-server.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/unrecognized-action-error.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/navigation.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/navigation.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/router.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/script.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/script.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/web/spec-extension/image-response.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/compiled/@vercel/og/emoji/index.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/compiled/@vercel/og/types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/after/index.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/request/root-params.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/server/request/connection.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/server.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/types/global.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/types/compiled.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/types.d.ts","../../node_modules/.pnpm/next@15.5.14_@babel+core@7.29.0_@opentelemetry+api@1.9.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/index.d.ts","./src/app/layout.tsx","./src/app/page.tsx","../../node_modules/.pnpm/@types+json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts","../../core/lib/context.d.ts","../../core/lib/statustypes.d.ts","../../node_modules/.pnpm/dotprompt@1.1.2/node_modules/dotprompt/dist/index.d.ts","../../node_modules/.pnpm/fast-uri@3.1.0/node_modules/fast-uri/types/index.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/compile/codegen/code.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/compile/codegen/scope.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/compile/codegen/index.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/compile/rules.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/compile/util.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/compile/validate/subschema.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/compile/errors.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/compile/validate/index.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/compile/validate/datatype.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/applicator/additionalitems.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/applicator/items2020.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/applicator/contains.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/applicator/dependencies.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/applicator/propertynames.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/applicator/additionalproperties.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/applicator/not.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/applicator/anyof.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/applicator/oneof.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/applicator/if.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/applicator/index.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/validation/limitnumber.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/validation/multipleof.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/validation/pattern.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/validation/required.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/validation/uniqueitems.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/validation/const.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/validation/enum.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/validation/index.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/format/format.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedproperties.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/unevaluated/unevaluateditems.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/validation/dependentrequired.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/discriminator/types.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/discriminator/index.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/vocabularies/errors.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/types/json-schema.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/types/jtd-schema.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/runtime/validation_error.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/compile/ref_error.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/core.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/compile/resolve.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/compile/index.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/types/index.d.ts","../../node_modules/.pnpm/ajv@8.18.0/node_modules/ajv/dist/ajv.d.ts","../../core/lib/action-d_u595hv.d.ts","../../core/lib/async-context.d.ts","../../core/lib/config.d.ts","../../core/lib/dynamic-action-provider.d.ts","../../core/lib/flow.d.ts","../../core/lib/reflection.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/internal/symbol.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/types.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/utils.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/common/exception.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/common/time.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/common/attributes.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/context/types.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/context/context.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/context.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/diag/types.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/diag/consolelogger.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/diag.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/observableresult.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/metric.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/meter.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/noopmeter.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/meterprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/metrics.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/propagation/textmappropagator.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/context-helpers.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/propagation.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/attributes.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/trace_state.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/span_context.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/link.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/status.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/span.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/span_kind.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/spanoptions.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/tracer.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/tracer_options.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/proxytracer.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/tracer_provider.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/proxytracerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/samplingresult.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/sampler.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/trace_flags.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/internal/utils.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/spancontext-utils.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/invalid-span-constants.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/context-utils.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/trace.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/context-api.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/diag-api.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics-api.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/propagation-api.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace-api.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/baggage/propagation/w3cbaggagepropagator.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/anchored-clock.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/attributes.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/types.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/global-error-handler.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/logging-error-handler.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/time.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/hex-to-binary.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/exportresult.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/baggage/utils.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/environment.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/environment.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/globalthis.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/hex-to-base64.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/idgenerator.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/randomidgenerator.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/performance.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/sdk-info.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/timer-util.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/propagation/composite.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/w3ctracecontextpropagator.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/rpc-metadata.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/sampler/alwaysoffsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/sampler/alwaysonsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/sampler/parentbasedsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/sampler/traceidratiobasedsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/suppress-tracing.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/tracestate.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/merge.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/sampling.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/timeout.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/url.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/wrap.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/callback.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/version.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/internal/exporter.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/config.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/iresource.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/types.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/resource.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/platform/node/default-service-name.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/hostdetector.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/hostdetectorsync.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/osdetector.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/osdetectorsync.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/processdetector.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/processdetectorsync.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/serviceinstanceiddetectorsync.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/browserdetector.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/envdetector.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/browserdetectorsync.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/envdetectorsync.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/index.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detect-resources.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/types.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/types/anyvalue.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/types/logrecord.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/types/logger.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/types/loggeroptions.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/types/loggerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/nooplogger.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/nooploggerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/api/logs.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/readablelogrecord.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/internal/loggerprovidersharedstate.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/logrecord.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/logrecordprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/loggerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/nooplogrecordprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/logrecordexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/consolelogrecordexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/simplelogrecordprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/inmemorylogrecordexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/batchlogrecordprocessorbase.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/platform/node/export/batchlogrecordprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/attributesprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/predicate.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/instrumentselector.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/meterselector.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/aggregationtemporality.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/utils.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/types.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/drop.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/histogram.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/exponential-histogram/buckets.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/exponential-histogram/mapping/types.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/exponentialhistogram.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/lastvalue.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/sum.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/aggregation.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/view.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/instrumentdescriptor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/metricdata.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/aggregationselector.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/metricexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/metricproducer.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/types.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/metricreader.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/periodicexportingmetricreader.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/inmemorymetricexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/consolemetricexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/meterprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/idgenerator.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/types.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/timedevent.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/readablespan.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/spanexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/basictracerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/span.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/spanprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/tracer.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/batchspanprocessorbase.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/node/export/batchspanprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/node/randomidgenerator.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/consolespanexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/inmemoryspanexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/simplespanprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/noopspanprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/alwaysoffsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/alwaysonsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/parentbasedsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/traceidratiobasedsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-node@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-node/build/src/config.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-node@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-node/build/src/nodetracerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-node@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-node/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/types.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/types_internal.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/autoloader.d.ts","../../node_modules/.pnpm/@types+shimmer@1.2.0/node_modules/@types/shimmer/index.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/instrumentation.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/platform/node/instrumentation.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/platform/node/normalize.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/instrumentationnodemoduledefinition.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/instrumentationnodemodulefile.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/utils.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-node@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-node/build/src/types.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-node@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-node/build/src/sdk.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-node@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-node/build/src/index.d.ts","../../core/lib/telemetrytypes.d.ts","../../core/lib/utils.d.ts","../../core/lib/index.d.ts","../../core/lib/async.d.mts","../../core/lib/registry.d.ts","../../ai/lib/cancel-operation.d.ts","../../ai/lib/check-operation.d.ts","../../ai/lib/parts.d.ts","../../ai/lib/document-dp4nthdu.d.ts","../../ai/lib/evaluator.d.ts","../../ai/lib/model-types.d.ts","../../ai/lib/generate/chunk.d.ts","../../ai/lib/message.d.ts","../../ai/lib/generate/response.d.ts","../../ai/lib/formats/types.d.ts","../../ai/lib/model-dlmvirep.d.ts","../../ai/lib/resource.d.ts","../../node_modules/.pnpm/handlebars@4.7.8/node_modules/handlebars/types/index.d.ts","../../ai/lib/generate-qnflwbr2.d.ts","../../ai/lib/reranker.d.ts","../../ai/lib/retriever.d.ts","../../ai/lib/types.d.ts","../../ai/lib/index.d.ts","../../ai/lib/session.d.ts","../../ai/lib/chat.d.ts","../../ai/lib/tool.d.ts","../../ai/lib/formats/index.d.ts","../../ai/lib/embedder.d.ts","../../ai/lib/model.d.ts","../../genkit/lib/index-drglt3_c.d.ts","../../genkit/lib/genkit-beta.d.ts","../../genkit/lib/beta.d.ts","../../genkit/lib/context.d.ts","../../plugins/vercel-ai-sdk/lib/schema.d.ts","../../plugins/vercel-ai-sdk/lib/chat.d.ts","../../plugins/vercel-ai-sdk/lib/completion.d.ts","../../genkit/lib/index.d.ts","../../plugins/vercel-ai-sdk/lib/convert.d.ts","../../plugins/vercel-ai-sdk/lib/generate.d.ts","../../plugins/vercel-ai-sdk/lib/object.d.ts","../../node_modules/.pnpm/@ai-sdk+provider@3.0.8/node_modules/@ai-sdk/provider/dist/index.d.ts","../../node_modules/.pnpm/@standard-schema+spec@1.1.0/node_modules/@standard-schema/spec/dist/index.d.ts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/standard-schema.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/util.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/versions.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/schemas.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/checks.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/errors.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/core.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/parse.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/regexes.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ar.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/az.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/be.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ca.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/cs.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/de.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/en.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/eo.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/es.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/fa.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/fi.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/fr.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/fr-ca.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/he.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/hu.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/id.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/it.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ja.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/kh.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ko.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/mk.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ms.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/nl.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/no.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ota.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ps.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/pl.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/pt.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ru.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/sl.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/sv.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ta.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/th.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/tr.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ua.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ur.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/vi.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/zh-cn.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/zh-tw.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/index.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/registries.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/doc.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/function.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/api.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/json-schema.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/to-json-schema.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/index.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/errors.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/parse.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/schemas.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/checks.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/compat.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/iso.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/coerce.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/external.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/index.d.cts","../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/index.d.cts","../../node_modules/.pnpm/eventsource-parser@3.0.6/node_modules/eventsource-parser/dist/stream.d.ts","../../node_modules/.pnpm/@ai-sdk+provider-utils@4.0.23_zod@3.25.76/node_modules/@ai-sdk/provider-utils/dist/index.d.ts","../../node_modules/.pnpm/@ai-sdk+gateway@3.0.95_zod@3.25.76/node_modules/@ai-sdk/gateway/dist/index.d.ts","../../node_modules/.pnpm/ai@6.0.156_zod@3.25.76/node_modules/ai/dist/index.d.ts","../../plugins/vercel-ai-sdk/lib/index.d.ts","../../genkit/lib/plugin.d.ts","../../plugins/google-genai/lib/common/types.d.ts","../../plugins/google-genai/lib/common/interaction-types.d.ts","../../plugins/google-genai/lib/googleai/types.d.ts","../../genkit/lib/model.d.ts","../../plugins/google-genai/lib/googleai/deep-research.d.ts","../../plugins/google-genai/lib/googleai/embedder.d.ts","../../plugins/google-genai/lib/googleai/gemini.d.ts","../../plugins/google-genai/lib/googleai/imagen.d.ts","../../plugins/google-genai/lib/googleai/lyria.d.ts","../../plugins/google-genai/lib/googleai/veo.d.ts","../../plugins/google-genai/lib/googleai/index.d.ts","../../genkit/lib/embedder.d.ts","../../node_modules/.pnpm/gaxios@6.7.1_encoding@0.1.13/node_modules/gaxios/build/src/common.d.ts","../../node_modules/.pnpm/gaxios@6.7.1_encoding@0.1.13/node_modules/gaxios/build/src/interceptor.d.ts","../../node_modules/.pnpm/gaxios@6.7.1_encoding@0.1.13/node_modules/gaxios/build/src/gaxios.d.ts","../../node_modules/.pnpm/gaxios@6.7.1_encoding@0.1.13/node_modules/gaxios/build/src/index.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/transporters.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/credentials.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/crypto/crypto.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/util.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/authclient.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/loginticket.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/oauth2client.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/idtokenclient.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/envdetect.d.ts","../../node_modules/.pnpm/gtoken@7.1.0_encoding@0.1.13/node_modules/gtoken/build/src/index.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/jwtclient.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/refreshclient.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/impersonated.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/baseexternalclient.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/identitypoolclient.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/awsrequestsigner.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/awsclient.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/pluggable-auth-client.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/externalclient.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/externalaccountauthorizeduserclient.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/googleauth.d.ts","../../node_modules/.pnpm/gcp-metadata@6.1.1_encoding@0.1.13/node_modules/gcp-metadata/build/src/gcp-residency.d.ts","../../node_modules/.pnpm/gcp-metadata@6.1.1_encoding@0.1.13/node_modules/gcp-metadata/build/src/index.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/computeclient.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/iam.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/jwtaccess.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/downscopedclient.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/passthrough.d.ts","../../node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/index.d.ts","../../plugins/google-genai/lib/vertexai/types.d.ts","../../plugins/google-genai/lib/vertexai/embedder.d.ts","../../plugins/google-genai/lib/vertexai/gemini.d.ts","../../plugins/google-genai/lib/vertexai/imagen.d.ts","../../plugins/google-genai/lib/vertexai/lyria.d.ts","../../plugins/google-genai/lib/vertexai/veo.d.ts","../../plugins/google-genai/lib/vertexai/index.d.ts","../../plugins/google-genai/lib/index.d.ts","../../core/lib/tracing/exporter.d.ts","../../core/lib/tracing/types.d.ts","../../core/lib/tracing/instrumentation.d.ts","../../core/lib/tracing.d.ts","../../genkit/lib/tracing.d.ts","./src/genkit/index.ts","./src/genkit/chat.ts","./src/app/api/chat/route.ts","./src/genkit/completion.ts","./src/app/api/completion/route.ts","./src/genkit/object.ts","./src/app/api/object/route.ts","../../node_modules/.pnpm/@ai-sdk+react@3.0.158_react@19.2.4_zod@3.25.76/node_modules/@ai-sdk/react/dist/index.d.ts","./src/app/chat/page.tsx","./src/app/completion/page.tsx","./src/app/object/page.tsx","./.next/types/cache-life.d.ts","./.next/types/routes.d.ts","./.next/types/validator.ts","./.next/types/app/layout.ts","./.next/types/app/api/completion/route.ts","./.next/types/app/api/object/route.ts","./.next/types/app/completion/page.ts","./.next/types/app/object/page.ts"],"fileIdsList":[[114,157,775,777],[114,157,775,777,780,781,783,784,785,786,787,788,789,790,791,796],[114,157,775,777,780],[114,157,775,777,780,781],[114,157,775,777,780,781,783,784,785,786,787,788,789,790,791],[114,157,775,780,783,784,785],[114,157,775,777,780,781,783,784,786,788,789,790],[114,157,775,780,783],[114,157,775,780,783,785],[114,157,775,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794],[114,157,775,777,780,781,783,784,787],[114,157,775,780],[114,157,775,777,780,781,783,784,785,787,788],[114,157,775],[96,114,157,511,512,513,514,559],[114,157],[96,114,157,511,512,513,514,559,560],[96,114,157,511,512,513,514,559,560,561,562,563,564,565,772,773,774],[96,114,157],[114,157,772],[96,114,157,511,512,513,514,559,560,613,652,753,772,773,940,941,942],[114,157,652,753],[96,114,157,511,512,513,514,559,560,613,941],[114,157,775,776,777,782,792,793,795,796,797,798,799,800,801,802,803],[114,157,800],[114,157,775,776,777,782,792,793,795,796,797,798,799,800,801,802],[114,157,775,777,782,792,793,795,796,797,798,800,801],[114,157,775,777,782,792,793,795,796,797,798,800,801,802],[114,157,801],[114,157,943],[114,157,813,882],[85,114,157,813,814,880,881],[114,157,511],[114,157,882,884],[114,157,679,680,681],[114,157,677,678,679,680,681,682,683,684],[114,157,678,679],[114,157,613],[114,157,678],[114,157,679,680],[114,157,613,677],[114,157,572],[114,157,575],[114,157,580,582],[114,157,568,572,584,585],[114,157,595,598,604,606],[114,157,567,572],[114,157,566],[114,157,567],[114,157,574],[114,157,577],[114,157,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,607,608,609,610,611,612],[114,157,583],[114,157,579],[114,157,580],[114,157,571,572,578],[114,157,579,580],[114,157,586],[114,157,607],[114,157,571],[114,157,572,589,592],[114,157,588],[114,157,589],[114,157,587,589],[114,157,572,592,594,595,596],[114,157,595,596,598],[114,157,572,587,590,593,600],[114,157,587,588],[114,157,569,570,587,589,590,591],[114,157,589,592],[114,157,570,587,590,593],[114,157,572,592,594],[114,157,595,596],[114,157,613,617],[114,157,617],[114,157,614,615,616,617,618,619,620,621,622,623,624,628,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651],[114,157,622],[114,157,633],[114,157,624],[114,157,625,626,627,629,630,631,632],[114,157,180,207],[114,157,628],[114,157,207],[114,157,758],[114,157,757,758,759,765,766,767,768],[114,157,613,685,757],[114,157,757],[114,157,764],[114,157,762,763],[114,157,757,760,761],[114,157,179],[114,157,613,685],[114,157,655],[114,157,653,654],[114,157,653,654,655],[114,157,668,669,670,671,672],[114,157,667],[114,157,653,655,656],[114,157,660,661,662,663,664,665,666],[114,157,653,654,655,656,659,673,674],[114,157,658],[114,157,657],[114,157,654,655],[114,157,613,653,654],[114,157,676,688,689,692],[114,157,652,686,692],[114,157,652,686],[114,157,613,686,689],[114,157,613,652,675,685],[114,157,688,689,692],[114,157,676,686,688,689,690,691,692,693,694,695,699],[114,157,675,676,685,689],[114,157,676,685,689],[114,157,613,652,675,685,686,687],[114,157,613,688],[114,157,698],[114,157,676,696],[114,157,697],[114,157,675],[114,157,613,705,706,707,719],[114,157,613,705,706,707,710,711,719],[114,157,707,708,709,712,713,714],[114,157,613,705,706,719],[114,157,705,716,718],[114,157,652,705,718,719,720,721],[114,157,652,705,718,719,721],[114,157,613,652,675,705,707,718],[114,157,652,705,716,718,719],[114,157,719],[114,157,705,716,718,719,720,722,723],[114,157,721,722,724],[114,157,705,706,707,716,717,718,719,720,721,722,724,725,726,727,728],[114,157,613,717],[114,157,613,675,717,723,724],[114,157,613,652],[114,157,706,707,715,718],[114,157,702,718],[114,157,702],[114,157,701,703,704,716,718],[114,157,613,652,675,700,729,753,756,770,771],[114,157,700,729,770],[114,157,613,675,700,729,753,769],[114,157,613,675,732,735,753],[114,157,613,732,734,735,737,738],[114,157,652,734,735],[114,157,613,734,737,738],[114,157,613,652,675,733],[114,157,613,734,735,737,738],[114,157,652,734],[114,157,730,731,732,733,734,735,736,737,738,739,744,745,746,747,748,749,750,751,752],[114,157,743],[114,157,732,740],[114,157,741,742],[114,157,730],[114,157,731],[114,157,613,731],[114,157,613,652,675,733,734,739],[114,157,613,734,737],[114,157,613,652,675,732,736,738],[114,157,613,675,730,731],[114,157,753],[114,157,753,754,755],[114,157,753,754],[100,104,114,157,208,209,210,212,452,500],[100,114,157],[100,104,114,157,208,209,210,211,367,452,500],[100,104,114,157,208,209,211,212,452,500],[100,114,157,212,367,368],[100,114,157,212,367],[100,104,114,157,209,210,211,212,452,500],[100,104,114,157,208,210,211,212,452,500],[98,99,114,157],[114,157,172,613,813,880,882,883],[114,157,518,519,523,550,551,553,554,555,557,558],[114,157,516,517],[114,157,516],[114,157,518,558],[114,157,518,519,555,556,558],[114,157,558],[114,157,515,558,559],[114,157,518,519,557,558],[114,157,518,519,521,522,557,558],[114,157,518,519,520,557,558],[114,157,518,519,523,550,551,552,553,554,557,558],[114,157,515,518,519,523,555,557],[114,157,523,558],[114,157,525,526,527,528,529,530,531,532,533,534,558],[114,157,548,558],[114,157,524,535,543,544,545,546,547,549],[114,157,528,558],[114,157,536,537,538,539,540,541,542,558],[114,157,172,189,200],[114,157,172,200,899,900],[114,157,899,900,901],[114,157,899],[114,157,172,924],[114,157,169,902,903,904,906,909],[114,157,906,907,916,918],[114,157,902],[114,157,902,903,904,906,907,909],[114,157,902,909],[114,157,902,903,904,907,909],[114,157,902,903,904,907,909,916],[114,157,907,916,917,919,920],[114,157,189,902,903,904,907,909,910,911,913,914,915,916,921,922,931],[114,157,906,907,916],[114,157,909],[114,157,907,909,910,923],[114,157,189,904,909],[114,157,189,904,909,910,912],[114,157,183,902,903,904,905,907,908],[114,157,902,907,909],[114,157,907,916],[114,157,902,903,904,907,908,909,910,911,913,914,915,916,917,918,919,920,921,923,925,926,927,928,929,930,931],[106,114,157],[114,157,455],[114,157,457,458,459,460],[114,157,462],[114,157,216,230,231,232,234,449],[114,157,216,255,257,259,260,263,449,451],[114,157,216,220,222,223,224,225,226,438,449,451],[114,157,449],[114,157,231,333,419,428,445],[114,157,216],[114,157,213,445],[114,157,267],[114,157,266,449,451],[114,157,172,315,333,362,506],[114,157,172,326,342,428,444],[114,157,172,380],[114,157,432],[114,157,431,432,433],[114,157,431],[108,114,157,172,213,216,220,223,227,228,229,231,235,243,244,373,398,429,449,452],[114,157,216,233,251,255,256,261,262,449,506],[114,157,233,506],[114,157,244,251,313,449,506],[114,157,506],[114,157,216,233,234,506],[114,157,258,506],[114,157,227,430,437],[114,157,183,275,445],[114,157,275,445],[100,114,157,275],[100,114,157,334],[114,157,330,378,445,488,489],[114,157,425,482,483,484,485,487],[114,157,424],[114,157,424,425],[114,157,224,374,375,376],[114,157,374,377,378],[114,157,486],[114,157,374,378],[100,114,157,217,476],[100,114,157,200],[100,114,157,233,303],[100,114,157,233],[114,157,301,305],[100,114,157,302,454],[100,104,114,157,172,207,208,209,210,211,212,452,498,499],[114,157,172],[114,157,172,220,282,374,384,399,419,434,435,449,450,506],[114,157,243,436],[114,157,452],[114,157,215],[100,114,157,315,329,341,351,353,444],[114,157,183,315,329,350,351,352,444,505],[114,157,344,345,346,347,348,349],[114,157,346],[114,157,350],[114,157,273,274,275,277],[100,114,157,268,269,270,276],[114,157,273,276],[114,157,271],[114,157,272],[100,114,157,275,302,454],[100,114,157,275,453,454],[100,114,157,275,454],[114,157,399,441],[114,157,441],[114,157,172,450,454],[114,157,338],[114,156,157,337],[114,157,245,283,321,323,325,326,327,328,371,374,444,447,450],[114,157,245,359,374,378],[114,157,326,444],[100,114,157,326,335,336,338,339,340,341,342,343,354,355,356,357,358,360,361,444,445,506],[114,157,320],[114,157,172,183,245,246,282,297,327,371,372,373,378,399,419,440,449,450,451,452,506],[114,157,444],[114,156,157,231,324,327,373,440,442,443,450],[114,157,326],[114,156,157,282,287,316,317,318,319,320,321,322,323,325,444,445],[114,157,172,287,288,316,450,451],[114,157,231,373,374,399,440,444,450],[114,157,172,449,451],[114,157,172,189,447,450,451],[114,157,172,183,200,213,220,233,245,246,248,283,284,289,294,297,323,327,374,384,386,389,391,394,395,396,397,398,419,439,440,445,447,449,450,451],[114,157,172,189],[114,157,216,217,218,220,225,228,233,251,439,447,448,452,454,506],[114,157,172,189,200,263,265,267,268,269,270,277,506],[114,157,183,200,213,255,265,293,294,295,296,323,374,389,398,399,405,408,409,419,440,445,447],[114,157,227,228,243,373,398,440,449],[114,157,172,200,217,220,323,403,447,449],[114,157,314],[114,157,172,406,407,416],[114,157,447,449],[114,157,321,324],[114,157,323,327,439,454],[114,157,172,183,249,255,296,389,399,405,408,411,447],[114,157,172,227,243,255,412],[114,157,216,248,414,439,449],[114,157,172,200,449],[114,157,172,233,247,248,249,260,278,413,415,439,449],[108,114,157,245,327,418,452,454],[114,157,172,183,200,220,227,235,243,246,283,289,293,294,295,296,297,323,374,386,399,400,402,404,419,439,440,445,446,447,454],[114,157,172,189,227,405,410,416,447],[114,157,238,239,240,241,242],[114,157,284,390],[114,157,392],[114,157,390],[114,157,392,393],[114,157,172,220,223,224,282,450],[114,157,172,183,215,217,245,283,297,327,382,383,419,447,451,452,454],[114,157,172,183,200,219,224,323,383,446,450],[114,157,316],[114,157,317],[114,157,318],[114,157,445],[114,157,264,280],[114,157,172,220,264,283],[114,157,279,280],[114,157,281],[114,157,264,265],[114,157,264,298],[114,157,264],[114,157,284,388,446],[114,157,387],[114,157,265,445,446],[114,157,385,446],[114,157,265,445],[114,157,371],[114,157,220,225,283,312,315,321,323,327,329,332,363,366,370,374,418,439,447,450],[114,157,306,309,310,311,330,331,378],[100,114,157,210,212,275,364,365],[100,114,157,210,212,275,364,365,369],[114,157,427],[114,157,231,288,326,327,338,342,374,418,420,421,422,423,425,426,429,439,444,449],[114,157,378],[114,157,382],[114,157,172,283,299,379,381,384,418,447,452,454],[114,157,306,307,308,309,310,311,330,331,378,453],[108,114,157,172,183,200,246,264,265,297,323,327,416,417,419,439,440,449,450,452],[114,157,288,290,293,440],[114,157,172,284,449],[114,157,287,326],[114,157,286],[114,157,288,289],[114,157,285,287,449],[114,157,172,219,288,290,291,292,449,450],[100,114,157,374,375,377],[114,157,250],[100,114,157,217],[100,114,157,445],[100,108,114,157,297,327,452,454],[114,157,217,476,477],[100,114,157,305],[100,114,157,183,200,215,262,300,302,304,454],[114,157,233,445,450],[114,157,183],[114,157,401,445],[114,157,374],[100,114,157,170,172,183,215,251,257,305,452,453],[100,114,157,208,209,210,211,212,452,500],[100,101,102,103,104,114,157],[114,157,162],[114,157,252,253,254],[114,157,252],[100,104,114,157,172,174,183,207,208,209,210,211,212,213,215,246,350,411,449,451,454,500],[114,157,464],[114,157,466],[114,157,468],[114,157,470],[114,157,472,473,474],[114,157,478],[105,107,114,157,456,461,463,465,467,469,471,475,479,481,491,492,494,504,505,506,507],[114,157,480],[114,157,490],[114,157,302],[114,157,493],[114,156,157,288,290,291,293,341,445,495,496,497,500,501,502,503],[114,157,189,207],[95,114,157],[86,87,114,157],[83,84,86,88,89,94,114,157],[84,86,114,157],[94,114,157],[86,114,157],[83,84,86,89,90,91,92,93,114,157],[83,84,85,114,157],[114,157,870],[114,157,870,873],[114,157,863,870,871,872,873,874,875,876,877],[114,157,878],[114,157,870,871],[114,157,870,872],[114,157,816,818,819,820,821],[114,157,816,818,820,821],[114,157,816,818,820],[114,157,816,818,819,821],[114,157,816,818,821],[114,157,816,817,818,819,820,821,822,823,863,864,865,866,867,868,869],[114,157,818,821],[114,157,815,816,817,819,820,821],[114,157,818,864,868],[114,157,818,819,820,821],[114,157,879],[114,157,820],[114,157,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862],[114,157,809,887],[114,157,809],[114,157,809,887,888,889,890],[114,157,809,887,888,889],[114,157,809,886,887,888,889,890,891,892,893,894,895,896],[114,157,809,887,888],[114,157,809,886,887,888,889,890,891,892,893,894,895,896,897,898,931,932,933,934,935,936,937,938],[114,157,809,887,898,931,932],[114,157,809,887,890,931,932],[114,157,809,886,887,890,898,931,932,933,934,935,936,937],[114,157,809,887,931],[114,157,804,805,806],[114,157,804,805],[114,157,804,806,809],[114,157,804,805,806,807,808,809,810,811,812,884],[114,157,804],[114,157,504,949],[114,157,504,951],[114,157,350,954],[114,157,350,509],[114,157,350,955],[114,157,504,507,509,510,947,949,951,953,954,955,957],[114,157,885,946],[114,157,885,948],[114,157,885,950],[100,114,157,952],[114,157,952],[114,157,508],[97,100,114,157,952],[114,157,809,885,945],[114,157,809,939,944],[97,114,157,809,945],[114,154,157],[114,156,157],[157],[114,157,162,192],[114,157,158,163,169,170,177,189,200],[114,157,158,159,169,177],[109,110,111,114,157],[114,157,160,201],[114,157,161,162,170,178],[114,157,162,189,197],[114,157,163,165,169,177],[114,156,157,164],[114,157,165,166],[114,157,169],[114,157,167,169],[114,156,157,169],[114,157,169,170,171,189,200],[114,157,169,170,171,184,189,192],[114,152,157,205],[114,152,157,165,169,172,177,189,200],[114,157,169,170,172,173,177,189,197,200],[114,157,172,174,189,197,200],[112,113,114,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206],[114,157,169,175],[114,157,176,200,205],[114,157,165,169,177,189],[114,157,178],[114,156,157,180],[114,154,155,156,157,158,159,160,161,162,163,164,165,166,167,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206],[114,157,182],[114,157,169,184,185],[114,157,184,186,201,203],[114,157,169,189,190,191,192],[114,157,189,191],[114,157,189,190],[114,157,192],[114,157,193],[114,154,157,189],[114,157,169,195,196],[114,157,195,196],[114,157,162,177,189,197],[114,157,198],[114,157,177,199],[114,157,172,183,200],[114,157,162,201],[114,157,189,202],[114,157,176,203],[114,157,204],[114,157,162,169,171,180,189,200,203,205],[114,157,189,206],[114,124,128,157,200],[114,124,157,189,200],[114,119,157],[114,121,124,157,197,200],[114,157,177,197],[114,119,157,207],[114,121,124,157,177,200],[114,116,117,120,123,157,169,189,200],[114,124,131,157],[114,116,122,157],[114,124,145,146,157],[114,120,124,157,192,200,207],[114,145,157,207],[114,118,119,157,207],[114,124,157],[114,118,119,120,121,122,123,124,125,126,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,146,147,148,149,150,151,157],[114,124,139,157],[114,124,131,132,157],[114,122,124,132,133,157],[114,123,157],[114,116,119,124,157],[114,124,128,132,133,157],[114,128,157],[114,122,124,127,157,200],[114,116,121,124,131,157],[114,157,189],[114,119,124,145,157,205,207]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3cfde44f8089768ebb08098c96d01ca260b88bccf238d55eee93f1c620ff5a5","impliedFormat":1},{"version":"293eadad9dead44c6fd1db6de552663c33f215c55a1bfa2802a1bceed88ff0ec","impliedFormat":1},{"version":"833e92c058d033cde3f29a6c7603f517001d1ddd8020bc94d2067a3bc69b2a8e","impliedFormat":1},{"version":"08b2fae7b0f553ad9f79faec864b179fc58bc172e295a70943e8585dd85f600c","impliedFormat":1},{"version":"f12edf1672a94c578eca32216839604f1e1c16b40a1896198deabf99c882b340","impliedFormat":1},{"version":"e3498cf5e428e6c6b9e97bd88736f26d6cf147dedbfa5a8ad3ed8e05e059af8a","impliedFormat":1},{"version":"dba3f34531fd9b1b6e072928b6f885aa4d28dd6789cbd0e93563d43f4b62da53","impliedFormat":1},{"version":"f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c","impliedFormat":1},{"version":"e4b03ddcf8563b1c0aee782a185286ed85a255ce8a30df8453aade2188bbc904","impliedFormat":1},{"version":"2329d90062487e1eaca87b5e06abcbbeeecf80a82f65f949fd332cfcf824b87b","impliedFormat":1},{"version":"25b3f581e12ede11e5739f57a86e8668fbc0124f6649506def306cad2c59d262","impliedFormat":1},{"version":"4fdb529707247a1a917a4626bfb6a293d52cd8ee57ccf03830ec91d39d606d6d","impliedFormat":1},{"version":"a9ebb67d6bbead6044b43714b50dcb77b8f7541ffe803046fdec1714c1eba206","impliedFormat":1},{"version":"5780b706cece027f0d4444fbb4e1af62dc51e19da7c3d3719f67b22b033859b9","impliedFormat":1},{"version":"61fc6eb9cd585284f49117da8461189fcdab73722e2973ace5050b4369949a03","signature":"febb3e0f3ecc725c6f183ad9508b9daadea0a14a67fa9a3fc5af2e774ff90b36"},{"version":"170d4db14678c68178ee8a3d5a990d5afb759ecb6ec44dbd885c50f6da6204f6","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"5e76305d58bcdc924ff2bf14f6a9dc2aa5441ed06464b7e7bd039e611d66a89b","impliedFormat":1},{"version":"acd8fd5090ac73902278889c38336ff3f48af6ba03aa665eb34a75e7ba1dccc4","impliedFormat":1},{"version":"d6258883868fb2680d2ca96bc8b1352cab69874581493e6d52680c5ffecdb6cc","impliedFormat":1},{"version":"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","impliedFormat":1},{"version":"f258e3960f324a956fc76a3d3d9e964fff2244ff5859dcc6ce5951e5413ca826","impliedFormat":1},{"version":"643f7232d07bf75e15bd8f658f664d6183a0efaca5eb84b48201c7671a266979","impliedFormat":1},{"version":"0f6666b58e9276ac3a38fdc80993d19208442d6027ab885580d93aec76b4ef00","impliedFormat":1},{"version":"05fd364b8ef02fb1e174fbac8b825bdb1e5a36a016997c8e421f5fab0a6da0a0","impliedFormat":1},{"version":"631eff75b0e35d1b1b31081d55209abc43e16b49426546ab5a9b40bdd40b1f60","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fd06258805d26c72f5997e07a23155d322d5f05387adb3744a791fe6a0b042d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"24bd580b5743dc56402c440dc7f9a4f5d592ad7a419f25414d37a7bfe11e342b","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"6bdc71028db658243775263e93a7db2fd2abfce3ca569c3cca5aee6ed5eb186d","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"ba97261afafe85aafe76d988e65e531da8e8cf791c49caf0531f5dd1689bd91b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f52e8dacc97d71dcc96af29e49584353f9c54cb916d132e3e768d8b8129c928d","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"76103716ba397bbb61f9fa9c9090dca59f39f9047cb1352b2179c5d8e7f4e8d0","impliedFormat":1},{"version":"53eac70430b30089a3a1959d8306b0f9cfaf0de75224b68ef25243e0b5ad1ca3","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"115971d64632ea4742b5b115fb64ed04bcaae2c3c342f13d9ba7e3f9ee39c4e7","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"86956cc2eb9dd371d6fab493d326a574afedebf76eef3fa7833b8e0d9b52d6f1","affectsGlobalScope":true,"impliedFormat":1},{"version":"24642567d3729bcc545bacb65ee7c0db423400c7f1ef757cab25d05650064f98","impliedFormat":1},{"version":"e6f5a38687bebe43a4cef426b69d34373ef68be9a6b1538ec0a371e69f309354","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"e9ad08a376ac84948fcca0013d6f1d4ae4f9522e26b91f87945b97c99d7cc30b","impliedFormat":1},{"version":"eaf9ee1d90a35d56264f0bf39842282c58b9219e112ac7d0c1bce98c6c5da672","impliedFormat":1},{"version":"c15c4427ae7fd1dcd7f312a8a447ac93581b0d4664ddf151ecd07de4bf2bb9d7","impliedFormat":1},{"version":"5135bdd72cc05a8192bd2e92f0914d7fc43ee077d1293dc622a049b7035a0afb","impliedFormat":1},{"version":"4f80de3a11c0d2f1329a72e92c7416b2f7eab14f67e92cac63bb4e8d01c6edc8","impliedFormat":1},{"version":"6d386bc0d7f3afa1d401afc3e00ed6b09205a354a9795196caed937494a713e6","impliedFormat":1},{"version":"07562498d06bc1db00536c886f38e5f9892f8aef7a3720a25db714be4c775952","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4047ed87e765bd3bcc316a0c4c4c8b0061628460d8a5412d1c4b53a4658665a","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"3eb62baae4df08c9173e6903d3ca45942ccec8c3659b0565684a75f3292cffbb","affectsGlobalScope":true,"impliedFormat":1},{"version":"a85683ef86875f4ad4c6b7301bbcc63fb379a8d80d3d3fd735ee57f48ef8a47e","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"c6b4e0a02545304935ecbf7de7a8e056a31bb50939b5b321c9d50a405b5a0bba","impliedFormat":1},{"version":"fab29e6d649aa074a6b91e3bdf2bff484934a46067f6ee97a30fcd9762ae2213","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"15c5e91b5f08be34a78e3d976179bf5b7a9cc28dc0ef1ffebffeb3c7812a2dca","impliedFormat":1},{"version":"58832ded29e0094047596544ac391d68c799d7bd7d35936f47221857141628f1","impliedFormat":1},{"version":"553870e516f8c772b89f3820576152ebc70181d7994d96917bb943e37da7f8a7","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"745c4240220559bd340c8aeb6e3c5270a709d3565e934dc22a69c304703956bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"9212c6e9d80cb45441a3614e95afd7235a55a18584c2ed32d6c1aca5a0c53d93","affectsGlobalScope":true,"impliedFormat":1},{"version":"bef91efa0baea5d0e0f0f27b574a8bc100ce62a6d7e70220a0d58af6acab5e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"282fd2a1268a25345b830497b4b7bf5037a5e04f6a9c44c840cb605e19fea841","impliedFormat":1},{"version":"5360a27d3ebca11b224d7d3e38e3e2c63f8290cb1fcf6c3610401898f8e68bc3","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"6bd91a2a356600dee28eb0438082d0799a18a974a6537c4410a796bab749813c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f689c4237b70ae6be5f0e4180e8833f34ace40529d1acc0676ab8fb8f70457d7","impliedFormat":1},{"version":"ae25afbbf1ed5df63a177d67b9048bf7481067f1b8dc9c39212e59db94fc9fc6","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"52a8e7e8a1454b6d1b5ad428efae3870ffc56f2c02d923467f2940c454aa9aec","affectsGlobalScope":true,"impliedFormat":1},{"version":"78dc0513cc4f1642906b74dda42146bcbd9df7401717d6e89ea6d72d12ecb539","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"24259d3dae14de55d22f8b3d3e96954e5175a925ab6a830dc05a1993d4794eda","impliedFormat":1},{"version":"27e046d30d55669e9b5a325788a9b4073b05ce62607867754d2918af559a0877","impliedFormat":1},{"version":"be1cc4d94ea60cbe567bc29ed479d42587bf1e6cba490f123d329976b0fe4ee5","impliedFormat":1},{"version":"42bc0e1a903408137c3df2b06dfd7e402cdab5bbfa5fcfb871b22ebfdb30bd0b","impliedFormat":1},{"version":"9894dafe342b976d251aac58e616ac6df8db91fb9d98934ff9dd103e9e82578f","impliedFormat":1},{"version":"413df52d4ea14472c2fa5bee62f7a40abd1eb49be0b9722ee01ee4e52e63beb2","impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","impliedFormat":1},{"version":"829b9e6028b29e6a8b1c01ddb713efe59da04d857089298fa79acbdb3cfcfdef","impliedFormat":1},{"version":"24f8562308dd8ba6013120557fa7b44950b619610b2c6cb8784c79f11e3c4f90","impliedFormat":1},{"version":"5f90b8c733a1bda63e42160b15a2301051e83a6f9d5332a59d16eb12f463270d","impliedFormat":1},{"version":"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","impliedFormat":1},{"version":"ad0d1d75d129b1c80f911be438d6b61bfa8703930a8ff2be2f0e1f8a91841c64","impliedFormat":1},{"version":"ce75b1aebb33d510ff28af960a9221410a3eaf7f18fc5f21f9404075fba77256","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"496bbf339f3838c41f164238543e9fe5f1f10659cb30b68903851618464b98ba","impliedFormat":1},{"version":"5178eb4415a172c287c711dc60a619e110c3fd0b7de01ed0627e51a5336aa09c","impliedFormat":1},{"version":"ca6e5264278b53345bc1ce95f42fb0a8b733a09e3d6479c6ccfca55cdc45038c","impliedFormat":1},{"version":"9e2739b32f741859263fdba0244c194ca8e96da49b430377930b8f721d77c000","impliedFormat":1},{"version":"fb1d8e814a3eeb5101ca13515e0548e112bd1ff3fb358ece535b93e94adf5a3a","impliedFormat":1},{"version":"ffa495b17a5ef1d0399586b590bd281056cee6ce3583e34f39926f8dcc6ecdb5","impliedFormat":1},{"version":"98b18458acb46072947aabeeeab1e410f047e0cacc972943059ca5500b0a5e95","impliedFormat":1},{"version":"361e2b13c6765d7f85bb7600b48fde782b90c7c41105b7dab1f6e7871071ba20","impliedFormat":1},{"version":"c86fe861cf1b4c46a0fb7d74dffe596cf679a2e5e8b1456881313170f092e3fa","impliedFormat":1},{"version":"b6db56e4903e9c32e533b78ac85522de734b3d3a8541bf24d256058d464bf04b","impliedFormat":1},{"version":"24daa0366f837d22c94a5c0bad5bf1fd0f6b29e1fae92dc47c3072c3fdb2fbd5","impliedFormat":1},{"version":"570bb5a00836ffad3e4127f6adf581bfc4535737d8ff763a4d6f4cc877e60d98","impliedFormat":1},{"version":"889c00f3d32091841268f0b994beba4dceaa5df7573be12c2c829d7c5fbc232c","impliedFormat":1},{"version":"65f43099ded6073336e697512d9b80f2d4fec3182b7b2316abf712e84104db00","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"acf5a2ac47b59ca07afa9abbd2b31d001bf7448b041927befae2ea5b1951d9f9","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"d71291eff1e19d8762a908ba947e891af44749f3a2cbc5bd2ec4b72f72ea795f","impliedFormat":1},{"version":"c0480e03db4b816dff2682b347c95f2177699525c54e7e6f6aa8ded890b76be7","impliedFormat":1},{"version":"27ab780875bcbb65e09da7496f2ca36288b0c541abaa75c311450a077d54ec15","impliedFormat":1},{"version":"b620391fe8060cf9bedc176a4d01366e6574d7a71e0ac0ab344a4e76576fcbb8","impliedFormat":1},{"version":"380647d8f3b7f852cca6d154a376dbf8ac620a2f12b936594504a8a852e71d2f","impliedFormat":1},{"version":"208c9af9429dd3c76f5927b971263174aaa4bc7621ddec63f163640cbd3c473c","impliedFormat":1},{"version":"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","impliedFormat":1},{"version":"a23185bc5ef590c287c28a91baf280367b50ae4ea40327366ad01f6f4a8edbc5","impliedFormat":1},{"version":"bb37588926aba35c9283fe8d46ebf4e79ffe976343105f5c6d45f282793352b2","impliedFormat":1},{"version":"002eae065e6960458bda3cf695e578b0d1e2785523476f8a9170b103c709cd4f","impliedFormat":1},{"version":"c83bb0c9c5645a46c68356c2f73fdc9de339ce77f7f45a954f560c7e0b8d5ebb","impliedFormat":1},{"version":"05c97cddbaf99978f83d96de2d8af86aded9332592f08ce4a284d72d0952c391","impliedFormat":1},{"version":"72179f9dd22a86deaad4cc3490eb0fe69ee084d503b686985965654013f1391b","impliedFormat":1},{"version":"2e6114a7dd6feeef85b2c80120fdbfb59a5529c0dcc5bfa8447b6996c97a69f5","impliedFormat":1},{"version":"7b6ff760c8a240b40dab6e4419b989f06a5b782f4710d2967e67c695ef3e93c4","impliedFormat":1},{"version":"c8f004e6036aa1c764ad4ec543cf89a5c1893a9535c80ef3f2b653e370de45e6","impliedFormat":1},{"version":"dd80b1e600d00f5c6a6ba23f455b84a7db121219e68f89f10552c54ba46e4dc9","impliedFormat":1},{"version":"b064c36f35de7387d71c599bfcf28875849a1dbc733e82bd26cae3d1cd060521","impliedFormat":1},{"version":"6a148329edecbda07c21098639ef4254ef7869fb25a69f58e5d6a8b7b69d4236","impliedFormat":1},{"version":"8de9fe97fa9e00ec00666fa77ab6e91b35d25af8ca75dabcb01e14ad3299b150","impliedFormat":1},{"version":"f63ab283a1c8f5c79fabe7ca4ef85f9633339c4f0e822fce6a767f9d59282af2","impliedFormat":1},{"version":"dba114fb6a32b355a9cfc26ca2276834d72fe0e94cd2c3494005547025015369","impliedFormat":1},{"version":"a54c996c8870ef1728a2c1fa9b8eaec0bf4a8001cd2583c02dd5869289465b10","impliedFormat":1},{"version":"3e7efde639c6a6c3edb9847b3f61e308bf7a69685b92f665048c45132f51c218","impliedFormat":1},{"version":"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","impliedFormat":1},{"version":"3754982006a3b32c502cff0867ca83584f7a43b1035989ca73603f400de13c96","impliedFormat":1},{"version":"a30ae9bb8a8fa7b90f24b8a0496702063ae4fe75deb27da731ed4a03b2eb6631","impliedFormat":1},{"version":"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","impliedFormat":1},{"version":"50256e9c31318487f3752b7ac12ff365c8949953e04568009c8705db802776fb","impliedFormat":1},{"version":"7d73b24e7bf31dfb8a931ca6c4245f6bb0814dfae17e4b60c9e194a631fe5f7b","impliedFormat":1},{"version":"413586add0cfe7369b64979d4ec2ed56c3f771c0667fbde1bf1f10063ede0b08","impliedFormat":1},{"version":"06472528e998d152375ad3bd8ebcb69ff4694fd8d2effaf60a9d9f25a37a097a","impliedFormat":1},{"version":"50b5bc34ce6b12eccb76214b51aadfa56572aa6cc79c2b9455cdbb3d6c76af1d","impliedFormat":1},{"version":"b7e16ef7f646a50991119b205794ebfd3a4d8f8e0f314981ebbe991639023d0e","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"a401617604fa1f6ce437b81689563dfdc377069e4c58465dbd8d16069aede0a5","impliedFormat":1},{"version":"e9dd71cf12123419c60dab867d44fbee5c358169f99529121eaef277f5c83531","impliedFormat":1},{"version":"5b6a189ba3a0befa1f5d9cb028eb9eec2af2089c32f04ff50e2411f63d70f25d","impliedFormat":1},{"version":"d6e73f8010935b7b4c7487b6fb13ea197cc610f0965b759bec03a561ccf8423a","impliedFormat":1},{"version":"174f3864e398f3f33f9a446a4f403d55a892aa55328cf6686135dfaf9e171657","impliedFormat":1},{"version":"824c76aec8d8c7e65769688cbee102238c0ef421ed6686f41b2a7d8e7e78a931","impliedFormat":1},{"version":"75b868be3463d5a8cfc0d9396f0a3d973b8c297401d00bfb008a42ab16643f13","impliedFormat":1},{"version":"15a234e5031b19c48a69ccc1607522d6e4b50f57d308ecb7fe863d44cd9f9eb3","impliedFormat":1},{"version":"d682336018141807fb602709e2d95a192828fcb8d5ba06dda3833a8ea98f69e3","impliedFormat":1},{"version":"6124e973eab8c52cabf3c07575204efc1784aca6b0a30c79eb85fe240a857efa","impliedFormat":1},{"version":"0d891735a21edc75df51f3eb995e18149e119d1ce22fd40db2b260c5960b914e","impliedFormat":1},{"version":"3b414b99a73171e1c4b7b7714e26b87d6c5cb03d200352da5342ab4088a54c85","impliedFormat":1},{"version":"4fbd3116e00ed3a6410499924b6403cc9367fdca303e34838129b328058ede40","impliedFormat":1},{"version":"b01bd582a6e41457bc56e6f0f9de4cb17f33f5f3843a7cf8210ac9c18472fb0f","impliedFormat":1},{"version":"0a437ae178f999b46b6153d79095b60c42c996bc0458c04955f1c996dc68b971","impliedFormat":1},{"version":"74b2a5e5197bd0f2e0077a1ea7c07455bbea67b87b0869d9786d55104006784f","impliedFormat":1},{"version":"4a7baeb6325920044f66c0f8e5e6f1f52e06e6d87588d837bdf44feb6f35c664","impliedFormat":1},{"version":"6dcf60530c25194a9ee0962230e874ff29d34c59605d8e069a49928759a17e0a","impliedFormat":1},{"version":"7274fbffbd7c9589d8d0ffba68157237afd5cecff1e99881ea3399127e60572f","impliedFormat":1},{"version":"1a42d2ec31a1fe62fdc51591768695ed4a2dc64c01be113e7ff22890bebb5e3f","impliedFormat":1},{"version":"1a82deef4c1d39f6882f28d275cad4c01f907b9b39be9cbc472fcf2cf051e05b","impliedFormat":1},{"version":"c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","impliedFormat":1},{"version":"65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9","impliedFormat":1},{"version":"9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801","impliedFormat":1},{"version":"de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","impliedFormat":1},{"version":"c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","impliedFormat":1},{"version":"1ee45496b5f8bdee6f7abc233355898e5bf9bd51255db65f5ff7ede617ca0027","impliedFormat":1},{"version":"0c7c947ff881c4274c0800deaa0086971e0bfe51f89a33bd3048eaa3792d4876","affectsGlobalScope":true,"impliedFormat":1},{"version":"db01d18853469bcb5601b9fc9826931cc84cc1a1944b33cad76fd6f1e3d8c544","affectsGlobalScope":true,"impliedFormat":1},{"version":"a8f8e6ab2fa07b45251f403548b78eaf2022f3c2254df3dc186cb2671fe4996d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","impliedFormat":1},{"version":"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b","impliedFormat":1},{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true,"impliedFormat":1},{"version":"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","impliedFormat":1},{"version":"15b36126e0089bfef173ab61329e8286ce74af5e809d8a72edcafd0cc049057f","impliedFormat":1},{"version":"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","impliedFormat":1},{"version":"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","impliedFormat":1},{"version":"a57b1802794433adec9ff3fed12aa79d671faed86c49b09e02e1ac41b4f1d33a","impliedFormat":1},{"version":"ad10d4f0517599cdeca7755b930f148804e3e0e5b5a3847adce0f1f71bbccd74","impliedFormat":1},{"version":"1042064ece5bb47d6aba91648fbe0635c17c600ebdf567588b4ca715602f0a9d","impliedFormat":1},{"version":"c49469a5349b3cc1965710b5b0f98ed6c028686aa8450bcb3796728873eb923e","impliedFormat":1},{"version":"4a889f2c763edb4d55cb624257272ac10d04a1cad2ed2948b10ed4a7fda2a428","impliedFormat":1},{"version":"7bb79aa2fead87d9d56294ef71e056487e848d7b550c9a367523ee5416c44cfa","impliedFormat":1},{"version":"72d63643a657c02d3e51cd99a08b47c9b020a565c55f246907050d3c8a5e77fb","impliedFormat":1},{"version":"1d415445ea58f8033ba199703e55ff7483c52ac6742075b803bd3e7bbe9f5d61","impliedFormat":1},{"version":"d6406c629bb3efc31aedb2de809bef471e475c86c7e67f3ef9b676b5d7e0d6b2","impliedFormat":1},{"version":"27ff4196654e6373c9af16b6165120e2dd2169f9ad6abb5c935af5abd8c7938c","impliedFormat":1},{"version":"71d8ba39a9e024d9e4bb922464d18542ed8d2c25ee78efa7890c27213cc6e5d3","impliedFormat":1},{"version":"8c030e515014c10a2b98f9f48408e3ba18023dfd3f56e3312c6c2f3ae1f55a16","impliedFormat":1},{"version":"dafc31e9e8751f437122eb8582b93d477e002839864410ff782504a12f2a550c","impliedFormat":1},{"version":"754498c5208ce3c5134f6eabd49b25cf5e1a042373515718953581636491f3c3","impliedFormat":1},{"version":"9c82171d836c47486074e4ca8e059735bf97b205e70b196535b5efd40cbe1bc5","impliedFormat":1},{"version":"f56bdc6884648806d34bc66d31cdb787c4718d04105ce2cd88535db214631f82","impliedFormat":1},{"version":"633d58a237f4bb25ec7d565e4ffa32cecdcee8660ac12189c4351c52557cee9e","impliedFormat":1},{"version":"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","impliedFormat":1},{"version":"13283350547389802aa35d9f2188effaeac805499169a06ef5cd77ce2a0bd63f","impliedFormat":1},{"version":"ce791f6ea807560f08065d1af6014581eeb54a05abd73294777a281b6dfd73c2","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"49f95e989b4632c6c2a578cc0078ee19a5831832d79cc59abecf5160ea71abad","impliedFormat":1},{"version":"9666533332f26e8995e4d6fe472bdeec9f15d405693723e6497bf94120c566c8","impliedFormat":1},{"version":"ce0df82a9ae6f914ba08409d4d883983cc08e6d59eb2df02d8e4d68309e7848b","impliedFormat":1},{"version":"796273b2edc72e78a04e86d7c58ae94d370ab93a0ddf40b1aa85a37a1c29ecd7","impliedFormat":1},{"version":"5df15a69187d737d6d8d066e189ae4f97e41f4d53712a46b2710ff9f8563ec9f","impliedFormat":1},{"version":"e17cd049a1448de4944800399daa4a64c5db8657cc9be7ef46be66e2a2cd0e7c","impliedFormat":1},{"version":"43fa6ea8714e18adc312b30450b13562949ba2f205a1972a459180fa54471018","impliedFormat":1},{"version":"6e89c2c177347d90916bad67714d0fb473f7e37fb3ce912f4ed521fe2892cd0d","impliedFormat":1},{"version":"43ba4f2fa8c698f5c304d21a3ef596741e8e85a810b7c1f9b692653791d8d97a","impliedFormat":1},{"version":"4d4927cbee21750904af7acf940c5e3c491b4d5ebc676530211e389dd375607a","impliedFormat":1},{"version":"72105519d0390262cf0abe84cf41c926ade0ff475d35eb21307b2f94de985778","impliedFormat":1},{"version":"8a97e578a9bc40eb4f1b0ca78f476f2e9154ecbbfd5567ee72943bab37fc156a","impliedFormat":1},{"version":"c857e0aae3f5f444abd791ec81206020fbcc1223e187316677e026d1c1d6fe08","impliedFormat":1},{"version":"ccf6dd45b708fb74ba9ed0f2478d4eb9195c9dfef0ff83a6092fa3cf2ff53b4f","impliedFormat":1},{"version":"2d7db1d73456e8c5075387d4240c29a2a900847f9c1bff106a2e490da8fbd457","impliedFormat":1},{"version":"2b15c805f48e4e970f8ec0b1915f22d13ca6212375e8987663e2ef5f0205e832","impliedFormat":1},{"version":"f22d05663d873ee7a600faf78abb67f3f719d32266803440cf11d5db7ac0cab2","impliedFormat":1},{"version":"d93c544ad20197b3976b0716c6d5cd5994e71165985d31dcab6e1f77feb4b8f2","impliedFormat":1},{"version":"35069c2c417bd7443ae7c7cafd1de02f665bf015479fec998985ffbbf500628c","impliedFormat":1},{"version":"a8b1c79a833ee148251e88a2553d02ce1641d71d2921cce28e79678f3d8b96aa","impliedFormat":1},{"version":"126d4f950d2bba0bd45b3a86c76554d4126c16339e257e6d2fabf8b6bf1ce00c","impliedFormat":1},{"version":"7e0b7f91c5ab6e33f511efc640d36e6f933510b11be24f98836a20a2dc914c2d","impliedFormat":1},{"version":"045b752f44bf9bbdcaffd882424ab0e15cb8d11fa94e1448942e338c8ef19fba","impliedFormat":1},{"version":"2894c56cad581928bb37607810af011764a2f511f575d28c9f4af0f2ef02d1ab","impliedFormat":1},{"version":"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","impliedFormat":1},{"version":"2d3cc2211f352f46ea6b7cf2c751c141ffcdf514d6e7ae7ee20b7b6742da313f","impliedFormat":1},{"version":"c75445151ff8b77d9923191efed7203985b1a9e09eccf4b054e7be864e27923d","impliedFormat":1},{"version":"0aedb02516baf3e66b2c1db9fef50666d6ed257edac0f866ea32f1aa05aa474f","impliedFormat":1},{"version":"fa8a8fbf91ee2a4779496225f0312aac6635b0f21aa09cdafa4283fe32d519c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"0e8aef93d79b000deb6ec336b5645c87de167168e184e84521886f9ecc69a4b5","impliedFormat":1},{"version":"56ccb49443bfb72e5952f7012f0de1a8679f9f75fc93a5c1ac0bafb28725fc5f","impliedFormat":1},{"version":"20fa37b636fdcc1746ea0738f733d0aed17890d1cd7cb1b2f37010222c23f13e","impliedFormat":1},{"version":"d90b9f1520366d713a73bd30c5a9eb0040d0fb6076aff370796bc776fd705943","impliedFormat":1},{"version":"bc03c3c352f689e38c0ddd50c39b1e65d59273991bfc8858a9e3c0ebb79c023b","impliedFormat":1},{"version":"19df3488557c2fc9b4d8f0bac0fd20fb59aa19dec67c81f93813951a81a867f8","affectsGlobalScope":true,"impliedFormat":1},{"version":"b25350193e103ae90423c5418ddb0ad1168dc9c393c9295ef34980b990030617","affectsGlobalScope":true,"impliedFormat":1},{"version":"bef86adb77316505c6b471da1d9b8c9e428867c2566270e8894d4d773a1c4dc2","impliedFormat":1},{"version":"de7052bfee2981443498239a90c04ea5cc07065d5b9bb61b12cb6c84313ad4ef","impliedFormat":1},{"version":"a3e7d932dc9c09daa99141a8e4800fc6c58c625af0d4bbb017773dc36da75426","impliedFormat":1},{"version":"43e96a3d5d1411ab40ba2f61d6a3192e58177bcf3b133a80ad2a16591611726d","impliedFormat":1},{"version":"4a2edd238d9104eac35b60d727f1123de5062f452b70ed8e0366cb36387dfdfd","impliedFormat":1},{"version":"ca921bf56756cb6fe957f6af693a35251b134fb932dc13f3dfff0bb7106f80b4","impliedFormat":1},{"version":"fee92c97f1aa59eb7098a0cc34ff4df7e6b11bae71526aca84359a2575f313d8","impliedFormat":1},{"version":"0bd0297484aacea217d0b76e55452862da3c5d9e33b24430e0719d1161657225","impliedFormat":1},{"version":"2ab6d334bcbf2aff3acfc4fd8c73ecd82b981d3c3aa47b3f3b89281772286904","impliedFormat":1},{"version":"d07cbc787a997d83f7bde3877fec5fb5b12ce8c1b7047eb792996ed9726b4dde","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"4805f6161c2c8cefb8d3b8bd96a080c0fe8dbc9315f6ad2e53238f9a79e528a6","impliedFormat":1},{"version":"b83cb14474fa60c5f3ec660146b97d122f0735627f80d82dd03e8caa39b4388c","impliedFormat":1},{"version":"f374cb24e93e7798c4d9e83ff872fa52d2cdb36306392b840a6ddf46cb925cb6","impliedFormat":1},{"version":"49179c6a23701c642bd99abe30d996919748014848b738d8e85181fc159685ff","impliedFormat":1},{"version":"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","impliedFormat":1},{"version":"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","impliedFormat":1},{"version":"20865ac316b8893c1a0cc383ccfc1801443fbcc2a7255be166cf90d03fac88c9","impliedFormat":1},{"version":"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","impliedFormat":1},{"version":"461d0ad8ae5f2ff981778af912ba71b37a8426a33301daa00f21c6ccb27f8156","impliedFormat":1},{"version":"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","impliedFormat":1},{"version":"fcafff163ca5e66d3b87126e756e1b6dfa8c526aa9cd2a2b0a9da837d81bbd72","impliedFormat":1},{"version":"70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657","impliedFormat":1},{"version":"f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b","impliedFormat":1},{"version":"772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc","impliedFormat":1},{"version":"45490817629431853543adcb91c0673c25af52a456479588b6486daba34f68bb","impliedFormat":1},{"version":"802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7","impliedFormat":1},{"version":"8b4327413e5af38cd8cb97c59f48c3c866015d5d642f28518e3a891c469f240e","impliedFormat":1},{"version":"8514c62ce38e58457d967e9e73f128eedc1378115f712b9eef7127f7c88f82ae","impliedFormat":1},{"version":"f1289e05358c546a5b664fbb35a27738954ec2cc6eb4137350353099d154fc62","impliedFormat":1},{"version":"4b20fcf10a5413680e39f5666464859fc56b1003e7dfe2405ced82371ebd49b6","impliedFormat":1},{"version":"1d17ba45cfbe77a9c7e0df92f7d95f3eefd49ee23d1104d0548b215be56945ad","impliedFormat":1},{"version":"f7d628893c9fa52ba3ab01bcb5e79191636c4331ee5667ecc6373cbccff8ae12","impliedFormat":1},{"version":"1d879125d1ec570bf04bc1f362fdbe0cb538315c7ac4bcfcdf0c1e9670846aa6","impliedFormat":1},{"version":"a1ee88010a64e8647d07dba58ec43e6e05851b9ec7a62e4ca2b9c33be5abb2c8","impliedFormat":1},{"version":"46273e8c29816125d0d0b56ce9a849cc77f60f9a5ba627447501d214466f0ff3","impliedFormat":1},{"version":"d663134457d8d669ae0df34eabd57028bddc04fc444c4bc04bc5215afc91e1f4","impliedFormat":1},{"version":"e91f7b1344577a02f051b9b471f33044fef8334a76dc9e1de003d17595a5219b","impliedFormat":1},{"version":"3af3584f79c57853028ef9421ec172539e1fe01853296dc05a9d615ade4ffaf6","impliedFormat":1},{"version":"f82579d87701d639ff4e3930a9b24f4ee13ca74221a9a3a792feb47f01881a9c","impliedFormat":1},{"version":"d7e5d5245a8ba34a274717d085174b2c9827722778129b0081fefd341cca8f55","impliedFormat":1},{"version":"d9d32f94056181c31f553b32ce41d0ef75004912e27450738d57efcd2409c324","impliedFormat":1},{"version":"752513f35f6cff294ffe02d6027c41373adf7bfa35e593dbfd53d95c203635ee","impliedFormat":1},{"version":"6c800b281b9e89e69165fd11536195488de3ff53004e55905e6c0059a2d8591e","impliedFormat":1},{"version":"7d4254b4c6c67a29d5e7f65e67d72540480ac2cfb041ca484847f5ae70480b62","impliedFormat":1},{"version":"1a7e2ea171726446850ec72f4d1525d547ff7e86724cc9e7eec509725752a758","impliedFormat":1},{"version":"8c901126d73f09ecdea4785e9a187d1ac4e793e07da308009db04a7283ec2f37","impliedFormat":1},{"version":"db97922b767bd2675fdfa71e08b49c38b7d2c847a1cc4a7274cb77be23b026f1","impliedFormat":1},{"version":"aab290b8e4b7c399f2c09b957666fc95335eb4522b2dd9ead1bf0cb64da6d6ee","impliedFormat":1},{"version":"94fe3281392e1015b22f39535878610b4fa6f1388dc8d78746be3bc4e4bb8950","impliedFormat":1},{"version":"2652448ac55a2010a1f71dd141f828b682298d39728f9871e1cdf8696ef443fd","impliedFormat":1},{"version":"06c25ddfc2242bd06c19f66c9eae4c46d937349a267810f89783680a1d7b5259","impliedFormat":1},{"version":"120599fd965257b1f4d0ff794bc696162832d9d8467224f4665f713a3119078b","impliedFormat":1},{"version":"5433f33b0a20300cca35d2f229a7fc20b0e8477c44be2affeb21cb464af60c76","impliedFormat":1},{"version":"db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195","impliedFormat":1},{"version":"bd4131091b773973ca5d2326c60b789ab1f5e02d8843b3587effe6e1ea7c9d86","impliedFormat":1},{"version":"c7f6485931085bf010fbaf46880a9b9ec1a285ad9dc8c695a9e936f5a48f34b4","impliedFormat":1},{"version":"14f6b927888a1112d662877a5966b05ac1bf7ed25d6c84386db4c23c95a5363b","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"0427df5c06fafc5fe126d14b9becd24160a288deff40e838bfbd92a35f8d0d00","impliedFormat":1},{"version":"90c54a02432d04e4246c87736e53a6a83084357acfeeba7a489c5422b22f5c7a","impliedFormat":1},{"version":"49c346823ba6d4b12278c12c977fb3a31c06b9ca719015978cb145eb86da1c61","impliedFormat":1},{"version":"bfac6e50eaa7e73bb66b7e052c38fdc8ccfc8dbde2777648642af33cf349f7f1","impliedFormat":1},{"version":"92f7c1a4da7fbfd67a2228d1687d5c2e1faa0ba865a94d3550a3941d7527a45d","impliedFormat":1},{"version":"f53b120213a9289d9a26f5af90c4c686dd71d91487a0aa5451a38366c70dc64b","impliedFormat":1},{"version":"83fe880c090afe485a5c02262c0b7cdd76a299a50c48d9bde02be8e908fb4ae6","impliedFormat":1},{"version":"0a372c2d12a259da78e21b25974d2878502f14d89c6d16b97bd9c5017ab1bc12","impliedFormat":1},{"version":"57d67b72e06059adc5e9454de26bbfe567d412b962a501d263c75c2db430f40e","impliedFormat":1},{"version":"6511e4503cf74c469c60aafd6589e4d14d5eb0a25f9bf043dcbecdf65f261972","impliedFormat":1},{"version":"ec1ca97598eda26b7a5e6c8053623acbd88e43be7c4d29c77ccd57abc4c43999","impliedFormat":1},{"version":"6e2261cd9836b2c25eecb13940d92c024ebed7f8efe23c4b084145cd3a13b8a6","impliedFormat":1},{"version":"a67b87d0281c97dfc1197ef28dfe397fc2c865ccd41f7e32b53f647184cc7307","impliedFormat":1},{"version":"771ffb773f1ddd562492a6b9aaca648192ac3f056f0e1d997678ff97dbb6bf9b","impliedFormat":1},{"version":"232f70c0cf2b432f3a6e56a8dc3417103eb162292a9fd376d51a3a9ea5fbbf6f","impliedFormat":1},{"version":"a47e6d954d22dd9ebb802e7e431b560ed7c581e79fb885e44dc92ed4f60d4c07","impliedFormat":1},{"version":"f019e57d2491c159d47a107fd90219a1734bdd2e25cd8d1db3c8fae5c6b414c4","impliedFormat":1},{"version":"8a0e762ceb20c7e72504feef83d709468a70af4abccb304f32d6b9bac1129b2c","impliedFormat":1},{"version":"d1c9bf292a54312888a77bb19dba5e2503ad803f5393beafd45d78d2f4fe9b48","impliedFormat":1},{"version":"9252d498a77517aab5d8d4b5eb9d71e4b225bbc7123df9713e08181de63180f6","impliedFormat":1},{"version":"cb8d8ef7b9ce8ed3e6f1c814fcbf3f90dab0cb8863079236784fc350746e27c4","impliedFormat":1},{"version":"35e6379c3f7cb27b111ad4c1aa69538fd8e788ab737b8ff7596a1b40e96f4f90","impliedFormat":1},{"version":"1fffe726740f9787f15b532e1dc870af3cd964dbe29e191e76121aa3dd8693f2","impliedFormat":1},{"version":"3be035da7bee86b4c3abf392e0edaa44fc6e45092995eefe36b39118c8a84068","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f828825d077c2fa0ea606649faeb122749273a353daab23924fe674e98ba44c","impliedFormat":1},{"version":"2896c2e673a5d3bd9b4246811f79486a073cbb03950c3d252fba10003c57411a","impliedFormat":1},{"version":"616775f16134fa9d01fc677ad3f76e68c051a056c22ab552c64cc281a9686790","impliedFormat":1},{"version":"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","impliedFormat":1},{"version":"f9fe6af238339a0e5f7563acee3178f51db37f32a2e7c09f85273098cee7ec49","impliedFormat":1},{"version":"407a06ba04eede4074eec470ecba2784cbb3bf4e7de56833b097dd90a2aa0651","impliedFormat":1},{"version":"77e71242e71ebf8528c5802993697878f0533db8f2299b4d36aa015bae08a79c","impliedFormat":1},{"version":"98a787be42bd92f8c2a37d7df5f13e5992da0d967fab794adbb7ee18370f9849","impliedFormat":1},{"version":"5c96bad5f78466785cdad664c056e9e2802d5482ca5f862ed19ba34ffbb7b3a4","impliedFormat":1},{"version":"81d8603ac527e75cfec72bb9391228b58f161c2b33514a9d814c7f3ebd3ef466","impliedFormat":1},{"version":"5f3dc10ae646f375776b4e028d2bed039a93eebbba105694d8b910feebbe8b9c","impliedFormat":1},{"version":"bb0cd7862b72f5eba39909c9889d566e198fcaddf7207c16737d0c2246112678","impliedFormat":1},{"version":"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","impliedFormat":1},{"version":"320f4091e33548b554d2214ce5fc31c96631b513dffa806e2e3a60766c8c49d9","impliedFormat":1},{"version":"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","impliedFormat":1},{"version":"d90d5f524de38889d1e1dbc2aeef00060d779f8688c02766ddb9ca195e4a713d","impliedFormat":1},{"version":"a3f41ed1b4f2fc3049394b945a68ae4fdefd49fa1739c32f149d32c0545d67f5","impliedFormat":1},{"version":"bad68fd0401eb90fe7da408565c8aee9c7a7021c2577aec92fa1382e8876071a","impliedFormat":1},{"version":"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","impliedFormat":1},{"version":"fec01479923e169fb52bd4f668dbeef1d7a7ea6e6d491e15617b46f2cacfa37d","impliedFormat":1},{"version":"8a8fb3097ba52f0ae6530ec6ab34e43e316506eb1d9aa29420a4b1e92a81442d","impliedFormat":1},{"version":"44e09c831fefb6fe59b8e65ad8f68a7ecc0e708d152cfcbe7ba6d6080c31c61e","impliedFormat":1},{"version":"1c0a98de1323051010ce5b958ad47bc1c007f7921973123c999300e2b7b0ecc0","impliedFormat":1},{"version":"4655709c9cb3fd6db2b866cab7c418c40ed9533ce8ea4b66b5f17ec2feea46a9","impliedFormat":1},{"version":"87affad8e2243635d3a191fa72ef896842748d812e973b7510a55c6200b3c2a4","impliedFormat":1},{"version":"ad036a85efcd9e5b4f7dd5c1a7362c8478f9a3b6c3554654ca24a29aa850a9c5","impliedFormat":1},{"version":"fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","impliedFormat":1},{"version":"3eecb25bb467a948c04874d70452b14ae7edb707660aac17dc053e42f2088b00","impliedFormat":1},{"version":"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","impliedFormat":1},{"version":"330896c1a2b9693edd617be24fbf9e5895d6e18c7955d6c08f028f272b37314d","impliedFormat":1},{"version":"1d9c0a9a6df4e8f29dc84c25c5aa0bb1da5456ebede7a03e03df08bb8b27bae6","impliedFormat":1},{"version":"84380af21da938a567c65ef95aefb5354f676368ee1a1cbb4cae81604a4c7d17","impliedFormat":1},{"version":"1af3e1f2a5d1332e136f8b0b95c0e6c0a02aaabd5092b36b64f3042a03debf28","impliedFormat":1},{"version":"30d8da250766efa99490fc02801047c2c6d72dd0da1bba6581c7e80d1d8842a4","impliedFormat":1},{"version":"03566202f5553bd2d9de22dfab0c61aa163cabb64f0223c08431fb3fc8f70280","impliedFormat":1},{"version":"5f0292a40df210ab94b9fb44c8b775c51e96777e14e073900e392b295ca1061b","impliedFormat":1},{"version":"bc9ee0192f056b3d5527bcd78dc3f9e527a9ba2bdc0a2c296fbc9027147df4b2","impliedFormat":1},{"version":"8627ad129bcf56e82adff0ab5951627c993937aa99f5949c33240d690088b803","impliedFormat":1},{"version":"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","impliedFormat":1},{"version":"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","impliedFormat":1},{"version":"5bf5c7a44e779790d1eb54c234b668b15e34affa95e78eada73e5757f61ed76a","impliedFormat":1},{"version":"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","impliedFormat":1},{"version":"5c634644d45a1b6bc7b05e71e05e52ec04f3d73d9ac85d5927f647a5f965181a","impliedFormat":1},{"version":"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","impliedFormat":1},{"version":"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","impliedFormat":1},{"version":"a68d4b3182e8d776cdede7ac9630c209a7bfbb59191f99a52479151816ef9f9e","impliedFormat":99},{"version":"39644b343e4e3d748344af8182111e3bbc594930fff0170256567e13bbdbebb0","impliedFormat":99},{"version":"ed7fd5160b47b0de3b1571c5c5578e8e7e3314e33ae0b8ea85a895774ee64749","impliedFormat":99},{"version":"63a7595a5015e65262557f883463f934904959da563b4f788306f699411e9bac","impliedFormat":1},{"version":"ecbaf0da125974be39c0aac869e403f72f033a4e7fd0d8cd821a8349b4159628","impliedFormat":1},{"version":"4ba137d6553965703b6b55fd2000b4e07ba365f8caeb0359162ad7247f9707a6","impliedFormat":1},{"version":"ceec3c81b2d81f5e3b855d9367c1d4c664ab5046dff8fd56552df015b7ccbe8f","affectsGlobalScope":true,"impliedFormat":1},{"version":"8fac4a15690b27612d8474fb2fc7cc00388df52d169791b78d1a3645d60b4c8b","affectsGlobalScope":true,"impliedFormat":1},{"version":"064ac1c2ac4b2867c2ceaa74bbdce0cb6a4c16e7c31a6497097159c18f74aa7c","impliedFormat":1},{"version":"3dc14e1ab45e497e5d5e4295271d54ff689aeae00b4277979fdd10fa563540ae","impliedFormat":1},{"version":"1d63055b690a582006435ddd3aa9c03aac16a696fac77ce2ed808f3e5a06efab","impliedFormat":1},{"version":"b32b40ae924ddf12b1b10fe1ee9ce51d38712c9f355e49fb3c1e518a956a7cb6","signature":"ec7d33f667898cb48beda7953b24919369ef5aaf7960a05d17672db144fc37c3"},{"version":"15d426486257eb941d7c8c083a0825b9839a9d2b35361714458d88ddfc60d082","signature":"36671ddee7f762710021b6a551d640f55a9b68e1ad370c8c59511d3e2c86c3a6"},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},"314b44ab4fc733c4283364f3e31d00627d68da4bf2cafdf772d2f5e8f3e3284f","e2d2693c8dcdbe0454d6cac650af7527399cdf0d0c7992e1a269bd6910a9976a",{"version":"3511fa6eae523772f389aec859979dce5818b8d585bc8112fa967b952fddf3d0","impliedFormat":1},{"version":"84bcc7c6b06f4d643a55dc63b56be0c81d990f8d549b66ea615c553268774dc3","impliedFormat":1},{"version":"2d225e7bda2871c066a7079c88174340950fb604f624f2586d3ea27bb9e5f4ff","impliedFormat":1},{"version":"6a785f84e63234035e511817dd48ada756d984dd8f9344e56eb8b2bdcd8fd001","impliedFormat":1},{"version":"c1422d016f7df2ccd3594c06f2923199acd09898f2c42f50ea8159f1f856f618","impliedFormat":1},{"version":"2973b1b7857ca144251375b97f98474e9847a890331e27132d5a8b3aea9350a8","impliedFormat":1},{"version":"0eb6152d37c84d6119295493dfcc20c331c6fda1304a513d159cdaa599dcb78b","impliedFormat":1},{"version":"237df26f8c326ca00cd9d2deb40214a079749062156386b6d75bdcecc6988a6b","impliedFormat":1},{"version":"cd44995ee13d5d23df17a10213fed7b483fabfd5ea08f267ab52c07ce0b6b4da","impliedFormat":1},{"version":"58ce1486f851942bd2d3056b399079bc9cb978ec933fe9833ea417e33eab676e","impliedFormat":1},{"version":"7557d4d7f19f94341f4413575a3453ba7f6039c9591015bcf4282a8e75414043","impliedFormat":1},{"version":"a3b2cc16f3ce2d882eca44e1066f57a24751545f2a5e4a153d4de31b4cac9bb5","impliedFormat":1},{"version":"ac2b3b377d3068bfb6e1cb8889c99098f2c875955e2325315991882a74d92cc8","impliedFormat":1},{"version":"8deb39d89095469957f73bd194d11f01d9894b8c1f1e27fbf3f6e8122576b336","impliedFormat":1},{"version":"a38a9c41f433b608a0d37e645a31eecf7233ef3d3fffeb626988d3219f80e32f","impliedFormat":1},{"version":"8e1428dcba6a984489863935049893631170a37f9584c0479f06e1a5b1f04332","impliedFormat":1},{"version":"1fce9ecb87a2d3898941c60df617e52e50fb0c03c9b7b2ba8381972448327285","impliedFormat":1},{"version":"5ef0597b8238443908b2c4bf69149ed3894ac0ddd0515ac583d38c7595b151f1","impliedFormat":1},{"version":"ac52b775a80badff5f4ac329c5725a26bd5aaadd57afa7ad9e98b4844767312a","impliedFormat":1},{"version":"6ae5b4a63010c82bf2522b4ecfc29ffe6a8b0c5eea6b2b35120077e9ac54d7a1","impliedFormat":1},{"version":"dd7109c49f416f218915921d44f0f28975df78e04e437c62e1e1eb3be5e18a35","impliedFormat":1},{"version":"eee181112e420b345fc78422a6cc32385ede3d27e2eaf8b8c4ad8b2c29e3e52e","impliedFormat":1},{"version":"25fbe57c8ee3079e2201fe580578fab4f3a78881c98865b7c96233af00bf9624","impliedFormat":1},{"version":"62cc8477858487b4c4de7d7ae5e745a8ce0015c1592f398b63ee05d6e64ca295","impliedFormat":1},{"version":"cc2a9ec3cb10e4c0b8738b02c31798fad312d21ef20b6a2f5be1d077e9f5409d","impliedFormat":1},{"version":"4b4fadcda7d34034737598c07e2dca5d7e1e633cb3ba8dd4d2e6a7782b30b296","impliedFormat":1},{"version":"360fdc8829a51c5428636f1f83e7db36fef6c5a15ed4411b582d00a1c2bd6e97","impliedFormat":1},{"version":"1cf0d15e6ab1ecabbf329b906ae8543e6b8955133b7f6655f04d433e3a0597ab","impliedFormat":1},{"version":"7c9f98fe812643141502b30fb2b5ec56d16aaf94f98580276ae37b7924dd44a4","impliedFormat":1},{"version":"b3547893f24f59d0a644c52f55901b15a3fa1a115bc5ea9a582911469b9348b7","impliedFormat":1},{"version":"596e5b88b6ca8399076afcc22af6e6e0c4700c7cd1f420a78d637c3fb44a885e","impliedFormat":1},{"version":"adddf736e08132c7059ee572b128fdacb1c2650ace80d0f582e93d097ed4fbaf","impliedFormat":1},{"version":"d4cad9dc13e9c5348637170ddd5d95f7ed5fdfc856ddca40234fa55518bc99a6","impliedFormat":1},{"version":"d70675ba7ba7d02e52b7070a369957a70827e4b2bca2c1680c38a832e87b61fd","impliedFormat":1},{"version":"3be71f4ce8988a01e2f5368bdd58e1d60236baf511e4510ee9291c7b3729a27e","impliedFormat":1},{"version":"423d2ccc38e369a7527988d682fafc40267bcd6688a7473e59c5eea20a29b64f","impliedFormat":1},{"version":"2f9fde0868ed030277c678b435f63fcf03d27c04301299580a4017963cc04ce6","impliedFormat":1},{"version":"feeb73d48cc41c6dd23d17473521b0af877751504c30c18dc84267c8eeea429a","impliedFormat":1},{"version":"25f1159094dc0bf3a71313a74e0885426af21c5d6564a254004f2cadf9c5b052","impliedFormat":1},{"version":"cde493e09daad4bb29922fe633f760be9f0e8e2f39cdca999cce3b8690b5e13a","impliedFormat":1},{"version":"3d7f9eb12aface876f7b535cc89dcd416daf77f0b3573333f16ec0a70bcf902a","impliedFormat":1},{"version":"4304f640f7cb4724ea82441accb7c7607fa7207541182470d625adda99b2900b","impliedFormat":1},{"version":"e0205f04611bea8b5b82168065b8ef1476a8e96236201494eb8c785331c43118","impliedFormat":1},{"version":"62d26d8ba4fa15ab425c1b57a050ed76c5b0ecbffaa53f182110aa3a02405a07","impliedFormat":1},{"version":"9941cbf7ca695e95d588f5f1692ab040b078d44a95d231fa9a8f828186b7b77d","impliedFormat":1},{"version":"41b8775befd7ded7245a627e9f4de6110236688ce4c124d2d40c37bc1a3bfe05","impliedFormat":1},"919cc119e1e67e7f6e9584bf7ec452d70da2e177e4e44997d5f2fda04c529bf4","1ef2431c0d0b8e649c93acb2cd52ee9577d49e2c0259dc741ab4c4022dba2c23","5fa16780d331447f69c09c3dd360c8d35463d938a41c2f5849b9308b00782ff4","81d01b95f45a330dfc57732f64c1ac3cef25a2eebb9cc7cdad5076c678b92784","301bb4610a2b1615c1b2be913667bd44d852b46cd707510dcb831409f50dfb35","3f17aa29ad3af4261d8a244c309fb2bafdb69a8b4122905c5b90cdc44bbd9b15",{"version":"a4e9e0d92dcad2cb387a5f1bdffe621569052f2d80186e11973aa7080260d296","impliedFormat":1},{"version":"f6380cc36fc3efc70084d288d0a05d0a2e09da012ee3853f9d62431e7216f129","impliedFormat":1},{"version":"497c3e541b4acf6c5d5ba75b03569cfe5fe25c8a87e6c87f1af98da6a3e7b918","impliedFormat":1},{"version":"d9429b81edf2fb2abf1e81e9c2e92615f596ed3166673d9b69b84c369b15fdc0","impliedFormat":1},{"version":"7e22943ae4e474854ca0695ab750a8026f55bb94278331fda02a4fb42efce063","impliedFormat":1},{"version":"7da9ff3d9a7e62ddca6393a23e67296ab88f2fcb94ee5f7fb977fa8e478852ac","impliedFormat":1},{"version":"e1b45cc21ea200308cbc8abae2fb0cfd014cb5b0e1d1643bcc50afa5959b6d83","impliedFormat":1},{"version":"c9740b0ce7533ce6ba21a7d424e38d2736acdddeab2b1a814c00396e62cc2f10","impliedFormat":1},{"version":"b3c1f6a3fdbb04c6b244de6d5772ffdd9e962a2faea1440e410049c13e874b87","impliedFormat":1},{"version":"dcaa872d9b52b9409979170734bdfd38f846c32114d05b70640fd05140b171bb","impliedFormat":1},{"version":"6c434d20da381fcd2e8b924a3ec9b8653cf8bed8e0da648e91f4c984bd2a5a91","impliedFormat":1},{"version":"992419d044caf6b14946fa7b9463819ab2eeb7af7c04919cc2087ce354c92266","impliedFormat":1},{"version":"fa9815e9ce1330289a5c0192e2e91eb6178c0caa83c19fe0c6a9f67013fe795c","impliedFormat":1},{"version":"06384a1a73fcf4524952ecd0d6b63171c5d41dd23573907a91ef0a687ddb4a8c","impliedFormat":1},{"version":"34b1594ecf1c84bcc7a04d9f583afa6345a6fea27a52cf2685f802629219de45","impliedFormat":1},{"version":"d82c9ca830d7b94b7530a2c5819064d8255b93dfeddc5b2ebb8a09316f002c89","impliedFormat":1},{"version":"7e046b9634add57e512412a7881efbc14d44d1c65eadd35432412aa564537975","impliedFormat":1},{"version":"aac9079b9e2b5180036f27ab37cb3cf4fd19955be48ccc82eab3f092ee3d4026","impliedFormat":1},{"version":"3d9c38933bc69e0a885da20f019de441a3b5433ce041ba5b9d3a541db4b568cb","impliedFormat":1},{"version":"606aa2b74372221b0f79ca8ae3568629f444cc454aa59b032e4cb602308dec94","impliedFormat":1},{"version":"50474eaea72bfda85cc37ae6cd29f0556965c0849495d96c8c04c940ef3d2f44","impliedFormat":1},{"version":"b4874382f863cf7dc82b3d15aed1e1372ac3fede462065d5bfc8510c0d8f7b19","impliedFormat":1},{"version":"df10b4f781871afb72b2d648d497671190b16b679bf7533b744cc10b3c6bf7ea","impliedFormat":1},{"version":"1fdc28754c77e852c92087c789a1461aa6eed19c335dc92ce6b16a188e7ba305","impliedFormat":1},{"version":"a656dab1d502d4ddc845b66d8735c484bfebbf0b1eda5fb29729222675759884","impliedFormat":1},{"version":"465a79505258d251068dc0047a67a3605dd26e6b15e9ad2cec297442cbb58820","impliedFormat":1},{"version":"ddae22d9329db28ce3d80a2a53f99eaed66959c1c9cd719c9b744e5470579d2f","impliedFormat":1},{"version":"d0e25feadef054c6fc6a7f55ccc3b27b7216142106b9ff50f5e7b19d85c62ca7","impliedFormat":1},{"version":"111214009193320cacbae104e8281f6cb37788b52a6a84d259f9822c8c71f6ca","impliedFormat":1},{"version":"01c8e2c8984c96b9b48be20ee396bd3689a3a3e6add8d50fe8229a7d4e62ff45","impliedFormat":1},{"version":"a4a0800b592e533897b4967b00fb00f7cd48af9714d300767cc231271aa100af","impliedFormat":1},{"version":"20aa818c3e16e40586f2fa26327ea17242c8873fe3412a69ec68846017219314","impliedFormat":1},{"version":"f498532f53d54f831851990cb4bcd96063d73e302906fa07e2df24aa5935c7d1","impliedFormat":1},{"version":"5fd19dfde8de7a0b91df6a9bbdc44b648fd1f245cae9e8b8cf210d83ee06f106","impliedFormat":1},{"version":"3b8d6638c32e63ea0679eb26d1eb78534f4cc02c27b80f1c0a19f348774f5571","impliedFormat":1},{"version":"ce0da52e69bc3d82a7b5bc40da6baad08d3790de13ad35e89148a88055b46809","impliedFormat":1},{"version":"9e01233da81bfed887f8d9a70d1a26bf11b8ddff165806cc586c84980bf8fc24","impliedFormat":1},{"version":"214a6afbab8b285fc97eb3cece36cae65ea2fca3cbd0c017a96159b14050d202","impliedFormat":1},{"version":"14beeca2944b75b229c0549e0996dc4b7863e07257e0d359d63a7be49a6b86a4","impliedFormat":1},{"version":"f7bb9adb1daa749208b47d1313a46837e4d27687f85a3af7777fc1c9b3dc06b1","impliedFormat":1},{"version":"c549fe2f52101ffe47f58107c702af7cdcd42da8c80afd79f707d1c5d77d4b6e","impliedFormat":1},{"version":"3966ea9e1c1a5f6e636606785999734988e135541b79adc6b5d00abdc0f4bf05","impliedFormat":1},{"version":"0b60b69c957adb27f990fbc27ea4ac1064249400262d7c4c1b0a1687506b3406","impliedFormat":1},{"version":"12c26e5d1befc0ded725cee4c2316f276013e6f2eb545966562ae9a0c1931357","impliedFormat":1},{"version":"27b247363f1376c12310f73ebac6debcde009c0b95b65a8207e4fa90e132b30a","impliedFormat":1},{"version":"05bd302e2249da923048c09dc684d1d74cb205551a87f22fb8badc09ec532a08","impliedFormat":1},{"version":"fe930ec064571ab3b698b13bddf60a29abf9d2f36d51ab1ca0083b087b061f3a","impliedFormat":1},{"version":"6b85c4198e4b62b0056d55135ad95909adf1b95c9a86cdbed2c0f4cc1a902d53","impliedFormat":1},{"version":"dbfa8af0021ddb4ddebe1b279b46e5bccf05f473c178041b3b859b1d535dd1e5","impliedFormat":1},{"version":"7ab2721483b53d5551175e29a383283242704c217695378e2462c16de44aff1a","impliedFormat":1},{"version":"ebafa97de59db1a26c71b59fa4ee674c91d85a24a29d715e29e4db58b5ff267d","impliedFormat":1},{"version":"16ba4c64c1c5a52cc6f1b4e1fa084b82b273a5310ae7bc1206c877be7de45d03","impliedFormat":1},{"version":"1538a8a715f841d0a130b6542c72aea01d55d6aa515910dfef356185acf3b252","impliedFormat":1},{"version":"68eeb3d2d97a86a2c037e1268f059220899861172e426b656740effd93f63a45","impliedFormat":1},{"version":"d5689cb5d542c8e901195d8df6c2011a516d5f14c6a2283ffdaae381f5c38c01","impliedFormat":1},{"version":"9974861cff8cb8736b8784879fe44daca78bc2e621fc7828b0c2cf03b184a9e5","impliedFormat":1},{"version":"675e5ac3410a9a186dd746e7b2b5612fa77c49f534283876ffc0c58257da2be7","impliedFormat":1},{"version":"951a8f023da2905ae4d00418539ff190c01d8a34c8d8616b3982ff50c994bbb6","impliedFormat":1},{"version":"f2d7b9458a51b24d6a39dcdebb446111cdaf3ebcc3f265671f860b6650c722fe","impliedFormat":1},{"version":"955c80622de0580d047d9ccdb1590e589c666c9240f63d2c5159e0732ab0a02e","impliedFormat":1},{"version":"e4b31fc1a59b688d30ff95f5a511bfb05e340097981e0de3e03419cbefe36c0e","impliedFormat":1},{"version":"16a2ac3ba047eddda3a381e6dac30b2e14e84459967f86013c97b5d8959276f3","impliedFormat":1},{"version":"45f1c5dbeb6bbf16c32492ba182c17449ab18d2d448cc2751c779275be0713d8","impliedFormat":1},{"version":"23d9f0f07f316bc244ffaaec77ae8e75219fb8b6697d1455916bc2153a312916","impliedFormat":1},{"version":"eac028a74dba3e0c2aa785031b7df83586beab4efce9da4903b2f3abad293d3a","impliedFormat":1},{"version":"8d22beed3e8bbf57e0adbc986f3b96011eef317fd0adadccd401bcb45d6ee57e","impliedFormat":1},{"version":"3a1fc0aae490201663c926fde22e6203a8ac6aa4c01c7f5532d2dcdde5b512f5","impliedFormat":1},{"version":"cb7dc2db9e286cfc107b3d90513a0e24276a7f0474059c2694ec3b37a3093426","impliedFormat":1},{"version":"53f751014cc08afeae6c3199b89b0ab0718e4f97da8b7845c5b2333748277938","impliedFormat":1},{"version":"a7f590406204026bf49d737edb9d605bb181d0675e5894a6b80714bbc525f3df","impliedFormat":1},{"version":"533039607e507410c858c1fa607d473deacb25c8bf0c3f1bd74873af5210e9a0","impliedFormat":1},{"version":"b09561e71ae9feab2e4d2b06ceb7b89de7fad8d6e3dc556c33021f20b0fb88c4","impliedFormat":1},{"version":"dd79d768006bfd8dd46cf60f7470dca0c8fa25a56ac8778e40bd46f873bd5687","impliedFormat":1},{"version":"4daacd053dd57d50a8cdf110f5bc9bb18df43cd9bcc784a2a6979884e5f313de","impliedFormat":1},{"version":"d103fff68cd233722eea9e4e6adfb50c0c36cc4a2539c50601b0464e33e4f702","impliedFormat":1},{"version":"3c6d8041b0c8db6f74f1fd9816cd14104bcd9b7899b38653eb082e3bdcfe64d7","impliedFormat":1},{"version":"4207e6f2556e3e9f7daa5d1dd1fdaa294f7d766ebea653846518af48a41dd8e0","impliedFormat":1},{"version":"c94b3332d328b45216078155ba5228b4b4f500d6282ac1def812f70f0306ed1c","impliedFormat":1},{"version":"43497bdd2d9b53afad7eed81fb5656a36c3a6c735971c1eed576d18d3e1b8345","impliedFormat":1},{"version":"5db2d64cfcfbc8df01eda87ce5937cb8af952f8ba8bbc8fd2a8ef10783614ca7","impliedFormat":1},{"version":"b13319e9b7e8a9172330a364416d483c98f3672606695b40af167754c91fa4ec","impliedFormat":1},{"version":"7f8a5e8fc773c089c8ca1b27a6fea3b4b1abc8e80ca0dd5c17086bbed1df6eaa","impliedFormat":1},{"version":"0d54e6e53636877755ac3e2fab3e03e2843c8ca7d5f6f8a18bbf5702d3771323","impliedFormat":1},{"version":"124b96661046ec3f63b7590dc13579d4f69df5bb42fa6d3e257c437835a68b4d","impliedFormat":1},{"version":"55c757a58282956c14fcad649c4221f02c4455b401f5b1011f8b921cbc2da80e","impliedFormat":1},{"version":"724775a12f87fc7005c3805c77265374a28fb3bc93c394a96e2b4ffee9dde65d","impliedFormat":1},{"version":"30ae46aab3d5a05c1a4c7144bc357621c81939dd5c0b11090f69e2b1c43c6f01","impliedFormat":1},{"version":"20064a8528651a0718e3a486f09a0fd9f39aaca3286aea63ddeb89a4428eab2b","impliedFormat":1},{"version":"743da6529a5777d7b68d0c6c2b006800d66e078e3b8391832121981d61cd0abc","impliedFormat":1},{"version":"f87c199c9f52878c8a2f418af250ccfc80f2419d0bd9b8aebf4d4822595d654f","impliedFormat":1},{"version":"57397be192782bd8bedf04faa9eea2b59de3e0cfa1d69367f621065e7abd253b","impliedFormat":1},{"version":"df9e6f89f923a5e8acf9ce879ec70b4b2d8d744c3fb8a54993396b19660ac42a","impliedFormat":1},{"version":"175628176d1c2430092d82b06895e072176d92d6627b661c8ea85bee65232f6e","impliedFormat":1},{"version":"21625e9b1e7687f847a48347d9b77ce02b9631e8f14990cffb7689236e95f2bb","impliedFormat":1},{"version":"483fad2b4ebaabd01e983d596e2bb883121165660060f498f7f056fecd6fb56a","impliedFormat":1},{"version":"6a089039922bf00f81957eafd1da251adb0201a21dcb8124bcfed14be0e5b37d","impliedFormat":1},{"version":"6cd1c25b356e9f7100ca69219522a21768ae3ea9a0273a3cc8c4af0cbd0a3404","impliedFormat":1},{"version":"201497a1cbe0d7c5145acd9bf1b663737f1c3a03d4ecffd2d7e15da74da4aaf1","impliedFormat":1},{"version":"66e92a7b3d38c8fa4d007b734be3cdcd4ded6292753a0c86976ac92ae2551926","impliedFormat":1},{"version":"a8e88f5e01065a9ab3c99ff5e35a669fdb7ae878a03b53895af35e1130326c15","impliedFormat":1},{"version":"05a8dfa81435f82b89ecbcb8b0e81eb696fac0a3c3f657a2375a4630d4f94115","impliedFormat":1},{"version":"5773e4f6ac407d1eff8ef11ccaa17e4340a7da6b96b2e346821ebd5fff9f6e30","impliedFormat":1},{"version":"c736dd6013cac2c57dffb183f9064ddd6723be3dfc0da1845c9e8a9921fc53bb","impliedFormat":1},{"version":"7b43949c0c0a169c6e44dcdf5b146f5115b98fa9d1054e8a7b420d28f2e6358f","impliedFormat":1},{"version":"b46549d078955775366586a31e75028e24ad1f3c4bc1e75ad51447c717151c68","impliedFormat":1},{"version":"34dd068c2a955f4272db0f9fdafb6b0871db4ec8f1f044dfc5c956065902fe1c","impliedFormat":1},{"version":"e5854625da370345ba85c29208ae67c2ae17a8dbf49f24c8ed880c9af2fe95b2","impliedFormat":1},{"version":"cf1f7b8b712d5db28e180d907b3dd2ba7949efcfec81ec30feb229eee644bda4","impliedFormat":1},{"version":"2423fa71d467235a0abffb4169e4650714d37461a8b51dc4e523169e6caac9b8","impliedFormat":1},{"version":"4de5d28c3bc76943453df1a00435eb6f81d0b61aa08ff34ae9c64dd8e0800544","impliedFormat":1},{"version":"659875f9a0880fb4ae1ce4b35b970304d2337f98fe6f2e4671567d7292780bae","impliedFormat":1},{"version":"82edb64fbe335cd21f16bcf50248e107f201e3e09ebc73b28640c28c958067c9","impliedFormat":1},{"version":"9593de9c14310da95e677e83110b37f1407878352f9ebe1345f97fc69e4b627c","impliedFormat":1},{"version":"e009f9f511db1a215577f241b2dc6d3f9418f9bc1686b6950a1d3f1b433a37ff","impliedFormat":1},{"version":"caa48f3b98f9737d51fabce5ce2d126de47d8f9dffeb7ad17cd500f7fd5112e0","impliedFormat":1},{"version":"64d15723ce818bb7074679f5e8d4d19a6e753223f5965fd9f1a9a1f029f802f7","impliedFormat":1},{"version":"2900496cc3034767cd31dd8e628e046bc3e1e5f199afe7323ece090e8872cfa7","impliedFormat":1},{"version":"ba74ef369486b613146fa4a3bccb959f3e64cdc6a43f05cc7010338ba0eab9f7","impliedFormat":1},{"version":"a22bbe0aeceec1dc02236a03eee7736760ecd39de9c8789229ce9a70777629bb","impliedFormat":1},{"version":"a9afefcb7d0c9a89ec666cc7cccc7275f6a06b5114dd15aa2654e9e19c43b7c1","impliedFormat":1},{"version":"c477c9c6003e659d5aad681acd70694176d4f88fc16cc4c5bcfa5b8dcc01874b","impliedFormat":1},{"version":"ca2ebe3f3791275d3287eed417660b515eb4d171f0b7badcfa95f0f709b149f7","impliedFormat":1},{"version":"b4fa8bc7aeb4d1fc766f29e7f62e1054a01ac1eb115c05a7f07afa51e16668ff","impliedFormat":1},{"version":"e2a4983a141f4185996e1ab3230cb24754c786d68434f2e7659276c325f3c46c","impliedFormat":1},{"version":"b2216c0b4c7f32e7e9bba74d0223fc9ad3bec50b71663701d60578cecc323fb5","impliedFormat":1},{"version":"1cbbd9272af325d7189d845c75bbdb6d467ce1691afe12bcb9964e4bd1270e66","impliedFormat":1},{"version":"86eb11b1e540fe07b2ebfc9cca24c35b005f0d81edf7701eaf426db1f5702a07","impliedFormat":1},{"version":"1a12da23f2827e8b945787f8cc66a8f744eabf3d3d3d6ba7ad0d5dfeeb5dfbb4","impliedFormat":1},{"version":"67cbde477deac96c2b92ccb42d9cf21f2a7417f8df9330733643cc101aa1bca5","impliedFormat":1},{"version":"2cb440791f9d52fa2222c92654d42f510bf3f7d2f47727bf268f229feced15ba","impliedFormat":1},{"version":"5bb4355324ea86daf55ee8b0a4d0afdef1b8adadc950aab1324c49a3acd6d74e","impliedFormat":1},{"version":"64e07eac6076ccb2880461d483bae870604062746415393bfbfae3db162e460a","impliedFormat":1},{"version":"5b6707397f71e3e1c445a75a06abf882872d347c4530eef26c178215de1e6043","impliedFormat":1},{"version":"c74d9594bda9fe32ab2a99010db232d712f09686bbee66f2026bc17401fe7b7e","impliedFormat":1},{"version":"15bbb824c277395f8b91836a5e17fedc86f3bb17df19dcdc5173930fd50cc83e","impliedFormat":1},{"version":"1c94de96416c02405da00d8f7bde9d196064c3ce1464f0c4df1966202196b558","impliedFormat":1},{"version":"406cc85801b49efd5f75c84cc557e2bba9155c7f88c758c3fadd4e844ad6b19e","impliedFormat":1},{"version":"6d235f62eb41ac4010a0dab8ba186c20dec8565f42273a34f0fa3fc3ca9d0dbb","impliedFormat":1},{"version":"f7663954884610aeb38c78ffd22525749fab19ab5e86e4a53df664180efd1ff5","impliedFormat":1},{"version":"4ac0045aa4bc48b5f709da38c944d4fec2368eda6b67e4dd224147f3471b7eaf","impliedFormat":1},{"version":"1d2d7636e3c6906a5d368ab0bab53df39e2a6f99c284bae4625b6445c1d799e7","impliedFormat":1},{"version":"9555a2d83e46b47c5b72de5637b2afad68b28670deacdb3b514267d780b5423c","impliedFormat":1},{"version":"3e717eef40648a7d8895219063b1e5cb5bcc404bc1d41a22b91f3140b83bce1d","impliedFormat":1},{"version":"9b61c06ab1e365e5b32f50a56c0f3bb2491329bb3cd2a46e8caa30edcf0281cc","impliedFormat":1},{"version":"8f91df3614625daa000bffe84a5c1939b4da0254db9d7c62764f916ebb93dcdc","impliedFormat":1},{"version":"ee745db646de4c5cf019e495ff5d800ed6f4ee9d9b3aaa7b2c5ca836928bc80e","impliedFormat":1},{"version":"d8d808ab0c5c550fb715641e1f5813dededa9b657e7ed3c3a6665ce7f629273d","impliedFormat":1},{"version":"059a7dfc70b0e875ef87a961d1e9b69917a32a6eea1c3950a5aad8c62d8274aa","impliedFormat":1},{"version":"cf575b64fadf5f646c0f715730c490f317f856f5b3bbe06493638576bad711d9","impliedFormat":1},{"version":"d260a7eae2f0f643fe2de133cfa3e7d035e9e787cb88119f9628099d4039609c","impliedFormat":1},{"version":"6306621db4fbb1c1e79883599912c32da2c5974402531b47a2cf2c19ce61200e","impliedFormat":1},{"version":"a4f50263cd9ef27fcb0ab56c7214ffca3a0871f93ddd3dfb486bfa07aeed55ef","impliedFormat":1},{"version":"f263db23ce0b198ab373032126d83eb6bcd9a70c1f08048e7770dac32297d9b5","impliedFormat":1},{"version":"f6ff0d0ac0bf324dd366aadf72c5458da333fbd44aa1dae825507be3b3b6ccdc","impliedFormat":1},{"version":"aa8f659712fd02d08bdf17d3a93865d33bd1ee3b5bcf2120b2aa5e9374a74157","impliedFormat":1},{"version":"5a06765319ef887a78dd42ca5837e2e46723525b0eaa53dd31b36ba9b9d33b56","impliedFormat":1},{"version":"27bf29df603ae9c123ffd3d3cfd3b047b1fa9898bf04e6ab3b05db95beebb017","impliedFormat":1},{"version":"acd5aa42ea02c570be5f7fa35451cc9844b3b8c1d66d3e94aa4875ec868ac86e","impliedFormat":1},{"version":"4278526ea26849feb706bbc4cda029b6fd99dd8875fb58daeeca02b346bbdbb4","impliedFormat":1},{"version":"9d1c3fe1639a48bfd9b086b8ae333071f7da60759344916600b979b7ed6ffaa6","impliedFormat":1},{"version":"8b3d89d08a132d7a2549ac0a972af3773f10902908a96590b3fe702c325a80ec","impliedFormat":1},{"version":"450040775fe198d9bf87cf57ca398d1d2e74b4f84bca6e5dbf0b73217cf9004b","impliedFormat":1},{"version":"98ee8fe92810ad706b1bfb06441bee284b62c07175ae9ba875589043d0836086","impliedFormat":1},{"version":"49cfd2c983594c18fe36f64c82d5e1282fd5d42168e925937345ef927b07f073","impliedFormat":1},{"version":"07ea97f8e11cedfb35f22c5cab2f7aacd8721df7a9052fb577f9ba400932933b","impliedFormat":1},{"version":"66ab54a2a098a1f22918bd47dc7af1d1a8e8428aa9c3cb5ef5ed0fef45a13fa4","impliedFormat":1},{"version":"ad81f30f47f1ab2bb5528b97c1e6e4dab5e006413925052f4573a30bf4a632bd","impliedFormat":1},{"version":"ff3f1d258bd14ca6bbf7c7158580b486d199e317fc4c433f98f13b31e6bb5723","impliedFormat":1},{"version":"a3f1cac717a25f5b8b6df9deef8fc8d0a0726390fdaa83aed55be430cd532ebf","impliedFormat":1},{"version":"bf22ee38d4d989e1c72307ab701557022e074e66940cf3d03efa9beb72224723","impliedFormat":1},{"version":"68ce7df3ae5d096597107619d2507ef4e86a641c0371f88a4a6fa0adac6cb461","impliedFormat":1},{"version":"f1a1edb271da27e2d8925a68db1eb8b16d8190037eb44a324b826e54f97e315f","impliedFormat":1},{"version":"1553d16fb752521327f101465a3844fe73684503fdd10bed79bd886c6d72a1bc","impliedFormat":1},{"version":"271119c7cbd09036fd8bd555144ec0ea54d43b59bcb3d8733995c8ef94cb620b","impliedFormat":1},{"version":"5a51eff6f27604597e929b13ee67a39267df8f44bbd6a634417ed561a2fa05d6","impliedFormat":1},{"version":"1f93b377bb06ed9de4dc4eb664878edb8dcac61822f6e7633ca99a3d4a1d85da","impliedFormat":1},{"version":"53e77c7bf8f076340edde20bf00088543230ba19c198346112af35140a0cfac5","impliedFormat":1},{"version":"6e0f9298ff05cc206fe1ec45fd2b55a8d93d4136b0d75b395c73968814d7c5ba","impliedFormat":1},{"version":"53f751014cc08afeae6c3199b89b0ab0718e4f97da8b7845c5b2333748277938","impliedFormat":1},{"version":"68888ec4d4cff782a03aebc26ddc821e1f4dffb3a22940164eff67371997add6","impliedFormat":1},{"version":"c9018ca6314539bf92981ab4f6bc045d7caaff9f798ce7e89d60bb1bb70f579c","impliedFormat":1},{"version":"d74c5b76c1c964a2e80a54f759de4b35003b7f5969fb9f6958bd263dcc86d288","impliedFormat":1},{"version":"b83a3738f76980505205e6c88ca03823d01b1aa48b3700e8ba69f47d72ab8d0f","impliedFormat":1},{"version":"01b9f216ada543f5c9a37fbc24d80a0113bda8c7c2c057d0d1414cde801e5f9d","impliedFormat":1},{"version":"f1e9397225a760524141dc52b1ca670084bde5272e56db1bd0ad8c8bea8c1c30","impliedFormat":1},{"version":"08c43afe12ba92c1482fc4727aab5f788a83fd49339eb0b43ad01ed2b5ad6066","impliedFormat":1},{"version":"6066b918eb4475bfcce362999f7199ce5df84cea78bd55ed338da57c73043d45","impliedFormat":1},{"version":"5fd5d02d1ec7d48a180deaefcfec819c364ec4ffddd1371ec2c7ad9d36e8220f","impliedFormat":1},{"version":"e39514fc08fdedd95766643609b0ede54386156196d79a2d9d49247fb4406dcd","impliedFormat":1},{"version":"e4a4e40e8bc24425e03de8f002c62448dbaefe284278c0a1d93af2bfd2b528c2","impliedFormat":1},{"version":"4e6fc96724557945de42c1c5d64912ebd90d181358e1e58cce4bbf7b7b24d422","impliedFormat":1},{"version":"8fa21591f8689152157c9e3449ac95391fe5f31a9770a58bf9c0e4f5ee0d4af3","impliedFormat":1},{"version":"ac8582e453158a1e4cccfb683af8850b9d2a0420e7f6f9a260ab268fc715ab0d","impliedFormat":1},{"version":"c80aa3ff0661e065d700a72d8924dcec32bf30eb8f184c962da43f01a5edeb6f","impliedFormat":1},{"version":"837f5c12e3e94ee97aca37aa2a50ede521e5887fb7fa89330f5625b70597e116","impliedFormat":1},{"version":"617490cbb06af111a8aa439594dc4df493b20bbf72acc43a63ceade3d0d71e2a","impliedFormat":1},{"version":"eb34b5818c9f5a31e020a8a5a7ca3300249644466ef71adf74e9e96022b8b810","impliedFormat":1},{"version":"cdec09a633b816046d9496a59345ad81f5f97c642baf4fe1611554aa3fbf4a41","impliedFormat":1},{"version":"5b933c1b71bff2aa417038dabb527b8318d9ef6136f7bd612046e66a062f5dbf","impliedFormat":1},{"version":"b94a350c0e4d7d40b81c5873b42ae0e3629b0c45abf2a1eeb1a3c88f60a26e9a","impliedFormat":1},{"version":"231f407c0f697534facae9ca5d976f3432da43d5b68f0948b55063ca53831e7c","impliedFormat":1},{"version":"188857be1eebad5f4021f5f771f248cf04495e27ad467aa1cf9624e35346e647","impliedFormat":1},{"version":"d0a20f432f1f10dc5dbb04ae3bee7253f5c7cee5865a262f9aac007b84902276","impliedFormat":1},{"version":"40a2c0b501a4900e65a2e59f7f8ae782d74b6458c39a5dd512fafc4afea4b227","impliedFormat":1},{"version":"fe813b617b31f69f766540ac6ab54a32ed775693275bd3230521c7c851f44bef","impliedFormat":1},{"version":"653821fdae3a5ac749562b20cdc15ba9028dc8d27cf359ecd90899969f084759","impliedFormat":1},{"version":"7de84da9deb32a2975ae18d9d4edbd36165da8b7508f0d82b0bfa4724392055e","impliedFormat":1},"d1a53728962013cb51f1e5a0acc1d95c6153e8597ead3181fb8cc6eb9d2435a5","7fc420576828e99a6bd398322b67753e5c809f415fbc8cf55e00ccc7e0146ea9","af2cea0d632c95e7847e9cc13ad8a7d861c65b358285520a9b1a54f7f59c3bd1",{"version":"2b380e755f855f957b2ec9d4ee3570599eab16cae133f273305909daff84ee7e","impliedFormat":99},"c6af31d5c31c5c8937fba25b308a8b02fc0174ffd0c4e678fe386140f7328759","15bff23afbb31a4818ba5fa25a72b69a5963eed2921882a9691026bd9373a699","af0a27a3fcb042fa142f86e3d5fefc3aa4628fc58ac8d4d3a20e4a8c9339d324","cdfbf9a986ea50bd671acbd1804240a6e601895ba204c125480ca0c615f9496e","abbee9870f3923a9b923d6e8dddc04e6f5318181f1e114d30b0fc78cf6acee65","e9d9aec69f6f2eda754285590c6717b1af5d39598e8a0724f0d237fe35c54ee4","4d590f16959c1b89b3a03851cfc0bf6d20e7152f7101716bec05ff703238375c","4fdeb200c10e4e01212f82431eec9eeec54104859c0512f41406233c37affe9b","c856cbcf0aa0290d98bc545205d4f60ebe9d5d96695194c7fabd663bec999fa9","dc989943360d2aee9ee8ca32e0c479fa8ffe720f4152200d45106f79ef70a84c","b6f10db262631e0d90cd6364ec41d632399befd719dfc441900b87e0d739136a","912a5f9652b41b444079db9c49df9b8166e1570a1d46729e7a57f57fcc2dd363","adba09d567197b519a1ca69af2c76a99d668970eb58612fb911fb6954ac9f8e5",{"version":"f3a68054f682f21cec1eb6bc37d3c4c7f73b7723c7256f8a1ccc75873024aaa6","affectsGlobalScope":true,"impliedFormat":1},"40b31155c6d6c917bccecb36ddf7a8f9fa22072be87e9129a7d7cae1cbd85fd6","aed1b36aa530b27a84c1a0dfc5326aca26deaf3fa46942784766239109be0e78","fa85d0644d4079439561aa67e22b7f53d42f017d62f4f4f24449a8038c513524","3ae650d1d4cda07d78de5eb9667bb615dd702b6ea82ba9e6d62db3c84403987e","bb89b6323c958b987a5214bea3a8e250d87bd93695d5b467ae9bcbd463618b9a","446f7f4c19df27c851924112724b09e35146ce709ea33eca3db91bff1f1fe6ae","afe399d8e08a0e7ca48343311861e1ee8c903ab1d0897df980f83ebdbaa18109","00bfcf8865fbd860d07117659e68176ecd63de878661d6fdb84fb26565606806","3cd1b01e3a24a0223a4f246d7b43f7f48b209efcb4a46442d937151798f18e3d","8ada852b26a2a63b56b9427bb862e0b41c6cbd645ea71f93732574d8687487c2","72d1eac401d767f62a91af31e4a9e4c1cafaf096cddc89cf20736294aad8d1c6","b6983748e9b7a2380c06afb91d879273f8f3cc1232e57f8b964ccaf98d573b8e","d4b01b8291dc39f4f7dfea5a8b287a35b4716e5409aba673fe5286b394fad434","f7211dee68092ad76743bb1c299552b3abf8cc94036b8f2ccbbf486f82b2c18c","c685d17991d61a02ebc436c3f71ebdbe2cbfe7e34cd14c49a975b0b89931ff6b","a1bd5cd1762222cac0c05ed0d4913b3ba46e07a34675a95457e826375de61f87","508be7cab0e1bd582d643f4cd2bb87065e0ed14f2e62ef83626bf82270ba1175","76d2ffc6cd46699832b17735163a9f28661570a917a23da637e48b7863e5b00b","6e6c8146bc0eb8cf97f5992ca8b16ba106b370a8d53a9eb0f9814b9f3ae5f0f8","50f1d052a90009028172d394c8130a8ac0b4dfd929cff9ebe07284026178a334","f0c6cc31988874db2c437d46691bbdaee84fc59e920df7f3bab9873cbc320413","e311068286a8299e5beb014d9e0c18ec054ddbc2ed6086b16c072e489905bde7",{"version":"6ff4c27ce1c30040730481cab949bf344938252c250111642ae5e12c51de8324","impliedFormat":1},{"version":"bdd14f07b4eca0b4b5203b85b8dbc4d084c749fa590bee5ea613e1641dcd3b29","impliedFormat":99},{"version":"309ebd217636d68cf8784cbc3272c16fb94fb8e969e18b6fe88c35200340aef1","impliedFormat":1},{"version":"91cf9887208be8641244827c18e620166edf7e1c53114930b54eaeaab588a5be","impliedFormat":1},{"version":"ef9b6279acc69002a779d0172916ef22e8be5de2d2469ff2f4bb019a21e89de2","impliedFormat":1},{"version":"71623b889c23a332292c85f9bf41469c3f2efa47f81f12c73e14edbcffa270d3","affectsGlobalScope":true,"impliedFormat":1},{"version":"88863d76039cc550f8b7688a213dd051ae80d94a883eb99389d6bc4ce21c8688","impliedFormat":1},{"version":"e9ce511dae7201b833936d13618dff01815a9db2e6c2cc28646e21520c452d6c","impliedFormat":1},{"version":"243649afb10d950e7e83ee4d53bd2fbd615bb579a74cf6c1ce10e64402cdf9bb","impliedFormat":1},{"version":"35575179030368798cbcd50da928a275234445c9a0df32d4a2c694b2b3d20439","impliedFormat":1},{"version":"c939cb12cb000b4ec9c3eca3fe7dee1fe373ccb801237631d9252bad10206d61","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"03268b4d02371bdf514f513797ed3c9eb0840b0724ff6778bda0ef74c35273be","impliedFormat":1},{"version":"3511847babb822e10715a18348d1cbb0dae73c4e4c0a1bcf7cbc12771b310d45","impliedFormat":1},{"version":"80e653fbbec818eecfe95d182dc65a1d107b343d970159a71922ac4491caa0af","impliedFormat":1},{"version":"53f00dc83ccceb8fad22eb3aade64e4bcdb082115f230c8ba3d40f79c835c30e","impliedFormat":1},{"version":"35475931e8b55c4d33bfe3abc79f5673924a0bd4224c7c6108a4e08f3521643c","impliedFormat":1},{"version":"9078205849121a5d37a642949d687565498da922508eacb0e5a0c3de427f0ae5","impliedFormat":1},{"version":"e8f8f095f137e96dc64b56e59556c02f3c31db4b354801d6ae3b90dceae60240","impliedFormat":1},{"version":"451abef2a26cebb6f54236e68de3c33691e3b47b548fd4c8fa05fd84ab2238ff","impliedFormat":1},{"version":"6042774c61ece4ba77b3bf375f15942eb054675b7957882a00c22c0e4fe5865c","impliedFormat":1},{"version":"41f185713d78f7af0253a339927dc04b485f46210d6bc0691cf908e3e8ded2a1","impliedFormat":1},{"version":"23ee410c645f68bd99717527de1586e3eb826f166d654b74250ad92b27311fde","impliedFormat":1},{"version":"ffc3e1064146c1cafda1b0686ae9679ba1fb706b2f415e057be01614bf918dba","impliedFormat":1},{"version":"995869b1ddf66bbcfdb417f7446f610198dcce3280a0ae5c8b332ed985c01855","impliedFormat":1},{"version":"58d65a2803c3b6629b0e18c8bf1bc883a686fcf0333230dd0151ab6e85b74307","impliedFormat":1},{"version":"e818471014c77c103330aee11f00a7a00b37b35500b53ea6f337aefacd6174c9","impliedFormat":1},{"version":"dca963a986285211cfa75b9bb57914538de29585d34217d03b538e6473ac4c44","impliedFormat":1},{"version":"d8bc0c5487582c6d887c32c92d8b4ffb23310146fcb1d82adf4b15c77f57c4ac","impliedFormat":1},{"version":"8cb31102790372bebfd78dd56d6752913b0f3e2cefbeb08375acd9f5ba737155","impliedFormat":1},{"version":"56e0775830b68d13c3d7f4ec75df7d016db6b879ef9676affb5233a9a289c192","impliedFormat":99},{"version":"674a33f32b61b48c020697b749b39fb291fd7d0b5464464abfc174d35225049c","impliedFormat":1},{"version":"42525bf6c7710388366fabfe747f767a1d08df9373ab7b6937424cda396fda8d","impliedFormat":1},{"version":"647ffb0ed0a58963ab56c76004df28e5bcb5bad1d06293d39f474ca325ff9a9c","affectsGlobalScope":true,"impliedFormat":1},"507422974498c1995798f8fa923b410cff5a40f1981ad0e6136888aab4329dc2","4f866c4ae6cb7a594911232c179f58d1db0e8993a2e24e09a872c85faaea62a8","1411f9c20dec3a86155bb76aa8639616c64dca47a22229bd660872461ff985fc","79b2e412cdfd6000047cab56c90609ae7b255f46c049358791e118b045457358","43ee5b8d82903000c558e42507a38976e12d2e092e51bdc731b715ceebe53e5c","80238eada28434d72ec193b40a670dcb7c2073b9b995c2cd82f33e660faf0afb","a417268f3ebecdb57ab5844a5f973ceb4b4bc3b53570ebad1a69c26b08a0ce00","56954eabe3938518a9568c2c1e020e379cb97bd66e045cadbaacac75fd30c638","865fb8d90bef93bc2ad4cdf2dbaa2d4df42c5f37a45dbd371c60b4cc6d84240c","0284b6844bf09cdd426d2264b9c9acd5583b14de46cc516efbd7bb905bdeeb3c","8d22c699e5c1ab4372a5977f8b7cf7e2e41f49e21a8a13f2b0a663a5be1f3237","6c2ff386ab3a3cd1e071c276a2907161bc26677cb72490876155200624b95e2a","b17655b74bc42fac0ee8e584c50c551d0f8c9a7ebfb935ffb9165a4748c72cd4","f6e5a96c228a137a20438d56d604d6e06f1abc9bd3eff587237b06ab17c3a3e5",{"version":"005f10cafe0939ae8d6a98e19c4ddf8b59faf3f9ae38dfa5907b82b9a6cb4de9","impliedFormat":1},{"version":"089c056ad8ecb34ee72cb831491ab72c214d8fb7ecf94b96a1b4736ab54397a1","impliedFormat":1},{"version":"e643ef3093cba63af26396ae8dc58dc542c241027749dcdf715f3d3209f79a03","impliedFormat":1},{"version":"f40e6338b8137033a5b4efbe01de45a4399f2c304648eace01d852cd05eb861e","impliedFormat":1},{"version":"89d879fae02696e226dbcb7444d6153158fa264bb646071988f19a2e422b314f","impliedFormat":1},{"version":"57de3f0b1730cf8439c8aa4686f78f38b170a9b55e7a8393ae6f8a524bb3ba5a","impliedFormat":1},{"version":"e933bd300ea4f6c724d222bf2d93a0ae2b1e748baa1db09cb71d67d563794b2d","impliedFormat":1},{"version":"c43d0df83d8bb68ab9e2795cf1ec896ff1b5fab2023c977f3777819bc6b5c880","impliedFormat":1},{"version":"bf810d50332562d1b223a7ce607e5f8dc42714d8a3fa7bf39afe33830e107bf7","impliedFormat":1},{"version":"f025aff69699033567ebb4925578dedb18f63b4aa185f85005451cfd5fc53343","impliedFormat":1},{"version":"3d36c36df6ce6c4c3651a5f804ab07fe1c9bb8ce7d40ef4134038c364b429cb3","impliedFormat":1},{"version":"e9243dd3c92d2c56a2edf96cbce8faf357caf9397b95acaa65e960ad36cb7235","impliedFormat":1},{"version":"a24a9c59b7baecbb85c0ace2c07c9c5b7c2330bb5a2ae5d766f6bbf68f75e727","impliedFormat":1},{"version":"3c264d6a0f6be4f8684cb9e025f32c9b131cca7199c658eea28f0dae1f439124","impliedFormat":1},{"version":"d3cd789b0eebd5cebde1404383fd32c610bec782c74a415aa05ab3593abc35c8","impliedFormat":1},{"version":"8c1babb42f52952a6593b678f4cfb4afea5dc91e5cfaf3ca922cdd2d23b1277a","impliedFormat":1},{"version":"04ebb965333800caba800cabd1e18b02e0e69ab6a6f8948f2d53211df00a193c","impliedFormat":1},{"version":"f8e2be107b3e756e0a1c4f5e195e69dce69d38d0ff5c0b0509933e970c6d915b","impliedFormat":1},{"version":"309e580094520f9675a85c406ab5d1de4735f74a38f36690d569dbc5341f36a8","impliedFormat":1},{"version":"c2fa79fd37e4b0e4040de9d8db1b79accb1f8f63b3458cd0e5dac9d4f9e6f3f1","impliedFormat":1},{"version":"4f0d1a7e2a5a8b85d69f60a7be2a6223827f5fec473ba2142279841a54e8a845","impliedFormat":1},{"version":"ae2fb62b3647083fe8299e95dbfab2063c8301e9a626f42be0f360a57e434797","impliedFormat":1},{"version":"f53d803d9c9c8acdbb82ef5c6b8f224d42be50e9ab8bc09c8a9a942717214f9a","impliedFormat":1},{"version":"d2d70166533a2233aa35977eecea4b08c2f0f2e6e7b56c12a1c613c5ebf2c384","impliedFormat":1},{"version":"1097820fae2d12eb60006de0b5d057105e60d165cf8a6e6125f9876e6335cde7","impliedFormat":1},{"version":"8f62905f50830a638fd1a5ff68d9c8f2c1347ff046908eeb9119d257e8e8ae4a","impliedFormat":1},{"version":"8b4d34279952175f972f1aa62e136248311889148eb40a3e4782b244cece09f3","impliedFormat":1},{"version":"d3c3cc0840704fe524dbe8a812290bfd303e43d3bd43dcaac83ee682d2e15be0","impliedFormat":1},{"version":"71725ba9235f9d2aa02839162b1df2df59fd9dd91c110a54ea02112243d7a4d9","impliedFormat":1},{"version":"80af0c272dcb64518f7768428cdf91d21966a7f24ed0dfc69fad964d4c2ed8c1","impliedFormat":1},{"version":"1dc9702aa16e3ada78c84aa96868a7e5502001c402918b6d85ed25acbe80fd51","impliedFormat":1},{"version":"35f891c1bc36c97469df06316c65a718956515c8b3bdbeb146b468c02493ef13","impliedFormat":1},{"version":"2e9b05d7db853315f44d824e13840e6fdf17d615d13170b5f5cf830442018dcd","impliedFormat":1},"345d0f7dbebecb1843ef283926e994a473dc4fdb84f8a668b88c60ef2fe6bad4","f03d09e6f9f9523872ccee06d169ac12bdad6a8ae2ff6db92385e94301fbcb59","d1a95ebb4247eb7b119df89a3bb5b3a7ac9d14c231cf82bc0d26d471102b3493","ecfc872a9e113495ddcefde166daa014b684421d8eb6b32c4d8b7eb69d62c8e5","8f0fa2e78a78061eaf5bb9052d7c0d4302491a4e52d59fa16433c3ebeb9e9ca6","30fc3185627a03fc5a53ea11bc3523fe5295f1ed4789e8bf8cb53527eb48b8b4","01c2e7a9a9742ce92edb9b010db5dd35dbb6cec8f3c4d329d2e55a0eb3d9be97","d1791f5ae199333c9ca4768e4cb760df60a0931c234c9bd2b152e558c097ab82","7d552b80517fcd021070915c56f551ee9e97bb672ad72e761b09c21a5653bf40","c87fa362258d634377b66dc8f9a0af79b72dc7cc11806a0369cb4d9f9249aa33","17a2fd9ddc4acd51e091be88bb7cfc00592e79d678b4e050eecf8f737d70af85","12614011f8dd0227a017d13c50107c6e70668281a03de485d3cb06d36ba1b7c6","b2b83060dafefdc1f57ec755f01392a2804e524a6b2596d6362728475817b038",{"version":"3d3f231253f223bc6f91e66580f5d5fe64e5865dd0bd7ae8f8943959b2008fe2","signature":"b3d48de3904366d123d72ba6997173c4d74c7d2a795c8b6524651f8b62382486"},{"version":"7b913a20d87a73bcc5f33442279d56961587aac619288cc016035c0bbf6bd207","signature":"166c908cd6ec80bcc1672cd460c6d3ee4f513e5f63fddde0d88f7c1667382c41"},{"version":"b13d1a6f68def12b55210e34976052abb6345c86c187cad18f8242343160028a","signature":"ded58581ec8f2085eb81ce11a81035eff2ed319df5f851bdb92dcf7693e3d9d9"},{"version":"a47bb58302fb55129b2ba3c4b6b732e75590329e5dfbf17b0ab461505240649f","signature":"3e51bca7f258a6b404e62a63344c8e7fa17a18a6c87fe557854ac8f569fb0f4d"},{"version":"043eb573f7b1df4ca41887ce9cc519e58756a5ab47f962869cf4caf1da95bdeb","signature":"8dc9d7303881489e92f283d9f4ba458d1d4863cb3e57339a086d60ee2cc587b6"},{"version":"081e6daa6f7694652e62c111b09bbcb59f0708a47bd0d0b18a4a3a68804c1c2e","signature":"509db6f6640dff95e8c62da30831cdfdb6a0b2eeca6d33311298a7e92b59ca10"},{"version":"8f0307f8027e1a867f7942821a4921894831dada48af9df9d0096bfc27553c9e","signature":"1b52a891424f7b8b43a1b39b68f819989b7af55f35b1691f47076dc77016ea5f"},{"version":"91d5ad7754cb7b8b765ba6bace1a258e413c33b0113d6e5813786d77d1c7a50b","impliedFormat":1},{"version":"0c1b648b5145969bdd8d46b1a2c081fc14fc08942248047f1897ddab196fe22d","signature":"a2178d05b33e0edddff09bdc0dbd7cfe8f6749539a7bf968dde34af81a836458"},{"version":"ea653039a00f075fceee547aea7c32e3c430df35789848c0ee47cef756f68d7d","signature":"9b32a15e46a87ac037eb535560ccc80de12ea219a732d4ebd212c7faf7914961"},{"version":"f16d156c76aa72168dc3ad200723a143816c3112aca2dc1891a4f6bb2b68c7d6","signature":"11bfda11577bde40062ca6c3059a29ce933a78892de46d6f0c93072b5b24f58a"},"2552a31fad45a9ed1bde87e51b038dc0e786cd364b597162263abbf57018949b",{"version":"a2b331d31ee4b5a57c810e3112757d6d68cecd9e9b47c62f9e05b00b64ff5326","affectsGlobalScope":true},{"version":"ab03a1e8a2d30f532104bb366ccd3b68e19ab91d8f0e9888455a434c371ded0f","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"367e47033cbd03e1307a2697ec6c42f57796cadc5f25b59f694eb6e44f11989b","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"7626fb65d16c1f4a41731f518fda59b6a2f551e5cf7cb8688ed708ed63552818","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"198a24bd213254da9c78c55d43438756ab69a101824fcd71f2f16bf4d7bd987b","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"5c4e5219a8ea1f1ff7a224112c58d42a1d7f2086d6ba93f35835b81146ead0ff","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"f1f6d12b1436a97c6ad1e715fb943b99d1e45c77e2581133dc62abe494fba53b","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"}],"root":[97,509,510,[945,951],[953,963]],"options":{"allowJs":true,"esModuleInterop":true,"jsx":1,"module":99,"skipLibCheck":true,"strict":true,"target":4},"referencedMap":[[778,1],[797,2],[779,1],[781,3],[800,4],[782,1],[799,5],[787,6],[791,7],[784,8],[786,9],[795,10],[785,8],[788,11],[783,12],[801,13],[780,14],[792,4],[789,3],[793,4],[796,5],[798,5],[794,14],[560,15],[561,16],[776,16],[562,16],[512,16],[563,17],[564,17],[775,18],[565,17],[777,17],[513,19],[773,20],[943,21],[940,22],[942,23],[941,19],[774,16],[804,24],[805,14],[898,25],[803,26],[802,27],[809,28],[890,29],[886,28],[944,30],[883,31],[882,32],[813,33],[952,34],[257,16],[684,35],[685,36],[682,37],[683,35],[677,38],[679,39],[680,38],[681,40],[678,41],[574,42],[577,43],[583,44],[586,45],[607,46],[585,47],[566,16],[567,48],[568,49],[571,16],[569,16],[570,16],[608,50],[573,42],[572,16],[609,51],[576,43],[575,16],[613,52],[610,53],[580,54],[582,55],[579,56],[581,57],[578,54],[611,58],[584,42],[612,59],[587,60],[606,61],[603,62],[605,63],[590,64],[597,65],[599,66],[601,67],[600,68],[592,69],[589,62],[593,16],[604,70],[594,71],[591,16],[602,16],[588,16],[595,72],[596,16],[598,73],[614,38],[623,38],[615,16],[616,38],[618,74],[621,16],[619,75],[620,38],[617,38],[622,16],[652,76],[651,77],[634,78],[625,79],[626,16],[627,16],[633,80],[630,81],[629,82],[631,16],[632,83],[635,38],[628,16],[637,38],[638,38],[639,38],[640,38],[641,38],[642,38],[643,38],[636,38],[649,16],[624,38],[644,16],[645,16],[646,16],[647,16],[648,75],[650,16],[759,84],[769,85],[761,86],[766,87],[767,87],[765,88],[764,89],[762,90],[763,91],[757,92],[758,86],[768,87],[653,93],[674,94],[669,95],[671,95],[670,95],[672,95],[673,96],[668,97],[660,95],[661,98],[667,99],[662,95],[663,98],[664,95],[665,95],[666,98],[675,100],[654,93],[659,101],[657,16],[658,102],[656,103],[655,104],[696,105],[693,106],[695,106],[692,107],[691,108],[686,109],[694,110],[700,111],[687,112],[690,113],[688,114],[689,115],[699,116],[697,117],[698,118],[676,119],[708,120],[710,16],[711,16],[712,121],[709,120],[715,122],[713,120],[714,120],[707,123],[720,124],[705,16],[727,125],[726,126],[719,127],[721,128],[722,129],[724,130],[725,131],[729,132],[718,133],[728,134],[723,38],[706,135],[716,136],[701,38],[703,137],[704,138],[702,16],[717,139],[772,140],[771,141],[770,142],[736,143],[740,144],[745,145],[746,145],[748,146],[734,147],[747,148],[735,149],[730,16],[753,150],[744,151],[741,152],[743,153],[742,154],[731,38],[749,155],[750,155],[751,156],[752,155],[737,157],[738,158],[733,38],[739,159],[732,160],[754,161],[756,162],[755,163],[814,16],[511,16],[211,164],[367,165],[212,166],[210,167],[369,168],[368,169],[208,170],[365,16],[209,171],[98,16],[100,172],[364,165],[275,165],[760,16],[884,173],[559,174],[516,16],[518,175],[517,176],[522,177],[557,178],[554,179],[556,180],[519,179],[520,181],[524,181],[523,182],[521,183],[555,184],[553,179],[558,185],[551,16],[552,16],[525,186],[530,179],[532,179],[527,179],[528,186],[534,179],[535,187],[526,179],[531,179],[533,179],[529,179],[549,188],[548,179],[550,189],[544,179],[546,179],[545,179],[541,179],[547,190],[542,179],[543,191],[536,179],[537,179],[538,179],[539,179],[540,179],[99,16],[514,16],[881,16],[515,16],[899,192],[901,193],[902,194],[900,195],[924,16],[925,196],[907,197],[919,198],[918,199],[916,200],[926,201],[904,16],[929,202],[911,16],[922,203],[921,204],[923,205],[927,16],[917,206],[910,207],[915,208],[928,209],[913,210],[908,16],[909,211],[930,212],[920,213],[914,209],[905,16],[931,214],[903,199],[906,16],[912,199],[790,16],[107,215],[456,216],[461,217],[463,218],[233,219],[261,220],[439,221],[256,222],[244,16],[225,16],[231,16],[429,223],[292,224],[232,16],[398,225],[266,226],[267,227],[363,228],[426,229],[381,230],[433,231],[434,232],[432,233],[431,16],[430,234],[263,235],[234,236],[313,16],[314,237],[229,16],[245,238],[235,239],[297,238],[294,238],[218,238],[259,240],[258,16],[438,241],[448,16],[224,16],[339,242],[340,243],[334,165],[484,16],[342,16],[343,244],[335,245],[490,246],[488,247],[483,16],[425,248],[424,16],[482,249],[336,165],[377,250],[375,251],[485,16],[489,16],[487,252],[486,16],[376,253],[477,254],[480,255],[304,256],[303,257],[302,258],[493,165],[301,259],[286,16],[496,16],[499,16],[498,165],[500,260],[214,16],[435,261],[436,262],[437,263],[247,16],[223,264],[213,16],[355,165],[216,265],[354,266],[353,267],[344,16],[345,16],[352,16],[347,16],[350,268],[346,16],[348,269],[351,270],[349,269],[230,16],[221,16],[222,238],[276,271],[277,272],[274,273],[272,274],[273,275],[269,16],[361,244],[383,244],[455,276],[464,277],[468,278],[442,279],[441,16],[289,16],[501,280],[451,281],[337,282],[338,283],[329,284],[319,16],[360,285],[320,286],[362,287],[357,288],[356,16],[358,16],[374,289],[443,290],[444,291],[322,292],[326,293],[317,294],[421,295],[450,296],[296,297],[399,298],[219,299],[449,300],[215,222],[270,16],[278,301],[410,302],[268,16],[409,303],[108,16],[404,304],[246,16],[315,305],[400,16],[220,16],[279,16],[408,306],[228,16],[284,307],[325,308],[440,309],[324,16],[407,16],[271,16],[412,310],[413,311],[226,16],[415,312],[417,313],[416,314],[249,16],[406,299],[419,315],[405,316],[411,317],[237,16],[240,16],[238,16],[242,16],[239,16],[241,16],[243,318],[236,16],[391,319],[390,16],[396,320],[392,321],[395,322],[394,322],[397,320],[393,321],[283,323],[384,324],[447,325],[503,16],[472,326],[474,327],[321,16],[473,328],[445,290],[502,329],[341,290],[227,16],[323,330],[280,331],[281,332],[282,333],[312,334],[420,334],[298,334],[385,335],[299,335],[265,336],[264,16],[389,337],[388,338],[387,339],[386,340],[446,341],[333,342],[371,343],[332,344],[366,345],[370,346],[428,347],[427,348],[423,349],[380,350],[382,351],[379,352],[418,353],[373,16],[460,16],[372,354],[422,16],[285,355],[318,261],[316,356],[287,357],[290,358],[497,16],[288,359],[291,359],[458,16],[457,16],[459,16],[495,16],[293,360],[331,165],[106,16],[378,361],[262,16],[251,362],[327,16],[466,165],[476,363],[311,165],[470,244],[310,364],[453,365],[309,363],[217,16],[478,366],[307,165],[308,165],[300,16],[250,16],[306,367],[305,368],[248,369],[328,370],[295,370],[414,16],[402,371],[401,16],[462,16],[359,372],[330,165],[454,373],[101,165],[104,374],[105,375],[102,165],[103,16],[260,376],[255,377],[254,16],[253,378],[252,16],[452,379],[465,380],[467,381],[469,382],[471,383],[475,384],[479,385],[508,386],[481,387],[491,388],[492,389],[494,390],[504,391],[507,264],[506,16],[505,83],[403,392],[81,16],[82,16],[13,16],[14,16],[16,16],[15,16],[2,16],[17,16],[18,16],[19,16],[20,16],[21,16],[22,16],[23,16],[24,16],[3,16],[25,16],[26,16],[4,16],[27,16],[31,16],[28,16],[29,16],[30,16],[32,16],[33,16],[34,16],[5,16],[35,16],[36,16],[37,16],[38,16],[6,16],[42,16],[39,16],[40,16],[41,16],[43,16],[7,16],[44,16],[49,16],[50,16],[45,16],[46,16],[47,16],[48,16],[8,16],[54,16],[51,16],[52,16],[53,16],[55,16],[9,16],[56,16],[57,16],[58,16],[60,16],[59,16],[61,16],[62,16],[10,16],[63,16],[64,16],[65,16],[11,16],[66,16],[67,16],[68,16],[69,16],[70,16],[1,16],[71,16],[72,16],[12,16],[76,16],[74,16],[79,16],[78,16],[73,16],[77,16],[75,16],[80,16],[96,393],[88,394],[95,395],[90,16],[91,16],[89,396],[92,397],[83,16],[84,16],[85,393],[87,398],[93,16],[94,399],[86,400],[874,401],[877,402],[875,402],[871,401],[878,403],[879,404],[876,402],[872,405],[873,406],[867,407],[819,408],[821,409],[865,16],[820,410],[866,411],[870,412],[868,16],[822,408],[823,16],[864,413],[818,414],[815,16],[869,415],[816,416],[817,16],[880,417],[824,418],[825,418],[826,418],[827,418],[828,418],[829,418],[830,418],[831,418],[832,418],[833,418],[834,418],[836,418],[835,418],[837,418],[838,418],[839,418],[863,419],[840,418],[841,418],[842,418],[843,418],[844,418],[845,418],[846,418],[847,418],[848,418],[850,418],[849,418],[851,418],[852,418],[853,418],[854,418],[855,418],[856,418],[857,418],[858,418],[859,418],[860,418],[861,418],[862,418],[888,420],[887,421],[891,422],[892,423],[893,422],[894,422],[897,424],[895,422],[889,425],[896,422],[939,426],[933,427],[934,428],[935,428],[938,429],[936,428],[932,430],[937,428],[807,431],[808,432],[810,421],[811,433],[885,434],[812,432],[806,435],[960,436],[961,437],[962,438],[959,439],[963,440],[956,217],[957,16],[958,441],[947,442],[949,443],[951,444],[953,445],[954,446],[509,447],[955,448],[510,16],[946,449],[948,449],[945,450],[950,451],[97,19],[154,452],[155,452],[156,453],[114,454],[157,455],[158,456],[159,457],[109,16],[112,458],[110,16],[111,16],[160,459],[161,460],[162,461],[163,462],[164,463],[165,464],[166,464],[168,465],[167,466],[169,467],[170,468],[171,469],[153,470],[113,16],[172,471],[173,472],[174,473],[207,474],[175,475],[176,476],[177,477],[178,478],[179,91],[180,479],[181,480],[182,481],[183,370],[184,482],[185,482],[186,483],[187,16],[188,16],[189,484],[191,485],[190,486],[192,487],[193,488],[194,489],[195,490],[196,491],[197,492],[198,493],[199,494],[200,495],[201,496],[202,497],[203,498],[204,499],[205,500],[206,501],[115,16],[131,502],[141,503],[130,502],[151,504],[122,505],[121,506],[150,83],[144,507],[149,508],[124,509],[138,510],[123,511],[147,512],[119,513],[118,83],[148,514],[120,515],[125,516],[126,16],[129,516],[116,16],[152,517],[142,518],[133,519],[134,520],[136,521],[132,522],[135,523],[145,83],[127,524],[128,525],[137,526],[117,527],[140,518],[139,516],[143,16],[146,528]],"semanticDiagnosticsPerFile":[[953,[{"start":2969,"length":4,"messageText":"Property 'data' does not exist on type 'UseChatHelpers>'.","category":1,"code":2339}]]],"affectedFilesPendingEmit":[960,961,962,959,963,958,947,949,951,953,954,509,955,510,946,948,945,950,97],"version":"5.9.3"} \ No newline at end of file