@ai-sdk/otel 1.0.0-beta.3 → 1.0.0-beta.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +192 -0
- package/dist/index.d.mts +50 -5
- package/dist/index.d.ts +50 -5
- package/dist/index.js +1105 -43
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1111 -45
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
- package/src/gen-ai-format-messages.ts +573 -0
- package/src/gen-ai-open-telemetry-integration.ts +928 -0
- package/src/index.ts +1 -0
- package/src/open-telemetry-integration.ts +14 -14
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/open-telemetry-integration.ts","../src/assemble-operation-name.ts","../src/get-base-telemetry-attributes.ts","../src/stringify-for-telemetry.ts"],"sourcesContent":["export { OpenTelemetryIntegration } from './open-telemetry-integration';\n","import { LanguageModelV4Prompt } from '@ai-sdk/provider';\nimport {\n Attributes,\n AttributeValue,\n context,\n Context,\n Span,\n SpanStatusCode,\n trace,\n Tracer,\n} from '@opentelemetry/api';\nimport type {\n EmbedFinishEvent,\n EmbedOnFinishEvent,\n EmbedOnStartEvent,\n EmbedStartEvent,\n GenerationContext,\n ObjectOnFinishEvent,\n ObjectOnStartEvent,\n ObjectOnStepFinishEvent,\n ObjectOnStepStartEvent,\n OnChunkEvent,\n OnFinishEvent,\n OnStartEvent,\n OnStepFinishEvent,\n OnStepStartEvent,\n OnToolCallFinishEvent,\n OnToolCallStartEvent,\n OutputInterface as Output,\n RerankFinishEvent,\n RerankOnFinishEvent,\n RerankOnStartEvent,\n RerankStartEvent,\n TelemetryIntegration,\n TelemetrySettings,\n ToolSet,\n} from 'ai';\nimport { assembleOperationName } from './assemble-operation-name';\nimport { getBaseTelemetryAttributes } from './get-base-telemetry-attributes';\nimport { stringifyForTelemetry } from './stringify-for-telemetry';\n\nfunction recordSpanError(span: Span, error: unknown): void {\n if (error instanceof Error) {\n span.recordException({\n name: error.name,\n message: error.message,\n stack: error.stack,\n });\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n}\n\nfunction shouldRecord(\n telemetry: TelemetrySettings | undefined,\n): telemetry is TelemetrySettings {\n return telemetry?.isEnabled === true;\n}\n\nfunction selectAttributes(\n telemetry: TelemetrySettings | undefined,\n attributes: Record<\n string,\n | AttributeValue\n | { input: () => AttributeValue | undefined }\n | { output: () => AttributeValue | undefined }\n | undefined\n >,\n): Attributes {\n if (!shouldRecord(telemetry)) {\n return {};\n }\n\n const result: Attributes = {};\n\n for (const [key, value] of Object.entries(attributes)) {\n if (value == null) continue;\n\n if (\n typeof value === 'object' &&\n 'input' in value &&\n typeof value.input === 'function'\n ) {\n if (telemetry?.recordInputs === false) continue;\n const resolved = value.input();\n if (resolved != null) result[key] = resolved;\n continue;\n }\n\n if (\n typeof value === 'object' &&\n 'output' in value &&\n typeof value.output === 'function'\n ) {\n if (telemetry?.recordOutputs === false) continue;\n const resolved = value.output();\n if (resolved != null) result[key] = resolved;\n continue;\n }\n\n result[key] = value as AttributeValue;\n }\n\n return result;\n}\n\ninterface OtelStepStartEvent<\n TOOLS extends ToolSet = ToolSet,\n CONTEXT extends GenerationContext<TOOLS> = GenerationContext<TOOLS>,\n OUTPUT extends Output = Output,\n> extends OnStepStartEvent<TOOLS, CONTEXT, OUTPUT> {\n readonly promptMessages?: LanguageModelV4Prompt;\n readonly stepTools?: ReadonlyArray<Record<string, unknown>>;\n readonly stepToolChoice?: unknown;\n}\n\ninterface CallState {\n operationId: string;\n telemetry: TelemetrySettings | undefined;\n rootSpan: Span | undefined;\n rootContext: Context | undefined;\n stepSpan: Span | undefined;\n stepContext: Context | undefined;\n embedSpans: Map<string, { span: Span; context: Context }>;\n rerankSpan: { span: Span; context: Context } | undefined;\n toolSpans: Map<string, { span: Span; context: Context }>;\n baseTelemetryAttributes: Attributes;\n settings: Record<string, unknown>;\n}\n\nexport class OpenTelemetryIntegration implements TelemetryIntegration {\n private readonly callStates = new Map<string, CallState>();\n\n /**\n * The tracer to use for the telemetry data.\n */\n private readonly tracer: Tracer;\n\n constructor(\n options: {\n tracer?: Tracer;\n } = {},\n ) {\n this.tracer = options.tracer ?? trace.getTracer('ai');\n }\n\n private getCallState(callId: string): CallState | undefined {\n return this.callStates.get(callId);\n }\n\n private cleanupCallState(callId: string): void {\n this.callStates.delete(callId);\n }\n\n executeTool<T>({\n callId,\n toolCallId,\n execute,\n }: {\n callId: string;\n toolCallId: string;\n execute: () => PromiseLike<T>;\n }): PromiseLike<T> {\n const toolSpanEntry = this.getCallState(callId)?.toolSpans.get(toolCallId);\n\n if (toolSpanEntry == null) {\n return execute();\n }\n\n return context.with(toolSpanEntry.context, execute);\n }\n\n onStart(\n event:\n | OnStartEvent<ToolSet, Output>\n | ObjectOnStartEvent\n | EmbedOnStartEvent\n | RerankOnStartEvent,\n ): void {\n if (event.isEnabled !== true) return;\n\n if (\n event.operationId === 'ai.embed' ||\n event.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationStart(event as EmbedOnStartEvent);\n return;\n }\n\n if (event.operationId === 'ai.rerank') {\n this.onRerankOperationStart(event as RerankOnStartEvent);\n return;\n }\n\n if (\n event.operationId === 'ai.generateObject' ||\n event.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationStart(event as ObjectOnStartEvent);\n return;\n }\n\n this.onGenerateStart(event as OnStartEvent<ToolSet, Output>);\n }\n\n private onGenerateStart(event: OnStartEvent<ToolSet, Output>): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n stopSequences: event.stopSequences,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n telemetry,\n headers: event.headers,\n settings,\n });\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.model.provider': event.provider,\n 'ai.model.id': event.modelId,\n 'ai.prompt': {\n input: () =>\n JSON.stringify({\n system: event.system,\n prompt: event.prompt,\n messages: event.messages,\n }),\n },\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n private onObjectOperationStart(event: ObjectOnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n telemetry,\n headers: event.headers,\n settings,\n });\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.prompt': {\n input: () =>\n JSON.stringify({\n system: event.system,\n prompt: event.prompt,\n messages: event.messages,\n }),\n },\n 'ai.schema': event.schema\n ? { input: () => JSON.stringify(event.schema) }\n : undefined,\n 'ai.schema.name': event.schemaName,\n 'ai.schema.description': event.schemaDescription,\n 'ai.settings.output': event.output,\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n /** @deprecated */\n onObjectStepStart(event: ObjectOnStepStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const stepOperationId =\n state.operationId === 'ai.streamObject'\n ? 'ai.streamObject.doStream'\n : 'ai.generateObject.doGenerate';\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: stepOperationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.prompt.messages': {\n input: () =>\n event.promptMessages\n ? stringifyForTelemetry(event.promptMessages)\n : undefined,\n },\n\n 'gen_ai.system': event.provider,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n });\n\n state.stepSpan = this.tracer.startSpan(\n stepOperationId,\n { attributes },\n state.rootContext,\n );\n state.stepContext = trace.setSpan(state.rootContext, state.stepSpan);\n }\n\n /** @deprecated */\n onObjectStepFinish(event: ObjectOnStepFinishEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepSpan) return;\n\n const { telemetry } = state;\n\n state.stepSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.object': {\n output: () => {\n try {\n return JSON.stringify(JSON.parse(event.objectText));\n } catch {\n return event.objectText;\n }\n },\n },\n 'ai.response.id': event.response.id,\n 'ai.response.model': event.response.modelId,\n 'ai.response.timestamp': event.response.timestamp.toISOString(),\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.usage.inputTokens,\n 'ai.usage.outputTokens': event.usage.outputTokens,\n 'ai.usage.totalTokens': event.usage.totalTokens,\n 'ai.usage.reasoningTokens': event.usage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.usage.cachedInputTokens,\n\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.response.id,\n 'gen_ai.response.model': event.response.modelId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n }),\n );\n\n if (event.msToFirstChunk != null) {\n state.stepSpan.addEvent('ai.stream.firstChunk', {\n 'ai.stream.msToFirstChunk': event.msToFirstChunk,\n });\n state.stepSpan.setAttributes({\n 'ai.stream.msToFirstChunk': event.msToFirstChunk,\n });\n }\n\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n private onEmbedOperationStart(event: EmbedOnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\n };\n\n const settings: Record<string, unknown> = {\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n telemetry,\n headers: event.headers,\n settings,\n });\n\n const value = event.value;\n const isMany = event.operationId === 'ai.embedMany';\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n ...(isMany\n ? {\n 'ai.values': {\n input: () => (value as string[]).map(v => JSON.stringify(v)),\n },\n }\n : {\n 'ai.value': {\n input: () => JSON.stringify(value),\n },\n }),\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n onStepStart(event: OtelStepStartEvent<ToolSet, Output>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const stepOperationId =\n state.operationId === 'ai.streamText'\n ? 'ai.streamText.doStream'\n : 'ai.generateText.doGenerate';\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: stepOperationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.model.provider': event.provider,\n 'ai.model.id': event.modelId,\n\n 'ai.prompt.messages': {\n input: () =>\n event.promptMessages\n ? stringifyForTelemetry(event.promptMessages)\n : undefined,\n },\n 'ai.prompt.tools': {\n input: () => event.stepTools?.map(tool => JSON.stringify(tool)),\n },\n 'ai.prompt.toolChoice': {\n input: () =>\n event.stepToolChoice != null\n ? JSON.stringify(event.stepToolChoice)\n : undefined,\n },\n\n 'gen_ai.system': event.provider,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.stop_sequences': state.settings.stopSequences as\n | string[]\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n });\n\n state.stepSpan = this.tracer.startSpan(\n stepOperationId,\n { attributes },\n state.rootContext,\n );\n state.stepContext = trace.setSpan(state.rootContext, state.stepSpan);\n }\n\n onToolCallStart(event: OnToolCallStartEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepContext) return;\n\n const { telemetry } = state;\n const { toolCall } = event;\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: 'ai.toolCall',\n telemetry,\n }),\n 'ai.toolCall.name': toolCall.toolName,\n 'ai.toolCall.id': toolCall.toolCallId,\n 'ai.toolCall.args': {\n output: () => JSON.stringify(toolCall.input),\n },\n });\n\n const toolSpan = this.tracer.startSpan(\n 'ai.toolCall',\n { attributes },\n state.stepContext,\n );\n const toolContext = trace.setSpan(state.stepContext, toolSpan);\n\n state.toolSpans.set(toolCall.toolCallId, {\n span: toolSpan,\n context: toolContext,\n });\n }\n\n onToolCallFinish(event: OnToolCallFinishEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const toolSpanEntry = state.toolSpans.get(event.toolCall.toolCallId);\n if (!toolSpanEntry) return;\n\n const { span } = toolSpanEntry;\n const { telemetry } = state;\n\n if (event.success) {\n try {\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.toolCall.result': {\n output: () => JSON.stringify(event.output),\n },\n }),\n );\n } catch (_ignored) {\n // JSON.stringify might fail for non-serializable results\n }\n } else {\n recordSpanError(span, event.error);\n }\n\n span.end();\n state.toolSpans.delete(event.toolCall.toolCallId);\n }\n\n onStepFinish(event: OnStepFinishEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepSpan) return;\n\n const { telemetry } = state;\n\n state.stepSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.text': {\n output: () => event.text ?? undefined,\n },\n 'ai.response.reasoning': {\n output: () =>\n event.reasoning.length > 0\n ? event.reasoning\n .filter(part => 'text' in part)\n .map(part => part.text)\n .join('\\n')\n : undefined,\n },\n 'ai.response.toolCalls': {\n output: () =>\n event.toolCalls.length > 0\n ? JSON.stringify(\n event.toolCalls.map(toolCall => ({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n })),\n )\n : undefined,\n },\n 'ai.response.files': {\n output: () =>\n event.files.length > 0\n ? JSON.stringify(\n event.files.map(file => ({\n type: 'file',\n mediaType: file.mediaType,\n data: file.base64,\n })),\n )\n : undefined,\n },\n 'ai.response.id': event.response.id,\n 'ai.response.model': event.response.modelId,\n 'ai.response.timestamp': event.response.timestamp.toISOString(),\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.usage.inputTokens,\n 'ai.usage.outputTokens': event.usage.outputTokens,\n 'ai.usage.totalTokens': event.usage.totalTokens,\n 'ai.usage.reasoningTokens': event.usage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.usage.cachedInputTokens,\n 'ai.usage.inputTokenDetails.noCacheTokens':\n event.usage.inputTokenDetails?.noCacheTokens,\n 'ai.usage.inputTokenDetails.cacheReadTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'ai.usage.inputTokenDetails.cacheWriteTokens':\n event.usage.inputTokenDetails?.cacheWriteTokens,\n 'ai.usage.outputTokenDetails.textTokens':\n event.usage.outputTokenDetails?.textTokens,\n 'ai.usage.outputTokenDetails.reasoningTokens':\n event.usage.outputTokenDetails?.reasoningTokens,\n\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.response.id,\n 'gen_ai.response.model': event.response.modelId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n }),\n );\n\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n onFinish(\n event:\n | OnFinishEvent<ToolSet>\n | ObjectOnFinishEvent<unknown>\n | EmbedOnFinishEvent\n | RerankOnFinishEvent,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n if (\n state.operationId === 'ai.embed' ||\n state.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationFinish(event as EmbedOnFinishEvent);\n return;\n }\n\n if (state.operationId === 'ai.rerank') {\n this.onRerankOperationFinish(event as RerankOnFinishEvent);\n return;\n }\n\n if (\n state.operationId === 'ai.generateObject' ||\n state.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationFinish(event as ObjectOnFinishEvent<unknown>);\n return;\n }\n\n this.onGenerateFinish(event as OnFinishEvent<ToolSet>);\n }\n\n private onGenerateFinish(event: OnFinishEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.text': {\n output: () => event.text ?? undefined,\n },\n 'ai.response.reasoning': {\n output: () =>\n event.reasoning.length > 0\n ? event.reasoning\n .filter(part => 'text' in part)\n .map(part => part.text)\n .join('\\n')\n : undefined,\n },\n 'ai.response.toolCalls': {\n output: () =>\n event.toolCalls.length > 0\n ? JSON.stringify(\n event.toolCalls.map(toolCall => ({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n })),\n )\n : undefined,\n },\n 'ai.response.files': {\n output: () =>\n event.files.length > 0\n ? JSON.stringify(\n event.files.map(file => ({\n type: 'file',\n mediaType: file.mediaType,\n data: file.base64,\n })),\n )\n : undefined,\n },\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.totalUsage.inputTokens,\n 'ai.usage.outputTokens': event.totalUsage.outputTokens,\n 'ai.usage.totalTokens': event.totalUsage.totalTokens,\n 'ai.usage.reasoningTokens': event.totalUsage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.totalUsage.cachedInputTokens,\n 'ai.usage.inputTokenDetails.noCacheTokens':\n event.totalUsage.inputTokenDetails?.noCacheTokens,\n 'ai.usage.inputTokenDetails.cacheReadTokens':\n event.totalUsage.inputTokenDetails?.cacheReadTokens,\n 'ai.usage.inputTokenDetails.cacheWriteTokens':\n event.totalUsage.inputTokenDetails?.cacheWriteTokens,\n 'ai.usage.outputTokenDetails.textTokens':\n event.totalUsage.outputTokenDetails?.textTokens,\n 'ai.usage.outputTokenDetails.reasoningTokens':\n event.totalUsage.outputTokenDetails?.reasoningTokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onObjectOperationFinish(event: ObjectOnFinishEvent<unknown>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.object': {\n output: () =>\n event.object != null ? JSON.stringify(event.object) : undefined,\n },\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.usage.inputTokens,\n 'ai.usage.outputTokens': event.usage.outputTokens,\n 'ai.usage.totalTokens': event.usage.totalTokens,\n 'ai.usage.reasoningTokens': event.usage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.usage.cachedInputTokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onEmbedOperationFinish(event: EmbedOnFinishEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n const isMany = state.operationId === 'ai.embedMany';\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n ...(isMany\n ? {\n 'ai.embeddings': {\n output: () =>\n (event.embedding as number[][]).map(e => JSON.stringify(e)),\n },\n }\n : {\n 'ai.embedding': {\n output: () => JSON.stringify(event.embedding),\n },\n }),\n 'ai.usage.tokens': event.usage.tokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onEmbedStart(event: EmbedStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.values': {\n input: () => event.values.map(v => JSON.stringify(v)),\n },\n });\n\n const embedSpan = this.tracer.startSpan(\n event.operationId,\n { attributes },\n state.rootContext,\n );\n const embedContext = trace.setSpan(state.rootContext, embedSpan);\n\n state.embedSpans.set(event.embedCallId, {\n span: embedSpan,\n context: embedContext,\n });\n }\n\n onEmbedFinish(event: EmbedFinishEvent): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const embedSpanEntry = state.embedSpans.get(event.embedCallId);\n if (!embedSpanEntry) return;\n\n const { span } = embedSpanEntry;\n const { telemetry } = state;\n\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.embeddings': {\n output: () =>\n event.embeddings.map(embedding => JSON.stringify(embedding)),\n },\n 'ai.usage.tokens': event.usage.tokens,\n }),\n );\n\n span.end();\n state.embedSpans.delete(event.embedCallId);\n }\n\n private onRerankOperationStart(event: RerankOnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\n };\n\n const settings: Record<string, unknown> = {\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n telemetry,\n headers: event.headers,\n settings,\n });\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.documents': {\n input: () => event.documents.map(d => JSON.stringify(d)),\n },\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n private onRerankOperationFinish(event: RerankOnFinishEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onRerankStart(event: RerankStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.documents': {\n input: () => event.documents.map(d => JSON.stringify(d)),\n },\n });\n\n const rerankSpan = this.tracer.startSpan(\n event.operationId,\n { attributes },\n state.rootContext,\n );\n const rerankContext = trace.setSpan(state.rootContext, rerankSpan);\n\n state.rerankSpan = { span: rerankSpan, context: rerankContext };\n }\n\n onRerankFinish(event: RerankFinishEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rerankSpan) return;\n\n const { span } = state.rerankSpan;\n const { telemetry } = state;\n\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.ranking.type': event.documentsType,\n 'ai.ranking': {\n output: () => event.ranking.map(r => JSON.stringify(r)),\n },\n }),\n );\n\n span.end();\n state.rerankSpan = undefined;\n }\n\n onChunk(event: OnChunkEvent<ToolSet>): void {\n const chunk = event.chunk as {\n type: string;\n callId?: unknown;\n attributes?: unknown;\n };\n\n if (typeof chunk.callId !== 'string') {\n return;\n }\n\n if (\n chunk.type !== 'ai.stream.firstChunk' &&\n chunk.type !== 'ai.stream.finish'\n ) {\n return;\n }\n\n const state = this.getCallState(chunk.callId);\n if (!state?.stepSpan) return;\n\n const attributes = Object.fromEntries(\n Object.entries(\n (chunk.attributes as Record<string, unknown>) ?? {},\n ).filter(([, value]) => value != null),\n ) as Attributes;\n\n state.stepSpan.addEvent(chunk.type, attributes);\n if (Object.keys(attributes).length > 0) {\n state.stepSpan.setAttributes(attributes);\n }\n }\n\n onError(error: unknown): void {\n const event = error as { callId?: string; error?: unknown };\n if (!event?.callId) return;\n\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const actualError = event.error ?? error;\n\n if (state.stepSpan) {\n recordSpanError(state.stepSpan, actualError);\n state.stepSpan.end();\n }\n\n for (const { span: embedSpan } of state.embedSpans.values()) {\n recordSpanError(embedSpan, actualError);\n embedSpan.end();\n }\n state.embedSpans.clear();\n\n if (state.rerankSpan) {\n recordSpanError(state.rerankSpan.span, actualError);\n state.rerankSpan.span.end();\n state.rerankSpan = undefined;\n }\n\n recordSpanError(state.rootSpan, actualError);\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n}\n","import type { TelemetrySettings } from 'ai';\n\nexport function assembleOperationName({\n operationId,\n telemetry,\n}: {\n operationId: string;\n telemetry?: TelemetrySettings;\n}) {\n return {\n // standardized operation and resource name:\n 'operation.name': `${operationId}${\n telemetry?.functionId != null ? ` ${telemetry.functionId}` : ''\n }`,\n 'resource.name': telemetry?.functionId,\n\n // detailed, AI SDK specific data:\n 'ai.operationId': operationId,\n 'ai.telemetry.functionId': telemetry?.functionId,\n };\n}\n","import { Attributes, AttributeValue } from '@opentelemetry/api';\nimport type { CallSettings, TelemetrySettings } from 'ai';\n\nexport function getBaseTelemetryAttributes({\n model,\n settings,\n telemetry,\n headers,\n}: {\n model: { modelId: string; provider: string };\n settings: Omit<CallSettings, 'abortSignal' | 'headers' | 'temperature'>;\n telemetry: TelemetrySettings | undefined;\n headers: Record<string, string | undefined> | undefined;\n}): Attributes {\n return {\n 'ai.model.provider': model.provider,\n 'ai.model.id': model.modelId,\n\n // settings:\n ...Object.entries(settings).reduce((attributes, [key, value]) => {\n attributes[`ai.settings.${key}`] = value as AttributeValue;\n return attributes;\n }, {} as Attributes),\n\n // add metadata as attributes:\n ...Object.entries(telemetry?.metadata ?? {}).reduce(\n (attributes, [key, value]) => {\n if (value != undefined) {\n attributes[`ai.telemetry.metadata.${key}`] = value as AttributeValue;\n }\n return attributes;\n },\n {} as Attributes,\n ),\n\n // request headers\n ...Object.entries(headers ?? {}).reduce((attributes, [key, value]) => {\n if (value !== undefined) {\n attributes[`ai.request.headers.${key}`] = value;\n }\n return attributes;\n }, {} as Attributes),\n };\n}\n","import {\n LanguageModelV4Message,\n LanguageModelV4Prompt,\n} from '@ai-sdk/provider';\nimport { convertDataContentToBase64String } from 'ai';\n\n/**\n * Helper utility to serialize prompt content for OpenTelemetry tracing.\n * It is initially created because normalized LanguageModelV4Prompt carries\n * images as Uint8Arrays, on which JSON.stringify acts weirdly, converting\n * them to objects with stringified indices as keys, e.g. {\"0\": 42, \"1\": 69 }.\n */\nexport function stringifyForTelemetry(prompt: LanguageModelV4Prompt): string {\n return JSON.stringify(\n prompt.map((message: LanguageModelV4Message) => ({\n ...message,\n content:\n typeof message.content === 'string'\n ? message.content\n : message.content.map(part =>\n part.type === 'file'\n ? {\n ...part,\n data:\n part.data instanceof Uint8Array\n ? convertDataContentToBase64String(part.data)\n : part.data,\n }\n : part,\n ),\n })),\n );\n}\n"],"mappings":"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","names":["_a"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/gen-ai-open-telemetry-integration.ts","../src/gen-ai-format-messages.ts","../src/open-telemetry-integration.ts","../src/assemble-operation-name.ts","../src/get-base-telemetry-attributes.ts","../src/stringify-for-telemetry.ts"],"sourcesContent":["export { GenAIOpenTelemetryIntegration } from './gen-ai-open-telemetry-integration';\nexport { OpenTelemetryIntegration } from './open-telemetry-integration';\n","import { LanguageModelV4Prompt } from '@ai-sdk/provider';\nimport type { Context as AISDKContext } from '@ai-sdk/provider-utils';\nimport {\n Attributes,\n AttributeValue,\n context,\n Context as OpenTelemetryContext,\n Span,\n SpanKind,\n SpanStatusCode,\n trace,\n Tracer,\n} from '@opentelemetry/api';\nimport type {\n EmbedFinishEvent,\n EmbedOnFinishEvent,\n EmbedOnStartEvent,\n EmbedStartEvent,\n ObjectOnFinishEvent,\n ObjectOnStartEvent,\n ObjectOnStepFinishEvent,\n ObjectOnStepStartEvent,\n OnChunkEvent,\n OnFinishEvent,\n OnStartEvent,\n OnStepFinishEvent,\n OnStepStartEvent,\n OnToolCallFinishEvent,\n OnToolCallStartEvent,\n OutputInterface as Output,\n RerankFinishEvent,\n RerankOnFinishEvent,\n RerankOnStartEvent,\n RerankStartEvent,\n TelemetryIntegration,\n TelemetrySettings,\n ToolSet,\n} from 'ai';\nimport {\n formatInputMessages,\n formatModelMessages,\n formatObjectOutputMessages,\n formatOutputMessages,\n formatSystemInstructions,\n mapOperationName,\n mapProviderName,\n} from './gen-ai-format-messages';\n\nfunction recordSpanError(span: Span, error: unknown): void {\n if (error instanceof Error) {\n span.recordException({\n name: error.name,\n message: error.message,\n stack: error.stack,\n });\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n}\n\nfunction shouldRecord(\n telemetry: TelemetrySettings | undefined,\n): telemetry is TelemetrySettings {\n return telemetry?.isEnabled === true;\n}\n\nfunction selectAttributes(\n telemetry: TelemetrySettings | undefined,\n attributes: Record<\n string,\n | AttributeValue\n | { input: () => AttributeValue | undefined }\n | { output: () => AttributeValue | undefined }\n | undefined\n >,\n): Attributes {\n if (!shouldRecord(telemetry)) {\n return {};\n }\n\n const result: Attributes = {};\n\n for (const [key, value] of Object.entries(attributes)) {\n if (value == null) continue;\n\n if (\n typeof value === 'object' &&\n 'input' in value &&\n typeof value.input === 'function'\n ) {\n if (telemetry?.recordInputs === false) continue;\n const resolved = value.input();\n if (resolved != null) result[key] = resolved;\n continue;\n }\n\n if (\n typeof value === 'object' &&\n 'output' in value &&\n typeof value.output === 'function'\n ) {\n if (telemetry?.recordOutputs === false) continue;\n const resolved = value.output();\n if (resolved != null) result[key] = resolved;\n continue;\n }\n\n result[key] = value as AttributeValue;\n }\n\n return result;\n}\n\ninterface OtelStepStartEvent<\n TOOLS extends ToolSet = ToolSet,\n USER_CONTEXT extends AISDKContext = AISDKContext,\n OUTPUT extends Output = Output,\n> extends OnStepStartEvent<TOOLS, USER_CONTEXT, OUTPUT> {\n readonly promptMessages?: LanguageModelV4Prompt;\n readonly stepTools?: ReadonlyArray<Record<string, unknown>>;\n readonly stepToolChoice?: unknown;\n}\n\ninterface CallState {\n operationId: string;\n telemetry: TelemetrySettings | undefined;\n rootSpan: Span | undefined;\n rootContext: OpenTelemetryContext | undefined;\n stepSpan: Span | undefined;\n stepContext: OpenTelemetryContext | undefined;\n embedSpans: Map<string, { span: Span; context: OpenTelemetryContext }>;\n rerankSpan: { span: Span; context: OpenTelemetryContext } | undefined;\n toolSpans: Map<string, { span: Span; context: OpenTelemetryContext }>;\n settings: Record<string, unknown>;\n provider: string;\n modelId: string;\n}\n\nexport class GenAIOpenTelemetryIntegration implements TelemetryIntegration {\n private readonly callStates = new Map<string, CallState>();\n\n private readonly tracer: Tracer;\n\n constructor(\n options: {\n tracer?: Tracer;\n } = {},\n ) {\n this.tracer = options.tracer ?? trace.getTracer('gen_ai');\n }\n\n private getCallState(callId: string): CallState | undefined {\n return this.callStates.get(callId);\n }\n\n private cleanupCallState(callId: string): void {\n this.callStates.delete(callId);\n }\n\n executeTool<T>({\n callId,\n toolCallId,\n execute,\n }: {\n callId: string;\n toolCallId: string;\n execute: () => PromiseLike<T>;\n }): PromiseLike<T> {\n const toolSpanEntry = this.getCallState(callId)?.toolSpans.get(toolCallId);\n\n if (toolSpanEntry == null) {\n return execute();\n }\n\n return context.with(toolSpanEntry.context, execute);\n }\n\n onStart(\n event:\n | OnStartEvent\n | ObjectOnStartEvent\n | EmbedOnStartEvent\n | RerankOnStartEvent,\n ): void {\n if (event.isEnabled !== true) return;\n\n if (\n event.operationId === 'ai.embed' ||\n event.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationStart(event as EmbedOnStartEvent);\n return;\n }\n\n if (event.operationId === 'ai.rerank') {\n this.onRerankOperationStart(event as RerankOnStartEvent);\n return;\n }\n\n if (\n event.operationId === 'ai.generateObject' ||\n event.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationStart(event as ObjectOnStartEvent);\n return;\n }\n\n this.onGenerateStart(event as OnStartEvent);\n }\n\n private onGenerateStart(event: OnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n stopSequences: event.stopSequences,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const providerName = mapProviderName(event.provider);\n const operationName = mapOperationName(event.operationId);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': operationName,\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.agent.name': telemetry.functionId,\n 'gen_ai.request.frequency_penalty': event.frequencyPenalty,\n 'gen_ai.request.max_tokens': event.maxOutputTokens,\n 'gen_ai.request.presence_penalty': event.presencePenalty,\n 'gen_ai.request.temperature': (event.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': event.topK,\n 'gen_ai.request.top_p': event.topP,\n 'gen_ai.request.stop_sequences': event.stopSequences,\n 'gen_ai.request.seed': event.seed,\n 'gen_ai.system_instructions': event.system\n ? {\n input: () =>\n JSON.stringify(formatSystemInstructions(event.system!)),\n }\n : undefined,\n 'gen_ai.input.messages': {\n input: () =>\n JSON.stringify(\n formatModelMessages({\n prompt: event.prompt,\n messages: event.messages,\n }),\n ),\n },\n });\n\n const spanName = `${operationName} ${event.modelId}`;\n const rootSpan = this.tracer.startSpan(spanName, {\n attributes,\n kind: SpanKind.INTERNAL,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n settings,\n provider: event.provider,\n modelId: event.modelId,\n });\n }\n\n private onObjectOperationStart(event: ObjectOnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const providerName = mapProviderName(event.provider);\n const operationName = mapOperationName(event.operationId);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': operationName,\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.agent.name': telemetry.functionId,\n 'gen_ai.output.type': 'json',\n 'gen_ai.request.frequency_penalty': event.frequencyPenalty,\n 'gen_ai.request.max_tokens': event.maxOutputTokens,\n 'gen_ai.request.presence_penalty': event.presencePenalty,\n 'gen_ai.request.temperature': (event.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': event.topK,\n 'gen_ai.request.top_p': event.topP,\n 'gen_ai.request.seed': event.seed,\n 'gen_ai.system_instructions': event.system\n ? {\n input: () =>\n JSON.stringify(formatSystemInstructions(event.system!)),\n }\n : undefined,\n 'gen_ai.input.messages': {\n input: () =>\n JSON.stringify(\n formatModelMessages({\n prompt: event.prompt,\n messages: event.messages,\n }),\n ),\n },\n });\n\n const spanName = `${operationName} ${event.modelId}`;\n const rootSpan = this.tracer.startSpan(spanName, {\n attributes,\n kind: SpanKind.INTERNAL,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n settings,\n provider: event.provider,\n modelId: event.modelId,\n });\n }\n\n /** @deprecated */\n onObjectStepStart(event: ObjectOnStepStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n const providerName = mapProviderName(event.provider);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'chat',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.output.type': 'json',\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n 'gen_ai.input.messages': {\n input: () =>\n event.promptMessages\n ? JSON.stringify(formatInputMessages(event.promptMessages))\n : undefined,\n },\n });\n\n const spanName = `chat ${event.modelId}`;\n state.stepSpan = this.tracer.startSpan(\n spanName,\n { attributes, kind: SpanKind.CLIENT },\n state.rootContext,\n );\n state.stepContext = trace.setSpan(state.rootContext, state.stepSpan);\n }\n\n /** @deprecated */\n onObjectStepFinish(event: ObjectOnStepFinishEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepSpan) return;\n\n const { telemetry } = state;\n\n state.stepSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.response.id,\n 'gen_ai.response.model': event.response.modelId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n 'gen_ai.usage.cache_read.input_tokens': event.usage.cachedInputTokens,\n 'gen_ai.output.messages': {\n output: () => {\n try {\n return JSON.stringify(\n formatObjectOutputMessages({\n objectText: event.objectText,\n finishReason: event.finishReason,\n }),\n );\n } catch {\n return event.objectText;\n }\n },\n },\n }),\n );\n\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n private onEmbedOperationStart(event: EmbedOnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\n };\n\n const settings: Record<string, unknown> = {\n maxRetries: event.maxRetries,\n };\n\n const providerName = mapProviderName(event.provider);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'embeddings',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n });\n\n const spanName = `embeddings ${event.modelId}`;\n const rootSpan = this.tracer.startSpan(spanName, {\n attributes,\n kind: SpanKind.CLIENT,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n settings,\n provider: event.provider,\n modelId: event.modelId,\n });\n }\n\n onStepStart(event: OtelStepStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n const providerName = mapProviderName(event.provider);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'chat',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.stop_sequences': state.settings.stopSequences as\n | string[]\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n 'gen_ai.input.messages': {\n input: () =>\n event.promptMessages\n ? JSON.stringify(formatInputMessages(event.promptMessages))\n : undefined,\n },\n 'gen_ai.tool.definitions': {\n input: () =>\n event.stepTools ? JSON.stringify(event.stepTools) : undefined,\n },\n });\n\n const spanName = `chat ${event.modelId}`;\n state.stepSpan = this.tracer.startSpan(\n spanName,\n { attributes, kind: SpanKind.CLIENT },\n state.rootContext,\n );\n state.stepContext = trace.setSpan(state.rootContext, state.stepSpan);\n }\n\n onToolCallStart(event: OnToolCallStartEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepContext) return;\n\n const { telemetry } = state;\n const { toolCall } = event;\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'execute_tool',\n 'gen_ai.tool.name': toolCall.toolName,\n 'gen_ai.tool.call.id': toolCall.toolCallId,\n 'gen_ai.tool.type': 'function',\n 'gen_ai.tool.call.arguments': {\n input: () => JSON.stringify(toolCall.input),\n },\n });\n\n const spanName = `execute_tool ${toolCall.toolName}`;\n const toolSpan = this.tracer.startSpan(\n spanName,\n { attributes, kind: SpanKind.INTERNAL },\n state.stepContext,\n );\n const toolContext = trace.setSpan(state.stepContext, toolSpan);\n\n state.toolSpans.set(toolCall.toolCallId, {\n span: toolSpan,\n context: toolContext,\n });\n }\n\n onToolCallFinish(event: OnToolCallFinishEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const toolSpanEntry = state.toolSpans.get(event.toolCall.toolCallId);\n if (!toolSpanEntry) return;\n\n const { span } = toolSpanEntry;\n const { telemetry } = state;\n\n if (event.success) {\n try {\n span.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.tool.call.result': {\n output: () => JSON.stringify(event.output),\n },\n }),\n );\n } catch {\n // JSON.stringify might fail for non-serializable results\n }\n } else {\n recordSpanError(span, event.error);\n }\n\n span.end();\n state.toolSpans.delete(event.toolCall.toolCallId);\n }\n\n onStepFinish(event: OnStepFinishEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepSpan) return;\n\n const { telemetry } = state;\n\n state.stepSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.response.id,\n 'gen_ai.response.model': event.response.modelId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n 'gen_ai.usage.cache_read.input_tokens':\n event.usage.inputTokenDetails?.cacheReadTokens ??\n event.usage.cachedInputTokens,\n 'gen_ai.usage.cache_creation.input_tokens':\n event.usage.inputTokenDetails?.cacheWriteTokens,\n 'gen_ai.output.messages': {\n output: () =>\n JSON.stringify(\n formatOutputMessages({\n text: event.text ?? undefined,\n reasoning: event.reasoning as ReadonlyArray<{ text?: string }>,\n toolCalls: event.toolCalls,\n files: event.files,\n finishReason: event.finishReason,\n }),\n ),\n },\n }),\n );\n\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n onFinish(\n event:\n | OnFinishEvent<ToolSet>\n | ObjectOnFinishEvent<unknown>\n | EmbedOnFinishEvent\n | RerankOnFinishEvent,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n if (\n state.operationId === 'ai.embed' ||\n state.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationFinish(event as EmbedOnFinishEvent);\n return;\n }\n\n if (state.operationId === 'ai.rerank') {\n this.onRerankOperationFinish(event as RerankOnFinishEvent);\n return;\n }\n\n if (\n state.operationId === 'ai.generateObject' ||\n state.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationFinish(event as ObjectOnFinishEvent<unknown>);\n return;\n }\n\n this.onGenerateFinish(event as OnFinishEvent<ToolSet>);\n }\n\n private onGenerateFinish(event: OnFinishEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.usage.input_tokens': event.totalUsage.inputTokens,\n 'gen_ai.usage.output_tokens': event.totalUsage.outputTokens,\n 'gen_ai.usage.cache_read.input_tokens':\n event.totalUsage.inputTokenDetails?.cacheReadTokens ??\n event.totalUsage.cachedInputTokens,\n 'gen_ai.usage.cache_creation.input_tokens':\n event.totalUsage.inputTokenDetails?.cacheWriteTokens,\n 'gen_ai.output.messages': {\n output: () =>\n JSON.stringify(\n formatOutputMessages({\n text: event.text ?? undefined,\n reasoning: event.reasoning as ReadonlyArray<{ text?: string }>,\n toolCalls: event.toolCalls,\n files: event.files,\n finishReason: event.finishReason,\n }),\n ),\n },\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onObjectOperationFinish(event: ObjectOnFinishEvent<unknown>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n 'gen_ai.usage.cache_read.input_tokens': event.usage.cachedInputTokens,\n 'gen_ai.output.messages': {\n output: () =>\n event.object != null\n ? JSON.stringify(\n formatObjectOutputMessages({\n objectText: JSON.stringify(event.object),\n finishReason: event.finishReason,\n }),\n )\n : undefined,\n },\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onEmbedOperationFinish(event: EmbedOnFinishEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.usage.input_tokens': event.usage.tokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onEmbedStart(event: EmbedStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n const providerName = mapProviderName(state.provider);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'embeddings',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': state.modelId,\n });\n\n const spanName = `embeddings ${state.modelId}`;\n const embedSpan = this.tracer.startSpan(\n spanName,\n { attributes, kind: SpanKind.CLIENT },\n state.rootContext,\n );\n const embedContext = trace.setSpan(state.rootContext, embedSpan);\n\n state.embedSpans.set(event.embedCallId, {\n span: embedSpan,\n context: embedContext,\n });\n }\n\n onEmbedFinish(event: EmbedFinishEvent): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const embedSpanEntry = state.embedSpans.get(event.embedCallId);\n if (!embedSpanEntry) return;\n\n const { span } = embedSpanEntry;\n const { telemetry } = state;\n\n span.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.usage.input_tokens': event.usage.tokens,\n }),\n );\n\n span.end();\n state.embedSpans.delete(event.embedCallId);\n }\n\n private onRerankOperationStart(event: RerankOnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\n };\n\n const settings: Record<string, unknown> = {\n maxRetries: event.maxRetries,\n };\n\n const providerName = mapProviderName(event.provider);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'rerank',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n });\n\n const spanName = `rerank ${event.modelId}`;\n const rootSpan = this.tracer.startSpan(spanName, {\n attributes,\n kind: SpanKind.CLIENT,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n settings,\n provider: event.provider,\n modelId: event.modelId,\n });\n }\n\n private onRerankOperationFinish(event: RerankOnFinishEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onRerankStart(event: RerankStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n const providerName = mapProviderName(state.provider);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'rerank',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': state.modelId,\n });\n\n const spanName = `rerank ${state.modelId}`;\n const rerankSpan = this.tracer.startSpan(\n spanName,\n { attributes, kind: SpanKind.CLIENT },\n state.rootContext,\n );\n const rerankContext = trace.setSpan(state.rootContext, rerankSpan);\n\n state.rerankSpan = { span: rerankSpan, context: rerankContext };\n }\n\n onRerankFinish(event: RerankFinishEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rerankSpan) return;\n\n const { span } = state.rerankSpan;\n\n span.end();\n state.rerankSpan = undefined;\n }\n\n onChunk(_event: OnChunkEvent<ToolSet>): void {\n // No-op: streaming chunk events are not part of the GenAI SemConv.\n }\n\n onError(error: unknown): void {\n const event = error as { callId?: string; error?: unknown };\n if (!event?.callId) return;\n\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const actualError = event.error ?? error;\n\n if (state.stepSpan) {\n recordSpanError(state.stepSpan, actualError);\n state.stepSpan.end();\n }\n\n for (const { span: embedSpan } of state.embedSpans.values()) {\n recordSpanError(embedSpan, actualError);\n embedSpan.end();\n }\n state.embedSpans.clear();\n\n if (state.rerankSpan) {\n recordSpanError(state.rerankSpan.span, actualError);\n state.rerankSpan.span.end();\n state.rerankSpan = undefined;\n }\n\n recordSpanError(state.rootSpan, actualError);\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n}\n","import {\n LanguageModelV4CustomPart,\n LanguageModelV4FilePart,\n LanguageModelV4Message,\n LanguageModelV4Prompt,\n LanguageModelV4ReasoningFilePart,\n LanguageModelV4ReasoningPart,\n LanguageModelV4TextPart,\n LanguageModelV4ToolApprovalResponsePart,\n LanguageModelV4ToolCallPart,\n LanguageModelV4ToolResultPart,\n} from '@ai-sdk/provider';\nimport type { ModelMessage } from '@ai-sdk/provider-utils';\nimport { convertDataContentToBase64String } from 'ai';\n\ntype LanguageModelV4ContentPart =\n | LanguageModelV4TextPart\n | LanguageModelV4FilePart\n | LanguageModelV4CustomPart\n | LanguageModelV4ReasoningPart\n | LanguageModelV4ReasoningFilePart\n | LanguageModelV4ToolCallPart\n | LanguageModelV4ToolResultPart\n | LanguageModelV4ToolApprovalResponsePart;\n\ntype SemConvPart =\n | { type: 'text'; content: string }\n | { type: 'reasoning'; content: string }\n | {\n type: 'tool_call';\n id: string | null;\n name: string;\n arguments?: unknown;\n }\n | {\n type: 'tool_call_response';\n id: string | null;\n response: unknown;\n }\n | {\n type: 'blob';\n modality: string;\n mime_type: string | null;\n content: string;\n }\n | { type: string; [key: string]: unknown };\n\ninterface SemConvInputMessage {\n role: string;\n parts: SemConvPart[];\n}\n\ninterface SemConvOutputMessage {\n role: string;\n parts: SemConvPart[];\n finish_reason: string;\n}\n\ninterface SemConvSystemInstruction {\n type: string;\n content?: string;\n [key: string]: unknown;\n}\n\n/**\n * Maps an AI SDK provider string (e.g. \"anthropic.messages\", \"openai.chat\")\n * to a well-known gen_ai.provider.name value per the OTel GenAI SemConv.\n *\n * Provider strings come in formats like:\n * \"openai.chat\", \"google.generative-ai\", \"google.vertex.chat\",\n * \"google-vertex\", \"amazon-bedrock.chat\", \"azure.chat\"\n *\n * We match against longest-prefix-first to handle multi-segment prefixes\n * like \"google.vertex\" and \"google.generative-ai\" before the single-segment \"google\".\n */\nexport function mapProviderName(provider: string): string {\n const lower = provider.toLowerCase();\n\n const wellKnownPrefixes: Array<[string, string]> = [\n ['google.vertex', 'gcp.vertex_ai'],\n ['google.generative-ai', 'gcp.gemini'],\n ['google-vertex', 'gcp.vertex_ai'],\n ['amazon-bedrock', 'aws.bedrock'],\n ['azure-openai', 'azure.ai.openai'],\n ['anthropic', 'anthropic'],\n ['openai', 'openai'],\n ['azure', 'azure.ai.inference'],\n ['google', 'gcp.gemini'],\n ['mistral', 'mistral_ai'],\n ['cohere', 'cohere'],\n ['bedrock', 'aws.bedrock'],\n ['groq', 'groq'],\n ['deepseek', 'deepseek'],\n ['perplexity', 'perplexity'],\n ['xai', 'x_ai'],\n ];\n\n for (const [prefix, mapped] of wellKnownPrefixes) {\n if (\n lower === prefix ||\n lower.startsWith(prefix + '.') ||\n lower.startsWith(prefix + '-')\n ) {\n return mapped;\n }\n }\n\n return provider;\n}\n\n/**\n * Maps an AI SDK operationId to a gen_ai.operation.name value.\n */\nexport function mapOperationName(operationId: string): string {\n const mapping: Record<string, string> = {\n 'ai.generateText': 'invoke_agent',\n 'ai.streamText': 'invoke_agent',\n 'ai.generateObject': 'invoke_agent',\n 'ai.streamObject': 'invoke_agent',\n 'ai.embed': 'embeddings',\n 'ai.embedMany': 'embeddings',\n 'ai.rerank': 'rerank',\n };\n return mapping[operationId] ?? operationId;\n}\n\n/**\n * Converts a system value to the gen_ai.system_instructions SemConv format.\n * Accepts a plain string, a single SystemModelMessage, or an array of them.\n * Schema: array of parts, each with at least { type, content }.\n */\nexport function formatSystemInstructions(\n system:\n | string\n | { role: 'system'; content: string }\n | Array<{ role: 'system'; content: string }>,\n): SemConvSystemInstruction[] {\n if (typeof system === 'string') {\n return [{ type: 'text', content: system }];\n }\n if (Array.isArray(system)) {\n return system.map(msg => ({ type: 'text', content: msg.content }));\n }\n return [{ type: 'text', content: system.content }];\n}\n\nfunction convertMessagePartToSemConv(\n part: LanguageModelV4ContentPart,\n): SemConvPart {\n switch (part.type) {\n case 'text':\n return { type: 'text', content: part.text };\n\n case 'reasoning':\n return { type: 'reasoning', content: part.text };\n\n case 'tool-call':\n return {\n type: 'tool_call',\n id: part.toolCallId ?? null,\n name: part.toolName,\n arguments: part.input,\n };\n\n case 'tool-result': {\n const output = part.output;\n let response: unknown;\n if (output) {\n if (output.type === 'text' || output.type === 'error-text') {\n response = output.value;\n } else if (output.type === 'json' || output.type === 'error-json') {\n response = output.value;\n } else if (output.type === 'execution-denied') {\n response = { denied: true, reason: output.reason };\n } else {\n response = output;\n }\n }\n return {\n type: 'tool_call_response',\n id: part.toolCallId ?? null,\n response,\n };\n }\n\n case 'file': {\n const data = part.data;\n let content: string;\n if (data instanceof Uint8Array) {\n content = convertDataContentToBase64String(data);\n } else if (typeof data === 'string') {\n if (data.startsWith('http://') || data.startsWith('https://')) {\n return {\n type: 'uri',\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n uri: data,\n };\n }\n content = data;\n } else {\n content = String(data);\n }\n return {\n type: 'blob',\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n content,\n };\n }\n\n case 'tool-approval-response':\n return {\n type: 'tool_approval_response',\n approval_id: part.approvalId,\n approved: part.approved,\n reason: part.reason,\n };\n\n case 'custom':\n return { type: 'custom', kind: part.kind };\n\n case 'reasoning-file':\n return { type: String(part.type) };\n\n default: {\n const _exhaustive: never = part;\n return { type: String((_exhaustive as { type: string }).type) };\n }\n }\n}\n\nfunction getModality(mediaType: string | undefined): string {\n if (!mediaType) return 'image';\n if (mediaType.startsWith('image/')) return 'image';\n if (mediaType.startsWith('video/')) return 'video';\n if (mediaType.startsWith('audio/')) return 'audio';\n return 'image';\n}\n\n/**\n * Converts a LanguageModelV4Prompt to the gen_ai.input.messages SemConv format.\n * System messages are excluded (they go into gen_ai.system_instructions).\n */\nexport function formatInputMessages(\n prompt: LanguageModelV4Prompt,\n): SemConvInputMessage[] {\n return prompt\n .filter(msg => msg.role !== 'system')\n .map((message: LanguageModelV4Message) => {\n if (message.role === 'system') {\n return {\n role: 'system',\n parts: [{ type: 'text', content: message.content }],\n };\n }\n\n const parts = message.content.map(convertMessagePartToSemConv);\n return { role: message.role, parts };\n });\n}\n\n/**\n * Converts user-facing ModelMessage[] (and optional prompt string) to the\n * gen_ai.input.messages SemConv format. System messages are excluded\n * (they belong in gen_ai.system_instructions).\n */\nexport function formatModelMessages({\n prompt,\n messages,\n}: {\n prompt: string | Array<ModelMessage> | undefined;\n messages: Array<ModelMessage> | undefined;\n}): SemConvInputMessage[] {\n const result: SemConvInputMessage[] = [];\n\n if (typeof prompt === 'string') {\n result.push({\n role: 'user',\n parts: [{ type: 'text', content: prompt }],\n });\n } else if (Array.isArray(prompt)) {\n for (const msg of prompt) {\n const converted = convertModelMessageToSemConv(msg);\n if (converted) result.push(converted);\n }\n }\n\n if (messages) {\n for (const msg of messages) {\n const converted = convertModelMessageToSemConv(msg);\n if (converted) result.push(converted);\n }\n }\n\n return result;\n}\n\nfunction convertModelMessageToSemConv(\n msg: ModelMessage,\n): SemConvInputMessage | undefined {\n if (msg.role === 'system') return undefined;\n\n if (msg.role === 'user') {\n if (typeof msg.content === 'string') {\n return {\n role: 'user',\n parts: [{ type: 'text', content: msg.content }],\n };\n }\n const parts: SemConvPart[] = msg.content.map(part => {\n switch (part.type) {\n case 'text':\n return { type: 'text' as const, content: part.text };\n case 'image': {\n const data = part.image;\n if (data instanceof URL) {\n return {\n type: 'uri' as const,\n modality: 'image',\n mime_type: part.mediaType ?? null,\n uri: data.toString(),\n };\n }\n if (typeof data === 'string') {\n if (data.startsWith('http://') || data.startsWith('https://')) {\n return {\n type: 'uri' as const,\n modality: 'image',\n mime_type: part.mediaType ?? null,\n uri: data,\n };\n }\n return {\n type: 'blob' as const,\n modality: 'image',\n mime_type: part.mediaType ?? null,\n content: data,\n };\n }\n return {\n type: 'blob' as const,\n modality: 'image',\n mime_type: part.mediaType ?? null,\n content: convertDataContentToBase64String(data as Uint8Array),\n };\n }\n case 'file': {\n const data = part.data;\n if (data instanceof URL) {\n return {\n type: 'uri' as const,\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n uri: data.toString(),\n };\n }\n if (typeof data === 'string') {\n if (data.startsWith('http://') || data.startsWith('https://')) {\n return {\n type: 'uri' as const,\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n uri: data,\n };\n }\n return {\n type: 'blob' as const,\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n content: data,\n };\n }\n return {\n type: 'blob' as const,\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n content: convertDataContentToBase64String(data as Uint8Array),\n };\n }\n default:\n return { type: String((part as { type: string }).type) };\n }\n });\n return { role: 'user', parts };\n }\n\n if (msg.role === 'assistant') {\n if (typeof msg.content === 'string') {\n return {\n role: 'assistant',\n parts: [{ type: 'text', content: msg.content }],\n };\n }\n const parts: SemConvPart[] = msg.content.map(part => {\n switch (part.type) {\n case 'text':\n return { type: 'text' as const, content: part.text };\n case 'reasoning':\n return { type: 'reasoning' as const, content: part.text };\n case 'tool-call':\n return {\n type: 'tool_call' as const,\n id: part.toolCallId ?? null,\n name: part.toolName,\n arguments: part.input,\n };\n case 'tool-result': {\n const output = part.output;\n let response: unknown;\n if (output) {\n if (output.type === 'text' || output.type === 'error-text') {\n response = output.value;\n } else if (output.type === 'json' || output.type === 'error-json') {\n response = output.value;\n } else if (output.type === 'execution-denied') {\n response = { denied: true, reason: output.reason };\n } else {\n response = output;\n }\n }\n return {\n type: 'tool_call_response' as const,\n id: part.toolCallId ?? null,\n response,\n };\n }\n default:\n return { type: String((part as { type: string }).type) };\n }\n });\n return { role: 'assistant', parts };\n }\n\n if (msg.role === 'tool') {\n const parts: SemConvPart[] = msg.content.map(part => {\n if (part.type === 'tool-result') {\n const output = part.output;\n let response: unknown;\n if (output) {\n if (output.type === 'text' || output.type === 'error-text') {\n response = output.value;\n } else if (output.type === 'json' || output.type === 'error-json') {\n response = output.value;\n } else if (output.type === 'execution-denied') {\n response = { denied: true, reason: output.reason };\n } else {\n response = output;\n }\n }\n return {\n type: 'tool_call_response' as const,\n id: part.toolCallId ?? null,\n response,\n };\n }\n return { type: String((part as { type: string }).type) };\n });\n return { role: 'tool', parts };\n }\n\n return undefined;\n}\n\n/**\n * Extracts the system instruction from a LanguageModelV4Prompt if present.\n */\nexport function extractSystemFromPrompt(\n prompt: LanguageModelV4Prompt,\n): string | undefined {\n const systemMsg = prompt.find(msg => msg.role === 'system');\n if (systemMsg && systemMsg.role === 'system') {\n return systemMsg.content;\n }\n return undefined;\n}\n\n/**\n * Converts step result data to the gen_ai.output.messages SemConv format.\n */\nexport function formatOutputMessages({\n text,\n reasoning,\n toolCalls,\n files,\n finishReason,\n}: {\n text?: string;\n reasoning?: ReadonlyArray<{ text?: string }>;\n toolCalls?: ReadonlyArray<{\n toolCallId: string;\n toolName: string;\n input: unknown;\n }>;\n files?: ReadonlyArray<{ mediaType: string; base64: string }>;\n finishReason: string;\n}): SemConvOutputMessage[] {\n const parts: SemConvPart[] = [];\n\n if (reasoning) {\n for (const r of reasoning) {\n if ('text' in r && r.text) {\n parts.push({ type: 'reasoning', content: r.text });\n }\n }\n }\n\n if (text != null && text.length > 0) {\n parts.push({ type: 'text', content: text });\n }\n\n if (toolCalls) {\n for (const tc of toolCalls) {\n parts.push({\n type: 'tool_call',\n id: tc.toolCallId,\n name: tc.toolName,\n arguments: tc.input,\n });\n }\n }\n\n if (files) {\n for (const file of files) {\n parts.push({\n type: 'blob',\n modality: getModality(file.mediaType),\n mime_type: file.mediaType,\n content: file.base64,\n });\n }\n }\n\n return [\n {\n role: 'assistant',\n parts,\n finish_reason: mapFinishReason(finishReason),\n },\n ];\n}\n\n/**\n * Converts generateObject result to the gen_ai.output.messages SemConv format.\n */\nexport function formatObjectOutputMessages({\n objectText,\n finishReason,\n}: {\n objectText: string;\n finishReason: string;\n}): SemConvOutputMessage[] {\n return [\n {\n role: 'assistant',\n parts: [{ type: 'text', content: objectText }],\n finish_reason: mapFinishReason(finishReason),\n },\n ];\n}\n\nfunction mapFinishReason(reason: string): string {\n const mapping: Record<string, string> = {\n stop: 'stop',\n length: 'length',\n 'content-filter': 'content_filter',\n 'tool-calls': 'tool_call',\n error: 'error',\n other: 'stop',\n unknown: 'stop',\n };\n return mapping[reason] ?? reason;\n}\n","import { LanguageModelV4Prompt } from '@ai-sdk/provider';\nimport type { Context as AISDKContext } from '@ai-sdk/provider-utils';\nimport {\n Attributes,\n AttributeValue,\n context,\n Context as OpenTelemetryContext,\n Span,\n SpanStatusCode,\n trace,\n Tracer,\n} from '@opentelemetry/api';\nimport type {\n EmbedFinishEvent,\n EmbedOnFinishEvent,\n EmbedOnStartEvent,\n EmbedStartEvent,\n ObjectOnFinishEvent,\n ObjectOnStartEvent,\n ObjectOnStepFinishEvent,\n ObjectOnStepStartEvent,\n OnChunkEvent,\n OnFinishEvent,\n OnStartEvent,\n OnStepFinishEvent,\n OnStepStartEvent,\n OnToolCallFinishEvent,\n OnToolCallStartEvent,\n OutputInterface as Output,\n RerankFinishEvent,\n RerankOnFinishEvent,\n RerankOnStartEvent,\n RerankStartEvent,\n TelemetryIntegration,\n TelemetrySettings,\n ToolSet,\n} from 'ai';\nimport { assembleOperationName } from './assemble-operation-name';\nimport { getBaseTelemetryAttributes } from './get-base-telemetry-attributes';\nimport { stringifyForTelemetry } from './stringify-for-telemetry';\n\nfunction recordSpanError(span: Span, error: unknown): void {\n if (error instanceof Error) {\n span.recordException({\n name: error.name,\n message: error.message,\n stack: error.stack,\n });\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n}\n\nfunction shouldRecord(\n telemetry: TelemetrySettings | undefined,\n): telemetry is TelemetrySettings {\n return telemetry?.isEnabled === true;\n}\n\nfunction selectAttributes(\n telemetry: TelemetrySettings | undefined,\n attributes: Record<\n string,\n | AttributeValue\n | { input: () => AttributeValue | undefined }\n | { output: () => AttributeValue | undefined }\n | undefined\n >,\n): Attributes {\n if (!shouldRecord(telemetry)) {\n return {};\n }\n\n const result: Attributes = {};\n\n for (const [key, value] of Object.entries(attributes)) {\n if (value == null) continue;\n\n if (\n typeof value === 'object' &&\n 'input' in value &&\n typeof value.input === 'function'\n ) {\n if (telemetry?.recordInputs === false) continue;\n const resolved = value.input();\n if (resolved != null) result[key] = resolved;\n continue;\n }\n\n if (\n typeof value === 'object' &&\n 'output' in value &&\n typeof value.output === 'function'\n ) {\n if (telemetry?.recordOutputs === false) continue;\n const resolved = value.output();\n if (resolved != null) result[key] = resolved;\n continue;\n }\n\n result[key] = value as AttributeValue;\n }\n\n return result;\n}\n\ninterface OtelStepStartEvent<\n TOOLS extends ToolSet = ToolSet,\n USER_CONTEXT extends AISDKContext = AISDKContext,\n OUTPUT extends Output = Output,\n> extends OnStepStartEvent<TOOLS, USER_CONTEXT, OUTPUT> {\n readonly promptMessages?: LanguageModelV4Prompt;\n readonly stepTools?: ReadonlyArray<Record<string, unknown>>;\n readonly stepToolChoice?: unknown;\n}\n\ninterface CallState {\n operationId: string;\n telemetry: TelemetrySettings | undefined;\n rootSpan: Span | undefined;\n rootContext: OpenTelemetryContext | undefined;\n stepSpan: Span | undefined;\n stepContext: OpenTelemetryContext | undefined;\n embedSpans: Map<string, { span: Span; context: OpenTelemetryContext }>;\n rerankSpan: { span: Span; context: OpenTelemetryContext } | undefined;\n toolSpans: Map<string, { span: Span; context: OpenTelemetryContext }>;\n baseTelemetryAttributes: Attributes;\n settings: Record<string, unknown>;\n}\n\nexport class OpenTelemetryIntegration implements TelemetryIntegration {\n private readonly callStates = new Map<string, CallState>();\n\n /**\n * The tracer to use for the telemetry data.\n */\n private readonly tracer: Tracer;\n\n constructor(\n options: {\n tracer?: Tracer;\n } = {},\n ) {\n this.tracer = options.tracer ?? trace.getTracer('ai');\n }\n\n private getCallState(callId: string): CallState | undefined {\n return this.callStates.get(callId);\n }\n\n private cleanupCallState(callId: string): void {\n this.callStates.delete(callId);\n }\n\n executeTool<T>({\n callId,\n toolCallId,\n execute,\n }: {\n callId: string;\n toolCallId: string;\n execute: () => PromiseLike<T>;\n }): PromiseLike<T> {\n const toolSpanEntry = this.getCallState(callId)?.toolSpans.get(toolCallId);\n\n if (toolSpanEntry == null) {\n return execute();\n }\n\n return context.with(toolSpanEntry.context, execute);\n }\n\n onStart(\n event:\n | OnStartEvent\n | ObjectOnStartEvent\n | EmbedOnStartEvent\n | RerankOnStartEvent,\n ): void {\n if (event.isEnabled !== true) return;\n\n if (\n event.operationId === 'ai.embed' ||\n event.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationStart(event as EmbedOnStartEvent);\n return;\n }\n\n if (event.operationId === 'ai.rerank') {\n this.onRerankOperationStart(event as RerankOnStartEvent);\n return;\n }\n\n if (\n event.operationId === 'ai.generateObject' ||\n event.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationStart(event as ObjectOnStartEvent);\n return;\n }\n\n this.onGenerateStart(event as OnStartEvent);\n }\n\n private onGenerateStart(event: OnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n stopSequences: event.stopSequences,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n telemetry,\n headers: event.headers,\n settings,\n });\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.model.provider': event.provider,\n 'ai.model.id': event.modelId,\n 'ai.prompt': {\n input: () =>\n JSON.stringify({\n system: event.system,\n prompt: event.prompt,\n messages: event.messages,\n }),\n },\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n private onObjectOperationStart(event: ObjectOnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n telemetry,\n headers: event.headers,\n settings,\n });\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.prompt': {\n input: () =>\n JSON.stringify({\n system: event.system,\n prompt: event.prompt,\n messages: event.messages,\n }),\n },\n 'ai.schema': event.schema\n ? { input: () => JSON.stringify(event.schema) }\n : undefined,\n 'ai.schema.name': event.schemaName,\n 'ai.schema.description': event.schemaDescription,\n 'ai.settings.output': event.output,\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n /** @deprecated */\n onObjectStepStart(event: ObjectOnStepStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const stepOperationId =\n state.operationId === 'ai.streamObject'\n ? 'ai.streamObject.doStream'\n : 'ai.generateObject.doGenerate';\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: stepOperationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.prompt.messages': {\n input: () =>\n event.promptMessages\n ? stringifyForTelemetry(event.promptMessages)\n : undefined,\n },\n\n 'gen_ai.system': event.provider,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n });\n\n state.stepSpan = this.tracer.startSpan(\n stepOperationId,\n { attributes },\n state.rootContext,\n );\n state.stepContext = trace.setSpan(state.rootContext, state.stepSpan);\n }\n\n /** @deprecated */\n onObjectStepFinish(event: ObjectOnStepFinishEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepSpan) return;\n\n const { telemetry } = state;\n\n state.stepSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.object': {\n output: () => {\n try {\n return JSON.stringify(JSON.parse(event.objectText));\n } catch {\n return event.objectText;\n }\n },\n },\n 'ai.response.id': event.response.id,\n 'ai.response.model': event.response.modelId,\n 'ai.response.timestamp': event.response.timestamp.toISOString(),\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.usage.inputTokens,\n 'ai.usage.outputTokens': event.usage.outputTokens,\n 'ai.usage.totalTokens': event.usage.totalTokens,\n 'ai.usage.reasoningTokens': event.usage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.usage.cachedInputTokens,\n\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.response.id,\n 'gen_ai.response.model': event.response.modelId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n }),\n );\n\n if (event.msToFirstChunk != null) {\n state.stepSpan.addEvent('ai.stream.firstChunk', {\n 'ai.stream.msToFirstChunk': event.msToFirstChunk,\n });\n state.stepSpan.setAttributes({\n 'ai.stream.msToFirstChunk': event.msToFirstChunk,\n });\n }\n\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n private onEmbedOperationStart(event: EmbedOnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\n };\n\n const settings: Record<string, unknown> = {\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n telemetry,\n headers: event.headers,\n settings,\n });\n\n const value = event.value;\n const isMany = event.operationId === 'ai.embedMany';\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n ...(isMany\n ? {\n 'ai.values': {\n input: () => (value as string[]).map(v => JSON.stringify(v)),\n },\n }\n : {\n 'ai.value': {\n input: () => JSON.stringify(value),\n },\n }),\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n onStepStart(event: OtelStepStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const stepOperationId =\n state.operationId === 'ai.streamText'\n ? 'ai.streamText.doStream'\n : 'ai.generateText.doGenerate';\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: stepOperationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.model.provider': event.provider,\n 'ai.model.id': event.modelId,\n\n 'ai.prompt.messages': {\n input: () =>\n event.promptMessages\n ? stringifyForTelemetry(event.promptMessages)\n : undefined,\n },\n 'ai.prompt.tools': {\n input: () => event.stepTools?.map(tool => JSON.stringify(tool)),\n },\n 'ai.prompt.toolChoice': {\n input: () =>\n event.stepToolChoice != null\n ? JSON.stringify(event.stepToolChoice)\n : undefined,\n },\n\n 'gen_ai.system': event.provider,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.stop_sequences': state.settings.stopSequences as\n | string[]\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n });\n\n state.stepSpan = this.tracer.startSpan(\n stepOperationId,\n { attributes },\n state.rootContext,\n );\n state.stepContext = trace.setSpan(state.rootContext, state.stepSpan);\n }\n\n onToolCallStart(event: OnToolCallStartEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepContext) return;\n\n const { telemetry } = state;\n const { toolCall } = event;\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: 'ai.toolCall',\n telemetry,\n }),\n 'ai.toolCall.name': toolCall.toolName,\n 'ai.toolCall.id': toolCall.toolCallId,\n 'ai.toolCall.args': {\n output: () => JSON.stringify(toolCall.input),\n },\n });\n\n const toolSpan = this.tracer.startSpan(\n 'ai.toolCall',\n { attributes },\n state.stepContext,\n );\n const toolContext = trace.setSpan(state.stepContext, toolSpan);\n\n state.toolSpans.set(toolCall.toolCallId, {\n span: toolSpan,\n context: toolContext,\n });\n }\n\n onToolCallFinish(event: OnToolCallFinishEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const toolSpanEntry = state.toolSpans.get(event.toolCall.toolCallId);\n if (!toolSpanEntry) return;\n\n const { span } = toolSpanEntry;\n const { telemetry } = state;\n\n if (event.success) {\n try {\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.toolCall.result': {\n output: () => JSON.stringify(event.output),\n },\n }),\n );\n } catch {\n // JSON.stringify might fail for non-serializable results\n }\n } else {\n recordSpanError(span, event.error);\n }\n\n span.end();\n state.toolSpans.delete(event.toolCall.toolCallId);\n }\n\n onStepFinish(event: OnStepFinishEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepSpan) return;\n\n const { telemetry } = state;\n\n state.stepSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.text': {\n output: () => event.text ?? undefined,\n },\n 'ai.response.reasoning': {\n output: () =>\n event.reasoning.length > 0\n ? event.reasoning\n .filter(part => 'text' in part)\n .map(part => part.text)\n .join('\\n')\n : undefined,\n },\n 'ai.response.toolCalls': {\n output: () =>\n event.toolCalls.length > 0\n ? JSON.stringify(\n event.toolCalls.map(toolCall => ({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n })),\n )\n : undefined,\n },\n 'ai.response.files': {\n output: () =>\n event.files.length > 0\n ? JSON.stringify(\n event.files.map(file => ({\n type: 'file',\n mediaType: file.mediaType,\n data: file.base64,\n })),\n )\n : undefined,\n },\n 'ai.response.id': event.response.id,\n 'ai.response.model': event.response.modelId,\n 'ai.response.timestamp': event.response.timestamp.toISOString(),\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.usage.inputTokens,\n 'ai.usage.outputTokens': event.usage.outputTokens,\n 'ai.usage.totalTokens': event.usage.totalTokens,\n 'ai.usage.reasoningTokens': event.usage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.usage.cachedInputTokens,\n 'ai.usage.inputTokenDetails.noCacheTokens':\n event.usage.inputTokenDetails?.noCacheTokens,\n 'ai.usage.inputTokenDetails.cacheReadTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'ai.usage.inputTokenDetails.cacheWriteTokens':\n event.usage.inputTokenDetails?.cacheWriteTokens,\n 'ai.usage.outputTokenDetails.textTokens':\n event.usage.outputTokenDetails?.textTokens,\n 'ai.usage.outputTokenDetails.reasoningTokens':\n event.usage.outputTokenDetails?.reasoningTokens,\n\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.response.id,\n 'gen_ai.response.model': event.response.modelId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n }),\n );\n\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n onFinish(\n event:\n | OnFinishEvent<ToolSet>\n | ObjectOnFinishEvent<unknown>\n | EmbedOnFinishEvent\n | RerankOnFinishEvent,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n if (\n state.operationId === 'ai.embed' ||\n state.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationFinish(event as EmbedOnFinishEvent);\n return;\n }\n\n if (state.operationId === 'ai.rerank') {\n this.onRerankOperationFinish(event as RerankOnFinishEvent);\n return;\n }\n\n if (\n state.operationId === 'ai.generateObject' ||\n state.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationFinish(event as ObjectOnFinishEvent<unknown>);\n return;\n }\n\n this.onGenerateFinish(event as OnFinishEvent<ToolSet>);\n }\n\n private onGenerateFinish(event: OnFinishEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.text': {\n output: () => event.text ?? undefined,\n },\n 'ai.response.reasoning': {\n output: () =>\n event.reasoning.length > 0\n ? event.reasoning\n .filter(part => 'text' in part)\n .map(part => part.text)\n .join('\\n')\n : undefined,\n },\n 'ai.response.toolCalls': {\n output: () =>\n event.toolCalls.length > 0\n ? JSON.stringify(\n event.toolCalls.map(toolCall => ({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n })),\n )\n : undefined,\n },\n 'ai.response.files': {\n output: () =>\n event.files.length > 0\n ? JSON.stringify(\n event.files.map(file => ({\n type: 'file',\n mediaType: file.mediaType,\n data: file.base64,\n })),\n )\n : undefined,\n },\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.totalUsage.inputTokens,\n 'ai.usage.outputTokens': event.totalUsage.outputTokens,\n 'ai.usage.totalTokens': event.totalUsage.totalTokens,\n 'ai.usage.reasoningTokens': event.totalUsage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.totalUsage.cachedInputTokens,\n 'ai.usage.inputTokenDetails.noCacheTokens':\n event.totalUsage.inputTokenDetails?.noCacheTokens,\n 'ai.usage.inputTokenDetails.cacheReadTokens':\n event.totalUsage.inputTokenDetails?.cacheReadTokens,\n 'ai.usage.inputTokenDetails.cacheWriteTokens':\n event.totalUsage.inputTokenDetails?.cacheWriteTokens,\n 'ai.usage.outputTokenDetails.textTokens':\n event.totalUsage.outputTokenDetails?.textTokens,\n 'ai.usage.outputTokenDetails.reasoningTokens':\n event.totalUsage.outputTokenDetails?.reasoningTokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onObjectOperationFinish(event: ObjectOnFinishEvent<unknown>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.object': {\n output: () =>\n event.object != null ? JSON.stringify(event.object) : undefined,\n },\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.usage.inputTokens,\n 'ai.usage.outputTokens': event.usage.outputTokens,\n 'ai.usage.totalTokens': event.usage.totalTokens,\n 'ai.usage.reasoningTokens': event.usage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.usage.cachedInputTokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onEmbedOperationFinish(event: EmbedOnFinishEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n const isMany = state.operationId === 'ai.embedMany';\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n ...(isMany\n ? {\n 'ai.embeddings': {\n output: () =>\n (event.embedding as number[][]).map(e => JSON.stringify(e)),\n },\n }\n : {\n 'ai.embedding': {\n output: () => JSON.stringify(event.embedding),\n },\n }),\n 'ai.usage.tokens': event.usage.tokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onEmbedStart(event: EmbedStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.values': {\n input: () => event.values.map(v => JSON.stringify(v)),\n },\n });\n\n const embedSpan = this.tracer.startSpan(\n event.operationId,\n { attributes },\n state.rootContext,\n );\n const embedContext = trace.setSpan(state.rootContext, embedSpan);\n\n state.embedSpans.set(event.embedCallId, {\n span: embedSpan,\n context: embedContext,\n });\n }\n\n onEmbedFinish(event: EmbedFinishEvent): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const embedSpanEntry = state.embedSpans.get(event.embedCallId);\n if (!embedSpanEntry) return;\n\n const { span } = embedSpanEntry;\n const { telemetry } = state;\n\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.embeddings': {\n output: () =>\n event.embeddings.map(embedding => JSON.stringify(embedding)),\n },\n 'ai.usage.tokens': event.usage.tokens,\n }),\n );\n\n span.end();\n state.embedSpans.delete(event.embedCallId);\n }\n\n private onRerankOperationStart(event: RerankOnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\n };\n\n const settings: Record<string, unknown> = {\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n telemetry,\n headers: event.headers,\n settings,\n });\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.documents': {\n input: () => event.documents.map(d => JSON.stringify(d)),\n },\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n private onRerankOperationFinish(event: RerankOnFinishEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onRerankStart(event: RerankStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.documents': {\n input: () => event.documents.map(d => JSON.stringify(d)),\n },\n });\n\n const rerankSpan = this.tracer.startSpan(\n event.operationId,\n { attributes },\n state.rootContext,\n );\n const rerankContext = trace.setSpan(state.rootContext, rerankSpan);\n\n state.rerankSpan = { span: rerankSpan, context: rerankContext };\n }\n\n onRerankFinish(event: RerankFinishEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rerankSpan) return;\n\n const { span } = state.rerankSpan;\n const { telemetry } = state;\n\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.ranking.type': event.documentsType,\n 'ai.ranking': {\n output: () => event.ranking.map(r => JSON.stringify(r)),\n },\n }),\n );\n\n span.end();\n state.rerankSpan = undefined;\n }\n\n onChunk(event: OnChunkEvent<ToolSet>): void {\n const chunk = event.chunk as {\n type: string;\n callId?: unknown;\n attributes?: unknown;\n };\n\n if (typeof chunk.callId !== 'string') {\n return;\n }\n\n if (\n chunk.type !== 'ai.stream.firstChunk' &&\n chunk.type !== 'ai.stream.finish'\n ) {\n return;\n }\n\n const state = this.getCallState(chunk.callId);\n if (!state?.stepSpan) return;\n\n const attributes = Object.fromEntries(\n Object.entries(\n (chunk.attributes as Record<string, unknown>) ?? {},\n ).filter(([, value]) => value != null),\n ) as Attributes;\n\n state.stepSpan.addEvent(chunk.type, attributes);\n if (Object.keys(attributes).length > 0) {\n state.stepSpan.setAttributes(attributes);\n }\n }\n\n onError(error: unknown): void {\n const event = error as { callId?: string; error?: unknown };\n if (!event?.callId) return;\n\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const actualError = event.error ?? error;\n\n if (state.stepSpan) {\n recordSpanError(state.stepSpan, actualError);\n state.stepSpan.end();\n }\n\n for (const { span: embedSpan } of state.embedSpans.values()) {\n recordSpanError(embedSpan, actualError);\n embedSpan.end();\n }\n state.embedSpans.clear();\n\n if (state.rerankSpan) {\n recordSpanError(state.rerankSpan.span, actualError);\n state.rerankSpan.span.end();\n state.rerankSpan = undefined;\n }\n\n recordSpanError(state.rootSpan, actualError);\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n}\n","import type { TelemetrySettings } from 'ai';\n\nexport function assembleOperationName({\n operationId,\n telemetry,\n}: {\n operationId: string;\n telemetry?: TelemetrySettings;\n}) {\n return {\n // standardized operation and resource name:\n 'operation.name': `${operationId}${\n telemetry?.functionId != null ? ` ${telemetry.functionId}` : ''\n }`,\n 'resource.name': telemetry?.functionId,\n\n // detailed, AI SDK specific data:\n 'ai.operationId': operationId,\n 'ai.telemetry.functionId': telemetry?.functionId,\n };\n}\n","import { Attributes, AttributeValue } from '@opentelemetry/api';\nimport type { CallSettings, TelemetrySettings } from 'ai';\n\nexport function getBaseTelemetryAttributes({\n model,\n settings,\n telemetry,\n headers,\n}: {\n model: { modelId: string; provider: string };\n settings: Omit<CallSettings, 'abortSignal' | 'headers' | 'temperature'>;\n telemetry: TelemetrySettings | undefined;\n headers: Record<string, string | undefined> | undefined;\n}): Attributes {\n return {\n 'ai.model.provider': model.provider,\n 'ai.model.id': model.modelId,\n\n // settings:\n ...Object.entries(settings).reduce((attributes, [key, value]) => {\n attributes[`ai.settings.${key}`] = value as AttributeValue;\n return attributes;\n }, {} as Attributes),\n\n // add metadata as attributes:\n ...Object.entries(telemetry?.metadata ?? {}).reduce(\n (attributes, [key, value]) => {\n if (value != undefined) {\n attributes[`ai.telemetry.metadata.${key}`] = value as AttributeValue;\n }\n return attributes;\n },\n {} as Attributes,\n ),\n\n // request headers\n ...Object.entries(headers ?? {}).reduce((attributes, [key, value]) => {\n if (value !== undefined) {\n attributes[`ai.request.headers.${key}`] = value;\n }\n return attributes;\n }, {} as Attributes),\n };\n}\n","import {\n LanguageModelV4Message,\n LanguageModelV4Prompt,\n} from '@ai-sdk/provider';\nimport { convertDataContentToBase64String } from 'ai';\n\n/**\n * Helper utility to serialize prompt content for OpenTelemetry tracing.\n * It is initially created because normalized LanguageModelV4Prompt carries\n * images as Uint8Arrays, on which JSON.stringify acts weirdly, converting\n * them to objects with stringified indices as keys, e.g. {\"0\": 42, \"1\": 69 }.\n */\nexport function stringifyForTelemetry(prompt: LanguageModelV4Prompt): string {\n return JSON.stringify(\n prompt.map((message: LanguageModelV4Message) => ({\n ...message,\n content:\n typeof message.content === 'string'\n ? message.content\n : message.content.map(part =>\n part.type === 'file'\n ? {\n ...part,\n data:\n part.data instanceof Uint8Array\n ? convertDataContentToBase64String(part.data)\n : part.data,\n }\n : part,\n ),\n })),\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,iBAUO;;;ACCP,gBAAiD;AA8D1C,SAAS,gBAAgB,UAA0B;AACxD,QAAM,QAAQ,SAAS,YAAY;AAEnC,QAAM,oBAA6C;AAAA,IACjD,CAAC,iBAAiB,eAAe;AAAA,IACjC,CAAC,wBAAwB,YAAY;AAAA,IACrC,CAAC,iBAAiB,eAAe;AAAA,IACjC,CAAC,kBAAkB,aAAa;AAAA,IAChC,CAAC,gBAAgB,iBAAiB;AAAA,IAClC,CAAC,aAAa,WAAW;AAAA,IACzB,CAAC,UAAU,QAAQ;AAAA,IACnB,CAAC,SAAS,oBAAoB;AAAA,IAC9B,CAAC,UAAU,YAAY;AAAA,IACvB,CAAC,WAAW,YAAY;AAAA,IACxB,CAAC,UAAU,QAAQ;AAAA,IACnB,CAAC,WAAW,aAAa;AAAA,IACzB,CAAC,QAAQ,MAAM;AAAA,IACf,CAAC,YAAY,UAAU;AAAA,IACvB,CAAC,cAAc,YAAY;AAAA,IAC3B,CAAC,OAAO,MAAM;AAAA,EAChB;AAEA,aAAW,CAAC,QAAQ,MAAM,KAAK,mBAAmB;AAChD,QACE,UAAU,UACV,MAAM,WAAW,SAAS,GAAG,KAC7B,MAAM,WAAW,SAAS,GAAG,GAC7B;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,iBAAiB,aAA6B;AAjH9D;AAkHE,QAAM,UAAkC;AAAA,IACtC,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,IACnB,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,aAAa;AAAA,EACf;AACA,UAAO,aAAQ,WAAW,MAAnB,YAAwB;AACjC;AAOO,SAAS,yBACd,QAI4B;AAC5B,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,CAAC,EAAE,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,EAC3C;AACA,MAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,WAAO,OAAO,IAAI,UAAQ,EAAE,MAAM,QAAQ,SAAS,IAAI,QAAQ,EAAE;AAAA,EACnE;AACA,SAAO,CAAC,EAAE,MAAM,QAAQ,SAAS,OAAO,QAAQ,CAAC;AACnD;AAEA,SAAS,4BACP,MACa;AApJf;AAqJE,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,EAAE,MAAM,QAAQ,SAAS,KAAK,KAAK;AAAA,IAE5C,KAAK;AACH,aAAO,EAAE,MAAM,aAAa,SAAS,KAAK,KAAK;AAAA,IAEjD,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAI,UAAK,eAAL,YAAmB;AAAA,QACvB,MAAM,KAAK;AAAA,QACX,WAAW,KAAK;AAAA,MAClB;AAAA,IAEF,KAAK,eAAe;AAClB,YAAM,SAAS,KAAK;AACpB,UAAI;AACJ,UAAI,QAAQ;AACV,YAAI,OAAO,SAAS,UAAU,OAAO,SAAS,cAAc;AAC1D,qBAAW,OAAO;AAAA,QACpB,WAAW,OAAO,SAAS,UAAU,OAAO,SAAS,cAAc;AACjE,qBAAW,OAAO;AAAA,QACpB,WAAW,OAAO,SAAS,oBAAoB;AAC7C,qBAAW,EAAE,QAAQ,MAAM,QAAQ,OAAO,OAAO;AAAA,QACnD,OAAO;AACL,qBAAW;AAAA,QACb;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAI,UAAK,eAAL,YAAmB;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK,QAAQ;AACX,YAAM,OAAO,KAAK;AAClB,UAAI;AACJ,UAAI,gBAAgB,YAAY;AAC9B,sBAAU,4CAAiC,IAAI;AAAA,MACjD,WAAW,OAAO,SAAS,UAAU;AACnC,YAAI,KAAK,WAAW,SAAS,KAAK,KAAK,WAAW,UAAU,GAAG;AAC7D,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,UAAU,YAAY,KAAK,SAAS;AAAA,YACpC,YAAW,UAAK,cAAL,YAAkB;AAAA,YAC7B,KAAK;AAAA,UACP;AAAA,QACF;AACA,kBAAU;AAAA,MACZ,OAAO;AACL,kBAAU,OAAO,IAAI;AAAA,MACvB;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU,YAAY,KAAK,SAAS;AAAA,QACpC,YAAW,UAAK,cAAL,YAAkB;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa,KAAK;AAAA,QAClB,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,MACf;AAAA,IAEF,KAAK;AACH,aAAO,EAAE,MAAM,UAAU,MAAM,KAAK,KAAK;AAAA,IAE3C,KAAK;AACH,aAAO,EAAE,MAAM,OAAO,KAAK,IAAI,EAAE;AAAA,IAEnC,SAAS;AACP,YAAM,cAAqB;AAC3B,aAAO,EAAE,MAAM,OAAQ,YAAiC,IAAI,EAAE;AAAA,IAChE;AAAA,EACF;AACF;AAEA,SAAS,YAAY,WAAuC;AAC1D,MAAI,CAAC,UAAW,QAAO;AACvB,MAAI,UAAU,WAAW,QAAQ,EAAG,QAAO;AAC3C,MAAI,UAAU,WAAW,QAAQ,EAAG,QAAO;AAC3C,MAAI,UAAU,WAAW,QAAQ,EAAG,QAAO;AAC3C,SAAO;AACT;AAMO,SAAS,oBACd,QACuB;AACvB,SAAO,OACJ,OAAO,SAAO,IAAI,SAAS,QAAQ,EACnC,IAAI,CAAC,YAAoC;AACxC,QAAI,QAAQ,SAAS,UAAU;AAC7B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,CAAC,EAAE,MAAM,QAAQ,SAAS,QAAQ,QAAQ,CAAC;AAAA,MACpD;AAAA,IACF;AAEA,UAAM,QAAQ,QAAQ,QAAQ,IAAI,2BAA2B;AAC7D,WAAO,EAAE,MAAM,QAAQ,MAAM,MAAM;AAAA,EACrC,CAAC;AACL;AAOO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AACF,GAG0B;AACxB,QAAM,SAAgC,CAAC;AAEvC,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,OAAO,CAAC,EAAE,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,IAC3C,CAAC;AAAA,EACH,WAAW,MAAM,QAAQ,MAAM,GAAG;AAChC,eAAW,OAAO,QAAQ;AACxB,YAAM,YAAY,6BAA6B,GAAG;AAClD,UAAI,UAAW,QAAO,KAAK,SAAS;AAAA,IACtC;AAAA,EACF;AAEA,MAAI,UAAU;AACZ,eAAW,OAAO,UAAU;AAC1B,YAAM,YAAY,6BAA6B,GAAG;AAClD,UAAI,UAAW,QAAO,KAAK,SAAS;AAAA,IACtC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,6BACP,KACiC;AACjC,MAAI,IAAI,SAAS,SAAU,QAAO;AAElC,MAAI,IAAI,SAAS,QAAQ;AACvB,QAAI,OAAO,IAAI,YAAY,UAAU;AACnC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,CAAC,EAAE,MAAM,QAAQ,SAAS,IAAI,QAAQ,CAAC;AAAA,MAChD;AAAA,IACF;AACA,UAAM,QAAuB,IAAI,QAAQ,IAAI,UAAQ;AAtTzD;AAuTM,cAAQ,KAAK,MAAM;AAAA,QACjB,KAAK;AACH,iBAAO,EAAE,MAAM,QAAiB,SAAS,KAAK,KAAK;AAAA,QACrD,KAAK,SAAS;AACZ,gBAAM,OAAO,KAAK;AAClB,cAAI,gBAAgB,KAAK;AACvB,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,UAAU;AAAA,cACV,YAAW,UAAK,cAAL,YAAkB;AAAA,cAC7B,KAAK,KAAK,SAAS;AAAA,YACrB;AAAA,UACF;AACA,cAAI,OAAO,SAAS,UAAU;AAC5B,gBAAI,KAAK,WAAW,SAAS,KAAK,KAAK,WAAW,UAAU,GAAG;AAC7D,qBAAO;AAAA,gBACL,MAAM;AAAA,gBACN,UAAU;AAAA,gBACV,YAAW,UAAK,cAAL,YAAkB;AAAA,gBAC7B,KAAK;AAAA,cACP;AAAA,YACF;AACA,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,UAAU;AAAA,cACV,YAAW,UAAK,cAAL,YAAkB;AAAA,cAC7B,SAAS;AAAA,YACX;AAAA,UACF;AACA,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,UAAU;AAAA,YACV,YAAW,UAAK,cAAL,YAAkB;AAAA,YAC7B,aAAS,4CAAiC,IAAkB;AAAA,UAC9D;AAAA,QACF;AAAA,QACA,KAAK,QAAQ;AACX,gBAAM,OAAO,KAAK;AAClB,cAAI,gBAAgB,KAAK;AACvB,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,UAAU,YAAY,KAAK,SAAS;AAAA,cACpC,YAAW,UAAK,cAAL,YAAkB;AAAA,cAC7B,KAAK,KAAK,SAAS;AAAA,YACrB;AAAA,UACF;AACA,cAAI,OAAO,SAAS,UAAU;AAC5B,gBAAI,KAAK,WAAW,SAAS,KAAK,KAAK,WAAW,UAAU,GAAG;AAC7D,qBAAO;AAAA,gBACL,MAAM;AAAA,gBACN,UAAU,YAAY,KAAK,SAAS;AAAA,gBACpC,YAAW,UAAK,cAAL,YAAkB;AAAA,gBAC7B,KAAK;AAAA,cACP;AAAA,YACF;AACA,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,UAAU,YAAY,KAAK,SAAS;AAAA,cACpC,YAAW,UAAK,cAAL,YAAkB;AAAA,cAC7B,SAAS;AAAA,YACX;AAAA,UACF;AACA,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,UAAU,YAAY,KAAK,SAAS;AAAA,YACpC,YAAW,UAAK,cAAL,YAAkB;AAAA,YAC7B,aAAS,4CAAiC,IAAkB;AAAA,UAC9D;AAAA,QACF;AAAA,QACA;AACE,iBAAO,EAAE,MAAM,OAAQ,KAA0B,IAAI,EAAE;AAAA,MAC3D;AAAA,IACF,CAAC;AACD,WAAO,EAAE,MAAM,QAAQ,MAAM;AAAA,EAC/B;AAEA,MAAI,IAAI,SAAS,aAAa;AAC5B,QAAI,OAAO,IAAI,YAAY,UAAU;AACnC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,CAAC,EAAE,MAAM,QAAQ,SAAS,IAAI,QAAQ,CAAC;AAAA,MAChD;AAAA,IACF;AACA,UAAM,QAAuB,IAAI,QAAQ,IAAI,UAAQ;AA1YzD;AA2YM,cAAQ,KAAK,MAAM;AAAA,QACjB,KAAK;AACH,iBAAO,EAAE,MAAM,QAAiB,SAAS,KAAK,KAAK;AAAA,QACrD,KAAK;AACH,iBAAO,EAAE,MAAM,aAAsB,SAAS,KAAK,KAAK;AAAA,QAC1D,KAAK;AACH,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,KAAI,UAAK,eAAL,YAAmB;AAAA,YACvB,MAAM,KAAK;AAAA,YACX,WAAW,KAAK;AAAA,UAClB;AAAA,QACF,KAAK,eAAe;AAClB,gBAAM,SAAS,KAAK;AACpB,cAAI;AACJ,cAAI,QAAQ;AACV,gBAAI,OAAO,SAAS,UAAU,OAAO,SAAS,cAAc;AAC1D,yBAAW,OAAO;AAAA,YACpB,WAAW,OAAO,SAAS,UAAU,OAAO,SAAS,cAAc;AACjE,yBAAW,OAAO;AAAA,YACpB,WAAW,OAAO,SAAS,oBAAoB;AAC7C,yBAAW,EAAE,QAAQ,MAAM,QAAQ,OAAO,OAAO;AAAA,YACnD,OAAO;AACL,yBAAW;AAAA,YACb;AAAA,UACF;AACA,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,KAAI,UAAK,eAAL,YAAmB;AAAA,YACvB;AAAA,UACF;AAAA,QACF;AAAA,QACA;AACE,iBAAO,EAAE,MAAM,OAAQ,KAA0B,IAAI,EAAE;AAAA,MAC3D;AAAA,IACF,CAAC;AACD,WAAO,EAAE,MAAM,aAAa,MAAM;AAAA,EACpC;AAEA,MAAI,IAAI,SAAS,QAAQ;AACvB,UAAM,QAAuB,IAAI,QAAQ,IAAI,UAAQ;AAnbzD;AAobM,UAAI,KAAK,SAAS,eAAe;AAC/B,cAAM,SAAS,KAAK;AACpB,YAAI;AACJ,YAAI,QAAQ;AACV,cAAI,OAAO,SAAS,UAAU,OAAO,SAAS,cAAc;AAC1D,uBAAW,OAAO;AAAA,UACpB,WAAW,OAAO,SAAS,UAAU,OAAO,SAAS,cAAc;AACjE,uBAAW,OAAO;AAAA,UACpB,WAAW,OAAO,SAAS,oBAAoB;AAC7C,uBAAW,EAAE,QAAQ,MAAM,QAAQ,OAAO,OAAO;AAAA,UACnD,OAAO;AACL,uBAAW;AAAA,UACb;AAAA,QACF;AACA,eAAO;AAAA,UACL,MAAM;AAAA,UACN,KAAI,UAAK,eAAL,YAAmB;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AACA,aAAO,EAAE,MAAM,OAAQ,KAA0B,IAAI,EAAE;AAAA,IACzD,CAAC;AACD,WAAO,EAAE,MAAM,QAAQ,MAAM;AAAA,EAC/B;AAEA,SAAO;AACT;AAkBO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAU2B;AACzB,QAAM,QAAuB,CAAC;AAE9B,MAAI,WAAW;AACb,eAAW,KAAK,WAAW;AACzB,UAAI,UAAU,KAAK,EAAE,MAAM;AACzB,cAAM,KAAK,EAAE,MAAM,aAAa,SAAS,EAAE,KAAK,CAAC;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ,KAAK,SAAS,GAAG;AACnC,UAAM,KAAK,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,EAC5C;AAEA,MAAI,WAAW;AACb,eAAW,MAAM,WAAW;AAC1B,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,IAAI,GAAG;AAAA,QACP,MAAM,GAAG;AAAA,QACT,WAAW,GAAG;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,OAAO;AACT,eAAW,QAAQ,OAAO;AACxB,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,UAAU,YAAY,KAAK,SAAS;AAAA,QACpC,WAAW,KAAK;AAAA,QAChB,SAAS,KAAK;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN;AAAA,MACA,eAAe,gBAAgB,YAAY;AAAA,IAC7C;AAAA,EACF;AACF;AAKO,SAAS,2BAA2B;AAAA,EACzC;AAAA,EACA;AACF,GAG2B;AACzB,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,OAAO,CAAC,EAAE,MAAM,QAAQ,SAAS,WAAW,CAAC;AAAA,MAC7C,eAAe,gBAAgB,YAAY;AAAA,IAC7C;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,QAAwB;AAjjBjD;AAkjBE,QAAM,UAAkC;AAAA,IACtC,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AACA,UAAO,aAAQ,MAAM,MAAd,YAAmB;AAC5B;;;AD5gBA,SAAS,gBAAgB,MAAY,OAAsB;AACzD,MAAI,iBAAiB,OAAO;AAC1B,SAAK,gBAAgB;AAAA,MACnB,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA,IACf,CAAC;AACD,SAAK,UAAU;AAAA,MACb,MAAM,0BAAe;AAAA,MACrB,SAAS,MAAM;AAAA,IACjB,CAAC;AAAA,EACH,OAAO;AACL,SAAK,UAAU,EAAE,MAAM,0BAAe,MAAM,CAAC;AAAA,EAC/C;AACF;AAEA,SAAS,aACP,WACgC;AAChC,UAAO,uCAAW,eAAc;AAClC;AAEA,SAAS,iBACP,WACA,YAOY;AACZ,MAAI,CAAC,aAAa,SAAS,GAAG;AAC5B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAAqB,CAAC;AAE5B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACrD,QAAI,SAAS,KAAM;AAEnB,QACE,OAAO,UAAU,YACjB,WAAW,SACX,OAAO,MAAM,UAAU,YACvB;AACA,WAAI,uCAAW,kBAAiB,MAAO;AACvC,YAAM,WAAW,MAAM,MAAM;AAC7B,UAAI,YAAY,KAAM,QAAO,GAAG,IAAI;AACpC;AAAA,IACF;AAEA,QACE,OAAO,UAAU,YACjB,YAAY,SACZ,OAAO,MAAM,WAAW,YACxB;AACA,WAAI,uCAAW,mBAAkB,MAAO;AACxC,YAAM,WAAW,MAAM,OAAO;AAC9B,UAAI,YAAY,KAAM,QAAO,GAAG,IAAI;AACpC;AAAA,IACF;AAEA,WAAO,GAAG,IAAI;AAAA,EAChB;AAEA,SAAO;AACT;AA2BO,IAAM,gCAAN,MAAoE;AAAA,EAKzE,YACE,UAEI,CAAC,GACL;AARF,SAAiB,aAAa,oBAAI,IAAuB;AA/I3D;AAwJI,SAAK,UAAS,aAAQ,WAAR,YAAkB,iBAAM,UAAU,QAAQ;AAAA,EAC1D;AAAA,EAEQ,aAAa,QAAuC;AAC1D,WAAO,KAAK,WAAW,IAAI,MAAM;AAAA,EACnC;AAAA,EAEQ,iBAAiB,QAAsB;AAC7C,SAAK,WAAW,OAAO,MAAM;AAAA,EAC/B;AAAA,EAEA,YAAe;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAImB;AA3KrB;AA4KI,UAAM,iBAAgB,UAAK,aAAa,MAAM,MAAxB,mBAA2B,UAAU,IAAI;AAE/D,QAAI,iBAAiB,MAAM;AACzB,aAAO,QAAQ;AAAA,IACjB;AAEA,WAAO,mBAAQ,KAAK,cAAc,SAAS,OAAO;AAAA,EACpD;AAAA,EAEA,QACE,OAKM;AACN,QAAI,MAAM,cAAc,KAAM;AAE9B,QACE,MAAM,gBAAgB,cACtB,MAAM,gBAAgB,gBACtB;AACA,WAAK,sBAAsB,KAA0B;AACrD;AAAA,IACF;AAEA,QAAI,MAAM,gBAAgB,aAAa;AACrC,WAAK,uBAAuB,KAA2B;AACvD;AAAA,IACF;AAEA,QACE,MAAM,gBAAgB,uBACtB,MAAM,gBAAgB,mBACtB;AACA,WAAK,uBAAuB,KAA2B;AACvD;AAAA,IACF;AAEA,SAAK,gBAAgB,KAAqB;AAAA,EAC5C;AAAA,EAEQ,gBAAgB,OAA2B;AAtNrD;AAuNI,UAAM,YAA+B;AAAA,MACnC,WAAW,MAAM;AAAA,MACjB,cAAc,MAAM;AAAA,MACpB,eAAe,MAAM;AAAA,MACrB,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,IAClB;AAEA,UAAM,WAAoC;AAAA,MACxC,iBAAiB,MAAM;AAAA,MACvB,aAAa,MAAM;AAAA,MACnB,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,iBAAiB,MAAM;AAAA,MACvB,kBAAkB,MAAM;AAAA,MACxB,eAAe,MAAM;AAAA,MACrB,MAAM,MAAM;AAAA,MACZ,YAAY,MAAM;AAAA,IACpB;AAEA,UAAM,eAAe,gBAAgB,MAAM,QAAQ;AACnD,UAAM,gBAAgB,iBAAiB,MAAM,WAAW;AAExD,UAAM,aAAa,iBAAiB,WAAW;AAAA,MAC7C,yBAAyB;AAAA,MACzB,wBAAwB;AAAA,MACxB,wBAAwB,MAAM;AAAA,MAC9B,qBAAqB,UAAU;AAAA,MAC/B,oCAAoC,MAAM;AAAA,MAC1C,6BAA6B,MAAM;AAAA,MACnC,mCAAmC,MAAM;AAAA,MACzC,+BAA+B,WAAM,gBAAN,YAAqB;AAAA,MAGpD,wBAAwB,MAAM;AAAA,MAC9B,wBAAwB,MAAM;AAAA,MAC9B,iCAAiC,MAAM;AAAA,MACvC,uBAAuB,MAAM;AAAA,MAC7B,8BAA8B,MAAM,SAChC;AAAA,QACE,OAAO,MACL,KAAK,UAAU,yBAAyB,MAAM,MAAO,CAAC;AAAA,MAC1D,IACA;AAAA,MACJ,yBAAyB;AAAA,QACvB,OAAO,MACL,KAAK;AAAA,UACH,oBAAoB;AAAA,YAClB,QAAQ,MAAM;AAAA,YACd,UAAU,MAAM;AAAA,UAClB,CAAC;AAAA,QACH;AAAA,MACJ;AAAA,IACF,CAAC;AAED,UAAM,WAAW,GAAG,aAAa,IAAI,MAAM,OAAO;AAClD,UAAM,WAAW,KAAK,OAAO,UAAU,UAAU;AAAA,MAC/C;AAAA,MACA,MAAM,oBAAS;AAAA,IACjB,CAAC;AACD,UAAM,cAAc,iBAAM,QAAQ,mBAAQ,OAAO,GAAG,QAAQ;AAE5D,SAAK,WAAW,IAAI,MAAM,QAAQ;AAAA,MAChC,aAAa,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,aAAa;AAAA,MACb,YAAY,oBAAI,IAAI;AAAA,MACpB,YAAY;AAAA,MACZ,WAAW,oBAAI,IAAI;AAAA,MACnB;AAAA,MACA,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEQ,uBAAuB,OAAiC;AArSlE;AAsSI,UAAM,YAA+B;AAAA,MACnC,WAAW,MAAM;AAAA,MACjB,cAAc,MAAM;AAAA,MACpB,eAAe,MAAM;AAAA,MACrB,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,IAClB;AAEA,UAAM,WAAoC;AAAA,MACxC,iBAAiB,MAAM;AAAA,MACvB,aAAa,MAAM;AAAA,MACnB,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,iBAAiB,MAAM;AAAA,MACvB,kBAAkB,MAAM;AAAA,MACxB,MAAM,MAAM;AAAA,MACZ,YAAY,MAAM;AAAA,IACpB;AAEA,UAAM,eAAe,gBAAgB,MAAM,QAAQ;AACnD,UAAM,gBAAgB,iBAAiB,MAAM,WAAW;AAExD,UAAM,aAAa,iBAAiB,WAAW;AAAA,MAC7C,yBAAyB;AAAA,MACzB,wBAAwB;AAAA,MACxB,wBAAwB,MAAM;AAAA,MAC9B,qBAAqB,UAAU;AAAA,MAC/B,sBAAsB;AAAA,MACtB,oCAAoC,MAAM;AAAA,MAC1C,6BAA6B,MAAM;AAAA,MACnC,mCAAmC,MAAM;AAAA,MACzC,+BAA+B,WAAM,gBAAN,YAAqB;AAAA,MAGpD,wBAAwB,MAAM;AAAA,MAC9B,wBAAwB,MAAM;AAAA,MAC9B,uBAAuB,MAAM;AAAA,MAC7B,8BAA8B,MAAM,SAChC;AAAA,QACE,OAAO,MACL,KAAK,UAAU,yBAAyB,MAAM,MAAO,CAAC;AAAA,MAC1D,IACA;AAAA,MACJ,yBAAyB;AAAA,QACvB,OAAO,MACL,KAAK;AAAA,UACH,oBAAoB;AAAA,YAClB,QAAQ,MAAM;AAAA,YACd,UAAU,MAAM;AAAA,UAClB,CAAC;AAAA,QACH;AAAA,MACJ;AAAA,IACF,CAAC;AAED,UAAM,WAAW,GAAG,aAAa,IAAI,MAAM,OAAO;AAClD,UAAM,WAAW,KAAK,OAAO,UAAU,UAAU;AAAA,MAC/C;AAAA,MACA,MAAM,oBAAS;AAAA,IACjB,CAAC;AACD,UAAM,cAAc,iBAAM,QAAQ,mBAAQ,OAAO,GAAG,QAAQ;AAE5D,SAAK,WAAW,IAAI,MAAM,QAAQ;AAAA,MAChC,aAAa,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,aAAa;AAAA,MACb,YAAY,oBAAI,IAAI;AAAA,MACpB,YAAY;AAAA,MACZ,WAAW,oBAAI,IAAI;AAAA,MACnB;AAAA,MACA,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM;AAAA,IACjB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,kBAAkB,OAAqC;AApXzD;AAqXI,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,aAAY,CAAC,MAAM,YAAa;AAE5C,UAAM,EAAE,UAAU,IAAI;AACtB,UAAM,eAAe,gBAAgB,MAAM,QAAQ;AAEnD,UAAM,aAAa,iBAAiB,WAAW;AAAA,MAC7C,yBAAyB;AAAA,MACzB,wBAAwB;AAAA,MACxB,wBAAwB,MAAM;AAAA,MAC9B,sBAAsB;AAAA,MACtB,oCAAoC,MAAM,SAAS;AAAA,MAGnD,6BAA6B,MAAM,SAAS;AAAA,MAG5C,mCAAmC,MAAM,SAAS;AAAA,MAGlD,+BAA+B,WAAM,SAAS,gBAAf,YAA8B;AAAA,MAG7D,wBAAwB,MAAM,SAAS;AAAA,MACvC,wBAAwB,MAAM,SAAS;AAAA,MACvC,yBAAyB;AAAA,QACvB,OAAO,MACL,MAAM,iBACF,KAAK,UAAU,oBAAoB,MAAM,cAAc,CAAC,IACxD;AAAA,MACR;AAAA,IACF,CAAC;AAED,UAAM,WAAW,QAAQ,MAAM,OAAO;AACtC,UAAM,WAAW,KAAK,OAAO;AAAA,MAC3B;AAAA,MACA,EAAE,YAAY,MAAM,oBAAS,OAAO;AAAA,MACpC,MAAM;AAAA,IACR;AACA,UAAM,cAAc,iBAAM,QAAQ,MAAM,aAAa,MAAM,QAAQ;AAAA,EACrE;AAAA;AAAA,EAGA,mBAAmB,OAAsC;AACvD,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,UAAU;AAEtB,UAAM,EAAE,UAAU,IAAI;AAEtB,UAAM,SAAS;AAAA,MACb,iBAAiB,WAAW;AAAA,QAC1B,kCAAkC,CAAC,MAAM,YAAY;AAAA,QACrD,sBAAsB,MAAM,SAAS;AAAA,QACrC,yBAAyB,MAAM,SAAS;AAAA,QACxC,6BAA6B,MAAM,MAAM;AAAA,QACzC,8BAA8B,MAAM,MAAM;AAAA,QAC1C,wCAAwC,MAAM,MAAM;AAAA,QACpD,0BAA0B;AAAA,UACxB,QAAQ,MAAM;AACZ,gBAAI;AACF,qBAAO,KAAK;AAAA,gBACV,2BAA2B;AAAA,kBACzB,YAAY,MAAM;AAAA,kBAClB,cAAc,MAAM;AAAA,gBACtB,CAAC;AAAA,cACH;AAAA,YACF,SAAQ;AACN,qBAAO,MAAM;AAAA,YACf;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,IAAI;AACnB,UAAM,WAAW;AACjB,UAAM,cAAc;AAAA,EACtB;AAAA,EAEQ,sBAAsB,OAAgC;AAC5D,UAAM,YAA+B;AAAA,MACnC,WAAW,MAAM;AAAA,MACjB,cAAc,MAAM;AAAA,MACpB,eAAe,MAAM;AAAA,MACrB,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,IAClB;AAEA,UAAM,WAAoC;AAAA,MACxC,YAAY,MAAM;AAAA,IACpB;AAEA,UAAM,eAAe,gBAAgB,MAAM,QAAQ;AAEnD,UAAM,aAAa,iBAAiB,WAAW;AAAA,MAC7C,yBAAyB;AAAA,MACzB,wBAAwB;AAAA,MACxB,wBAAwB,MAAM;AAAA,IAChC,CAAC;AAED,UAAM,WAAW,cAAc,MAAM,OAAO;AAC5C,UAAM,WAAW,KAAK,OAAO,UAAU,UAAU;AAAA,MAC/C;AAAA,MACA,MAAM,oBAAS;AAAA,IACjB,CAAC;AACD,UAAM,cAAc,iBAAM,QAAQ,mBAAQ,OAAO,GAAG,QAAQ;AAE5D,SAAK,WAAW,IAAI,MAAM,QAAQ;AAAA,MAChC,aAAa,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,aAAa;AAAA,MACb,YAAY,oBAAI,IAAI;AAAA,MACpB,YAAY;AAAA,MACZ,WAAW,oBAAI,IAAI;AAAA,MACnB;AAAA,MACA,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,YAAY,OAAiC;AAhf/C;AAifI,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,aAAY,CAAC,MAAM,YAAa;AAE5C,UAAM,EAAE,UAAU,IAAI;AACtB,UAAM,eAAe,gBAAgB,MAAM,QAAQ;AAEnD,UAAM,aAAa,iBAAiB,WAAW;AAAA,MAC7C,yBAAyB;AAAA,MACzB,wBAAwB;AAAA,MACxB,wBAAwB,MAAM;AAAA,MAC9B,oCAAoC,MAAM,SAAS;AAAA,MAGnD,6BAA6B,MAAM,SAAS;AAAA,MAG5C,mCAAmC,MAAM,SAAS;AAAA,MAGlD,iCAAiC,MAAM,SAAS;AAAA,MAGhD,+BAA+B,WAAM,SAAS,gBAAf,YAA8B;AAAA,MAG7D,wBAAwB,MAAM,SAAS;AAAA,MACvC,wBAAwB,MAAM,SAAS;AAAA,MACvC,yBAAyB;AAAA,QACvB,OAAO,MACL,MAAM,iBACF,KAAK,UAAU,oBAAoB,MAAM,cAAc,CAAC,IACxD;AAAA,MACR;AAAA,MACA,2BAA2B;AAAA,QACzB,OAAO,MACL,MAAM,YAAY,KAAK,UAAU,MAAM,SAAS,IAAI;AAAA,MACxD;AAAA,IACF,CAAC;AAED,UAAM,WAAW,QAAQ,MAAM,OAAO;AACtC,UAAM,WAAW,KAAK,OAAO;AAAA,MAC3B;AAAA,MACA,EAAE,YAAY,MAAM,oBAAS,OAAO;AAAA,MACpC,MAAM;AAAA,IACR;AACA,UAAM,cAAc,iBAAM,QAAQ,MAAM,aAAa,MAAM,QAAQ;AAAA,EACrE;AAAA,EAEA,gBAAgB,OAA4C;AAC1D,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,aAAa;AAEzB,UAAM,EAAE,UAAU,IAAI;AACtB,UAAM,EAAE,SAAS,IAAI;AAErB,UAAM,aAAa,iBAAiB,WAAW;AAAA,MAC7C,yBAAyB;AAAA,MACzB,oBAAoB,SAAS;AAAA,MAC7B,uBAAuB,SAAS;AAAA,MAChC,oBAAoB;AAAA,MACpB,8BAA8B;AAAA,QAC5B,OAAO,MAAM,KAAK,UAAU,SAAS,KAAK;AAAA,MAC5C;AAAA,IACF,CAAC;AAED,UAAM,WAAW,gBAAgB,SAAS,QAAQ;AAClD,UAAM,WAAW,KAAK,OAAO;AAAA,MAC3B;AAAA,MACA,EAAE,YAAY,MAAM,oBAAS,SAAS;AAAA,MACtC,MAAM;AAAA,IACR;AACA,UAAM,cAAc,iBAAM,QAAQ,MAAM,aAAa,QAAQ;AAE7D,UAAM,UAAU,IAAI,SAAS,YAAY;AAAA,MACvC,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,iBAAiB,OAA6C;AAC5D,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,CAAC,MAAO;AAEZ,UAAM,gBAAgB,MAAM,UAAU,IAAI,MAAM,SAAS,UAAU;AACnE,QAAI,CAAC,cAAe;AAEpB,UAAM,EAAE,KAAK,IAAI;AACjB,UAAM,EAAE,UAAU,IAAI;AAEtB,QAAI,MAAM,SAAS;AACjB,UAAI;AACF,aAAK;AAAA,UACH,iBAAiB,WAAW;AAAA,YAC1B,2BAA2B;AAAA,cACzB,QAAQ,MAAM,KAAK,UAAU,MAAM,MAAM;AAAA,YAC3C;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,SAAQ;AAAA,MAER;AAAA,IACF,OAAO;AACL,sBAAgB,MAAM,MAAM,KAAK;AAAA,IACnC;AAEA,SAAK,IAAI;AACT,UAAM,UAAU,OAAO,MAAM,SAAS,UAAU;AAAA,EAClD;AAAA,EAEA,aAAa,OAAyC;AA9lBxD;AA+lBI,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,UAAU;AAEtB,UAAM,EAAE,UAAU,IAAI;AAEtB,UAAM,SAAS;AAAA,MACb,iBAAiB,WAAW;AAAA,QAC1B,kCAAkC,CAAC,MAAM,YAAY;AAAA,QACrD,sBAAsB,MAAM,SAAS;AAAA,QACrC,yBAAyB,MAAM,SAAS;AAAA,QACxC,6BAA6B,MAAM,MAAM;AAAA,QACzC,8BAA8B,MAAM,MAAM;AAAA,QAC1C,yCACE,iBAAM,MAAM,sBAAZ,mBAA+B,oBAA/B,YACA,MAAM,MAAM;AAAA,QACd,6CACE,WAAM,MAAM,sBAAZ,mBAA+B;AAAA,QACjC,0BAA0B;AAAA,UACxB,QAAQ,MAAG;AAjnBrB,gBAAAA;AAknBY,wBAAK;AAAA,cACH,qBAAqB;AAAA,gBACnB,OAAMA,MAAA,MAAM,SAAN,OAAAA,MAAc;AAAA,gBACpB,WAAW,MAAM;AAAA,gBACjB,WAAW,MAAM;AAAA,gBACjB,OAAO,MAAM;AAAA,gBACb,cAAc,MAAM;AAAA,cACtB,CAAC;AAAA,YACH;AAAA;AAAA,QACJ;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,IAAI;AACnB,UAAM,WAAW;AACjB,UAAM,cAAc;AAAA,EACtB;AAAA,EAEA,SACE,OAKM;AACN,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,UAAU;AAEtB,QACE,MAAM,gBAAgB,cACtB,MAAM,gBAAgB,gBACtB;AACA,WAAK,uBAAuB,KAA2B;AACvD;AAAA,IACF;AAEA,QAAI,MAAM,gBAAgB,aAAa;AACrC,WAAK,wBAAwB,KAA4B;AACzD;AAAA,IACF;AAEA,QACE,MAAM,gBAAgB,uBACtB,MAAM,gBAAgB,mBACtB;AACA,WAAK,wBAAwB,KAAqC;AAClE;AAAA,IACF;AAEA,SAAK,iBAAiB,KAA+B;AAAA,EACvD;AAAA,EAEQ,iBAAiB,OAAqC;AAtqBhE;AAuqBI,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,UAAU;AAEtB,UAAM,EAAE,UAAU,IAAI;AAEtB,UAAM,SAAS;AAAA,MACb,iBAAiB,WAAW;AAAA,QAC1B,kCAAkC,CAAC,MAAM,YAAY;AAAA,QACrD,6BAA6B,MAAM,WAAW;AAAA,QAC9C,8BAA8B,MAAM,WAAW;AAAA,QAC/C,yCACE,iBAAM,WAAW,sBAAjB,mBAAoC,oBAApC,YACA,MAAM,WAAW;AAAA,QACnB,6CACE,WAAM,WAAW,sBAAjB,mBAAoC;AAAA,QACtC,0BAA0B;AAAA,UACxB,QAAQ,MAAG;AAvrBrB,gBAAAA;AAwrBY,wBAAK;AAAA,cACH,qBAAqB;AAAA,gBACnB,OAAMA,MAAA,MAAM,SAAN,OAAAA,MAAc;AAAA,gBACpB,WAAW,MAAM;AAAA,gBACjB,WAAW,MAAM;AAAA,gBACjB,OAAO,MAAM;AAAA,gBACb,cAAc,MAAM;AAAA,cACtB,CAAC;AAAA,YACH;AAAA;AAAA,QACJ;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,IAAI;AACnB,SAAK,iBAAiB,MAAM,MAAM;AAAA,EACpC;AAAA,EAEQ,wBAAwB,OAA2C;AACzE,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,UAAU;AAEtB,UAAM,EAAE,UAAU,IAAI;AAEtB,UAAM,SAAS;AAAA,MACb,iBAAiB,WAAW;AAAA,QAC1B,kCAAkC,CAAC,MAAM,YAAY;AAAA,QACrD,6BAA6B,MAAM,MAAM;AAAA,QACzC,8BAA8B,MAAM,MAAM;AAAA,QAC1C,wCAAwC,MAAM,MAAM;AAAA,QACpD,0BAA0B;AAAA,UACxB,QAAQ,MACN,MAAM,UAAU,OACZ,KAAK;AAAA,YACH,2BAA2B;AAAA,cACzB,YAAY,KAAK,UAAU,MAAM,MAAM;AAAA,cACvC,cAAc,MAAM;AAAA,YACtB,CAAC;AAAA,UACH,IACA;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,IAAI;AACnB,SAAK,iBAAiB,MAAM,MAAM;AAAA,EACpC;AAAA,EAEQ,uBAAuB,OAAiC;AAC9D,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,UAAU;AAEtB,UAAM,EAAE,UAAU,IAAI;AAEtB,UAAM,SAAS;AAAA,MACb,iBAAiB,WAAW;AAAA,QAC1B,6BAA6B,MAAM,MAAM;AAAA,MAC3C,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,IAAI;AACnB,SAAK,iBAAiB,MAAM,MAAM;AAAA,EACpC;AAAA,EAEA,aAAa,OAA8B;AACzC,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,aAAY,CAAC,MAAM,YAAa;AAE5C,UAAM,EAAE,UAAU,IAAI;AACtB,UAAM,eAAe,gBAAgB,MAAM,QAAQ;AAEnD,UAAM,aAAa,iBAAiB,WAAW;AAAA,MAC7C,yBAAyB;AAAA,MACzB,wBAAwB;AAAA,MACxB,wBAAwB,MAAM;AAAA,IAChC,CAAC;AAED,UAAM,WAAW,cAAc,MAAM,OAAO;AAC5C,UAAM,YAAY,KAAK,OAAO;AAAA,MAC5B;AAAA,MACA,EAAE,YAAY,MAAM,oBAAS,OAAO;AAAA,MACpC,MAAM;AAAA,IACR;AACA,UAAM,eAAe,iBAAM,QAAQ,MAAM,aAAa,SAAS;AAE/D,UAAM,WAAW,IAAI,MAAM,aAAa;AAAA,MACtC,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,cAAc,OAA+B;AAC3C,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,CAAC,MAAO;AAEZ,UAAM,iBAAiB,MAAM,WAAW,IAAI,MAAM,WAAW;AAC7D,QAAI,CAAC,eAAgB;AAErB,UAAM,EAAE,KAAK,IAAI;AACjB,UAAM,EAAE,UAAU,IAAI;AAEtB,SAAK;AAAA,MACH,iBAAiB,WAAW;AAAA,QAC1B,6BAA6B,MAAM,MAAM;AAAA,MAC3C,CAAC;AAAA,IACH;AAEA,SAAK,IAAI;AACT,UAAM,WAAW,OAAO,MAAM,WAAW;AAAA,EAC3C;AAAA,EAEQ,uBAAuB,OAAiC;AAC9D,UAAM,YAA+B;AAAA,MACnC,WAAW,MAAM;AAAA,MACjB,cAAc,MAAM;AAAA,MACpB,eAAe,MAAM;AAAA,MACrB,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,IAClB;AAEA,UAAM,WAAoC;AAAA,MACxC,YAAY,MAAM;AAAA,IACpB;AAEA,UAAM,eAAe,gBAAgB,MAAM,QAAQ;AAEnD,UAAM,aAAa,iBAAiB,WAAW;AAAA,MAC7C,yBAAyB;AAAA,MACzB,wBAAwB;AAAA,MACxB,wBAAwB,MAAM;AAAA,IAChC,CAAC;AAED,UAAM,WAAW,UAAU,MAAM,OAAO;AACxC,UAAM,WAAW,KAAK,OAAO,UAAU,UAAU;AAAA,MAC/C;AAAA,MACA,MAAM,oBAAS;AAAA,IACjB,CAAC;AACD,UAAM,cAAc,iBAAM,QAAQ,mBAAQ,OAAO,GAAG,QAAQ;AAE5D,SAAK,WAAW,IAAI,MAAM,QAAQ;AAAA,MAChC,aAAa,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,aAAa;AAAA,MACb,YAAY,oBAAI,IAAI;AAAA,MACpB,YAAY;AAAA,MACZ,WAAW,oBAAI,IAAI;AAAA,MACnB;AAAA,MACA,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEQ,wBAAwB,OAAkC;AAChE,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,UAAU;AAEtB,UAAM,SAAS,IAAI;AACnB,SAAK,iBAAiB,MAAM,MAAM;AAAA,EACpC;AAAA,EAEA,cAAc,OAA+B;AAC3C,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,aAAY,CAAC,MAAM,YAAa;AAE5C,UAAM,EAAE,UAAU,IAAI;AACtB,UAAM,eAAe,gBAAgB,MAAM,QAAQ;AAEnD,UAAM,aAAa,iBAAiB,WAAW;AAAA,MAC7C,yBAAyB;AAAA,MACzB,wBAAwB;AAAA,MACxB,wBAAwB,MAAM;AAAA,IAChC,CAAC;AAED,UAAM,WAAW,UAAU,MAAM,OAAO;AACxC,UAAM,aAAa,KAAK,OAAO;AAAA,MAC7B;AAAA,MACA,EAAE,YAAY,MAAM,oBAAS,OAAO;AAAA,MACpC,MAAM;AAAA,IACR;AACA,UAAM,gBAAgB,iBAAM,QAAQ,MAAM,aAAa,UAAU;AAEjE,UAAM,aAAa,EAAE,MAAM,YAAY,SAAS,cAAc;AAAA,EAChE;AAAA,EAEA,eAAe,OAAgC;AAC7C,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,YAAY;AAExB,UAAM,EAAE,KAAK,IAAI,MAAM;AAEvB,SAAK,IAAI;AACT,UAAM,aAAa;AAAA,EACrB;AAAA,EAEA,QAAQ,QAAqC;AAAA,EAE7C;AAAA,EAEA,QAAQ,OAAsB;AAh4BhC;AAi4BI,UAAM,QAAQ;AACd,QAAI,EAAC,+BAAO,QAAQ;AAEpB,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,UAAU;AAEtB,UAAM,eAAc,WAAM,UAAN,YAAe;AAEnC,QAAI,MAAM,UAAU;AAClB,sBAAgB,MAAM,UAAU,WAAW;AAC3C,YAAM,SAAS,IAAI;AAAA,IACrB;AAEA,eAAW,EAAE,MAAM,UAAU,KAAK,MAAM,WAAW,OAAO,GAAG;AAC3D,sBAAgB,WAAW,WAAW;AACtC,gBAAU,IAAI;AAAA,IAChB;AACA,UAAM,WAAW,MAAM;AAEvB,QAAI,MAAM,YAAY;AACpB,sBAAgB,MAAM,WAAW,MAAM,WAAW;AAClD,YAAM,WAAW,KAAK,IAAI;AAC1B,YAAM,aAAa;AAAA,IACrB;AAEA,oBAAgB,MAAM,UAAU,WAAW;AAE3C,UAAM,SAAS,IAAI;AACnB,SAAK,iBAAiB,MAAM,MAAM;AAAA,EACpC;AACF;;;AE75BA,IAAAC,cASO;;;ACTA,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AACF,GAGG;AACD,SAAO;AAAA;AAAA,IAEL,kBAAkB,GAAG,WAAW,IAC9B,uCAAW,eAAc,OAAO,IAAI,UAAU,UAAU,KAAK,EAC/D;AAAA,IACA,iBAAiB,uCAAW;AAAA;AAAA,IAG5B,kBAAkB;AAAA,IAClB,2BAA2B,uCAAW;AAAA,EACxC;AACF;;;ACjBO,SAAS,2BAA2B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKe;AAbf;AAcE,SAAO;AAAA,IACL,qBAAqB,MAAM;AAAA,IAC3B,eAAe,MAAM;AAAA;AAAA,IAGrB,GAAG,OAAO,QAAQ,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,KAAK,MAAM;AAC/D,iBAAW,eAAe,GAAG,EAAE,IAAI;AACnC,aAAO;AAAA,IACT,GAAG,CAAC,CAAe;AAAA;AAAA,IAGnB,GAAG,OAAO,SAAQ,4CAAW,aAAX,YAAuB,CAAC,CAAC,EAAE;AAAA,MAC3C,CAAC,YAAY,CAAC,KAAK,KAAK,MAAM;AAC5B,YAAI,SAAS,QAAW;AACtB,qBAAW,yBAAyB,GAAG,EAAE,IAAI;AAAA,QAC/C;AACA,eAAO;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,GAAG,OAAO,QAAQ,4BAAW,CAAC,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,KAAK,MAAM;AACpE,UAAI,UAAU,QAAW;AACvB,mBAAW,sBAAsB,GAAG,EAAE,IAAI;AAAA,MAC5C;AACA,aAAO;AAAA,IACT,GAAG,CAAC,CAAe;AAAA,EACrB;AACF;;;ACvCA,IAAAC,aAAiD;AAQ1C,SAAS,sBAAsB,QAAuC;AAC3E,SAAO,KAAK;AAAA,IACV,OAAO,IAAI,CAAC,aAAqC;AAAA,MAC/C,GAAG;AAAA,MACH,SACE,OAAO,QAAQ,YAAY,WACvB,QAAQ,UACR,QAAQ,QAAQ;AAAA,QAAI,UAClB,KAAK,SAAS,SACV;AAAA,UACE,GAAG;AAAA,UACH,MACE,KAAK,gBAAgB,iBACjB,6CAAiC,KAAK,IAAI,IAC1C,KAAK;AAAA,QACb,IACA;AAAA,MACN;AAAA,IACR,EAAE;AAAA,EACJ;AACF;;;AHSA,SAASC,iBAAgB,MAAY,OAAsB;AACzD,MAAI,iBAAiB,OAAO;AAC1B,SAAK,gBAAgB;AAAA,MACnB,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA,IACf,CAAC;AACD,SAAK,UAAU;AAAA,MACb,MAAM,2BAAe;AAAA,MACrB,SAAS,MAAM;AAAA,IACjB,CAAC;AAAA,EACH,OAAO;AACL,SAAK,UAAU,EAAE,MAAM,2BAAe,MAAM,CAAC;AAAA,EAC/C;AACF;AAEA,SAASC,cACP,WACgC;AAChC,UAAO,uCAAW,eAAc;AAClC;AAEA,SAASC,kBACP,WACA,YAOY;AACZ,MAAI,CAACD,cAAa,SAAS,GAAG;AAC5B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAAqB,CAAC;AAE5B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACrD,QAAI,SAAS,KAAM;AAEnB,QACE,OAAO,UAAU,YACjB,WAAW,SACX,OAAO,MAAM,UAAU,YACvB;AACA,WAAI,uCAAW,kBAAiB,MAAO;AACvC,YAAM,WAAW,MAAM,MAAM;AAC7B,UAAI,YAAY,KAAM,QAAO,GAAG,IAAI;AACpC;AAAA,IACF;AAEA,QACE,OAAO,UAAU,YACjB,YAAY,SACZ,OAAO,MAAM,WAAW,YACxB;AACA,WAAI,uCAAW,mBAAkB,MAAO;AACxC,YAAM,WAAW,MAAM,OAAO;AAC9B,UAAI,YAAY,KAAM,QAAO,GAAG,IAAI;AACpC;AAAA,IACF;AAEA,WAAO,GAAG,IAAI;AAAA,EAChB;AAEA,SAAO;AACT;AA0BO,IAAM,2BAAN,MAA+D;AAAA,EAQpE,YACE,UAEI,CAAC,GACL;AAXF,SAAiB,aAAa,oBAAI,IAAuB;AAvI3D;AAmJI,SAAK,UAAS,aAAQ,WAAR,YAAkB,kBAAM,UAAU,IAAI;AAAA,EACtD;AAAA,EAEQ,aAAa,QAAuC;AAC1D,WAAO,KAAK,WAAW,IAAI,MAAM;AAAA,EACnC;AAAA,EAEQ,iBAAiB,QAAsB;AAC7C,SAAK,WAAW,OAAO,MAAM;AAAA,EAC/B;AAAA,EAEA,YAAe;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAImB;AAtKrB;AAuKI,UAAM,iBAAgB,UAAK,aAAa,MAAM,MAAxB,mBAA2B,UAAU,IAAI;AAE/D,QAAI,iBAAiB,MAAM;AACzB,aAAO,QAAQ;AAAA,IACjB;AAEA,WAAO,oBAAQ,KAAK,cAAc,SAAS,OAAO;AAAA,EACpD;AAAA,EAEA,QACE,OAKM;AACN,QAAI,MAAM,cAAc,KAAM;AAE9B,QACE,MAAM,gBAAgB,cACtB,MAAM,gBAAgB,gBACtB;AACA,WAAK,sBAAsB,KAA0B;AACrD;AAAA,IACF;AAEA,QAAI,MAAM,gBAAgB,aAAa;AACrC,WAAK,uBAAuB,KAA2B;AACvD;AAAA,IACF;AAEA,QACE,MAAM,gBAAgB,uBACtB,MAAM,gBAAgB,mBACtB;AACA,WAAK,uBAAuB,KAA2B;AACvD;AAAA,IACF;AAEA,SAAK,gBAAgB,KAAqB;AAAA,EAC5C;AAAA,EAEQ,gBAAgB,OAA2B;AACjD,UAAM,YAA+B;AAAA,MACnC,WAAW,MAAM;AAAA,MACjB,cAAc,MAAM;AAAA,MACpB,eAAe,MAAM;AAAA,MACrB,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,IAClB;AAEA,UAAM,WAAoC;AAAA,MACxC,iBAAiB,MAAM;AAAA,MACvB,aAAa,MAAM;AAAA,MACnB,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,iBAAiB,MAAM;AAAA,MACvB,kBAAkB,MAAM;AAAA,MACxB,eAAe,MAAM;AAAA,MACrB,MAAM,MAAM;AAAA,MACZ,YAAY,MAAM;AAAA,IACpB;AAEA,UAAM,0BAA0B,2BAA2B;AAAA,MACzD,OAAO,EAAE,UAAU,MAAM,UAAU,SAAS,MAAM,QAAQ;AAAA,MAC1D;AAAA,MACA,SAAS,MAAM;AAAA,MACf;AAAA,IACF,CAAC;AAED,UAAM,aAAaC,kBAAiB,WAAW;AAAA,MAC7C,GAAG,sBAAsB;AAAA,QACvB,aAAa,MAAM;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,MACD,GAAG;AAAA,MACH,qBAAqB,MAAM;AAAA,MAC3B,eAAe,MAAM;AAAA,MACrB,aAAa;AAAA,QACX,OAAO,MACL,KAAK,UAAU;AAAA,UACb,QAAQ,MAAM;AAAA,UACd,QAAQ,MAAM;AAAA,UACd,UAAU,MAAM;AAAA,QAClB,CAAC;AAAA,MACL;AAAA,IACF,CAAC;AAED,UAAM,WAAW,KAAK,OAAO,UAAU,MAAM,aAAa,EAAE,WAAW,CAAC;AACxE,UAAM,cAAc,kBAAM,QAAQ,oBAAQ,OAAO,GAAG,QAAQ;AAE5D,SAAK,WAAW,IAAI,MAAM,QAAQ;AAAA,MAChC,aAAa,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,aAAa;AAAA,MACb,YAAY,oBAAI,IAAI;AAAA,MACpB,YAAY;AAAA,MACZ,WAAW,oBAAI,IAAI;AAAA,MACnB;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,uBAAuB,OAAiC;AAC9D,UAAM,YAA+B;AAAA,MACnC,WAAW,MAAM;AAAA,MACjB,cAAc,MAAM;AAAA,MACpB,eAAe,MAAM;AAAA,MACrB,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,IAClB;AAEA,UAAM,WAAoC;AAAA,MACxC,iBAAiB,MAAM;AAAA,MACvB,aAAa,MAAM;AAAA,MACnB,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,iBAAiB,MAAM;AAAA,MACvB,kBAAkB,MAAM;AAAA,MACxB,MAAM,MAAM;AAAA,MACZ,YAAY,MAAM;AAAA,IACpB;AAEA,UAAM,0BAA0B,2BAA2B;AAAA,MACzD,OAAO,EAAE,UAAU,MAAM,UAAU,SAAS,MAAM,QAAQ;AAAA,MAC1D;AAAA,MACA,SAAS,MAAM;AAAA,MACf;AAAA,IACF,CAAC;AAED,UAAM,aAAaA,kBAAiB,WAAW;AAAA,MAC7C,GAAG,sBAAsB;AAAA,QACvB,aAAa,MAAM;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,MACD,GAAG;AAAA,MACH,aAAa;AAAA,QACX,OAAO,MACL,KAAK,UAAU;AAAA,UACb,QAAQ,MAAM;AAAA,UACd,QAAQ,MAAM;AAAA,UACd,UAAU,MAAM;AAAA,QAClB,CAAC;AAAA,MACL;AAAA,MACA,aAAa,MAAM,SACf,EAAE,OAAO,MAAM,KAAK,UAAU,MAAM,MAAM,EAAE,IAC5C;AAAA,MACJ,kBAAkB,MAAM;AAAA,MACxB,yBAAyB,MAAM;AAAA,MAC/B,sBAAsB,MAAM;AAAA,IAC9B,CAAC;AAED,UAAM,WAAW,KAAK,OAAO,UAAU,MAAM,aAAa,EAAE,WAAW,CAAC;AACxE,UAAM,cAAc,kBAAM,QAAQ,oBAAQ,OAAO,GAAG,QAAQ;AAE5D,SAAK,WAAW,IAAI,MAAM,QAAQ;AAAA,MAChC,aAAa,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,aAAa;AAAA,MACb,YAAY,oBAAI,IAAI;AAAA,MACpB,YAAY;AAAA,MACZ,WAAW,oBAAI,IAAI;AAAA,MACnB;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,kBAAkB,OAAqC;AArVzD;AAsVI,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,aAAY,CAAC,MAAM,YAAa;AAE5C,UAAM,EAAE,UAAU,IAAI;AAEtB,UAAM,kBACJ,MAAM,gBAAgB,oBAClB,6BACA;AAEN,UAAM,aAAaA,kBAAiB,WAAW;AAAA,MAC7C,GAAG,sBAAsB;AAAA,QACvB,aAAa;AAAA,QACb;AAAA,MACF,CAAC;AAAA,MACD,GAAG,MAAM;AAAA,MACT,sBAAsB;AAAA,QACpB,OAAO,MACL,MAAM,iBACF,sBAAsB,MAAM,cAAc,IAC1C;AAAA,MACR;AAAA,MAEA,iBAAiB,MAAM;AAAA,MACvB,wBAAwB,MAAM;AAAA,MAC9B,oCAAoC,MAAM,SAAS;AAAA,MAGnD,6BAA6B,MAAM,SAAS;AAAA,MAG5C,mCAAmC,MAAM,SAAS;AAAA,MAGlD,+BAA+B,WAAM,SAAS,gBAAf,YAA8B;AAAA,MAG7D,wBAAwB,MAAM,SAAS;AAAA,MACvC,wBAAwB,MAAM,SAAS;AAAA,IACzC,CAAC;AAED,UAAM,WAAW,KAAK,OAAO;AAAA,MAC3B;AAAA,MACA,EAAE,WAAW;AAAA,MACb,MAAM;AAAA,IACR;AACA,UAAM,cAAc,kBAAM,QAAQ,MAAM,aAAa,MAAM,QAAQ;AAAA,EACrE;AAAA;AAAA,EAGA,mBAAmB,OAAsC;AACvD,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,UAAU;AAEtB,UAAM,EAAE,UAAU,IAAI;AAEtB,UAAM,SAAS;AAAA,MACbA,kBAAiB,WAAW;AAAA,QAC1B,4BAA4B,MAAM;AAAA,QAClC,sBAAsB;AAAA,UACpB,QAAQ,MAAM;AACZ,gBAAI;AACF,qBAAO,KAAK,UAAU,KAAK,MAAM,MAAM,UAAU,CAAC;AAAA,YACpD,SAAQ;AACN,qBAAO,MAAM;AAAA,YACf;AAAA,UACF;AAAA,QACF;AAAA,QACA,kBAAkB,MAAM,SAAS;AAAA,QACjC,qBAAqB,MAAM,SAAS;AAAA,QACpC,yBAAyB,MAAM,SAAS,UAAU,YAAY;AAAA,QAC9D,gCAAgC,MAAM,mBAClC,KAAK,UAAU,MAAM,gBAAgB,IACrC;AAAA,QAEJ,wBAAwB,MAAM,MAAM;AAAA,QACpC,yBAAyB,MAAM,MAAM;AAAA,QACrC,wBAAwB,MAAM,MAAM;AAAA,QACpC,4BAA4B,MAAM,MAAM;AAAA,QACxC,8BAA8B,MAAM,MAAM;AAAA,QAE1C,kCAAkC,CAAC,MAAM,YAAY;AAAA,QACrD,sBAAsB,MAAM,SAAS;AAAA,QACrC,yBAAyB,MAAM,SAAS;AAAA,QACxC,6BAA6B,MAAM,MAAM;AAAA,QACzC,8BAA8B,MAAM,MAAM;AAAA,MAC5C,CAAC;AAAA,IACH;AAEA,QAAI,MAAM,kBAAkB,MAAM;AAChC,YAAM,SAAS,SAAS,wBAAwB;AAAA,QAC9C,4BAA4B,MAAM;AAAA,MACpC,CAAC;AACD,YAAM,SAAS,cAAc;AAAA,QAC3B,4BAA4B,MAAM;AAAA,MACpC,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,IAAI;AACnB,UAAM,WAAW;AACjB,UAAM,cAAc;AAAA,EACtB;AAAA,EAEQ,sBAAsB,OAAgC;AAC5D,UAAM,YAA+B;AAAA,MACnC,WAAW,MAAM;AAAA,MACjB,cAAc,MAAM;AAAA,MACpB,eAAe,MAAM;AAAA,MACrB,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,IAClB;AAEA,UAAM,WAAoC;AAAA,MACxC,YAAY,MAAM;AAAA,IACpB;AAEA,UAAM,0BAA0B,2BAA2B;AAAA,MACzD,OAAO,EAAE,UAAU,MAAM,UAAU,SAAS,MAAM,QAAQ;AAAA,MAC1D;AAAA,MACA,SAAS,MAAM;AAAA,MACf;AAAA,IACF,CAAC;AAED,UAAM,QAAQ,MAAM;AACpB,UAAM,SAAS,MAAM,gBAAgB;AAErC,UAAM,aAAaA,kBAAiB,WAAW;AAAA,MAC7C,GAAG,sBAAsB;AAAA,QACvB,aAAa,MAAM;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,MACD,GAAG;AAAA,MACH,GAAI,SACA;AAAA,QACE,aAAa;AAAA,UACX,OAAO,MAAO,MAAmB,IAAI,OAAK,KAAK,UAAU,CAAC,CAAC;AAAA,QAC7D;AAAA,MACF,IACA;AAAA,QACE,YAAY;AAAA,UACV,OAAO,MAAM,KAAK,UAAU,KAAK;AAAA,QACnC;AAAA,MACF;AAAA,IACN,CAAC;AAED,UAAM,WAAW,KAAK,OAAO,UAAU,MAAM,aAAa,EAAE,WAAW,CAAC;AACxE,UAAM,cAAc,kBAAM,QAAQ,oBAAQ,OAAO,GAAG,QAAQ;AAE5D,SAAK,WAAW,IAAI,MAAM,QAAQ;AAAA,MAChC,aAAa,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,aAAa;AAAA,MACb,YAAY,oBAAI,IAAI;AAAA,MACpB,YAAY;AAAA,MACZ,WAAW,oBAAI,IAAI;AAAA,MACnB;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,YAAY,OAAiC;AAzf/C;AA0fI,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,aAAY,CAAC,MAAM,YAAa;AAE5C,UAAM,EAAE,UAAU,IAAI;AAEtB,UAAM,kBACJ,MAAM,gBAAgB,kBAClB,2BACA;AAEN,UAAM,aAAaA,kBAAiB,WAAW;AAAA,MAC7C,GAAG,sBAAsB;AAAA,QACvB,aAAa;AAAA,QACb;AAAA,MACF,CAAC;AAAA,MACD,GAAG,MAAM;AAAA,MACT,qBAAqB,MAAM;AAAA,MAC3B,eAAe,MAAM;AAAA,MAErB,sBAAsB;AAAA,QACpB,OAAO,MACL,MAAM,iBACF,sBAAsB,MAAM,cAAc,IAC1C;AAAA,MACR;AAAA,MACA,mBAAmB;AAAA,QACjB,OAAO,MAAG;AAphBlB,cAAAC;AAohBqB,kBAAAA,MAAA,MAAM,cAAN,gBAAAA,IAAiB,IAAI,UAAQ,KAAK,UAAU,IAAI;AAAA;AAAA,MAC/D;AAAA,MACA,wBAAwB;AAAA,QACtB,OAAO,MACL,MAAM,kBAAkB,OACpB,KAAK,UAAU,MAAM,cAAc,IACnC;AAAA,MACR;AAAA,MAEA,iBAAiB,MAAM;AAAA,MACvB,wBAAwB,MAAM;AAAA,MAC9B,oCAAoC,MAAM,SAAS;AAAA,MAGnD,6BAA6B,MAAM,SAAS;AAAA,MAG5C,mCAAmC,MAAM,SAAS;AAAA,MAGlD,iCAAiC,MAAM,SAAS;AAAA,MAGhD,+BAA+B,WAAM,SAAS,gBAAf,YAA8B;AAAA,MAG7D,wBAAwB,MAAM,SAAS;AAAA,MACvC,wBAAwB,MAAM,SAAS;AAAA,IACzC,CAAC;AAED,UAAM,WAAW,KAAK,OAAO;AAAA,MAC3B;AAAA,MACA,EAAE,WAAW;AAAA,MACb,MAAM;AAAA,IACR;AACA,UAAM,cAAc,kBAAM,QAAQ,MAAM,aAAa,MAAM,QAAQ;AAAA,EACrE;AAAA,EAEA,gBAAgB,OAA4C;AAC1D,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,aAAa;AAEzB,UAAM,EAAE,UAAU,IAAI;AACtB,UAAM,EAAE,SAAS,IAAI;AAErB,UAAM,aAAaD,kBAAiB,WAAW;AAAA,MAC7C,GAAG,sBAAsB;AAAA,QACvB,aAAa;AAAA,QACb;AAAA,MACF,CAAC;AAAA,MACD,oBAAoB,SAAS;AAAA,MAC7B,kBAAkB,SAAS;AAAA,MAC3B,oBAAoB;AAAA,QAClB,QAAQ,MAAM,KAAK,UAAU,SAAS,KAAK;AAAA,MAC7C;AAAA,IACF,CAAC;AAED,UAAM,WAAW,KAAK,OAAO;AAAA,MAC3B;AAAA,MACA,EAAE,WAAW;AAAA,MACb,MAAM;AAAA,IACR;AACA,UAAM,cAAc,kBAAM,QAAQ,MAAM,aAAa,QAAQ;AAE7D,UAAM,UAAU,IAAI,SAAS,YAAY;AAAA,MACvC,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,iBAAiB,OAA6C;AAC5D,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,CAAC,MAAO;AAEZ,UAAM,gBAAgB,MAAM,UAAU,IAAI,MAAM,SAAS,UAAU;AACnE,QAAI,CAAC,cAAe;AAEpB,UAAM,EAAE,KAAK,IAAI;AACjB,UAAM,EAAE,UAAU,IAAI;AAEtB,QAAI,MAAM,SAAS;AACjB,UAAI;AACF,aAAK;AAAA,UACHA,kBAAiB,WAAW;AAAA,YAC1B,sBAAsB;AAAA,cACpB,QAAQ,MAAM,KAAK,UAAU,MAAM,MAAM;AAAA,YAC3C;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,SAAQ;AAAA,MAER;AAAA,IACF,OAAO;AACL,MAAAF,iBAAgB,MAAM,MAAM,KAAK;AAAA,IACnC;AAEA,SAAK,IAAI;AACT,UAAM,UAAU,OAAO,MAAM,SAAS,UAAU;AAAA,EAClD;AAAA,EAEA,aAAa,OAAyC;AAxnBxD;AAynBI,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,UAAU;AAEtB,UAAM,EAAE,UAAU,IAAI;AAEtB,UAAM,SAAS;AAAA,MACbE,kBAAiB,WAAW;AAAA,QAC1B,4BAA4B,MAAM;AAAA,QAClC,oBAAoB;AAAA,UAClB,QAAQ,MAAG;AAloBrB,gBAAAC;AAkoBwB,oBAAAA,MAAA,MAAM,SAAN,OAAAA,MAAc;AAAA;AAAA,QAC9B;AAAA,QACA,yBAAyB;AAAA,UACvB,QAAQ,MACN,MAAM,UAAU,SAAS,IACrB,MAAM,UACH,OAAO,UAAQ,UAAU,IAAI,EAC7B,IAAI,UAAQ,KAAK,IAAI,EACrB,KAAK,IAAI,IACZ;AAAA,QACR;AAAA,QACA,yBAAyB;AAAA,UACvB,QAAQ,MACN,MAAM,UAAU,SAAS,IACrB,KAAK;AAAA,YACH,MAAM,UAAU,IAAI,eAAa;AAAA,cAC/B,YAAY,SAAS;AAAA,cACrB,UAAU,SAAS;AAAA,cACnB,OAAO,SAAS;AAAA,YAClB,EAAE;AAAA,UACJ,IACA;AAAA,QACR;AAAA,QACA,qBAAqB;AAAA,UACnB,QAAQ,MACN,MAAM,MAAM,SAAS,IACjB,KAAK;AAAA,YACH,MAAM,MAAM,IAAI,WAAS;AAAA,cACvB,MAAM;AAAA,cACN,WAAW,KAAK;AAAA,cAChB,MAAM,KAAK;AAAA,YACb,EAAE;AAAA,UACJ,IACA;AAAA,QACR;AAAA,QACA,kBAAkB,MAAM,SAAS;AAAA,QACjC,qBAAqB,MAAM,SAAS;AAAA,QACpC,yBAAyB,MAAM,SAAS,UAAU,YAAY;AAAA,QAC9D,gCAAgC,MAAM,mBAClC,KAAK,UAAU,MAAM,gBAAgB,IACrC;AAAA,QAEJ,wBAAwB,MAAM,MAAM;AAAA,QACpC,yBAAyB,MAAM,MAAM;AAAA,QACrC,wBAAwB,MAAM,MAAM;AAAA,QACpC,4BAA4B,MAAM,MAAM;AAAA,QACxC,8BAA8B,MAAM,MAAM;AAAA,QAC1C,6CACE,WAAM,MAAM,sBAAZ,mBAA+B;AAAA,QACjC,+CACE,WAAM,MAAM,sBAAZ,mBAA+B;AAAA,QACjC,gDACE,WAAM,MAAM,sBAAZ,mBAA+B;AAAA,QACjC,2CACE,WAAM,MAAM,uBAAZ,mBAAgC;AAAA,QAClC,gDACE,WAAM,MAAM,uBAAZ,mBAAgC;AAAA,QAElC,kCAAkC,CAAC,MAAM,YAAY;AAAA,QACrD,sBAAsB,MAAM,SAAS;AAAA,QACrC,yBAAyB,MAAM,SAAS;AAAA,QACxC,6BAA6B,MAAM,MAAM;AAAA,QACzC,8BAA8B,MAAM,MAAM;AAAA,MAC5C,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,IAAI;AACnB,UAAM,WAAW;AACjB,UAAM,cAAc;AAAA,EACtB;AAAA,EAEA,SACE,OAKM;AACN,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,UAAU;AAEtB,QACE,MAAM,gBAAgB,cACtB,MAAM,gBAAgB,gBACtB;AACA,WAAK,uBAAuB,KAA2B;AACvD;AAAA,IACF;AAEA,QAAI,MAAM,gBAAgB,aAAa;AACrC,WAAK,wBAAwB,KAA4B;AACzD;AAAA,IACF;AAEA,QACE,MAAM,gBAAgB,uBACtB,MAAM,gBAAgB,mBACtB;AACA,WAAK,wBAAwB,KAAqC;AAClE;AAAA,IACF;AAEA,SAAK,iBAAiB,KAA+B;AAAA,EACvD;AAAA,EAEQ,iBAAiB,OAAqC;AA3uBhE;AA4uBI,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,UAAU;AAEtB,UAAM,EAAE,UAAU,IAAI;AAEtB,UAAM,SAAS;AAAA,MACbD,kBAAiB,WAAW;AAAA,QAC1B,4BAA4B,MAAM;AAAA,QAClC,oBAAoB;AAAA,UAClB,QAAQ,MAAG;AArvBrB,gBAAAC;AAqvBwB,oBAAAA,MAAA,MAAM,SAAN,OAAAA,MAAc;AAAA;AAAA,QAC9B;AAAA,QACA,yBAAyB;AAAA,UACvB,QAAQ,MACN,MAAM,UAAU,SAAS,IACrB,MAAM,UACH,OAAO,UAAQ,UAAU,IAAI,EAC7B,IAAI,UAAQ,KAAK,IAAI,EACrB,KAAK,IAAI,IACZ;AAAA,QACR;AAAA,QACA,yBAAyB;AAAA,UACvB,QAAQ,MACN,MAAM,UAAU,SAAS,IACrB,KAAK;AAAA,YACH,MAAM,UAAU,IAAI,eAAa;AAAA,cAC/B,YAAY,SAAS;AAAA,cACrB,UAAU,SAAS;AAAA,cACnB,OAAO,SAAS;AAAA,YAClB,EAAE;AAAA,UACJ,IACA;AAAA,QACR;AAAA,QACA,qBAAqB;AAAA,UACnB,QAAQ,MACN,MAAM,MAAM,SAAS,IACjB,KAAK;AAAA,YACH,MAAM,MAAM,IAAI,WAAS;AAAA,cACvB,MAAM;AAAA,cACN,WAAW,KAAK;AAAA,cAChB,MAAM,KAAK;AAAA,YACb,EAAE;AAAA,UACJ,IACA;AAAA,QACR;AAAA,QACA,gCAAgC,MAAM,mBAClC,KAAK,UAAU,MAAM,gBAAgB,IACrC;AAAA,QAEJ,wBAAwB,MAAM,WAAW;AAAA,QACzC,yBAAyB,MAAM,WAAW;AAAA,QAC1C,wBAAwB,MAAM,WAAW;AAAA,QACzC,4BAA4B,MAAM,WAAW;AAAA,QAC7C,8BAA8B,MAAM,WAAW;AAAA,QAC/C,6CACE,WAAM,WAAW,sBAAjB,mBAAoC;AAAA,QACtC,+CACE,WAAM,WAAW,sBAAjB,mBAAoC;AAAA,QACtC,gDACE,WAAM,WAAW,sBAAjB,mBAAoC;AAAA,QACtC,2CACE,WAAM,WAAW,uBAAjB,mBAAqC;AAAA,QACvC,gDACE,WAAM,WAAW,uBAAjB,mBAAqC;AAAA,MACzC,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,IAAI;AACnB,SAAK,iBAAiB,MAAM,MAAM;AAAA,EACpC;AAAA,EAEQ,wBAAwB,OAA2C;AACzE,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,UAAU;AAEtB,UAAM,EAAE,UAAU,IAAI;AAEtB,UAAM,SAAS;AAAA,MACbD,kBAAiB,WAAW;AAAA,QAC1B,4BAA4B,MAAM;AAAA,QAClC,sBAAsB;AAAA,UACpB,QAAQ,MACN,MAAM,UAAU,OAAO,KAAK,UAAU,MAAM,MAAM,IAAI;AAAA,QAC1D;AAAA,QACA,gCAAgC,MAAM,mBAClC,KAAK,UAAU,MAAM,gBAAgB,IACrC;AAAA,QAEJ,wBAAwB,MAAM,MAAM;AAAA,QACpC,yBAAyB,MAAM,MAAM;AAAA,QACrC,wBAAwB,MAAM,MAAM;AAAA,QACpC,4BAA4B,MAAM,MAAM;AAAA,QACxC,8BAA8B,MAAM,MAAM;AAAA,MAC5C,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,IAAI;AACnB,SAAK,iBAAiB,MAAM,MAAM;AAAA,EACpC;AAAA,EAEQ,uBAAuB,OAAiC;AAC9D,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,UAAU;AAEtB,UAAM,EAAE,UAAU,IAAI;AACtB,UAAM,SAAS,MAAM,gBAAgB;AAErC,UAAM,SAAS;AAAA,MACbA,kBAAiB,WAAW;AAAA,QAC1B,GAAI,SACA;AAAA,UACE,iBAAiB;AAAA,YACf,QAAQ,MACL,MAAM,UAAyB,IAAI,OAAK,KAAK,UAAU,CAAC,CAAC;AAAA,UAC9D;AAAA,QACF,IACA;AAAA,UACE,gBAAgB;AAAA,YACd,QAAQ,MAAM,KAAK,UAAU,MAAM,SAAS;AAAA,UAC9C;AAAA,QACF;AAAA,QACJ,mBAAmB,MAAM,MAAM;AAAA,MACjC,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,IAAI;AACnB,SAAK,iBAAiB,MAAM,MAAM;AAAA,EACpC;AAAA,EAEA,aAAa,OAA8B;AACzC,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,aAAY,CAAC,MAAM,YAAa;AAE5C,UAAM,EAAE,UAAU,IAAI;AAEtB,UAAM,aAAaA,kBAAiB,WAAW;AAAA,MAC7C,GAAG,sBAAsB;AAAA,QACvB,aAAa,MAAM;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,MACD,GAAG,MAAM;AAAA,MACT,aAAa;AAAA,QACX,OAAO,MAAM,MAAM,OAAO,IAAI,OAAK,KAAK,UAAU,CAAC,CAAC;AAAA,MACtD;AAAA,IACF,CAAC;AAED,UAAM,YAAY,KAAK,OAAO;AAAA,MAC5B,MAAM;AAAA,MACN,EAAE,WAAW;AAAA,MACb,MAAM;AAAA,IACR;AACA,UAAM,eAAe,kBAAM,QAAQ,MAAM,aAAa,SAAS;AAE/D,UAAM,WAAW,IAAI,MAAM,aAAa;AAAA,MACtC,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,cAAc,OAA+B;AAC3C,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,CAAC,MAAO;AAEZ,UAAM,iBAAiB,MAAM,WAAW,IAAI,MAAM,WAAW;AAC7D,QAAI,CAAC,eAAgB;AAErB,UAAM,EAAE,KAAK,IAAI;AACjB,UAAM,EAAE,UAAU,IAAI;AAEtB,SAAK;AAAA,MACHA,kBAAiB,WAAW;AAAA,QAC1B,iBAAiB;AAAA,UACf,QAAQ,MACN,MAAM,WAAW,IAAI,eAAa,KAAK,UAAU,SAAS,CAAC;AAAA,QAC/D;AAAA,QACA,mBAAmB,MAAM,MAAM;AAAA,MACjC,CAAC;AAAA,IACH;AAEA,SAAK,IAAI;AACT,UAAM,WAAW,OAAO,MAAM,WAAW;AAAA,EAC3C;AAAA,EAEQ,uBAAuB,OAAiC;AAC9D,UAAM,YAA+B;AAAA,MACnC,WAAW,MAAM;AAAA,MACjB,cAAc,MAAM;AAAA,MACpB,eAAe,MAAM;AAAA,MACrB,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,IAClB;AAEA,UAAM,WAAoC;AAAA,MACxC,YAAY,MAAM;AAAA,IACpB;AAEA,UAAM,0BAA0B,2BAA2B;AAAA,MACzD,OAAO,EAAE,UAAU,MAAM,UAAU,SAAS,MAAM,QAAQ;AAAA,MAC1D;AAAA,MACA,SAAS,MAAM;AAAA,MACf;AAAA,IACF,CAAC;AAED,UAAM,aAAaA,kBAAiB,WAAW;AAAA,MAC7C,GAAG,sBAAsB;AAAA,QACvB,aAAa,MAAM;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,MACD,GAAG;AAAA,MACH,gBAAgB;AAAA,QACd,OAAO,MAAM,MAAM,UAAU,IAAI,OAAK,KAAK,UAAU,CAAC,CAAC;AAAA,MACzD;AAAA,IACF,CAAC;AAED,UAAM,WAAW,KAAK,OAAO,UAAU,MAAM,aAAa,EAAE,WAAW,CAAC;AACxE,UAAM,cAAc,kBAAM,QAAQ,oBAAQ,OAAO,GAAG,QAAQ;AAE5D,SAAK,WAAW,IAAI,MAAM,QAAQ;AAAA,MAChC,aAAa,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,aAAa;AAAA,MACb,YAAY,oBAAI,IAAI;AAAA,MACpB,YAAY;AAAA,MACZ,WAAW,oBAAI,IAAI;AAAA,MACnB;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,wBAAwB,OAAkC;AAChE,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,UAAU;AAEtB,UAAM,SAAS,IAAI;AACnB,SAAK,iBAAiB,MAAM,MAAM;AAAA,EACpC;AAAA,EAEA,cAAc,OAA+B;AAC3C,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,aAAY,CAAC,MAAM,YAAa;AAE5C,UAAM,EAAE,UAAU,IAAI;AAEtB,UAAM,aAAaA,kBAAiB,WAAW;AAAA,MAC7C,GAAG,sBAAsB;AAAA,QACvB,aAAa,MAAM;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,MACD,GAAG,MAAM;AAAA,MACT,gBAAgB;AAAA,QACd,OAAO,MAAM,MAAM,UAAU,IAAI,OAAK,KAAK,UAAU,CAAC,CAAC;AAAA,MACzD;AAAA,IACF,CAAC;AAED,UAAM,aAAa,KAAK,OAAO;AAAA,MAC7B,MAAM;AAAA,MACN,EAAE,WAAW;AAAA,MACb,MAAM;AAAA,IACR;AACA,UAAM,gBAAgB,kBAAM,QAAQ,MAAM,aAAa,UAAU;AAEjE,UAAM,aAAa,EAAE,MAAM,YAAY,SAAS,cAAc;AAAA,EAChE;AAAA,EAEA,eAAe,OAAgC;AAC7C,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,YAAY;AAExB,UAAM,EAAE,KAAK,IAAI,MAAM;AACvB,UAAM,EAAE,UAAU,IAAI;AAEtB,SAAK;AAAA,MACHA,kBAAiB,WAAW;AAAA,QAC1B,mBAAmB,MAAM;AAAA,QACzB,cAAc;AAAA,UACZ,QAAQ,MAAM,MAAM,QAAQ,IAAI,OAAK,KAAK,UAAU,CAAC,CAAC;AAAA,QACxD;AAAA,MACF,CAAC;AAAA,IACH;AAEA,SAAK,IAAI;AACT,UAAM,aAAa;AAAA,EACrB;AAAA,EAEA,QAAQ,OAAoC;AA1gC9C;AA2gCI,UAAM,QAAQ,MAAM;AAMpB,QAAI,OAAO,MAAM,WAAW,UAAU;AACpC;AAAA,IACF;AAEA,QACE,MAAM,SAAS,0BACf,MAAM,SAAS,oBACf;AACA;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,UAAU;AAEtB,UAAM,aAAa,OAAO;AAAA,MACxB,OAAO;AAAA,SACJ,WAAM,eAAN,YAAgD,CAAC;AAAA,MACpD,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,SAAS,IAAI;AAAA,IACvC;AAEA,UAAM,SAAS,SAAS,MAAM,MAAM,UAAU;AAC9C,QAAI,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AACtC,YAAM,SAAS,cAAc,UAAU;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,QAAQ,OAAsB;AA3iChC;AA4iCI,UAAM,QAAQ;AACd,QAAI,EAAC,+BAAO,QAAQ;AAEpB,UAAM,QAAQ,KAAK,aAAa,MAAM,MAAM;AAC5C,QAAI,EAAC,+BAAO,UAAU;AAEtB,UAAM,eAAc,WAAM,UAAN,YAAe;AAEnC,QAAI,MAAM,UAAU;AAClB,MAAAF,iBAAgB,MAAM,UAAU,WAAW;AAC3C,YAAM,SAAS,IAAI;AAAA,IACrB;AAEA,eAAW,EAAE,MAAM,UAAU,KAAK,MAAM,WAAW,OAAO,GAAG;AAC3D,MAAAA,iBAAgB,WAAW,WAAW;AACtC,gBAAU,IAAI;AAAA,IAChB;AACA,UAAM,WAAW,MAAM;AAEvB,QAAI,MAAM,YAAY;AACpB,MAAAA,iBAAgB,MAAM,WAAW,MAAM,WAAW;AAClD,YAAM,WAAW,KAAK,IAAI;AAC1B,YAAM,aAAa;AAAA,IACrB;AAEA,IAAAA,iBAAgB,MAAM,UAAU,WAAW;AAE3C,UAAM,SAAS,IAAI;AACnB,SAAK,iBAAiB,MAAM,MAAM;AAAA,EACpC;AACF;","names":["_a","import_api","import_ai","recordSpanError","shouldRecord","selectAttributes","_a"]}
|