{"version":3,"file":"chat_models.cjs","names":["AbstractGoogleLLMConnection","getGeminiAPI","BaseChatModel","ensureParams","DefaultGeminiSafetyHandler","ApiKeyGoogleAuth","convertToGeminiTools","copyAIModelParams","convertGoogleGeminiStream","ChatGenerationChunk","AIMessageChunk","PROFILES","schemaToGeminiParameters","removeAdditionalProperties"],"sources":["../src/chat_models.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { type BaseMessage } from \"@langchain/core/messages\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { convertGoogleGeminiStream } from \"./utils/stream_events.js\";\nimport { JsonStream } from \"./utils/stream.js\";\n\nimport {\n  BaseChatModel,\n  LangSmithParams,\n  type BaseChatModelParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport { ChatGenerationChunk, ChatResult } from \"@langchain/core/outputs\";\nimport { AIMessageChunk } from \"@langchain/core/messages\";\nimport {\n  BaseLanguageModelInput,\n  StructuredOutputMethodOptions,\n} from \"@langchain/core/language_models/base\";\nimport { type ModelProfile } from \"@langchain/core/language_models/profile\";\nimport { Runnable } from \"@langchain/core/runnables\";\nimport { AsyncCaller } from \"@langchain/core/utils/async_caller\";\nimport { concat } from \"@langchain/core/utils/stream\";\nimport {\n  InteropZodType,\n  isInteropZodSchema,\n} from \"@langchain/core/utils/types\";\nimport {\n  GoogleAIBaseLLMInput,\n  GoogleAIModelParams,\n  GoogleAISafetySetting,\n  GoogleConnectionParams,\n  GooglePlatformType,\n  GeminiTool,\n  GoogleAIBaseLanguageModelCallOptions,\n  GoogleAIAPI,\n  GoogleAIAPIParams,\n  GoogleSearchToolSetting,\n  GoogleSpeechConfig,\n  GeminiJsonSchema,\n} from \"./types.js\";\nimport {\n  convertToGeminiTools,\n  copyAIModelParams,\n  copyAndValidateModelParamsInto,\n} from \"./utils/common.js\";\nimport { AbstractGoogleLLMConnection } from \"./connection.js\";\nimport { DefaultGeminiSafetyHandler, getGeminiAPI } from \"./utils/gemini.js\";\nimport { ApiKeyGoogleAuth, GoogleAbstractedClient } from \"./auth.js\";\nimport { ensureParams } from \"./utils/failed_handler.js\";\nimport type {\n  GoogleBaseLLMInput,\n  GoogleAISafetyHandler,\n  GoogleAISafetyParams,\n  GeminiFunctionDeclaration,\n  GeminiFunctionSchema,\n  GoogleAIToolType,\n  GeminiAPIConfig,\n  GoogleAIModelModality,\n} from \"./types.js\";\nimport {\n  removeAdditionalProperties,\n  schemaToGeminiParameters,\n} from \"./utils/zod_to_gemini_parameters.js\";\nimport PROFILES from \"./profiles.js\";\nimport {\n  isSerializableSchema,\n  SerializableSchema,\n} from \"@langchain/core/utils/standard_schema\";\nimport {\n  assembleStructuredOutputPipeline,\n  createContentParser,\n  createFunctionCallingParser,\n} from \"@langchain/core/language_models/structured_output\";\n\nexport class ChatConnection<AuthOptions> extends AbstractGoogleLLMConnection<\n  BaseMessage[],\n  AuthOptions\n> {\n  convertSystemMessageToHumanContent: boolean | undefined;\n\n  constructor(\n    fields: GoogleAIBaseLLMInput<AuthOptions> | undefined,\n    caller: AsyncCaller,\n    client: GoogleAbstractedClient,\n    streaming: boolean\n  ) {\n    super(fields, caller, client, streaming);\n    this.convertSystemMessageToHumanContent =\n      fields?.convertSystemMessageToHumanContent;\n  }\n\n  get useSystemInstruction(): boolean {\n    return typeof this.convertSystemMessageToHumanContent === \"boolean\"\n      ? !this.convertSystemMessageToHumanContent\n      : this.computeUseSystemInstruction;\n  }\n\n  get computeUseSystemInstruction(): boolean {\n    // This works on models from April 2024 and later\n    //   Vertex AI: gemini-1.5-pro and gemini-1.0-002 and later\n    //   AI Studio: gemini-1.5-pro-latest\n    if (this.modelFamily === \"palm\") {\n      return false;\n    } else if (this.modelName === \"gemini-1.0-pro-001\") {\n      return false;\n    } else if (this.modelName.startsWith(\"gemini-pro-vision\")) {\n      return false;\n    } else if (this.modelName.startsWith(\"gemini-1.0-pro-vision\")) {\n      return false;\n    } else if (this.modelName === \"gemini-pro\" && this.platform === \"gai\") {\n      // on AI Studio gemini-pro is still pointing at gemini-1.0-pro-001\n      return false;\n    } else if (this.modelFamily === \"gemma\") {\n      // At least as of 12 Mar 2025 gemma 3 on AIS, trying to use system instructions yields an error:\n      // \"Developer instruction is not enabled for models/gemma-3-27b-it\"\n      return false;\n    }\n    return true;\n  }\n\n  computeGoogleSearchToolAdjustmentFromModel(): Exclude<\n    GoogleSearchToolSetting,\n    boolean\n  > {\n    if (this.modelName.startsWith(\"gemini-1.0\")) {\n      return \"googleSearchRetrieval\";\n    } else if (this.modelName.startsWith(\"gemini-1.5\")) {\n      return \"googleSearchRetrieval\";\n    } else {\n      return \"googleSearch\";\n    }\n  }\n\n  computeGoogleSearchToolAdjustment(\n    apiConfig: GeminiAPIConfig\n  ): Exclude<GoogleSearchToolSetting, true> {\n    const adj = apiConfig.googleSearchToolAdjustment;\n    if (adj === undefined || adj === true) {\n      return this.computeGoogleSearchToolAdjustmentFromModel();\n    } else {\n      return adj;\n    }\n  }\n\n  buildGeminiAPI(): GoogleAIAPI {\n    const apiConfig: GeminiAPIConfig =\n      (this.apiConfig as GeminiAPIConfig) ?? {};\n    const googleSearchToolAdjustment =\n      this.computeGoogleSearchToolAdjustment(apiConfig);\n    const geminiConfig: GeminiAPIConfig = {\n      useSystemInstruction: this.useSystemInstruction,\n      googleSearchToolAdjustment,\n      ...apiConfig,\n    };\n    return getGeminiAPI(geminiConfig);\n  }\n\n  get api(): GoogleAIAPI {\n    switch (this.apiName) {\n      case \"google\":\n        return this.buildGeminiAPI();\n      default:\n        return super.api;\n    }\n  }\n}\n\n/**\n * Input to chat model class.\n */\nexport interface ChatGoogleBaseInput<AuthOptions>\n  extends\n    BaseChatModelParams,\n    GoogleConnectionParams<AuthOptions>,\n    GoogleAIModelParams,\n    GoogleAISafetyParams,\n    GoogleAIAPIParams,\n    Pick<GoogleAIBaseLanguageModelCallOptions, \"streamUsage\"> {}\n\n/**\n * Integration with a Google chat model.\n */\nexport abstract class ChatGoogleBase<AuthOptions>\n  extends BaseChatModel<GoogleAIBaseLanguageModelCallOptions, AIMessageChunk>\n  implements ChatGoogleBaseInput<AuthOptions>\n{\n  // Used for tracing, replace with the same name as your class\n  static lc_name() {\n    return \"ChatGoogle\";\n  }\n\n  get lc_secrets(): { [key: string]: string } | undefined {\n    return {\n      authOptions: \"GOOGLE_AUTH_OPTIONS\",\n    };\n  }\n\n  lc_serializable = true;\n\n  // Set based on modelName\n  model: string;\n\n  modelName = \"gemini-pro\";\n\n  temperature: number;\n\n  maxOutputTokens: number;\n\n  maxReasoningTokens: number;\n\n  topP: number;\n\n  topK: number;\n\n  seed: number;\n\n  presencePenalty: number;\n\n  frequencyPenalty: number;\n\n  stopSequences: string[] = [];\n\n  logprobs: boolean;\n\n  topLogprobs: number = 0;\n\n  safetySettings: GoogleAISafetySetting[] = [];\n\n  responseModalities?: GoogleAIModelModality[];\n\n  // May intentionally be undefined, meaning to compute this.\n  convertSystemMessageToHumanContent: boolean | undefined;\n\n  safetyHandler: GoogleAISafetyHandler;\n\n  speechConfig: GoogleSpeechConfig;\n\n  streamUsage = true;\n\n  streaming = false;\n\n  labels?: Record<string, string>;\n\n  protected connection: ChatConnection<AuthOptions>;\n\n  protected streamedConnection: ChatConnection<AuthOptions>;\n\n  constructor(fields?: ChatGoogleBaseInput<AuthOptions>) {\n    super(ensureParams(fields));\n    this._addVersion(\"@langchain/google-common\", __PKG_VERSION__);\n\n    copyAndValidateModelParamsInto(fields, this);\n    this.safetyHandler =\n      fields?.safetyHandler ?? new DefaultGeminiSafetyHandler();\n    this.streamUsage = fields?.streamUsage ?? this.streamUsage;\n    const client = this.buildClient(fields);\n    this.buildConnection(fields ?? {}, client);\n  }\n\n  getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n    const params = this.invocationParams(options);\n    return {\n      ls_provider: \"google_vertexai\",\n      ls_model_name: this.model,\n      ls_model_type: \"chat\",\n      ls_temperature: params.temperature ?? undefined,\n      ls_max_tokens: params.maxOutputTokens ?? undefined,\n      ls_stop: options.stop,\n    };\n  }\n\n  abstract buildAbstractedClient(\n    fields?: GoogleAIBaseLLMInput<AuthOptions>\n  ): GoogleAbstractedClient;\n\n  buildApiKeyClient(apiKey: string): GoogleAbstractedClient {\n    return new ApiKeyGoogleAuth(apiKey);\n  }\n\n  buildApiKey(fields?: GoogleAIBaseLLMInput<AuthOptions>): string | undefined {\n    return fields?.apiKey ?? getEnvironmentVariable(\"GOOGLE_API_KEY\");\n  }\n\n  buildClient(\n    fields?: GoogleAIBaseLLMInput<AuthOptions>\n  ): GoogleAbstractedClient {\n    const apiKey = this.buildApiKey(fields);\n    if (apiKey) {\n      return this.buildApiKeyClient(apiKey);\n    } else {\n      return this.buildAbstractedClient(fields);\n    }\n  }\n\n  buildConnection(\n    fields: GoogleBaseLLMInput<AuthOptions>,\n    client: GoogleAbstractedClient\n  ) {\n    this.connection = new ChatConnection(\n      { ...fields, ...this },\n      this.caller,\n      client,\n      false\n    );\n\n    this.streamedConnection = new ChatConnection(\n      { ...fields, ...this },\n      this.caller,\n      client,\n      true\n    );\n  }\n\n  get platform(): GooglePlatformType {\n    return this.connection.platform;\n  }\n\n  override bindTools(\n    tools: GoogleAIToolType[],\n    kwargs?: Partial<GoogleAIBaseLanguageModelCallOptions>\n  ): Runnable<\n    BaseLanguageModelInput,\n    AIMessageChunk,\n    GoogleAIBaseLanguageModelCallOptions\n  > {\n    return this.withConfig({ tools: convertToGeminiTools(tools), ...kwargs });\n  }\n\n  _llmType() {\n    return \"google\";\n  }\n\n  /**\n   * Get the parameters used to invoke the model\n   */\n  override invocationParams(options?: this[\"ParsedCallOptions\"]) {\n    return copyAIModelParams(this, options);\n  }\n\n  async _generate(\n    messages: BaseMessage[],\n    options: this[\"ParsedCallOptions\"],\n    runManager: CallbackManagerForLLMRun | undefined\n  ): Promise<ChatResult> {\n    options.signal?.throwIfAborted();\n    const parameters = this.invocationParams(options);\n    if (this.streaming) {\n      const stream = this._streamResponseChunks(messages, options, runManager);\n      let finalChunk: ChatGenerationChunk | null = null;\n      for await (const chunk of stream) {\n        finalChunk = !finalChunk ? chunk : concat(finalChunk, chunk);\n      }\n      if (!finalChunk) {\n        throw new Error(\"No chunks were returned from the stream.\");\n      }\n      return {\n        generations: [finalChunk],\n      };\n    }\n\n    const response = await this.connection.request(\n      messages,\n      parameters,\n      options,\n      runManager\n    );\n    const ret = this.connection.api.responseToChatResult(response);\n    const chunk = ret?.generations?.[0];\n    if (chunk) {\n      await runManager?.handleLLMNewToken(chunk.text || \"\");\n    }\n    return ret;\n  }\n\n  async *_streamChatModelEvents(\n    messages: BaseMessage[],\n    options: this[\"ParsedCallOptions\"],\n    _runManager?: CallbackManagerForLLMRun\n  ): AsyncGenerator<ChatModelStreamEvent> {\n    const parameters = this.invocationParams(options);\n    const response = await this.streamedConnection.request(\n      messages,\n      parameters,\n      options,\n      _runManager\n    );\n    const stream = response.data as JsonStream;\n    const shouldStreamUsage =\n      this.streamUsage !== false && options.streamUsage !== false;\n    async function* geminiChunks(jsonStream: JsonStream, signal?: AbortSignal) {\n      while (!jsonStream.streamDone) {\n        if (signal?.aborted) {\n          return;\n        }\n        const output = await jsonStream.nextChunk();\n        if (output !== null) {\n          yield output;\n        }\n      }\n    }\n    yield* convertGoogleGeminiStream(geminiChunks(stream, options.signal), {\n      streamUsage: shouldStreamUsage,\n    });\n  }\n\n  async *_streamResponseChunks(\n    _messages: BaseMessage[],\n    options: this[\"ParsedCallOptions\"],\n    runManager?: CallbackManagerForLLMRun\n  ): AsyncGenerator<ChatGenerationChunk> {\n    // Make the call as a streaming request\n    const parameters = this.invocationParams(options);\n    const response = await this.streamedConnection.request(\n      _messages,\n      parameters,\n      options,\n      runManager\n    );\n\n    // Get the streaming parser of the response\n    const stream = response.data as JsonStream;\n    const shouldStreamUsage =\n      this.streamUsage !== false && options.streamUsage !== false;\n    // Loop until the end of the stream\n    // During the loop, yield each time we get a chunk from the streaming parser\n    // that is either available or added to the queue\n    while (!stream.streamDone) {\n      if (options.signal?.aborted) {\n        return;\n      }\n      const output = await stream.nextChunk();\n      await runManager?.handleCustomEvent(\n        `google-chunk-${this.constructor.name}`,\n        {\n          output,\n        }\n      );\n\n      const chunk =\n        output !== null\n          ? this.connection.api.responseToChatGeneration({ data: output })\n          : new ChatGenerationChunk({\n              text: \"\",\n              generationInfo: { finishReason: \"stop\" },\n              message: new AIMessageChunk({\n                content: \"\",\n              }),\n            });\n\n      if (shouldStreamUsage && chunk) {\n        chunk.message = new AIMessageChunk({\n          ...chunk.message,\n          usage_metadata: chunk.generationInfo?.usage_metadata,\n        });\n      }\n\n      if (chunk) {\n        yield chunk;\n        await runManager?.handleLLMNewToken(\n          chunk.text ?? \"\",\n          undefined,\n          undefined,\n          undefined,\n          undefined,\n          { chunk }\n        );\n      }\n    }\n  }\n\n  /** @ignore */\n  _combineLLMOutput() {\n    return [];\n  }\n\n  /**\n   * Return profiling information for the model.\n   *\n   * Provides information about the model's capabilities and constraints,\n   * including token limits, multimodal support, and advanced features like\n   * tool calling and structured output.\n   *\n   * @returns {ModelProfile} An object describing the model's capabilities and constraints\n   */\n  get profile(): ModelProfile {\n    return PROFILES[this.model] ?? {};\n  }\n\n  withStructuredOutput<\n    // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n    RunOutput extends Record<string, any> = Record<string, any>,\n  >(\n    outputSchema:\n      | InteropZodType<RunOutput>\n      | SerializableSchema<RunOutput>\n      // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n      | Record<string, any>,\n    config?: StructuredOutputMethodOptions<false>\n  ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n  withStructuredOutput<\n    // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n    RunOutput extends Record<string, any> = Record<string, any>,\n  >(\n    outputSchema:\n      | InteropZodType<RunOutput>\n      | SerializableSchema<RunOutput>\n      // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n      | Record<string, any>,\n    config?: StructuredOutputMethodOptions<true>\n  ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n  withStructuredOutput<\n    // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n    RunOutput extends Record<string, any> = Record<string, any>,\n  >(\n    outputSchema:\n      | InteropZodType<RunOutput>\n      | SerializableSchema<RunOutput>\n      // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n      | Record<string, any>,\n    config?: StructuredOutputMethodOptions<boolean>\n  ):\n    | Runnable<BaseLanguageModelInput, RunOutput>\n    | Runnable<\n        BaseLanguageModelInput,\n        { raw: BaseMessage; parsed: RunOutput }\n      > {\n    const schema = outputSchema;\n    const name = config?.name;\n    const method = config?.method;\n    const includeRaw = config?.includeRaw;\n\n    if (method === \"jsonMode\") {\n      throw new Error(\n        `Google only supports \"jsonSchema\" or \"functionCalling\" as a method.`\n      );\n    }\n\n    let llm: Runnable<BaseLanguageModelInput>;\n    let outputParser: Runnable<AIMessageChunk, RunOutput>;\n\n    if (method === \"functionCalling\") {\n      let functionName = name ?? \"extract\";\n      let geminiFunctionDeclaration: GeminiFunctionDeclaration;\n      if (isInteropZodSchema(schema) || isSerializableSchema(schema)) {\n        const jsonSchema = schemaToGeminiParameters(schema);\n        geminiFunctionDeclaration = {\n          name: functionName,\n          description:\n            jsonSchema.description ?? \"A function available to call.\",\n          parameters: jsonSchema as GeminiFunctionSchema,\n        };\n      } else if (\n        typeof schema.name === \"string\" &&\n        typeof schema.parameters === \"object\" &&\n        schema.parameters != null\n      ) {\n        geminiFunctionDeclaration = schema as GeminiFunctionDeclaration;\n        functionName = schema.name;\n      } else {\n        // We are providing the schema for *just* the parameters, probably\n        const parameters: GeminiJsonSchema = removeAdditionalProperties(schema);\n        geminiFunctionDeclaration = {\n          name: functionName,\n          description: schema.description ?? \"\",\n          parameters,\n        };\n      }\n\n      const tools: GeminiTool[] = [\n        { functionDeclarations: [geminiFunctionDeclaration] },\n      ];\n      llm = this.bindTools(tools).withConfig({ tool_choice: functionName });\n\n      outputParser = createFunctionCallingParser(schema, functionName);\n    } else {\n      // Default to jsonSchema method\n      const jsonSchema = schemaToGeminiParameters(schema);\n      llm = this.withConfig({\n        responseSchema: jsonSchema as GeminiJsonSchema,\n      });\n      outputParser = createContentParser(schema);\n    }\n\n    return assembleStructuredOutputPipeline(\n      llm,\n      outputParser,\n      includeRaw,\n      includeRaw ? \"StructuredOutputRunnable\" : \"ChatGoogleStructuredOutput\"\n    );\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA0EA,IAAa,iBAAb,cAAiDA,mBAAAA,4BAG/C;CACA;CAEA,YACE,QACA,QACA,QACA,WACA;AACA,QAAM,QAAQ,QAAQ,QAAQ,UAAU;AACxC,OAAK,qCACH,QAAQ;;CAGZ,IAAI,uBAAgC;AAClC,SAAO,OAAO,KAAK,uCAAuC,YACtD,CAAC,KAAK,qCACN,KAAK;;CAGX,IAAI,8BAAuC;AAIzC,MAAI,KAAK,gBAAgB,OACvB,QAAO;WACE,KAAK,cAAc,qBAC5B,QAAO;WACE,KAAK,UAAU,WAAW,oBAAoB,CACvD,QAAO;WACE,KAAK,UAAU,WAAW,wBAAwB,CAC3D,QAAO;WACE,KAAK,cAAc,gBAAgB,KAAK,aAAa,MAE9D,QAAO;WACE,KAAK,gBAAgB,QAG9B,QAAO;AAET,SAAO;;CAGT,6CAGE;AACA,MAAI,KAAK,UAAU,WAAW,aAAa,CACzC,QAAO;WACE,KAAK,UAAU,WAAW,aAAa,CAChD,QAAO;MAEP,QAAO;;CAIX,kCACE,WACwC;EACxC,MAAM,MAAM,UAAU;AACtB,MAAI,QAAQ,KAAA,KAAa,QAAQ,KAC/B,QAAO,KAAK,4CAA4C;MAExD,QAAO;;CAIX,iBAA8B;EAC5B,MAAM,YACH,KAAK,aAAiC,EAAE;EAC3C,MAAM,6BACJ,KAAK,kCAAkC,UAAU;AAMnD,SAAOC,eAAAA,aAAa;GAJlB,sBAAsB,KAAK;GAC3B;GACA,GAAG;GAE2B,CAAC;;CAGnC,IAAI,MAAmB;AACrB,UAAQ,KAAK,SAAb;GACE,KAAK,SACH,QAAO,KAAK,gBAAgB;GAC9B,QACE,QAAO,MAAM;;;;;;;AAoBrB,IAAsB,iBAAtB,cACUC,4CAAAA,cAEV;CAEE,OAAO,UAAU;AACf,SAAO;;CAGT,IAAI,aAAoD;AACtD,SAAO,EACL,aAAa,uBACd;;CAGH,kBAAkB;CAGlB;CAEA,YAAY;CAEZ;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA,gBAA0B,EAAE;CAE5B;CAEA,cAAsB;CAEtB,iBAA0C,EAAE;CAE5C;CAGA;CAEA;CAEA;CAEA,cAAc;CAEd,YAAY;CAEZ;CAEA;CAEA;CAEA,YAAY,QAA2C;AACrD,QAAMC,uBAAAA,aAAa,OAAO,CAAC;AAC3B,OAAK,YAAY,4BAAA,QAA4C;AAE7D,iBAAA,+BAA+B,QAAQ,KAAK;AAC5C,OAAK,gBACH,QAAQ,iBAAiB,IAAIC,eAAAA,4BAA4B;AAC3D,OAAK,cAAc,QAAQ,eAAe,KAAK;EAC/C,MAAM,SAAS,KAAK,YAAY,OAAO;AACvC,OAAK,gBAAgB,UAAU,EAAE,EAAE,OAAO;;CAG5C,YAAY,SAAqD;EAC/D,MAAM,SAAS,KAAK,iBAAiB,QAAQ;AAC7C,SAAO;GACL,aAAa;GACb,eAAe,KAAK;GACpB,eAAe;GACf,gBAAgB,OAAO,eAAe,KAAA;GACtC,eAAe,OAAO,mBAAmB,KAAA;GACzC,SAAS,QAAQ;GAClB;;CAOH,kBAAkB,QAAwC;AACxD,SAAO,IAAIC,aAAAA,iBAAiB,OAAO;;CAGrC,YAAY,QAAgE;AAC1E,SAAO,QAAQ,WAAA,GAAA,0BAAA,wBAAiC,iBAAiB;;CAGnE,YACE,QACwB;EACxB,MAAM,SAAS,KAAK,YAAY,OAAO;AACvC,MAAI,OACF,QAAO,KAAK,kBAAkB,OAAO;MAErC,QAAO,KAAK,sBAAsB,OAAO;;CAI7C,gBACE,QACA,QACA;AACA,OAAK,aAAa,IAAI,eACpB;GAAE,GAAG;GAAQ,GAAG;GAAM,EACtB,KAAK,QACL,QACA,MACD;AAED,OAAK,qBAAqB,IAAI,eAC5B;GAAE,GAAG;GAAQ,GAAG;GAAM,EACtB,KAAK,QACL,QACA,KACD;;CAGH,IAAI,WAA+B;AACjC,SAAO,KAAK,WAAW;;CAGzB,UACE,OACA,QAKA;AACA,SAAO,KAAK,WAAW;GAAE,OAAOC,eAAAA,qBAAqB,MAAM;GAAE,GAAG;GAAQ,CAAC;;CAG3E,WAAW;AACT,SAAO;;;;;CAMT,iBAA0B,SAAqC;AAC7D,SAAOC,eAAAA,kBAAkB,MAAM,QAAQ;;CAGzC,MAAM,UACJ,UACA,SACA,YACqB;AACrB,UAAQ,QAAQ,gBAAgB;EAChC,MAAM,aAAa,KAAK,iBAAiB,QAAQ;AACjD,MAAI,KAAK,WAAW;GAClB,MAAM,SAAS,KAAK,sBAAsB,UAAU,SAAS,WAAW;GACxE,IAAI,aAAyC;AAC7C,cAAW,MAAM,SAAS,OACxB,cAAa,CAAC,aAAa,SAAA,GAAA,6BAAA,QAAe,YAAY,MAAM;AAE9D,OAAI,CAAC,WACH,OAAM,IAAI,MAAM,2CAA2C;AAE7D,UAAO,EACL,aAAa,CAAC,WAAW,EAC1B;;EAGH,MAAM,WAAW,MAAM,KAAK,WAAW,QACrC,UACA,YACA,SACA,WACD;EACD,MAAM,MAAM,KAAK,WAAW,IAAI,qBAAqB,SAAS;EAC9D,MAAM,QAAQ,KAAK,cAAc;AACjC,MAAI,MACF,OAAM,YAAY,kBAAkB,MAAM,QAAQ,GAAG;AAEvD,SAAO;;CAGT,OAAO,uBACL,UACA,SACA,aACsC;EACtC,MAAM,aAAa,KAAK,iBAAiB,QAAQ;EAOjD,MAAM,UAAS,MANQ,KAAK,mBAAmB,QAC7C,UACA,YACA,SACA,YACD,EACuB;EACxB,MAAM,oBACJ,KAAK,gBAAgB,SAAS,QAAQ,gBAAgB;EACxD,gBAAgB,aAAa,YAAwB,QAAsB;AACzE,UAAO,CAAC,WAAW,YAAY;AAC7B,QAAI,QAAQ,QACV;IAEF,MAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,QAAI,WAAW,KACb,OAAM;;;AAIZ,SAAOC,sBAAAA,0BAA0B,aAAa,QAAQ,QAAQ,OAAO,EAAE,EACrE,aAAa,mBACd,CAAC;;CAGJ,OAAO,sBACL,WACA,SACA,YACqC;EAErC,MAAM,aAAa,KAAK,iBAAiB,QAAQ;EASjD,MAAM,UAAS,MARQ,KAAK,mBAAmB,QAC7C,WACA,YACA,SACA,WACD,EAGuB;EACxB,MAAM,oBACJ,KAAK,gBAAgB,SAAS,QAAQ,gBAAgB;AAIxD,SAAO,CAAC,OAAO,YAAY;AACzB,OAAI,QAAQ,QAAQ,QAClB;GAEF,MAAM,SAAS,MAAM,OAAO,WAAW;AACvC,SAAM,YAAY,kBAChB,gBAAgB,KAAK,YAAY,QACjC,EACE,QACD,CACF;GAED,MAAM,QACJ,WAAW,OACP,KAAK,WAAW,IAAI,yBAAyB,EAAE,MAAM,QAAQ,CAAC,GAC9D,IAAIC,wBAAAA,oBAAoB;IACtB,MAAM;IACN,gBAAgB,EAAE,cAAc,QAAQ;IACxC,SAAS,IAAIC,yBAAAA,eAAe,EAC1B,SAAS,IACV,CAAC;IACH,CAAC;AAER,OAAI,qBAAqB,MACvB,OAAM,UAAU,IAAIA,yBAAAA,eAAe;IACjC,GAAG,MAAM;IACT,gBAAgB,MAAM,gBAAgB;IACvC,CAAC;AAGJ,OAAI,OAAO;AACT,UAAM;AACN,UAAM,YAAY,kBAChB,MAAM,QAAQ,IACd,KAAA,GACA,KAAA,GACA,KAAA,GACA,KAAA,GACA,EAAE,OAAO,CACV;;;;;CAMP,oBAAoB;AAClB,SAAO,EAAE;;;;;;;;;;;CAYX,IAAI,UAAwB;AAC1B,SAAOC,iBAAAA,QAAS,KAAK,UAAU,EAAE;;CA2BnC,qBAIE,cAKA,QAMI;EACJ,MAAM,SAAS;EACf,MAAM,OAAO,QAAQ;EACrB,MAAM,SAAS,QAAQ;EACvB,MAAM,aAAa,QAAQ;AAE3B,MAAI,WAAW,WACb,OAAM,IAAI,MACR,sEACD;EAGH,IAAI;EACJ,IAAI;AAEJ,MAAI,WAAW,mBAAmB;GAChC,IAAI,eAAe,QAAQ;GAC3B,IAAI;AACJ,QAAA,GAAA,4BAAA,oBAAuB,OAAO,KAAA,GAAA,sCAAA,sBAAyB,OAAO,EAAE;IAC9D,MAAM,aAAaC,iCAAAA,yBAAyB,OAAO;AACnD,gCAA4B;KAC1B,MAAM;KACN,aACE,WAAW,eAAe;KAC5B,YAAY;KACb;cAED,OAAO,OAAO,SAAS,YACvB,OAAO,OAAO,eAAe,YAC7B,OAAO,cAAc,MACrB;AACA,gCAA4B;AAC5B,mBAAe,OAAO;UACjB;IAEL,MAAM,aAA+BC,iCAAAA,2BAA2B,OAAO;AACvE,gCAA4B;KAC1B,MAAM;KACN,aAAa,OAAO,eAAe;KACnC;KACD;;GAGH,MAAM,QAAsB,CAC1B,EAAE,sBAAsB,CAAC,0BAA0B,EAAE,CACtD;AACD,SAAM,KAAK,UAAU,MAAM,CAAC,WAAW,EAAE,aAAa,cAAc,CAAC;AAErE,mBAAA,GAAA,kDAAA,6BAA2C,QAAQ,aAAa;SAC3D;GAEL,MAAM,aAAaD,iCAAAA,yBAAyB,OAAO;AACnD,SAAM,KAAK,WAAW,EACpB,gBAAgB,YACjB,CAAC;AACF,mBAAA,GAAA,kDAAA,qBAAmC,OAAO;;AAG5C,UAAA,GAAA,kDAAA,kCACE,KACA,cACA,YACA,aAAa,6BAA6B,6BAC3C"}