@oiioii/cli 0.1.0
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/README.md +840 -0
- package/dist/cli.js +6922 -0
- package/dist/cli.js.map +1 -0
- package/package.json +67 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/workspace.ts","../src/config/config_store.ts","../src/config/build_environment.ts","../src/logging/feature_logger.ts","../src/logging/logger.ts","../src/logging/log_store.ts","../src/config/config_paths.ts","../src/core/file_lock.ts","../src/logging/redaction.ts","../src/logging/trace_context.ts","../src/output/errors.ts","../src/logging/api_call_logger.ts","../src/clients/hogi_workspace_client.ts","../src/app/command_context.ts","../src/telemetry/event_registry.ts","../src/telemetry/telemetry_manager.ts","../src/app/version.ts","../src/telemetry/telemetry_context.ts","../src/telemetry/sanitization.ts","../src/telemetry/transports/volc_transport.ts","../src/telemetry/public_api.ts","../src/telemetry/business_values.ts","../src/clients/hogi_mcp_client.ts","../src/clients/hogi_points_client.ts","../src/telemetry/command_telemetry.ts","../src/output/json_output.ts","../src/output/human_output.ts","../src/commands/image.ts","../src/clients/hogi_async_generation_client.ts","../src/clients/hogi_model_catalog_client.ts","../src/core/model_map.ts","../src/core/model_selection.ts","../src/core/task_store.ts","../src/core/preview_store.ts","../src/core/generation_preview.ts","../src/core/async_generation.ts","../src/core/video_model_contract.ts","../src/core/generation_input_contract.ts","../src/core/points_quote.ts","../src/commands/generation_dry_run.ts","../src/core/model_defaults.ts","../src/commands/video.ts","../src/commands/audio.ts","../src/commands/task.ts","../src/commands/record.ts","../src/clients/hogi_genai_record_client.ts","../src/clients/hogi_res_client.ts","../src/commands/inspect.ts","../src/commands/preview.ts","../src/commands/upload.ts","../src/core/upload_file_types.ts","../src/clients/hogi_res_upload_client.ts","../src/clients/hogi_vod_upload_client.ts","../src/core/vod_upload_contract.ts","../src/clients/volc_vod_direct_uploader.ts","../src/commands/logs.ts","../src/commands/points.ts","../src/commands/auth.ts","../src/commands/cli_version.ts","../src/core/npm_cli_manager.ts","../src/core/cli_installation.ts"],"sourcesContent":["/**\n * oiioii-cli — Agent-native CLI for Oiioii / Hogi GenAI capabilities.\n *\n * Entry point: registers global flags and top-level commands.\n */\n\nimport { Command, CommanderError } from \"commander\";\nimport { createWorkspaceCommand } from \"./commands/workspace.js\";\nimport { createImageCommand } from \"./commands/image.js\";\nimport { createVideoCommand } from \"./commands/video.js\";\nimport { createAudioCommand } from \"./commands/audio.js\";\nimport { createTaskCommand } from \"./commands/task.js\";\nimport { createRecordCommand } from \"./commands/record.js\";\nimport { createInspectCommand } from \"./commands/inspect.js\";\nimport { createPreviewCommand } from \"./commands/preview.js\";\nimport { createUploadCommand } from \"./commands/upload.js\";\nimport { createLogsCommand } from \"./commands/logs.js\";\nimport { createPointsCommand } from \"./commands/points.js\";\nimport { createAuthCommand } from \"./commands/auth.js\";\nimport { createInstallCommand, createUpdateCommand, createVersionsCommand } from \"./commands/cli_version.js\";\nimport { completeFeatureTrace, reportFeatureFailure, startFeatureTrace } from \"./logging/feature_logger.js\";\nimport { currentFeatureTrace } from \"./logging/trace_context.js\";\nimport { CliError, ErrorCode } from \"./output/errors.js\";\nimport { errorJson, printJson } from \"./output/json_output.js\";\nimport * as human from \"./output/human_output.js\";\nimport { CLI_VERSION } from \"./app/version.js\";\nimport {\n completeCommandTelemetry,\n flushTelemetry,\n reportCommandTelemetryFailure,\n startCommandTelemetry,\n} from \"./telemetry/index.js\";\n\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name(\"oiioii\")\n .description(\"Agent-native CLI for Oiioii / Hogi GenAI capabilities\")\n .version(CLI_VERSION, \"-V, --version\", \"Output the current version\")\n .option(\"--json\", \"Output machine-readable JSON\")\n .option(\"--base-url <url>\", \"Hogi backend base URL\")\n .option(\"--workspace <id>\", \"Workspace ID override\")\n .option(\"--verbose\", \"Enable verbose/debug output\")\n .option(\"--no-color\", \"Disable colored output\");\n\n // Register sub-commands\n program.addCommand(createAuthCommand());\n program.addCommand(createWorkspaceCommand());\n program.addCommand(createImageCommand());\n program.addCommand(createVideoCommand());\n program.addCommand(createAudioCommand());\n program.addCommand(createTaskCommand());\n program.addCommand(createRecordCommand());\n program.addCommand(createInspectCommand());\n program.addCommand(createPreviewCommand());\n program.addCommand(createUploadCommand());\n program.addCommand(createLogsCommand());\n program.addCommand(createPointsCommand());\n program.addCommand(createUpdateCommand());\n program.addCommand(createInstallCommand());\n program.addCommand(createVersionsCommand());\n\n program.hook(\"preAction\", async (_root, actionCommand) => {\n const parts: string[] = [];\n let current: Command | null = actionCommand;\n while (current?.parent) {\n parts.push(current.name());\n current = current.parent;\n }\n const feature = parts.reverse().join(\".\");\n const traceId = !feature.startsWith(\"logs.\") ? startFeatureTrace(feature) : undefined;\n await startCommandTelemetry(actionCommand, feature, traceId);\n });\n\n program.hook(\"postAction\", () => {\n const exitCode = typeof process.exitCode === \"number\" ? process.exitCode : 0;\n reportCommandTelemetryFailure(currentFeatureTrace()?.failure?.code);\n completeCommandTelemetry(exitCode);\n completeFeatureTrace(exitCode);\n });\n\n return program;\n}\n\nexport async function runProgram(program: Command, argv: string[]): Promise<number> {\n program.exitOverride();\n try {\n await program.parseAsync(argv);\n return typeof process.exitCode === \"number\" ? process.exitCode : 0;\n } catch (error) {\n if (error instanceof CommanderError && (error.code === \"commander.helpDisplayed\" || error.code === \"commander.version\")) {\n return 0;\n }\n\n if (!currentFeatureTrace()) startFeatureTrace(\"cli.parse\");\n const cliError = error instanceof CliError\n ? error\n : error instanceof CommanderError\n ? new CliError(ErrorCode.INVALID_ARGUMENT, error.message)\n : new CliError(ErrorCode.SERVER_ERROR, error instanceof Error ? error.message : String(error));\n if (program.opts().json === true) {\n printJson(errorJson(\"cli_error\", cliError.code, cliError.message, cliError.details));\n } else {\n reportFeatureFailure(cliError.code, cliError.message);\n if (!(error instanceof CommanderError)) human.error(cliError.message);\n }\n process.exitCode = 1;\n reportCommandTelemetryFailure(cliError.code);\n completeCommandTelemetry(1);\n completeFeatureTrace(1);\n return 1;\n }\n}\n\n// Run when invoked as main entry point.\n// Uses a URL comparison to detect direct execution vs import.\nimport { fileURLToPath } from \"node:url\";\nimport { resolve } from \"node:path\";\nimport { realpathSync } from \"node:fs\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst invokedPath = process.argv[1] !== undefined ? realpathSync(resolve(process.argv[1])) : undefined;\nconst isMain = invokedPath === __filename;\n\nif (isMain) {\n const program = createProgram();\n runProgram(program, process.argv).then(async (exitCode) => {\n // DataRangers sends events asynchronously. Wait for its queue for a bounded\n // period before the explicit exit required by undici's keep-alive handles.\n await flushTelemetry();\n // Ensure the process exits after async commands complete.\n // Node.js undici (globalThis.fetch) keeps HTTP connections alive\n // which prevents the event loop from draining naturally.\n process.exit(exitCode);\n });\n}\n","/**\n * Workspace commands: create, set, current.\n *\n * `oiioii workspace set <workspace_id>` — Persists workspace ID to config.\n * `oiioii workspace current [--json]` — Shows the currently active workspace.\n *\n * Resolution order for active workspace:\n * 1. --workspace flag (global)\n * 2. OIIOII_WORKSPACE_ID env var\n * 3. config.json defaultWorkspaceId\n */\n\nimport { Command } from \"commander\";\nimport { FileConfigStore } from \"../config/config_store.js\";\nimport { HogiWorkspaceClient, type WorkspaceLanguage } from \"../clients/hogi_workspace_client.js\";\nimport { getRootOptions, isJsonOutput, requireApiKeyAuth } from \"../app/command_context.js\";\nimport { logFeatureStep } from \"../logging/feature_logger.js\";\nimport { recordTelemetryBusinessInfo, setTelemetryWorkspaceId } from \"../telemetry/index.js\";\nimport { successJson, errorJson, printJson } from \"../output/json_output.js\";\nimport { CliError, ErrorCode } from \"../output/errors.js\";\nimport * as human from \"../output/human_output.js\";\n\nexport interface WorkspaceCommandDeps {\n configStore?: FileConfigStore;\n fetch?: typeof globalThis.fetch;\n}\n\n/** Get --workspace from the root program. */\nfunction getWorkspaceOverride(cmd: Command): string | undefined {\n let root: Command = cmd;\n while (root.parent) {\n root = root.parent;\n }\n return root.opts().workspace as string | undefined;\n}\n\nexport interface WorkspaceCreateResult {\n workspace_id: string;\n name: string;\n language?: WorkspaceLanguage;\n set_current: boolean;\n}\n\nconst WORKSPACE_LANGUAGES: WorkspaceLanguage[] = [\"en\", \"zh\", \"zh-Hant\", \"ja\"];\n\nexport async function executeWorkspaceCreate(\n params: { name?: string; language?: string; setCurrent?: boolean },\n rootOptions: Record<string, unknown>,\n deps: WorkspaceCommandDeps = {},\n): Promise<WorkspaceCreateResult> {\n const name = params.name?.trim();\n if (params.name !== undefined && !name) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, \"--name must not be empty\");\n }\n if (params.language !== undefined && !WORKSPACE_LANGUAGES.includes(params.language as WorkspaceLanguage)) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, `--language must be one of: ${WORKSPACE_LANGUAGES.join(\", \")}`);\n }\n\n const configStore = deps.configStore ?? new FileConfigStore();\n const auth = requireApiKeyAuth(rootOptions, configStore);\n const language = params.language as WorkspaceLanguage | undefined;\n logFeatureStep(\"workspace\", \"workspace.create_requested\", {\n has_name: name !== undefined,\n language: language ?? null,\n set_current: params.setCurrent === true,\n });\n\n const created = await new HogiWorkspaceClient({\n baseUrl: auth.baseUrl,\n apiKey: auth.apiKey,\n ...(deps.fetch ? { fetch: deps.fetch } : {}),\n }).createWorkspace({\n ...(name !== undefined ? { name } : {}),\n ...(language !== undefined ? { language } : {}),\n });\n\n if (params.setCurrent === true) {\n configStore.update({ defaultWorkspaceId: created.workspaceId });\n logFeatureStep(\"workspace\", \"workspace.current_updated\", { workspace_id: created.workspaceId });\n }\n logFeatureStep(\"workspace\", \"workspace.created\", { workspace_id: created.workspaceId });\n return {\n workspace_id: created.workspaceId,\n name: created.name,\n ...(language !== undefined ? { language } : {}),\n set_current: params.setCurrent === true,\n };\n}\n\nfunction handleWorkspaceError(error: unknown, jsonMode: boolean, type: string): void {\n const cliError = error instanceof CliError\n ? error\n : new CliError(ErrorCode.SERVER_ERROR, error instanceof Error ? error.message : String(error));\n if (jsonMode) printJson(errorJson(type, cliError.code, cliError.message, cliError.details));\n else human.error(cliError.message);\n process.exitCode = 1;\n}\n\nexport function createWorkspaceCommand(deps: WorkspaceCommandDeps = {}): Command {\n const ws = new Command(\"workspace\").description(\"Workspace management\");\n\n ws.command(\"create\")\n .description(\"Create a new workspace\")\n .option(\"--name <name>\", \"Workspace name\")\n .option(\"--language <language>\", \"Workspace language: en, zh, zh-Hant, or ja\")\n .option(\"--set-current\", \"Set the created workspace as the active workspace\")\n .action(async (opts: { name?: string; language?: string; setCurrent?: boolean }, cmd: Command) => {\n const jsonMode = isJsonOutput(cmd);\n try {\n const result = await executeWorkspaceCreate(opts, getRootOptions(cmd), deps);\n setTelemetryWorkspaceId(result.workspace_id);\n recordTelemetryBusinessInfo({\n set_current: result.set_current,\n ...(result.language ? { language: result.language } : {}),\n });\n if (jsonMode) {\n printJson(successJson(\"workspace_created\", result, [\n ...(!result.set_current\n ? [{ command: `oiioii workspace set ${result.workspace_id}`, description: \"Set the new workspace as active\" }]\n : []),\n { command: `oiioii --workspace ${result.workspace_id} upload file <path> --json`, description: \"Upload a resource\" },\n ]));\n } else {\n human.success(`Workspace created: ${result.workspace_id}`);\n human.info(` Name: ${result.name}`);\n if (result.language) human.info(` Language: ${result.language}`);\n human.info(` Current: ${result.set_current ? \"yes\" : \"no\"}`);\n }\n } catch (error) {\n handleWorkspaceError(error, jsonMode, \"workspace_created\");\n }\n });\n\n ws.command(\"set\")\n .description(\"Set active workspace\")\n .argument(\"<workspace_id>\", \"Workspace ID\")\n .action((workspaceId: string, _opts: unknown, cmd: Command) => {\n const jsonMode = isJsonOutput(cmd);\n\n if (!workspaceId || workspaceId.trim() === \"\") {\n if (jsonMode) {\n printJson(errorJson(\"workspace_set\", ErrorCode.INVALID_ARGUMENT, \"Workspace ID is required.\"));\n } else {\n human.error(\"Workspace ID is required.\");\n }\n process.exitCode = 1;\n return;\n }\n\n const configStore = deps.configStore ?? new FileConfigStore();\n configStore.update({ defaultWorkspaceId: workspaceId.trim() });\n setTelemetryWorkspaceId(workspaceId.trim());\n\n if (jsonMode) {\n printJson(successJson(\"workspace_set\", {\n workspace_id: workspaceId.trim(),\n }, [\n { command: \"oiioii workspace current --json\" },\n { command: \"oiioii image text --prompt '...' --json\" },\n ]));\n } else {\n human.success(`Workspace set to: ${workspaceId.trim()}`);\n }\n });\n\n ws.command(\"current\")\n .description(\"Show current workspace\")\n .action((_opts: unknown, cmd: Command) => {\n const jsonMode = isJsonOutput(cmd);\n const configStore = deps.configStore ?? new FileConfigStore();\n const config = configStore.loadResolved();\n\n // Resolution: --workspace flag > env > config\n const override = getWorkspaceOverride(cmd);\n const envOverride = process.env[\"OIIOII_WORKSPACE_ID\"];\n const workspaceId = override ?? envOverride ?? config.defaultWorkspaceId;\n\n const source = override\n ? \"flag\"\n : envOverride\n ? \"env\"\n : config.defaultWorkspaceId\n ? \"config\"\n : \"none\";\n\n if (!workspaceId) {\n if (jsonMode) {\n printJson(errorJson(\n \"workspace_current\",\n ErrorCode.WORKSPACE_REQUIRED,\n \"No workspace set. Use 'oiioii workspace set <id>' or set OIIOII_WORKSPACE_ID.\",\n { hint: \"oiioii workspace set <workspace_id>\" },\n ));\n } else {\n human.error(\"No workspace set.\");\n human.info(\" Use: oiioii workspace set <workspace_id>\");\n human.info(\" Or set: OIIOII_WORKSPACE_ID=<id>\");\n }\n process.exitCode = 1;\n return;\n }\n\n setTelemetryWorkspaceId(workspaceId);\n recordTelemetryBusinessInfo({ has_workspace: true });\n\n if (jsonMode) {\n printJson(successJson(\"workspace_current\", {\n workspace_id: workspaceId,\n source,\n }));\n } else {\n human.info(`Workspace: ${workspaceId}`);\n human.info(` Source: ${source}`);\n }\n });\n\n return ws;\n}\n","/**\n * Configuration store — reads/writes config.json in a configurable directory.\n *\n * Default location: ~/.oiioii/config.json\n * Override via OIIOII_CONFIG_DIR env var (used in tests and CI).\n *\n * File permissions: 0600 (owner read/write only).\n */\n\nimport { readFileSync, writeFileSync, mkdirSync, existsSync, chmodSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getDefaultBaseUrl } from \"./build_environment.js\";\nimport { logFeatureStep } from \"../logging/feature_logger.js\";\nimport { resolveConfigDir } from \"./config_paths.js\";\nimport { withFileLock } from \"../core/file_lock.js\";\n\nexport { resolveConfigDir } from \"./config_paths.js\";\n\nexport interface CliConfig {\n baseUrl: string;\n apiKey?: string;\n defaultWorkspaceId?: string;\n}\n\nfunction defaultConfig(): CliConfig {\n return {\n baseUrl: getDefaultBaseUrl(),\n };\n}\n\n/**\n * Resolve the config directory path.\n * Priority: OIIOII_CONFIG_DIR env > ~/.oiioii\n */\n/**\n * File-backed configuration store.\n */\nexport class FileConfigStore {\n private readonly configPath: string;\n private readonly dirPath: string;\n\n constructor(configDir?: string) {\n this.dirPath = configDir ?? resolveConfigDir();\n this.configPath = join(this.dirPath, \"config.json\");\n }\n\n getConfigPath(): string {\n return this.configPath;\n }\n\n /**\n * Load config from disk. Returns defaults if file doesn't exist.\n */\n load(): CliConfig {\n if (!existsSync(this.configPath)) {\n logFeatureStep(\"config_store\", \"config.defaulted\", { reason: \"missing\" });\n return defaultConfig();\n }\n try {\n const raw = readFileSync(this.configPath, \"utf-8\");\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const config: CliConfig = {\n baseUrl: typeof parsed[\"baseUrl\"] === \"string\" ? parsed[\"baseUrl\"] : getDefaultBaseUrl(),\n ...(typeof parsed[\"apiKey\"] === \"string\" && parsed[\"apiKey\"].trim()\n ? { apiKey: parsed[\"apiKey\"].trim() }\n : {}),\n ...(typeof parsed[\"defaultWorkspaceId\"] === \"string\"\n ? { defaultWorkspaceId: parsed[\"defaultWorkspaceId\"] }\n : {}),\n };\n logFeatureStep(\"config_store\", \"config.loaded\");\n return config;\n } catch {\n logFeatureStep(\"config_store\", \"config.defaulted\", { reason: \"invalid\" }, \"warn\");\n return defaultConfig();\n }\n }\n\n /**\n * Load config with env var overrides applied.\n * Resolution: env > file > defaults.\n */\n loadResolved(): CliConfig {\n const base = this.load();\n logFeatureStep(\"config_store\", \"config.resolved\", {\n base_url_source: process.env[\"OIIOII_BASE_URL\"] ? \"env\" : \"file_or_build\",\n api_key_source: process.env[\"OIIOII_API_KEY\"] ? \"env\" : base.apiKey ? \"file\" : \"missing\",\n workspace_source: process.env[\"OIIOII_WORKSPACE_ID\"] ? \"env\" : \"file\",\n });\n return {\n ...base,\n baseUrl: process.env[\"OIIOII_BASE_URL\"] ?? base.baseUrl,\n apiKey: process.env[\"OIIOII_API_KEY\"]?.trim() || base.apiKey,\n defaultWorkspaceId: process.env[\"OIIOII_WORKSPACE_ID\"] ?? base.defaultWorkspaceId,\n };\n }\n\n /**\n * Save full config to disk with 0600 permissions.\n */\n save(config: CliConfig): void {\n this._ensureDir();\n withFileLock(`${this.configPath}.lock`, () => this._write(config));\n logFeatureStep(\"config_store\", \"config.saved\");\n }\n\n private _write(config: CliConfig): void {\n writeFileSync(this.configPath, JSON.stringify(config, null, 2) + \"\\n\", {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n // Ensure permissions even if file existed\n chmodSync(this.configPath, 0o600);\n }\n\n /**\n * Merge partial updates into the existing config.\n */\n update(partial: Partial<CliConfig>): void {\n this._ensureDir();\n withFileLock(`${this.configPath}.lock`, () => {\n const current = this.load();\n this._write({ ...current, ...partial });\n });\n logFeatureStep(\"config_store\", \"config.updated\", { fields: Object.keys(partial) });\n }\n\n /** Ensure the config directory exists. */\n private _ensureDir(): void {\n if (!existsSync(this.dirPath)) {\n mkdirSync(this.dirPath, { recursive: true, mode: 0o700 });\n }\n chmodSync(this.dirPath, 0o700);\n }\n}\n\n/**\n * Legacy helper — load config from env + defaults (no file).\n * Preserved for backward compat with K02 tests.\n */\nexport function loadConfig(): CliConfig {\n const defaults = defaultConfig();\n return {\n ...defaults,\n baseUrl: process.env[\"OIIOII_BASE_URL\"] ?? defaults.baseUrl,\n apiKey: process.env[\"OIIOII_API_KEY\"]?.trim() || undefined,\n defaultWorkspaceId: process.env[\"OIIOII_WORKSPACE_ID\"],\n };\n}\n","/**\n * Build-time backend environment configuration.\n *\n * tsup replaces the injected constants for standalone builds. When running\n * directly from source, the matching environment variables are used instead.\n */\n\ndeclare const __OIIOII_BUILD_ENV__: string | undefined;\ndeclare const __OIIOII_BUILD_BASE_URL__: string | undefined;\n\nexport const BUILD_ENVIRONMENT_URLS = {\n production: \"https://api.oiioii.ai\",\n test: \"https://api-hoe.oiioii.tv\",\n local: \"http://localhost:4000\",\n} as const;\n\nexport type BuildEnvironment = keyof typeof BUILD_ENVIRONMENT_URLS;\n\nexport interface BuildEnvironmentConfig {\n environment: BuildEnvironment;\n baseUrl: string;\n}\n\nexport interface ReleaseChannelConfig {\n managed: boolean;\n distTag?: \"latest\" | \"test\";\n prerelease: \"forbidden\" | \"required\";\n}\n\nexport const RELEASE_CHANNELS: Record<BuildEnvironment, ReleaseChannelConfig> = {\n production: { managed: true, distTag: \"latest\", prerelease: \"forbidden\" },\n test: { managed: true, distTag: \"test\", prerelease: \"required\" },\n local: { managed: false, prerelease: \"required\" },\n};\n\nexport function isBuildEnvironment(value: string): value is BuildEnvironment {\n return Object.prototype.hasOwnProperty.call(BUILD_ENVIRONMENT_URLS, value);\n}\n\nfunction injectedBuildEnvironment(): string | undefined {\n return typeof __OIIOII_BUILD_ENV__ === \"string\"\n ? __OIIOII_BUILD_ENV__\n : process.env[\"OIIOII_BUILD_ENV\"];\n}\n\nfunction injectedBuildBaseUrl(): string | undefined {\n const value = typeof __OIIOII_BUILD_BASE_URL__ === \"string\"\n ? __OIIOII_BUILD_BASE_URL__\n : process.env[\"OIIOII_BUILD_BASE_URL\"];\n return value?.trim() || undefined;\n}\n\n/** Resolve the environment embedded in this build. Defaults to test. */\nexport function getBuildEnvironment(): BuildEnvironment {\n const value = injectedBuildEnvironment() ?? \"test\";\n return isBuildEnvironment(value) ? value : \"test\";\n}\n\n/** Resolve the default backend URL embedded in this build. */\nexport function getBuildEnvironmentConfig(): BuildEnvironmentConfig {\n const environment = getBuildEnvironment();\n return {\n environment,\n baseUrl: injectedBuildBaseUrl() ?? BUILD_ENVIRONMENT_URLS[environment],\n };\n}\n\nexport function getDefaultBaseUrl(): string {\n return getBuildEnvironmentConfig().baseUrl;\n}\n\nexport function getReleaseChannelConfig(): ReleaseChannelConfig {\n return RELEASE_CHANNELS[getBuildEnvironment()];\n}\n","import { randomBytes } from \"node:crypto\";\nimport { createDefaultLogger } from \"./logger.js\";\nimport { currentFeatureTrace, enterFeatureTrace, leaveFeatureTrace } from \"./trace_context.js\";\nimport type { LogLevel } from \"./types.js\";\n\nexport function generateTraceId(): string {\n return \"trace_\" + randomBytes(8).toString(\"hex\");\n}\n\nexport function startFeatureTrace(feature: string): string {\n const traceId = generateTraceId();\n enterFeatureTrace({ traceId, feature, startedAt: Date.now() });\n createDefaultLogger().record({\n level: \"info\",\n category: \"application\",\n source: \"cli\",\n event: \"feature.started\",\n trace_id: traceId,\n operation: feature,\n metadata: { feature },\n });\n return traceId;\n}\n\nexport function logFeatureStep(\n source: string,\n step: string,\n metadata?: Record<string, unknown>,\n level: LogLevel = \"info\",\n): void {\n const context = currentFeatureTrace();\n if (!context) return;\n createDefaultLogger().record({\n level,\n category: \"application\",\n source,\n event: \"feature.step\",\n trace_id: context.traceId,\n operation: context.feature,\n message: step,\n metadata: { step, ...metadata },\n });\n}\n\nexport function reportFeatureFailure(code: string | undefined, message: string): void {\n const context = currentFeatureTrace();\n if (!context) return;\n context.failure = { ...(code ? { code } : {}), message };\n createDefaultLogger().record({\n level: \"error\",\n category: \"application\",\n source: \"cli\",\n event: \"feature.diagnostic\",\n trace_id: context.traceId,\n operation: context.feature,\n error: { ...(code ? { code } : {}), message },\n });\n}\n\nexport function completeFeatureTrace(exitCode = 0): void {\n const context = currentFeatureTrace();\n if (!context) return;\n const failed = context.failure !== undefined || exitCode !== 0;\n createDefaultLogger().record({\n level: failed ? \"error\" : \"info\",\n category: \"application\",\n source: \"cli\",\n event: failed ? \"feature.failed\" : \"feature.completed\",\n trace_id: context.traceId,\n operation: context.feature,\n ...(context.failure ? { error: context.failure } : {}),\n metadata: {\n feature: context.feature,\n exit_code: exitCode,\n duration_ms: Date.now() - context.startedAt,\n },\n });\n leaveFeatureTrace();\n}\n","import { randomBytes } from \"node:crypto\";\nimport { LogStore } from \"./log_store.js\";\nimport { redactString, redactValue } from \"./redaction.js\";\nimport type { LogEntry, LogInput, LogRecorder } from \"./types.js\";\nimport { currentFeatureTrace } from \"./trace_context.js\";\n\nexport function generateLogId(): string {\n return \"log_\" + randomBytes(8).toString(\"hex\");\n}\n\nexport class Logger implements LogRecorder {\n constructor(private readonly store = new LogStore()) {}\n\n record(input: LogInput): LogEntry | undefined {\n try {\n const entry: LogEntry = {\n schema_version: 1,\n id: generateLogId(),\n timestamp: new Date().toISOString(),\n level: input.level,\n category: input.category ?? \"application\",\n source: input.source,\n event: input.event,\n ...((input.trace_id ?? currentFeatureTrace()?.traceId)\n ? { trace_id: input.trace_id ?? currentFeatureTrace()!.traceId }\n : {}),\n ...((input.feature ?? currentFeatureTrace()?.feature)\n ? { feature: input.feature ?? currentFeatureTrace()!.feature }\n : {}),\n ...(input.message ? { message: redactString(input.message) } : {}),\n ...(input.request_id ? { request_id: input.request_id } : {}),\n ...(input.operation ? { operation: input.operation } : {}),\n ...(input.http ? { http: redactValue(input.http) as LogEntry[\"http\"] } : {}),\n ...(input.error ? { error: redactValue(input.error) as LogEntry[\"error\"] } : {}),\n ...(input.metadata ? { metadata: redactValue(input.metadata) as Record<string, unknown> } : {}),\n };\n this.store.append(entry);\n return entry;\n } catch {\n // Logging is best-effort and must never break the business operation.\n return undefined;\n }\n }\n}\n\nclass NoopLogRecorder implements LogRecorder {\n record(): undefined {\n return undefined;\n }\n}\n\nexport function createDefaultLogger(): LogRecorder {\n return process.env[\"OIIOII_LOG_DISABLED\"] === \"1\"\n ? new NoopLogRecorder()\n : new Logger();\n}\n","import {\n appendFileSync,\n chmodSync,\n existsSync,\n mkdirSync,\n readFileSync,\n renameSync,\n statSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { resolveConfigDir } from \"../config/config_paths.js\";\nimport { withFileLock } from \"../core/file_lock.js\";\nimport type { LogEntry, LogExportFormat, LogExportResult, LogFilter } from \"./types.js\";\n\nexport interface LogStoreOptions {\n configDir?: string;\n maxBytes?: number;\n maxFiles?: number;\n}\n\nfunction matchesFilter(entry: LogEntry, filter: LogFilter): boolean {\n if (filter.level && entry.level !== filter.level) return false;\n if (filter.source && entry.source !== filter.source) return false;\n if (filter.category && entry.category !== filter.category) return false;\n if (filter.traceId && entry.trace_id !== filter.traceId) return false;\n if (filter.feature && entry.feature !== filter.feature) return false;\n if (filter.operation && entry.operation !== filter.operation) return false;\n if (filter.since) {\n const since = Date.parse(filter.since);\n if (Number.isNaN(since) || Date.parse(entry.timestamp) < since) return false;\n }\n return true;\n}\n\nexport class LogStore {\n private readonly logsDir: string;\n private readonly logsPath: string;\n private readonly maxBytes: number;\n private readonly maxFiles: number;\n\n constructor(options: LogStoreOptions = {}) {\n const configDir = options.configDir ?? resolveConfigDir();\n this.logsDir = join(configDir, \"logs\");\n this.logsPath = join(this.logsDir, \"events.jsonl\");\n this.maxBytes = options.maxBytes ?? 5 * 1024 * 1024;\n this.maxFiles = Math.max(1, options.maxFiles ?? 5);\n }\n\n get path(): string {\n return this.logsPath;\n }\n\n append(entry: LogEntry): void {\n this.ensureDir();\n const line = JSON.stringify(entry) + \"\\n\";\n withFileLock(`${this.logsPath}.lock`, () => {\n if (\n existsSync(this.logsPath)\n && statSync(this.logsPath).size > 0\n && statSync(this.logsPath).size + Buffer.byteLength(line) > this.maxBytes\n ) {\n this.rotate();\n }\n appendFileSync(this.logsPath, line, {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n chmodSync(this.logsPath, 0o600);\n });\n }\n\n list(filter: LogFilter = {}): LogEntry[] {\n const entries: LogEntry[] = [];\n for (const path of this.logPathsOldestFirst()) {\n if (!existsSync(path)) continue;\n const lines = readFileSync(path, \"utf-8\").split(\"\\n\");\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const entry = JSON.parse(line) as LogEntry;\n if (entry.schema_version === 1 && matchesFilter(entry, filter)) entries.push(entry);\n } catch {\n // A malformed line must not make the rest of the log unreadable.\n }\n }\n }\n entries.reverse();\n return filter.limit && filter.limit > 0 ? entries.slice(0, filter.limit) : entries;\n }\n\n export(params: {\n output: string;\n format?: LogExportFormat;\n filter?: LogFilter;\n force?: boolean;\n }): LogExportResult {\n const outputPath = resolve(params.output);\n if (existsSync(outputPath) && !params.force) {\n throw new Error(`Export file already exists: ${outputPath}. Use --force to overwrite it.`);\n }\n const format = params.format ?? \"jsonl\";\n const entries = this.list(params.filter).reverse();\n const content = format === \"json\"\n ? JSON.stringify(entries, null, 2) + \"\\n\"\n : entries.map((entry) => JSON.stringify(entry)).join(\"\\n\") + (entries.length > 0 ? \"\\n\" : \"\");\n\n mkdirSync(dirname(outputPath), { recursive: true });\n writeFileSync(outputPath, content, {\n encoding: \"utf-8\",\n mode: 0o600,\n flag: params.force ? \"w\" : \"wx\",\n });\n chmodSync(outputPath, 0o600);\n return {\n path: outputPath,\n format,\n count: entries.length,\n bytes: statSync(outputPath).size,\n };\n }\n\n private ensureDir(): void {\n if (!existsSync(this.logsDir)) mkdirSync(this.logsDir, { recursive: true, mode: 0o700 });\n chmodSync(this.logsDir, 0o700);\n }\n\n private rotatedPath(index: number): string {\n return `${this.logsPath}.${index}`;\n }\n\n private logPathsOldestFirst(): string[] {\n const paths: string[] = [];\n for (let index = this.maxFiles - 1; index >= 1; index--) paths.push(this.rotatedPath(index));\n paths.push(this.logsPath);\n return paths;\n }\n\n private rotate(): void {\n const oldest = this.rotatedPath(this.maxFiles - 1);\n if (this.maxFiles > 1 && existsSync(oldest)) unlinkSync(oldest);\n for (let index = this.maxFiles - 2; index >= 1; index--) {\n const from = this.rotatedPath(index);\n if (existsSync(from)) renameSync(from, this.rotatedPath(index + 1));\n }\n if (this.maxFiles > 1 && existsSync(this.logsPath)) renameSync(this.logsPath, this.rotatedPath(1));\n else if (existsSync(this.logsPath)) unlinkSync(this.logsPath);\n }\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\n/** Resolve the CLI state directory without depending on a concrete store. */\nexport function resolveConfigDir(): string {\n return process.env[\"OIIOII_CONFIG_DIR\"] ?? join(homedir(), \".oiioii\");\n}\n","import { closeSync, fstatSync, openSync, statSync, unlinkSync } from \"node:fs\";\n\nexport interface FileLockOptions {\n timeoutMs?: number;\n staleMs?: number;\n retryMs?: number;\n}\n\nconst sleepArray = new Int32Array(new SharedArrayBuffer(4));\n\nfunction sleepSync(milliseconds: number): void {\n Atomics.wait(sleepArray, 0, 0, milliseconds);\n}\n\n/**\n * Run a small synchronous file mutation under an atomic, cross-process lock.\n * Stale lock files are reclaimed so a killed process cannot block the CLI forever.\n */\nexport function withFileLock<T>(lockPath: string, callback: () => T, options: FileLockOptions = {}): T {\n const timeoutMs = options.timeoutMs ?? 2_000;\n const staleMs = options.staleMs ?? 30_000;\n const retryMs = options.retryMs ?? 10;\n const deadline = Date.now() + timeoutMs;\n let descriptor: number | undefined;\n\n while (descriptor === undefined) {\n try {\n descriptor = openSync(lockPath, \"wx\", 0o600);\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"EEXIST\") throw error;\n\n try {\n if (Date.now() - statSync(lockPath).mtimeMs > staleMs) {\n unlinkSync(lockPath);\n continue;\n }\n } catch (statError) {\n if ((statError as NodeJS.ErrnoException).code === \"ENOENT\") continue;\n throw statError;\n }\n\n if (Date.now() >= deadline) throw new Error(`Timed out waiting for file lock: ${lockPath}`);\n sleepSync(Math.min(retryMs, Math.max(1, deadline - Date.now())));\n }\n }\n\n try {\n return callback();\n } finally {\n const ownedLock = fstatSync(descriptor);\n closeSync(descriptor);\n try {\n const currentLock = statSync(lockPath);\n if (currentLock.dev === ownedLock.dev && currentLock.ino === ownedLock.ino) unlinkSync(lockPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n }\n}\n","const SENSITIVE_KEY = /(?:authorization|api[_-]?key|token|password|secret|credential|cookie)/i;\nconst SENSITIVE_QUERY = /([?&](?:api[_-]?key|token|password|secret)=)[^&\\s]*/gi;\nconst API_KEY_VALUE = /\\boii_sk_[A-Za-z0-9._-]+\\b/g;\nconst BEARER_VALUE = /\\bBearer\\s+[^\\s,;]+/gi;\n\nexport function redactString(value: string): string {\n return value\n .replace(SENSITIVE_QUERY, \"$1[REDACTED]\")\n .replace(API_KEY_VALUE, \"[REDACTED]\")\n .replace(BEARER_VALUE, \"Bearer [REDACTED]\");\n}\n\nfunction redactInternal(value: unknown, seen: WeakSet<object>, depth: number): unknown {\n if (depth > 10) return \"[MAX_DEPTH]\";\n if (typeof value === \"string\") return redactString(value);\n if (value === null || typeof value !== \"object\") return value;\n if (seen.has(value)) return \"[CIRCULAR]\";\n seen.add(value);\n\n if (Array.isArray(value)) {\n return value.map((item) => redactInternal(item, seen, depth + 1));\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n result[key] = SENSITIVE_KEY.test(key)\n ? \"[REDACTED]\"\n : redactInternal(item, seen, depth + 1);\n }\n return result;\n}\n\nexport function redactValue(value: unknown): unknown {\n return redactInternal(value, new WeakSet<object>(), 0);\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport interface FeatureTraceContext {\n traceId: string;\n feature: string;\n startedAt: number;\n failure?: { code?: string; message: string };\n}\n\nconst featureTraceStorage = new AsyncLocalStorage<FeatureTraceContext | undefined>();\n\nexport function enterFeatureTrace(context: FeatureTraceContext): void {\n featureTraceStorage.enterWith(context);\n}\n\nexport function currentFeatureTrace(): FeatureTraceContext | undefined {\n return featureTraceStorage.getStore();\n}\n\nexport function leaveFeatureTrace(): void {\n featureTraceStorage.enterWith(undefined);\n}\n","/**\n * Stable CLI error codes.\n *\n * These codes are part of the public contract for --json output.\n * Agent consumers depend on these being stable across versions.\n */\n\nexport const ErrorCode = {\n // Auth\n AUTH_REQUIRED: \"AUTH_REQUIRED\",\n AUTH_INVALID: \"AUTH_INVALID\",\n AUTH_CAPTCHA_REQUIRED: \"AUTH_CAPTCHA_REQUIRED\",\n AUTH_EMAIL_NOT_CONFIRMED: \"AUTH_EMAIL_NOT_CONFIRMED\",\n API_KEY_INVALID: \"API_KEY_INVALID\",\n MEMBERSHIP_REQUIRED: \"MEMBERSHIP_REQUIRED\",\n\n // Workspace\n WORKSPACE_REQUIRED: \"WORKSPACE_REQUIRED\",\n WORKSPACE_NOT_FOUND: \"WORKSPACE_NOT_FOUND\",\n WORKSPACE_FORBIDDEN: \"WORKSPACE_FORBIDDEN\",\n\n // Validation\n INVALID_ARGUMENT: \"INVALID_ARGUMENT\",\n MODEL_NOT_SUPPORTED: \"MODEL_NOT_SUPPORTED\",\n MODEL_CONSTRAINT_VIOLATION: \"MODEL_CONSTRAINT_VIOLATION\",\n\n // Generation\n GENERATION_FAILED: \"GENERATION_FAILED\",\n GENERATION_TIMEOUT: \"GENERATION_TIMEOUT\",\n PROVIDER_UNAVAILABLE: \"PROVIDER_UNAVAILABLE\",\n\n // Records\n RECORD_NOT_FOUND: \"RECORD_NOT_FOUND\",\n\n // Local tasks\n TASK_NOT_FOUND: \"TASK_NOT_FOUND\",\n TASK_TIMEOUT: \"TASK_TIMEOUT\",\n\n // Quota\n QUOTA_EXCEEDED: \"QUOTA_EXCEEDED\",\n\n // Upload\n PAYLOAD_TOO_LARGE: \"PAYLOAD_TOO_LARGE\",\n CONTENT_SAFETY_BLOCKED: \"CONTENT_SAFETY_BLOCKED\",\n IP_CHARACTER_RESTRICTED: \"IP_CHARACTER_RESTRICTED\",\n\n // Server\n SERVER_ERROR: \"SERVER_ERROR\",\n NETWORK_ERROR: \"NETWORK_ERROR\",\n\n // CLI\n CLI_UPGRADE_REQUIRED: \"CLI_UPGRADE_REQUIRED\",\n CLI_INSTALLATION_UNMANAGED: \"CLI_INSTALLATION_UNMANAGED\",\n CLI_UPDATE_FAILED: \"CLI_UPDATE_FAILED\",\n NOT_IMPLEMENTED: \"NOT_IMPLEMENTED\",\n CONFIG_ERROR: \"CONFIG_ERROR\",\n} as const;\n\nexport type ErrorCodeType = (typeof ErrorCode)[keyof typeof ErrorCode];\n\n/**\n * Typed CLI error with stable error code.\n */\nexport class CliError extends Error {\n constructor(\n public readonly code: ErrorCodeType,\n message: string,\n public readonly details?: unknown,\n ) {\n super(message);\n this.name = \"CliError\";\n }\n}\n\n/** Detect provider content-policy signals across codes and human-readable bodies. */\nexport function isContentSafetySignal(\n backendCode: string | undefined,\n backendMessage: string | undefined,\n): boolean {\n const signal = `${backendCode ?? \"\"} ${backendMessage ?? \"\"}`.toUpperCase();\n return /SAFETY[_\\s-]*BLOCKED|SENSITIVE[_\\s-]*CONTENT|PROMPT[_\\s-]*SENSITIVE|CONTENT[_\\s-]*FILTER|IP[_\\s-]*INFRINGEMENT|IP[_\\s-]*CHARACTER|COPYRIGHT|RESTRICTED[_\\s-]*IP/.test(signal);\n}\n\nexport function contentSafetyError(\n backendCode: string | undefined,\n backendMessage: string | undefined,\n details: Record<string, unknown> = {},\n): CliError {\n const signal = `${backendCode ?? \"\"} ${backendMessage ?? \"\"}`.toUpperCase();\n const isIpRestriction = /IP[_\\s-]*INFRINGEMENT|IP[_\\s-]*CHARACTER|COPYRIGHT|RESTRICTED[_\\s-]*IP/.test(signal);\n const message = isIpRestriction\n ? \"Request blocked because it may contain a restricted IP or character. Revise the character, references, or prompt and retry.\"\n : \"Request blocked by the content safety policy. Revise the prompt or references and retry.\";\n return new CliError(\n isIpRestriction ? ErrorCode.IP_CHARACTER_RESTRICTED : ErrorCode.CONTENT_SAFETY_BLOCKED,\n message,\n {\n ...details,\n ...(backendCode ? { backend_code: backendCode } : {}),\n ...(backendMessage && backendMessage !== message ? { backend_message: backendMessage } : {}),\n category: \"safety\",\n reason_category: isIpRestriction ? \"ip_or_character\" : \"content_policy\",\n retryable: false,\n hint: isIpRestriction\n ? \"Remove or replace the restricted character/IP reference, then retry.\"\n : \"Revise the prompt or media references, then retry.\",\n },\n );\n}\n","import { randomBytes } from \"node:crypto\";\nimport { createDefaultLogger } from \"./logger.js\";\nimport type { LogErrorData, LogRecorder } from \"./types.js\";\n\nexport interface ApiCallContext {\n source: string;\n operation: string;\n method: string;\n path: string;\n metadata?: Record<string, unknown>;\n}\n\nfunction errorData(error: unknown): LogErrorData {\n if (error instanceof Error) {\n const code = \"code\" in error && typeof error.code === \"string\" ? error.code : undefined;\n return { name: error.name, ...(code ? { code } : {}), message: error.message };\n }\n return { message: String(error) };\n}\n\nexport class ApiCallSpan {\n readonly requestId = \"req_\" + randomBytes(8).toString(\"hex\");\n private readonly startedAt = Date.now();\n private completed = false;\n\n constructor(\n private readonly logger: LogRecorder,\n private readonly context: ApiCallContext,\n ) {\n this.logger.record({\n level: \"info\",\n category: \"api\",\n source: context.source,\n event: \"api.request\",\n request_id: this.requestId,\n operation: context.operation,\n http: { method: context.method, path: context.path },\n metadata: context.metadata,\n });\n }\n\n success(status: number, metadata?: Record<string, unknown>): void {\n if (this.completed) return;\n this.completed = true;\n this.logger.record({\n level: \"info\",\n category: \"api\",\n source: this.context.source,\n event: \"api.response\",\n request_id: this.requestId,\n operation: this.context.operation,\n http: {\n method: this.context.method,\n path: this.context.path,\n status,\n duration_ms: Date.now() - this.startedAt,\n },\n metadata,\n });\n }\n\n failure(error: unknown, status?: number): void {\n if (this.completed) return;\n this.completed = true;\n this.logger.record({\n level: \"error\",\n category: \"api\",\n source: this.context.source,\n event: \"api.error\",\n request_id: this.requestId,\n operation: this.context.operation,\n http: {\n method: this.context.method,\n path: this.context.path,\n ...(status !== undefined ? { status } : {}),\n duration_ms: Date.now() - this.startedAt,\n },\n error: errorData(error),\n });\n }\n}\n\nexport function startApiCall(\n context: ApiCallContext,\n logger: LogRecorder = createDefaultLogger(),\n): ApiCallSpan {\n return new ApiCallSpan(logger, context);\n}\n","import { CliError, ErrorCode } from \"../output/errors.js\";\nimport { startApiCall } from \"../logging/api_call_logger.js\";\nimport type { LogRecorder } from \"../logging/types.js\";\n\nexport type WorkspaceLanguage = \"en\" | \"zh\" | \"zh-Hant\" | \"ja\";\n\nexport interface CreateWorkspaceRequest {\n name?: string;\n language?: WorkspaceLanguage;\n}\n\nexport interface CreateWorkspaceResult {\n workspaceId: string;\n name: string;\n}\n\nexport interface HogiWorkspaceClientOptions {\n baseUrl: string;\n apiKey: string;\n fetch?: typeof globalThis.fetch;\n logger?: LogRecorder;\n}\n\ninterface ApiErrorPayload {\n code?: string;\n message?: string;\n details?: unknown;\n}\n\ninterface ApiEnvelope {\n ok?: boolean;\n data?: unknown;\n error?: ApiErrorPayload;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined;\n}\n\nfunction parseEmbeddedObject(value: unknown): Record<string, unknown> | undefined {\n const object = asObject(value);\n if (object) return object;\n if (typeof value !== \"string\") return undefined;\n\n const text = value.trim();\n try {\n return asObject(JSON.parse(text));\n } catch {\n // The current backend tool may prepend a human-readable message before\n // the final JSON object. Scan from the last object boundary backwards.\n }\n\n let index = text.lastIndexOf(\"{\");\n while (index >= 0) {\n try {\n const parsed = asObject(JSON.parse(text.slice(index)));\n if (parsed) return parsed;\n } catch {\n // Try the previous object boundary.\n }\n index = text.lastIndexOf(\"{\", index - 1);\n }\n return undefined;\n}\n\nasync function parseEnvelope(response: Response): Promise<ApiEnvelope> {\n const text = await response.text().catch(() => \"\");\n if (!text.trim()) return {};\n try {\n const parsed = JSON.parse(text) as unknown;\n return (asObject(parsed) as ApiEnvelope | undefined) ?? {};\n } catch {\n throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid JSON response from workspace API\", { status: response.status });\n }\n}\n\nfunction mapWorkspaceError(status: number, envelope: ApiEnvelope): CliError {\n const backendCode = envelope.error?.code;\n const message = envelope.error?.message ?? `Workspace creation failed: HTTP ${status}`;\n const details = { status, ...(backendCode ? { code: backendCode } : {}) };\n if (status === 401) return new CliError(ErrorCode.API_KEY_INVALID, message, details);\n if (status === 403) return new CliError(ErrorCode.WORKSPACE_FORBIDDEN, message, details);\n if (status === 400 || status === 422) return new CliError(ErrorCode.INVALID_ARGUMENT, message, details);\n if (status === 429) return new CliError(ErrorCode.QUOTA_EXCEEDED, message, details);\n return new CliError(ErrorCode.SERVER_ERROR, message, details);\n}\n\nfunction parseCreateResult(envelope: ApiEnvelope): CreateWorkspaceResult {\n if (envelope.ok === false) throw mapWorkspaceError(400, envelope);\n const data = parseEmbeddedObject(envelope.data);\n const workspaceId = data?.workspaceId;\n const name = data?.name;\n if (typeof workspaceId !== \"string\" || !workspaceId.trim()) {\n throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid workspace API response: missing workspaceId\");\n }\n if (typeof name !== \"string\" || !name.trim()) {\n throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid workspace API response: missing name\");\n }\n return { workspaceId, name };\n}\n\nexport class HogiWorkspaceClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly _fetch: typeof globalThis.fetch;\n private readonly logger?: LogRecorder;\n\n constructor(options: HogiWorkspaceClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = options.apiKey;\n this._fetch = options.fetch ?? globalThis.fetch;\n this.logger = options.logger;\n }\n\n async createWorkspace(request: CreateWorkspaceRequest): Promise<CreateWorkspaceResult> {\n const apiLog = startApiCall({\n source: \"hogi_workspace_client\",\n operation: \"workspace.create\",\n method: \"POST\",\n path: \"/v1/workspace/create\",\n metadata: { language: request.language ?? null, has_name: request.name !== undefined },\n }, this.logger);\n\n let response: Response;\n try {\n response = await this._fetch(`${this.baseUrl}/v1/workspace/create`, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${this.apiKey}`,\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n },\n body: JSON.stringify({\n ...(request.name !== undefined ? { name: request.name } : {}),\n ...(request.language !== undefined ? { language: request.language } : {}),\n }),\n });\n } catch (error) {\n const networkError = new CliError(\n ErrorCode.NETWORK_ERROR,\n `Network error: ${error instanceof Error ? error.message : String(error)}`,\n );\n apiLog.failure(networkError);\n throw networkError;\n }\n\n try {\n const envelope = await parseEnvelope(response);\n if (!response.ok) throw mapWorkspaceError(response.status, envelope);\n const result = parseCreateResult(envelope);\n apiLog.success(response.status, { workspace_id: result.workspaceId });\n return result;\n } catch (error) {\n apiLog.failure(error, response.status);\n throw error;\n }\n }\n}\n","import type { Command } from \"commander\";\nimport type { FileConfigStore } from \"../config/config_store.js\";\nimport { CliError, ErrorCode } from \"../output/errors.js\";\n\nexport type RootOptions = Record<string, unknown>;\n\nexport function getRootOptions(command: Command): RootOptions {\n let root = command;\n while (root.parent) root = root.parent;\n return root.opts();\n}\n\nexport function isJsonOutput(command: Command): boolean {\n return getRootOptions(command).json === true;\n}\n\nexport function requireApiKeyAuth(\n rootOptions: RootOptions,\n configStore: FileConfigStore,\n): { apiKey: string; baseUrl: string } {\n const config = configStore.loadResolved();\n const apiKey = config.apiKey?.trim();\n if (!apiKey) {\n throw new CliError(\n ErrorCode.AUTH_REQUIRED,\n \"No API key configured. Run 'oiioii auth login --api-key <key>' before running authenticated commands.\",\n );\n }\n\n const baseUrlOption = rootOptions.baseUrl;\n const baseUrl = typeof baseUrlOption === \"string\" && baseUrlOption\n ? baseUrlOption\n : config.baseUrl;\n return { apiKey, baseUrl };\n}\n","export type BusinessDomain =\n | \"auth\"\n | \"workspace\"\n | \"generation\"\n | \"upload\"\n | \"task\"\n | \"record\"\n | \"inspect\"\n | \"preview\"\n | \"logs\"\n | \"points\"\n | \"cli\";\n\nexport interface BusinessCommandDefinition {\n domain: BusinessDomain;\n action: string;\n calledEvent: string;\n resultEvent: string;\n}\n\nconst DOMAIN_EVENTS: Record<BusinessDomain, { called: string; result: string }> = {\n auth: { called: \"cli_biz_auth_called\", result: \"cli_biz_auth_result\" },\n workspace: { called: \"cli_biz_workspace_called\", result: \"cli_biz_workspace_result\" },\n generation: { called: \"cli_biz_generation_called\", result: \"cli_biz_generation_result\" },\n upload: { called: \"cli_biz_upload_called\", result: \"cli_biz_upload_result\" },\n task: { called: \"cli_biz_task_called\", result: \"cli_biz_task_result\" },\n record: { called: \"cli_biz_record_called\", result: \"cli_biz_record_result\" },\n inspect: { called: \"cli_biz_inspect_called\", result: \"cli_biz_inspect_result\" },\n preview: { called: \"cli_biz_preview_called\", result: \"cli_biz_preview_result\" },\n logs: { called: \"cli_biz_logs_called\", result: \"cli_biz_logs_result\" },\n points: { called: \"cli_biz_points_called\", result: \"cli_biz_points_result\" },\n cli: { called: \"cli_biz_cli_called\", result: \"cli_biz_cli_result\" },\n};\n\nfunction definition(domain: BusinessDomain, action: string): BusinessCommandDefinition {\n return {\n domain,\n action,\n calledEvent: DOMAIN_EVENTS[domain].called,\n resultEvent: DOMAIN_EVENTS[domain].result,\n };\n}\n\n/** Every executable CLI feature must be registered here. */\nexport const BUSINESS_COMMAND_REGISTRY = {\n \"auth.login\": definition(\"auth\", \"login\"),\n \"workspace.create\": definition(\"workspace\", \"create\"),\n \"workspace.set\": definition(\"workspace\", \"set\"),\n \"workspace.current\": definition(\"workspace\", \"current\"),\n \"image.text\": definition(\"generation\", \"image_text\"),\n \"image.edit\": definition(\"generation\", \"image_edit\"),\n \"video.text\": definition(\"generation\", \"video_text\"),\n \"video.image\": definition(\"generation\", \"video_image\"),\n \"video.generate\": definition(\"generation\", \"video_generate\"),\n \"audio.generate\": definition(\"generation\", \"audio_generate\"),\n \"audio.seed-audio\": definition(\"generation\", \"audio_seed_audio\"),\n \"audio.suno\": definition(\"generation\", \"audio_suno\"),\n \"upload.file\": definition(\"upload\", \"file\"),\n \"task.list\": definition(\"task\", \"list\"),\n \"task.status\": definition(\"task\", \"status\"),\n \"task.wait\": definition(\"task\", \"wait\"),\n \"record.get\": definition(\"record\", \"get\"),\n \"record.open\": definition(\"record\", \"open\"),\n \"inspect.capabilities\": definition(\"inspect\", \"capabilities\"),\n \"inspect.models\": definition(\"inspect\", \"models\"),\n \"preview.latest\": definition(\"preview\", \"latest\"),\n \"preview.bundle\": definition(\"preview\", \"bundle\"),\n \"logs.list\": definition(\"logs\", \"list\"),\n \"logs.export\": definition(\"logs\", \"export\"),\n \"logs.path\": definition(\"logs\", \"path\"),\n \"points.balance\": definition(\"points\", \"balance\"),\n \"points.cost\": definition(\"points\", \"cost\"),\n \"points.quote\": definition(\"points\", \"quote\"),\n update: definition(\"cli\", \"update\"),\n install: definition(\"cli\", \"install\"),\n versions: definition(\"cli\", \"versions\"),\n} as const satisfies Record<string, BusinessCommandDefinition>;\n\nexport type RegisteredBusinessCommand = keyof typeof BUSINESS_COMMAND_REGISTRY;\n\nexport function getBusinessCommandDefinition(command: string): BusinessCommandDefinition | undefined {\n return (BUSINESS_COMMAND_REGISTRY as Record<string, BusinessCommandDefinition>)[command];\n}\n","import { randomBytes } from \"node:crypto\";\nimport { CLI_VERSION } from \"../app/version.js\";\nimport { getBuildEnvironment } from \"../config/build_environment.js\";\nimport { getBusinessCommandDefinition } from \"./event_registry.js\";\nimport {\n currentTelemetryContext,\n enterTelemetryContext,\n leaveTelemetryContext,\n} from \"./telemetry_context.js\";\nimport { sanitizeTelemetryParams } from \"./sanitization.js\";\nimport { VolcTelemetryTransport } from \"./transports/volc_transport.js\";\nimport type {\n TelemetryCommandContext,\n TelemetryCommonParams,\n TelemetryParams,\n TelemetryResult,\n TelemetryStaticCommonParams,\n TelemetryTransport,\n} from \"./types.js\";\n\nexport interface StartTelemetryCommandInput {\n command: string;\n userId?: string;\n workspaceId?: string;\n traceId?: string;\n}\n\nexport interface TelemetryManagerOptions {\n transport?: TelemetryTransport;\n now?: () => number;\n operationId?: () => string;\n commonParams?: () => TelemetryStaticCommonParams;\n}\n\nfunction defaultCommonParams(): TelemetryStaticCommonParams {\n const environment = getBuildEnvironment();\n const nodeMajor = Number.parseInt(process.versions.node.split(\".\")[0] ?? \"0\", 10);\n return {\n schema_version: 1,\n app_env: environment === \"local\" ? \"dev\" : environment === \"production\" ? \"prod\" : \"hoe\",\n app_name: \"oiioii_cli\",\n cli_version: CLI_VERSION,\n os: process.platform,\n arch: process.arch,\n node_major: Number.isFinite(nodeMajor) ? nodeMajor : 0,\n };\n}\n\nfunction defaultOperationId(): string {\n return `op_${randomBytes(8).toString(\"hex\")}`;\n}\n\nfunction resultFor(context: TelemetryCommandContext, exitCode: number): TelemetryResult {\n if (context.resultOverride === \"partial_success\" && exitCode === 0 && !context.failureCode) {\n return \"partial_success\";\n }\n if (context.failureCode?.endsWith(\"TIMEOUT\")) return \"timeout\";\n return exitCode !== 0 || context.failureCode ? \"failure\" : \"success\";\n}\n\nexport class TelemetryManager {\n private readonly transport: TelemetryTransport;\n private readonly now: () => number;\n private readonly operationId: () => string;\n private readonly commonParams: NonNullable<TelemetryManagerOptions[\"commonParams\"]>;\n\n constructor(options: TelemetryManagerOptions = {}) {\n this.transport = options.transport ?? new VolcTelemetryTransport();\n this.now = options.now ?? Date.now;\n this.operationId = options.operationId ?? defaultOperationId;\n this.commonParams = options.commonParams ?? defaultCommonParams;\n }\n\n startCommand(input: StartTelemetryCommandInput): void {\n const command = input.command.trim();\n if (!command) return;\n const definition = getBusinessCommandDefinition(command);\n const context: TelemetryCommandContext = {\n command,\n startedAt: this.now(),\n operationId: this.operationId(),\n calledSent: false,\n businessParams: {},\n ...(definition ? {\n calledEvent: definition.calledEvent,\n resultEvent: definition.resultEvent,\n action: definition.action,\n } : {}),\n ...(input.userId?.trim() ? { userId: input.userId.trim() } : {}),\n ...(input.workspaceId?.trim() ? { workspaceId: input.workspaceId.trim() } : {}),\n ...(input.traceId?.trim() ? { traceId: input.traceId.trim() } : {}),\n };\n enterTelemetryContext(context);\n this.emitCalled();\n }\n\n identify(userId: string): void {\n const context = currentTelemetryContext();\n const normalizedUserId = userId.trim();\n if (!context || !normalizedUserId) return;\n context.userId = normalizedUserId;\n this.emitCalled();\n }\n\n addBusinessInfo(params: TelemetryParams): void {\n const context = currentTelemetryContext();\n if (!context) return;\n Object.assign(context.businessParams, sanitizeTelemetryParams(params));\n }\n\n markPartialSuccess(): void {\n const context = currentTelemetryContext();\n if (context) context.resultOverride = \"partial_success\";\n }\n\n setWorkspaceId(workspaceId: string): void {\n const context = currentTelemetryContext();\n const normalizedWorkspaceId = workspaceId.trim();\n if (context && normalizedWorkspaceId) context.workspaceId = normalizedWorkspaceId;\n }\n\n reportCommandFailure(errorCode?: string): void {\n const context = currentTelemetryContext();\n if (context && errorCode) context.failureCode = errorCode;\n }\n\n completeCommand(exitCode = 0): void {\n const context = currentTelemetryContext();\n if (!context) return;\n this.emitCalled();\n const result = resultFor(context, exitCode);\n if (context.userId && context.resultEvent && context.action) {\n this.emit(context.resultEvent, {\n ...context.businessParams,\n operation_id: context.operationId,\n action: context.action,\n result,\n duration_ms: Math.max(0, this.now() - context.startedAt),\n ...(context.failureCode ? { error_code: context.failureCode } : {}),\n });\n }\n leaveTelemetryContext();\n }\n\n async flush(timeoutMs?: number): Promise<void> {\n await this.transport.flush(timeoutMs);\n }\n\n private emitCalled(): void {\n const context = currentTelemetryContext();\n if (!context?.userId || !context.calledEvent || !context.action || context.calledSent) return;\n context.calledSent = true;\n this.emit(context.calledEvent, {\n operation_id: context.operationId,\n action: context.action,\n });\n }\n\n private emit(event: string, params: TelemetryParams): void {\n const context = currentTelemetryContext();\n if (!context?.userId) return;\n const common: TelemetryCommonParams = {\n ...this.commonParams(),\n command: context.command,\n ...(context.traceId ? { trace_id: context.traceId } : {}),\n ...(context.workspaceId ? { workspace_id: context.workspaceId } : {}),\n };\n this.transport.send({\n userId: context.userId,\n event,\n params: sanitizeTelemetryParams({ ...params, ...common }),\n });\n }\n}\n\nlet defaultManager: TelemetryManager | undefined;\n\nexport function getDefaultTelemetryManager(): TelemetryManager {\n defaultManager ??= new TelemetryManager();\n return defaultManager;\n}\n","declare const __OIIOII_CLI_VERSION__: string | undefined;\ndeclare const __OIIOII_NPM_PACKAGE_NAME__: string | undefined;\n\nexport const CLI_VERSION = typeof __OIIOII_CLI_VERSION__ === \"string\"\n ? __OIIOII_CLI_VERSION__\n : process.env[\"OIIOII_CLI_VERSION\"] ?? \"0.1.0\";\n\nexport const CLI_NPM_PACKAGE_NAME = typeof __OIIOII_NPM_PACKAGE_NAME__ === \"string\"\n ? __OIIOII_NPM_PACKAGE_NAME__\n : process.env[\"OIIOII_NPM_PACKAGE_NAME\"] ?? \"@oiioii/cli\";\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { TelemetryCommandContext } from \"./types.js\";\n\nconst telemetryContextStorage = new AsyncLocalStorage<TelemetryCommandContext | undefined>();\n\nexport function enterTelemetryContext(context: TelemetryCommandContext): void {\n telemetryContextStorage.enterWith(context);\n}\n\nexport function currentTelemetryContext(): TelemetryCommandContext | undefined {\n return telemetryContextStorage.getStore();\n}\n\nexport function leaveTelemetryContext(): void {\n telemetryContextStorage.enterWith(undefined);\n}\n","import { redactString } from \"../logging/redaction.js\";\nimport type { TelemetryParams, TelemetryValue } from \"./types.js\";\n\nconst FORBIDDEN_PARAM_KEY = /(?:authorization|api[_-]?key|token|password|secret|credential|cookie|prompt|file[_-]?path|request[_-]?body|response[_-]?body)/i;\nconst MAX_STRING_LENGTH = 256;\n\nexport function sanitizeTelemetryParams(params: TelemetryParams): Record<string, TelemetryValue> {\n const sanitized: Record<string, TelemetryValue> = {};\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || FORBIDDEN_PARAM_KEY.test(key)) continue;\n sanitized[key] = typeof value === \"string\"\n ? redactString(value).slice(0, MAX_STRING_LENGTH)\n : value;\n }\n return sanitized;\n}\n","import { DataRangersSDK } from \"@datarangers/sdk-node\";\nimport { httpPlugin, type HttpController } from \"@datarangers/node-plugin-http\";\nimport { createDefaultLogger } from \"../../logging/logger.js\";\nimport type { LogRecorder } from \"../../logging/types.js\";\nimport type { TelemetryTransport, TelemetryTransportEvent } from \"../types.js\";\n\nconst DEFAULT_APP_ID = 20011588;\nconst DEFAULT_CHANNEL_DOMAIN = \"https://gator.volces.com\";\nconst DEFAULT_FLUSH_TIMEOUT_MS = 1_000;\n\ninterface DataRangersClient {\n use(plugin: HttpController): void;\n collect(\n event: string,\n params: Record<string, unknown>,\n overridden: { user: { user_unique_id: string } },\n ): void;\n}\n\ninterface DeliveryPayload {\n hasSucceed?: boolean;\n}\n\nexport interface VolcTelemetryTransportOptions {\n appId?: number;\n channelDomain?: string;\n disabled?: boolean;\n sdk?: DataRangersClient;\n httpController?: HttpController;\n logger?: LogRecorder;\n}\n\nexport class VolcTelemetryTransport implements TelemetryTransport {\n private readonly disabled: boolean;\n private readonly sdk?: DataRangersClient;\n private readonly httpController?: HttpController;\n private readonly logger: LogRecorder;\n private readonly pendingEventNames: string[] = [];\n private pendingEvents = 0;\n\n constructor(options: VolcTelemetryTransportOptions = {}) {\n this.disabled = options.disabled ?? process.env[\"OIIOII_TELEMETRY_DISABLED\"] === \"1\";\n this.logger = options.logger ?? createDefaultLogger();\n if (this.disabled) return;\n\n try {\n const sdk = options.sdk ?? new DataRangersSDK({\n app_id: options.appId ?? DEFAULT_APP_ID,\n logLevel: \"silent\",\n });\n const controller = options.httpController ?? httpPlugin({\n channel_domain: options.channelDomain ?? DEFAULT_CHANNEL_DOMAIN,\n retry: 0,\n timeout: { request: DEFAULT_FLUSH_TIMEOUT_MS },\n });\n\n sdk.use(controller);\n controller.on(\"end\", (payload: DeliveryPayload) => {\n this.pendingEvents = Math.max(0, this.pendingEvents - 1);\n const eventName = this.pendingEventNames.shift() ?? \"unknown\";\n const succeeded = payload.hasSucceed === true;\n this.logger.record({\n level: succeeded ? \"debug\" : \"warn\",\n category: \"application\",\n source: \"telemetry\",\n event: succeeded ? \"telemetry.delivery.completed\" : \"telemetry.delivery.failed\",\n metadata: { event_name: eventName },\n });\n });\n\n this.sdk = sdk;\n this.httpController = controller;\n } catch (error) {\n this.recordFailure(\"telemetry.initialization.failed\", error);\n }\n }\n\n send(input: TelemetryTransportEvent): void {\n if (this.disabled || !this.sdk || !input.userId.trim()) return;\n\n try {\n this.pendingEvents += 1;\n this.pendingEventNames.push(input.event);\n this.sdk.collect(input.event, { ...input.params }, {\n user: { user_unique_id: input.userId },\n });\n } catch (error) {\n this.pendingEvents = Math.max(0, this.pendingEvents - 1);\n this.pendingEventNames.pop();\n this.recordFailure(\"telemetry.delivery.failed\", error, input.event);\n }\n }\n\n async flush(timeoutMs = DEFAULT_FLUSH_TIMEOUT_MS): Promise<void> {\n if (!this.httpController || this.pendingEvents === 0) return;\n const controller = this.httpController;\n\n await new Promise<void>((resolve) => {\n let settled = false;\n const finish = (timedOut: boolean): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n controller.removeListener(\"drain\", onDrain);\n if (timedOut && this.pendingEvents > 0) {\n this.logger.record({\n level: \"warn\",\n category: \"application\",\n source: \"telemetry\",\n event: \"telemetry.flush.timeout\",\n metadata: { pending_count: this.pendingEvents },\n });\n }\n resolve();\n };\n const onDrain = (): void => finish(false);\n const timer = setTimeout(() => finish(true), Math.max(0, timeoutMs));\n controller.once(\"drain\", onDrain);\n });\n }\n\n private recordFailure(event: string, error: unknown, eventName?: string): void {\n const code = error && typeof error === \"object\" && \"code\" in error && typeof error.code === \"string\"\n ? error.code\n : undefined;\n this.logger.record({\n level: \"warn\",\n category: \"application\",\n source: \"telemetry\",\n event,\n ...(code ? { error: { code, message: \"Telemetry SDK failure\" } } : {}),\n ...(eventName ? { metadata: { event_name: eventName } } : {}),\n });\n }\n}\n","import { getDefaultTelemetryManager } from \"./telemetry_manager.js\";\nimport type { TelemetryParams } from \"./types.js\";\n\n/** Add safe business fields to the current command's result event. */\nexport function recordTelemetryBusinessInfo(params: TelemetryParams): void {\n getDefaultTelemetryManager().addBusinessInfo(params);\n}\n\n/** Mark a successful core operation whose non-core follow-up partially failed. */\nexport function markTelemetryPartialSuccess(): void {\n getDefaultTelemetryManager().markPartialSuccess();\n}\n\n/** Replace the workspace context after create/set operations. */\nexport function setTelemetryWorkspaceId(workspaceId: string): void {\n getDefaultTelemetryManager().setWorkspaceId(workspaceId);\n}\n","export function telemetrySizeBucket(bytes: number): string {\n if (bytes < 10 * 1024 * 1024) return \"0_10mb\";\n if (bytes < 100 * 1024 * 1024) return \"10_100mb\";\n if (bytes < 500 * 1024 * 1024) return \"100_500mb\";\n return \"500mb_plus\";\n}\n\nexport function telemetryResourceType(uri: string): \"audio\" | \"image\" | \"video\" | \"other\" {\n if (uri.startsWith(\"hogi://audio/\")) return \"audio\";\n if (uri.startsWith(\"hogi://image/\")) return \"image\";\n if (uri.startsWith(\"hogi://video/\")) return \"video\";\n return \"other\";\n}\n","/**\n * Hogi MCP HTTP client for external GenAI tool calls.\n *\n * Uses the backend stateless MCP endpoint:\n * POST /mcp/<serverName>/sse\n * with x-hogi-api-key auth and JSON-RPC tools/call payloads.\n */\n\nimport { Agent } from \"undici\";\nimport { CliError, ErrorCode, contentSafetyError, isContentSafetySignal } from \"../output/errors.js\";\nimport { startApiCall } from \"../logging/api_call_logger.js\";\nimport type { LogRecorder } from \"../logging/types.js\";\nimport { CLI_VERSION } from \"../app/version.js\";\n\nexport interface HogiMcpClientOptions {\n baseUrl: string;\n apiKey: string;\n fetch?: typeof globalThis.fetch;\n timeoutMs?: number;\n logger?: LogRecorder;\n}\n\nexport interface CallToolOptions {\n serverName?: string;\n}\n\nexport interface McpTextContent {\n type: \"text\";\n text: string;\n}\n\nexport interface McpResourceContent {\n type: \"resource\";\n resource: {\n uri: string;\n mimeType?: string;\n mime_type?: string;\n [key: string]: unknown;\n };\n}\n\nexport type McpContent = McpTextContent | McpResourceContent | Record<string, unknown>;\n\nexport interface McpCallToolResult {\n content?: McpContent[];\n isError?: boolean;\n [key: string]: unknown;\n}\n\n/** Convert a structured MCP tool failure into the CLI's stable error contract. */\nexport function errorFromMcpToolResult(result: McpCallToolResult, fallback: string): CliError {\n const backendCode = typeof result.errorCode === \"string\" ? result.errorCode : undefined;\n const text = (result.content ?? [])\n .filter((item): item is McpTextContent => item?.type === \"text\" && typeof (item as McpTextContent).text === \"string\")\n .map((item) => item.text.trim())\n .filter(Boolean)\n .join(\"\\n\");\n const message = text || fallback;\n const structuredContent = result.structuredContent && typeof result.structuredContent === \"object\"\n ? result.structuredContent as Record<string, unknown>\n : undefined;\n const safetyMessage = structuredContent\n ? `${message} ${JSON.stringify(structuredContent)}`\n : message;\n const details = {\n ...(backendCode ? { backend_code: backendCode } : {}),\n ...(structuredContent ? { structured_content: structuredContent } : {}),\n };\n if (backendCode && (backendCode.includes(\"POINTS_INSUFFICIENT\") || backendCode.includes(\"POINTS_LIMIT_EXCEEDED\"))) {\n return new CliError(ErrorCode.QUOTA_EXCEEDED, message, { ...details, category: \"quota\", retryable: false });\n }\n if (isContentSafetySignal(backendCode, safetyMessage)) {\n return contentSafetyError(backendCode, safetyMessage, details);\n }\n if (backendCode?.includes(\"MEMBER_ONLY\")) {\n return new CliError(ErrorCode.MEMBERSHIP_REQUIRED, message, { ...details, category: \"auth\", retryable: false });\n }\n if (backendCode?.includes(\"TASK_NOT_FOUND\")) {\n return new CliError(ErrorCode.TASK_NOT_FOUND, message, { ...details, category: \"task\", retryable: false });\n }\n if (backendCode?.includes(\"TIMEOUT\")) {\n return new CliError(ErrorCode.GENERATION_TIMEOUT, message, { ...details, category: \"timeout\", retryable: true });\n }\n if (backendCode && (backendCode.includes(\"INVALID_PARAMS\") || backendCode.includes(\"RESOLUTION_NOT_SUPPORTED\"))) {\n return new CliError(ErrorCode.MODEL_CONSTRAINT_VIOLATION, message, { ...details, category: \"validation\", retryable: false });\n }\n if (backendCode && (backendCode.includes(\"MODEL_SERVICE_ERROR\") || backendCode.includes(\"CAPACITY_UNAVAILABLE\"))) {\n return new CliError(ErrorCode.PROVIDER_UNAVAILABLE, message, { ...details, category: \"provider\", retryable: true });\n }\n return new CliError(\n ErrorCode.GENERATION_FAILED,\n message,\n Object.keys(details).length ? { ...details, category: \"provider\", retryable: false } : undefined,\n );\n}\n\ninterface JsonRpcResponse {\n jsonrpc?: string;\n id?: number | string | null;\n result?: unknown;\n error?: {\n code?: number | string;\n message?: string;\n data?: unknown;\n };\n}\n\nfunction errorFromJsonRpc(error: NonNullable<JsonRpcResponse[\"error\"]>): CliError {\n const message = error.message ?? \"MCP tool call failed\";\n if (/\\btool\\b.*\\bnot found\\b/i.test(message)) {\n return new CliError(ErrorCode.SERVER_ERROR, message, {\n ...error,\n category: \"server_capability\",\n retryable: false,\n hint: \"Deploy a backend version that exposes the required MCP tool before retrying.\",\n });\n }\n const details = { ...error, category: \"validation\", retryable: false };\n if (Number(error.code) === -32602) {\n return new CliError(ErrorCode.MODEL_CONSTRAINT_VIOLATION, message, details);\n }\n if (Number(error.code) === -32601) {\n return new CliError(ErrorCode.MODEL_NOT_SUPPORTED, message, details);\n }\n return new CliError(ErrorCode.GENERATION_FAILED, message, error);\n}\n\nlet nextJsonRpcId = 1;\n\nasync function errorForHttpResponse(response: Response): Promise<CliError> {\n const text = await response.text().catch(() => \"\");\n let payload: Record<string, unknown> | undefined;\n try {\n const parsed = text ? JSON.parse(text) as unknown : undefined;\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) payload = parsed as Record<string, unknown>;\n } catch {\n // Non-JSON provider bodies still fall back to the stable HTTP contract.\n }\n const nestedError = payload?.error && typeof payload.error === \"object\"\n ? payload.error as Record<string, unknown>\n : undefined;\n const nestedErrorData = nestedError?.data && typeof nestedError.data === \"object\"\n ? nestedError.data as Record<string, unknown>\n : undefined;\n const backendCode = [payload?.code, payload?.errorCode, nestedError?.code, nestedErrorData?.code]\n .find((value): value is string => typeof value === \"string\");\n const backendMessage = [payload?.message, nestedError?.message, typeof payload?.error === \"string\" ? payload.error : undefined]\n .find((value): value is string => typeof value === \"string\" && value.trim().length > 0)\n ?? (text.trim() ? text.trim() : undefined);\n const details = {\n status: response.status,\n ...(backendCode ? { backend_code: backendCode } : {}),\n };\n if (isContentSafetySignal(backendCode, backendMessage)) {\n return contentSafetyError(backendCode, backendMessage, details);\n }\n if (response.status === 401) return new CliError(ErrorCode.API_KEY_INVALID, backendMessage ?? \"Invalid API key\", details);\n if (response.status === 426 || backendCode === \"CLI_UPGRADE_REQUIRED\") {\n return new CliError(ErrorCode.CLI_UPGRADE_REQUIRED, backendMessage ?? \"Upgrade oiioii CLI and retry.\", {\n ...details,\n category: \"client_version\",\n retryable: false,\n });\n }\n if (response.status === 403 && backendCode === \"MEMBERSHIP_REQUIRED\") {\n return new CliError(ErrorCode.MEMBERSHIP_REQUIRED, backendMessage ?? \"An active membership is required.\", {\n ...details,\n category: \"auth\",\n retryable: false,\n });\n }\n if (response.status === 429) return new CliError(ErrorCode.QUOTA_EXCEEDED, backendMessage ?? \"Rate limit exceeded\", details);\n if (backendCode && /INVALID_PARAMS|RESOLUTION_NOT_SUPPORTED|DURATION_NOT_SUPPORTED/.test(backendCode)) {\n return new CliError(ErrorCode.MODEL_CONSTRAINT_VIOLATION, backendMessage ?? \"The generation request violates model constraints.\", {\n ...details,\n category: \"validation\",\n retryable: false,\n });\n }\n if (response.status >= 500) return new CliError(ErrorCode.SERVER_ERROR, backendMessage ?? `Server error: ${response.statusText || response.status}`, details);\n return new CliError(ErrorCode.GENERATION_FAILED, backendMessage ?? `Request failed: ${response.statusText || response.status}`, details);\n}\n\nfunction parseSseJson(text: string): unknown {\n const dataLines: string[] = [];\n for (const line of text.split(/\\r?\\n/)) {\n if (line.startsWith(\"data:\")) {\n dataLines.push(line.slice(\"data:\".length).trimStart());\n }\n }\n\n if (dataLines.length === 0) {\n throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid SSE response from server\");\n }\n\n try {\n return JSON.parse(dataLines.join(\"\\n\")) as unknown;\n } catch {\n throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid JSON in SSE response from server\");\n }\n}\n\nasync function parseJsonOrSseResponse(response: Response): Promise<unknown> {\n const text = await response.text();\n const trimmed = text.trim();\n if (!trimmed) {\n throw new CliError(ErrorCode.SERVER_ERROR, \"Empty response from server\", { status: response.status });\n }\n\n if (trimmed.startsWith(\"event:\") || trimmed.startsWith(\"data:\")) {\n return parseSseJson(trimmed);\n }\n\n try {\n return JSON.parse(trimmed) as unknown;\n } catch {\n throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid JSON response from server\", { status: response.status });\n }\n}\n\nfunction asJsonRpcResponse(payload: unknown): JsonRpcResponse {\n if (!payload || typeof payload !== \"object\") {\n throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid MCP response from server\");\n }\n return payload as JsonRpcResponse;\n}\n\nexport class HogiMcpClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeoutMs: number;\n private readonly _fetch: typeof globalThis.fetch;\n private readonly logger?: LogRecorder;\n\n constructor(options: HogiMcpClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = options.apiKey;\n this.timeoutMs = options.timeoutMs ?? 300_000;\n this._fetch = options.fetch ?? globalThis.fetch;\n this.logger = options.logger;\n }\n\n async callTool(\n toolName: string,\n args: Record<string, unknown>,\n options: CallToolOptions = {},\n ): Promise<McpCallToolResult> {\n const serverName = options.serverName ?? \"genai\";\n const result = await this.requestJsonRpc(\n serverName,\n \"tools/call\",\n {\n name: toolName,\n arguments: args,\n },\n `mcp.${serverName}.${toolName}`,\n { tool_name: toolName },\n );\n if (!result || typeof result !== \"object\") {\n throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid MCP tool result from server\");\n }\n return result as McpCallToolResult;\n }\n\n private async requestJsonRpc(\n serverName: string,\n method: \"tools/call\",\n params: Record<string, unknown>,\n operation: string,\n metadata?: Record<string, unknown>,\n ): Promise<unknown> {\n const apiLog = startApiCall({\n source: \"hogi_mcp_client\",\n operation,\n method: \"POST\",\n path: `/mcp/${serverName}/sse`,\n ...(metadata ? { metadata } : {}),\n }, this.logger);\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n if (typeof timer === \"object\" && \"unref\" in timer) {\n (timer as NodeJS.Timeout).unref();\n }\n\n let response: Response;\n try {\n response = await this._fetch(`${this.baseUrl}/mcp/${serverName}/sse`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"accept\": \"application/json, text/event-stream\",\n \"x-hogi-api-key\": this.apiKey,\n \"x-oiioii-cli-version\": CLI_VERSION,\n },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: nextJsonRpcId++,\n method,\n params,\n }),\n // Node's built-in fetch uses undici, whose default headers/body timeouts are 300s.\n // Long-running video MCP calls intentionally wait up to timeoutMs, so keep undici\n // aligned with the CLI AbortController timeout instead of failing early at 300s.\n dispatcher: new Agent({\n headersTimeout: this.timeoutMs,\n bodyTimeout: this.timeoutMs,\n }),\n signal: controller.signal,\n } as RequestInit & { dispatcher: Agent });\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n const timeoutError = new CliError(ErrorCode.GENERATION_TIMEOUT, `Request timed out after ${this.timeoutMs}ms`);\n apiLog.failure(timeoutError);\n throw timeoutError;\n }\n const message = error instanceof Error ? error.message : String(error);\n const networkError = new CliError(ErrorCode.NETWORK_ERROR, `Network error: ${message}`);\n apiLog.failure(networkError);\n throw networkError;\n } finally {\n clearTimeout(timer);\n }\n\n if (!response.ok) {\n const httpError = await errorForHttpResponse(response);\n apiLog.failure(httpError, response.status);\n throw httpError;\n }\n\n try {\n const jsonRpc = asJsonRpcResponse(await parseJsonOrSseResponse(response));\n if (jsonRpc.error) {\n throw errorFromJsonRpc(jsonRpc.error);\n }\n if (jsonRpc.result === undefined) {\n throw new CliError(ErrorCode.SERVER_ERROR, \"Missing MCP result from server\");\n }\n apiLog.success(response.status);\n return jsonRpc.result;\n } catch (error) {\n apiLog.failure(error, response.status);\n throw error;\n }\n }\n}\n","import { HogiMcpClient, errorFromMcpToolResult, type McpCallToolResult } from \"./hogi_mcp_client.js\";\nimport { CliError, ErrorCode } from \"../output/errors.js\";\nimport type { LogRecorder } from \"../logging/types.js\";\n\nexport interface UserPointsInfo {\n userId?: string;\n points: number;\n tier: string;\n description?: string;\n disabledModels?: string[];\n [key: string]: unknown;\n}\n\nexport interface GenerationCostEntry {\n uri: string;\n status: \"charged\" | \"no_charge\" | \"not_found\";\n chargedAmount?: number;\n consumed_points?: number;\n chargedAt?: string;\n chargeDetail?: Record<string, unknown>;\n pricingBreakdown?: Record<string, unknown>;\n pricingExplanation?: string;\n generation?: Record<string, unknown>;\n}\n\nexport interface GenerationCostResult {\n entries: GenerationCostEntry[];\n note?: string;\n}\n\nexport interface HogiPointsClientOptions {\n baseUrl: string;\n apiKey: string;\n fetch?: typeof globalThis.fetch;\n timeoutMs?: number;\n logger?: LogRecorder;\n}\n\nfunction parseTextJson(result: McpCallToolResult, operation: string): Record<string, unknown> {\n if (result.isError) throw errorFromMcpToolResult(result, `${operation} failed`);\n const text = (result.content ?? [])\n .filter((item) => item?.type === \"text\")\n .map((item) => (item as { text?: unknown }).text)\n .find((value): value is string => typeof value === \"string\" && value.trim().length > 0);\n if (!text) throw new CliError(ErrorCode.SERVER_ERROR, `Invalid ${operation} response: missing JSON text`);\n try {\n const parsed = JSON.parse(text) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) throw new Error(\"not an object\");\n return parsed as Record<string, unknown>;\n } catch {\n throw new CliError(ErrorCode.SERVER_ERROR, `Invalid ${operation} response: malformed JSON`);\n }\n}\n\nexport class HogiPointsClient {\n private readonly mcp: HogiMcpClient;\n\n constructor(options: HogiPointsClientOptions) {\n this.mcp = new HogiMcpClient(options);\n }\n\n async getBalance(): Promise<UserPointsInfo> {\n const data = parseTextJson(await this.mcp.callTool(\"get_user_info\", {}, { serverName: \"res\" }), \"points balance\");\n if (typeof data.points !== \"number\" || typeof data.tier !== \"string\") {\n throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid points balance response\");\n }\n return data as UserPointsInfo;\n }\n\n async getGenerationCosts(uris: string[]): Promise<GenerationCostResult> {\n if (uris.length === 0 || uris.length > 20 || uris.some((uri) => !uri.startsWith(\"hogi://\"))) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, \"Provide 1-20 hogi:// generation URIs\");\n }\n const data = parseTextJson(\n await this.mcp.callTool(\"query_generation_cost\", { uris }, { serverName: \"res\" }),\n \"generation cost query\",\n );\n if (!Array.isArray(data.entries)) throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid generation cost response\");\n const entries = (data.entries as GenerationCostEntry[]).map((entry) => ({\n ...entry,\n ...(entry.status === \"charged\" && typeof entry.chargedAmount === \"number\"\n ? { consumed_points: Math.abs(entry.chargedAmount) }\n : {}),\n }));\n return {\n entries,\n ...(typeof data.note === \"string\" ? { note: data.note } : {}),\n };\n }\n}\n","import type { Command } from \"commander\";\nimport { getRootOptions } from \"../app/command_context.js\";\nimport { HogiPointsClient } from \"../clients/hogi_points_client.js\";\nimport { FileConfigStore } from \"../config/config_store.js\";\nimport type { LogRecorder } from \"../logging/types.js\";\nimport { getDefaultTelemetryManager, type TelemetryManager } from \"./telemetry_manager.js\";\n\nconst TELEMETRY_IDENTITY_TIMEOUT_MS = 1_000;\nconst TELEMETRY_IDENTITY_LOGGER: LogRecorder = { record: () => undefined };\n\nexport interface StartCommandTelemetryOptions {\n configStore?: FileConfigStore;\n fetch?: typeof globalThis.fetch;\n identityTimeoutMs?: number;\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nexport async function startCommandTelemetry(\n command: Command,\n commandName: string,\n traceId?: string,\n manager: TelemetryManager = getDefaultTelemetryManager(),\n options: StartCommandTelemetryOptions = {},\n): Promise<void> {\n try {\n const rootOptions = getRootOptions(command);\n const config = (options.configStore ?? new FileConfigStore()).loadResolved();\n const workspaceId = optionalString(rootOptions.workspace)\n ?? optionalString(process.env[\"OIIOII_WORKSPACE_ID\"])\n ?? optionalString(config.defaultWorkspaceId);\n manager.startCommand({\n command: commandName,\n ...(workspaceId ? { workspaceId } : {}),\n ...(traceId ? { traceId } : {}),\n });\n\n if (process.env[\"OIIOII_TELEMETRY_DISABLED\"] === \"1\") return;\n const apiKey = optionalString(config.apiKey);\n if (!apiKey) return;\n const baseUrl = optionalString(rootOptions.baseUrl) ?? config.baseUrl;\n const userInfo = await new HogiPointsClient({\n baseUrl,\n apiKey,\n timeoutMs: options.identityTimeoutMs ?? TELEMETRY_IDENTITY_TIMEOUT_MS,\n logger: TELEMETRY_IDENTITY_LOGGER,\n ...(options.fetch ? { fetch: options.fetch } : {}),\n }).getBalance();\n const userId = optionalString(userInfo.userId);\n if (userId) manager.identify(userId);\n } catch {\n // Telemetry context and identity resolution must never affect the command.\n }\n}\n\nexport function identifyTelemetryUser(\n userId: string,\n manager: TelemetryManager = getDefaultTelemetryManager(),\n): void {\n manager.identify(userId);\n}\n\nexport function reportCommandTelemetryFailure(\n errorCode?: string,\n manager: TelemetryManager = getDefaultTelemetryManager(),\n): void {\n manager.reportCommandFailure(errorCode);\n}\n\nexport function completeCommandTelemetry(\n exitCode = 0,\n manager: TelemetryManager = getDefaultTelemetryManager(),\n): void {\n manager.completeCommand(exitCode);\n}\n\nexport async function flushTelemetry(\n timeoutMs?: number,\n manager: TelemetryManager = getDefaultTelemetryManager(),\n): Promise<void> {\n await manager.flush(timeoutMs);\n}\n","/**\n * Structured JSON output protocol for agent-native consumption.\n *\n * All commands produce a consistent envelope:\n * { ok: boolean, type: string, data: T, error?: ErrorPayload, next?: NextCommand[] }\n */\n\nexport interface NextCommand {\n command: string;\n description?: string;\n}\n\nimport { reportFeatureFailure } from \"../logging/feature_logger.js\";\n\nexport interface ErrorPayload {\n code: string;\n category?: string;\n hint?: string;\n message: string;\n retryable?: boolean;\n trace_id?: string;\n details?: unknown;\n}\n\nexport interface JsonEnvelope<T = unknown> {\n ok: boolean;\n type: string;\n data?: T;\n error?: ErrorPayload;\n next?: NextCommand[];\n}\n\nexport function successJson<T>(type: string, data: T, next?: NextCommand[]): JsonEnvelope<T> {\n return { ok: true, type, data, ...(next ? { next } : {}) };\n}\n\nexport function errorJson(type: string, code: string, message: string, details?: unknown): JsonEnvelope<never> {\n reportFeatureFailure(code, message);\n const metadata = details && typeof details === \"object\" && !Array.isArray(details)\n ? details as Record<string, unknown>\n : undefined;\n return {\n ok: false,\n type,\n error: {\n code,\n ...(typeof metadata?.category === \"string\" ? { category: metadata.category } : {}),\n ...(typeof metadata?.hint === \"string\" ? { hint: metadata.hint } : {}),\n message,\n ...(typeof metadata?.retryable === \"boolean\" ? { retryable: metadata.retryable } : {}),\n ...(typeof metadata?.trace_id === \"string\" ? { trace_id: metadata.trace_id } : {}),\n ...(details !== undefined ? { details } : {}),\n },\n };\n}\n\n/**\n * Print a JSON envelope to stdout.\n */\nexport function printJson<T>(envelope: JsonEnvelope<T>): void {\n process.stdout.write(JSON.stringify(envelope, null, 2) + \"\\n\");\n}\n","/**\n * Human-friendly output helpers.\n *\n * Produces colored, readable output for interactive terminal use.\n * Respects --no-color and --json flags.\n */\n\nimport { reportFeatureFailure } from \"../logging/feature_logger.js\";\n\nexport function info(message: string): void {\n console.log(message);\n}\n\nexport function success(message: string): void {\n console.log(`✓ ${message}`);\n}\n\nexport function warn(message: string): void {\n console.error(`⚠ ${message}`);\n}\n\nexport function error(message: string): void {\n reportFeatureFailure(undefined, message);\n console.error(`✗ ${message}`);\n}\n\nexport function heading(title: string): void {\n console.log(`\\n${title}`);\n console.log(\"─\".repeat(title.length));\n}\n","/**\n * Image commands: text (text-to-image), edit (image-to-image).\n *\n * `oiioii image text --prompt \"...\" [--model seedream45] [--aspect-ratio 1:1] [--resolution 2K] [--json]`\n *\n * Flow:\n * 1. Require auth (API key from OIIOII_API_KEY)\n * 2. Require workspace (flag > env > config)\n * 3. Map model → GenAI MCP tool name\n * 4. Create local task record (status=created)\n * 5. Submit through submit_async_media_generation\n * 6. Cache the backend task/asset IDs and return immediately\n * 7. task status/wait later query and project terminal output\n */\n\nimport { Command, Option } from \"commander\";\nimport { FileConfigStore } from \"../config/config_store.js\";\nimport { HogiMcpClient } from \"../clients/hogi_mcp_client.js\";\nimport { DEFAULT_ASYNC_GENERATION_REQUEST_TIMEOUT_MS, HogiAsyncGenerationClient } from \"../clients/hogi_async_generation_client.js\";\nimport {\n resolveModelSelection,\n resolveModelConstraintDefaults,\n selectionCliArgs,\n selectionSummary,\n validateModelConstraints,\n type ResolvedModelSelection,\n} from \"../core/model_selection.js\";\nimport { TaskStore } from \"../core/task_store.js\";\nimport { PreviewStore } from \"../core/preview_store.js\";\nimport { createGenerationPreview } from \"../core/generation_preview.js\";\nimport { submitAsyncGeneration } from \"../core/async_generation.js\";\nimport { successJson, errorJson, printJson } from \"../output/json_output.js\";\nimport { ErrorCode, CliError } from \"../output/errors.js\";\nimport * as human from \"../output/human_output.js\";\nimport { logFeatureStep } from \"../logging/feature_logger.js\";\nimport { getRootOptions, isJsonOutput, requireApiKeyAuth } from \"../app/command_context.js\";\nimport { markTelemetryPartialSuccess, recordTelemetryBusinessInfo } from \"../telemetry/index.js\";\nimport {\n createLocalGenerationDryRun,\n printGenerationDryRun,\n type LocalGenerationDryRunResult,\n} from \"./generation_dry_run.js\";\nimport { validatePromptOnlyGeneration, validateReferenceImageCount } from \"../core/generation_input_contract.js\";\nimport { DEFAULT_IMAGE_MODEL } from \"../core/model_defaults.js\";\n\n// ── Types ────────────────────────────────────────────────────────────\n\n/** Artifact in generation output. */\nexport interface GenerationArtifact {\n type: \"image\" | \"video\" | \"audio\";\n uri: string;\n mime_type?: string;\n}\n\n/** Dependencies that can be injected for testing. */\nexport interface ImageCommandDeps {\n configStore?: FileConfigStore;\n taskStore?: TaskStore;\n previewStore?: PreviewStore;\n /** Override fetch for HTTP clients (testing). */\n fetch?: typeof globalThis.fetch;\n imageTextTimeoutMs?: number;\n imageTextPollIntervalMs?: number;\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\n/** Get --json flag from the root program. */\nconst isJsonMode = isJsonOutput;\nconst getRootOpts = getRootOptions;\n\n/**\n * Resolve workspace ID. Throws CliError(WORKSPACE_REQUIRED) if not set.\n */\nfunction requireWorkspace(rootOpts: Record<string, unknown>, configStore: FileConfigStore): {\n workspaceId: string;\n source: \"flag\" | \"env\" | \"config\";\n} {\n // Priority: --workspace flag > OIIOII_WORKSPACE_ID env > config\n const flag = rootOpts.workspace as string | undefined;\n if (flag) {\n return { workspaceId: flag, source: \"flag\" };\n }\n\n const envVal = process.env[\"OIIOII_WORKSPACE_ID\"];\n if (envVal) {\n return { workspaceId: envVal, source: \"env\" };\n }\n\n const config = configStore.loadResolved();\n if (config.defaultWorkspaceId) {\n return { workspaceId: config.defaultWorkspaceId, source: \"config\" };\n }\n\n throw new CliError(\n ErrorCode.WORKSPACE_REQUIRED,\n \"No workspace set. Run: oiioii workspace set <workspace_id>\",\n );\n}\n\n// ── Core generation logic (testable) ────────────────────────────────\n\nexport interface ImageTextParams {\n prompt: string;\n model: string;\n modelId?: string;\n variant?: string;\n size?: string;\n aspectRatio?: string;\n resolution?: string;\n}\n\nexport interface ImageEditParams {\n image: string;\n prompt: string;\n model: string;\n modelId?: string;\n variant?: string;\n size?: string;\n aspectRatio?: string;\n resolution?: string;\n}\n\nexport interface GenerationWarning {\n code: string;\n message: string;\n details?: unknown;\n}\n\nexport interface ImageTextResult {\n task_id: string;\n local_task_id: string;\n tool: string;\n model: ReturnType<typeof selectionSummary>;\n workspace_id: string;\n status: \"created\" | \"submitting\" | \"queued\" | \"running\" | \"succeeded\" | \"failed\" | \"cancelled\";\n artifacts: GenerationArtifact[];\n request: { aspect_ratio: string; resolution: string };\n warnings?: GenerationWarning[];\n error?: { code: string; message: string };\n}\n\nfunction aspectRatioFromSize(size: string): string {\n const match = /^(\\d+)x(\\d+)$/.exec(size.trim());\n if (!match) throw new CliError(ErrorCode.INVALID_ARGUMENT, `Invalid image size: ${size}. Expected <width>x<height>.`);\n const width = Number(match[1]);\n const height = Number(match[2]);\n if (width <= 0 || height <= 0) throw new CliError(ErrorCode.INVALID_ARGUMENT, `Invalid image size: ${size}. Dimensions must be positive.`);\n const gcd = (a: number, b: number): number => b === 0 ? a : gcd(b, a % b);\n const divisor = gcd(width, height);\n return `${width / divisor}:${height / divisor}`;\n}\n\nfunction resolveImageShape(\n selection: ResolvedModelSelection,\n params: { size?: string; aspectRatio?: string; resolution?: string },\n): { args: Record<string, unknown>; aspectRatio: string; resolution: string } {\n const defaults = resolveModelConstraintDefaults(selection, { aspectRatio: \"1:1\", resolution: \"2K\" });\n const aspectRatio = params.aspectRatio ?? (params.size ? aspectRatioFromSize(params.size) : defaults.aspectRatio);\n const resolution = params.resolution ?? defaults.resolution;\n let args: Record<string, unknown>;\n if (selection.toolName === \"generate_image_gpt4o\") {\n const [width = 1, height = 1] = aspectRatio.split(\":\").map(Number);\n const size = width === height ? \"1024x1024\" : width > height ? \"1536x1024\" : \"1024x1536\";\n args = { size };\n } else {\n args = { aspectRatio, resolution };\n }\n validateModelConstraints(selection, { aspectRatio, resolution });\n return { args, aspectRatio, resolution };\n}\n\n/** Translate synchronous image-tool reference fields to the async service contract. */\nfunction buildAsyncImageInput(args: Record<string, unknown>): Record<string, unknown> {\n const { images, ...rest } = args;\n return {\n ...rest,\n ...(Array.isArray(images) ? { referenceImages: images } : {}),\n };\n}\n\nasync function prepareImageRequest(\n params: ImageTextParams | ImageEditParams,\n mode: \"edit\" | \"text\",\n apiKey: string,\n baseUrl: string,\n deps: ImageCommandDeps,\n requireActiveCatalog: boolean,\n): Promise<{\n args: Record<string, unknown>;\n resolved: { aspectRatio: string; resolution: string };\n selection: ResolvedModelSelection;\n}> {\n const selection = await resolveModelSelection({\n domain: \"image\",\n model: params.model,\n modelId: params.modelId,\n variant: params.variant,\n requireActiveCatalog,\n baseUrl,\n apiKey,\n fetch: deps.fetch,\n });\n if (mode === \"text\") validatePromptOnlyGeneration(selection);\n else validateReferenceImageCount(selection, 1);\n const shape = resolveImageShape(selection, params);\n return {\n selection,\n resolved: { aspectRatio: shape.aspectRatio, resolution: shape.resolution },\n args: {\n prompt: params.prompt,\n ...(mode === \"edit\" ? { images: [(params as ImageEditParams).image] } : {}),\n ...shape.args,\n ...(selection.variant ? { version: selection.variant } : {}),\n },\n };\n}\n\nexport async function validateImageDryRun(\n params: ImageTextParams | ImageEditParams,\n mode: \"edit\" | \"text\",\n apiKey: string,\n baseUrl: string,\n deps: ImageCommandDeps,\n): Promise<LocalGenerationDryRunResult> {\n const { selection, args } = await prepareImageRequest(params, mode, apiKey, baseUrl, deps, true);\n return createLocalGenerationDryRun(selection, \"image\", args);\n}\n\n/**\n * Execute the image text generation workflow.\n *\n * This is the testable core, separated from Commander wiring.\n */\nexport async function executeImageText(\n params: ImageTextParams,\n workspaceId: string,\n apiKey: string,\n baseUrl: string,\n deps: ImageCommandDeps = {},\n): Promise<ImageTextResult> {\n const taskStore = deps.taskStore ?? new TaskStore();\n\n const prepared = await prepareImageRequest(params, \"text\", apiKey, baseUrl, deps, true);\n const { selection } = prepared;\n const toolName = selection.toolName;\n logFeatureStep(\"image\", \"generation.prepared\", {\n mode: \"text\",\n model: selection.key,\n model_id: selection.modelId,\n variant: selection.variant,\n workspace_id: workspaceId,\n });\n\n // 2. Build GenAI MCP arguments using the selected catalog row's defaults.\n const toolArgs: Record<string, unknown> = {\n ...prepared.args,\n workspace_id: workspaceId,\n };\n\n // 3. Create local task (status=created)\n const commandStr = `oiioii image text --prompt \"${params.prompt}\" ${selectionCliArgs(selection)}${params.aspectRatio ? ` --aspect-ratio ${params.aspectRatio}` : \"\"}${params.size ? ` --size ${params.size}` : \"\"}${params.resolution ? ` --resolution ${params.resolution}` : \"\"}`;\n const task = taskStore.create({\n workspaceId,\n command: commandStr,\n toolName,\n inputArgs: {\n provider: \"mcp_genai\",\n prompt: params.prompt,\n model: selection.key,\n modelId: selection.modelId,\n variant: selection.variant,\n mcpMethodName: toolName,\n workspaceId,\n toolArgs: {\n aspectRatio: toolArgs.aspectRatio,\n size: toolArgs.size,\n resolution: toolArgs.resolution,\n },\n },\n });\n\n // 4. Update to submitting\n taskStore.update(task.id, { status: \"submitting\" });\n\n // 5. Submit through the API-key async GenAI MCP boundary.\n const client = new HogiMcpClient({\n baseUrl,\n apiKey,\n fetch: deps.fetch,\n timeoutMs: deps.imageTextTimeoutMs ?? DEFAULT_ASYNC_GENERATION_REQUEST_TIMEOUT_MS,\n });\n\n try {\n const submitted = await submitAsyncGeneration({\n client: new HogiAsyncGenerationClient(client),\n taskStore,\n previewStore: deps.previewStore,\n task,\n mediaType: \"image\",\n prompt: params.prompt,\n model: selection.variant,\n backendBaseUrl: baseUrl,\n input: buildAsyncImageInput(prepared.args),\n });\n const artifacts = submitted.task.resourceUris.map((uri) => ({ type: \"image\" as const, uri, mime_type: \"image/jpeg\" }));\n const warnings: GenerationWarning[] = submitted.previewWarning ? [submitted.previewWarning] : [];\n logFeatureStep(\"image\", \"generation.submitted\", {\n local_task_id: task.id,\n backend_task_id: submitted.submission.taskId,\n status: submitted.task.status,\n });\n\n return {\n task_id: submitted.submission.taskId,\n local_task_id: task.id,\n tool: toolName,\n model: selectionSummary(selection),\n workspace_id: workspaceId,\n status: submitted.task.status,\n artifacts,\n request: { aspect_ratio: prepared.resolved.aspectRatio, resolution: prepared.resolved.resolution },\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n } catch (err: unknown) {\n // Update task to failed\n const errCode = err instanceof CliError ? err.code : ErrorCode.GENERATION_FAILED;\n const errMsg = err instanceof Error ? err.message : String(err);\n\n if (!taskStore.get(task.id)?.backendTaskId) {\n taskStore.update(task.id, { status: \"failed\", error: { code: errCode, message: errMsg } });\n createGenerationPreview({ taskStore, previewStore: deps.previewStore, task, resources: [], status: \"failed\", error: { code: errCode, message: errMsg } });\n }\n logFeatureStep(\"image\", \"generation.command_failed\", { task_id: task.id, backend_task_cached: taskStore.get(task.id)?.backendTaskId !== undefined, error_code: errCode }, \"error\");\n\n // Re-throw for the caller to handle\n throw err;\n }\n}\n\n// ── Image Edit (image-to-image) core logic ──────────────────────────\n\n/**\n * Execute the image edit (image-to-image) workflow.\n *\n * Sends the source image URI in an `images` array to the same image generation tool.\n * The backend handles URI-to-URL conversion internally.\n */\nexport async function executeImageEdit(\n params: ImageEditParams,\n workspaceId: string,\n apiKey: string,\n baseUrl: string,\n deps: ImageCommandDeps = {},\n): Promise<ImageTextResult> {\n const taskStore = deps.taskStore ?? new TaskStore();\n\n const prepared = await prepareImageRequest(params, \"edit\", apiKey, baseUrl, deps, true);\n const { selection } = prepared;\n const toolName = selection.toolName;\n logFeatureStep(\"image\", \"generation.prepared\", {\n mode: \"edit\",\n model: selection.key,\n model_id: selection.modelId,\n variant: selection.variant,\n workspace_id: workspaceId,\n });\n\n const toolArgs: Record<string, unknown> = {\n ...prepared.args,\n workspace_id: workspaceId,\n };\n\n const commandStr = `oiioii image edit --image ${params.image} --prompt \"${params.prompt}\" ${selectionCliArgs(selection)}${params.aspectRatio ? ` --aspect-ratio ${params.aspectRatio}` : \"\"}${params.size ? ` --size ${params.size}` : \"\"}${params.resolution ? ` --resolution ${params.resolution}` : \"\"}`;\n const task = taskStore.create({\n workspaceId,\n command: commandStr,\n toolName,\n inputArgs: {\n provider: \"mcp_genai\",\n prompt: params.prompt,\n model: selection.key,\n modelId: selection.modelId,\n variant: selection.variant,\n sourceImage: params.image,\n mcpMethodName: toolName,\n workspaceId,\n toolArgs: {\n images: toolArgs.images,\n aspectRatio: toolArgs.aspectRatio,\n size: toolArgs.size,\n resolution: toolArgs.resolution,\n },\n },\n });\n\n taskStore.update(task.id, { status: \"submitting\" });\n\n const client = new HogiMcpClient({\n baseUrl,\n apiKey,\n fetch: deps.fetch,\n timeoutMs: deps.imageTextTimeoutMs ?? DEFAULT_ASYNC_GENERATION_REQUEST_TIMEOUT_MS,\n });\n\n try {\n const submitted = await submitAsyncGeneration({\n client: new HogiAsyncGenerationClient(client),\n taskStore,\n previewStore: deps.previewStore,\n task,\n mediaType: \"image\",\n prompt: params.prompt,\n model: selection.variant,\n backendBaseUrl: baseUrl,\n input: buildAsyncImageInput(prepared.args),\n });\n const artifacts = submitted.task.resourceUris.map((uri) => ({ type: \"image\" as const, uri, mime_type: \"image/jpeg\" }));\n const warnings: GenerationWarning[] = submitted.previewWarning ? [submitted.previewWarning] : [];\n logFeatureStep(\"image\", \"generation.submitted\", {\n local_task_id: task.id,\n backend_task_id: submitted.submission.taskId,\n status: submitted.task.status,\n });\n\n return {\n task_id: submitted.submission.taskId,\n local_task_id: task.id,\n tool: toolName,\n model: selectionSummary(selection),\n workspace_id: workspaceId,\n status: submitted.task.status,\n artifacts,\n request: { aspect_ratio: prepared.resolved.aspectRatio, resolution: prepared.resolved.resolution },\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n } catch (err: unknown) {\n const errCode = err instanceof CliError ? err.code : ErrorCode.GENERATION_FAILED;\n const errMsg = err instanceof Error ? err.message : String(err);\n\n if (!taskStore.get(task.id)?.backendTaskId) {\n taskStore.update(task.id, { status: \"failed\", error: { code: errCode, message: errMsg } });\n createGenerationPreview({ taskStore, previewStore: deps.previewStore, task, resources: [], status: \"failed\", error: { code: errCode, message: errMsg } });\n }\n logFeatureStep(\"image\", \"generation.command_failed\", { task_id: task.id, backend_task_cached: taskStore.get(task.id)?.backendTaskId !== undefined, error_code: errCode }, \"error\");\n\n throw err;\n }\n}\n\n// ── Commander command ───────────────────────────────────────────────\n\nexport function createImageCommand(deps: ImageCommandDeps = {}): Command {\n const image = new Command(\"image\").description(\"Image generation commands\");\n\n image\n .command(\"text\")\n .description(\"Generate image from text prompt\")\n .requiredOption(\"--prompt <text>\", \"Image description\")\n .option(\"--model <model>\", \"Model name\", DEFAULT_IMAGE_MODEL)\n .option(\"--model-id <id>\", \"Exact model ID from inspect models\")\n .option(\"--variant <variant>\", \"Exact model variant from inspect models\")\n .option(\"--aspect-ratio <ratio>\", \"Image aspect ratio (defaults to the selected model catalog)\")\n .addOption(new Option(\"--size <size>\", \"Deprecated <width>x<height> compatibility option\").hideHelp())\n .option(\"--resolution <resolution>\", \"Image resolution (defaults to the selected model catalog)\")\n .option(\"--dry-run\", \"Validate and preview the resolved request without submitting\")\n .action(async (opts, cmd) => {\n const jsonMode = isJsonMode(cmd);\n const rootOpts = getRootOpts(cmd);\n const configStore = deps.configStore ?? new FileConfigStore();\n\n try {\n // Resolve auth and workspace\n const auth = requireApiKeyAuth(rootOpts, configStore);\n const baseUrl = auth.baseUrl;\n const { workspaceId } = requireWorkspace(rootOpts, configStore);\n\n const params: ImageTextParams = {\n prompt: opts.prompt,\n model: opts.model,\n modelId: opts.modelId,\n variant: opts.variant,\n size: opts.size,\n aspectRatio: opts.aspectRatio,\n resolution: opts.resolution,\n };\n if (opts.dryRun === true) {\n printGenerationDryRun(await validateImageDryRun(params, \"text\", auth.apiKey, baseUrl, deps), jsonMode);\n return;\n }\n\n // Execute generation\n const result = await executeImageText(\n params,\n workspaceId,\n auth.apiKey,\n baseUrl,\n deps,\n );\n recordTelemetryBusinessInfo({\n media_type: \"image\",\n generation_mode: \"text\",\n model_key: result.model.key,\n ...(result.model.model_id !== undefined ? { model_id: result.model.model_id } : {}),\n ...(result.model.variant ? { variant: result.model.variant } : {}),\n resolution: result.request.resolution,\n aspect_ratio: result.request.aspect_ratio,\n artifact_count: result.artifacts.length,\n warning_count: result.warnings?.length ?? 0,\n });\n if (result.warnings?.length) markTelemetryPartialSuccess();\n\n // Output\n if (jsonMode) {\n printJson(successJson(result.status === \"succeeded\" ? \"generation_completed\" : \"generation_submitted\", {\n task_id: result.task_id,\n local_task_id: result.local_task_id,\n tool: result.tool,\n model: result.model,\n workspace_id: result.workspace_id,\n status: result.status,\n artifacts: result.artifacts,\n request: result.request,\n ...(result.warnings ? { warnings: result.warnings } : {}),\n }, [\n ...(result.artifacts.length > 0\n ? [{ command: `oiioii record get ${result.artifacts[0]!.uri} --json`, description: \"Get generation record details\" }]\n : []),\n { command: `oiioii task status ${result.task_id} --json`, description: \"Check task status\" },\n ]));\n } else {\n human.success(result.status === \"succeeded\" ? \"Image generated successfully\" : \"Image generation submitted\");\n human.info(` Task ID: ${result.task_id}`);\n human.info(` Model: ${result.model.name ?? result.model.key}${result.model.variant ? ` (${result.model.variant})` : \"\"}`);\n for (const art of result.artifacts) {\n human.info(` URI: ${art.uri}`);\n }\n for (const warning of result.warnings ?? []) {\n human.warn(`Warning: ${warning.message}`);\n }\n if (result.artifacts.length > 0) {\n human.info(`\\n Next: oiioii record get ${result.artifacts[0]!.uri}`);\n } else {\n human.info(`\\n Next: oiioii task wait ${result.task_id} --json`);\n }\n }\n } catch (err: unknown) {\n if (err instanceof CliError) {\n if (jsonMode) {\n printJson(errorJson(\"generation_failed\", err.code, err.message, err.details));\n } else {\n human.error(err.message);\n }\n process.exitCode = 1;\n return;\n }\n const msg = err instanceof Error ? err.message : String(err);\n if (jsonMode) {\n printJson(errorJson(\"generation_failed\", ErrorCode.GENERATION_FAILED, msg));\n } else {\n human.error(msg);\n }\n process.exitCode = 1;\n }\n });\n\n image\n .command(\"edit\")\n .description(\"Edit an existing image (image-to-image)\")\n .requiredOption(\"--image <uri>\", \"Source image (hogi:// URI)\")\n .requiredOption(\"--prompt <text>\", \"Edit instruction\")\n .option(\"--model <model>\", \"Model name\", DEFAULT_IMAGE_MODEL)\n .option(\"--model-id <id>\", \"Exact model ID from inspect models\")\n .option(\"--variant <variant>\", \"Exact model variant from inspect models\")\n .option(\"--aspect-ratio <ratio>\", \"Image aspect ratio (defaults to the selected model catalog)\")\n .addOption(new Option(\"--size <size>\", \"Deprecated <width>x<height> compatibility option\").hideHelp())\n .option(\"--resolution <resolution>\", \"Image resolution (defaults to the selected model catalog)\")\n .option(\"--dry-run\", \"Validate and preview the resolved request without submitting\")\n .action(async (opts, cmd) => {\n const jsonMode = isJsonMode(cmd);\n const rootOpts = getRootOpts(cmd);\n const configStore = deps.configStore ?? new FileConfigStore();\n\n try {\n // Resolve auth and workspace\n const auth = requireApiKeyAuth(rootOpts, configStore);\n const baseUrl = auth.baseUrl;\n const { workspaceId } = requireWorkspace(rootOpts, configStore);\n\n const params: ImageEditParams = {\n image: opts.image,\n prompt: opts.prompt,\n model: opts.model,\n modelId: opts.modelId,\n variant: opts.variant,\n size: opts.size,\n aspectRatio: opts.aspectRatio,\n resolution: opts.resolution,\n };\n if (opts.dryRun === true) {\n printGenerationDryRun(await validateImageDryRun(params, \"edit\", auth.apiKey, baseUrl, deps), jsonMode);\n return;\n }\n\n // Execute edit\n const result = await executeImageEdit(\n params,\n workspaceId,\n auth.apiKey,\n baseUrl,\n deps,\n );\n recordTelemetryBusinessInfo({\n media_type: \"image\",\n generation_mode: \"image\",\n model_key: result.model.key,\n ...(result.model.model_id !== undefined ? { model_id: result.model.model_id } : {}),\n ...(result.model.variant ? { variant: result.model.variant } : {}),\n resolution: result.request.resolution,\n aspect_ratio: result.request.aspect_ratio,\n artifact_count: result.artifacts.length,\n warning_count: result.warnings?.length ?? 0,\n });\n if (result.warnings?.length) markTelemetryPartialSuccess();\n\n // Output\n if (jsonMode) {\n printJson(successJson(result.status === \"succeeded\" ? \"generation_completed\" : \"generation_submitted\", {\n task_id: result.task_id,\n local_task_id: result.local_task_id,\n tool: result.tool,\n model: result.model,\n workspace_id: result.workspace_id,\n status: result.status,\n artifacts: result.artifacts,\n request: result.request,\n ...(result.warnings ? { warnings: result.warnings } : {}),\n }, [\n ...(result.artifacts.length > 0\n ? [{ command: `oiioii record get ${result.artifacts[0]!.uri} --json`, description: \"Get generation record details\" }]\n : []),\n { command: `oiioii task status ${result.task_id} --json`, description: \"Check task status\" },\n ]));\n } else {\n human.success(result.status === \"succeeded\" ? \"Image edited successfully\" : \"Image edit submitted\");\n human.info(` Task ID: ${result.task_id}`);\n human.info(` Model: ${result.model.name ?? result.model.key}${result.model.variant ? ` (${result.model.variant})` : \"\"}`);\n human.info(` Source: ${opts.image}`);\n for (const art of result.artifacts) {\n human.info(` URI: ${art.uri}`);\n }\n for (const warning of result.warnings ?? []) {\n human.warn(`Warning: ${warning.message}`);\n }\n if (result.artifacts.length > 0) {\n human.info(`\\n Next: oiioii record get ${result.artifacts[0]!.uri}`);\n } else {\n human.info(`\\n Next: oiioii task wait ${result.task_id} --json`);\n }\n }\n } catch (err: unknown) {\n if (err instanceof CliError) {\n if (jsonMode) {\n printJson(errorJson(\"generation_failed\", err.code, err.message, err.details));\n } else {\n human.error(err.message);\n }\n process.exitCode = 1;\n return;\n }\n const msg = err instanceof Error ? err.message : String(err);\n if (jsonMode) {\n printJson(errorJson(\"generation_failed\", ErrorCode.GENERATION_FAILED, msg));\n } else {\n human.error(msg);\n }\n process.exitCode = 1;\n }\n });\n\n return image;\n}\n","import {\n errorFromMcpToolResult,\n HogiMcpClient,\n type McpCallToolResult,\n type McpTextContent,\n} from \"./hogi_mcp_client.js\";\nimport { CliError, ErrorCode } from \"../output/errors.js\";\nimport { logFeatureStep } from \"../logging/feature_logger.js\";\n\nexport type AsyncMediaType = \"image\" | \"video\" | \"audio\";\nexport type BackendAsyncTaskStatus = \"pending\" | \"processing\" | \"succeeded\" | \"failed\" | \"cancelled\";\nexport const DEFAULT_ASYNC_GENERATION_REQUEST_TIMEOUT_MS = 30_000;\n\nexport interface AsyncGenerationSubmission {\n assetId: string;\n createdAt?: string;\n mediaType: AsyncMediaType;\n reused: boolean;\n status: BackendAsyncTaskStatus;\n taskId: string;\n workspaceId: string;\n}\n\nexport interface AsyncGenerationTask {\n assetId?: string;\n createdAt?: string;\n error: { code: string; message: string } | null;\n mediaType: AsyncMediaType;\n outputUris: string[];\n progress: number;\n status: BackendAsyncTaskStatus;\n taskId: string;\n updatedAt?: string;\n workspaceId: string;\n}\n\nfunction textPayload(result: McpCallToolResult, fallback: string): unknown {\n if (result.isError) throw errorFromMcpToolResult(result, fallback);\n const text = (result.content ?? [])\n .filter((item): item is McpTextContent => item?.type === \"text\" && typeof (item as McpTextContent).text === \"string\")\n .map((item) => item.text)\n .join(\"\\n\")\n .trim();\n if (!text) throw new CliError(ErrorCode.SERVER_ERROR, `${fallback}: empty response`);\n try {\n return JSON.parse(text) as unknown;\n } catch {\n throw new CliError(ErrorCode.SERVER_ERROR, `${fallback}: invalid JSON response`);\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction assertStatus(value: unknown): BackendAsyncTaskStatus {\n if (value === \"pending\" || value === \"processing\" || value === \"succeeded\" || value === \"failed\" || value === \"cancelled\") {\n return value;\n }\n throw new CliError(ErrorCode.SERVER_ERROR, `Invalid backend async task status: ${String(value)}`);\n}\n\nfunction assertMediaType(value: unknown): AsyncMediaType {\n if (value === \"image\" || value === \"video\" || value === \"audio\") return value;\n throw new CliError(ErrorCode.SERVER_ERROR, `Invalid backend async media type: ${String(value)}`);\n}\n\nexport class HogiAsyncGenerationClient {\n constructor(private readonly mcp: HogiMcpClient) {}\n\n async submit(params: {\n workspaceId: string;\n mediaType: AsyncMediaType;\n prompt: string;\n mcpMethodName: string;\n model?: string;\n input: Record<string, unknown>;\n idempotencyKey: string;\n }): Promise<AsyncGenerationSubmission> {\n logFeatureStep(\"async_generation\", \"submission.started\", {\n workspace_id: params.workspaceId,\n media_type: params.mediaType,\n tool: params.mcpMethodName,\n idempotency_key: params.idempotencyKey,\n });\n const result = await this.mcp.callTool(\"submit_async_media_generation\", {\n workspace_id: params.workspaceId,\n mediaType: params.mediaType,\n prompt: params.prompt,\n mcpMethodName: params.mcpMethodName,\n ...(params.model ? { model: params.model } : {}),\n input: params.input,\n idempotencyKey: params.idempotencyKey,\n });\n const payload = textPayload(result, \"Async generation submission failed\");\n if (!isRecord(payload)\n || typeof payload.taskId !== \"string\" || payload.taskId.length === 0\n || typeof payload.assetId !== \"string\" || payload.assetId.length === 0\n || typeof payload.workspaceId !== \"string\" || payload.workspaceId.length === 0\n || typeof payload.reused !== \"boolean\") {\n throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid async generation submission response\");\n }\n const submission: AsyncGenerationSubmission = {\n assetId: payload.assetId,\n ...(typeof payload.createdAt === \"string\" ? { createdAt: payload.createdAt } : {}),\n mediaType: assertMediaType(payload.mediaType),\n reused: payload.reused === true,\n status: assertStatus(payload.status),\n taskId: payload.taskId,\n workspaceId: payload.workspaceId,\n };\n if (submission.workspaceId !== params.workspaceId || submission.mediaType !== params.mediaType) {\n throw new CliError(ErrorCode.SERVER_ERROR, \"Async generation submission response does not match the request\");\n }\n logFeatureStep(\"async_generation\", \"submission.accepted\", {\n task_id: submission.taskId,\n asset_id: submission.assetId,\n status: submission.status,\n reused: submission.reused,\n });\n return submission;\n }\n\n async query(workspaceId: string, taskId: string): Promise<AsyncGenerationTask> {\n logFeatureStep(\"async_generation\", \"query.started\", { task_id: taskId, workspace_id: workspaceId });\n const result = await this.mcp.callTool(\"query_async_media_generation\", {\n workspace_id: workspaceId,\n taskId,\n });\n const payload = textPayload(result, \"Async generation query failed\");\n const task = isRecord(payload) && isRecord(payload.task) ? payload.task : undefined;\n if (!task\n || typeof task.taskId !== \"string\"\n || typeof task.workspaceId !== \"string\"\n || !Array.isArray(task.outputUris)) {\n throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid async generation query response\");\n }\n if (!task.outputUris.every((uri) => typeof uri === \"string\")) {\n throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid async generation output URI list\");\n }\n if (typeof task.progress !== \"number\" || !Number.isFinite(task.progress)) {\n throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid async generation progress\");\n }\n if (task.error !== null && task.error !== undefined\n && (!isRecord(task.error) || typeof task.error.code !== \"string\" || typeof task.error.message !== \"string\")) {\n throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid async generation error payload\");\n }\n const outputUris = task.outputUris as string[];\n const response: AsyncGenerationTask = {\n ...(typeof task.assetId === \"string\" ? { assetId: task.assetId } : {}),\n ...(typeof task.createdAt === \"string\" ? { createdAt: task.createdAt } : {}),\n error: isRecord(task.error) && typeof task.error.code === \"string\" && typeof task.error.message === \"string\"\n ? { code: task.error.code, message: task.error.message }\n : null,\n mediaType: assertMediaType(task.mediaType),\n outputUris,\n progress: Math.max(0, Math.min(100, task.progress)),\n status: assertStatus(task.status),\n taskId: task.taskId,\n ...(typeof task.updatedAt === \"string\" ? { updatedAt: task.updatedAt } : {}),\n workspaceId: task.workspaceId,\n };\n if (response.taskId !== taskId || response.workspaceId !== workspaceId) {\n throw new CliError(ErrorCode.SERVER_ERROR, \"Async generation query response does not match the requested task\");\n }\n logFeatureStep(\"async_generation\", \"query.completed\", {\n task_id: taskId,\n status: response.status,\n progress: response.progress,\n output_count: response.outputUris.length,\n has_error: response.error !== null,\n });\n return response;\n }\n}\n","import { CliError, ErrorCode } from \"../output/errors.js\";\nimport { startApiCall } from \"../logging/api_call_logger.js\";\nimport type { LogRecorder } from \"../logging/types.js\";\n\nexport interface ModelDescriptionI18n {\n zh?: string;\n zh_tw?: string;\n en?: string;\n ja?: string;\n es?: string;\n}\n\nexport interface BackendModelPricing {\n id: number;\n name: string | null;\n model: string | null;\n mcp_method_name: string;\n /** Model input modalities. Image/video generation also applies tool schemas and reference-count limits. */\n input_capabilities?: Array<\"text\" | \"image\" | \"video\" | \"audio\" | \"file\">;\n /** Reference-image bounds used by image/video generation. Zero explicitly disables image references. */\n reference_image_count_min?: number | null;\n reference_image_count_max?: number | null;\n points_cost: number;\n sizes: string[];\n aspect_ratios: string[];\n durations?: string[];\n description_i18n: ModelDescriptionI18n;\n tags: string[];\n members_only?: boolean | null;\n sort_order: number;\n [key: string]: unknown;\n}\n\ninterface ModelCatalogResponse {\n code?: string;\n data?: { pricings?: unknown };\n error?: string;\n}\n\nexport interface HogiModelCatalogClientOptions {\n baseUrl: string;\n apiKey: string;\n fetch?: typeof globalThis.fetch;\n logger?: LogRecorder;\n}\n\nexport class HogiModelCatalogClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly _fetch: typeof globalThis.fetch;\n private readonly logger?: LogRecorder;\n\n constructor(options: HogiModelCatalogClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = options.apiKey;\n this._fetch = options.fetch ?? globalThis.fetch;\n this.logger = options.logger;\n }\n\n async listModels(): Promise<BackendModelPricing[]> {\n const apiLog = startApiCall({\n source: \"hogi_model_catalog_client\",\n operation: \"models.list\",\n method: \"POST\",\n path: \"/points/mcp_model_pricings\",\n }, this.logger);\n\n let response: Response;\n try {\n response = await this._fetch(`${this.baseUrl}/points/mcp_model_pricings`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"accept\": \"application/json\",\n \"connection\": \"close\",\n \"x-hogi-api-key\": this.apiKey,\n },\n body: \"{}\",\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const networkError = new CliError(ErrorCode.NETWORK_ERROR, `Network error: ${message}`);\n apiLog.failure(networkError);\n throw networkError;\n }\n\n if (response.status === 401) {\n const authError = new CliError(ErrorCode.API_KEY_INVALID, \"Invalid API key\", { status: 401 });\n apiLog.failure(authError, response.status);\n throw authError;\n }\n if (!response.ok) {\n const serverError = new CliError(\n ErrorCode.SERVER_ERROR,\n `Model catalog request failed: HTTP ${response.status}`,\n { status: response.status },\n );\n apiLog.failure(serverError, response.status);\n throw serverError;\n }\n\n let body: ModelCatalogResponse;\n try {\n body = await response.json() as ModelCatalogResponse;\n } catch {\n const parseError = new CliError(ErrorCode.SERVER_ERROR, \"Invalid JSON response from model catalog\");\n apiLog.failure(parseError, response.status);\n throw parseError;\n }\n\n const pricings = body.data?.pricings;\n if (body.code !== \"SUCCESS\" || !Array.isArray(pricings) || pricings.some((item) => !isBackendModelPricing(item))) {\n const shapeError = new CliError(\n ErrorCode.SERVER_ERROR,\n body.error ?? \"Invalid model catalog response from server\",\n );\n apiLog.failure(shapeError, response.status);\n throw shapeError;\n }\n\n apiLog.success(response.status, { model_count: pricings.length });\n return pricings;\n }\n}\n\nfunction isBackendModelPricing(value: unknown): value is BackendModelPricing {\n if (!value || typeof value !== \"object\") return false;\n const item = value as Partial<BackendModelPricing>;\n const isStringArray = (candidate: unknown): candidate is string[] => (\n Array.isArray(candidate) && candidate.every((entry) => typeof entry === \"string\")\n );\n const validInputCapabilities = item.input_capabilities === undefined || (\n isStringArray(item.input_capabilities)\n && item.input_capabilities.every((entry) => [\"text\", \"image\", \"video\", \"audio\", \"file\"].includes(entry))\n );\n const validReferenceBound = (bound: unknown): boolean => (\n bound === undefined || bound === null || (typeof bound === \"number\" && Number.isInteger(bound) && bound >= 0)\n );\n return typeof item.id === \"number\"\n && typeof item.mcp_method_name === \"string\"\n && (item.name === null || typeof item.name === \"string\")\n && (item.model === null || typeof item.model === \"string\")\n && typeof item.points_cost === \"number\"\n && isStringArray(item.sizes)\n && isStringArray(item.aspect_ratios)\n && (item.durations === undefined || isStringArray(item.durations))\n && validInputCapabilities\n && validReferenceBound(item.reference_image_count_min)\n && validReferenceBound(item.reference_image_count_max)\n && isStringArray(item.tags)\n && !!item.description_i18n && typeof item.description_i18n === \"object\" && !Array.isArray(item.description_i18n)\n && (item.members_only === undefined || item.members_only === null || typeof item.members_only === \"boolean\")\n && typeof item.sort_order === \"number\";\n}\n","/**\n * Model-to-tool mapping for GenAI commands.\n *\n * Maps user-facing model names to backend MCP tool names.\n * Extensible per-domain (image, video).\n */\n\nimport { CliError, ErrorCode } from \"../output/errors.js\";\nimport { logFeatureStep } from \"../logging/feature_logger.js\";\n\n// ── Image model mapping ─────────────────────────────────────────────\n\nconst IMAGE_MODEL_MAP: Record<string, string> = {\n seedream45: \"generate_image_seedream45\",\n seedream40: \"generate_image_seedream40\",\n seedream50: \"generate_image_seedream50\",\n \"seedream50-lite\": \"generate_image_seedream50lite\",\n \"seedream50-pro\": \"generate_image_seedream50pro\",\n gpt4o: \"generate_image_gpt4o\",\n \"gpt-image2\": \"generate_image_gpt_image2\",\n \"gpt-image-2\": \"generate_image_gpt_image2\",\n midjourney: \"generate_image_midjourney\",\n midjourney8: \"generate_image_midjourney8\",\n flux: \"generate_image_flux\",\n nano: \"generate_image_nano\",\n qwen: \"generate_image_qwen\",\n \"qwen-image3\": \"generate_image_qwen_image3\",\n comfyui: \"generate_image_comfyui\",\n novelai: \"generate_image_novelai\",\n};\n\n// ── Video model mapping ─────────────────────────────────────────────\n\nconst VIDEO_MODEL_MAP: Record<string, string> = {\n seedance20: \"generate_video_seedance20\",\n \"seedance 2.0\": \"generate_video_seedance20\",\n kling: \"generate_video_kling\",\n \"kling-o1\": \"generate_video_kling_o1\",\n hailuo02: \"generate_video_hailuo02\",\n \"minimax-h3\": \"generate_video_minimax_h3\",\n wan: \"generate_video_wan\",\n wan26: \"generate_video_wan26\",\n wan27: \"generate_video_wan27\",\n vidu: \"generate_video_vidu\",\n veo3: \"generate_video_veo3\",\n sora2: \"generate_video_sora2\",\n \"sora2-pro\": \"generate_video_sora2_pro\",\n grok: \"generate_video_grok\",\n \"grok-imagine\": \"generate_video_grok_imagine\",\n \"grok-imagine-1.5\": \"generate_video_grok_imagine_15\",\n \"grok-imagine-1.5-fast\": \"generate_video_grok_imagine_15_fast\",\n seedance25: \"generate_video_seedance25\",\n \"midjourney-video\": \"generate_video_midjourney\",\n};\n\n// ── Audio model mapping ─────────────────────────────────────────────\n\nconst AUDIO_MODEL_MAP: Record<string, string> = {\n \"seed-audio\": \"generate_music_seed_audio\",\n \"seed-audio-1.0\": \"generate_music_seed_audio\",\n suno: \"generate_music_suno\",\n};\n\n// ── Public API ──────────────────────────────────────────────────────\n\nexport type ModelDomain = \"image\" | \"video\" | \"audio\";\n\nfunction modelMapForDomain(domain: ModelDomain): Record<string, string> {\n if (domain === \"image\") return IMAGE_MODEL_MAP;\n if (domain === \"video\") return VIDEO_MODEL_MAP;\n return AUDIO_MODEL_MAP;\n}\n\nfunction toolPrefixForDomain(domain: ModelDomain): string {\n return domain === \"audio\" ? \"generate_music_\" : `generate_${domain}_`;\n}\n\n/**\n * Resolve a user-facing model name to an MCP tool name.\n *\n * Throws CliError with MODEL_NOT_SUPPORTED if the model is not recognized.\n */\nexport function resolveToolName(model: string, domain: ModelDomain): string {\n const map = modelMapForDomain(domain);\n const tool = map[model];\n if (!tool) {\n logFeatureStep(\"model_map\", \"model.resolve_failed\", { domain, model }, \"warn\");\n const available = Object.keys(map).join(\", \");\n throw new CliError(\n ErrorCode.MODEL_NOT_SUPPORTED,\n `Unknown ${domain} model: \"${model}\". Available: ${available}`,\n {\n category: \"validation\",\n retryable: false,\n hint: `Run oiioii inspect models --domain ${domain} --json to list active models.`,\n domain,\n model,\n },\n );\n }\n logFeatureStep(\"model_map\", \"model.resolved\", { domain, model, tool });\n return tool;\n}\n\n/**\n * List available models for a domain.\n */\nexport function listModels(domain: ModelDomain): string[] {\n const map = modelMapForDomain(domain);\n return Object.keys(map);\n}\n\n/** List model names together with their authoritative backend tool names. */\nexport function listModelEntries(domain: ModelDomain): Array<{ name: string; tool: string }> {\n const map = modelMapForDomain(domain);\n return Object.entries(map).map(([name, tool]) => ({ name, tool }));\n}\n\n/**\n * Return the preferred CLI name for a backend tool.\n * Known tools use the first registered (canonical) alias. Newly deployed tools\n * remain visible by using their exact suffix, without requiring a CLI release.\n */\nexport function modelNameForTool(tool: string, domain: ModelDomain): string | undefined {\n const prefix = toolPrefixForDomain(domain);\n if (!tool.startsWith(prefix) || tool.length === prefix.length) return undefined;\n const known = listModelEntries(domain).find((entry) => entry.tool === tool);\n return known?.name ?? tool.slice(prefix.length);\n}\n","import { HogiModelCatalogClient, type BackendModelPricing } from \"../clients/hogi_model_catalog_client.js\";\nimport { CliError, ErrorCode } from \"../output/errors.js\";\nimport { modelNameForTool, resolveToolName, type ModelDomain } from \"./model_map.js\";\n\nexport interface ResolveModelSelectionOptions {\n domain: ModelDomain;\n model: string;\n modelId?: string;\n variant?: string;\n baseUrl: string;\n apiKey: string;\n fetch?: typeof globalThis.fetch;\n requireActiveCatalog?: boolean;\n}\n\nexport interface ResolvedModelSelection {\n key: string;\n toolName: string;\n modelId?: number;\n name?: string;\n variant?: string;\n catalog?: BackendModelPricing;\n catalogStatus?: \"ambiguous\" | \"exact\";\n}\n\nfunction normalizedModelToken(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]+/g, \"\");\n}\n\nfunction pricingMatchesNamedModel(pricing: BackendModelPricing, model: string): boolean {\n const domain = domainForPricing(pricing);\n if (!domain) return false;\n const requested = normalizedModelToken(model);\n const catalogKey = modelNameForTool(pricing.mcp_method_name, domain);\n const aliases = [\n pricing.name,\n catalogKey,\n catalogKey && pricing.model ? `${catalogKey}${pricing.model}` : undefined,\n ].filter((value): value is string => typeof value === \"string\");\n return aliases.some((value) => normalizedModelToken(value) === requested);\n}\n\nexport function domainForPricing(pricing: BackendModelPricing): ModelDomain | undefined {\n if (pricing.mcp_method_name.startsWith(\"generate_image_\")) return \"image\";\n if (pricing.mcp_method_name.startsWith(\"generate_video_\")) return \"video\";\n if (pricing.mcp_method_name.startsWith(\"generate_music_\")) return \"audio\";\n return undefined;\n}\n\nfunction preferredCatalogRow(candidates: BackendModelPricing[]): BackendModelPricing | undefined {\n return [...candidates].sort((left, right) => (\n left.sort_order - right.sort_order || left.id - right.id\n ))[0];\n}\n\nexport function selectionFromCatalogPricing(\n pricing: BackendModelPricing,\n expectedDomain?: ModelDomain,\n): ResolvedModelSelection {\n const domain = domainForPricing(pricing);\n if (!domain || (expectedDomain && domain !== expectedDomain)) {\n throw new CliError(\n ErrorCode.MODEL_NOT_SUPPORTED,\n `Model ID ${pricing.id} belongs to ${domain ?? \"an unsupported\"} domain${expectedDomain ? `, not ${expectedDomain}` : \"\"}.`,\n {\n category: \"validation\",\n retryable: false,\n model_id: pricing.id,\n ...(expectedDomain ? { expected_domain: expectedDomain } : {}),\n },\n );\n }\n const key = modelNameForTool(pricing.mcp_method_name, domain);\n if (!key) {\n throw new CliError(ErrorCode.MODEL_NOT_SUPPORTED, `Model ID ${pricing.id} is not supported by ${domain} generation.`, {\n category: \"validation\",\n retryable: false,\n model_id: pricing.id,\n });\n }\n return {\n key,\n toolName: pricing.mcp_method_name,\n modelId: pricing.id,\n name: pricing.name ?? pricing.model ?? key,\n ...(pricing.model ? { variant: pricing.model } : {}),\n catalog: pricing,\n catalogStatus: \"exact\",\n };\n}\n\nexport function selectCatalogPricing(\n catalog: BackendModelPricing[],\n selector: { modelId?: string; model?: string; variant?: string },\n): BackendModelPricing {\n if (selector.modelId && (selector.model || selector.variant)) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, \"Use --model-id or --model [--variant], not both.\");\n }\n if (selector.variant && !selector.model) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, \"--variant requires --model.\");\n }\n if (!selector.modelId && !selector.model) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, \"Provide --model-id or --model [--variant].\");\n }\n if (selector.modelId) {\n const modelId = parseModelId(selector.modelId);\n const selected = catalog.find((pricing) => pricing.id === modelId);\n if (selected) return selected;\n throw new CliError(ErrorCode.MODEL_NOT_SUPPORTED, `Model ID ${modelId} is not present in the active backend model catalog.`, {\n category: \"validation\",\n retryable: false,\n hint: \"Run oiioii inspect models --json and select an active model_id.\",\n model_id: modelId,\n });\n }\n\n const named = catalog.filter((pricing) => pricingMatchesNamedModel(pricing, selector.model!));\n const candidates = selector.variant\n ? named.filter((pricing) => pricing.model === selector.variant)\n : named;\n const selected = preferredCatalogRow(candidates);\n if (selected) return selected;\n throw new CliError(\n ErrorCode.MODEL_NOT_SUPPORTED,\n selector.variant\n ? `Model ${selector.model} does not have variant \"${selector.variant}\" in the active backend model catalog.`\n : `Model ${selector.model} is not present in the active backend model catalog.`,\n {\n category: \"validation\",\n retryable: false,\n hint: \"Run oiioii inspect models --json and select an active model.\",\n model: selector.model,\n ...(selector.variant ? { variant: selector.variant } : {}),\n },\n );\n}\n\nfunction parseModelId(value: string): number {\n if (!/^\\d+$/.test(value)) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, `Invalid model ID: \"${value}\". Expected a positive integer from inspect models.`);\n }\n const id = Number(value);\n if (!Number.isSafeInteger(id) || id <= 0) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, `Invalid model ID: \"${value}\". Expected a positive integer from inspect models.`);\n }\n return id;\n}\n\nexport async function resolveModelSelection(options: ResolveModelSelectionOptions): Promise<ResolvedModelSelection> {\n if (options.modelId && options.variant) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, \"Use either --model-id or --variant, not both.\");\n }\n\n if (!options.modelId && !options.variant) {\n const baseSelection = {\n key: options.model,\n toolName: resolveToolName(options.model, options.domain),\n };\n if (!options.requireActiveCatalog) return baseSelection;\n\n const catalog = await new HogiModelCatalogClient({\n baseUrl: options.baseUrl,\n apiKey: options.apiKey,\n ...(options.fetch ? { fetch: options.fetch } : {}),\n }).listModels();\n const candidates = catalog.filter((pricing) => (\n domainForPricing(pricing) === options.domain\n && (pricing.mcp_method_name === baseSelection.toolName || pricingMatchesNamedModel(pricing, options.model))\n ));\n if (candidates.length === 0) {\n throw new CliError(\n ErrorCode.MODEL_NOT_SUPPORTED,\n `Model ${options.model} is not present in the active backend model catalog.`,\n {\n category: \"validation\",\n retryable: false,\n hint: \"Run oiioii inspect models --json and select an active model.\",\n model: options.model,\n },\n );\n }\n const selected = candidates.find((pricing) => pricing.mcp_method_name === baseSelection.toolName && pricing.model === null)\n ?? preferredCatalogRow(candidates);\n if (!selected) return { ...baseSelection, catalogStatus: \"ambiguous\" };\n return { ...selectionFromCatalogPricing(selected, options.domain), key: options.model };\n }\n\n const catalog = await new HogiModelCatalogClient({\n baseUrl: options.baseUrl,\n apiKey: options.apiKey,\n ...(options.fetch ? { fetch: options.fetch } : {}),\n }).listModels();\n\n const selected = selectCatalogPricing(catalog, options.modelId\n ? { modelId: options.modelId }\n : { model: options.model, variant: options.variant });\n const selection = selectionFromCatalogPricing(selected, options.domain);\n return options.modelId ? selection : { ...selection, key: options.model };\n}\n\nexport function effectiveModelInputCapabilities(selection: ResolvedModelSelection): string[] {\n return [...new Set(selection.catalog?.input_capabilities ?? [])];\n}\n\nexport function resolveModelConstraintDefaults(\n selection: ResolvedModelSelection,\n fallback: { aspectRatio: string; resolution: string; duration?: number },\n): { aspectRatio: string; resolution: string; duration?: number } {\n const firstDuration = selection.catalog?.durations?.[0]?.trim();\n let duration = fallback.duration;\n if (firstDuration && /^\\d+(?:\\.\\d+)?$/.test(firstDuration)) {\n duration = Number(firstDuration);\n } else if (firstDuration) {\n const range = /^(\\d+(?:\\.\\d+)?)\\s*-\\s*(\\d+(?:\\.\\d+)?)$/.exec(firstDuration);\n if (range) duration = Number(range[1]);\n }\n return {\n aspectRatio: selection.catalog?.aspect_ratios[0] ?? fallback.aspectRatio,\n resolution: selection.catalog?.sizes[0] ?? fallback.resolution,\n ...(duration !== undefined ? { duration } : {}),\n };\n}\n\nfunction normalizeAspectRatio(value: string): string {\n const normalized = value.trim().toLowerCase();\n return normalized === \"adaptive\" ? \"auto\" : normalized;\n}\n\nexport function validateModelConstraints(\n selection: ResolvedModelSelection,\n params: { aspectRatio?: string; resolution?: string; duration?: number },\n): void {\n const catalog = selection.catalog;\n if (!catalog) return;\n\n if (params.aspectRatio && catalog.aspect_ratios.length > 0) {\n const requested = normalizeAspectRatio(params.aspectRatio);\n const supported = catalog.aspect_ratios.map(normalizeAspectRatio);\n if (!supported.includes(requested)) {\n throw new CliError(\n ErrorCode.MODEL_CONSTRAINT_VIOLATION,\n `${selection.name ?? selection.key} does not support aspect ratio ${params.aspectRatio}. Supported: ${catalog.aspect_ratios.join(\", \")}.`,\n {\n category: \"validation\",\n retryable: false,\n field: \"aspect_ratio\",\n received: params.aspectRatio,\n supported: catalog.aspect_ratios,\n },\n );\n }\n }\n\n if (params.resolution && catalog.sizes.length > 0) {\n const requested = params.resolution.trim().toLowerCase();\n if (!catalog.sizes.some((size) => size.trim().toLowerCase() === requested)) {\n throw new CliError(\n ErrorCode.MODEL_CONSTRAINT_VIOLATION,\n `${selection.name ?? selection.key} does not support resolution ${params.resolution}. Supported: ${catalog.sizes.join(\", \")}.`,\n {\n category: \"validation\",\n retryable: false,\n field: \"resolution\",\n received: params.resolution,\n supported: catalog.sizes,\n },\n );\n }\n }\n\n if (params.duration !== undefined && catalog.durations && catalog.durations.length > 0) {\n const supported = catalog.durations.some((entry) => {\n const value = entry.trim();\n if (/^\\d+(?:\\.\\d+)?$/.test(value)) return Number(value) === params.duration;\n const range = /^(\\d+(?:\\.\\d+)?)\\s*-\\s*(\\d+(?:\\.\\d+)?)$/.exec(value);\n return range !== null && params.duration! >= Number(range[1]) && params.duration! <= Number(range[2]);\n });\n if (!supported) {\n throw new CliError(\n ErrorCode.MODEL_CONSTRAINT_VIOLATION,\n `${selection.name ?? selection.key} does not support duration ${params.duration}s. Supported: ${[...new Set(catalog.durations)].join(\", \")}.`,\n {\n category: \"validation\",\n retryable: false,\n field: \"duration\",\n received: params.duration,\n supported: [...new Set(catalog.durations)],\n },\n );\n }\n }\n}\n\nexport function selectionSummary(selection: ResolvedModelSelection): {\n key: string;\n model_id?: number;\n name?: string;\n variant?: string;\n} {\n return {\n key: selection.key,\n ...(selection.modelId !== undefined ? { model_id: selection.modelId } : {}),\n ...(selection.name ? { name: selection.name } : {}),\n ...(selection.variant ? { variant: selection.variant } : {}),\n };\n}\n\n/** Reconstruct the exact model selector for task history and diagnostics. */\nexport function selectionCliArgs(selection: ResolvedModelSelection): string {\n if (selection.modelId !== undefined) return `--model-id ${selection.modelId}`;\n if (selection.variant) return `--model ${selection.key} --variant ${selection.variant}`;\n return `--model ${selection.key}`;\n}\n","/**\n * TaskStore — local task tracking for generation commands.\n *\n * Stores tasks in .oiioii/tasks.jsonl (one JSON object per line).\n * Each task keeps both a stable local ID and, after successful submission,\n * the authoritative backend async-task ID returned by Hogi.\n *\n * Status lifecycle: created → submitting → queued/running → succeeded | failed | cancelled\n */\n\nimport { readFileSync, writeFileSync, appendFileSync, mkdirSync, existsSync, chmodSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { resolveConfigDir } from \"../config/config_paths.js\";\nimport { logFeatureStep } from \"../logging/feature_logger.js\";\nimport { withFileLock } from \"./file_lock.js\";\n\n// ── Types ────────────────────────────────────────────────────────────\n\nexport type OiioiiTaskStatus =\n | \"created\"\n | \"submitting\"\n | \"queued\"\n | \"running\"\n | \"succeeded\"\n | \"failed\"\n | \"cancelled\";\n\nexport interface OiioiiTaskError {\n code: string;\n message: string;\n hint?: string;\n}\n\nexport interface OiioiiTask {\n id: string;\n backendTaskId?: string;\n backendAssetId?: string;\n backendBaseUrl?: string;\n mediaType?: \"image\" | \"video\" | \"audio\";\n workspaceId: string;\n command: string;\n toolName: string;\n inputArgs: Record<string, unknown>;\n status: OiioiiTaskStatus;\n resourceUris: string[];\n progress?: number;\n lastSyncedAt?: string;\n recordIds?: string[];\n error?: OiioiiTaskError;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface TaskStoreOptions {\n /** Override the config directory (for testing). Defaults to resolveConfigDir(). */\n configDir?: string;\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\n/** Generate a local task ID: \"task_\" + 16 hex chars. */\nexport function generateTaskId(): string {\n return \"task_\" + randomBytes(8).toString(\"hex\");\n}\n\n// ── Store ────────────────────────────────────────────────────────────\n\nexport class TaskStore {\n private readonly configDir: string;\n private readonly tasksPath: string;\n\n constructor(options?: TaskStoreOptions) {\n this.configDir = options?.configDir ?? resolveConfigDir();\n this.tasksPath = join(this.configDir, \"tasks.jsonl\");\n }\n\n /** Return the local state directory shared by tasks and preview bundles. */\n getConfigDir(): string {\n return this.configDir;\n }\n\n /**\n * Create a new task record. Appends to tasks.jsonl.\n * Returns the created task with generated ID and timestamps.\n */\n create(params: {\n workspaceId: string;\n command: string;\n toolName: string;\n inputArgs: Record<string, unknown>;\n }): OiioiiTask {\n const now = new Date().toISOString();\n const task: OiioiiTask = {\n id: generateTaskId(),\n workspaceId: params.workspaceId,\n command: params.command,\n toolName: params.toolName,\n inputArgs: params.inputArgs,\n status: \"created\",\n resourceUris: [],\n createdAt: now,\n updatedAt: now,\n };\n\n this._ensureDir();\n withFileLock(`${this.tasksPath}.lock`, () => {\n appendFileSync(this.tasksPath, JSON.stringify(task) + \"\\n\", { encoding: \"utf-8\", mode: 0o600 });\n chmodSync(this.tasksPath, 0o600);\n });\n logFeatureStep(\"task_store\", \"task.created\", { task_id: task.id, tool: task.toolName });\n return task;\n }\n\n /**\n * Update an existing task's status and/or fields.\n * Re-writes the entire file (tasks.jsonl is typically small).\n */\n update(\n taskId: string,\n updates: Partial<Pick<OiioiiTask,\n \"status\" | \"resourceUris\" | \"recordIds\" | \"backendTaskId\" | \"backendAssetId\"\n | \"backendBaseUrl\" | \"mediaType\" | \"progress\" | \"lastSyncedAt\">> & { error?: OiioiiTaskError | null },\n ): OiioiiTask | undefined {\n this._ensureDir();\n const task = withFileLock(`${this.tasksPath}.lock`, () => {\n const tasks = this._readAll();\n const idx = tasks.findIndex((item) => item.id === taskId);\n if (idx === -1) return undefined;\n\n const found = tasks[idx]!;\n if (updates.status !== undefined) found.status = updates.status;\n if (updates.resourceUris !== undefined) found.resourceUris = updates.resourceUris;\n if (updates.recordIds !== undefined) found.recordIds = updates.recordIds;\n if (updates.backendTaskId !== undefined) found.backendTaskId = updates.backendTaskId;\n if (updates.backendAssetId !== undefined) found.backendAssetId = updates.backendAssetId;\n if (updates.backendBaseUrl !== undefined) found.backendBaseUrl = updates.backendBaseUrl;\n if (updates.mediaType !== undefined) found.mediaType = updates.mediaType;\n if (updates.progress !== undefined) found.progress = updates.progress;\n if (updates.lastSyncedAt !== undefined) found.lastSyncedAt = updates.lastSyncedAt;\n if (updates.error === null) delete found.error;\n else if (updates.error !== undefined) found.error = updates.error;\n found.updatedAt = new Date().toISOString();\n this._writeAll(tasks);\n return found;\n });\n if (!task) {\n logFeatureStep(\"task_store\", \"task.update_skipped\", { task_id: taskId, reason: \"not_found\" }, \"warn\");\n return undefined;\n }\n logFeatureStep(\"task_store\", \"task.updated\", { task_id: taskId, status: task.status });\n return task;\n }\n\n /**\n * Get a task by ID.\n */\n get(taskId: string): OiioiiTask | undefined {\n const tasks = this._readAll();\n const task = tasks.find((t) => t.id === taskId);\n logFeatureStep(\"task_store\", \"task.read\", { task_id: taskId, found: task !== undefined });\n return task;\n }\n\n /** Resolve either the local CLI ID or a cached backend async-task ID. */\n getByAnyId(taskId: string): OiioiiTask | undefined {\n const tasks = this._readAll();\n const task = tasks.find((item) => item.id === taskId || item.backendTaskId === taskId);\n logFeatureStep(\"task_store\", \"task.read_by_any_id\", {\n task_id: taskId,\n found: task !== undefined,\n matched_by: task?.id === taskId ? \"local\" : task ? \"backend\" : \"none\",\n });\n return task;\n }\n\n /**\n * List all tasks, most recent first.\n */\n list(limit?: number): OiioiiTask[] {\n const tasks = this._readAll();\n tasks.reverse(); // Most recent first (appended last)\n if (limit !== undefined && limit > 0) {\n const result = tasks.slice(0, limit);\n logFeatureStep(\"task_store\", \"task.listed\", { count: result.length, limit });\n return result;\n }\n logFeatureStep(\"task_store\", \"task.listed\", { count: tasks.length });\n return tasks;\n }\n\n /** Internal: read all tasks from the JSONL file. */\n private _readAll(): OiioiiTask[] {\n if (!existsSync(this.tasksPath)) return [];\n try {\n const raw = readFileSync(this.tasksPath, \"utf-8\");\n const lines = raw.trim().split(\"\\n\").filter((l) => l.trim() !== \"\");\n return lines.map((line) => JSON.parse(line) as OiioiiTask);\n } catch {\n return [];\n }\n }\n\n /** Internal: rewrite entire file with updated tasks. */\n private _writeAll(tasks: OiioiiTask[]): void {\n this._ensureDir();\n const content = tasks.map((t) => JSON.stringify(t)).join(\"\\n\") + \"\\n\";\n writeFileSync(this.tasksPath, content, { encoding: \"utf-8\", mode: 0o600 });\n chmodSync(this.tasksPath, 0o600);\n }\n\n /** Ensure the parent directory exists. */\n private _ensureDir(): void {\n const dir = dirname(this.tasksPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n chmodSync(dir, 0o700);\n }\n}\n","/**\n * PreviewStore — generates and manages preview bundles.\n *\n * Each generation command produces a preview bundle under\n * .oiioii/previews/<bundle_id>/ containing:\n * - manifest.json — schema version, task/workspace/tool metadata, resources\n * - summary.json — human + agent summaries, status, next commands\n * - artifacts/ — optional downloaded thumbnails/posters\n *\n * Bundles are indexed by an in-memory scan of the previews directory.\n * The PreviewStore is intentionally file-based and stateless between calls.\n */\n\nimport { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync, chmodSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { resolveConfigDir } from \"../config/config_paths.js\";\nimport { logFeatureStep } from \"../logging/feature_logger.js\";\n\n// ── Types ────────────────────────────────────────────────────────────\n\nexport interface PreviewResource {\n uri: string;\n mime_type?: string;\n record_id?: string;\n}\n\nexport interface PreviewManifest {\n schema_version: number;\n bundle_id: string;\n created_at: string;\n created_sequence: number;\n project_id?: string;\n workspace_id: string;\n task_id: string;\n command: string;\n tool: string;\n input_args: Record<string, unknown>;\n resources: PreviewResource[];\n}\n\nexport interface PreviewNextCommand {\n command: string;\n description?: string;\n}\n\nexport interface PreviewSummary {\n title: string;\n status: \"succeeded\" | \"failed\";\n human_summary: string;\n agent_summary: string;\n next: PreviewNextCommand[];\n}\n\nexport interface CreateBundleParams {\n taskId: string;\n workspaceId: string;\n command: string;\n tool: string;\n inputArgs: Record<string, unknown>;\n resources: PreviewResource[];\n status: \"succeeded\" | \"failed\";\n error?: { code: string; message: string };\n projectId?: string;\n}\n\nexport interface BundleResult {\n bundleId: string;\n bundleDir: string;\n manifest: PreviewManifest;\n summary: PreviewSummary;\n}\n\nexport interface PreviewStoreOptions {\n /** Override the config directory (for testing). Defaults to resolveConfigDir(). */\n configDir?: string;\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\n/** Generate a preview bundle ID: \"preview_\" + 16 hex chars. */\nexport function generateBundleId(): string {\n return \"preview_\" + randomBytes(8).toString(\"hex\");\n}\n\n/**\n * Derive a human-friendly title from the tool name.\n * \"generate_image_seedream45\" → \"Seedream45 image generation\"\n * \"generate_video_seedance20\" → \"Seedance20 video generation\"\n */\nfunction deriveTitle(tool: string): string {\n const parts = tool.replace(/^generate_/, \"\").split(\"_\");\n // parts: [\"image\", \"seedream45\"] or [\"video\", \"seedance20\"]\n const domain = parts[0] ?? \"generation\";\n const modelRaw = parts.slice(1).join(\"_\");\n const model = modelRaw.charAt(0).toUpperCase() + modelRaw.slice(1);\n return `${model} ${domain} generation`;\n}\n\n/**\n * Build next commands based on resources and domain.\n */\nfunction buildNextCommands(resources: PreviewResource[]): PreviewNextCommand[] {\n const next: PreviewNextCommand[] = [];\n for (const r of resources) {\n next.push({\n command: `oiioii record get ${r.uri} --json`,\n description: \"Get generation record details\",\n });\n\n if (r.uri.startsWith(\"hogi://image/\")) {\n next.push({\n command: `oiioii video image --image ${r.uri} --prompt '<motion>' --json`,\n description: \"Create video from this image\",\n });\n }\n }\n\n return next;\n}\n\n// ── Store ────────────────────────────────────────────────────────────\n\nlet nextPreviewSequence = 0;\n\nfunction compareBundlesMostRecentFirst(a: PreviewManifest, b: PreviewManifest): number {\n const createdAt = b.created_at.localeCompare(a.created_at);\n if (createdAt !== 0) return createdAt;\n\n const aSequence = typeof a.created_sequence === \"number\" ? a.created_sequence : 0;\n const bSequence = typeof b.created_sequence === \"number\" ? b.created_sequence : 0;\n const sequence = bSequence - aSequence;\n if (sequence !== 0) return sequence;\n\n return b.bundle_id.localeCompare(a.bundle_id);\n}\n\nexport class PreviewStore {\n private readonly configDir: string;\n private readonly previewsDir: string;\n\n constructor(options?: PreviewStoreOptions) {\n this.configDir = options?.configDir ?? resolveConfigDir();\n this.previewsDir = join(this.configDir, \"previews\");\n }\n\n /** Return the local state directory shared by previews and task history. */\n getConfigDir(): string {\n return this.configDir;\n }\n\n /**\n * Create a new preview bundle. Writes manifest.json, summary.json,\n * and creates an artifacts/ subdirectory.\n */\n createBundle(params: CreateBundleParams): BundleResult {\n const bundleId = generateBundleId();\n const bundleDir = join(this.previewsDir, bundleId);\n\n // Ensure directories\n mkdirSync(bundleDir, { recursive: true, mode: 0o700 });\n mkdirSync(join(bundleDir, \"artifacts\"), { recursive: true, mode: 0o700 });\n chmodSync(this.configDir, 0o700);\n chmodSync(this.previewsDir, 0o700);\n chmodSync(bundleDir, 0o700);\n chmodSync(join(bundleDir, \"artifacts\"), 0o700);\n\n const now = new Date().toISOString();\n\n // Build manifest\n const manifest: PreviewManifest = {\n schema_version: 1,\n bundle_id: bundleId,\n created_at: now,\n created_sequence: ++nextPreviewSequence,\n ...(params.projectId ? { project_id: params.projectId } : {}),\n workspace_id: params.workspaceId,\n task_id: params.taskId,\n command: params.command,\n tool: params.tool,\n input_args: params.inputArgs,\n resources: params.resources,\n };\n\n // Build summary\n const resourceCount = params.resources.length;\n const mediaType = params.tool.includes(\"video\")\n ? \"video\"\n : params.tool.includes(\"music\") || params.tool.includes(\"audio\")\n ? \"audio\"\n : \"image\";\n\n let humanSummary: string;\n let agentSummary: string;\n const nextCommands: PreviewNextCommand[] = [];\n\n if (params.status === \"succeeded\") {\n const sizeInfo = params.inputArgs.size ? ` ${params.inputArgs.size}` : \"\";\n humanSummary = `Generated ${resourceCount}${sizeInfo} ${mediaType}${resourceCount !== 1 ? \"s\" : \"\"}.`;\n agentSummary = params.resources.length > 0\n ? `Use \\`oiioii record get ${params.resources[0]!.uri} --json\\` for details.`\n : \"No resources returned.\";\n nextCommands.push(...buildNextCommands(params.resources));\n } else {\n const errMsg = params.error?.message ?? \"unknown error\";\n humanSummary = `Generation failed: ${errMsg}`;\n agentSummary = `Task ${params.taskId} failed with ${params.error?.code ?? \"UNKNOWN\"}. Check task status or retry.`;\n nextCommands.push({\n command: `oiioii task status ${params.taskId} --json`,\n description: \"Check task details\",\n });\n }\n\n const summary: PreviewSummary = {\n title: deriveTitle(params.tool),\n status: params.status,\n human_summary: humanSummary,\n agent_summary: agentSummary,\n next: nextCommands,\n };\n\n // Write files\n const manifestPath = join(bundleDir, \"manifest.json\");\n const summaryPath = join(bundleDir, \"summary.json\");\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + \"\\n\", { encoding: \"utf-8\", mode: 0o600 });\n writeFileSync(summaryPath, JSON.stringify(summary, null, 2) + \"\\n\", { encoding: \"utf-8\", mode: 0o600 });\n chmodSync(manifestPath, 0o600);\n chmodSync(summaryPath, 0o600);\n logFeatureStep(\"preview_store\", \"preview.created\", {\n bundle_id: bundleId,\n task_id: params.taskId,\n status: params.status,\n resource_count: params.resources.length,\n });\n\n return { bundleId, bundleDir, manifest, summary };\n }\n\n /**\n * Get a bundle by its bundle ID.\n */\n getBundle(bundleId: string): { manifest: PreviewManifest; summary: PreviewSummary; bundleDir: string } | undefined {\n const bundleDir = join(this.previewsDir, bundleId);\n const manifestPath = join(bundleDir, \"manifest.json\");\n const summaryPath = join(bundleDir, \"summary.json\");\n\n if (!existsSync(manifestPath) || !existsSync(summaryPath)) {\n logFeatureStep(\"preview_store\", \"preview.read\", { bundle_id: bundleId, found: false });\n return undefined;\n }\n\n try {\n const manifest: PreviewManifest = JSON.parse(readFileSync(manifestPath, \"utf-8\"));\n const summary: PreviewSummary = JSON.parse(readFileSync(summaryPath, \"utf-8\"));\n logFeatureStep(\"preview_store\", \"preview.read\", { bundle_id: bundleId, found: true });\n return { manifest, summary, bundleDir };\n } catch {\n logFeatureStep(\"preview_store\", \"preview.read\", { bundle_id: bundleId, found: false, reason: \"invalid\" }, \"warn\");\n return undefined;\n }\n }\n\n /**\n * Find a bundle by the task ID stored in its manifest.\n */\n getBundleByTaskId(taskId: string): { manifest: PreviewManifest; summary: PreviewSummary; bundleDir: string } | undefined {\n const bundles = this._scanBundles();\n for (const b of bundles) {\n if (b.task_id === taskId) {\n return this.getBundle(b.bundle_id);\n }\n }\n return undefined;\n }\n\n /**\n * Get the most recently created bundle.\n */\n getLatest(): { manifest: PreviewManifest; summary: PreviewSummary; bundleDir: string } | undefined {\n const bundles = this._scanBundles();\n if (bundles.length === 0) return undefined;\n\n bundles.sort(compareBundlesMostRecentFirst);\n return this.getBundle(bundles[0]!.bundle_id);\n }\n\n /**\n * List all bundles as lightweight manifest summaries (most recent first).\n */\n listBundles(limit?: number): PreviewManifest[] {\n const bundles = this._scanBundles();\n bundles.sort(compareBundlesMostRecentFirst);\n if (limit !== undefined && limit > 0) {\n return bundles.slice(0, limit);\n }\n return bundles;\n }\n\n /**\n * Scan the previews directory and read all manifest.json files.\n */\n private _scanBundles(): PreviewManifest[] {\n if (!existsSync(this.previewsDir)) return [];\n\n const entries = readdirSync(this.previewsDir, { withFileTypes: true });\n const manifests: PreviewManifest[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const manifestPath = join(this.previewsDir, entry.name, \"manifest.json\");\n if (!existsSync(manifestPath)) continue;\n\n try {\n const manifest: PreviewManifest = JSON.parse(readFileSync(manifestPath, \"utf-8\"));\n manifests.push(manifest);\n } catch {\n // Skip corrupted bundles\n }\n }\n\n return manifests;\n }\n}\n","import { logFeatureStep } from \"../logging/feature_logger.js\";\nimport { PreviewStore, type PreviewResource } from \"./preview_store.js\";\nimport { TaskStore, type OiioiiTask } from \"./task_store.js\";\n\nexport interface GenerationPreviewParams {\n taskStore: TaskStore;\n previewStore?: PreviewStore;\n task: OiioiiTask;\n resources: PreviewResource[];\n status: \"succeeded\" | \"failed\";\n error?: { code: string; message: string };\n}\n\nexport interface GenerationPreviewWriteFailure {\n code: \"PREVIEW_BUNDLE_WRITE_FAILED\";\n message: string;\n}\n\n/**\n * Persist the agent-readable projection of a terminal generation task.\n * Preview persistence is best-effort: losing the local projection must never\n * change the authoritative generation result.\n */\nexport function createGenerationPreview(\n params: GenerationPreviewParams,\n): GenerationPreviewWriteFailure | undefined {\n const store = params.previewStore ?? new PreviewStore({ configDir: params.taskStore.getConfigDir() });\n\n try {\n store.createBundle({\n taskId: params.task.id,\n workspaceId: params.task.workspaceId,\n command: params.task.command,\n tool: params.task.toolName,\n inputArgs: params.task.inputArgs,\n resources: params.resources,\n status: params.status,\n ...(params.error ? { error: params.error } : {}),\n });\n return undefined;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logFeatureStep(\"preview_store\", \"preview.create_failed\", {\n task_id: params.task.id,\n status: params.status,\n }, \"warn\");\n return {\n code: \"PREVIEW_BUNDLE_WRITE_FAILED\",\n message: `Generation completed, but the local preview bundle could not be written: ${message}`,\n };\n }\n}\n","import {\n HogiAsyncGenerationClient,\n type AsyncGenerationSubmission,\n type AsyncGenerationTask,\n type AsyncMediaType,\n type BackendAsyncTaskStatus,\n} from \"../clients/hogi_async_generation_client.js\";\nimport { CliError, ErrorCode } from \"../output/errors.js\";\nimport { logFeatureStep } from \"../logging/feature_logger.js\";\nimport { createGenerationPreview, type GenerationPreviewWriteFailure } from \"./generation_preview.js\";\nimport { PreviewStore } from \"./preview_store.js\";\nimport { TaskStore, type OiioiiTask, type OiioiiTaskStatus } from \"./task_store.js\";\n\nconst URI_PREFIX: Record<AsyncMediaType, string> = {\n image: \"hogi://image/\",\n video: \"hogi://video/\",\n audio: \"hogi://audio/\",\n};\n\nconst MIME_TYPE: Record<AsyncMediaType, string> = {\n image: \"image/jpeg\",\n video: \"video/mp4\",\n audio: \"audio/mpeg\",\n};\n\nexport function localStatusForBackend(status: BackendAsyncTaskStatus): OiioiiTaskStatus {\n if (status === \"pending\") return \"queued\";\n if (status === \"processing\") return \"running\";\n return status;\n}\n\nexport function isTerminalTask(task: OiioiiTask): boolean {\n return task.status === \"succeeded\" || task.status === \"failed\" || task.status === \"cancelled\";\n}\n\nfunction assertTaskOutputUris(task: AsyncGenerationTask): string[] {\n const prefix = URI_PREFIX[task.mediaType];\n const mismatched = task.outputUris.find((uri) => !uri.startsWith(prefix));\n if (mismatched) {\n throw new CliError(ErrorCode.SERVER_ERROR, `Backend ${task.mediaType} task returned an incompatible resource URI`, {\n task_id: task.taskId,\n uri: mismatched,\n });\n }\n if (task.status === \"succeeded\" && task.outputUris.length === 0) {\n throw new CliError(ErrorCode.SERVER_ERROR, `Backend task ${task.taskId} succeeded without an output URI`);\n }\n return task.outputUris;\n}\n\nfunction persistTerminalPreview(params: {\n taskStore: TaskStore;\n previewStore?: PreviewStore;\n task: OiioiiTask;\n}): GenerationPreviewWriteFailure | undefined {\n const previewStore = params.previewStore ?? new PreviewStore({ configDir: params.taskStore.getConfigDir() });\n if (previewStore.getBundleByTaskId(params.task.id)) return undefined;\n const failed = params.task.status === \"failed\" || params.task.status === \"cancelled\";\n return createGenerationPreview({\n taskStore: params.taskStore,\n previewStore,\n task: params.task,\n resources: params.task.resourceUris.map((uri) => ({\n uri,\n mime_type: params.task.mediaType ? MIME_TYPE[params.task.mediaType] : undefined,\n })),\n status: failed ? \"failed\" : \"succeeded\",\n ...(failed ? {\n error: params.task.error ?? {\n code: params.task.status === \"cancelled\" ? \"GENERATION_CANCELLED\" : ErrorCode.GENERATION_FAILED,\n message: params.task.status === \"cancelled\" ? \"Generation was cancelled\" : \"Generation failed\",\n },\n } : {}),\n });\n}\n\nexport async function submitAsyncGeneration(params: {\n client: HogiAsyncGenerationClient;\n taskStore: TaskStore;\n previewStore?: PreviewStore;\n task: OiioiiTask;\n mediaType: AsyncMediaType;\n prompt: string;\n model?: string;\n backendBaseUrl: string;\n input: Record<string, unknown>;\n}): Promise<{ submission: AsyncGenerationSubmission; task: OiioiiTask; previewWarning?: GenerationPreviewWriteFailure }> {\n const submission = await params.client.submit({\n workspaceId: params.task.workspaceId,\n mediaType: params.mediaType,\n prompt: params.prompt,\n mcpMethodName: params.task.toolName,\n ...(params.model ? { model: params.model } : {}),\n input: params.input,\n idempotencyKey: params.task.id,\n });\n const updated = params.taskStore.update(params.task.id, {\n backendTaskId: submission.taskId,\n backendAssetId: submission.assetId,\n backendBaseUrl: params.backendBaseUrl.replace(/\\/+$/, \"\"),\n mediaType: submission.mediaType,\n // A terminal submit response is only a summary (it has no outputs/error).\n // Keep the local record non-terminal until the mandatory query projects\n // the complete authoritative terminal payload.\n status: submission.status === \"succeeded\" || submission.status === \"failed\" || submission.status === \"cancelled\"\n ? \"running\"\n : localStatusForBackend(submission.status),\n progress: 0,\n lastSyncedAt: new Date().toISOString(),\n error: null,\n });\n if (!updated) throw new CliError(ErrorCode.SERVER_ERROR, `Local task disappeared after submission: ${params.task.id}`);\n logFeatureStep(\"async_generation\", \"submission.cached\", {\n local_task_id: updated.id,\n backend_task_id: submission.taskId,\n status: updated.status,\n });\n const submitWasTerminal = submission.status === \"succeeded\" || submission.status === \"failed\" || submission.status === \"cancelled\";\n if (!submitWasTerminal) return { submission, task: updated };\n const synced = await syncAsyncGenerationTask({\n client: params.client,\n taskStore: params.taskStore,\n previewStore: params.previewStore,\n task: updated,\n });\n if (synced.task.status === \"failed\" || synced.task.status === \"cancelled\") {\n throw new CliError(\n ErrorCode.GENERATION_FAILED,\n synced.task.error?.message ?? `Backend generation task ${synced.task.backendTaskId} ${synced.task.status}`,\n {\n backend_task_id: synced.task.backendTaskId,\n backend_status: synced.task.status,\n ...(synced.task.error ? { backend_error: synced.task.error } : {}),\n },\n );\n }\n return { submission, ...synced };\n}\n\nexport async function syncAsyncGenerationTask(params: {\n client: HogiAsyncGenerationClient;\n taskStore: TaskStore;\n previewStore?: PreviewStore;\n task: OiioiiTask;\n}): Promise<{ task: OiioiiTask; previewWarning?: GenerationPreviewWriteFailure }> {\n if (!params.task.backendTaskId) {\n if (isTerminalTask(params.task)) return { task: params.task };\n throw new CliError(ErrorCode.TASK_NOT_FOUND, `Task ${params.task.id} has no cached backend async-task ID.`);\n }\n const backend = await params.client.query(params.task.workspaceId, params.task.backendTaskId);\n if (params.task.mediaType && params.task.mediaType !== backend.mediaType) {\n throw new CliError(ErrorCode.SERVER_ERROR, \"Backend task media type does not match the cached local task\", {\n task_id: backend.taskId,\n cached_media_type: params.task.mediaType,\n backend_media_type: backend.mediaType,\n });\n }\n const resourceUris = assertTaskOutputUris(backend);\n const updated = params.taskStore.update(params.task.id, {\n backendAssetId: backend.assetId,\n mediaType: backend.mediaType,\n status: localStatusForBackend(backend.status),\n progress: backend.progress,\n resourceUris,\n lastSyncedAt: new Date().toISOString(),\n error: backend.error,\n });\n if (!updated) throw new CliError(ErrorCode.SERVER_ERROR, `Local task disappeared during synchronization: ${params.task.id}`);\n logFeatureStep(\"async_generation\", \"task.cache_synchronized\", {\n local_task_id: updated.id,\n backend_task_id: updated.backendTaskId,\n status: updated.status,\n progress: updated.progress,\n output_count: updated.resourceUris.length,\n });\n if (!isTerminalTask(updated)) return { task: updated };\n const previewWarning = persistTerminalPreview({\n taskStore: params.taskStore,\n previewStore: params.previewStore,\n task: updated,\n });\n logFeatureStep(\"async_generation\", \"task.terminal_projected\", {\n local_task_id: updated.id,\n backend_task_id: updated.backendTaskId,\n status: updated.status,\n preview_warning: previewWarning !== undefined,\n });\n return { task: updated, ...(previewWarning ? { previewWarning } : {}) };\n}\n","import { CliError, ErrorCode } from \"../output/errors.js\";\n\nexport const VIDEO_GENERATE_MODES = [\n \"text2Video\",\n \"firstframe2Video\",\n \"endframe2Video\",\n \"frame2Video\",\n \"image2Video\",\n \"omni2Video\",\n] as const;\n\nexport type VideoGenerateMode = typeof VIDEO_GENERATE_MODES[number];\nexport type VideoGenerateModeOption = VideoGenerateMode | \"auto\";\n\nexport interface VideoReferences {\n images: string[];\n videos: string[];\n audios: string[];\n}\n\ninterface ReferenceField {\n name: \"imageUrl\" | \"images\" | \"videoUrl\" | \"audioUrl\";\n max?: number;\n single?: boolean;\n}\n\ninterface VideoToolContract {\n fields: {\n image?: ReferenceField;\n video?: ReferenceField;\n audio?: ReferenceField;\n };\n modes?: readonly VideoGenerateMode[];\n totalMax?: number;\n audioRequiresVisual?: boolean;\n}\n\nexport interface VideoReferenceMediaSupport {\n image: boolean;\n video: boolean;\n audio: boolean;\n}\n\nconst IMAGE_URL = (max?: number, single = false): ReferenceField => ({ name: \"imageUrl\", max, single });\nconst IMAGES = (max?: number): ReferenceField => ({ name: \"images\", max });\nconst VIDEO_URL = (max?: number, single = false): ReferenceField => ({ name: \"videoUrl\", max, single });\nconst AUDIO_URL = (max?: number): ReferenceField => ({ name: \"audioUrl\", max });\n\nconst TEXT_FIRST_FRAME = [\"text2Video\", \"firstframe2Video\"] as const;\nconst TEXT_IMAGE_OMNI = [\"text2Video\", \"image2Video\", \"omni2Video\"] as const;\nconst STANDARD_OMNI = [\"text2Video\", \"firstframe2Video\", \"frame2Video\", \"image2Video\", \"omni2Video\"] as const;\n\nfunction contractForWan(version: string | undefined): VideoToolContract {\n if (version === \"2.7\") {\n return {\n fields: { image: IMAGE_URL(5), video: VIDEO_URL(1, true) },\n modes: STANDARD_OMNI,\n totalMax: 5,\n };\n }\n return {\n fields: { image: IMAGE_URL(10), video: VIDEO_URL(5), audio: AUDIO_URL(5) },\n modes: STANDARD_OMNI,\n };\n}\n\nfunction contractForKling(version: string | undefined): VideoToolContract {\n if (version?.toLowerCase() === \"kling-v3-omni\") {\n return {\n fields: { image: IMAGES(), video: VIDEO_URL() },\n modes: STANDARD_OMNI,\n };\n }\n return {\n fields: { image: IMAGES() },\n modes: version === \"2.6\" ? TEXT_FIRST_FRAME : [\"text2Video\", \"firstframe2Video\", \"frame2Video\"],\n };\n}\n\nfunction contractForVidu(version: string | undefined): VideoToolContract {\n if (version === \"viduQ3Ref\" || version === \"viduQ3MixRef\" || version === \"viduQ3Ad\") {\n return {\n fields: { image: IMAGE_URL(7) },\n modes: [\"image2Video\", \"omni2Video\"],\n };\n }\n if (version === \"viduQ3\") {\n return {\n fields: { image: IMAGE_URL(7) },\n modes: [\"text2Video\", \"firstframe2Video\", \"image2Video\", \"omni2Video\"],\n };\n }\n return {\n fields: { image: IMAGE_URL(7) },\n modes: STANDARD_OMNI,\n };\n}\n\n/**\n * Model-specific reference contract mirrored from hogi-monorepo-4 backend\n * tool schemas. Unknown tools fail closed for reference inputs.\n */\nexport function getVideoToolContract(toolName: string, version?: string): VideoToolContract | undefined {\n if (toolName === \"generate_video_wan\") return contractForWan(version);\n if (toolName === \"generate_video_kling\") return contractForKling(version);\n if (toolName === \"generate_video_vidu\") return contractForVidu(version);\n\n const contracts: Record<string, VideoToolContract> = {\n generate_video_seedance20: {\n // The Agent-facing MCP schema hides videoUrl, but the frontend asset\n // generation boundary accepts it and caps uploads at three videos.\n fields: { image: IMAGE_URL(9), video: VIDEO_URL(3), audio: AUDIO_URL(3) },\n modes: STANDARD_OMNI,\n },\n generate_video_seedance25: {\n fields: { image: IMAGE_URL(30), video: VIDEO_URL(10), audio: AUDIO_URL(10) },\n modes: STANDARD_OMNI,\n totalMax: 50,\n },\n generate_video_minimax_h3: {\n fields: { image: IMAGE_URL(9), video: VIDEO_URL(3), audio: AUDIO_URL(3) },\n modes: [...STANDARD_OMNI, \"endframe2Video\"],\n audioRequiresVisual: true,\n },\n generate_video_wan27: {\n // audioUrl exists in schema but is explicitly not consumed by the gateway.\n fields: { image: IMAGE_URL(5), video: VIDEO_URL(1, true) },\n modes: STANDARD_OMNI,\n totalMax: 5,\n },\n generate_video_wan26: {\n fields: { image: IMAGE_URL(5), video: VIDEO_URL(1, true) },\n modes: [\"text2Video\", \"firstframe2Video\", \"image2Video\", \"omni2Video\"],\n },\n generate_video_gemini_omni: {\n fields: { image: IMAGES(5), video: VIDEO_URL(1, true) },\n modes: TEXT_IMAGE_OMNI,\n totalMax: 5,\n },\n generate_video_grok_imagine: {\n fields: { image: IMAGE_URL(1, true) },\n modes: TEXT_FIRST_FRAME,\n },\n generate_video_grok_imagine_15: {\n fields: { image: IMAGE_URL(1, true) },\n modes: [\"firstframe2Video\"],\n },\n generate_video_grok_imagine_15_fast: {\n fields: { image: IMAGE_URL(7) },\n modes: TEXT_IMAGE_OMNI,\n },\n generate_video_happyhorse: {\n fields: { image: IMAGE_URL(9) },\n modes: [\"text2Video\", \"firstframe2Video\", \"image2Video\", \"omni2Video\"],\n },\n generate_video_happyhorse11: {\n fields: { image: IMAGE_URL(9) },\n modes: [\"text2Video\", \"firstframe2Video\", \"image2Video\", \"omni2Video\"],\n },\n generate_video_sora2: { fields: { image: IMAGES() } },\n generate_video_sora2_pro: { fields: { image: IMAGES() } },\n generate_video_kling_o1: { fields: { image: IMAGES() } },\n generate_video_midjourney: { fields: { image: IMAGES() } },\n generate_video_veo3: { fields: { image: IMAGE_URL(1, true) } },\n generate_video_hailuo02: { fields: { image: IMAGE_URL(2) } },\n };\n return contracts[toolName];\n}\n\nexport function getVideoReferenceMediaSupport(toolName: string, version?: string): VideoReferenceMediaSupport | undefined {\n const contract = getVideoToolContract(toolName, version);\n if (!contract) return undefined;\n return {\n image: contract.fields.image !== undefined,\n video: contract.fields.video !== undefined,\n audio: contract.fields.audio !== undefined,\n };\n}\n\n/** Whether the model can generate with only a prompt and no media references. */\nexport function isVideoPromptOnlySupported(toolName: string, version?: string): boolean {\n const contract = getVideoToolContract(toolName, version);\n // Unknown tools retain the CLI's existing prompt-only forward-compatible path.\n if (!contract || !contract.modes) return true;\n return contract.modes.includes(\"text2Video\");\n}\n\nfunction normalizeUris(values: string[] | undefined): string[] {\n return [...new Set((values ?? []).map((value) => value.trim()).filter(Boolean))];\n}\n\nfunction assertUriPrefix(values: string[], kind: keyof VideoReferences, prefix: string): void {\n const invalid = values.find((value) => !value.startsWith(prefix));\n if (invalid) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, `Video ${kind} references must use ${prefix} URIs: ${invalid}`);\n }\n}\n\nfunction videoConstraint(message: string, details: Record<string, unknown> = {}): CliError {\n return new CliError(ErrorCode.MODEL_CONSTRAINT_VIOLATION, message, {\n category: \"validation\",\n retryable: false,\n ...details,\n });\n}\n\nfunction assignReference(\n args: Record<string, unknown>,\n toolName: string,\n kind: \"image\" | \"video\" | \"audio\",\n values: string[],\n field: ReferenceField | undefined,\n): void {\n if (values.length === 0) return;\n if (!field) {\n throw videoConstraint(`${toolName} does not support ${kind} references.`, { field: kind });\n }\n if (field.max !== undefined && values.length > field.max) {\n throw videoConstraint(`${toolName} supports at most ${field.max} ${kind} references; received ${values.length}.`, {\n field: kind,\n received: values.length,\n supported_max: field.max,\n });\n }\n if (field.single && values.length > 1) {\n throw videoConstraint(`${toolName} supports only one ${kind} reference.`, { field: kind, received: values.length, supported_max: 1 });\n }\n args[field.name] = field.single ? values[0] : values;\n}\n\nfunction inferMode(contract: VideoToolContract, refs: VideoReferences): VideoGenerateMode {\n const referenceCount = refs.images.length + refs.videos.length + refs.audios.length;\n if (referenceCount === 0) return \"text2Video\";\n if (contract.modes?.includes(\"omni2Video\")) return \"omni2Video\";\n if (refs.videos.length || refs.audios.length) return \"omni2Video\";\n if (contract.modes?.includes(\"image2Video\")) return \"image2Video\";\n if (refs.images.length === 1 && contract.modes?.includes(\"firstframe2Video\")) return \"firstframe2Video\";\n if (refs.images.length === 2 && contract.modes?.includes(\"frame2Video\")) return \"frame2Video\";\n return \"image2Video\";\n}\n\nexport function buildVideoReferenceArgs(input: {\n toolName: string;\n version?: string;\n images?: string[];\n videos?: string[];\n audios?: string[];\n mode?: VideoGenerateModeOption;\n}): { args: Record<string, unknown>; mode: VideoGenerateMode; references: VideoReferences } {\n const references: VideoReferences = {\n images: normalizeUris(input.images),\n videos: normalizeUris(input.videos),\n audios: normalizeUris(input.audios),\n };\n assertUriPrefix(references.images, \"images\", \"hogi://image/\");\n assertUriPrefix(references.videos, \"videos\", \"hogi://video/\");\n assertUriPrefix(references.audios, \"audios\", \"hogi://audio/\");\n\n const referenceCount = references.images.length + references.videos.length + references.audios.length;\n const contract = getVideoToolContract(input.toolName, input.version);\n if (!contract) {\n if (referenceCount === 0) return { args: {}, mode: \"text2Video\", references };\n throw new CliError(\n ErrorCode.MODEL_NOT_SUPPORTED,\n `${input.toolName} has no verified reference-input contract in this CLI. Select a confirmed model or use video text.`,\n { category: \"validation\", retryable: false, tool: input.toolName },\n );\n }\n if (contract.totalMax !== undefined && referenceCount > contract.totalMax) {\n throw videoConstraint(`${input.toolName} supports at most ${contract.totalMax} total references; received ${referenceCount}.`, {\n field: \"references\",\n received: referenceCount,\n supported_max: contract.totalMax,\n });\n }\n if (contract.audioRequiresVisual && references.audios.length > 0\n && references.images.length === 0 && references.videos.length === 0) {\n throw videoConstraint(`${input.toolName} audio references require at least one image or video reference.`, { field: \"audio\" });\n }\n\n const mode = input.mode && input.mode !== \"auto\" ? input.mode : inferMode(contract, references);\n if (input.mode && input.mode !== \"auto\" && !contract.modes) {\n throw new CliError(\n ErrorCode.MODEL_CONSTRAINT_VIOLATION,\n `${input.toolName} does not expose a selectable generateMode; omit --mode or use --mode auto.`,\n { category: \"validation\", retryable: false, field: \"mode\", received: input.mode },\n );\n }\n if (contract.modes && !contract.modes.includes(mode)) {\n throw new CliError(\n ErrorCode.MODEL_CONSTRAINT_VIOLATION,\n `${input.toolName} does not support ${mode}. Supported modes: ${contract.modes.join(\", \")}.`,\n { category: \"validation\", retryable: false, field: \"mode\", received: mode, supported: contract.modes },\n );\n }\n if (mode === \"text2Video\" && referenceCount > 0) {\n throw videoConstraint(\"text2Video does not accept image, video, or audio references.\", { field: \"references\" });\n }\n if ((mode === \"firstframe2Video\" || mode === \"endframe2Video\")\n && (references.images.length !== 1 || references.videos.length > 0 || references.audios.length > 0)) {\n throw videoConstraint(`${mode} requires exactly one image and no video or audio references.`, { field: \"references\", mode });\n }\n if (mode === \"frame2Video\"\n && (references.images.length !== 2 || references.videos.length > 0 || references.audios.length > 0)) {\n throw videoConstraint(\"frame2Video requires exactly two images and no video or audio references.\", { field: \"references\", mode });\n }\n if (mode === \"image2Video\"\n && (references.images.length === 0 || references.videos.length > 0 || references.audios.length > 0)) {\n throw videoConstraint(\"image2Video requires image references and does not accept video or audio references.\", { field: \"references\", mode });\n }\n if (mode === \"omni2Video\" && referenceCount === 0) {\n throw videoConstraint(\"omni2Video requires at least one reference; use text2Video for prompt-only generation.\", { field: \"references\", mode });\n }\n\n const args: Record<string, unknown> = {};\n assignReference(args, input.toolName, \"image\", references.images, contract.fields.image);\n assignReference(args, input.toolName, \"video\", references.videos, contract.fields.video);\n assignReference(args, input.toolName, \"audio\", references.audios, contract.fields.audio);\n if (contract.modes) args.generateMode = mode;\n return { args, mode, references };\n}\n","import type { BackendModelPricing } from \"../clients/hogi_model_catalog_client.js\";\nimport { CliError, ErrorCode } from \"../output/errors.js\";\nimport { getVideoReferenceMediaSupport, isVideoPromptOnlySupported } from \"./video_model_contract.js\";\n\nexport interface GenerationInputMediaSupport {\n text: boolean;\n image: boolean;\n video: boolean;\n audio: boolean;\n file: boolean;\n}\n\nexport interface ResolvedGenerationInputContract {\n media: GenerationInputMediaSupport;\n prompt_only_supported: boolean;\n}\n\nexport interface GenerationInputContractSource {\n toolName: string;\n variant?: string;\n catalog?: BackendModelPricing;\n name?: string;\n key?: string;\n}\n\nconst NO_REFERENCES = { image: false, video: false, audio: false } as const;\n\n/** Resolve media inputs implemented by the CLI without misusing input_capabilities. */\nexport function resolveGenerationInputMedia(source: GenerationInputContractSource): GenerationInputMediaSupport {\n let references: { image: boolean; video: boolean; audio: boolean } = NO_REFERENCES;\n\n if (source.toolName.startsWith(\"generate_image_\")) {\n references = { image: true, video: false, audio: false };\n } else if (source.toolName.startsWith(\"generate_video_\")) {\n references = getVideoReferenceMediaSupport(source.toolName, source.variant) ?? NO_REFERENCES;\n } else if (source.toolName === \"generate_music_seed_audio\") {\n // CanvasChatV3 treats audio models like text models: reference upload\n // availability comes from the selected pricing row's input_capabilities.\n // Do not infer Seed Audio references from the MCP method alone, otherwise\n // the CLI can accept media that the frontend has already disabled.\n const capabilities = new Set(source.catalog?.input_capabilities ?? [\"text\"]);\n references = {\n image: capabilities.has(\"image\"),\n video: false,\n audio: capabilities.has(\"audio\"),\n };\n }\n\n return {\n text: true,\n image: references.image && source.catalog?.reference_image_count_max !== 0,\n video: references.video,\n audio: references.audio,\n file: false,\n };\n}\n\nexport function resolveGenerationInputContract(source: GenerationInputContractSource): ResolvedGenerationInputContract {\n const catalogRequiresImage = typeof source.catalog?.reference_image_count_min === \"number\"\n && source.catalog.reference_image_count_min > 0;\n return {\n media: resolveGenerationInputMedia(source),\n prompt_only_supported: !catalogRequiresImage && (\n !source.toolName.startsWith(\"generate_video_\")\n || isVideoPromptOnlySupported(source.toolName, source.variant)\n ),\n };\n}\n\nexport function validatePromptOnlyGeneration(source: GenerationInputContractSource): void {\n if (resolveGenerationInputContract(source).prompt_only_supported) return;\n const requiredImageCount = source.catalog?.reference_image_count_min;\n const catalogRequiresImage = typeof requiredImageCount === \"number\" && requiredImageCount > 0;\n throw new CliError(\n ErrorCode.MODEL_CONSTRAINT_VIOLATION,\n catalogRequiresImage\n ? `${source.name ?? source.key ?? source.toolName} requires at least ${requiredImageCount} reference image.`\n : `${source.name ?? source.key ?? source.toolName} requires a media reference and does not support prompt-only generation.`,\n {\n category: \"validation\",\n retryable: false,\n ...(catalogRequiresImage ? {\n field: \"reference_image_count_min\",\n received: 0,\n supported_min: requiredImageCount,\n } : {\n field: \"generateMode\",\n received: \"text2Video\",\n }),\n },\n );\n}\n\n/** Apply catalog image-reference bounds in addition to model-specific contracts. */\nexport function validateReferenceImageCount(source: GenerationInputContractSource, count: number): void {\n const min = source.catalog?.reference_image_count_min;\n const max = source.catalog?.reference_image_count_max;\n if (typeof min === \"number\" && count < min) {\n throw new CliError(\n ErrorCode.MODEL_CONSTRAINT_VIOLATION,\n `${source.name ?? source.key ?? source.toolName} requires at least ${min} reference images; received ${count}.`,\n {\n category: \"validation\",\n retryable: false,\n field: \"reference_image_count_min\",\n received: count,\n supported_min: min,\n },\n );\n }\n if (count === 0) return;\n if (!resolveGenerationInputMedia(source).image) {\n throw new CliError(\n ErrorCode.MODEL_CONSTRAINT_VIOLATION,\n `${source.name ?? source.key ?? source.toolName} does not support reference images.`,\n {\n category: \"validation\",\n retryable: false,\n field: \"reference_image_count_max\",\n received: count,\n ...(max === 0 ? { supported_max: 0 } : {}),\n },\n );\n }\n if (typeof max === \"number\" && count > max) {\n throw new CliError(\n ErrorCode.MODEL_CONSTRAINT_VIOLATION,\n `${source.name ?? source.key ?? source.toolName} supports at most ${max} reference images; received ${count}.`,\n {\n category: \"validation\",\n retryable: false,\n field: \"reference_image_count_max\",\n received: count,\n supported_max: max,\n },\n );\n }\n}\n","import type { BackendModelPricing } from \"../clients/hogi_model_catalog_client.js\";\nimport { CliError, ErrorCode } from \"../output/errors.js\";\n\nexport interface PointsQuoteInput {\n pricing: BackendModelPricing;\n tier: string;\n duration?: number;\n resolution?: string;\n quality?: string;\n referenceVideoDuration?: number;\n}\n\nexport interface PointsQuote {\n estimate: true;\n estimated_points: number;\n unit_points: number;\n tier: \"free\" | \"member\";\n billing_unit: \"request\" | \"second\";\n billed_duration?: number;\n promo_applied: boolean;\n model_id: number;\n model_name: string;\n caveat: string;\n}\n\nfunction numberMap(value: unknown): Record<string, number> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n const entries = Object.entries(value).filter((entry): entry is [string, number] => typeof entry[1] === \"number\");\n return Object.fromEntries(entries);\n}\n\nfunction mapPrice(map: Record<string, number> | undefined, resolution: string | undefined): number | undefined {\n if (!map || !resolution) return undefined;\n const exact = map[resolution];\n if (exact !== undefined) return exact;\n const key = Object.keys(map).find((item) => item.toLowerCase() === resolution.toLowerCase());\n return key ? map[key] : undefined;\n}\n\nfunction positiveNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? value : undefined;\n}\n\nfunction roundUp(value: number): number {\n const tolerance = Number.EPSILON * Math.max(1, Math.abs(value)) * 8;\n return value <= 0 ? 0 : Math.max(1, Math.ceil(value - tolerance));\n}\n\nexport function estimatePointsQuote(input: PointsQuoteInput): PointsQuote {\n const { pricing } = input;\n const tier = input.tier === \"free\" ? \"free\" : \"member\";\n const isVideo = pricing.mcp_method_name.startsWith(\"generate_video_\");\n const isAudioPerSecond = pricing.audio_pricing_mode === \"per_second\";\n const referenceVideoDuration = input.referenceVideoDuration ?? 0;\n if (input.duration !== undefined && (!Number.isFinite(input.duration) || input.duration <= 0)) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, \"Duration must be a positive number\");\n }\n if (!Number.isFinite(referenceVideoDuration) || referenceVideoDuration < 0) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, \"Reference video duration must be zero or positive\");\n }\n\n const memberBase = pricing.points_cost;\n const freeBase = positiveNumber(pricing.free_user_points_cost) ?? memberBase;\n const base = tier === \"free\" ? freeBase : memberBase;\n const memberResolution = numberMap(pricing.resolution_pricing);\n const freeResolution = numberMap(pricing.free_user_resolution_pricing) ?? memberResolution;\n const memberWithVideo = numberMap(pricing.resolution_pricing_with_video);\n const freeWithVideo = numberMap(pricing.free_user_resolution_pricing_with_video) ?? memberWithVideo;\n const resolutionMap = tier === \"free\" ? freeResolution : memberResolution;\n const withVideoMap = tier === \"free\" ? freeWithVideo : memberWithVideo;\n const primaryMap = referenceVideoDuration > 0 ? withVideoMap : resolutionMap;\n let pricingResolution = input.resolution;\n if (pricing.mcp_method_name === \"generate_image_gpt_image2\"\n && input.resolution\n && mapPrice(primaryMap, input.resolution) === undefined\n && /^[124]k$/i.test(input.resolution)) {\n const quality = input.quality?.trim().toLowerCase()\n ?? (input.resolution.toLowerCase() === \"1k\" ? \"low\" : \"medium\");\n const combined = `${input.resolution}-${quality}`;\n if (mapPrice(primaryMap, combined) !== undefined || mapPrice(resolutionMap, combined) !== undefined) {\n pricingResolution = combined;\n }\n }\n const unit = (referenceVideoDuration > 0 ? mapPrice(withVideoMap, pricingResolution) : undefined)\n ?? mapPrice(resolutionMap, pricingResolution)\n ?? base;\n const promoApplied = pricing.promo_active === true && positiveNumber(pricing.promo_discount_percent) !== undefined;\n const promoMultiplier = promoApplied ? (pricing.promo_discount_percent as number) / 100 : 1;\n const effectiveUnit = unit * promoMultiplier;\n const duration = input.duration ?? (isVideo ? 10 : undefined);\n const billedDuration = duration !== undefined ? duration + (isVideo ? referenceVideoDuration : 0) : undefined;\n const amount = isVideo && billedDuration !== undefined\n ? roundUp(effectiveUnit * billedDuration)\n : isAudioPerSecond && duration !== undefined\n ? roundUp(effectiveUnit * duration)\n : promoApplied\n ? roundUp(effectiveUnit)\n : unit;\n\n return {\n estimate: true,\n estimated_points: amount,\n unit_points: unit,\n tier,\n billing_unit: isVideo || isAudioPerSecond ? \"second\" : \"request\",\n ...(billedDuration !== undefined && (isVideo || isAudioPerSecond) ? { billed_duration: billedDuration } : {}),\n promo_applied: promoApplied,\n model_id: pricing.id,\n model_name: pricing.name ?? pricing.model ?? pricing.mcp_method_name,\n caveat: \"Client-side estimate from the current model catalog; actual charge may differ because backend feature flags, resolved media duration, promotions, and fallback pricing are authoritative.\",\n };\n}\n","import type { ModelDomain } from \"../core/model_map.js\";\nimport { effectiveModelInputCapabilities, type ResolvedModelSelection } from \"../core/model_selection.js\";\nimport { resolveGenerationInputContract, type ResolvedGenerationInputContract } from \"../core/generation_input_contract.js\";\nimport { estimatePointsQuote } from \"../core/points_quote.js\";\nimport { successJson, printJson } from \"../output/json_output.js\";\nimport * as human from \"../output/human_output.js\";\n\nexport interface LocalGenerationDryRunResult {\n valid: true;\n resolved: {\n arguments: Record<string, unknown>;\n contract: {\n source: \"cli_model_catalog_and_command_schema\";\n input_capabilities: string[];\n input_capabilities_scope: \"model_input_modalities\";\n generation_input_contract: ResolvedGenerationInputContract;\n reference_images?: {\n capability_field: \"reference_image_count_max\";\n count_min: number | null;\n count_max: number | null;\n source: \"catalog\" | \"frontend_fallback\";\n supported: boolean;\n };\n constraints: {\n aspect_ratios: string[];\n durations: string[];\n sizes: string[];\n };\n };\n media_type: ModelDomain;\n mcp_method_name: string;\n model_id: number | null;\n variant: string | null;\n };\n estimate: { caveat: string; points: number | null };\n warnings: Array<{ code: string; message: string }>;\n}\n\nexport function createLocalGenerationDryRun(\n selection: ResolvedModelSelection,\n mediaType: ModelDomain,\n args: Record<string, unknown>,\n): LocalGenerationDryRunResult {\n const catalog = selection.catalog;\n const quote = catalog ? estimatePointsQuote({\n pricing: catalog,\n // API-key generation is a member workflow. The backend remains\n // authoritative for the actual tier and final charge.\n tier: \"member\",\n ...(typeof args.duration === \"number\" ? { duration: args.duration } : {}),\n ...(typeof args.resolution === \"string\" ? { resolution: args.resolution } : {}),\n ...(typeof args.quality === \"string\" ? { quality: args.quality } : {}),\n ...(typeof args.referenceVideoDuration === \"number\"\n ? { referenceVideoDuration: args.referenceVideoDuration }\n : {}),\n }) : undefined;\n return {\n valid: true,\n resolved: {\n arguments: args,\n contract: {\n source: \"cli_model_catalog_and_command_schema\",\n input_capabilities: effectiveModelInputCapabilities(selection),\n input_capabilities_scope: \"model_input_modalities\",\n generation_input_contract: resolveGenerationInputContract(selection),\n ...(mediaType === \"image\" ? {\n reference_images: {\n capability_field: \"reference_image_count_max\" as const,\n count_min: catalog?.reference_image_count_min ?? null,\n count_max: catalog?.reference_image_count_max ?? null,\n source: typeof catalog?.reference_image_count_max === \"number\" ? \"catalog\" as const : \"frontend_fallback\" as const,\n supported: catalog?.reference_image_count_max !== 0,\n },\n } : {}),\n constraints: {\n aspect_ratios: catalog?.aspect_ratios ?? [],\n durations: catalog?.durations ?? [],\n sizes: catalog?.sizes ?? [],\n },\n },\n media_type: mediaType,\n mcp_method_name: selection.toolName,\n model_id: selection.modelId ?? null,\n variant: selection.variant ?? null,\n },\n estimate: {\n caveat: catalog\n ? `${quote?.caveat ?? \"Client-side estimate from the current model catalog.\"} Assumes the API-key member tier; no generation was submitted.`\n : \"No exact model catalog row was selected; use --model-id for a points estimate.\",\n points: quote?.estimated_points ?? null,\n },\n warnings: catalog ? [] : selection.catalogStatus === \"ambiguous\" ? [{\n code: \"MODEL_CATALOG_SELECTION_AMBIGUOUS\",\n message: \"Multiple active variants exist; use --model-id or --variant for exact constraints and points.\",\n }] : [{\n code: \"MODEL_CATALOG_SELECTION_NOT_EXACT\",\n message: \"Use --model-id or --variant to validate catalog-specific constraints and estimate points.\",\n }],\n };\n}\n\nexport function printGenerationDryRun(result: LocalGenerationDryRunResult, jsonMode: boolean): void {\n if (jsonMode) {\n printJson(successJson(\"generation_dry_run\", result));\n return;\n }\n human.success(\"Generation request is valid (dry-run; nothing was submitted)\");\n if (result.resolved.model_id !== null) human.info(` Model ID: ${result.resolved.model_id}`);\n human.info(` Tool: ${result.resolved.mcp_method_name}`);\n if (result.resolved.variant) human.info(` Variant: ${result.resolved.variant}`);\n human.info(` Points: ${result.estimate.points ?? \"unknown\"}${result.estimate.points !== null ? \" (estimated)\" : \"\"}`);\n human.info(` Arguments: ${JSON.stringify(result.resolved.arguments)}`);\n for (const warning of result.warnings) human.warn(`${warning.code}: ${warning.message}`);\n}\n","/** Canonical command defaults shared by help, inspect, and execution. */\nexport const DEFAULT_IMAGE_MODEL = \"seedream45\";\nexport const DEFAULT_VIDEO_MODEL = \"seedance20\";\nexport const DEFAULT_AUDIO_MODEL = \"seed-audio\";\n\n","/**\n * Video commands: text, legacy image, and model-validated mixed generation.\n *\n * `oiioii video text --prompt \"...\" [--model seedance20] [--duration 5] [--aspect-ratio 16:9] [--resolution 720p] [--json]`\n * `oiioii video image --image <hogi-uri> --prompt \"...\" [--model seedance20] [--duration 5] [--resolution 720p] [--json]`\n * `oiioii video generate --prompt \"...\" [--image <uris...>] [--video <uris...>] [--audio <uris...>] [--mode auto]`\n *\n * Flow:\n * 1. Require auth (API key from config, with optional env override)\n * 2. Require workspace (flag > env > config)\n * 3. Map model → GenAI MCP tool name\n * 4. Create local task record (status=created)\n * 5. Submit through submit_async_media_generation\n * 6. Cache the backend task/asset IDs and return immediately\n * 7. task status/wait later query and project terminal output\n *\n * Reference generation resolves the exact MCP tool + variant contract before\n * submission, including field names, supported media types, counts, and modes.\n */\n\nimport { Command } from \"commander\";\nimport { FileConfigStore } from \"../config/config_store.js\";\nimport { HogiMcpClient } from \"../clients/hogi_mcp_client.js\";\nimport { DEFAULT_ASYNC_GENERATION_REQUEST_TIMEOUT_MS, HogiAsyncGenerationClient } from \"../clients/hogi_async_generation_client.js\";\nimport {\n resolveModelConstraintDefaults,\n resolveModelSelection,\n selectionCliArgs,\n selectionSummary,\n validateModelConstraints,\n} from \"../core/model_selection.js\";\nimport { TaskStore } from \"../core/task_store.js\";\nimport { createGenerationPreview } from \"../core/generation_preview.js\";\nimport { submitAsyncGeneration } from \"../core/async_generation.js\";\nimport { successJson, errorJson, printJson } from \"../output/json_output.js\";\nimport { ErrorCode, CliError } from \"../output/errors.js\";\nimport * as human from \"../output/human_output.js\";\nimport type { GenerationArtifact, GenerationWarning, ImageCommandDeps } from \"./image.js\";\nimport { logFeatureStep } from \"../logging/feature_logger.js\";\nimport { getRootOptions, isJsonOutput, requireApiKeyAuth } from \"../app/command_context.js\";\nimport { markTelemetryPartialSuccess, recordTelemetryBusinessInfo } from \"../telemetry/index.js\";\nimport {\n buildVideoReferenceArgs,\n VIDEO_GENERATE_MODES,\n type VideoGenerateMode,\n type VideoGenerateModeOption,\n} from \"../core/video_model_contract.js\";\nimport {\n createLocalGenerationDryRun,\n printGenerationDryRun,\n type LocalGenerationDryRunResult,\n} from \"./generation_dry_run.js\";\nimport { validatePromptOnlyGeneration, validateReferenceImageCount } from \"../core/generation_input_contract.js\";\nimport { DEFAULT_VIDEO_MODEL } from \"../core/model_defaults.js\";\n\n// ── Types ────────────────────────────────────────────────────────────\n\n/** Dependencies for video commands. */\nexport interface VideoCommandDeps extends ImageCommandDeps {\n videoTextTimeoutMs?: number;\n videoTextPollIntervalMs?: number;\n}\n\nexport interface VideoTextParams {\n prompt: string;\n model: string;\n modelId?: string;\n variant?: string;\n duration?: number;\n aspectRatio?: string;\n resolution?: string;\n}\n\nexport interface VideoImageParams {\n image?: string;\n images?: string[];\n videos?: string[];\n audios?: string[];\n mode?: VideoGenerateModeOption;\n prompt: string;\n model: string;\n modelId?: string;\n variant?: string;\n duration?: number;\n resolution?: string;\n aspectRatio?: string;\n}\n\nexport interface VideoResult {\n task_id: string;\n local_task_id: string;\n tool: string;\n model: ReturnType<typeof selectionSummary>;\n workspace_id: string;\n status: \"created\" | \"submitting\" | \"queued\" | \"running\" | \"succeeded\" | \"failed\" | \"cancelled\";\n generation_mode?: VideoGenerateMode;\n artifacts: GenerationArtifact[];\n request: { duration_seconds: number; aspect_ratio: string; resolution: string };\n warnings?: GenerationWarning[];\n error?: { code: string; message: string };\n}\n\nconst GROK_IMAGINE_TOOL_NAME = \"generate_video_grok_imagine\";\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\nconst isJsonMode = isJsonOutput;\nconst getRootOpts = getRootOptions;\n\nfunction normalizeReferenceField(value: unknown): string[] {\n if (typeof value === \"string\" && value) return [value];\n return Array.isArray(value) ? value.filter((item): item is string => typeof item === \"string\" && item.length > 0) : [];\n}\n\n/** Translate model-specific synchronous reference fields to the async service contract. */\nfunction buildAsyncVideoInput(args: Record<string, unknown>): Record<string, unknown> {\n const { imageUrl, images, ...rest } = args;\n const referenceImages = [...new Set([\n ...normalizeReferenceField(imageUrl),\n ...normalizeReferenceField(images),\n ])];\n return {\n ...rest,\n ...(referenceImages.length > 0 ? { referenceImages } : {}),\n };\n}\n\nfunction requireWorkspace(rootOpts: Record<string, unknown>, configStore: FileConfigStore): {\n workspaceId: string;\n source: \"flag\" | \"env\" | \"config\";\n} {\n const flag = rootOpts.workspace as string | undefined;\n if (flag) {\n return { workspaceId: flag, source: \"flag\" };\n }\n\n const envVal = process.env[\"OIIOII_WORKSPACE_ID\"];\n if (envVal) {\n return { workspaceId: envVal, source: \"env\" };\n }\n\n const config = configStore.loadResolved();\n if (config.defaultWorkspaceId) {\n return { workspaceId: config.defaultWorkspaceId, source: \"config\" };\n }\n\n throw new CliError(\n ErrorCode.WORKSPACE_REQUIRED,\n \"No workspace set. Run: oiioii workspace set <workspace_id>\",\n );\n}\n\n// ── Core: text-to-video (testable) ───────────────────────────────────\n\nfunction parseDuration(value: unknown): number {\n const duration = typeof value === \"number\" ? value : Number.parseInt(String(value), 10);\n if (!Number.isInteger(duration) || duration <= 0) {\n throw new CliError(\n ErrorCode.INVALID_ARGUMENT,\n `Invalid duration: ${String(value)}. Duration must be a positive integer number of seconds.`,\n );\n }\n return duration;\n}\n\nasync function prepareVideoTextRequest(\n params: VideoTextParams,\n apiKey: string,\n baseUrl: string,\n deps: VideoCommandDeps,\n requireActiveCatalog: boolean,\n) {\n const selection = await resolveModelSelection({\n domain: \"video\",\n model: params.model,\n modelId: params.modelId,\n variant: params.variant,\n requireActiveCatalog,\n baseUrl,\n apiKey,\n fetch: deps.fetch,\n });\n const defaults = resolveModelConstraintDefaults(selection, {\n aspectRatio: \"16:9\",\n resolution: \"720p\",\n duration: 5,\n });\n const duration = params.duration === undefined ? defaults.duration! : parseDuration(params.duration);\n const aspectRatio = params.aspectRatio ?? defaults.aspectRatio;\n const resolution = params.resolution ?? defaults.resolution;\n validatePromptOnlyGeneration(selection);\n validateModelConstraints(selection, {\n aspectRatio,\n resolution,\n duration,\n });\n return {\n duration,\n aspectRatio,\n resolution,\n selection,\n args: {\n prompt: params.prompt,\n resolution,\n duration,\n aspectRatio,\n ...(selection.toolName === GROK_IMAGINE_TOOL_NAME ? { generateMode: \"text2Video\" } : {}),\n ...(selection.variant ? { version: selection.variant } : {}),\n } as Record<string, unknown>,\n };\n}\n\nasync function prepareVideoReferenceRequest(\n params: VideoImageParams,\n apiKey: string,\n baseUrl: string,\n deps: VideoCommandDeps,\n requireActiveCatalog: boolean,\n) {\n const selection = await resolveModelSelection({\n domain: \"video\",\n model: params.model,\n modelId: params.modelId,\n variant: params.variant,\n requireActiveCatalog,\n baseUrl,\n apiKey,\n fetch: deps.fetch,\n });\n const defaults = resolveModelConstraintDefaults(selection, {\n aspectRatio: \"16:9\",\n resolution: \"720p\",\n duration: 5,\n });\n const duration = params.duration === undefined ? defaults.duration! : parseDuration(params.duration);\n const aspectRatio = params.aspectRatio ?? defaults.aspectRatio;\n const resolution = params.resolution ?? defaults.resolution;\n const references = buildVideoReferenceArgs({\n toolName: selection.toolName,\n version: selection.variant,\n images: [...(params.image ? [params.image] : []), ...(params.images ?? [])],\n videos: params.videos,\n audios: params.audios,\n mode: params.mode,\n });\n const totalReferenceCount = references.references.images.length\n + references.references.videos.length\n + references.references.audios.length;\n if (totalReferenceCount === 0) validatePromptOnlyGeneration(selection);\n else validateReferenceImageCount(selection, references.references.images.length);\n validateModelConstraints(selection, {\n aspectRatio,\n resolution,\n duration,\n });\n return {\n duration,\n aspectRatio,\n resolution,\n references,\n selection,\n args: {\n prompt: params.prompt,\n ...references.args,\n resolution,\n duration,\n aspectRatio,\n ...(selection.variant ? { version: selection.variant } : {}),\n } as Record<string, unknown>,\n };\n}\n\nexport async function validateVideoDryRun(\n params: VideoTextParams | VideoImageParams,\n mode: \"references\" | \"text\",\n apiKey: string,\n baseUrl: string,\n deps: VideoCommandDeps,\n): Promise<LocalGenerationDryRunResult> {\n const prepared = mode === \"text\"\n ? await prepareVideoTextRequest(params as VideoTextParams, apiKey, baseUrl, deps, true)\n : await prepareVideoReferenceRequest(params as VideoImageParams, apiKey, baseUrl, deps, true);\n return createLocalGenerationDryRun(prepared.selection, \"video\", prepared.args);\n}\n\n/** Execute text-to-video generation through GenAI MCP. */\nexport async function executeVideoText(\n params: VideoTextParams,\n workspaceId: string,\n apiKey: string,\n baseUrl: string,\n deps: VideoCommandDeps = {},\n): Promise<VideoResult> {\n const taskStore = deps.taskStore ?? new TaskStore();\n\n const prepared = await prepareVideoTextRequest(params, apiKey, baseUrl, deps, true);\n const { duration, aspectRatio, resolution, selection } = prepared;\n const toolName = selection.toolName;\n logFeatureStep(\"video\", \"generation.prepared\", {\n mode: \"text\",\n model: selection.key,\n model_id: selection.modelId,\n variant: selection.variant,\n workspace_id: workspaceId,\n });\n\n // 2. Build GenAI MCP tool arguments.\n const toolArgs: Record<string, unknown> = {\n ...prepared.args,\n workspace_id: workspaceId,\n };\n\n // 3. Create local task\n const commandStr = `oiioii video text --prompt \"${params.prompt}\" ${selectionCliArgs(selection)} --duration ${duration} --aspect-ratio ${aspectRatio} --resolution ${resolution}`;\n const task = taskStore.create({\n workspaceId,\n command: commandStr,\n toolName,\n inputArgs: {\n provider: \"mcp_genai\",\n prompt: params.prompt,\n model: selection.key,\n modelId: selection.modelId,\n variant: selection.variant,\n mcpMethodName: toolName,\n workspaceId,\n aspectRatio,\n duration,\n toolArgs,\n },\n });\n\n // 4. Update to submitting\n taskStore.update(task.id, { status: \"submitting\" });\n\n // 5. Submit through the API-key async GenAI MCP boundary.\n const client = new HogiMcpClient({\n baseUrl,\n apiKey,\n fetch: deps.fetch,\n timeoutMs: deps.videoTextTimeoutMs ?? DEFAULT_ASYNC_GENERATION_REQUEST_TIMEOUT_MS,\n });\n\n try {\n const submitted = await submitAsyncGeneration({\n client: new HogiAsyncGenerationClient(client),\n taskStore,\n previewStore: deps.previewStore,\n task,\n mediaType: \"video\",\n prompt: params.prompt,\n model: selection.variant,\n backendBaseUrl: baseUrl,\n input: buildAsyncVideoInput(prepared.args),\n });\n const artifacts = submitted.task.resourceUris.map((uri) => ({ type: \"video\" as const, uri, mime_type: \"video/mp4\" }));\n const warnings: GenerationWarning[] = submitted.previewWarning ? [submitted.previewWarning] : [];\n logFeatureStep(\"video\", \"generation.submitted\", {\n local_task_id: task.id,\n backend_task_id: submitted.submission.taskId,\n status: submitted.task.status,\n });\n\n return {\n task_id: submitted.submission.taskId,\n local_task_id: task.id,\n tool: toolName,\n model: selectionSummary(selection),\n workspace_id: workspaceId,\n status: submitted.task.status,\n generation_mode: \"text2Video\",\n artifacts,\n request: { duration_seconds: duration, aspect_ratio: aspectRatio, resolution },\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n } catch (err: unknown) {\n const errCode = err instanceof CliError ? err.code : ErrorCode.GENERATION_FAILED;\n const errMsg = err instanceof Error ? err.message : String(err);\n\n if (!taskStore.get(task.id)?.backendTaskId) {\n taskStore.update(task.id, { status: \"failed\", error: { code: errCode, message: errMsg } });\n createGenerationPreview({ taskStore, previewStore: deps.previewStore, task, resources: [], status: \"failed\", error: { code: errCode, message: errMsg } });\n }\n logFeatureStep(\"video\", \"generation.command_failed\", { task_id: task.id, backend_task_cached: taskStore.get(task.id)?.backendTaskId !== undefined, error_code: errCode }, \"error\");\n\n throw err;\n }\n}\n\n// ── Core: image-to-video (testable) ──────────────────────────────────\n\n/** Execute image-to-video generation through GenAI MCP. */\nexport async function executeVideoImage(\n params: VideoImageParams,\n workspaceId: string,\n apiKey: string,\n baseUrl: string,\n deps: VideoCommandDeps = {},\n): Promise<VideoResult> {\n const taskStore = deps.taskStore ?? new TaskStore();\n\n const prepared = await prepareVideoReferenceRequest(params, apiKey, baseUrl, deps, true);\n const { duration, aspectRatio, resolution, selection } = prepared;\n const toolName = selection.toolName;\n const preparedReferences = prepared.references;\n logFeatureStep(\"video\", \"generation.prepared\", {\n mode: preparedReferences.mode,\n model: selection.key,\n model_id: selection.modelId,\n variant: selection.variant,\n workspace_id: workspaceId,\n reference_image_count: preparedReferences.references.images.length,\n reference_video_count: preparedReferences.references.videos.length,\n reference_audio_count: preparedReferences.references.audios.length,\n });\n\n const toolArgs: Record<string, unknown> = {\n ...prepared.args,\n workspace_id: workspaceId,\n };\n\n const referenceArgs = [\n ...preparedReferences.references.images.map((uri) => `--image ${uri}`),\n ...preparedReferences.references.videos.map((uri) => `--video ${uri}`),\n ...preparedReferences.references.audios.map((uri) => `--audio ${uri}`),\n ].join(\" \");\n const commandStr = `oiioii video generate ${referenceArgs} --prompt \"${params.prompt}\" ${selectionCliArgs(selection)} --duration ${duration} --aspect-ratio ${aspectRatio} --resolution ${resolution} --mode ${preparedReferences.mode}`;\n const task = taskStore.create({\n workspaceId,\n command: commandStr,\n toolName,\n inputArgs: {\n provider: \"mcp_genai\",\n prompt: params.prompt,\n model: selection.key,\n modelId: selection.modelId,\n variant: selection.variant,\n sourceImage: preparedReferences.references.images[0],\n sourceImages: preparedReferences.references.images,\n sourceVideos: preparedReferences.references.videos,\n sourceAudios: preparedReferences.references.audios,\n generateMode: preparedReferences.mode,\n mcpMethodName: toolName,\n workspaceId,\n duration,\n toolArgs,\n },\n });\n\n taskStore.update(task.id, { status: \"submitting\" });\n\n const client = new HogiMcpClient({\n baseUrl,\n apiKey,\n fetch: deps.fetch,\n timeoutMs: deps.videoTextTimeoutMs ?? DEFAULT_ASYNC_GENERATION_REQUEST_TIMEOUT_MS,\n });\n\n try {\n const submitted = await submitAsyncGeneration({\n client: new HogiAsyncGenerationClient(client),\n taskStore,\n previewStore: deps.previewStore,\n task,\n mediaType: \"video\",\n prompt: params.prompt,\n model: selection.variant,\n backendBaseUrl: baseUrl,\n input: buildAsyncVideoInput(prepared.args),\n });\n const artifacts = submitted.task.resourceUris.map((uri) => ({ type: \"video\" as const, uri, mime_type: \"video/mp4\" }));\n const warnings: GenerationWarning[] = submitted.previewWarning ? [submitted.previewWarning] : [];\n logFeatureStep(\"video\", \"generation.submitted\", {\n local_task_id: task.id,\n backend_task_id: submitted.submission.taskId,\n status: submitted.task.status,\n });\n\n return {\n task_id: submitted.submission.taskId,\n local_task_id: task.id,\n tool: toolName,\n model: selectionSummary(selection),\n workspace_id: workspaceId,\n status: submitted.task.status,\n generation_mode: preparedReferences.mode,\n artifacts,\n request: { duration_seconds: duration, aspect_ratio: aspectRatio, resolution },\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n } catch (err: unknown) {\n const errCode = err instanceof CliError ? err.code : ErrorCode.GENERATION_FAILED;\n const errMsg = err instanceof Error ? err.message : String(err);\n\n if (!taskStore.get(task.id)?.backendTaskId) {\n taskStore.update(task.id, { status: \"failed\", error: { code: errCode, message: errMsg } });\n createGenerationPreview({ taskStore, previewStore: deps.previewStore, task, resources: [], status: \"failed\", error: { code: errCode, message: errMsg } });\n }\n logFeatureStep(\"video\", \"generation.command_failed\", { task_id: task.id, backend_task_cached: taskStore.get(task.id)?.backendTaskId !== undefined, error_code: errCode }, \"error\");\n\n throw err;\n }\n}\n\n// ── Commander command ────────────────────────────────────────────────\n\nexport function createVideoCommand(deps: VideoCommandDeps = {}): Command {\n const video = new Command(\"video\").description(\"Video generation commands\");\n\n video\n .command(\"text\")\n .description(\"Generate video from text prompt\")\n .requiredOption(\"--prompt <text>\", \"Video description\")\n .option(\"--model <model>\", \"Model name\", DEFAULT_VIDEO_MODEL)\n .option(\"--model-id <id>\", \"Exact model ID from inspect models\")\n .option(\"--variant <variant>\", \"Exact model variant from inspect models\")\n .option(\"--duration <seconds>\", \"Duration in seconds (defaults to the selected model catalog)\")\n .option(\"--aspect-ratio <ratio>\", \"Aspect ratio (defaults to the selected model catalog)\")\n .option(\"--resolution <resolution>\", \"Video resolution (defaults to the selected model catalog)\")\n .option(\"--dry-run\", \"Validate and preview the resolved request without submitting\")\n .action(async (opts, cmd) => {\n const jsonMode = isJsonMode(cmd);\n const rootOpts = getRootOpts(cmd);\n const configStore = deps.configStore ?? new FileConfigStore();\n\n try {\n const auth = requireApiKeyAuth(rootOpts, configStore);\n const baseUrl = auth.baseUrl;\n const { workspaceId } = requireWorkspace(rootOpts, configStore);\n\n const params: VideoTextParams = {\n prompt: opts.prompt,\n model: opts.model,\n modelId: opts.modelId,\n variant: opts.variant,\n ...(opts.duration !== undefined ? { duration: parseDuration(opts.duration) } : {}),\n aspectRatio: opts.aspectRatio,\n resolution: opts.resolution,\n };\n if (opts.dryRun === true) {\n printGenerationDryRun(await validateVideoDryRun(params, \"text\", auth.apiKey, baseUrl, deps), jsonMode);\n return;\n }\n const result = await executeVideoText(\n params,\n workspaceId,\n auth.apiKey,\n baseUrl,\n deps,\n );\n recordTelemetryBusinessInfo({\n media_type: \"video\",\n generation_mode: \"text\",\n model_key: result.model.key,\n ...(result.model.model_id !== undefined ? { model_id: result.model.model_id } : {}),\n ...(result.model.variant ? { variant: result.model.variant } : {}),\n duration_seconds: result.request.duration_seconds,\n resolution: result.request.resolution,\n aspect_ratio: result.request.aspect_ratio,\n artifact_count: result.artifacts.length,\n warning_count: result.warnings?.length ?? 0,\n });\n if (result.warnings?.length) markTelemetryPartialSuccess();\n\n if (jsonMode) {\n printJson(successJson(result.status === \"succeeded\" ? \"generation_completed\" : \"generation_submitted\", {\n task_id: result.task_id,\n local_task_id: result.local_task_id,\n tool: result.tool,\n model: result.model,\n workspace_id: result.workspace_id,\n status: result.status,\n artifacts: result.artifacts,\n request: result.request,\n ...(result.warnings ? { warnings: result.warnings } : {}),\n }, [\n ...(result.artifacts.length > 0\n ? [{ command: `oiioii record get ${result.artifacts[0]!.uri} --json`, description: \"Get generation record details\" }]\n : []),\n { command: `oiioii task status ${result.task_id} --json`, description: \"Check task status\" },\n ]));\n } else {\n human.success(result.status === \"succeeded\" ? \"Video generated successfully\" : \"Video generation submitted\");\n human.info(` Task ID: ${result.task_id}`);\n human.info(` Model: ${result.model.name ?? result.model.key}${result.model.variant ? ` (${result.model.variant})` : \"\"}`);\n human.info(` Duration: ${result.request.duration_seconds}s`);\n for (const art of result.artifacts) {\n human.info(` URI: ${art.uri}`);\n }\n for (const warning of result.warnings ?? []) {\n human.warn(`Warning: ${warning.message}`);\n }\n if (result.artifacts.length > 0) {\n human.info(`\\n Next: oiioii record get ${result.artifacts[0]!.uri}`);\n } else {\n human.info(`\\n Next: oiioii task wait ${result.task_id} --json`);\n }\n }\n } catch (err: unknown) {\n if (err instanceof CliError) {\n if (jsonMode) {\n printJson(errorJson(\"generation_failed\", err.code, err.message, err.details));\n } else {\n human.error(err.message);\n }\n process.exitCode = 1;\n return;\n }\n const msg = err instanceof Error ? err.message : String(err);\n if (jsonMode) {\n printJson(errorJson(\"generation_failed\", ErrorCode.GENERATION_FAILED, msg));\n } else {\n human.error(msg);\n }\n process.exitCode = 1;\n }\n });\n\n video\n .command(\"generate\")\n .description(\"Generate video from text and model-supported mixed image/video/audio references\")\n .requiredOption(\"--prompt <text>\", \"Video description\")\n .option(\"--image <uri...>\", \"Reference image URIs; may be combined with --video/--audio when supported\")\n .option(\"--video <uri...>\", \"Reference video URIs; may be combined with --image/--audio when supported\")\n .option(\"--audio <uri...>\", \"Reference audio URIs; may be combined with --image/--video when supported\")\n .option(\"--mode <mode>\", `Generation mode (auto, ${VIDEO_GENERATE_MODES.join(\", \")})`, \"auto\")\n .option(\"--model <model>\", \"Model name\", DEFAULT_VIDEO_MODEL)\n .option(\"--model-id <id>\", \"Exact model ID from inspect models\")\n .option(\"--variant <variant>\", \"Exact model variant from inspect models\")\n .option(\"--duration <seconds>\", \"Duration in seconds (defaults to the selected model catalog)\")\n .option(\"--aspect-ratio <ratio>\", \"Aspect ratio (defaults to the selected model catalog)\")\n .option(\"--resolution <resolution>\", \"Video resolution (defaults to the selected model catalog)\")\n .option(\"--dry-run\", \"Validate and preview the resolved request without submitting\")\n .action(async (opts, cmd) => {\n const jsonMode = isJsonMode(cmd);\n const rootOpts = getRootOpts(cmd);\n const configStore = deps.configStore ?? new FileConfigStore();\n try {\n const requestedMode = String(opts.mode) as VideoGenerateModeOption;\n if (requestedMode !== \"auto\" && !VIDEO_GENERATE_MODES.includes(requestedMode as VideoGenerateMode)) {\n throw new CliError(\n ErrorCode.INVALID_ARGUMENT,\n `Invalid video mode: ${requestedMode}. Expected auto, ${VIDEO_GENERATE_MODES.join(\", \")}.`,\n );\n }\n const auth = requireApiKeyAuth(rootOpts, configStore);\n const { workspaceId } = requireWorkspace(rootOpts, configStore);\n const params: VideoImageParams = {\n prompt: opts.prompt,\n images: opts.image,\n videos: opts.video,\n audios: opts.audio,\n mode: requestedMode,\n model: opts.model,\n modelId: opts.modelId,\n variant: opts.variant,\n ...(opts.duration !== undefined ? { duration: parseDuration(opts.duration) } : {}),\n aspectRatio: opts.aspectRatio,\n resolution: opts.resolution,\n };\n if (opts.dryRun === true) {\n printGenerationDryRun(await validateVideoDryRun(params, \"references\", auth.apiKey, auth.baseUrl, deps), jsonMode);\n return;\n }\n const result = await executeVideoImage(params, workspaceId, auth.apiKey, auth.baseUrl, deps);\n\n recordTelemetryBusinessInfo({\n media_type: \"video\",\n generation_mode: result.generation_mode ?? requestedMode,\n model_key: result.model.key,\n ...(result.model.model_id !== undefined ? { model_id: result.model.model_id } : {}),\n ...(result.model.variant ? { variant: result.model.variant } : {}),\n duration_seconds: result.request.duration_seconds,\n resolution: result.request.resolution,\n aspect_ratio: result.request.aspect_ratio,\n reference_image_count: opts.image?.length ?? 0,\n reference_video_count: opts.video?.length ?? 0,\n reference_audio_count: opts.audio?.length ?? 0,\n artifact_count: result.artifacts.length,\n warning_count: result.warnings?.length ?? 0,\n });\n if (result.warnings?.length) markTelemetryPartialSuccess();\n\n if (jsonMode) {\n printJson(successJson(result.status === \"succeeded\" ? \"generation_completed\" : \"generation_submitted\", {\n task_id: result.task_id,\n local_task_id: result.local_task_id,\n tool: result.tool,\n model: result.model,\n generation_mode: result.generation_mode,\n workspace_id: result.workspace_id,\n status: result.status,\n references: {\n images: opts.image ?? [],\n videos: opts.video ?? [],\n audios: opts.audio ?? [],\n },\n artifacts: result.artifacts,\n request: result.request,\n ...(result.warnings ? { warnings: result.warnings } : {}),\n }, [\n ...(result.artifacts.length > 0\n ? [{ command: `oiioii record get ${result.artifacts[0]!.uri} --json`, description: \"Get generation record details\" }]\n : []),\n { command: `oiioii task status ${result.task_id} --json`, description: \"Check task status\" },\n ]));\n } else {\n human.success(result.status === \"succeeded\" ? \"Video generated successfully\" : \"Video generation submitted\");\n human.info(` Task ID: ${result.task_id}`);\n human.info(` Model: ${result.model.name ?? result.model.key}${result.model.variant ? ` (${result.model.variant})` : \"\"}`);\n human.info(` Mode: ${result.generation_mode}`);\n human.info(` Refs: ${opts.image?.length ?? 0} image, ${opts.video?.length ?? 0} video, ${opts.audio?.length ?? 0} audio`);\n for (const artifact of result.artifacts) human.info(` URI: ${artifact.uri}`);\n for (const warning of result.warnings ?? []) human.warn(`Warning: ${warning.message}`);\n if (result.artifacts.length === 0) human.info(`\\n Next: oiioii task wait ${result.task_id} --json`);\n }\n } catch (err: unknown) {\n if (err instanceof CliError) {\n if (jsonMode) printJson(errorJson(\"generation_failed\", err.code, err.message, err.details));\n else human.error(err.message);\n } else {\n const message = err instanceof Error ? err.message : String(err);\n if (jsonMode) printJson(errorJson(\"generation_failed\", ErrorCode.GENERATION_FAILED, message));\n else human.error(message);\n }\n process.exitCode = 1;\n }\n });\n\n video\n .command(\"image\")\n .description(\"Generate video from image + prompt\")\n .requiredOption(\"--image <uri>\", \"Source image (hogi:// URI)\")\n .requiredOption(\"--prompt <text>\", \"Video description\")\n .option(\"--model <model>\", \"Model name\", DEFAULT_VIDEO_MODEL)\n .option(\"--model-id <id>\", \"Exact model ID from inspect models\")\n .option(\"--variant <variant>\", \"Exact model variant from inspect models\")\n .option(\"--duration <seconds>\", \"Duration in seconds (defaults to the selected model catalog)\")\n .option(\"--aspect-ratio <ratio>\", \"Aspect ratio (defaults to the selected model catalog)\")\n .option(\"--resolution <resolution>\", \"Video resolution (defaults to the selected model catalog)\")\n .option(\"--dry-run\", \"Validate and preview the resolved request without submitting\")\n .action(async (opts, cmd) => {\n const jsonMode = isJsonMode(cmd);\n const rootOpts = getRootOpts(cmd);\n const configStore = deps.configStore ?? new FileConfigStore();\n\n try {\n const auth = requireApiKeyAuth(rootOpts, configStore);\n const baseUrl = auth.baseUrl;\n const { workspaceId } = requireWorkspace(rootOpts, configStore);\n\n const params: VideoImageParams = {\n image: opts.image,\n prompt: opts.prompt,\n model: opts.model,\n modelId: opts.modelId,\n variant: opts.variant,\n ...(opts.duration !== undefined ? { duration: parseDuration(opts.duration) } : {}),\n aspectRatio: opts.aspectRatio,\n resolution: opts.resolution,\n };\n if (opts.dryRun === true) {\n printGenerationDryRun(await validateVideoDryRun(params, \"references\", auth.apiKey, baseUrl, deps), jsonMode);\n return;\n }\n const result = await executeVideoImage(\n params,\n workspaceId,\n auth.apiKey,\n baseUrl,\n deps,\n );\n recordTelemetryBusinessInfo({\n media_type: \"video\",\n generation_mode: \"image\",\n model_key: result.model.key,\n ...(result.model.model_id !== undefined ? { model_id: result.model.model_id } : {}),\n ...(result.model.variant ? { variant: result.model.variant } : {}),\n duration_seconds: result.request.duration_seconds,\n resolution: result.request.resolution,\n aspect_ratio: result.request.aspect_ratio,\n artifact_count: result.artifacts.length,\n warning_count: result.warnings?.length ?? 0,\n });\n if (result.warnings?.length) markTelemetryPartialSuccess();\n\n if (jsonMode) {\n printJson(successJson(result.status === \"succeeded\" ? \"generation_completed\" : \"generation_submitted\", {\n task_id: result.task_id,\n local_task_id: result.local_task_id,\n tool: result.tool,\n model: result.model,\n workspace_id: result.workspace_id,\n status: result.status,\n artifacts: result.artifacts,\n request: result.request,\n ...(result.warnings ? { warnings: result.warnings } : {}),\n }, [\n ...(result.artifacts.length > 0\n ? [{ command: `oiioii record get ${result.artifacts[0]!.uri} --json`, description: \"Get generation record details\" }]\n : []),\n { command: `oiioii task status ${result.task_id} --json`, description: \"Check task status\" },\n ]));\n } else {\n human.success(result.status === \"succeeded\" ? \"Video generated from image successfully\" : \"Image-to-video generation submitted\");\n human.info(` Task ID: ${result.task_id}`);\n human.info(` Model: ${result.model.name ?? result.model.key}${result.model.variant ? ` (${result.model.variant})` : \"\"}`);\n human.info(` Source: ${opts.image}`);\n human.info(` Duration: ${result.request.duration_seconds}s`);\n for (const art of result.artifacts) {\n human.info(` URI: ${art.uri}`);\n }\n for (const warning of result.warnings ?? []) {\n human.warn(`Warning: ${warning.message}`);\n }\n if (result.artifacts.length > 0) {\n human.info(`\\n Next: oiioii record get ${result.artifacts[0]!.uri}`);\n } else {\n human.info(`\\n Next: oiioii task wait ${result.task_id} --json`);\n }\n }\n } catch (err: unknown) {\n if (err instanceof CliError) {\n if (jsonMode) {\n printJson(errorJson(\"generation_failed\", err.code, err.message, err.details));\n } else {\n human.error(err.message);\n }\n process.exitCode = 1;\n return;\n }\n const msg = err instanceof Error ? err.message : String(err);\n if (jsonMode) {\n printJson(errorJson(\"generation_failed\", ErrorCode.GENERATION_FAILED, msg));\n } else {\n human.error(msg);\n }\n process.exitCode = 1;\n }\n });\n\n return video;\n}\n","/** Audio generation through Hogi GenAI MCP (Seed Audio and Suno). */\n\nimport { Command } from \"commander\";\nimport { FileConfigStore } from \"../config/config_store.js\";\nimport { HogiMcpClient } from \"../clients/hogi_mcp_client.js\";\nimport { DEFAULT_ASYNC_GENERATION_REQUEST_TIMEOUT_MS, HogiAsyncGenerationClient } from \"../clients/hogi_async_generation_client.js\";\nimport {\n resolveModelSelection,\n selectionCliArgs,\n selectionSummary,\n} from \"../core/model_selection.js\";\nimport {\n resolveGenerationInputMedia,\n validatePromptOnlyGeneration,\n validateReferenceImageCount,\n} from \"../core/generation_input_contract.js\";\nimport { DEFAULT_AUDIO_MODEL } from \"../core/model_defaults.js\";\nimport { TaskStore } from \"../core/task_store.js\";\nimport { PreviewStore } from \"../core/preview_store.js\";\nimport { createGenerationPreview } from \"../core/generation_preview.js\";\nimport { submitAsyncGeneration } from \"../core/async_generation.js\";\nimport { successJson, errorJson, printJson } from \"../output/json_output.js\";\nimport { ErrorCode, CliError } from \"../output/errors.js\";\nimport * as human from \"../output/human_output.js\";\nimport { logFeatureStep } from \"../logging/feature_logger.js\";\nimport { getRootOptions, isJsonOutput, requireApiKeyAuth } from \"../app/command_context.js\";\nimport { markTelemetryPartialSuccess, recordTelemetryBusinessInfo } from \"../telemetry/index.js\";\nimport type { GenerationArtifact, GenerationWarning } from \"./image.js\";\nimport {\n createLocalGenerationDryRun,\n printGenerationDryRun,\n type LocalGenerationDryRunResult,\n} from \"./generation_dry_run.js\";\n\nconst SEED_AUDIO_TOOL = \"generate_music_seed_audio\";\nconst SUNO_TOOL = \"generate_music_suno\";\nconst AUDIO_FORMATS = [\"wav\", \"mp3\", \"pcm\", \"ogg_opus\"] as const;\n\nexport type AudioOutputFormat = typeof AUDIO_FORMATS[number];\nexport type AudioModelFamily = \"seed-audio\" | \"suno\";\n\nexport interface AudioGenerateParams {\n prompt: string;\n model: string;\n modelId?: string;\n variant?: string;\n audioUrls?: string[];\n referenceImages?: string[];\n format?: AudioOutputFormat;\n enableSubtitle?: boolean;\n loudnessRate?: number;\n pitchRate?: number;\n sampleRate?: number;\n speechRate?: number;\n custom?: boolean;\n tags?: string;\n instrumental?: boolean;\n autoGenerateVideo?: boolean;\n}\n\nexport interface AudioCommandDeps {\n configStore?: FileConfigStore;\n taskStore?: TaskStore;\n previewStore?: PreviewStore;\n fetch?: typeof globalThis.fetch;\n audioGenerationTimeoutMs?: number;\n}\n\nexport interface AudioGenerateResult {\n task_id: string;\n local_task_id: string;\n tool: string;\n model: ReturnType<typeof selectionSummary>;\n workspace_id: string;\n status: \"created\" | \"submitting\" | \"queued\" | \"running\" | \"succeeded\" | \"failed\" | \"cancelled\";\n artifacts: GenerationArtifact[];\n warnings?: GenerationWarning[];\n}\n\nfunction requireWorkspace(rootOpts: Record<string, unknown>, configStore: FileConfigStore): string {\n const flag = rootOpts.workspace;\n if (typeof flag === \"string\" && flag) return flag;\n const fromEnv = process.env[\"OIIOII_WORKSPACE_ID\"]?.trim();\n if (fromEnv) return fromEnv;\n const configured = configStore.loadResolved().defaultWorkspaceId;\n if (configured) return configured;\n throw new CliError(ErrorCode.WORKSPACE_REQUIRED, \"No workspace set. Run: oiioii workspace set <workspace_id>\");\n}\n\nfunction normalizeUris(values: string[] | undefined): string[] {\n return [...new Set((values ?? []).map((value) => value.trim()).filter(Boolean))];\n}\n\nfunction assertUriPrefixes(values: string[], prefix: string, label: string): void {\n const invalid = values.find((value) => !value.startsWith(prefix));\n if (invalid) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, `${label} must use ${prefix} URIs: ${invalid}`);\n }\n}\n\nfunction assertNumberRange(value: number | undefined, name: string, min: number, max: number): void {\n if (value === undefined) return;\n if (!Number.isFinite(value) || value < min || value > max) {\n throw audioConstraint(`${name} must be between ${min} and ${max}.`, { field: name, received: value, minimum: min, maximum: max });\n }\n}\n\nfunction audioConstraint(message: string, details: Record<string, unknown> = {}): CliError {\n return new CliError(ErrorCode.MODEL_CONSTRAINT_VIOLATION, message, {\n category: \"validation\",\n retryable: false,\n ...details,\n });\n}\n\nfunction buildAudioToolArgs(\n toolName: string,\n params: AudioGenerateParams,\n variant: string | undefined,\n workspaceId: string,\n): { args: Record<string, unknown>; audioUrls: string[]; referenceImages: string[]; mode: string } {\n const prompt = params.prompt.trim();\n if (!prompt) throw new CliError(ErrorCode.INVALID_ARGUMENT, \"Audio prompt must not be empty.\");\n const audioUrls = normalizeUris(params.audioUrls);\n const referenceImages = normalizeUris(params.referenceImages);\n assertUriPrefixes(audioUrls, \"hogi://audio/\", \"Audio references\");\n assertUriPrefixes(referenceImages, \"hogi://image/\", \"Image references\");\n\n if (toolName === SEED_AUDIO_TOOL) {\n if (variant && variant !== \"seed-audio-1.0\") {\n throw audioConstraint(`Seed Audio only supports variant seed-audio-1.0, received ${variant}.`, { field: \"variant\", received: variant, supported: [\"seed-audio-1.0\"] });\n }\n if (audioUrls.length > 0 && referenceImages.length > 0) {\n throw audioConstraint(\"Seed Audio reference images and reference audio cannot be used together.\", { field: \"references\" });\n }\n if (audioUrls.length > 3) throw audioConstraint(\"Seed Audio supports at most 3 audio references.\", { field: \"audio\", received: audioUrls.length, supported_max: 3 });\n if (referenceImages.length > 1) throw audioConstraint(\"Seed Audio supports at most 1 reference image.\", { field: \"image\", received: referenceImages.length, supported_max: 1 });\n if (params.custom || params.tags || params.instrumental || params.autoGenerateVideo) {\n throw audioConstraint(\"--custom, --tags, --instrumental, and --auto-generate-video are only valid for Suno.\", { field: \"suno_options\" });\n }\n assertNumberRange(params.loudnessRate, \"--loudness-rate\", -50, 100);\n assertNumberRange(params.pitchRate, \"--pitch-rate\", -12, 12);\n assertNumberRange(params.speechRate, \"--speech-rate\", -50, 100);\n if (params.sampleRate !== undefined && (!Number.isInteger(params.sampleRate) || params.sampleRate <= 0)) {\n throw audioConstraint(\"--sample-rate must be a positive integer.\", { field: \"sample_rate\", received: params.sampleRate });\n }\n const audioConfig = {\n ...(params.format ? { format: params.format } : {}),\n ...(params.enableSubtitle !== undefined ? { enable_subtitle: params.enableSubtitle } : {}),\n ...(params.loudnessRate !== undefined ? { loudness_rate: params.loudnessRate } : {}),\n ...(params.pitchRate !== undefined ? { pitch_rate: params.pitchRate } : {}),\n ...(params.sampleRate !== undefined ? { sample_rate: params.sampleRate } : {}),\n ...(params.speechRate !== undefined ? { speech_rate: params.speechRate } : {}),\n };\n return {\n args: {\n prompt,\n ...(audioUrls.length ? { audioUrl: audioUrls } : {}),\n ...(referenceImages.length ? { referenceImages } : {}),\n ...(Object.keys(audioConfig).length ? { audioConfig } : {}),\n workspace_id: workspaceId,\n },\n audioUrls,\n referenceImages,\n mode: audioUrls.length ? \"audio_reference\" : referenceImages.length ? \"image_reference\" : \"text\",\n };\n }\n\n if (toolName === SUNO_TOOL) {\n if (variant && variant !== \"chirp-v4-5\" && variant !== \"chirp-v5\") {\n throw audioConstraint(`Suno only supports variants chirp-v4-5 and chirp-v5, received ${variant}.`, { field: \"variant\", received: variant, supported: [\"chirp-v4-5\", \"chirp-v5\"] });\n }\n if (audioUrls.length || referenceImages.length || params.format || params.enableSubtitle !== undefined\n || params.loudnessRate !== undefined || params.pitchRate !== undefined\n || params.sampleRate !== undefined || params.speechRate !== undefined) {\n throw audioConstraint(\"Reference and audio configuration options are only valid for Seed Audio.\", { field: \"seed_audio_options\" });\n }\n const custom = params.custom === true;\n const instrumental = params.instrumental === true;\n if (!custom && params.tags) {\n throw audioConstraint(\"--tags requires Suno --custom mode.\", { field: \"tags\", requires: \"custom\" });\n }\n const tags = params.tags?.trim() || (custom && instrumental ? prompt : undefined);\n return {\n args: {\n custom,\n // HOE currently validates `prompt` as required even though the backend\n // source schema marks it optional for description mode. Send the\n // user prompt in both fields for compatibility; current backends use\n // gptDescriptionPrompt when custom=false and safely ignore prompt.\n prompt,\n ...(custom && tags ? { tags } : {}),\n ...(!custom ? { gptDescriptionPrompt: prompt } : {}),\n instrumental,\n autoGenerateVideo: params.autoGenerateVideo === true,\n ...(variant ? { version: variant } : {}),\n workspace_id: workspaceId,\n },\n audioUrls,\n referenceImages,\n mode: custom ? \"music_custom\" : \"music_description\",\n };\n }\n\n throw new CliError(ErrorCode.MODEL_NOT_SUPPORTED, `Unsupported audio generation tool: ${toolName}`, {\n category: \"validation\",\n retryable: false,\n tool: toolName,\n });\n}\n\nfunction assertAudioModelFamily(toolName: string, expectedFamily?: AudioModelFamily): void {\n if (!expectedFamily) return;\n const expectedTool = expectedFamily === \"seed-audio\" ? SEED_AUDIO_TOOL : SUNO_TOOL;\n if (toolName === expectedTool) return;\n throw new CliError(\n ErrorCode.MODEL_NOT_SUPPORTED,\n `The audio ${expectedFamily} command cannot use model tool ${toolName}.`,\n {\n category: \"validation\",\n retryable: false,\n hint: `Use a ${expectedFamily} model ID or run oiioii audio ${expectedFamily === \"seed-audio\" ? \"suno\" : \"seed-audio\"}.`,\n expected_tool: expectedTool,\n received_tool: toolName,\n },\n );\n}\n\nasync function prepareAudioRequest(\n params: AudioGenerateParams,\n workspaceId: string,\n apiKey: string,\n baseUrl: string,\n deps: AudioCommandDeps,\n requireActiveCatalog: boolean,\n expectedFamily?: AudioModelFamily,\n) {\n const selection = await resolveModelSelection({\n domain: \"audio\",\n model: params.model,\n modelId: params.modelId,\n variant: params.variant,\n requireActiveCatalog,\n baseUrl,\n apiKey,\n fetch: deps.fetch,\n });\n assertAudioModelFamily(selection.toolName, expectedFamily);\n const prepared = buildAudioToolArgs(selection.toolName, params, selection.variant, workspaceId);\n if (prepared.referenceImages.length === 0 && prepared.audioUrls.length === 0) {\n validatePromptOnlyGeneration(selection);\n } else {\n validateReferenceImageCount(selection, prepared.referenceImages.length);\n if (prepared.audioUrls.length > 0 && !resolveGenerationInputMedia(selection).audio) {\n throw audioConstraint(\n `${selection.name ?? selection.key} does not support reference audio.`,\n {\n field: \"audio\",\n received: prepared.audioUrls.length,\n supported: false,\n },\n );\n }\n }\n return {\n selection,\n prepared,\n };\n}\n\nexport async function executeAudioGenerate(\n params: AudioGenerateParams,\n workspaceId: string,\n apiKey: string,\n baseUrl: string,\n deps: AudioCommandDeps = {},\n expectedFamily?: AudioModelFamily,\n): Promise<AudioGenerateResult> {\n const taskStore = deps.taskStore ?? new TaskStore();\n const request = await prepareAudioRequest(params, workspaceId, apiKey, baseUrl, deps, true, expectedFamily);\n const { prepared, selection } = request;\n logFeatureStep(\"audio\", \"generation.prepared\", {\n mode: prepared.mode,\n model: selection.key,\n model_id: selection.modelId,\n variant: selection.variant,\n reference_audio_count: prepared.audioUrls.length,\n reference_image_count: prepared.referenceImages.length,\n output_format: params.format,\n subtitle_enabled: params.enableSubtitle === true,\n custom_mode: params.custom === true,\n instrumental: params.instrumental === true,\n workspace_id: workspaceId,\n });\n\n const commandName = expectedFamily ?? \"generate\";\n const command = `oiioii audio ${commandName} --prompt \"${params.prompt}\" ${selectionCliArgs(selection)}`;\n const task = taskStore.create({\n workspaceId,\n command,\n toolName: selection.toolName,\n inputArgs: {\n provider: \"mcp_genai\",\n prompt: params.prompt,\n model: selection.key,\n modelId: selection.modelId,\n variant: selection.variant,\n mcpMethodName: selection.toolName,\n workspaceId,\n mode: prepared.mode,\n referenceAudioCount: prepared.audioUrls.length,\n referenceImageCount: prepared.referenceImages.length,\n toolArgs: {\n format: params.format,\n enableSubtitle: params.enableSubtitle,\n custom: params.custom,\n instrumental: params.instrumental,\n },\n },\n });\n taskStore.update(task.id, { status: \"submitting\" });\n const client = new HogiMcpClient({\n baseUrl,\n apiKey,\n fetch: deps.fetch,\n timeoutMs: deps.audioGenerationTimeoutMs ?? DEFAULT_ASYNC_GENERATION_REQUEST_TIMEOUT_MS,\n });\n\n try {\n const submitted = await submitAsyncGeneration({\n client: new HogiAsyncGenerationClient(client),\n taskStore,\n previewStore: deps.previewStore,\n task,\n mediaType: \"audio\",\n prompt: params.prompt,\n model: selection.variant,\n backendBaseUrl: baseUrl,\n input: prepared.args,\n });\n const artifacts = submitted.task.resourceUris.map((uri) => ({ type: \"audio\" as const, uri, mime_type: \"audio/mpeg\" }));\n const warnings: GenerationWarning[] = submitted.previewWarning ? [submitted.previewWarning] : [];\n logFeatureStep(\"audio\", \"generation.submitted\", {\n local_task_id: task.id,\n backend_task_id: submitted.submission.taskId,\n status: submitted.task.status,\n });\n return {\n task_id: submitted.submission.taskId,\n local_task_id: task.id,\n tool: selection.toolName,\n model: selectionSummary(selection),\n workspace_id: workspaceId,\n status: submitted.task.status,\n artifacts,\n ...(warnings.length ? { warnings } : {}),\n };\n } catch (error) {\n const code = error instanceof CliError ? error.code : ErrorCode.GENERATION_FAILED;\n const message = error instanceof Error ? error.message : String(error);\n if (!taskStore.get(task.id)?.backendTaskId) {\n taskStore.update(task.id, { status: \"failed\", error: { code, message } });\n createGenerationPreview({ taskStore, previewStore: deps.previewStore, task, resources: [], status: \"failed\", error: { code, message } });\n }\n logFeatureStep(\"audio\", \"generation.command_failed\", { task_id: task.id, backend_task_cached: taskStore.get(task.id)?.backendTaskId !== undefined, error_code: code }, \"error\");\n throw error;\n }\n}\n\nfunction optionalNumber(value: unknown, name: string): number | undefined {\n if (value === undefined) return undefined;\n const parsed = Number(value);\n if (!Number.isFinite(parsed)) throw new CliError(ErrorCode.INVALID_ARGUMENT, `${name} must be a number.`);\n return parsed;\n}\n\nexport async function validateAudioDryRun(\n params: AudioGenerateParams,\n workspaceId: string,\n apiKey: string,\n baseUrl: string,\n deps: AudioCommandDeps,\n expectedFamily?: AudioModelFamily,\n): Promise<LocalGenerationDryRunResult> {\n const { prepared, selection } = await prepareAudioRequest(\n params,\n workspaceId,\n apiKey,\n baseUrl,\n deps,\n true,\n expectedFamily,\n );\n const argumentsWithoutWorkspace = { ...prepared.args };\n delete argumentsWithoutWorkspace.workspace_id;\n return createLocalGenerationDryRun(selection, \"audio\", argumentsWithoutWorkspace);\n}\n\nfunction parseAudioParams(opts: Record<string, unknown>, forcedModel?: AudioModelFamily): AudioGenerateParams {\n const format = opts.format as string | undefined;\n if (format !== undefined && !AUDIO_FORMATS.includes(format as AudioOutputFormat)) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, `Invalid audio format: ${format}. Expected ${AUDIO_FORMATS.join(\", \")}.`);\n }\n return {\n prompt: String(opts.prompt),\n model: forcedModel ?? String(opts.model ?? \"seed-audio\"),\n modelId: opts.modelId as string | undefined,\n variant: opts.variant as string | undefined,\n audioUrls: opts.audio as string[] | undefined,\n referenceImages: opts.image as string[] | undefined,\n format: format as AudioOutputFormat | undefined,\n enableSubtitle: opts.subtitle === true ? true : undefined,\n loudnessRate: optionalNumber(opts.loudnessRate, \"--loudness-rate\"),\n pitchRate: optionalNumber(opts.pitchRate, \"--pitch-rate\"),\n sampleRate: optionalNumber(opts.sampleRate, \"--sample-rate\"),\n speechRate: optionalNumber(opts.speechRate, \"--speech-rate\"),\n custom: opts.custom === true,\n tags: opts.tags as string | undefined,\n instrumental: opts.instrumental === true,\n autoGenerateVideo: opts.autoGenerateVideo === true,\n };\n}\n\nasync function runAudioCommand(\n opts: Record<string, unknown>,\n cmd: Command,\n deps: AudioCommandDeps,\n forcedModel?: AudioModelFamily,\n): Promise<void> {\n const jsonMode = isJsonOutput(cmd);\n const rootOpts = getRootOptions(cmd);\n const configStore = deps.configStore ?? new FileConfigStore();\n try {\n const auth = requireApiKeyAuth(rootOpts, configStore);\n const workspaceId = requireWorkspace(rootOpts, configStore);\n const params = parseAudioParams(opts, forcedModel);\n if (opts.dryRun === true) {\n printGenerationDryRun(await validateAudioDryRun(params, workspaceId, auth.apiKey, auth.baseUrl, deps, forcedModel), jsonMode);\n return;\n }\n const result = await executeAudioGenerate(params, workspaceId, auth.apiKey, auth.baseUrl, deps, forcedModel);\n const generationMode = result.tool === SUNO_TOOL\n ? (params.custom ? \"music_custom\" : \"music_description\")\n : (params.audioUrls?.length ? \"audio_reference\" : params.referenceImages?.length ? \"image_reference\" : \"text\");\n recordTelemetryBusinessInfo({\n media_type: \"audio\",\n generation_mode: generationMode,\n model_key: result.model.key,\n ...(result.model.model_id !== undefined ? { model_id: result.model.model_id } : {}),\n ...(result.model.variant ? { variant: result.model.variant } : {}),\n reference_audio_count: params.audioUrls?.length ?? 0,\n reference_image_count: params.referenceImages?.length ?? 0,\n ...(params.format ? { output_format: params.format } : {}),\n subtitle_enabled: params.enableSubtitle === true,\n custom_mode: params.custom === true,\n instrumental: params.instrumental === true,\n artifact_count: result.artifacts.length,\n warning_count: result.warnings?.length ?? 0,\n });\n if (result.warnings?.length) markTelemetryPartialSuccess();\n\n if (jsonMode) {\n printJson(successJson(result.status === \"succeeded\" ? \"generation_completed\" : \"generation_submitted\", {\n task_id: result.task_id,\n local_task_id: result.local_task_id,\n tool: result.tool,\n model: result.model,\n workspace_id: result.workspace_id,\n status: result.status,\n artifacts: result.artifacts,\n ...(result.warnings ? { warnings: result.warnings } : {}),\n }, [\n ...(result.artifacts.length ? [{ command: `oiioii record get ${result.artifacts[0]!.uri} --json`, description: \"Get generation record details\" }] : []),\n { command: `oiioii task status ${result.task_id} --json`, description: \"Check task status\" },\n ]));\n } else {\n human.success(result.status === \"succeeded\" ? \"Audio generated successfully\" : \"Audio generation submitted\");\n human.info(` Task ID: ${result.task_id}`);\n human.info(` Model: ${result.model.name ?? result.model.key}${result.model.variant ? ` (${result.model.variant})` : \"\"}`);\n for (const artifact of result.artifacts) human.info(` URI: ${artifact.uri}`);\n for (const warning of result.warnings ?? []) human.warn(`Warning: ${warning.message}`);\n if (result.artifacts.length === 0) human.info(`\\n Next: oiioii task wait ${result.task_id} --json`);\n }\n } catch (error) {\n const code = error instanceof CliError ? error.code : ErrorCode.GENERATION_FAILED;\n const message = error instanceof Error ? error.message : String(error);\n if (jsonMode) printJson(errorJson(\"generation_failed\", code, message, error instanceof CliError ? error.details : undefined));\n else human.error(message);\n process.exitCode = 1;\n }\n}\n\nfunction addSeedAudioOptions(command: Command): Command {\n return command\n .option(\"--model-id <id>\", \"Exact Seed Audio model ID from inspect models\")\n .option(\"--variant <variant>\", \"Exact Seed Audio variant from inspect models\")\n .option(\"--audio <uri...>\", \"Reference audio URIs (maximum 3)\")\n .option(\"--image <uri...>\", \"Reference image URI (maximum 1)\")\n .option(\"--format <format>\", `Output format (${AUDIO_FORMATS.join(\", \")})`)\n .option(\"--subtitle\", \"Request subtitle metadata\")\n .option(\"--loudness-rate <number>\", \"Loudness adjustment (-50 to 100)\")\n .option(\"--pitch-rate <number>\", \"Pitch adjustment (-12 to 12)\")\n .option(\"--sample-rate <number>\", \"Output sample rate\")\n .option(\"--speech-rate <number>\", \"Speech rate adjustment (-50 to 100)\")\n .option(\"--dry-run\", \"Validate and preview the resolved request without submitting\");\n}\n\nfunction addSunoOptions(command: Command): Command {\n return command\n .option(\"--model-id <id>\", \"Exact Suno model ID from inspect models\")\n .option(\"--variant <variant>\", \"Exact Suno variant from inspect models\")\n .option(\"--custom\", \"Use custom lyrics/style mode\")\n .option(\"--tags <text>\", \"Custom-mode music style tags\")\n .option(\"--instrumental\", \"Generate instrumental music\")\n .option(\"--auto-generate-video\", \"Ask Suno to also generate its provider-side video\")\n .option(\"--dry-run\", \"Validate and preview the resolved request without submitting\");\n}\n\nexport function createAudioCommand(deps: AudioCommandDeps = {}): Command {\n const audio = new Command(\"audio\").description(\"Audio and music generation commands\");\n audio\n .command(\"generate\")\n .description(\"Generate audio with Seed Audio or Suno\")\n .requiredOption(\"--prompt <text>\", \"Audio description; interpreted as lyrics in Suno custom mode\")\n .option(\"--model <model>\", \"Model name (seed-audio or suno)\", DEFAULT_AUDIO_MODEL)\n .option(\"--model-id <id>\", \"Exact model ID from inspect models\")\n .option(\"--variant <variant>\", \"Exact model variant from inspect models\")\n .option(\"--audio <uri...>\", \"Seed Audio reference audio URIs (maximum 3)\")\n .option(\"--image <uri...>\", \"Seed Audio reference image URI (maximum 1)\")\n .option(\"--format <format>\", `Seed Audio output format (${AUDIO_FORMATS.join(\", \")})`)\n .option(\"--subtitle\", \"Request Seed Audio subtitle metadata\")\n .option(\"--loudness-rate <number>\", \"Seed Audio loudness adjustment (-50 to 100)\")\n .option(\"--pitch-rate <number>\", \"Seed Audio pitch adjustment (-12 to 12)\")\n .option(\"--sample-rate <number>\", \"Seed Audio output sample rate\")\n .option(\"--speech-rate <number>\", \"Seed Audio speech rate adjustment (-50 to 100)\")\n .option(\"--custom\", \"Use Suno custom lyrics/style mode\")\n .option(\"--tags <text>\", \"Suno custom-mode music style tags\")\n .option(\"--instrumental\", \"Generate instrumental music with Suno\")\n .option(\"--auto-generate-video\", \"Ask Suno to also generate its provider-side video\")\n .option(\"--dry-run\", \"Validate and preview the resolved request without submitting\")\n .action(async (opts, cmd) => await runAudioCommand(opts, cmd, deps));\n\n addSeedAudioOptions(audio\n .command(\"seed-audio\")\n .description(\"Generate speech or audio with Seed Audio\")\n .requiredOption(\"--prompt <text>\", \"Audio description\"))\n .action(async (opts, cmd) => await runAudioCommand(opts, cmd, deps, \"seed-audio\"));\n\n addSunoOptions(audio\n .command(\"suno\")\n .description(\"Generate music with Suno\")\n .requiredOption(\"--prompt <text>\", \"Music description; interpreted as lyrics in custom mode\"))\n .action(async (opts, cmd) => await runAudioCommand(opts, cmd, deps, \"suno\"));\n return audio;\n}\n","import { Command } from \"commander\";\nimport { logFeatureStep, reportFeatureFailure } from \"../logging/feature_logger.js\";\nimport { recordTelemetryBusinessInfo } from \"../telemetry/index.js\";\nimport { TaskStore, type OiioiiTask } from \"../core/task_store.js\";\nimport { isTerminalTask, syncAsyncGenerationTask } from \"../core/async_generation.js\";\nimport { PreviewStore } from \"../core/preview_store.js\";\nimport { FileConfigStore } from \"../config/config_store.js\";\nimport { HogiMcpClient } from \"../clients/hogi_mcp_client.js\";\nimport { HogiAsyncGenerationClient } from \"../clients/hogi_async_generation_client.js\";\nimport { getRootOptions, isJsonOutput, requireApiKeyAuth } from \"../app/command_context.js\";\nimport { errorJson, printJson, successJson } from \"../output/json_output.js\";\nimport { CliError, ErrorCode } from \"../output/errors.js\";\nimport * as human from \"../output/human_output.js\";\n\nfunction parsePositiveInteger(value: string, label: string): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, `${label} must be a positive integer.`);\n }\n return parsed;\n}\n\nfunction printTask(task: OiioiiTask): void {\n human.info(`${task.backendTaskId ?? task.id} ${task.status} ${task.toolName} ${task.updatedAt}`);\n}\n\nfunction handleTaskError(error: unknown, jsonMode: boolean, type: string): void {\n const cliError = error instanceof CliError\n ? error\n : new CliError(ErrorCode.SERVER_ERROR, error instanceof Error ? error.message : String(error));\n reportFeatureFailure(cliError.code, cliError.message);\n if (jsonMode) printJson(errorJson(type, cliError.code, cliError.message, cliError.details));\n else human.error(cliError.message);\n process.exitCode = 1;\n}\n\nexport interface TaskCommandDeps {\n configStore?: FileConfigStore;\n taskStore?: TaskStore;\n previewStore?: PreviewStore;\n fetch?: typeof globalThis.fetch;\n pollIntervalMs?: number;\n}\n\nfunction createAsyncClient(cmd: Command, deps: TaskCommandDeps, backendBaseUrl?: string): HogiAsyncGenerationClient {\n const configStore = deps.configStore ?? new FileConfigStore();\n const auth = requireApiKeyAuth(getRootOptions(cmd), configStore);\n return new HogiAsyncGenerationClient(new HogiMcpClient({\n baseUrl: backendBaseUrl ?? auth.baseUrl,\n apiKey: auth.apiKey,\n fetch: deps.fetch,\n timeoutMs: 30_000,\n }));\n}\n\nasync function refreshTask(taskItem: OiioiiTask, cmd: Command, deps: TaskCommandDeps): Promise<OiioiiTask> {\n if (!taskItem.backendTaskId || isTerminalTask(taskItem)) return taskItem;\n const taskStore = deps.taskStore ?? new TaskStore();\n const result = await syncAsyncGenerationTask({\n client: createAsyncClient(cmd, deps, taskItem.backendBaseUrl),\n taskStore,\n previewStore: deps.previewStore,\n task: taskItem,\n });\n return result.task;\n}\n\nexport function createTaskCommand(deps: TaskCommandDeps = {}): Command {\n const task = new Command(\"task\").description(\"Generation task management\");\n\n task\n .command(\"list\")\n .description(\"List recent tasks\")\n .option(\"--limit <count>\", \"Maximum tasks to return\", \"20\")\n .action((opts: { limit: string }, cmd: Command) => {\n const jsonMode = isJsonOutput(cmd);\n try {\n const limit = parsePositiveInteger(opts.limit, \"limit\");\n const tasks = (deps.taskStore ?? new TaskStore()).list(limit);\n recordTelemetryBusinessInfo({ task_count: tasks.length, limit });\n logFeatureStep(\"task\", \"task.listed\", { count: tasks.length, limit });\n if (jsonMode) printJson(successJson(\"task_list\", { tasks, count: tasks.length }));\n else {\n human.heading(\"Recent Tasks\");\n for (const taskItem of tasks) printTask(taskItem);\n if (tasks.length === 0) human.info(\"No local tasks found.\");\n }\n } catch (error) {\n handleTaskError(error, jsonMode, \"task_list\");\n }\n });\n\n task\n .command(\"status\")\n .description(\"Get task status\")\n .argument(\"<task_id>\", \"Task ID\")\n .action(async (id: string, _opts: unknown, cmd: Command) => {\n const jsonMode = isJsonOutput(cmd);\n try {\n const store = deps.taskStore ?? new TaskStore();\n let taskItem = store.getByAnyId(id);\n if (!taskItem) throw new CliError(ErrorCode.TASK_NOT_FOUND, `Task not found: ${id}`);\n taskItem = await refreshTask(taskItem, cmd, { ...deps, taskStore: store });\n recordTelemetryBusinessInfo({ task_status: taskItem.status });\n logFeatureStep(\"task\", \"task.status_read\", { task_id: id, status: taskItem.status });\n if (jsonMode) printJson(successJson(\"task_status\", { task: taskItem }));\n else printTask(taskItem);\n } catch (error) {\n handleTaskError(error, jsonMode, \"task_status\");\n }\n });\n\n task\n .command(\"wait\")\n .description(\"Wait for a task to complete\")\n .argument(\"<task_id>\", \"Task ID\")\n .option(\"--timeout <seconds>\", \"Max wait time\", \"300\")\n .action(async (id: string, opts: { timeout: string }, cmd: Command) => {\n const jsonMode = isJsonOutput(cmd);\n try {\n const timeoutSeconds = parsePositiveInteger(opts.timeout, \"timeout\");\n const store = deps.taskStore ?? new TaskStore();\n const deadline = Date.now() + timeoutSeconds * 1_000;\n let taskItem = store.getByAnyId(id);\n if (!taskItem) throw new CliError(ErrorCode.TASK_NOT_FOUND, `Task not found: ${id}`);\n while (!isTerminalTask(taskItem) && Date.now() < deadline) {\n taskItem = await refreshTask(taskItem, cmd, { ...deps, taskStore: store });\n if (!isTerminalTask(taskItem)) {\n const remainingMs = Math.max(0, deadline - Date.now());\n await new Promise((resolve) => setTimeout(resolve, Math.min(deps.pollIntervalMs ?? 2_000, remainingMs)));\n }\n }\n if (!isTerminalTask(taskItem)) {\n throw new CliError(ErrorCode.TASK_TIMEOUT, `Timed out waiting for task ${id} after ${timeoutSeconds}s.`);\n }\n recordTelemetryBusinessInfo({ task_status: taskItem.status, timeout_seconds: timeoutSeconds });\n logFeatureStep(\"task\", \"task.wait_completed\", { task_id: id, status: taskItem.status });\n if (jsonMode) printJson(successJson(\"task_wait\", { task: taskItem }));\n else printTask(taskItem);\n } catch (error) {\n handleTaskError(error, jsonMode, \"task_wait\");\n }\n });\n\n return task;\n}\n","/**\n * Record commands: get, open.\n *\n * `oiioii record get <hogi-uri> [--json]` — Fetch generation record by hogi:// URI.\n * `oiioii record open <hogi-uri>` — Open a resource in browser (future).\n *\n * Requires authentication via the OIIOII_API_KEY environment variable.\n */\n\nimport { Command } from \"commander\";\nimport { FileConfigStore } from \"../config/config_store.js\";\nimport { spawn } from \"node:child_process\";\nimport { HogiGenAIRecordClient } from \"../clients/hogi_genai_record_client.js\";\nimport { HogiResClient } from \"../clients/hogi_res_client.js\";\nimport { successJson, errorJson, printJson } from \"../output/json_output.js\";\nimport { ErrorCode, CliError } from \"../output/errors.js\";\nimport * as human from \"../output/human_output.js\";\nimport { recordTelemetryBusinessInfo, telemetryResourceType, telemetrySizeBucket } from \"../telemetry/index.js\";\nimport { getRootOptions, isJsonOutput, requireApiKeyAuth } from \"../app/command_context.js\";\n\n/** Get --json flag from the root program. */\nconst isJsonMode = isJsonOutput;\n\n/**\n * Resolve the API key from the local environment.\n * Throws CliError(AUTH_REQUIRED) if it is not set.\n */\nfunction requireApiKey(command: Command): { apiKey: string; baseUrl: string } {\n const configStore = new FileConfigStore();\n const auth = requireApiKeyAuth(getRootOptions(command), configStore);\n return { apiKey: auth.apiKey, baseUrl: auth.baseUrl };\n}\n\nfunction openFile(path: string): boolean {\n const command = process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"cmd\"\n : \"xdg-open\";\n const args = process.platform === \"win32\" ? [\"/c\", \"start\", \"\", path] : [path];\n try {\n const child = spawn(command, args, { detached: true, stdio: \"ignore\" });\n child.unref();\n return true;\n } catch {\n return false;\n }\n}\n\nexport function createRecordCommand(): Command {\n const record = new Command(\"record\").description(\"GenAI record queries\");\n\n record\n .command(\"get\")\n .description(\"Get generation record by hogi:// URI\")\n .argument(\"<uri>\", \"hogi:// URI (e.g. hogi://image/abc123)\")\n .action(async (uri: string, _opts: unknown, cmd: Command) => {\n const jsonMode = isJsonMode(cmd);\n\n try {\n const { apiKey, baseUrl } = requireApiKey(cmd);\n const client = new HogiGenAIRecordClient({ baseUrl, apiKey });\n const rec = await client.getByUri(uri);\n recordTelemetryBusinessInfo({\n resource_type: telemetryResourceType(uri),\n record_success: rec.success,\n output_count: rec.output_uris.length,\n });\n\n if (jsonMode) {\n printJson(successJson(\"record_get\", {\n id: rec.id,\n type: rec.type,\n workspace_id: rec.workspace_id,\n method: rec.mcp_method_name,\n input_args: rec.input_args,\n output_uris: rec.output_uris,\n success: rec.success,\n error_message: rec.error_message,\n agent: rec.agent,\n created_at: rec.created_at,\n updated_at: rec.updated_at,\n }));\n } else {\n human.heading(\"Generation Record\");\n human.info(` ID: ${rec.id}`);\n human.info(` Type: ${rec.type}`);\n human.info(` Workspace: ${rec.workspace_id}`);\n human.info(` Method: ${rec.mcp_method_name}`);\n human.info(` Success: ${rec.success}`);\n if (rec.error_message) {\n human.info(` Error: ${rec.error_message}`);\n }\n human.info(` Output URIs:`);\n for (const u of rec.output_uris) {\n human.info(` - ${u}`);\n }\n human.info(` Created: ${rec.created_at}`);\n }\n } catch (err: unknown) {\n if (err instanceof CliError) {\n if (jsonMode) {\n printJson(errorJson(\"record_get\", err.code, err.message, err.details));\n } else {\n human.error(err.message);\n }\n process.exitCode = 1;\n return;\n }\n const msg = err instanceof Error ? err.message : String(err);\n if (jsonMode) {\n printJson(errorJson(\"record_get\", ErrorCode.SERVER_ERROR, msg));\n } else {\n human.error(msg);\n }\n process.exitCode = 1;\n }\n });\n\n record\n .command(\"open\")\n .description(\"Download and optionally open a hogi:// resource\")\n .argument(\"<uri>\", \"hogi:// URI\")\n .option(\"-o, --output <path>\", \"Output file or directory path\")\n .option(\"--filename <name>\", \"Download filename hint passed to backend\")\n .option(\"--wm\", \"Request watermarked asset\")\n .option(\"--no-open\", \"Download only; do not open the local file\")\n .action(async (uri: string, opts: { output?: string; filename?: string; wm?: boolean; open?: boolean }, cmd: Command) => {\n const jsonMode = isJsonMode(cmd);\n\n try {\n const { apiKey, baseUrl } = requireApiKey(cmd);\n const client = new HogiResClient({ baseUrl, apiKey });\n const result = await client.download(uri, {\n output: opts.output,\n filename: opts.filename,\n watermark: opts.wm,\n });\n const shouldOpen = opts.open !== false;\n const opened = shouldOpen ? openFile(result.path) : false;\n recordTelemetryBusinessInfo({\n resource_type: telemetryResourceType(uri),\n size_bucket: telemetrySizeBucket(result.bytes),\n watermark: opts.wm === true,\n open_requested: shouldOpen,\n opened,\n });\n\n if (jsonMode) {\n printJson(successJson(\"record_open\", {\n uri: result.uri,\n path: result.path,\n bytes: result.bytes,\n mime_type: result.mimeType,\n opened,\n }));\n } else {\n human.success(`Downloaded: ${result.path}`);\n human.info(` URI: ${result.uri}`);\n human.info(` Bytes: ${result.bytes}`);\n if (result.mimeType) human.info(` Type: ${result.mimeType}`);\n human.info(` Opened: ${opened}`);\n }\n } catch (err: unknown) {\n if (err instanceof CliError) {\n if (jsonMode) {\n printJson(errorJson(\"record_open\", err.code, err.message, err.details));\n } else {\n human.error(err.message);\n }\n process.exitCode = 1;\n return;\n }\n const msg = err instanceof Error ? err.message : String(err);\n if (jsonMode) {\n printJson(errorJson(\"record_open\", ErrorCode.SERVER_ERROR, msg));\n } else {\n human.error(msg);\n }\n process.exitCode = 1;\n }\n });\n\n return record;\n}\n","/**\n * HogiGenAIRecordClient — fetches generation records by hogi:// URI.\n *\n * Endpoint: GET {baseUrl}/genai/image-record/by-uri?uri=<encoded>\n * Auth: x-hogi-api-key header (same key as MCP client).\n *\n * Despite the route name containing \"image-record\", this endpoint also\n * returns video records — distinguished by the `type` field.\n */\n\nimport { CliError, ErrorCode } from \"../output/errors.js\";\nimport { startApiCall } from \"../logging/api_call_logger.js\";\nimport type { LogRecorder } from \"../logging/types.js\";\n\n// ── Types ────────────────────────────────────────────────────────────\n\n/** A generation record returned by the backend. */\nexport interface GenAIRecord {\n id: string;\n workspace_id: string;\n mcp_method_name: string;\n input_args: Record<string, unknown>;\n output_uris: string[];\n success: boolean;\n error_message: string | null;\n type: \"image\" | \"video\" | string;\n agent: string | null;\n created_at: string;\n updated_at: string;\n}\n\n/** Backend response shape. */\ninterface RecordApiResponse {\n success: boolean;\n data?: GenAIRecord;\n error?: string;\n}\n\n/** Options for constructing HogiGenAIRecordClient. */\nexport interface RecordClientOptions {\n baseUrl: string;\n apiKey: string;\n /** Custom fetch for testing (default: globalThis.fetch). */\n fetch?: typeof globalThis.fetch;\n logger?: LogRecorder;\n}\n\n// ── Client ──────────────────────────────────────────────────────────\n\nexport class HogiGenAIRecordClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly _fetch: typeof globalThis.fetch;\n private readonly logger?: LogRecorder;\n\n constructor(options: RecordClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = options.apiKey;\n this._fetch = options.fetch ?? globalThis.fetch;\n this.logger = options.logger;\n }\n\n /**\n * Fetch a generation record by hogi:// URI.\n *\n * @param uri The hogi:// URI to look up (e.g. \"hogi://image/abc123\")\n * @returns The GenAIRecord\n * @throws CliError with RECORD_NOT_FOUND, AUTH_REQUIRED, INVALID_ARGUMENT, etc.\n */\n async getByUri(uri: string): Promise<GenAIRecord> {\n if (!uri || !uri.startsWith(\"hogi://\")) {\n throw new CliError(\n ErrorCode.INVALID_ARGUMENT,\n `Invalid hogi URI: \"${uri}\". Expected format: hogi://image/<id> or hogi://video/<id>`,\n );\n }\n\n const encodedUri = encodeURIComponent(uri);\n const url = `${this.baseUrl}/genai/image-record/by-uri?uri=${encodedUri}`;\n const apiLog = startApiCall({\n source: \"hogi_genai_record_client\",\n operation: \"record.get_by_uri\",\n method: \"GET\",\n path: \"/genai/image-record/by-uri\",\n }, this.logger);\n\n let response: Response;\n try {\n response = await this._fetch(url, {\n method: \"GET\",\n headers: {\n \"x-hogi-api-key\": this.apiKey,\n },\n });\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n const error = new CliError(ErrorCode.NETWORK_ERROR, `Network error: ${msg}`);\n apiLog.failure(error);\n throw error;\n }\n\n if (response.status === 400) {\n const error = new CliError(ErrorCode.INVALID_ARGUMENT, \"URI parameter is required\");\n apiLog.failure(error, response.status);\n throw error;\n }\n\n if (response.status === 401) {\n const error = new CliError(ErrorCode.API_KEY_INVALID, \"Invalid API key\", { status: 401 });\n apiLog.failure(error, response.status);\n throw error;\n }\n\n if (response.status === 404) {\n const error = new CliError(\n ErrorCode.RECORD_NOT_FOUND,\n `No generation record found for URI: ${uri}`,\n );\n apiLog.failure(error, response.status);\n throw error;\n }\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n const error = new CliError(\n ErrorCode.SERVER_ERROR,\n `HTTP ${response.status}: ${text || response.statusText}`,\n { status: response.status },\n );\n apiLog.failure(error, response.status);\n throw error;\n }\n\n let body: RecordApiResponse;\n try {\n body = (await response.json()) as RecordApiResponse;\n } catch {\n const error = new CliError(ErrorCode.SERVER_ERROR, \"Invalid JSON response from server\");\n apiLog.failure(error, response.status);\n throw error;\n }\n\n if (!body.success || !body.data) {\n const error = new CliError(\n ErrorCode.SERVER_ERROR,\n body.error ?? \"Unexpected response structure from record API\",\n );\n apiLog.failure(error, response.status);\n throw error;\n }\n\n apiLog.success(response.status, { record_type: body.data.type, success: body.data.success });\n return body.data;\n }\n}\n","/**\n * HogiResClient — reads/downloads hogi:// resources through Oiioii HTTP API.\n *\n * Endpoint: GET {baseUrl}/v1/res/read_file?uri=<encoded>\n * Auth: x-hogi-api-key header.\n */\n\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync, statSync } from \"node:fs\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { CliError, ErrorCode } from \"../output/errors.js\";\nimport { startApiCall } from \"../logging/api_call_logger.js\";\nimport type { LogRecorder } from \"../logging/types.js\";\nimport { logFeatureStep } from \"../logging/feature_logger.js\";\n\nexport interface HogiResClientOptions {\n baseUrl: string;\n apiKey: string;\n fetch?: typeof globalThis.fetch;\n logger?: LogRecorder;\n}\n\nexport interface ResourceReadOptions {\n filename?: string;\n watermark?: boolean;\n}\n\nexport interface ResourceDownloadOptions extends ResourceReadOptions {\n output?: string;\n}\n\nexport interface ResourceDownloadResult {\n path: string;\n bytes: number;\n mimeType: string | null;\n uri: string;\n}\n\nfunction assertHogiUri(uri: string): void {\n if (!uri || !uri.startsWith(\"hogi://\")) {\n throw new CliError(\n ErrorCode.INVALID_ARGUMENT,\n `Invalid hogi URI: \"${uri}\". Expected format: hogi://image/<id> or hogi://video/<id>`,\n );\n }\n}\n\nfunction filenameFromUri(uri: string): string {\n try {\n const parsed = new URL(uri);\n const name = basename(parsed.pathname);\n if (name && name !== \".\" && name !== \"/\") return name;\n } catch {\n // assertHogiUri catches the public validation path; fallback only protects basename.\n }\n return \"resource.bin\";\n}\n\nfunction resolveOutputPath(uri: string, output?: string): string {\n const fallbackName = filenameFromUri(uri);\n if (!output) return resolve(process.cwd(), fallbackName);\n\n const resolved = resolve(output);\n if (existsSync(resolved) && statSync(resolved).isDirectory()) {\n return join(resolved, fallbackName);\n }\n return resolved;\n}\n\nfunction looksLikeJsonError(contentType: string | null, buffer: Buffer): boolean {\n if (contentType?.toLowerCase().includes(\"application/json\")) return true;\n const prefix = buffer.subarray(0, 128).toString(\"utf8\").trimStart();\n return prefix.startsWith(\"{\") && (prefix.includes(\"\\\"error\\\"\") || prefix.includes(\"\\\"code\\\"\"));\n}\n\nexport class HogiResClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly _fetch: typeof globalThis.fetch;\n private readonly logger?: LogRecorder;\n\n constructor(options: HogiResClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = options.apiKey;\n this._fetch = options.fetch ?? globalThis.fetch;\n this.logger = options.logger;\n }\n\n getReadUrl(uri: string, options: ResourceReadOptions = {}): string {\n assertHogiUri(uri);\n const params = new URLSearchParams();\n params.set(\"uri\", uri);\n if (options.filename) params.set(\"filename\", options.filename);\n if (typeof options.watermark === \"boolean\") params.set(\"wm\", options.watermark ? \"1\" : \"0\");\n return `${this.baseUrl}/v1/res/read_file?${params.toString()}`;\n }\n\n async download(uri: string, options: ResourceDownloadOptions = {}): Promise<ResourceDownloadResult> {\n assertHogiUri(uri);\n const url = this.getReadUrl(uri, options);\n const outputPath = resolveOutputPath(uri, options.output);\n const apiLog = startApiCall({\n source: \"hogi_res_client\",\n operation: \"resource.read\",\n method: \"GET\",\n path: \"/v1/res/read_file\",\n }, this.logger);\n\n let response: Response;\n try {\n response = await this._fetch(url, {\n method: \"GET\",\n redirect: \"follow\",\n headers: {\n \"x-hogi-api-key\": this.apiKey,\n \"accept\": \"image/*,video/*,application/octet-stream,application/json;q=0.5,*/*;q=0.1\",\n },\n });\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n const error = new CliError(ErrorCode.NETWORK_ERROR, `Network error: ${msg}`);\n apiLog.failure(error);\n throw error;\n }\n\n if (response.status === 401) {\n const error = new CliError(ErrorCode.API_KEY_INVALID, \"Invalid API key\", { status: 401 });\n apiLog.failure(error, response.status);\n throw error;\n }\n if (response.status === 404) {\n const error = new CliError(ErrorCode.RECORD_NOT_FOUND, `Resource not found for URI: ${uri}`, { status: 404 });\n apiLog.failure(error, response.status);\n throw error;\n }\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n const error = new CliError(\n ErrorCode.SERVER_ERROR,\n `HTTP ${response.status}: ${text || response.statusText}`,\n { status: response.status },\n );\n apiLog.failure(error, response.status);\n throw error;\n }\n\n const contentType = response.headers.get(\"content-type\");\n const buffer = Buffer.from(await response.arrayBuffer());\n if (looksLikeJsonError(contentType, buffer)) {\n let message = \"Resource read failed\";\n try {\n const body = JSON.parse(buffer.toString(\"utf8\")) as { error?: string; message?: string; code?: string };\n message = body.message ?? body.error ?? body.code ?? message;\n } catch {\n // Keep generic message.\n }\n const error = new CliError(ErrorCode.SERVER_ERROR, message);\n apiLog.failure(error, response.status);\n throw error;\n }\n\n apiLog.success(response.status, { bytes: buffer.byteLength, mime_type: contentType });\n\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, buffer);\n logFeatureStep(\"record\", \"resource.saved\", { bytes: buffer.byteLength, mime_type: contentType });\n\n return {\n path: outputPath,\n bytes: buffer.byteLength,\n mimeType: contentType,\n uri,\n };\n }\n}\n","/**\n * Inspect commands: capabilities, models.\n *\n * `oiioii inspect capabilities [--json]` — list available GenAI capabilities\n * `oiioii inspect models [--domain image|video] [--json]` — list available models\n *\n * Model availability and metadata come from the backend model catalog.\n */\n\nimport { Command } from \"commander\";\nimport { modelNameForTool, type ModelDomain } from \"../core/model_map.js\";\nimport { resolveGenerationInputContract, type ResolvedGenerationInputContract } from \"../core/generation_input_contract.js\";\nimport { DEFAULT_AUDIO_MODEL, DEFAULT_IMAGE_MODEL, DEFAULT_VIDEO_MODEL } from \"../core/model_defaults.js\";\nimport {\n HogiModelCatalogClient,\n type BackendModelPricing,\n type ModelDescriptionI18n,\n} from \"../clients/hogi_model_catalog_client.js\";\nimport { FileConfigStore } from \"../config/config_store.js\";\nimport { getRootOptions, requireApiKeyAuth } from \"../app/command_context.js\";\nimport { CliError, ErrorCode } from \"../output/errors.js\";\nimport { successJson, printJson } from \"../output/json_output.js\";\nimport * as human from \"../output/human_output.js\";\nimport { logFeatureStep } from \"../logging/feature_logger.js\";\nimport { recordTelemetryBusinessInfo } from \"../telemetry/index.js\";\n\n// ── Types ────────────────────────────────────────────────────────────\n\nexport interface Capability {\n name: string;\n domain: \"image\" | \"video\" | \"audio\";\n description: string;\n default_model: string;\n command_template: string;\n}\n\nexport interface ModelInfo {\n id: number;\n name: string;\n key: string;\n domain: \"image\" | \"video\" | \"audio\";\n variant: string | null;\n selector: {\n model_id: number;\n cli_args: [\"--model-id\", string];\n };\n input_capabilities: Array<\"text\" | \"image\" | \"video\" | \"audio\" | \"file\">;\n input_capabilities_known: boolean;\n reference_image_count_min: number | null;\n reference_image_count_max: number | null;\n generation_input_contract: ResolvedGenerationInputContract;\n points_cost: number;\n sizes: string[];\n aspect_ratios: string[];\n durations: string[];\n description: ModelDescriptionI18n;\n tags: string[];\n members_only: boolean;\n}\n\nexport const MODEL_SELECTION_CONTRACT = {\n preferred: \"model_id\",\n generation_flag: \"--model-id\",\n alternative: \"--model <key> --variant <variant>\",\n variant_mcp_argument: \"version\",\n points_cost_semantics: \"base_cost\",\n empty_input_capabilities: \"unknown\",\n image_reference_capability_field: \"reference_image_count_max\",\n missing_reference_image_count_max: \"fallback_supported\",\n duration_format: \"exact_seconds_or_inclusive_range\",\n} as const;\n\nexport interface InspectCommandDeps {\n configStore?: FileConfigStore;\n fetch?: typeof globalThis.fetch;\n}\n\n// ── Static data ─────────────────────────────────────────────────────\n\nconst CAPABILITIES: Capability[] = [\n {\n name: \"text-to-image\",\n domain: \"image\",\n description: \"Generate images from text prompts\",\n default_model: DEFAULT_IMAGE_MODEL,\n command_template: 'oiioii image text --prompt \"<text>\" [--model <model>] [--aspect-ratio <ratio>] --json',\n },\n {\n name: \"image-to-image\",\n domain: \"image\",\n description: \"Edit or transform an existing image with a text prompt\",\n default_model: DEFAULT_IMAGE_MODEL,\n command_template: 'oiioii image edit --image <hogi-uri> --prompt \"<text>\" [--model <model>] --json',\n },\n {\n name: \"text-to-video\",\n domain: \"video\",\n description: \"Generate videos from text prompts\",\n default_model: DEFAULT_VIDEO_MODEL,\n command_template: 'oiioii video text --prompt \"<text>\" [--model <model>] [--duration <s>] --json',\n },\n {\n name: \"image-to-video\",\n domain: \"video\",\n description: \"Animate an image into a video with a text prompt\",\n default_model: DEFAULT_VIDEO_MODEL,\n command_template: 'oiioii video image --image <hogi-uri> --prompt \"<text>\" [--model <model>] --json',\n },\n {\n name: \"text-to-audio\",\n domain: \"audio\",\n description: \"Generate speech or audio from a text prompt and optional references\",\n default_model: DEFAULT_AUDIO_MODEL,\n command_template: 'oiioii audio seed-audio --prompt \"<text>\" [--audio <hogi-uri...>|--image <hogi-uri>] --json',\n },\n {\n name: \"text-to-music\",\n domain: \"audio\",\n description: \"Generate music from a description or custom lyrics and style tags\",\n default_model: \"suno\",\n command_template: 'oiioii audio suno --prompt \"<text>\" [--custom --tags <style>] --json',\n },\n];\n\n// ── Public API (testable) ───────────────────────────────────────────\n\n/**\n * Get the list of available GenAI capabilities.\n */\nexport function getCapabilities(): Capability[] {\n return [...CAPABILITIES];\n}\n\n/**\n * Get the list of available models, optionally filtered by domain.\n */\nexport function getModels(pricings: BackendModelPricing[], domain?: ModelDomain): ModelInfo[] {\n const result: ModelInfo[] = [];\n\n for (const pricing of pricings) {\n const modelDomain = pricing.mcp_method_name.startsWith(\"generate_image_\")\n ? \"image\"\n : pricing.mcp_method_name.startsWith(\"generate_video_\")\n ? \"video\"\n : pricing.mcp_method_name.startsWith(\"generate_music_\")\n ? \"audio\"\n : undefined;\n if (!modelDomain || (domain && modelDomain !== domain)) continue;\n const key = modelNameForTool(pricing.mcp_method_name, modelDomain);\n if (!key) continue;\n result.push({\n id: pricing.id,\n name: pricing.name ?? pricing.model ?? key,\n key,\n domain: modelDomain,\n variant: pricing.model,\n selector: { model_id: pricing.id, cli_args: [\"--model-id\", String(pricing.id)] },\n input_capabilities: pricing.input_capabilities ?? [],\n input_capabilities_known: Array.isArray(pricing.input_capabilities),\n reference_image_count_min: pricing.reference_image_count_min ?? null,\n reference_image_count_max: pricing.reference_image_count_max ?? null,\n generation_input_contract: resolveGenerationInputContract({\n toolName: pricing.mcp_method_name,\n ...(pricing.model ? { variant: pricing.model } : {}),\n catalog: pricing,\n }),\n points_cost: pricing.points_cost,\n sizes: pricing.sizes,\n aspect_ratios: pricing.aspect_ratios,\n durations: pricing.durations ?? [],\n description: pricing.description_i18n ?? {},\n tags: pricing.tags,\n members_only: pricing.members_only === true,\n });\n }\n\n return result;\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\n/** Get --json flag from the root program. */\nfunction isJsonMode(cmd: Command): boolean {\n let root: Command = cmd;\n while (root.parent) {\n root = root.parent;\n }\n return root.opts().json === true;\n}\n\n// ── Commander command ───────────────────────────────────────────────\n\nexport function createInspectCommand(deps: InspectCommandDeps = {}): Command {\n const inspect = new Command(\"inspect\").description(\"Inspect backend capabilities\");\n\n inspect\n .command(\"capabilities\")\n .description(\"List available GenAI capabilities\")\n .action((_opts, cmd) => {\n const jsonMode = isJsonMode(cmd);\n const caps = getCapabilities();\n recordTelemetryBusinessInfo({ item_count: caps.length });\n logFeatureStep(\"inspect\", \"capabilities.listed\", { count: caps.length });\n\n if (jsonMode) {\n printJson(successJson(\"inspect_capabilities\", {\n capabilities: caps,\n }, [\n { command: \"oiioii inspect models --json\", description: \"List available models\" },\n ]));\n } else {\n human.heading(\"Available Capabilities\");\n for (const cap of caps) {\n human.info(` ${cap.name} (${cap.domain})`);\n human.info(` ${cap.description}`);\n human.info(` Default model: ${cap.default_model}`);\n human.info(` Example: ${cap.command_template}`);\n human.info(\"\");\n }\n }\n });\n\n inspect\n .command(\"models\")\n .description(\"List available models\")\n .option(\"--domain <domain>\", \"Filter by domain (image, video, or audio)\")\n .action(async (opts, cmd) => {\n const jsonMode = isJsonMode(cmd);\n const rawDomain = opts.domain as string | undefined;\n if (rawDomain !== undefined && rawDomain !== \"image\" && rawDomain !== \"video\" && rawDomain !== \"audio\") {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, `Invalid model domain: \"${rawDomain}\". Expected image, video, or audio.`);\n }\n const domain = rawDomain as ModelDomain | undefined;\n const configStore = deps.configStore ?? new FileConfigStore();\n const auth = requireApiKeyAuth(getRootOptions(cmd), configStore);\n const client = new HogiModelCatalogClient({\n baseUrl: auth.baseUrl,\n apiKey: auth.apiKey,\n ...(deps.fetch ? { fetch: deps.fetch } : {}),\n });\n const pricings = await client.listModels();\n const models = getModels(pricings, domain);\n recordTelemetryBusinessInfo({\n item_count: models.length,\n backend_model_count: pricings.length,\n ...(domain ? { domain } : {}),\n });\n logFeatureStep(\"inspect\", \"models.listed\", {\n count: models.length,\n backend_model_count: pricings.length,\n source: \"backend_model_catalog\",\n ...(domain ? { domain } : {}),\n });\n\n if (jsonMode) {\n printJson(successJson(\"inspect_models\", {\n models,\n count: models.length,\n source: \"backend_model_catalog\",\n selection: MODEL_SELECTION_CONTRACT,\n ...(domain ? { filter: { domain } } : {}),\n }, [\n { command: \"oiioii inspect capabilities --json\", description: \"List capabilities\" },\n ]));\n } else {\n const title = domain ? `Available ${domain} models` : \"Available models\";\n human.heading(title);\n for (const m of models) {\n human.info(` ${m.name} [${m.key}] (${m.domain})`);\n human.info(` Points: ${m.points_cost}${m.members_only ? \" · members only\" : \"\"}`);\n if (m.variant) human.info(` Variant: ${m.variant}`);\n human.info(` Select: --model-id ${m.id}`);\n }\n human.info(`\\n Total: ${models.length} models`);\n }\n });\n\n return inspect;\n}\n","/**\n * Preview commands: latest, bundle <task_id>.\n *\n * `oiioii preview latest [--json]` — show the most recent preview bundle\n * `oiioii preview bundle <task_id> [--json]` — show the preview bundle for a specific task\n *\n * Preview bundles are created by generation commands (image text, image edit,\n * video text, video image) and stored in .oiioii/previews/<bundle_id>/.\n */\n\nimport { Command } from \"commander\";\nimport { PreviewStore, type PreviewManifest, type PreviewSummary } from \"../core/preview_store.js\";\nimport { TaskStore, type OiioiiTask } from \"../core/task_store.js\";\nimport { successJson, errorJson, printJson } from \"../output/json_output.js\";\nimport { ErrorCode } from \"../output/errors.js\";\nimport * as human from \"../output/human_output.js\";\nimport { recordTelemetryBusinessInfo } from \"../telemetry/index.js\";\n\n// ── Types ────────────────────────────────────────────────────────────\n\nexport interface PreviewCommandDeps {\n previewStore?: PreviewStore;\n taskStore?: TaskStore;\n}\n\nfunction createBundleFromTerminalTask(store: PreviewStore, task: OiioiiTask) {\n if (task.status !== \"succeeded\" && task.status !== \"failed\") return undefined;\n const mediaType = task.mediaType\n ?? (task.toolName.includes(\"video\") ? \"video\" : task.toolName.includes(\"music\") || task.toolName.includes(\"audio\") ? \"audio\" : \"image\");\n return store.createBundle({\n taskId: task.id,\n workspaceId: task.workspaceId,\n command: task.command,\n tool: task.toolName,\n inputArgs: task.inputArgs,\n resources: task.resourceUris.map((uri) => ({\n uri,\n mime_type: mediaType === \"video\" ? \"video/mp4\" : mediaType === \"audio\" ? \"audio/mpeg\" : \"image/jpeg\",\n })),\n status: task.status,\n ...(task.error ? { error: { code: task.error.code, message: task.error.message } } : {}),\n });\n}\n\nfunction resolveTaskStore(store: PreviewStore, deps: PreviewCommandDeps): TaskStore {\n return deps.taskStore ?? new TaskStore({ configDir: store.getConfigDir() });\n}\n\nexport interface PreviewResult {\n ok: boolean;\n data?: {\n bundle_id: string;\n bundle_dir: string;\n task_id: string;\n manifest: PreviewManifest;\n summary: PreviewSummary;\n };\n error?: {\n code: string;\n message: string;\n };\n}\n\n// ── Testable core logic ─────────────────────────────────────────────\n\n/**\n * Execute \"preview latest\" — return the most recent preview bundle.\n */\nexport function executePreviewLatest(deps: PreviewCommandDeps = {}): PreviewResult {\n const store = deps.previewStore ?? new PreviewStore();\n let latest = store.getLatest();\n\n if (!latest) {\n const terminalTask = resolveTaskStore(store, deps)\n .list()\n .find((task) => task.status === \"succeeded\" || task.status === \"failed\");\n if (terminalTask) {\n try {\n const created = createBundleFromTerminalTask(store, terminalTask);\n if (created) latest = { manifest: created.manifest, summary: created.summary, bundleDir: created.bundleDir };\n } catch {\n // Preserve the stable RECORD_NOT_FOUND contract when local backfill fails.\n }\n }\n }\n\n if (!latest) {\n return {\n ok: false,\n error: {\n code: ErrorCode.RECORD_NOT_FOUND,\n message: \"No preview bundles found. Generate an image or video first.\",\n },\n };\n }\n\n return {\n ok: true,\n data: {\n bundle_id: latest.manifest.bundle_id,\n bundle_dir: latest.bundleDir,\n task_id: latest.manifest.task_id,\n manifest: latest.manifest,\n summary: latest.summary,\n },\n };\n}\n\n/**\n * Execute \"preview bundle <task_id>\" — return the preview bundle for a task.\n */\nexport function executePreviewBundle(taskId: string, deps: PreviewCommandDeps = {}): PreviewResult {\n const store = deps.previewStore ?? new PreviewStore();\n let bundle = store.getBundleByTaskId(taskId);\n\n if (!bundle) {\n const task = resolveTaskStore(store, deps).getByAnyId(taskId);\n if (task) {\n try {\n const created = createBundleFromTerminalTask(store, task);\n if (created) bundle = { manifest: created.manifest, summary: created.summary, bundleDir: created.bundleDir };\n } catch {\n // Preserve the stable RECORD_NOT_FOUND contract when local backfill fails.\n }\n }\n }\n\n if (!bundle) {\n return {\n ok: false,\n error: {\n code: ErrorCode.RECORD_NOT_FOUND,\n message: `No preview bundle found for task ${taskId}.`,\n },\n };\n }\n\n return {\n ok: true,\n data: {\n bundle_id: bundle.manifest.bundle_id,\n bundle_dir: bundle.bundleDir,\n task_id: bundle.manifest.task_id,\n manifest: bundle.manifest,\n summary: bundle.summary,\n },\n };\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\n/** Get --json flag from the root program. */\nfunction isJsonMode(cmd: Command): boolean {\n let root: Command = cmd;\n while (root.parent) {\n root = root.parent;\n }\n return root.opts().json === true;\n}\n\nfunction printPreviewHuman(data: NonNullable<PreviewResult[\"data\"]>): void {\n human.heading(\"Preview Bundle\");\n human.info(` Bundle ID: ${data.bundle_id}`);\n human.info(` Task ID: ${data.task_id}`);\n human.info(` Status: ${data.summary.status}`);\n human.info(` Title: ${data.summary.title}`);\n human.info(` Summary: ${data.summary.human_summary}`);\n human.info(` Bundle dir: ${data.bundle_dir}`);\n if (data.manifest.resources.length > 0) {\n human.info(\" Resources:\");\n for (const r of data.manifest.resources) {\n human.info(` - ${r.uri} (${r.mime_type ?? \"unknown\"})`);\n }\n }\n if (data.summary.next.length > 0) {\n human.info(\"\\n Next steps:\");\n for (const n of data.summary.next) {\n human.info(` ${n.command}`);\n }\n }\n}\n\n// ── Commander command ───────────────────────────────────────────────\n\nexport function createPreviewCommand(deps: PreviewCommandDeps = {}): Command {\n const preview = new Command(\"preview\").description(\"Preview bundles for generation results\");\n\n preview\n .command(\"latest\")\n .description(\"Show the most recent preview bundle\")\n .action((_opts, cmd) => {\n const jsonMode = isJsonMode(cmd);\n const result = executePreviewLatest(deps);\n\n if (result.ok && result.data) {\n recordTelemetryBusinessInfo({\n found: true,\n artifact_count: result.data.manifest.resources.length,\n });\n if (jsonMode) {\n printJson(successJson(\"preview_latest\", {\n bundle_id: result.data.bundle_id,\n bundle_dir: result.data.bundle_dir,\n task_id: result.data.task_id,\n manifest: result.data.manifest,\n summary: result.data.summary,\n }, result.data.summary.next));\n } else {\n printPreviewHuman(result.data);\n }\n } else {\n if (jsonMode) {\n printJson(errorJson(\n \"preview_latest\",\n result.error!.code,\n result.error!.message,\n ));\n } else {\n human.error(result.error!.message);\n }\n process.exitCode = 1;\n }\n });\n\n preview\n .command(\"bundle\")\n .description(\"Show preview bundle for a specific task\")\n .argument(\"<task_id>\", \"Task ID to look up\")\n .action((taskId, _opts, cmd) => {\n const jsonMode = isJsonMode(cmd);\n const result = executePreviewBundle(taskId, deps);\n\n if (result.ok && result.data) {\n recordTelemetryBusinessInfo({\n found: true,\n artifact_count: result.data.manifest.resources.length,\n });\n if (jsonMode) {\n printJson(successJson(\"preview_bundle\", {\n bundle_id: result.data.bundle_id,\n bundle_dir: result.data.bundle_dir,\n task_id: result.data.task_id,\n manifest: result.data.manifest,\n summary: result.data.summary,\n }, result.data.summary.next));\n } else {\n printPreviewHuman(result.data);\n }\n } else {\n if (jsonMode) {\n printJson(errorJson(\n \"preview_bundle\",\n result.error!.code,\n result.error!.message,\n ));\n } else {\n human.error(result.error!.message);\n }\n process.exitCode = 1;\n }\n });\n\n return preview;\n}\n","/**\n * Upload commands: file.\n *\n * `oiioii upload file <path>` uploads local image/video/audio bytes to Hogi resources.\n */\n\nimport { Command } from \"commander\";\nimport { basename, resolve } from \"node:path\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport { FileConfigStore } from \"../config/config_store.js\";\nimport { HogiResUploadClient } from \"../clients/hogi_res_upload_client.js\";\nimport { HogiVodUploadClient, type VodDirectUploader } from \"../clients/hogi_vod_upload_client.js\";\nimport { assertSupportedUploadType, inferFileTypeFromPath, normalizeFileType, type UploadDomain } from \"../core/upload_file_types.js\";\nimport { VOD_VIDEO_THRESHOLD_BYTES } from \"../core/vod_upload_contract.js\";\nimport { successJson, errorJson, printJson } from \"../output/json_output.js\";\nimport { CliError, ErrorCode } from \"../output/errors.js\";\nimport * as human from \"../output/human_output.js\";\nimport { logFeatureStep } from \"../logging/feature_logger.js\";\nimport { recordTelemetryBusinessInfo, telemetrySizeBucket } from \"../telemetry/index.js\";\nimport { getRootOptions, isJsonOutput, requireApiKeyAuth } from \"../app/command_context.js\";\n\nexport interface UploadCommandDeps {\n configStore?: FileConfigStore;\n fetch?: typeof globalThis.fetch;\n readFile?: typeof readFile;\n stat?: typeof stat;\n vodDirectUpload?: VodDirectUploader;\n vodPollIntervalMs?: number;\n vodTimeoutMs?: number;\n}\n\nexport interface UploadFileParams {\n path: string;\n fileType?: string;\n fileName?: string;\n attach?: boolean;\n afterAssetId?: string;\n vod?: boolean;\n}\n\nexport interface UploadFileCommandResult {\n uri: string;\n asset_id: string;\n asset_uri: string;\n file_uri: string;\n domain: UploadDomain;\n file_type: string;\n file_name: string | null;\n size: number;\n dedupe_hit?: boolean;\n attached: boolean;\n workspace_id: string | null;\n upload_mode?: \"direct\" | \"vod\";\n task_id?: string;\n}\n\nconst isJsonMode = isJsonOutput;\nconst getRootOpts = getRootOptions;\n\nfunction requireWorkspace(rootOpts: Record<string, unknown>, configStore: FileConfigStore): string {\n const flag = rootOpts.workspace;\n if (typeof flag === \"string\" && flag) return flag;\n const envVal = process.env[\"OIIOII_WORKSPACE_ID\"];\n if (envVal) return envVal;\n const config = configStore.loadResolved();\n if (config.defaultWorkspaceId) return config.defaultWorkspaceId;\n throw new CliError(ErrorCode.WORKSPACE_REQUIRED, \"No workspace set. Run: oiioii workspace set <workspace_id>\");\n}\n\nfunction assertUriMatchesDomain(uri: string, domain: UploadDomain): void {\n const expectedPrefix = `hogi://${domain}/`;\n if (!uri.startsWith(expectedPrefix)) {\n throw new CliError(ErrorCode.SERVER_ERROR, `Upload API returned mismatched URI/domain: expected ${expectedPrefix}`);\n }\n}\n\nexport function shouldUseVodUpload(domain: UploadDomain, fileType: string, fileSize: number, forceVod = false): boolean {\n return domain === \"video\" && (forceVod || fileType === \"mov\" || fileSize >= VOD_VIDEO_THRESHOLD_BYTES);\n}\n\nasync function assertReadableNonEmptyFile(filePath: string, statFn: typeof stat): Promise<number> {\n let fileStat;\n try {\n fileStat = await statFn(filePath);\n } catch {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, `File not found: ${filePath}`);\n }\n if (!fileStat.isFile()) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, `Not a file: ${filePath}`);\n }\n if (fileStat.size <= 0) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, `File is empty: ${filePath}`);\n }\n return fileStat.size;\n}\n\nexport async function executeUploadFile(\n params: UploadFileParams,\n rootOpts: Record<string, unknown> = {},\n deps: UploadCommandDeps = {},\n): Promise<UploadFileCommandResult> {\n const configStore = deps.configStore ?? new FileConfigStore();\n const readFileFn = deps.readFile ?? readFile;\n const statFn = deps.stat ?? stat;\n\n const auth = requireApiKeyAuth(rootOpts, configStore);\n const baseUrl = auth.baseUrl;\n const resolvedPath = resolve(params.path);\n const fileSize = await assertReadableNonEmptyFile(resolvedPath, statFn);\n\n const inferredType = params.fileType ?? inferFileTypeFromPath(resolvedPath);\n if (!inferredType) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, `Cannot infer file type from path: ${params.path}. Use --type <ext>.`);\n }\n const fileType = normalizeFileType(inferredType);\n const domain = assertSupportedUploadType(fileType);\n if (params.vod === true && domain !== \"video\") {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, \"--vod is only valid for video files\");\n }\n logFeatureStep(\"upload\", \"upload.file_validated\", { file_type: fileType, domain, size: fileSize });\n\n const workspaceId = requireWorkspace(rootOpts, configStore);\n const fileName = params.fileName ?? basename(resolvedPath);\n\n const useVod = shouldUseVodUpload(domain, fileType, fileSize, params.vod === true);\n if (useVod) {\n if (params.afterAssetId) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, \"--after-asset-id is not supported by the VOD upload API\");\n }\n const uploadClient = new HogiVodUploadClient({\n baseUrl,\n apiKey: auth.apiKey,\n fetch: deps.fetch,\n directUpload: deps.vodDirectUpload,\n pollIntervalMs: deps.vodPollIntervalMs,\n timeoutMs: deps.vodTimeoutMs,\n });\n const uploaded = await uploadClient.uploadFile({ filePath: resolvedPath, fileSize, fileName, fileType, workspaceId });\n assertUriMatchesDomain(uploaded.fileUri, \"video\");\n logFeatureStep(\"upload\", \"upload.vod_completed\", { asset_id: uploaded.assetId, task_id: uploaded.taskId, size: fileSize, workspace_id: workspaceId });\n return {\n uri: uploaded.fileUri,\n asset_id: uploaded.assetId,\n asset_uri: uploaded.assetUri,\n file_uri: uploaded.fileUri,\n domain: \"video\",\n file_type: fileType,\n file_name: fileName,\n size: fileSize,\n attached: true,\n workspace_id: workspaceId,\n upload_mode: \"vod\",\n task_id: uploaded.taskId,\n };\n }\n\n const buffer = await readFileFn(resolvedPath);\n\n const uploadClient = new HogiResUploadClient({ baseUrl, apiKey: auth.apiKey, fetch: deps.fetch });\n const uploaded = await uploadClient.uploadFile({ buffer, workspaceId, fileType, fileName, afterAssetId: params.afterAssetId });\n logFeatureStep(\"upload\", \"upload.completed\", { asset_id: uploaded.assetId, domain: uploaded.type, size: fileSize, workspace_id: workspaceId });\n\n assertUriMatchesDomain(uploaded.fileUri, uploaded.type);\n if (uploaded.type !== domain) {\n throw new CliError(ErrorCode.SERVER_ERROR, `Upload API returned unexpected domain: ${uploaded.type}`);\n }\n logFeatureStep(\"upload\", \"workspace.asset_attached\", { asset_id: uploaded.assetId, domain: uploaded.type, workspace_id: workspaceId });\n\n return {\n uri: uploaded.fileUri,\n asset_id: uploaded.assetId,\n asset_uri: uploaded.assetUri,\n file_uri: uploaded.fileUri,\n domain: uploaded.type,\n file_type: fileType,\n file_name: fileName,\n size: fileSize,\n attached: true,\n workspace_id: workspaceId,\n upload_mode: \"direct\",\n };\n}\n\nexport function createUploadCommand(deps: UploadCommandDeps = {}): Command {\n const upload = new Command(\"upload\").description(\"Upload local files to Hogi resources\");\n\n upload\n .command(\"file\")\n .description(\"Upload an image, video, or audio file\")\n .argument(\"<path>\", \"Local file path\")\n .option(\"--type <ext>\", \"File extension override, e.g. png/mp4/mp3\")\n .option(\"--name <name>\", \"Original filename stored for display\")\n .option(\"--after-asset-id <asset_id>\", \"Insert after an existing workspace asset\")\n .option(\"--vod\", \"Force the VOD direct-upload flow for a video\")\n .option(\"--attach\", \"Deprecated compatibility flag; uploads are always attached\")\n .action(async (path: string, opts: { type?: string; name?: string; afterAssetId?: string; attach?: boolean; vod?: boolean }, cmd: Command) => {\n const jsonMode = isJsonMode(cmd);\n const rootOpts = getRootOpts(cmd);\n try {\n const result = await executeUploadFile({\n path,\n fileType: opts.type,\n fileName: opts.name,\n afterAssetId: opts.afterAssetId,\n attach: opts.attach === true,\n vod: opts.vod === true,\n }, rootOpts, deps);\n recordTelemetryBusinessInfo({\n media_type: result.domain,\n file_extension: result.file_type,\n size_bucket: telemetrySizeBucket(result.size),\n upload_mode: result.upload_mode ?? \"direct\",\n forced_vod: opts.vod === true,\n attached: result.attached,\n });\n\n if (jsonMode) {\n printJson(successJson(\"upload_file\", result, [\n { command: `oiioii record open ${result.uri} --json`, description: \"Download uploaded resource\" },\n ]));\n } else {\n human.success(`Uploaded: ${result.uri}`);\n human.info(` Domain: ${result.domain}`);\n human.info(` Type: ${result.file_type}`);\n human.info(` Size: ${result.size} bytes`);\n human.info(` Mode: ${result.upload_mode ?? \"direct\"}`);\n if (result.task_id) human.info(` Task: ${result.task_id}`);\n if (result.file_name) human.info(` Name: ${result.file_name}`);\n human.info(` Attach: ${result.attached ? `yes (${result.workspace_id})` : \"no\"}`);\n }\n } catch (err: unknown) {\n if (err instanceof CliError) {\n if (jsonMode) printJson(errorJson(\"upload_file\", err.code, err.message, err.details));\n else human.error(err.message);\n process.exitCode = 1;\n return;\n }\n const msg = err instanceof Error ? err.message : String(err);\n if (jsonMode) printJson(errorJson(\"upload_file\", ErrorCode.SERVER_ERROR, msg));\n else human.error(msg);\n process.exitCode = 1;\n }\n });\n\n return upload;\n}\n","/**\n * Upload file type helpers for Hogi resource uploads.\n */\n\nimport { extname } from \"node:path\";\nimport { CliError, ErrorCode } from \"../output/errors.js\";\n\nexport type UploadDomain = \"image\" | \"video\" | \"audio\";\n\nexport const IMAGE_UPLOAD_TYPES = new Set([\n \"jpg\",\n \"jpeg\",\n \"png\",\n \"gif\",\n \"svg\",\n \"webp\",\n \"heic\",\n \"heif\",\n \"bmp\",\n \"ico\",\n \"tiff\",\n \"jfif\",\n]);\n\nexport const VIDEO_UPLOAD_TYPES = new Set([\n \"mp4\",\n \"webm\",\n \"avi\",\n \"mov\",\n \"flv\",\n \"mkv\",\n]);\n\nexport const AUDIO_UPLOAD_TYPES = new Set([\n \"mp3\",\n \"wav\",\n \"ogg\",\n \"m4a\",\n \"aac\",\n \"flac\",\n \"wma\",\n \"ape\",\n]);\n\nexport function normalizeFileType(input: string): string {\n return input.trim().toLowerCase().replace(/^\\.+/, \"\");\n}\n\nexport function domainForFileType(fileType: string): UploadDomain | undefined {\n const normalized = normalizeFileType(fileType);\n if (IMAGE_UPLOAD_TYPES.has(normalized)) return \"image\";\n if (VIDEO_UPLOAD_TYPES.has(normalized)) return \"video\";\n if (AUDIO_UPLOAD_TYPES.has(normalized)) return \"audio\";\n return undefined;\n}\n\nexport function inferFileTypeFromPath(filePath: string): string | undefined {\n const ext = normalizeFileType(extname(filePath));\n return ext.length > 0 ? ext : undefined;\n}\n\nexport function assertSupportedUploadType(fileType: string): UploadDomain {\n const normalized = normalizeFileType(fileType);\n const domain = domainForFileType(normalized);\n if (!domain) {\n throw new CliError(\n ErrorCode.INVALID_ARGUMENT,\n `Unsupported file type: ${normalized || \"<empty>\"}. Supported image/video/audio extensions only.`,\n );\n }\n return domain;\n}\n","/**\n * HogiResUploadClient — uploads local media and creates a workspace asset.\n * Endpoint: POST {baseUrl}/v1/workspace/uploadAsset\n */\nimport { CliError, ErrorCode, contentSafetyError, isContentSafetySignal } from \"../output/errors.js\";\nimport { domainForFileType, normalizeFileType, type UploadDomain } from \"../core/upload_file_types.js\";\nimport { startApiCall } from \"../logging/api_call_logger.js\";\nimport type { LogRecorder } from \"../logging/types.js\";\n\nexport interface HogiResUploadClientOptions { baseUrl: string; apiKey: string; fetch?: typeof globalThis.fetch; logger?: LogRecorder }\nexport interface UploadFileRequest { buffer: Buffer; workspaceId: string; fileType: string; fileName?: string; afterAssetId?: string }\nexport interface UploadFileResult { assetId: string; assetUri: string; fileUri: string; type: UploadDomain; workspaceId: string }\ninterface ApiErrorPayload { code?: string; message?: string; details?: unknown }\ninterface ApiEnvelope { ok?: boolean; data?: Record<string, unknown>; error?: ApiErrorPayload }\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === \"object\" ? value as Record<string, unknown> : undefined;\n}\n\nasync function parseJsonResponse(response: Response): Promise<ApiEnvelope> {\n const text = await response.text().catch(() => \"\");\n if (!text.trim()) return {};\n try { return JSON.parse(text) as ApiEnvelope; }\n catch { throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid JSON response from upload API\", { status: response.status }); }\n}\n\nfunction mapUploadError(status: number, envelope: ApiEnvelope): CliError {\n const code = envelope.error?.code;\n const message = envelope.error?.message ?? `Upload failed: HTTP ${status}`;\n const details = { status, code };\n if (status === 401) return new CliError(ErrorCode.API_KEY_INVALID, message || \"Invalid API key\", details);\n if (status === 403 || code === \"workspace_forbidden\") return new CliError(ErrorCode.WORKSPACE_FORBIDDEN, message, details);\n if (status === 404 || code === \"workspace_not_found\") return new CliError(ErrorCode.WORKSPACE_NOT_FOUND, message, details);\n if (status === 413 || code === \"payload_too_large\") return new CliError(ErrorCode.PAYLOAD_TOO_LARGE, message, details);\n if (isContentSafetySignal(code, message)) {\n return contentSafetyError(code, message, details);\n }\n if ([\"empty_file\", \"invalid_file_name\", \"invalid_file_type\", \"missing_workspace_id\", \"unsupported_asset_type\"].includes(code ?? \"\")) {\n return new CliError(ErrorCode.INVALID_ARGUMENT, message, details);\n }\n return new CliError(ErrorCode.SERVER_ERROR, message, details);\n}\n\nfunction parseUploadResult(envelope: ApiEnvelope): UploadFileResult {\n if (envelope.ok === false) throw mapUploadError(400, envelope);\n const data = asObject(envelope.data);\n if (!data) throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid upload API response: missing data\");\n const assetId = data.asset_id;\n const assetUri = data.asset_uri;\n const fileUri = data.file_uri;\n const type = data.type;\n const workspaceId = data.workspace_id;\n if (typeof assetId !== \"string\" || !assetId) throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid upload API response: missing asset_id\");\n if (typeof assetUri !== \"string\" || assetUri !== `hogi://asset/${assetId}`) throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid upload API response: invalid asset_uri\");\n if (type !== \"image\" && type !== \"video\" && type !== \"audio\") throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid upload API response: unsupported type\");\n if (typeof fileUri !== \"string\" || !fileUri.startsWith(`hogi://${type}/`)) throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid upload API response: file_uri/type mismatch\");\n if (typeof workspaceId !== \"string\" || !workspaceId) throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid upload API response: missing workspace_id\");\n return { assetId, assetUri, fileUri, type, workspaceId };\n}\n\nexport class HogiResUploadClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly _fetch: typeof globalThis.fetch;\n private readonly logger?: LogRecorder;\n\n constructor(options: HogiResUploadClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = options.apiKey;\n this._fetch = options.fetch ?? globalThis.fetch;\n this.logger = options.logger;\n }\n\n async uploadFile(request: UploadFileRequest): Promise<UploadFileResult> {\n const fileType = normalizeFileType(request.fileType);\n const type = domainForFileType(fileType);\n if (!type) throw new CliError(ErrorCode.INVALID_ARGUMENT, `Unsupported file type: ${fileType || \"<empty>\"}`);\n if (!request.workspaceId.trim()) throw new CliError(ErrorCode.WORKSPACE_REQUIRED, \"workspace_id is required\");\n const params = new URLSearchParams({ workspace_id: request.workspaceId, file_type: fileType });\n if (request.fileName) params.set(\"file_name\", request.fileName);\n if (request.afterAssetId) params.set(\"after_asset_id\", request.afterAssetId);\n const apiLog = startApiCall({\n source: \"hogi_res_upload_client\", operation: \"workspace.upload_asset\", method: \"POST\", path: \"/v1/workspace/uploadAsset\",\n metadata: { workspace_id: request.workspaceId, file_type: fileType, type, bytes: request.buffer.byteLength },\n }, this.logger);\n let response: Response;\n try {\n response = await this._fetch(`${this.baseUrl}/v1/workspace/uploadAsset?${params.toString()}`, {\n method: \"POST\",\n headers: { \"x-hogi-api-key\": this.apiKey, \"content-type\": \"application/octet-stream\", \"accept\": \"application/json\" },\n body: request.buffer,\n } as RequestInit);\n } catch (err: unknown) {\n const error = new CliError(ErrorCode.NETWORK_ERROR, `Network error: ${err instanceof Error ? err.message : String(err)}`);\n apiLog.failure(error);\n throw error;\n }\n try {\n const envelope = await parseJsonResponse(response);\n if (!response.ok) throw mapUploadError(response.status, envelope);\n const result = parseUploadResult(envelope);\n if (result.workspaceId !== request.workspaceId) throw new CliError(ErrorCode.SERVER_ERROR, \"Upload API returned unexpected workspace_id\");\n if (result.type !== type) throw new CliError(ErrorCode.SERVER_ERROR, \"Upload API returned unexpected asset type\");\n apiLog.success(response.status, { asset_id: result.assetId, type: result.type });\n return result;\n } catch (error) {\n apiLog.failure(error, response.status);\n throw error;\n }\n }\n}\n","/**\n * Large-video upload through Hogi's VOD flow.\n *\n * Bytes go directly to Volc VOD with a short-lived STS token. Hogi only mints\n * the token, commits the returned Vid, and exposes transcode status.\n */\nimport { createHash } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { CliError, ErrorCode } from \"../output/errors.js\";\nimport { startApiCall } from \"../logging/api_call_logger.js\";\nimport type { LogRecorder } from \"../logging/types.js\";\nimport { domainForFileType, normalizeFileType } from \"../core/upload_file_types.js\";\nimport { VOD_MAX_UPLOAD_BYTES } from \"../core/vod_upload_contract.js\";\nimport { uploadFileDirectlyToVod, type VodDirectUploader, type VodUploadToken } from \"./volc_vod_direct_uploader.js\";\n\nexport type { VodDirectUploader, VodDirectUploadRequest, VodUploadToken } from \"./volc_vod_direct_uploader.js\";\n\nexport interface HogiVodUploadClientOptions {\n baseUrl: string;\n apiKey: string;\n fetch?: typeof globalThis.fetch;\n logger?: LogRecorder;\n directUpload?: VodDirectUploader;\n pollIntervalMs?: number;\n timeoutMs?: number;\n}\n\nexport interface VodUploadFileRequest {\n filePath: string;\n fileName: string;\n fileSize: number;\n fileType: string;\n workspaceId: string;\n onProgress?: (percent: number) => void;\n}\n\nexport interface VodUploadFileResult {\n assetId: string;\n assetUri: string;\n fileUri: string;\n taskId: string;\n workspaceId: string;\n}\n\ninterface VodStatusData {\n errorCode?: string | null;\n errorMessage?: string | null;\n outputUri?: string | null;\n progress: number;\n status: \"pending\" | \"processing\" | \"completed\" | \"failed\" | \"cancelled\" | \"finished\";\n taskId: string;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === \"object\" ? value as Record<string, unknown> : undefined;\n}\n\nasync function readJson(response: Response, operation: string): Promise<Record<string, unknown>> {\n const text = await response.text().catch(() => \"\");\n let body: unknown;\n try { body = text ? JSON.parse(text) : {}; }\n catch { throw new CliError(ErrorCode.SERVER_ERROR, `Invalid JSON response from ${operation}`, { status: response.status }); }\n const envelope = asObject(body) ?? {};\n if (!response.ok || envelope.success === false) {\n const error = envelope.error;\n const message = typeof error === \"string\"\n ? error\n : typeof asObject(error)?.message === \"string\"\n ? asObject(error)!.message as string\n : `${operation} failed: HTTP ${response.status}`;\n const details = { status: response.status, error: typeof error === \"string\" ? error : undefined };\n if (response.status === 401) throw new CliError(ErrorCode.API_KEY_INVALID, message, details);\n if (response.status === 403) throw new CliError(ErrorCode.WORKSPACE_FORBIDDEN, message, details);\n if (response.status === 404) throw new CliError(ErrorCode.WORKSPACE_NOT_FOUND, message, details);\n if (response.status === 413) throw new CliError(ErrorCode.PAYLOAD_TOO_LARGE, message, details);\n if (response.status === 400) throw new CliError(ErrorCode.INVALID_ARGUMENT, message, details);\n throw new CliError(ErrorCode.SERVER_ERROR, message, details);\n }\n return envelope;\n}\n\nasync function md5File(filePath: string): Promise<string> {\n const hash = createHash(\"md5\");\n for await (const chunk of createReadStream(filePath)) hash.update(chunk as Buffer);\n return hash.digest(\"hex\");\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nfunction isVodUploadToken(value: unknown): value is VodUploadToken {\n const token = asObject(value);\n const sts = asObject(token?.stsToken);\n return typeof token?.appId === \"number\"\n && Number.isFinite(token.appId)\n && typeof token.spaceName === \"string\" && token.spaceName.length > 0\n && typeof token.region === \"string\" && token.region.length > 0\n && typeof sts?.AccessKeyId === \"string\" && sts.AccessKeyId.length > 0\n && typeof sts.SecretAccessKey === \"string\" && sts.SecretAccessKey.length > 0\n && typeof sts.SessionToken === \"string\" && sts.SessionToken.length > 0\n && typeof sts.ExpiredTime === \"string\" && sts.ExpiredTime.length > 0;\n}\n\nexport class HogiVodUploadClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly fetch: typeof globalThis.fetch;\n private readonly logger?: LogRecorder;\n private readonly directUpload: VodDirectUploader;\n private readonly pollIntervalMs: number;\n private readonly timeoutMs: number;\n\n constructor(options: HogiVodUploadClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = options.apiKey;\n this.fetch = options.fetch ?? globalThis.fetch;\n this.logger = options.logger;\n this.directUpload = options.directUpload ?? uploadFileDirectlyToVod;\n this.pollIntervalMs = options.pollIntervalMs ?? 3_000;\n this.timeoutMs = options.timeoutMs ?? 10 * 60 * 1_000;\n }\n\n private headers(json = false): Record<string, string> {\n return { \"x-hogi-api-key\": this.apiKey, accept: \"application/json\", ...(json ? { \"content-type\": \"application/json\" } : {}) };\n }\n\n private async request(url: string, init: RequestInit, operation: string): Promise<Response> {\n try {\n return await this.fetch(url, init);\n } catch (error) {\n throw new CliError(ErrorCode.NETWORK_ERROR, `${operation} network error: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n async uploadFile(request: VodUploadFileRequest): Promise<VodUploadFileResult> {\n if (!request.workspaceId.trim()) throw new CliError(ErrorCode.WORKSPACE_REQUIRED, \"workspace_id is required\");\n if (!request.fileName.trim()) throw new CliError(ErrorCode.INVALID_ARGUMENT, \"file_name is required\");\n const fileType = normalizeFileType(request.fileType);\n if (domainForFileType(fileType) !== \"video\") {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, `VOD upload requires a supported video type: ${fileType || \"<empty>\"}`);\n }\n if (!Number.isSafeInteger(request.fileSize) || request.fileSize <= 0) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, \"file_size must be a positive integer\");\n }\n if (request.fileSize > VOD_MAX_UPLOAD_BYTES) {\n throw new CliError(ErrorCode.PAYLOAD_TOO_LARGE, `VOD upload limit is ${VOD_MAX_UPLOAD_BYTES} bytes (500 MB)`);\n }\n const log = startApiCall({\n source: \"hogi_vod_upload_client\", operation: \"workspace.vod_upload\", method: \"POST\", path: \"/media/vod/commit_upload\",\n metadata: { workspace_id: request.workspaceId, bytes: request.fileSize },\n }, this.logger);\n try {\n const query = new URLSearchParams({ workspaceId: request.workspaceId, fileSize: String(request.fileSize) });\n const tokenResponse = await this.request(\n `${this.baseUrl}/media/vod/upload_token?${query}`,\n { method: \"GET\", headers: this.headers() },\n \"VOD upload_token\",\n );\n const tokenEnvelope = await readJson(tokenResponse, \"VOD upload_token\");\n const token = tokenEnvelope.data;\n if (!isVodUploadToken(token)) {\n throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid VOD upload_token response\");\n }\n const [vid, contentMd5] = await Promise.all([\n this.directUpload({\n filePath: request.filePath,\n fileName: request.fileName,\n fileSize: request.fileSize,\n fileType,\n token,\n userId: \"oiioii-cli\",\n onProgress: request.onProgress,\n }),\n md5File(request.filePath),\n ]);\n const commitResponse = await this.request(`${this.baseUrl}/media/vod/commit_upload`, {\n method: \"POST\",\n headers: this.headers(true),\n body: JSON.stringify({\n vid,\n workspaceId: request.workspaceId,\n originalFileName: request.fileName,\n fileSizeBytes: request.fileSize,\n contentMd5,\n }),\n }, \"VOD commit_upload\");\n const commitEnvelope = await readJson(commitResponse, \"VOD commit_upload\");\n const commit = asObject(commitEnvelope.data);\n if (typeof commit?.assetId !== \"string\" || typeof commit.taskId !== \"string\") {\n throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid VOD commit_upload response\");\n }\n const status = await this.waitForTranscode(commit.taskId, request.workspaceId);\n log.success(200, { asset_id: commit.assetId, task_id: commit.taskId });\n return {\n assetId: commit.assetId,\n assetUri: `hogi://asset/${commit.assetId}`,\n fileUri: status.outputUri!,\n taskId: commit.taskId,\n workspaceId: request.workspaceId,\n };\n } catch (error) {\n log.failure(error);\n throw error;\n }\n }\n\n private async waitForTranscode(taskId: string, workspaceId: string): Promise<VodStatusData> {\n const deadline = Date.now() + this.timeoutMs;\n while (Date.now() < deadline) {\n const query = new URLSearchParams({ taskId, workspaceId });\n const response = await this.request(\n `${this.baseUrl}/media/vod/transcode_status?${query}`,\n { method: \"GET\", headers: this.headers() },\n \"VOD transcode_status\",\n );\n const envelope = await readJson(response, \"VOD transcode_status\");\n const data = asObject(envelope.data) as unknown as VodStatusData | undefined;\n if (!data || typeof data.status !== \"string\") throw new CliError(ErrorCode.SERVER_ERROR, \"Invalid VOD transcode_status response\");\n if ((data.status === \"completed\" || data.status === \"finished\") && typeof data.outputUri === \"string\" && data.outputUri.startsWith(\"hogi://video/\")) return data;\n if (data.status === \"failed\" || data.status === \"cancelled\") {\n throw new CliError(ErrorCode.SERVER_ERROR, data.errorMessage || data.errorCode || `VOD transcode ${data.status}`);\n }\n await sleep(this.pollIntervalMs);\n }\n throw new CliError(ErrorCode.TASK_TIMEOUT, `VOD transcode timed out after ${this.timeoutMs}ms`, { task_id: taskId });\n }\n}\n","/** Shared limits for the Hogi workspace VOD upload contract. */\nexport const VOD_VIDEO_THRESHOLD_BYTES = 10 * 1024 * 1024;\nexport const VOD_MAX_UPLOAD_BYTES = 500 * 1024 * 1024;\n\n","/** Node adapter for the browser-oriented tt-uploader VOD SDK. */\nimport { File } from \"node:buffer\";\nimport * as fs from \"node:fs\";\nimport { open } from \"node:fs/promises\";\nimport type TTUploader from \"tt-uploader\";\nimport { CliError, ErrorCode } from \"../output/errors.js\";\n\nexport interface VodStsToken {\n AccessKeyId: string;\n SecretAccessKey: string;\n SessionToken: string;\n ExpiredTime: string;\n CurrentTime?: string;\n}\n\nexport interface VodUploadToken {\n stsToken: VodStsToken;\n spaceName: string;\n appId: number;\n region: string;\n}\n\nexport interface VodDirectUploadRequest {\n filePath: string;\n fileName: string;\n fileSize: number;\n fileType: string;\n token: VodUploadToken;\n userId: string;\n timeoutMs?: number;\n onProgress?: (percent: number) => void;\n}\n\nexport type VodDirectUploader = (request: VodDirectUploadRequest) => Promise<string>;\ntype NodeXhrBody = ArrayBuffer | ArrayBufferView | Blob | FileSlice | string | URLSearchParams | FormData;\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === \"object\" ? value as Record<string, unknown> : undefined;\n}\n\nfunction videoMimeType(fileType: string): string {\n switch (fileType.toLowerCase()) {\n case \"mov\": return \"video/quicktime\";\n case \"webm\": return \"video/webm\";\n case \"avi\": return \"video/x-msvideo\";\n case \"mkv\": return \"video/x-matroska\";\n case \"flv\": return \"video/x-flv\";\n default: return \"video/mp4\";\n }\n}\n\nclass FileSlice {\n readonly size: number;\n readonly type: string;\n readonly name: string;\n\n constructor(\n private readonly filePath: string,\n fileName: string,\n private readonly startOffset: number,\n endOffset: number,\n type: string,\n ) {\n this.name = fileName;\n this.type = type;\n this.size = Math.max(0, endOffset - startOffset);\n }\n\n slice(start = 0, end = this.size, contentType = this.type): FileSlice {\n const relativeStart = Math.max(0, Math.min(this.size, start < 0 ? this.size + start : start));\n const relativeEnd = Math.max(relativeStart, Math.min(this.size, end < 0 ? this.size + end : end));\n return new FileSlice(\n this.filePath,\n this.name,\n this.startOffset + relativeStart,\n this.startOffset + relativeEnd,\n contentType,\n );\n }\n\n async arrayBuffer(): Promise<ArrayBuffer> {\n const handle = await open(this.filePath, \"r\");\n try {\n const bytes = Buffer.allocUnsafe(this.size);\n let offset = 0;\n while (offset < bytes.byteLength) {\n const { bytesRead } = await handle.read(bytes, offset, bytes.byteLength - offset, this.startOffset + offset);\n if (bytesRead === 0) throw new Error(\"Unexpected end of file while reading VOD upload slice\");\n offset += bytesRead;\n }\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);\n } finally {\n await handle.close();\n }\n }\n}\n\nasync function createSdkFile(request: VodDirectUploadRequest): Promise<Blob> {\n const mimeType = videoMimeType(request.fileType);\n const openAsBlob = (fs as unknown as { openAsBlob?: (path: string, options?: { type?: string }) => Promise<Blob> }).openAsBlob;\n if (openAsBlob) {\n const blob = await openAsBlob(request.filePath, { type: mimeType });\n return new File([blob], request.fileName, { type: mimeType });\n }\n // Node 18 has no fs.openAsBlob. A random-access file object supports both\n // direct and multipart SDK paths without loading the whole source eagerly.\n return new FileSlice(request.filePath, request.fileName, 0, request.fileSize, mimeType) as unknown as Blob;\n}\n\nfunction safeSdkError(info: Record<string, unknown>, token: VodStsToken): string {\n const extra = asObject(info.extra);\n const fields = [\"errorCode\", \"message\", \"requestId\"] as const;\n const safe: Record<string, string | number> = {};\n for (const field of fields) {\n const value = extra?.[field];\n if (typeof value === \"number\") safe[field] = value;\n if (typeof value === \"string\") safe[field] = redactTokenValues(value, token);\n }\n return Object.keys(safe).length > 0 ? JSON.stringify(safe) : \"unknown SDK error\";\n}\n\nfunction redactTokenValues(message: string, token: VodStsToken): string {\n let redacted = message;\n for (const value of [token.AccessKeyId, token.SecretAccessKey, token.SessionToken]) {\n if (value) redacted = redacted.split(value).join(\"[redacted]\");\n }\n return redacted.slice(0, 500);\n}\n\n/** Install the minimal browser APIs used by tt-uploader and return a restorer. */\nfunction installUploaderWebApiShims(): () => void {\n const globals = globalThis as Record<string, unknown>;\n const installed: Array<{ key: string; value: unknown }> = [];\n const install = (key: string, value: unknown): void => {\n if (globals[key] !== undefined) return;\n globals[key] = value;\n installed.push({ key, value });\n };\n install(\"File\", File);\n install(\"navigator\", { userAgent: `oiioii-cli/${process.version}` });\n install(\"window\", globalThis);\n if (!globals.FileReader) {\n install(\"FileReader\", class NodeFileReader {\n result: ArrayBuffer | null = null;\n error: Error | null = null;\n onload: ((event: { target: NodeFileReader }) => void) | null = null;\n onerror: ((event: { target: NodeFileReader }) => void) | null = null;\n readAsArrayBuffer(blob: Blob): void {\n void blob.arrayBuffer().then(result => {\n this.result = result;\n this.onload?.({ target: this });\n }, error => {\n this.error = error instanceof Error ? error : new Error(String(error));\n this.onerror?.({ target: this });\n });\n }\n });\n }\n install(\"XMLHttpRequest\", NodeFetchXmlHttpRequest);\n return () => {\n for (const { key, value } of installed.reverse()) {\n if (globals[key] === value) delete globals[key];\n }\n };\n}\n\nfunction installExpectedSdkWarningFilter(): () => void {\n const originalWarn = console.warn;\n const filteredWarn = (...args: unknown[]): void => {\n if (args[0] === \"[TTUploader]:worker not supported!\") return;\n originalWarn(...args);\n };\n console.warn = filteredWarn;\n return () => {\n if (console.warn === filteredWarn) console.warn = originalWarn;\n };\n}\n\nclass MiniEventTarget {\n onprogress: ((event: unknown) => void) | null = null;\n private readonly listeners = new Map<string, Set<(event: unknown) => void>>();\n addEventListener(type: string, listener: (event: unknown) => void): void {\n const set = this.listeners.get(type) ?? new Set();\n set.add(listener);\n this.listeners.set(type, set);\n }\n removeEventListener(type: string, listener: (event: unknown) => void): void {\n this.listeners.get(type)?.delete(listener);\n }\n dispatch(type: string, event: unknown): void {\n if (type === \"progress\") this.onprogress?.(event);\n for (const listener of this.listeners.get(type) ?? []) listener(event);\n }\n}\n\nclass NodeFetchXmlHttpRequest extends MiniEventTarget {\n readyState = 0;\n status = 0;\n statusText = \"\";\n responseType = \"\";\n response: unknown = null;\n responseText = \"\";\n timeout = 0;\n withCredentials = false;\n upload = new MiniEventTarget();\n onreadystatechange: (() => void) | null = null;\n onload: ((event: unknown) => void) | null = null;\n onerror: ((event: unknown) => void) | null = null;\n ontimeout: ((event: unknown) => void) | null = null;\n onabort: ((event: unknown) => void) | null = null;\n private method = \"GET\";\n private url = \"\";\n private readonly headers = new Headers();\n private responseHeaders = new Headers();\n private controller: AbortController | null = null;\n private aborted = false;\n\n open(method: string, url: string): void {\n this.method = method.toUpperCase();\n this.url = url;\n this.changeReadyState(1);\n }\n setRequestHeader(name: string, value: string): void { this.headers.set(name, value); }\n getResponseHeader(name: string): string | null { return this.responseHeaders.get(name); }\n getAllResponseHeaders(): string {\n return [...this.responseHeaders.entries()].map(([key, value]) => `${key}: ${value}\\r\\n`).join(\"\");\n }\n overrideMimeType(): void { /* compatibility no-op */ }\n abort(): void {\n this.aborted = true;\n this.controller?.abort();\n }\n send(body?: NodeXhrBody | null): void { void this.sendAsync(body ?? null); }\n private changeReadyState(state: number): void {\n this.readyState = state;\n this.onreadystatechange?.();\n this.dispatch(\"readystatechange\", {});\n }\n private emit(type: \"load\" | \"error\" | \"timeout\" | \"abort\", event: unknown): void {\n const handler = this[`on${type}`] as ((event: unknown) => void) | null;\n handler?.(event);\n this.dispatch(type, event);\n }\n private async sendAsync(body: NodeXhrBody | null): Promise<void> {\n this.controller = new AbortController();\n const timer = this.timeout > 0 ? setTimeout(() => this.controller?.abort(\"timeout\"), this.timeout) : undefined;\n try {\n const init: RequestInit = { method: this.method, headers: this.headers, signal: this.controller.signal };\n const requestBody = body instanceof FileSlice ? await body.arrayBuffer() : body;\n if (this.method !== \"GET\" && this.method !== \"HEAD\" && requestBody !== null) init.body = requestBody as RequestInit[\"body\"];\n const total = body instanceof FileSlice || body instanceof Blob ? body.size : body instanceof ArrayBuffer ? body.byteLength : 0;\n this.upload.dispatch(\"progress\", { lengthComputable: total > 0, loaded: 0, total });\n const response = await fetch(this.url, init);\n this.status = response.status;\n this.statusText = response.statusText;\n this.responseHeaders = response.headers;\n this.changeReadyState(2);\n const bytes = await response.arrayBuffer();\n this.changeReadyState(3);\n if (this.responseType === \"arraybuffer\") this.response = bytes;\n else if (this.responseType === \"blob\") this.response = new Blob([bytes]);\n else {\n this.responseText = new TextDecoder().decode(bytes);\n this.response = this.responseType === \"json\" ? JSON.parse(this.responseText || \"null\") : this.responseText;\n }\n this.upload.dispatch(\"progress\", { lengthComputable: total > 0, loaded: total, total });\n this.changeReadyState(4);\n this.emit(\"load\", {});\n } catch (error) {\n if (this.controller.signal.aborted) this.emit(this.aborted ? \"abort\" : \"timeout\", { error });\n else this.emit(\"error\", { error });\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n}\n\nasync function uploadWithSdk(request: VodDirectUploadRequest): Promise<string> {\n const { default: Uploader } = await import(\"tt-uploader\") as { default: typeof TTUploader };\n const file = await createSdkFile(request);\n const uploader = new Uploader({\n appId: request.token.appId,\n region: request.token.region,\n userId: request.userId,\n videoConfig: { spaceName: request.token.spaceName },\n noLog: true,\n useCloudControl: false,\n useLocalStorage: false,\n });\n const key = uploader.addFile({\n file,\n fileName: request.fileName,\n fileExtension: `.${request.fileType.replace(/^\\./u, \"\")}`,\n stsToken: { ...request.token.stsToken, CurrentTime: request.token.stsToken.CurrentTime ?? new Date().toISOString() },\n type: \"video\",\n });\n return await new Promise<string>((resolve, reject) => {\n let settled = false;\n const timeoutMs = request.timeoutMs ?? 30 * 60 * 1_000;\n const timeout = setTimeout(() => {\n try { uploader.cancel(key); } catch { /* best-effort cancellation */ }\n settle(() => reject(new CliError(ErrorCode.TASK_TIMEOUT, `VOD direct upload timed out after ${timeoutMs}ms`)));\n }, timeoutMs);\n const cleanup = (): void => {\n clearTimeout(timeout);\n uploader.removeListener(\"progress\", onProgress);\n uploader.removeListener(\"complete\", onComplete);\n uploader.removeListener(\"error\", onError);\n try { uploader.removeFile(key); } catch { /* cleanup must not mask the result */ }\n };\n const settle = (callback: () => void): void => {\n if (settled) return;\n settled = true;\n cleanup();\n callback();\n };\n const isCurrent = (info: Record<string, unknown>): boolean => info.key === key;\n const onProgress = (info: Record<string, unknown>): void => {\n if (isCurrent(info) && typeof info.percent === \"number\") request.onProgress?.(Math.max(0, Math.min(99, Math.round(info.percent))));\n };\n const onComplete = (info: Record<string, unknown>): void => {\n if (!isCurrent(info)) return;\n const result = asObject(info.uploadResult);\n const vid = result?.Vid ?? result?.vid;\n settle(() => {\n if (typeof vid === \"string\" && vid) resolve(vid);\n else reject(new CliError(ErrorCode.SERVER_ERROR, \"VOD upload completed without Vid\"));\n });\n };\n const onError = (info: Record<string, unknown>): void => {\n if (!isCurrent(info)) return;\n settle(() => reject(new CliError(ErrorCode.SERVER_ERROR, `VOD direct upload failed: ${safeSdkError(info, request.token.stsToken)}`)));\n };\n uploader.on(\"progress\", onProgress);\n uploader.on(\"complete\", onComplete);\n uploader.on(\"error\", onError);\n try { uploader.start(key); }\n catch (error) {\n const message = redactTokenValues(error instanceof Error ? error.message : String(error), request.token.stsToken);\n settle(() => reject(new CliError(ErrorCode.SERVER_ERROR, `VOD direct upload could not start: ${message}`)));\n }\n });\n}\n\nexport const uploadFileDirectlyToVod: VodDirectUploader = async request => {\n const restoreWebApis = installUploaderWebApiShims();\n const restoreConsole = installExpectedSdkWarningFilter();\n try {\n return await uploadWithSdk(request);\n } finally {\n restoreConsole();\n restoreWebApis();\n }\n};\n","import { Command } from \"commander\";\nimport { LogStore } from \"../logging/log_store.js\";\nimport type { LogCategory, LogExportFormat, LogFilter, LogLevel } from \"../logging/types.js\";\nimport { CliError, ErrorCode } from \"../output/errors.js\";\nimport { errorJson, printJson, successJson } from \"../output/json_output.js\";\nimport * as human from \"../output/human_output.js\";\nimport { recordTelemetryBusinessInfo, telemetrySizeBucket } from \"../telemetry/index.js\";\n\nexport interface LogsCommandDeps {\n logStore?: LogStore;\n}\n\nfunction rootJsonMode(cmd: Command): boolean {\n let root = cmd;\n while (root.parent) root = root.parent;\n return root.opts().json === true;\n}\n\nfunction parsePositiveInteger(value: string | undefined, name: string): number | undefined {\n if (value === undefined) return undefined;\n const parsed = Number.parseInt(value, 10);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, `${name} must be a positive integer.`);\n }\n return parsed;\n}\n\nfunction parseFilter(opts: { level?: string; source?: string; category?: string; trace?: string; feature?: string; since?: string; limit?: string }): LogFilter {\n const levels: LogLevel[] = [\"debug\", \"info\", \"warn\", \"error\"];\n const categories: LogCategory[] = [\"application\", \"api\"];\n if (opts.level && !levels.includes(opts.level as LogLevel)) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, `Unknown log level: ${opts.level}.`);\n }\n if (opts.category && !categories.includes(opts.category as LogCategory)) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, `Unknown log category: ${opts.category}.`);\n }\n if (opts.since && Number.isNaN(Date.parse(opts.since))) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, `Invalid --since timestamp: ${opts.since}.`);\n }\n return {\n ...(opts.level ? { level: opts.level as LogLevel } : {}),\n ...(opts.source ? { source: opts.source } : {}),\n ...(opts.category ? { category: opts.category as LogCategory } : {}),\n ...(opts.trace ? { traceId: opts.trace } : {}),\n ...(opts.feature ? { feature: opts.feature } : {}),\n ...(opts.since ? { since: opts.since } : {}),\n ...(opts.limit ? { limit: parsePositiveInteger(opts.limit, \"--limit\") } : {}),\n };\n}\n\nfunction addFilterOptions(command: Command): Command {\n return command\n .option(\"--level <level>\", \"Filter by debug/info/warn/error\")\n .option(\"--source <source>\", \"Filter by exact source name\")\n .option(\"--category <category>\", \"Filter by application/api\")\n .option(\"--trace <trace_id>\", \"Filter by feature trace ID\")\n .option(\"--feature <name>\", \"Filter by feature name, e.g. image.text\")\n .option(\"--since <timestamp>\", \"Filter entries at or after an ISO timestamp\")\n .option(\"--limit <count>\", \"Maximum number of newest entries\");\n}\n\nfunction handleError(error: unknown, jsonMode: boolean, type: string): void {\n const cliError = error instanceof CliError\n ? error\n : new CliError(ErrorCode.CONFIG_ERROR, error instanceof Error ? error.message : String(error));\n if (jsonMode) printJson(errorJson(type, cliError.code, cliError.message, cliError.details));\n else human.error(cliError.message);\n process.exitCode = 1;\n}\n\nexport function createLogsCommand(deps: LogsCommandDeps = {}): Command {\n const logs = new Command(\"logs\").description(\"Local structured log management\");\n\n addFilterOptions(logs.command(\"list\").description(\"List locally stored log entries\"))\n .action((opts, cmd) => {\n const jsonMode = rootJsonMode(cmd);\n try {\n const store = deps.logStore ?? new LogStore();\n const filter = parseFilter(opts);\n const entries = store.list(filter);\n recordTelemetryBusinessInfo({\n entry_count: entries.length,\n has_filter: Object.values(filter).some((value) => value !== undefined),\n });\n if (jsonMode) {\n printJson(successJson(\"logs_list\", { path: store.path, count: entries.length, entries }));\n } else if (entries.length === 0) {\n human.info(`No logs found.\\n Path: ${store.path}`);\n } else {\n human.heading(`Logs (${entries.length})`);\n for (const entry of entries) {\n const status = entry.http?.status ? ` status=${entry.http.status}` : \"\";\n human.info(`${entry.timestamp} ${entry.level.toUpperCase()} ${entry.source} ${entry.event}${status}`);\n }\n }\n } catch (error) {\n handleError(error, jsonMode, \"logs_list\");\n }\n });\n\n addFilterOptions(\n logs.command(\"export\")\n .description(\"Export locally stored logs\")\n .requiredOption(\"-o, --output <path>\", \"Destination JSON or JSONL file\")\n .option(\"--format <format>\", \"Export format: json or jsonl\", \"jsonl\")\n .option(\"--force\", \"Overwrite an existing export file\"),\n ).action((opts, cmd) => {\n const jsonMode = rootJsonMode(cmd);\n try {\n if (opts.format !== \"json\" && opts.format !== \"jsonl\") {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, `Unknown export format: ${opts.format}.`);\n }\n const store = deps.logStore ?? new LogStore();\n const result = store.export({\n output: opts.output,\n format: opts.format as LogExportFormat,\n filter: parseFilter(opts),\n force: opts.force === true,\n });\n recordTelemetryBusinessInfo({\n format: result.format,\n entry_count: result.count,\n size_bucket: telemetrySizeBucket(result.bytes),\n });\n if (jsonMode) printJson(successJson(\"logs_export\", result));\n else human.success(`Exported ${result.count} log entries to ${result.path}`);\n } catch (error) {\n handleError(error, jsonMode, \"logs_export\");\n }\n });\n\n logs.command(\"path\")\n .description(\"Show the local log file path\")\n .action((_opts, cmd) => {\n const jsonMode = rootJsonMode(cmd);\n const store = deps.logStore ?? new LogStore();\n recordTelemetryBusinessInfo({ path_available: true });\n if (jsonMode) printJson(successJson(\"logs_path\", { path: store.path }));\n else human.info(store.path);\n });\n\n return logs;\n}\n","import { Command } from \"commander\";\nimport { FileConfigStore } from \"../config/config_store.js\";\nimport { HogiPointsClient, type GenerationCostResult, type UserPointsInfo } from \"../clients/hogi_points_client.js\";\nimport { HogiModelCatalogClient } from \"../clients/hogi_model_catalog_client.js\";\nimport { estimatePointsQuote, type PointsQuote } from \"../core/points_quote.js\";\nimport { getRootOptions, isJsonOutput, requireApiKeyAuth } from \"../app/command_context.js\";\nimport { CliError, ErrorCode } from \"../output/errors.js\";\nimport { errorJson, printJson, successJson } from \"../output/json_output.js\";\nimport * as human from \"../output/human_output.js\";\nimport { recordTelemetryBusinessInfo } from \"../telemetry/index.js\";\nimport {\n selectCatalogPricing,\n selectionFromCatalogPricing,\n selectionSummary,\n validateModelConstraints,\n} from \"../core/model_selection.js\";\n\nexport interface PointsCommandDeps {\n configStore?: FileConfigStore;\n fetch?: typeof globalThis.fetch;\n}\n\ninterface PointsContext {\n baseUrl: string;\n apiKey: string;\n fetch?: typeof globalThis.fetch;\n}\n\nfunction context(rootOpts: Record<string, unknown>, deps: PointsCommandDeps): PointsContext {\n const configStore = deps.configStore ?? new FileConfigStore();\n const auth = requireApiKeyAuth(rootOpts, configStore);\n return { baseUrl: auth.baseUrl, apiKey: auth.apiKey, ...(deps.fetch ? { fetch: deps.fetch } : {}) };\n}\n\nexport async function executePointsBalance(ctx: PointsContext): Promise<UserPointsInfo> {\n const balance = await new HogiPointsClient(ctx).getBalance();\n return {\n points: balance.points,\n tier: balance.tier,\n ...(typeof balance.description === \"string\" ? { description: balance.description } : {}),\n ...(Array.isArray(balance.disabledModels) ? { disabledModels: balance.disabledModels } : {}),\n };\n}\n\nexport async function executePointsCost(uris: string[], ctx: PointsContext): Promise<GenerationCostResult> {\n return await new HogiPointsClient(ctx).getGenerationCosts(uris);\n}\n\nexport async function executePointsQuote(\n params: { modelId?: string; model?: string; variant?: string; duration?: number; resolution?: string; quality?: string; referenceVideoDuration?: number },\n ctx: PointsContext,\n): Promise<PointsQuote & { available_points: number; sufficient: boolean; model: ReturnType<typeof selectionSummary> }> {\n const [models, balance] = await Promise.all([\n new HogiModelCatalogClient(ctx).listModels(),\n new HogiPointsClient(ctx).getBalance(),\n ]);\n const pricing = selectCatalogPricing(models, {\n ...(params.modelId ? { modelId: params.modelId } : {}),\n ...(params.model ? { model: params.model } : {}),\n ...(params.variant ? { variant: params.variant } : {}),\n });\n const selection = selectionFromCatalogPricing(pricing);\n validateModelConstraints(selection, {\n ...(params.duration !== undefined ? { duration: params.duration } : {}),\n ...(params.resolution ? { resolution: params.resolution } : {}),\n });\n const quote = estimatePointsQuote({\n pricing,\n tier: balance.tier,\n ...(params.duration !== undefined ? { duration: params.duration } : {}),\n ...(params.resolution ? { resolution: params.resolution } : {}),\n ...(params.quality ? { quality: params.quality } : {}),\n ...(params.referenceVideoDuration !== undefined ? { referenceVideoDuration: params.referenceVideoDuration } : {}),\n });\n return {\n ...quote,\n model: selectionSummary(selection),\n available_points: balance.points,\n sufficient: balance.points >= quote.estimated_points,\n };\n}\n\nfunction numberOption(value: string, name: string, allowZero = false): number {\n const parsed = Number(value);\n if (!Number.isFinite(parsed) || (allowZero ? parsed < 0 : parsed <= 0)) {\n throw new CliError(ErrorCode.INVALID_ARGUMENT, `${name} must be ${allowZero ? \"zero or positive\" : \"positive\"}`);\n }\n return parsed;\n}\n\nfunction handleError(error: unknown, jsonMode: boolean, type: string): void {\n const cliError = error instanceof CliError\n ? error\n : new CliError(ErrorCode.SERVER_ERROR, error instanceof Error ? error.message : String(error));\n if (jsonMode) printJson(errorJson(type, cliError.code, cliError.message, cliError.details));\n else human.error(cliError.message);\n process.exitCode = 1;\n}\n\nexport function createPointsCommand(deps: PointsCommandDeps = {}): Command {\n const points = new Command(\"points\").description(\"Inspect points balance, estimates, and actual generation charges\");\n\n points.command(\"balance\").description(\"Show current points balance and membership tier\").action(async (_opts, cmd) => {\n const jsonMode = isJsonOutput(cmd);\n try {\n const result = await executePointsBalance(context(getRootOptions(cmd), deps));\n recordTelemetryBusinessInfo({ tier: result.tier });\n if (jsonMode) printJson(successJson(\"points_balance\", result));\n else {\n human.success(`Available points: ${result.points}`);\n human.info(` Tier: ${result.tier}`);\n }\n } catch (error) { handleError(error, jsonMode, \"points_balance\"); }\n });\n\n points.command(\"cost\")\n .description(\"Query actual charged points for generated resource URIs\")\n .argument(\"<uris...>\", \"1-20 hogi:// generation URIs\")\n .action(async (uris: string[], _opts, cmd) => {\n const jsonMode = isJsonOutput(cmd);\n try {\n const result = await executePointsCost(uris, context(getRootOptions(cmd), deps));\n recordTelemetryBusinessInfo({\n uri_count: uris.length,\n charged_count: result.entries.filter((entry) => entry.status === \"charged\").length,\n no_charge_count: result.entries.filter((entry) => entry.status === \"no_charge\").length,\n not_found_count: result.entries.filter((entry) => entry.status === \"not_found\").length,\n });\n if (jsonMode) printJson(successJson(\"points_cost\", result));\n else for (const entry of result.entries) {\n human.info(`${entry.uri}: ${entry.status}${entry.consumed_points !== undefined ? ` · consumed ${entry.consumed_points} points` : \"\"}`);\n if (entry.pricingExplanation) human.info(` ${entry.pricingExplanation}`);\n }\n } catch (error) { handleError(error, jsonMode, \"points_cost\"); }\n });\n\n points.command(\"quote\")\n .description(\"Estimate generation points from the current backend model catalog\")\n .option(\"--model-id <id>\", \"Exact model ID from inspect models\")\n .option(\"--model <model>\", \"Model key from inspect models\")\n .option(\"--variant <variant>\", \"Exact model variant from inspect models; requires --model\")\n .option(\"--duration <seconds>\", \"Requested generation duration\")\n .option(\"--resolution <resolution>\", \"Requested output resolution\")\n .option(\"--quality <quality>\", \"Requested quality tier\")\n .option(\"--reference-video-duration <seconds>\", \"Referenced video duration\", \"0\")\n .action(async (opts: { modelId?: string; model?: string; variant?: string; duration?: string; resolution?: string; quality?: string; referenceVideoDuration: string }, cmd) => {\n const jsonMode = isJsonOutput(cmd);\n try {\n const result = await executePointsQuote({\n ...(opts.modelId ? { modelId: opts.modelId } : {}),\n ...(opts.model ? { model: opts.model } : {}),\n ...(opts.variant ? { variant: opts.variant } : {}),\n ...(opts.duration !== undefined ? { duration: numberOption(opts.duration, \"duration\") } : {}),\n ...(opts.resolution ? { resolution: opts.resolution } : {}),\n ...(opts.quality ? { quality: opts.quality } : {}),\n referenceVideoDuration: numberOption(opts.referenceVideoDuration, \"reference video duration\", true),\n }, context(getRootOptions(cmd), deps));\n recordTelemetryBusinessInfo({\n ...(result.model.model_id !== undefined ? { model_id: result.model.model_id } : {}),\n model_key: result.model.key,\n ...(result.model.variant ? { variant: result.model.variant } : {}),\n ...(opts.duration ? { duration_seconds: Number(opts.duration) } : {}),\n ...(opts.resolution ? { resolution: opts.resolution } : {}),\n ...(opts.quality ? { quality: opts.quality } : {}),\n estimated_points: result.estimated_points,\n sufficient: result.sufficient,\n });\n if (jsonMode) printJson(successJson(\"points_quote\", result));\n else {\n human.success(`Estimated points: ${result.estimated_points}`);\n human.info(` Available: ${result.available_points} · ${result.sufficient ? \"sufficient\" : \"insufficient\"}`);\n human.warn(result.caveat);\n }\n } catch (error) { handleError(error, jsonMode, \"points_quote\"); }\n });\n\n return points;\n}\n","import { Command } from \"commander\";\nimport { FileConfigStore } from \"../config/config_store.js\";\nimport { getRootOptions, isJsonOutput } from \"../app/command_context.js\";\nimport { ErrorCode } from \"../output/errors.js\";\nimport { errorJson, printJson, successJson } from \"../output/json_output.js\";\nimport * as human from \"../output/human_output.js\";\n\nexport interface AuthCommandDeps {\n configStore?: FileConfigStore;\n}\n\nfunction validBaseUrl(value: string): boolean {\n try {\n const url = new URL(value);\n return (url.protocol === \"https:\" || url.protocol === \"http:\") && url.pathname === \"/\" && !url.search && !url.hash;\n } catch {\n return false;\n }\n}\n\nexport function createAuthCommand(deps: AuthCommandDeps = {}): Command {\n const auth = new Command(\"auth\").description(\"Authentication configuration\");\n\n auth.command(\"login\")\n .description(\"Persist an API key in the local CLI configuration\")\n .option(\"--api-key <key>\", \"Oiioii API key; falls back to OIIOII_API_KEY\")\n .option(\"--base-url <url>\", \"Persist the backend base URL with the API key\")\n .action((opts: { apiKey?: string; baseUrl?: string }, cmd: Command) => {\n const jsonMode = isJsonOutput(cmd);\n const apiKey = opts.apiKey?.trim() || process.env[\"OIIOII_API_KEY\"]?.trim();\n if (!apiKey) {\n const message = \"API key is required. Pass --api-key <key> or set OIIOII_API_KEY for this login command.\";\n if (jsonMode) printJson(errorJson(\"auth_login\", ErrorCode.INVALID_ARGUMENT, message));\n else human.error(message);\n process.exitCode = 1;\n return;\n }\n\n const rootBaseUrl = getRootOptions(cmd).baseUrl;\n const baseUrl = (opts.baseUrl ?? (typeof rootBaseUrl === \"string\" ? rootBaseUrl : undefined))?.trim();\n if (baseUrl && !validBaseUrl(baseUrl)) {\n const message = \"--base-url must be an HTTP(S) origin without a path, query, or fragment.\";\n if (jsonMode) printJson(errorJson(\"auth_login\", ErrorCode.INVALID_ARGUMENT, message));\n else human.error(message);\n process.exitCode = 1;\n return;\n }\n\n const configStore = deps.configStore ?? new FileConfigStore();\n configStore.update({ apiKey, ...(baseUrl ? { baseUrl: baseUrl.replace(/\\/$/, \"\") } : {}) });\n const persisted = configStore.load();\n const configPath = configStore.getConfigPath();\n\n if (jsonMode) {\n printJson(successJson(\"auth_login\", {\n authenticated: true,\n base_url: persisted.baseUrl,\n config_file: configPath,\n }));\n } else {\n human.success(`API key saved to ${configPath}`);\n human.info(` Base URL: ${persisted.baseUrl}`);\n }\n });\n\n return auth;\n}\n","import { Command } from \"commander\";\nimport { isJsonOutput } from \"../app/command_context.js\";\nimport { installCliVersion, listCliVersions, updateCli } from \"../core/npm_cli_manager.js\";\nimport { printJson, successJson } from \"../output/json_output.js\";\nimport * as human from \"../output/human_output.js\";\n\nfunction printOperation(type: string, result: Awaited<ReturnType<typeof updateCli>>, command: Command): void {\n if (isJsonOutput(command)) {\n printJson(successJson(type, result));\n return;\n }\n if (result.checked_only) {\n if (result.update_available) human.info(`Update available: ${result.previous_version} -> ${result.version} (${result.dist_tag})`);\n else if (result.previous_version === result.version) human.success(`oiioii ${result.previous_version} is up to date (${result.dist_tag}).`);\n else human.info(`Current version ${result.previous_version} is newer than channel version ${result.version}; no downgrade will be performed.`);\n return;\n }\n if (result.changed) human.success(`oiioii ${result.previous_version} -> ${result.version}`);\n else human.success(`oiioii ${result.version} is already installed.`);\n}\n\nexport function createUpdateCommand(): Command {\n return new Command(\"update\")\n .description(\"Update oiioii from the npm channel for this build environment\")\n .option(\"--check\", \"Check for an update without installing it\")\n .option(\"--force\", \"Reinstall the channel version even when already current\")\n .action(async (options: { check?: boolean; force?: boolean }, command: Command) => {\n printOperation(\"cli_update\", await updateCli(options), command);\n });\n}\n\nexport function createInstallCommand(): Command {\n return new Command(\"install\")\n .description(\"Install one exact oiioii version from npm\")\n .argument(\"<version>\", \"Exact stable or prerelease version allowed by this build environment\")\n .action(async (version: string, _options: unknown, command: Command) => {\n printOperation(\"cli_install\", await installCliVersion(version), command);\n });\n}\n\nexport function createVersionsCommand(): Command {\n return new Command(\"versions\")\n .description(\"List npm versions available to this build environment\")\n .action(async (_options: unknown, command: Command) => {\n const result = await listCliVersions();\n if (isJsonOutput(command)) {\n printJson(successJson(\"cli_versions\", result));\n return;\n }\n human.heading(`Available oiioii versions (${result.environment})`);\n if (result.versions.length === 0) human.info(\"No matching versions found.\");\n else result.versions.forEach((version) => human.info(version));\n });\n}\n","import crossSpawn from \"cross-spawn\";\nimport semver from \"semver\";\nimport { existsSync } from \"node:fs\";\nimport { getBuildEnvironment, getReleaseChannelConfig } from \"../config/build_environment.js\";\nimport { CLI_VERSION } from \"../app/version.js\";\nimport { CliError, ErrorCode } from \"../output/errors.js\";\nimport { readCliInstallRecord, type CliInstallRecord } from \"./cli_installation.js\";\n\nexport interface ProcessResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n}\n\nexport type ProcessRunner = (\n executable: string,\n args: string[],\n options: { inherit: boolean },\n) => Promise<ProcessResult>;\n\nexport const defaultProcessRunner: ProcessRunner = (executable, args, options) => new Promise((resolve, reject) => {\n const child = crossSpawn(executable, args, {\n stdio: options.inherit ? \"inherit\" : [\"ignore\", \"pipe\", \"pipe\"],\n env: process.env,\n });\n let stdout = \"\";\n let stderr = \"\";\n if (!options.inherit) {\n child.stdout?.setEncoding(\"utf8\");\n child.stderr?.setEncoding(\"utf8\");\n child.stdout?.on(\"data\", (chunk: string) => { stdout += chunk; });\n child.stderr?.on(\"data\", (chunk: string) => { stderr += chunk; });\n }\n child.on(\"error\", reject);\n child.on(\"close\", (code) => resolve({ exitCode: code ?? 1, stdout, stderr }));\n});\n\nexport interface CliVersionOperationResult {\n environment: string;\n package: string;\n dist_tag: string;\n previous_version: string;\n version: string;\n update_available: boolean;\n changed: boolean;\n checked_only: boolean;\n}\n\nfunction npmArgs(record: CliInstallRecord, args: string[]): string[] {\n return record.registry ? [...args, \"--registry\", record.registry] : args;\n}\n\nasync function runChecked(\n runner: ProcessRunner,\n executable: string,\n args: string[],\n options: { inherit?: boolean; operation: string },\n): Promise<ProcessResult> {\n let result: ProcessResult;\n try {\n result = await runner(executable, args, { inherit: options.inherit === true });\n } catch (error) {\n throw new CliError(ErrorCode.CLI_UPDATE_FAILED, `Failed to start npm while ${options.operation}.`, {\n cause: error instanceof Error ? error.message : String(error),\n retryable: true,\n });\n }\n if (result.exitCode !== 0) {\n throw new CliError(ErrorCode.CLI_UPDATE_FAILED, `npm failed while ${options.operation}.`, {\n exit_code: result.exitCode,\n stderr: result.stderr.trim() || undefined,\n retryable: true,\n });\n }\n return result;\n}\n\nfunction parseNpmJson<T>(stdout: string, operation: string): T {\n try {\n return JSON.parse(stdout.trim()) as T;\n } catch {\n throw new CliError(ErrorCode.CLI_UPDATE_FAILED, `npm returned invalid JSON while ${operation}.`, {\n output: stdout.trim(),\n retryable: true,\n });\n }\n}\n\nexport function normalizeCliVersion(raw: string): string {\n const normalized = raw.trim().replace(/^v(?=\\d)/, \"\");\n if (semver.valid(normalized) === null) {\n throw new CliError(\n ErrorCode.INVALID_ARGUMENT,\n `Invalid CLI version '${raw}'. Use one exact version such as 0.3.0; ranges, tags, and URLs are not supported.`,\n );\n }\n return normalized;\n}\n\nexport function assertVersionMatchesBuildEnvironment(version: string): void {\n const environment = getBuildEnvironment();\n const channel = getReleaseChannelConfig();\n if (!channel.managed) {\n throw new CliError(\n ErrorCode.CLI_INSTALLATION_UNMANAGED,\n \"Local builds cannot update or install CLI versions from npm. Rebuild the local checkout instead.\",\n );\n }\n const prerelease = semver.prerelease(version);\n if (channel.prerelease === \"forbidden\" && prerelease !== null) {\n throw new CliError(\n ErrorCode.INVALID_ARGUMENT,\n `The production build only installs stable versions; '${version}' is a prerelease.`,\n );\n }\n if (channel.prerelease === \"required\" && prerelease === null) {\n throw new CliError(\n ErrorCode.INVALID_ARGUMENT,\n `The ${environment} build only installs prerelease versions; '${version}' is stable.`,\n );\n }\n}\n\nfunction readManagedInstallRecord(): CliInstallRecord {\n const channel = getReleaseChannelConfig();\n if (!channel.managed || !channel.distTag) {\n throw new CliError(\n ErrorCode.CLI_INSTALLATION_UNMANAGED,\n \"Local builds cannot update or install CLI versions from npm. Rebuild the local checkout instead.\",\n );\n }\n const record = readCliInstallRecord();\n if (record.distTag !== channel.distTag) {\n throw new CliError(ErrorCode.CONFIG_ERROR, `Install record dist-tag '${record.distTag}' does not match '${channel.distTag}'.`);\n }\n return record;\n}\n\nasync function resolveVersion(\n record: CliInstallRecord,\n selector: string,\n runner: ProcessRunner,\n): Promise<string> {\n const result = await runChecked(\n runner,\n record.npmPath,\n npmArgs(record, [\"view\", `${record.packageName}@${selector}`, \"version\", \"--json\"]),\n { operation: `resolving ${selector}` },\n );\n const value = parseNpmJson<unknown>(result.stdout, `resolving ${selector}`);\n if (typeof value !== \"string\" || semver.valid(value) === null) {\n throw new CliError(ErrorCode.CLI_UPDATE_FAILED, `npm returned an invalid version for '${selector}'.`, {\n value,\n retryable: true,\n });\n }\n assertVersionMatchesBuildEnvironment(value);\n return value;\n}\n\nasync function verifyInstalledVersion(record: CliInstallRecord, expected: string, runner: ProcessRunner): Promise<void> {\n if (!existsSync(record.entryPath)) {\n throw new CliError(ErrorCode.CLI_UPDATE_FAILED, `Installed CLI entry was not found: ${record.entryPath}`);\n }\n const result = await runChecked(runner, record.nodePath, [record.entryPath, \"--version\"], {\n operation: \"verifying the installed CLI\",\n });\n if (result.stdout.trim() !== expected) {\n throw new CliError(ErrorCode.CLI_UPDATE_FAILED, \"Installed CLI version verification failed.\", {\n expected,\n actual: result.stdout.trim(),\n retryable: true,\n });\n }\n}\n\nasync function installResolvedVersion(\n record: CliInstallRecord,\n version: string,\n runner: ProcessRunner,\n): Promise<void> {\n await runChecked(\n runner,\n record.npmPath,\n npmArgs(record, [\n \"install\",\n \"--global\",\n \"--prefix\",\n record.npmPrefix,\n \"--no-audit\",\n \"--no-fund\",\n `${record.packageName}@${version}`,\n ]),\n { inherit: true, operation: `installing ${record.packageName}@${version}` },\n );\n await verifyInstalledVersion(record, version, runner);\n}\n\nasync function installWithRollback(\n record: CliInstallRecord,\n version: string,\n runner: ProcessRunner,\n): Promise<void> {\n try {\n await installResolvedVersion(record, version, runner);\n } catch (error) {\n let rollback: \"not_attempted\" | \"succeeded\" | \"failed\" = \"not_attempted\";\n let rollbackError: string | undefined;\n if (semver.valid(CLI_VERSION) !== null && semver.neq(CLI_VERSION, version)) {\n try {\n await installResolvedVersion(record, CLI_VERSION, runner);\n rollback = \"succeeded\";\n } catch (failure) {\n rollback = \"failed\";\n rollbackError = failure instanceof Error ? failure.message : String(failure);\n }\n }\n throw new CliError(ErrorCode.CLI_UPDATE_FAILED, `Failed to install ${record.packageName}@${version}.`, {\n cause: error instanceof Error ? error.message : String(error),\n rollback,\n ...(rollbackError ? { rollback_error: rollbackError } : {}),\n retryable: true,\n });\n }\n}\n\nexport async function updateCli(\n options: { check?: boolean; force?: boolean } = {},\n runner: ProcessRunner = defaultProcessRunner,\n): Promise<CliVersionOperationResult> {\n const channel = getReleaseChannelConfig();\n if (!channel.managed || !channel.distTag) {\n assertVersionMatchesBuildEnvironment(CLI_VERSION);\n throw new Error(\"unreachable\");\n }\n const record = readManagedInstallRecord();\n const targetVersion = await resolveVersion(record, channel.distTag, runner);\n const updateAvailable = semver.gt(targetVersion, CLI_VERSION);\n const shouldInstall = !options.check && (updateAvailable || options.force === true);\n if (shouldInstall) {\n await installWithRollback(record, targetVersion, runner);\n }\n return {\n environment: getBuildEnvironment(),\n package: record.packageName,\n dist_tag: channel.distTag,\n previous_version: CLI_VERSION,\n version: targetVersion,\n update_available: updateAvailable,\n changed: shouldInstall,\n checked_only: options.check === true,\n };\n}\n\nexport async function installCliVersion(\n rawVersion: string,\n runner: ProcessRunner = defaultProcessRunner,\n): Promise<CliVersionOperationResult> {\n const record = readManagedInstallRecord();\n const version = normalizeCliVersion(rawVersion);\n assertVersionMatchesBuildEnvironment(version);\n const resolved = await resolveVersion(record, version, runner);\n await installWithRollback(record, resolved, runner);\n return {\n environment: getBuildEnvironment(),\n package: record.packageName,\n dist_tag: record.distTag,\n previous_version: CLI_VERSION,\n version: resolved,\n update_available: semver.gt(resolved, CLI_VERSION),\n changed: semver.neq(CLI_VERSION, resolved),\n checked_only: false,\n };\n}\n\nexport async function listCliVersions(\n runner: ProcessRunner = defaultProcessRunner,\n): Promise<{ environment: string; package: string; dist_tag: string; versions: string[] }> {\n const channel = getReleaseChannelConfig();\n const record = readManagedInstallRecord();\n const result = await runChecked(\n runner,\n record.npmPath,\n npmArgs(record, [\"view\", record.packageName, \"versions\", \"--json\"]),\n { operation: \"listing CLI versions\" },\n );\n const raw = parseNpmJson<unknown>(result.stdout, \"listing CLI versions\");\n const values = Array.isArray(raw) ? raw : [raw];\n const versions = values\n .filter((value): value is string => typeof value === \"string\" && semver.valid(value) !== null)\n .filter((value) => channel.prerelease === \"required\" ? semver.prerelease(value) !== null : semver.prerelease(value) === null)\n .sort(semver.rcompare);\n return { environment: getBuildEnvironment(), package: record.packageName, dist_tag: channel.distTag!, versions };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { getBuildEnvironment, type BuildEnvironment } from \"../config/build_environment.js\";\nimport { CLI_NPM_PACKAGE_NAME } from \"../app/version.js\";\nimport { CliError, ErrorCode } from \"../output/errors.js\";\n\nexport interface CliInstallRecord {\n schemaVersion: 1;\n manager: \"npm\";\n environment: BuildEnvironment;\n packageName: string;\n distTag: string;\n installRoot: string;\n npmPrefix: string;\n nodePath: string;\n npmPath: string;\n entryPath: string;\n registry?: string;\n}\n\nexport function defaultInstallRoot(): string {\n if (process.env[\"OIIOII_INSTALL_DIR\"]?.trim()) return process.env[\"OIIOII_INSTALL_DIR\"]!.trim();\n if (process.platform === \"win32\") {\n const localAppData = process.env[\"LOCALAPPDATA\"]?.trim();\n return join(localAppData || join(homedir(), \"AppData\", \"Local\"), \"oiioii-cli\");\n }\n return join(homedir(), \".local\", \"share\", \"oiioii-cli\");\n}\n\nexport function installRecordPath(): string {\n return process.env[\"OIIOII_INSTALL_RECORD\"]?.trim() || join(defaultInstallRoot(), \"install.json\");\n}\n\nfunction isString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nexport function readCliInstallRecord(path = installRecordPath()): CliInstallRecord {\n if (!existsSync(path)) {\n throw new CliError(\n ErrorCode.CLI_INSTALLATION_UNMANAGED,\n `This oiioii installation is not managed by the official installer. Update it with 'npm install -g ${CLI_NPM_PACKAGE_NAME}@latest'.`,\n { path, retryable: false },\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(path, \"utf8\").replace(/^\\uFEFF/, \"\"));\n } catch (error) {\n throw new CliError(ErrorCode.CONFIG_ERROR, `Cannot read CLI install record: ${path}`, {\n path,\n cause: error instanceof Error ? error.message : String(error),\n });\n }\n\n const record = parsed as Partial<CliInstallRecord>;\n if (\n record.schemaVersion !== 1\n || record.manager !== \"npm\"\n || !isString(record.environment)\n || !isString(record.packageName)\n || !isString(record.distTag)\n || !isString(record.installRoot)\n || !isString(record.npmPrefix)\n || !isString(record.nodePath)\n || !isString(record.npmPath)\n || !isString(record.entryPath)\n ) {\n throw new CliError(ErrorCode.CONFIG_ERROR, `Invalid CLI install record: ${path}`, { path });\n }\n\n const buildEnvironment = getBuildEnvironment();\n if (record.environment !== buildEnvironment) {\n throw new CliError(\n ErrorCode.CONFIG_ERROR,\n `Install record environment '${record.environment}' does not match this '${buildEnvironment}' build.`,\n { path, installed_environment: record.environment, build_environment: buildEnvironment },\n );\n }\n if (record.packageName !== CLI_NPM_PACKAGE_NAME) {\n throw new CliError(\n ErrorCode.CONFIG_ERROR,\n `Install record package '${record.packageName}' does not match this build package '${CLI_NPM_PACKAGE_NAME}'.`,\n { path, installed_package: record.packageName, build_package: CLI_NPM_PACKAGE_NAME },\n );\n }\n\n return record as CliInstallRecord;\n}\n"],"mappings":";;;AAMA,SAAS,WAAAA,WAAS,sBAAsB;;;ACMxC,SAAS,eAAe;;;ACHxB,SAAS,gBAAAC,eAAc,iBAAAC,gBAAe,aAAAC,YAAW,cAAAC,aAAY,aAAAC,kBAAiB;AAC9E,SAAS,QAAAC,aAAY;;;ACAd,IAAM,yBAAyB;AAAA,EACpC,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,OAAO;AACT;AAeO,IAAM,mBAAmE;AAAA,EAC9E,YAAY,EAAE,SAAS,MAAM,SAAS,UAAU,YAAY,YAAY;AAAA,EACxE,MAAM,EAAE,SAAS,MAAM,SAAS,QAAQ,YAAY,WAAW;AAAA,EAC/D,OAAO,EAAE,SAAS,OAAO,YAAY,WAAW;AAClD;AAEO,SAAS,mBAAmB,OAA0C;AAC3E,SAAO,OAAO,UAAU,eAAe,KAAK,wBAAwB,KAAK;AAC3E;AAEA,SAAS,2BAA+C;AACtD,SAAO,OACH,eACA,QAAQ,IAAI,kBAAkB;AACpC;AAEA,SAAS,uBAA2C;AAClD,QAAM,QAAQ,OACV,0BACA,QAAQ,IAAI,uBAAuB;AACvC,SAAO,OAAO,KAAK,KAAK;AAC1B;AAGO,SAAS,sBAAwC;AACtD,QAAM,QAAQ,yBAAyB,KAAK;AAC5C,SAAO,mBAAmB,KAAK,IAAI,QAAQ;AAC7C;AAGO,SAAS,4BAAoD;AAClE,QAAM,cAAc,oBAAoB;AACxC,SAAO;AAAA,IACL;AAAA,IACA,SAAS,qBAAqB,KAAK,uBAAuB,WAAW;AAAA,EACvE;AACF;AAEO,SAAS,oBAA4B;AAC1C,SAAO,0BAA0B,EAAE;AACrC;AAEO,SAAS,0BAAgD;AAC9D,SAAO,iBAAiB,oBAAoB,CAAC;AAC/C;;;ACzEA,SAAS,eAAAC,oBAAmB;;;ACA5B,SAAS,mBAAmB;;;ACA5B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAAC;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,OACK;AACP,SAAS,SAAS,QAAAC,OAAM,eAAe;;;ACXvC,SAAS,eAAe;AACxB,SAAS,YAAY;AAGd,SAAS,mBAA2B;AACzC,SAAO,QAAQ,IAAI,mBAAmB,KAAK,KAAK,QAAQ,GAAG,SAAS;AACtE;;;ACNA,SAAS,WAAW,WAAW,UAAU,UAAU,kBAAkB;AAQrE,IAAM,aAAa,IAAI,WAAW,IAAI,kBAAkB,CAAC,CAAC;AAE1D,SAAS,UAAU,cAA4B;AAC7C,UAAQ,KAAK,YAAY,GAAG,GAAG,YAAY;AAC7C;AAMO,SAAS,aAAgB,UAAkB,UAAmB,UAA2B,CAAC,GAAM;AACrG,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,MAAI;AAEJ,SAAO,eAAe,QAAW;AAC/B,QAAI;AACF,mBAAa,SAAS,UAAU,MAAM,GAAK;AAAA,IAC7C,SAASC,QAAO;AACd,YAAM,OAAQA,OAAgC;AAC9C,UAAI,SAAS,SAAU,OAAMA;AAE7B,UAAI;AACF,YAAI,KAAK,IAAI,IAAI,SAAS,QAAQ,EAAE,UAAU,SAAS;AACrD,qBAAW,QAAQ;AACnB;AAAA,QACF;AAAA,MACF,SAAS,WAAW;AAClB,YAAK,UAAoC,SAAS,SAAU;AAC5D,cAAM;AAAA,MACR;AAEA,UAAI,KAAK,IAAI,KAAK,SAAU,OAAM,IAAI,MAAM,oCAAoC,QAAQ,EAAE;AAC1F,gBAAU,KAAK,IAAI,SAAS,KAAK,IAAI,GAAG,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC;AAAA,IACjE;AAAA,EACF;AAEA,MAAI;AACF,WAAO,SAAS;AAAA,EAClB,UAAE;AACA,UAAM,YAAY,UAAU,UAAU;AACtC,cAAU,UAAU;AACpB,QAAI;AACF,YAAM,cAAc,SAAS,QAAQ;AACrC,UAAI,YAAY,QAAQ,UAAU,OAAO,YAAY,QAAQ,UAAU,IAAK,YAAW,QAAQ;AAAA,IACjG,SAASA,QAAO;AACd,UAAKA,OAAgC,SAAS,SAAU,OAAMA;AAAA,IAChE;AAAA,EACF;AACF;;;AFrCA,SAAS,cAAc,OAAiB,QAA4B;AAClE,MAAI,OAAO,SAAS,MAAM,UAAU,OAAO,MAAO,QAAO;AACzD,MAAI,OAAO,UAAU,MAAM,WAAW,OAAO,OAAQ,QAAO;AAC5D,MAAI,OAAO,YAAY,MAAM,aAAa,OAAO,SAAU,QAAO;AAClE,MAAI,OAAO,WAAW,MAAM,aAAa,OAAO,QAAS,QAAO;AAChE,MAAI,OAAO,WAAW,MAAM,YAAY,OAAO,QAAS,QAAO;AAC/D,MAAI,OAAO,aAAa,MAAM,cAAc,OAAO,UAAW,QAAO;AACrE,MAAI,OAAO,OAAO;AAChB,UAAM,QAAQ,KAAK,MAAM,OAAO,KAAK;AACrC,QAAI,OAAO,MAAM,KAAK,KAAK,KAAK,MAAM,MAAM,SAAS,IAAI,MAAO,QAAO;AAAA,EACzE;AACA,SAAO;AACT;AAEO,IAAM,WAAN,MAAe;AAAA,EACH;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,UAA2B,CAAC,GAAG;AACzC,UAAM,YAAY,QAAQ,aAAa,iBAAiB;AACxD,SAAK,UAAUC,MAAK,WAAW,MAAM;AACrC,SAAK,WAAWA,MAAK,KAAK,SAAS,cAAc;AACjD,SAAK,WAAW,QAAQ,YAAY,IAAI,OAAO;AAC/C,SAAK,WAAW,KAAK,IAAI,GAAG,QAAQ,YAAY,CAAC;AAAA,EACnD;AAAA,EAEA,IAAI,OAAe;AACjB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAAO,OAAuB;AAC5B,SAAK,UAAU;AACf,UAAM,OAAO,KAAK,UAAU,KAAK,IAAI;AACrC,iBAAa,GAAG,KAAK,QAAQ,SAAS,MAAM;AAC1C,UACE,WAAW,KAAK,QAAQ,KACrBC,UAAS,KAAK,QAAQ,EAAE,OAAO,KAC/BA,UAAS,KAAK,QAAQ,EAAE,OAAO,OAAO,WAAW,IAAI,IAAI,KAAK,UACjE;AACA,aAAK,OAAO;AAAA,MACd;AACA,qBAAe,KAAK,UAAU,MAAM;AAAA,QAClC,UAAU;AAAA,QACV,MAAM;AAAA,MACR,CAAC;AACD,gBAAU,KAAK,UAAU,GAAK;AAAA,IAChC,CAAC;AAAA,EACH;AAAA,EAEA,KAAK,SAAoB,CAAC,GAAe;AACvC,UAAM,UAAsB,CAAC;AAC7B,eAAW,QAAQ,KAAK,oBAAoB,GAAG;AAC7C,UAAI,CAAC,WAAW,IAAI,EAAG;AACvB,YAAM,QAAQ,aAAa,MAAM,OAAO,EAAE,MAAM,IAAI;AACpD,iBAAW,QAAQ,OAAO;AACxB,YAAI,CAAC,KAAK,KAAK,EAAG;AAClB,YAAI;AACF,gBAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,cAAI,MAAM,mBAAmB,KAAK,cAAc,OAAO,MAAM,EAAG,SAAQ,KAAK,KAAK;AAAA,QACpF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AACA,YAAQ,QAAQ;AAChB,WAAO,OAAO,SAAS,OAAO,QAAQ,IAAI,QAAQ,MAAM,GAAG,OAAO,KAAK,IAAI;AAAA,EAC7E;AAAA,EAEA,OAAO,QAKa;AAClB,UAAM,aAAa,QAAQ,OAAO,MAAM;AACxC,QAAI,WAAW,UAAU,KAAK,CAAC,OAAO,OAAO;AAC3C,YAAM,IAAI,MAAM,+BAA+B,UAAU,gCAAgC;AAAA,IAC3F;AACA,UAAM,SAAS,OAAO,UAAU;AAChC,UAAM,UAAU,KAAK,KAAK,OAAO,MAAM,EAAE,QAAQ;AACjD,UAAM,UAAU,WAAW,SACvB,KAAK,UAAU,SAAS,MAAM,CAAC,IAAI,OACnC,QAAQ,IAAI,CAAC,UAAU,KAAK,UAAU,KAAK,CAAC,EAAE,KAAK,IAAI,KAAK,QAAQ,SAAS,IAAI,OAAO;AAE5F,cAAU,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAClD,kBAAc,YAAY,SAAS;AAAA,MACjC,UAAU;AAAA,MACV,MAAM;AAAA,MACN,MAAM,OAAO,QAAQ,MAAM;AAAA,IAC7B,CAAC;AACD,cAAU,YAAY,GAAK;AAC3B,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,OAAO,QAAQ;AAAA,MACf,OAAOA,UAAS,UAAU,EAAE;AAAA,IAC9B;AAAA,EACF;AAAA,EAEQ,YAAkB;AACxB,QAAI,CAAC,WAAW,KAAK,OAAO,EAAG,WAAU,KAAK,SAAS,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AACvF,cAAU,KAAK,SAAS,GAAK;AAAA,EAC/B;AAAA,EAEQ,YAAY,OAAuB;AACzC,WAAO,GAAG,KAAK,QAAQ,IAAI,KAAK;AAAA,EAClC;AAAA,EAEQ,sBAAgC;AACtC,UAAM,QAAkB,CAAC;AACzB,aAAS,QAAQ,KAAK,WAAW,GAAG,SAAS,GAAG,QAAS,OAAM,KAAK,KAAK,YAAY,KAAK,CAAC;AAC3F,UAAM,KAAK,KAAK,QAAQ;AACxB,WAAO;AAAA,EACT;AAAA,EAEQ,SAAe;AACrB,UAAM,SAAS,KAAK,YAAY,KAAK,WAAW,CAAC;AACjD,QAAI,KAAK,WAAW,KAAK,WAAW,MAAM,EAAG,CAAAC,YAAW,MAAM;AAC9D,aAAS,QAAQ,KAAK,WAAW,GAAG,SAAS,GAAG,SAAS;AACvD,YAAM,OAAO,KAAK,YAAY,KAAK;AACnC,UAAI,WAAW,IAAI,EAAG,YAAW,MAAM,KAAK,YAAY,QAAQ,CAAC,CAAC;AAAA,IACpE;AACA,QAAI,KAAK,WAAW,KAAK,WAAW,KAAK,QAAQ,EAAG,YAAW,KAAK,UAAU,KAAK,YAAY,CAAC,CAAC;AAAA,aACxF,WAAW,KAAK,QAAQ,EAAG,CAAAA,YAAW,KAAK,QAAQ;AAAA,EAC9D;AACF;;;AGrJA,IAAM,gBAAgB;AACtB,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AACtB,IAAM,eAAe;AAEd,SAAS,aAAa,OAAuB;AAClD,SAAO,MACJ,QAAQ,iBAAiB,cAAc,EACvC,QAAQ,eAAe,YAAY,EACnC,QAAQ,cAAc,mBAAmB;AAC9C;AAEA,SAAS,eAAe,OAAgB,MAAuB,OAAwB;AACrF,MAAI,QAAQ,GAAI,QAAO;AACvB,MAAI,OAAO,UAAU,SAAU,QAAO,aAAa,KAAK;AACxD,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,MAAI,KAAK,IAAI,KAAK,EAAG,QAAO;AAC5B,OAAK,IAAI,KAAK;AAEd,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,SAAS,eAAe,MAAM,MAAM,QAAQ,CAAC,CAAC;AAAA,EAClE;AAEA,QAAM,SAAkC,CAAC;AACzC,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAgC,GAAG;AAC1E,WAAO,GAAG,IAAI,cAAc,KAAK,GAAG,IAChC,eACA,eAAe,MAAM,MAAM,QAAQ,CAAC;AAAA,EAC1C;AACA,SAAO;AACT;AAEO,SAAS,YAAY,OAAyB;AACnD,SAAO,eAAe,OAAO,oBAAI,QAAgB,GAAG,CAAC;AACvD;;;AClCA,SAAS,yBAAyB;AASlC,IAAM,sBAAsB,IAAI,kBAAmD;AAE5E,SAAS,kBAAkBC,UAAoC;AACpE,sBAAoB,UAAUA,QAAO;AACvC;AAEO,SAAS,sBAAuD;AACrE,SAAO,oBAAoB,SAAS;AACtC;AAEO,SAAS,oBAA0B;AACxC,sBAAoB,UAAU,MAAS;AACzC;;;ALfO,SAAS,gBAAwB;AACtC,SAAO,SAAS,YAAY,CAAC,EAAE,SAAS,KAAK;AAC/C;AAEO,IAAM,SAAN,MAAoC;AAAA,EACzC,YAA6B,QAAQ,IAAI,SAAS,GAAG;AAAxB;AAAA,EAAyB;AAAA,EAAzB;AAAA,EAE7B,OAAO,OAAuC;AAC5C,QAAI;AACF,YAAM,QAAkB;AAAA,QACtB,gBAAgB;AAAA,QAChB,IAAI,cAAc;AAAA,QAClB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,OAAO,MAAM;AAAA,QACb,UAAU,MAAM,YAAY;AAAA,QAC5B,QAAQ,MAAM;AAAA,QACd,OAAO,MAAM;AAAA,QACb,GAAK,MAAM,YAAY,oBAAoB,GAAG,UAC1C,EAAE,UAAU,MAAM,YAAY,oBAAoB,EAAG,QAAQ,IAC7D,CAAC;AAAA,QACL,GAAK,MAAM,WAAW,oBAAoB,GAAG,UACzC,EAAE,SAAS,MAAM,WAAW,oBAAoB,EAAG,QAAQ,IAC3D,CAAC;AAAA,QACL,GAAI,MAAM,UAAU,EAAE,SAAS,aAAa,MAAM,OAAO,EAAE,IAAI,CAAC;AAAA,QAChE,GAAI,MAAM,aAAa,EAAE,YAAY,MAAM,WAAW,IAAI,CAAC;AAAA,QAC3D,GAAI,MAAM,YAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,QACxD,GAAI,MAAM,OAAO,EAAE,MAAM,YAAY,MAAM,IAAI,EAAsB,IAAI,CAAC;AAAA,QAC1E,GAAI,MAAM,QAAQ,EAAE,OAAO,YAAY,MAAM,KAAK,EAAuB,IAAI,CAAC;AAAA,QAC9E,GAAI,MAAM,WAAW,EAAE,UAAU,YAAY,MAAM,QAAQ,EAA6B,IAAI,CAAC;AAAA,MAC/F;AACA,WAAK,MAAM,OAAO,KAAK;AACvB,aAAO;AAAA,IACT,QAAQ;AAEN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,IAAM,kBAAN,MAA6C;AAAA,EAC3C,SAAoB;AAClB,WAAO;AAAA,EACT;AACF;AAEO,SAAS,sBAAmC;AACjD,SAAO,QAAQ,IAAI,qBAAqB,MAAM,MAC1C,IAAI,gBAAgB,IACpB,IAAI,OAAO;AACjB;;;ADlDO,SAAS,kBAA0B;AACxC,SAAO,WAAWC,aAAY,CAAC,EAAE,SAAS,KAAK;AACjD;AAEO,SAAS,kBAAkB,SAAyB;AACzD,QAAM,UAAU,gBAAgB;AAChC,oBAAkB,EAAE,SAAS,SAAS,WAAW,KAAK,IAAI,EAAE,CAAC;AAC7D,sBAAoB,EAAE,OAAO;AAAA,IAC3B,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UAAU;AAAA,IACV,WAAW;AAAA,IACX,UAAU,EAAE,QAAQ;AAAA,EACtB,CAAC;AACD,SAAO;AACT;AAEO,SAAS,eACd,QACA,MACA,UACA,QAAkB,QACZ;AACN,QAAMC,WAAU,oBAAoB;AACpC,MAAI,CAACA,SAAS;AACd,sBAAoB,EAAE,OAAO;AAAA,IAC3B;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,OAAO;AAAA,IACP,UAAUA,SAAQ;AAAA,IAClB,WAAWA,SAAQ;AAAA,IACnB,SAAS;AAAA,IACT,UAAU,EAAE,MAAM,GAAG,SAAS;AAAA,EAChC,CAAC;AACH;AAEO,SAAS,qBAAqB,MAA0B,SAAuB;AACpF,QAAMA,WAAU,oBAAoB;AACpC,MAAI,CAACA,SAAS;AACd,EAAAA,SAAQ,UAAU,EAAE,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC,GAAI,QAAQ;AACvD,sBAAoB,EAAE,OAAO;AAAA,IAC3B,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UAAUA,SAAQ;AAAA,IAClB,WAAWA,SAAQ;AAAA,IACnB,OAAO,EAAE,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC,GAAI,QAAQ;AAAA,EAC9C,CAAC;AACH;AAEO,SAAS,qBAAqB,WAAW,GAAS;AACvD,QAAMA,WAAU,oBAAoB;AACpC,MAAI,CAACA,SAAS;AACd,QAAM,SAASA,SAAQ,YAAY,UAAa,aAAa;AAC7D,sBAAoB,EAAE,OAAO;AAAA,IAC3B,OAAO,SAAS,UAAU;AAAA,IAC1B,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,OAAO,SAAS,mBAAmB;AAAA,IACnC,UAAUA,SAAQ;AAAA,IAClB,WAAWA,SAAQ;AAAA,IACnB,GAAIA,SAAQ,UAAU,EAAE,OAAOA,SAAQ,QAAQ,IAAI,CAAC;AAAA,IACpD,UAAU;AAAA,MACR,SAASA,SAAQ;AAAA,MACjB,WAAW;AAAA,MACX,aAAa,KAAK,IAAI,IAAIA,SAAQ;AAAA,IACpC;AAAA,EACF,CAAC;AACD,oBAAkB;AACpB;;;AFtDA,SAAS,gBAA2B;AAClC,SAAO;AAAA,IACL,SAAS,kBAAkB;AAAA,EAC7B;AACF;AASO,IAAM,kBAAN,MAAsB;AAAA,EACV;AAAA,EACA;AAAA,EAEjB,YAAY,WAAoB;AAC9B,SAAK,UAAU,aAAa,iBAAiB;AAC7C,SAAK,aAAaC,MAAK,KAAK,SAAS,aAAa;AAAA,EACpD;AAAA,EAEA,gBAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,OAAkB;AAChB,QAAI,CAACC,YAAW,KAAK,UAAU,GAAG;AAChC,qBAAe,gBAAgB,oBAAoB,EAAE,QAAQ,UAAU,CAAC;AACxE,aAAO,cAAc;AAAA,IACvB;AACA,QAAI;AACF,YAAM,MAAMC,cAAa,KAAK,YAAY,OAAO;AACjD,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,YAAM,SAAoB;AAAA,QACxB,SAAS,OAAO,OAAO,SAAS,MAAM,WAAW,OAAO,SAAS,IAAI,kBAAkB;AAAA,QACvF,GAAI,OAAO,OAAO,QAAQ,MAAM,YAAY,OAAO,QAAQ,EAAE,KAAK,IAC9D,EAAE,QAAQ,OAAO,QAAQ,EAAE,KAAK,EAAE,IAClC,CAAC;AAAA,QACL,GAAI,OAAO,OAAO,oBAAoB,MAAM,WACxC,EAAE,oBAAoB,OAAO,oBAAoB,EAAE,IACnD,CAAC;AAAA,MACP;AACA,qBAAe,gBAAgB,eAAe;AAC9C,aAAO;AAAA,IACT,QAAQ;AACN,qBAAe,gBAAgB,oBAAoB,EAAE,QAAQ,UAAU,GAAG,MAAM;AAChF,aAAO,cAAc;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAA0B;AACxB,UAAM,OAAO,KAAK,KAAK;AACvB,mBAAe,gBAAgB,mBAAmB;AAAA,MAChD,iBAAiB,QAAQ,IAAI,iBAAiB,IAAI,QAAQ;AAAA,MAC1D,gBAAgB,QAAQ,IAAI,gBAAgB,IAAI,QAAQ,KAAK,SAAS,SAAS;AAAA,MAC/E,kBAAkB,QAAQ,IAAI,qBAAqB,IAAI,QAAQ;AAAA,IACjE,CAAC;AACD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS,QAAQ,IAAI,iBAAiB,KAAK,KAAK;AAAA,MAChD,QAAQ,QAAQ,IAAI,gBAAgB,GAAG,KAAK,KAAK,KAAK;AAAA,MACtD,oBAAoB,QAAQ,IAAI,qBAAqB,KAAK,KAAK;AAAA,IACjE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,QAAyB;AAC5B,SAAK,WAAW;AAChB,iBAAa,GAAG,KAAK,UAAU,SAAS,MAAM,KAAK,OAAO,MAAM,CAAC;AACjE,mBAAe,gBAAgB,cAAc;AAAA,EAC/C;AAAA,EAEQ,OAAO,QAAyB;AACtC,IAAAC,eAAc,KAAK,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,MAAM;AAAA,MACrE,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAED,IAAAC,WAAU,KAAK,YAAY,GAAK;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAmC;AACxC,SAAK,WAAW;AAChB,iBAAa,GAAG,KAAK,UAAU,SAAS,MAAM;AAC5C,YAAM,UAAU,KAAK,KAAK;AAC1B,WAAK,OAAO,EAAE,GAAG,SAAS,GAAG,QAAQ,CAAC;AAAA,IACxC,CAAC;AACD,mBAAe,gBAAgB,kBAAkB,EAAE,QAAQ,OAAO,KAAK,OAAO,EAAE,CAAC;AAAA,EACnF;AAAA;AAAA,EAGQ,aAAmB;AACzB,QAAI,CAACH,YAAW,KAAK,OAAO,GAAG;AAC7B,MAAAI,WAAU,KAAK,SAAS,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAAA,IAC1D;AACA,IAAAD,WAAU,KAAK,SAAS,GAAK;AAAA,EAC/B;AACF;;;AS/HO,IAAM,YAAY;AAAA;AAAA,EAEvB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,uBAAuB;AAAA,EACvB,0BAA0B;AAAA,EAC1B,iBAAiB;AAAA,EACjB,qBAAqB;AAAA;AAAA,EAGrB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA;AAAA,EAGrB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,4BAA4B;AAAA;AAAA,EAG5B,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA;AAAA,EAGtB,kBAAkB;AAAA;AAAA,EAGlB,gBAAgB;AAAA,EAChB,cAAc;AAAA;AAAA,EAGd,gBAAgB;AAAA;AAAA,EAGhB,mBAAmB;AAAA,EACnB,wBAAwB;AAAA,EACxB,yBAAyB;AAAA;AAAA,EAGzB,cAAc;AAAA,EACd,eAAe;AAAA;AAAA,EAGf,sBAAsB;AAAA,EACtB,4BAA4B;AAAA,EAC5B,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,cAAc;AAChB;AAOO,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC,YACkB,MAChB,SACgB,SAChB;AACA,UAAM,OAAO;AAJG;AAEA;AAGhB,SAAK,OAAO;AAAA,EACd;AAAA,EANkB;AAAA,EAEA;AAKpB;AAGO,SAAS,sBACd,aACA,gBACS;AACT,QAAM,SAAS,GAAG,eAAe,EAAE,IAAI,kBAAkB,EAAE,GAAG,YAAY;AAC1E,SAAO,kKAAkK,KAAK,MAAM;AACtL;AAEO,SAAS,mBACd,aACA,gBACA,UAAmC,CAAC,GAC1B;AACV,QAAM,SAAS,GAAG,eAAe,EAAE,IAAI,kBAAkB,EAAE,GAAG,YAAY;AAC1E,QAAM,kBAAkB,yEAAyE,KAAK,MAAM;AAC5G,QAAM,UAAU,kBACZ,gIACA;AACJ,SAAO,IAAI;AAAA,IACT,kBAAkB,UAAU,0BAA0B,UAAU;AAAA,IAChE;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,GAAI,cAAc,EAAE,cAAc,YAAY,IAAI,CAAC;AAAA,MACnD,GAAI,kBAAkB,mBAAmB,UAAU,EAAE,iBAAiB,eAAe,IAAI,CAAC;AAAA,MAC1F,UAAU;AAAA,MACV,iBAAiB,kBAAkB,oBAAoB;AAAA,MACvD,WAAW;AAAA,MACX,MAAM,kBACF,yEACA;AAAA,IACN;AAAA,EACF;AACF;;;AC5GA,SAAS,eAAAE,oBAAmB;AAY5B,SAAS,UAAUC,QAA8B;AAC/C,MAAIA,kBAAiB,OAAO;AAC1B,UAAM,OAAO,UAAUA,UAAS,OAAOA,OAAM,SAAS,WAAWA,OAAM,OAAO;AAC9E,WAAO,EAAE,MAAMA,OAAM,MAAM,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC,GAAI,SAASA,OAAM,QAAQ;AAAA,EAC/E;AACA,SAAO,EAAE,SAAS,OAAOA,MAAK,EAAE;AAClC;AAEO,IAAM,cAAN,MAAkB;AAAA,EAKvB,YACmB,QACAC,UACjB;AAFiB;AACA,mBAAAA;AAEjB,SAAK,OAAO,OAAO;AAAA,MACjB,OAAO;AAAA,MACP,UAAU;AAAA,MACV,QAAQA,SAAQ;AAAA,MAChB,OAAO;AAAA,MACP,YAAY,KAAK;AAAA,MACjB,WAAWA,SAAQ;AAAA,MACnB,MAAM,EAAE,QAAQA,SAAQ,QAAQ,MAAMA,SAAQ,KAAK;AAAA,MACnD,UAAUA,SAAQ;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAbmB;AAAA,EACA;AAAA,EANV,YAAY,SAASC,aAAY,CAAC,EAAE,SAAS,KAAK;AAAA,EAC1C,YAAY,KAAK,IAAI;AAAA,EAC9B,YAAY;AAAA,EAkBpB,QAAQ,QAAgB,UAA0C;AAChE,QAAI,KAAK,UAAW;AACpB,SAAK,YAAY;AACjB,SAAK,OAAO,OAAO;AAAA,MACjB,OAAO;AAAA,MACP,UAAU;AAAA,MACV,QAAQ,KAAK,QAAQ;AAAA,MACrB,OAAO;AAAA,MACP,YAAY,KAAK;AAAA,MACjB,WAAW,KAAK,QAAQ;AAAA,MACxB,MAAM;AAAA,QACJ,QAAQ,KAAK,QAAQ;AAAA,QACrB,MAAM,KAAK,QAAQ;AAAA,QACnB;AAAA,QACA,aAAa,KAAK,IAAI,IAAI,KAAK;AAAA,MACjC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,QAAQF,QAAgB,QAAuB;AAC7C,QAAI,KAAK,UAAW;AACpB,SAAK,YAAY;AACjB,SAAK,OAAO,OAAO;AAAA,MACjB,OAAO;AAAA,MACP,UAAU;AAAA,MACV,QAAQ,KAAK,QAAQ;AAAA,MACrB,OAAO;AAAA,MACP,YAAY,KAAK;AAAA,MACjB,WAAW,KAAK,QAAQ;AAAA,MACxB,MAAM;AAAA,QACJ,QAAQ,KAAK,QAAQ;AAAA,QACrB,MAAM,KAAK,QAAQ;AAAA,QACnB,GAAI,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC;AAAA,QACzC,aAAa,KAAK,IAAI,IAAI,KAAK;AAAA,MACjC;AAAA,MACA,OAAO,UAAUA,MAAK;AAAA,IACxB,CAAC;AAAA,EACH;AACF;AAEO,SAAS,aACdC,UACA,SAAsB,oBAAoB,GAC7B;AACb,SAAO,IAAI,YAAY,QAAQA,QAAO;AACxC;;;ACpDA,SAAS,SAAS,OAAqD;AACrE,SAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IACtE,QACA;AACN;AAEA,SAAS,oBAAoB,OAAqD;AAChF,QAAM,SAAS,SAAS,KAAK;AAC7B,MAAI,OAAQ,QAAO;AACnB,MAAI,OAAO,UAAU,SAAU,QAAO;AAEtC,QAAM,OAAO,MAAM,KAAK;AACxB,MAAI;AACF,WAAO,SAAS,KAAK,MAAM,IAAI,CAAC;AAAA,EAClC,QAAQ;AAAA,EAGR;AAEA,MAAI,QAAQ,KAAK,YAAY,GAAG;AAChC,SAAO,SAAS,GAAG;AACjB,QAAI;AACF,YAAM,SAAS,SAAS,KAAK,MAAM,KAAK,MAAM,KAAK,CAAC,CAAC;AACrD,UAAI,OAAQ,QAAO;AAAA,IACrB,QAAQ;AAAA,IAER;AACA,YAAQ,KAAK,YAAY,KAAK,QAAQ,CAAC;AAAA,EACzC;AACA,SAAO;AACT;AAEA,eAAe,cAAc,UAA0C;AACrE,QAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACjD,MAAI,CAAC,KAAK,KAAK,EAAG,QAAO,CAAC;AAC1B,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,WAAQ,SAAS,MAAM,KAAiC,CAAC;AAAA,EAC3D,QAAQ;AACN,UAAM,IAAI,SAAS,UAAU,cAAc,4CAA4C,EAAE,QAAQ,SAAS,OAAO,CAAC;AAAA,EACpH;AACF;AAEA,SAAS,kBAAkB,QAAgB,UAAiC;AAC1E,QAAM,cAAc,SAAS,OAAO;AACpC,QAAM,UAAU,SAAS,OAAO,WAAW,mCAAmC,MAAM;AACpF,QAAM,UAAU,EAAE,QAAQ,GAAI,cAAc,EAAE,MAAM,YAAY,IAAI,CAAC,EAAG;AACxE,MAAI,WAAW,IAAK,QAAO,IAAI,SAAS,UAAU,iBAAiB,SAAS,OAAO;AACnF,MAAI,WAAW,IAAK,QAAO,IAAI,SAAS,UAAU,qBAAqB,SAAS,OAAO;AACvF,MAAI,WAAW,OAAO,WAAW,IAAK,QAAO,IAAI,SAAS,UAAU,kBAAkB,SAAS,OAAO;AACtG,MAAI,WAAW,IAAK,QAAO,IAAI,SAAS,UAAU,gBAAgB,SAAS,OAAO;AAClF,SAAO,IAAI,SAAS,UAAU,cAAc,SAAS,OAAO;AAC9D;AAEA,SAAS,kBAAkB,UAA8C;AACvE,MAAI,SAAS,OAAO,MAAO,OAAM,kBAAkB,KAAK,QAAQ;AAChE,QAAM,OAAO,oBAAoB,SAAS,IAAI;AAC9C,QAAM,cAAc,MAAM;AAC1B,QAAM,OAAO,MAAM;AACnB,MAAI,OAAO,gBAAgB,YAAY,CAAC,YAAY,KAAK,GAAG;AAC1D,UAAM,IAAI,SAAS,UAAU,cAAc,qDAAqD;AAAA,EAClG;AACA,MAAI,OAAO,SAAS,YAAY,CAAC,KAAK,KAAK,GAAG;AAC5C,UAAM,IAAI,SAAS,UAAU,cAAc,8CAA8C;AAAA,EAC3F;AACA,SAAO,EAAE,aAAa,KAAK;AAC7B;AAEO,IAAM,sBAAN,MAA0B;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAAqC;AAC/C,SAAK,UAAU,QAAQ,QAAQ,QAAQ,QAAQ,EAAE;AACjD,SAAK,SAAS,QAAQ;AACtB,SAAK,SAAS,QAAQ,SAAS,WAAW;AAC1C,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EAEA,MAAM,gBAAgB,SAAiE;AACrF,UAAM,SAAS,aAAa;AAAA,MAC1B,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU,EAAE,UAAU,QAAQ,YAAY,MAAM,UAAU,QAAQ,SAAS,OAAU;AAAA,IACvF,GAAG,KAAK,MAAM;AAEd,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,KAAK,OAAO,GAAG,KAAK,OAAO,wBAAwB;AAAA,QAClE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,eAAe,UAAU,KAAK,MAAM;AAAA,UACpC,gBAAgB;AAAA,UAChB,QAAQ;AAAA,QACV;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,GAAI,QAAQ,SAAS,SAAY,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;AAAA,UAC3D,GAAI,QAAQ,aAAa,SAAY,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;AAAA,QACzE,CAAC;AAAA,MACH,CAAC;AAAA,IACH,SAASE,QAAO;AACd,YAAM,eAAe,IAAI;AAAA,QACvB,UAAU;AAAA,QACV,kBAAkBA,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK,CAAC;AAAA,MAC1E;AACA,aAAO,QAAQ,YAAY;AAC3B,YAAM;AAAA,IACR;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,cAAc,QAAQ;AAC7C,UAAI,CAAC,SAAS,GAAI,OAAM,kBAAkB,SAAS,QAAQ,QAAQ;AACnE,YAAM,SAAS,kBAAkB,QAAQ;AACzC,aAAO,QAAQ,SAAS,QAAQ,EAAE,cAAc,OAAO,YAAY,CAAC;AACpE,aAAO;AAAA,IACT,SAASA,QAAO;AACd,aAAO,QAAQA,QAAO,SAAS,MAAM;AACrC,YAAMA;AAAA,IACR;AAAA,EACF;AACF;;;ACzJO,SAAS,eAAe,SAA+B;AAC5D,MAAI,OAAO;AACX,SAAO,KAAK,OAAQ,QAAO,KAAK;AAChC,SAAO,KAAK,KAAK;AACnB;AAEO,SAAS,aAAa,SAA2B;AACtD,SAAO,eAAe,OAAO,EAAE,SAAS;AAC1C;AAEO,SAAS,kBACd,aACA,aACqC;AACrC,QAAM,SAAS,YAAY,aAAa;AACxC,QAAM,SAAS,OAAO,QAAQ,KAAK;AACnC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR,UAAU;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,YAAY;AAClC,QAAM,UAAU,OAAO,kBAAkB,YAAY,gBACjD,gBACA,OAAO;AACX,SAAO,EAAE,QAAQ,QAAQ;AAC3B;;;ACdA,IAAM,gBAA4E;AAAA,EAChF,MAAM,EAAE,QAAQ,uBAAuB,QAAQ,sBAAsB;AAAA,EACrE,WAAW,EAAE,QAAQ,4BAA4B,QAAQ,2BAA2B;AAAA,EACpF,YAAY,EAAE,QAAQ,6BAA6B,QAAQ,4BAA4B;AAAA,EACvF,QAAQ,EAAE,QAAQ,yBAAyB,QAAQ,wBAAwB;AAAA,EAC3E,MAAM,EAAE,QAAQ,uBAAuB,QAAQ,sBAAsB;AAAA,EACrE,QAAQ,EAAE,QAAQ,yBAAyB,QAAQ,wBAAwB;AAAA,EAC3E,SAAS,EAAE,QAAQ,0BAA0B,QAAQ,yBAAyB;AAAA,EAC9E,SAAS,EAAE,QAAQ,0BAA0B,QAAQ,yBAAyB;AAAA,EAC9E,MAAM,EAAE,QAAQ,uBAAuB,QAAQ,sBAAsB;AAAA,EACrE,QAAQ,EAAE,QAAQ,yBAAyB,QAAQ,wBAAwB;AAAA,EAC3E,KAAK,EAAE,QAAQ,sBAAsB,QAAQ,qBAAqB;AACpE;AAEA,SAAS,WAAW,QAAwB,QAA2C;AACrF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa,cAAc,MAAM,EAAE;AAAA,IACnC,aAAa,cAAc,MAAM,EAAE;AAAA,EACrC;AACF;AAGO,IAAM,4BAA4B;AAAA,EACvC,cAAc,WAAW,QAAQ,OAAO;AAAA,EACxC,oBAAoB,WAAW,aAAa,QAAQ;AAAA,EACpD,iBAAiB,WAAW,aAAa,KAAK;AAAA,EAC9C,qBAAqB,WAAW,aAAa,SAAS;AAAA,EACtD,cAAc,WAAW,cAAc,YAAY;AAAA,EACnD,cAAc,WAAW,cAAc,YAAY;AAAA,EACnD,cAAc,WAAW,cAAc,YAAY;AAAA,EACnD,eAAe,WAAW,cAAc,aAAa;AAAA,EACrD,kBAAkB,WAAW,cAAc,gBAAgB;AAAA,EAC3D,kBAAkB,WAAW,cAAc,gBAAgB;AAAA,EAC3D,oBAAoB,WAAW,cAAc,kBAAkB;AAAA,EAC/D,cAAc,WAAW,cAAc,YAAY;AAAA,EACnD,eAAe,WAAW,UAAU,MAAM;AAAA,EAC1C,aAAa,WAAW,QAAQ,MAAM;AAAA,EACtC,eAAe,WAAW,QAAQ,QAAQ;AAAA,EAC1C,aAAa,WAAW,QAAQ,MAAM;AAAA,EACtC,cAAc,WAAW,UAAU,KAAK;AAAA,EACxC,eAAe,WAAW,UAAU,MAAM;AAAA,EAC1C,wBAAwB,WAAW,WAAW,cAAc;AAAA,EAC5D,kBAAkB,WAAW,WAAW,QAAQ;AAAA,EAChD,kBAAkB,WAAW,WAAW,QAAQ;AAAA,EAChD,kBAAkB,WAAW,WAAW,QAAQ;AAAA,EAChD,aAAa,WAAW,QAAQ,MAAM;AAAA,EACtC,eAAe,WAAW,QAAQ,QAAQ;AAAA,EAC1C,aAAa,WAAW,QAAQ,MAAM;AAAA,EACtC,kBAAkB,WAAW,UAAU,SAAS;AAAA,EAChD,eAAe,WAAW,UAAU,MAAM;AAAA,EAC1C,gBAAgB,WAAW,UAAU,OAAO;AAAA,EAC5C,QAAQ,WAAW,OAAO,QAAQ;AAAA,EAClC,SAAS,WAAW,OAAO,SAAS;AAAA,EACpC,UAAU,WAAW,OAAO,UAAU;AACxC;AAIO,SAAS,6BAA6B,SAAwD;AACnG,SAAQ,0BAAwE,OAAO;AACzF;;;AClFA,SAAS,eAAAC,oBAAmB;;;ACGrB,IAAM,cAAc,OACvB,UACA,QAAQ,IAAI,oBAAoB,KAAK;AAElC,IAAM,uBAAuB,OAChC,gBACA,QAAQ,IAAI,yBAAyB,KAAK;;;ACT9C,SAAS,qBAAAC,0BAAyB;AAGlC,IAAM,0BAA0B,IAAIA,mBAAuD;AAEpF,SAAS,sBAAsBC,UAAwC;AAC5E,0BAAwB,UAAUA,QAAO;AAC3C;AAEO,SAAS,0BAA+D;AAC7E,SAAO,wBAAwB,SAAS;AAC1C;AAEO,SAAS,wBAA8B;AAC5C,0BAAwB,UAAU,MAAS;AAC7C;;;ACZA,IAAM,sBAAsB;AAC5B,IAAM,oBAAoB;AAEnB,SAAS,wBAAwB,QAAyD;AAC/F,QAAM,YAA4C,CAAC;AACnD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,UAAU,UAAa,oBAAoB,KAAK,GAAG,EAAG;AAC1D,cAAU,GAAG,IAAI,OAAO,UAAU,WAC9B,aAAa,KAAK,EAAE,MAAM,GAAG,iBAAiB,IAC9C;AAAA,EACN;AACA,SAAO;AACT;;;ACfA,SAAS,sBAAsB;AAC/B,SAAS,kBAAuC;AAKhD,IAAM,iBAAiB;AACvB,IAAM,yBAAyB;AAC/B,IAAM,2BAA2B;AAwB1B,IAAM,yBAAN,MAA2D;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAA8B,CAAC;AAAA,EACxC,gBAAgB;AAAA,EAExB,YAAY,UAAyC,CAAC,GAAG;AACvD,SAAK,WAAW,QAAQ,YAAY,QAAQ,IAAI,2BAA2B,MAAM;AACjF,SAAK,SAAS,QAAQ,UAAU,oBAAoB;AACpD,QAAI,KAAK,SAAU;AAEnB,QAAI;AACF,YAAM,MAAM,QAAQ,OAAO,IAAI,eAAe;AAAA,QAC5C,QAAQ,QAAQ,SAAS;AAAA,QACzB,UAAU;AAAA,MACZ,CAAC;AACD,YAAM,aAAa,QAAQ,kBAAkB,WAAW;AAAA,QACtD,gBAAgB,QAAQ,iBAAiB;AAAA,QACzC,OAAO;AAAA,QACP,SAAS,EAAE,SAAS,yBAAyB;AAAA,MAC/C,CAAC;AAED,UAAI,IAAI,UAAU;AAClB,iBAAW,GAAG,OAAO,CAAC,YAA6B;AACjD,aAAK,gBAAgB,KAAK,IAAI,GAAG,KAAK,gBAAgB,CAAC;AACvD,cAAM,YAAY,KAAK,kBAAkB,MAAM,KAAK;AACpD,cAAM,YAAY,QAAQ,eAAe;AACzC,aAAK,OAAO,OAAO;AAAA,UACjB,OAAO,YAAY,UAAU;AAAA,UAC7B,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,OAAO,YAAY,iCAAiC;AAAA,UACpD,UAAU,EAAE,YAAY,UAAU;AAAA,QACpC,CAAC;AAAA,MACH,CAAC;AAED,WAAK,MAAM;AACX,WAAK,iBAAiB;AAAA,IACxB,SAASC,QAAO;AACd,WAAK,cAAc,mCAAmCA,MAAK;AAAA,IAC7D;AAAA,EACF;AAAA,EAEA,KAAK,OAAsC;AACzC,QAAI,KAAK,YAAY,CAAC,KAAK,OAAO,CAAC,MAAM,OAAO,KAAK,EAAG;AAExD,QAAI;AACF,WAAK,iBAAiB;AACtB,WAAK,kBAAkB,KAAK,MAAM,KAAK;AACvC,WAAK,IAAI,QAAQ,MAAM,OAAO,EAAE,GAAG,MAAM,OAAO,GAAG;AAAA,QACjD,MAAM,EAAE,gBAAgB,MAAM,OAAO;AAAA,MACvC,CAAC;AAAA,IACH,SAASA,QAAO;AACd,WAAK,gBAAgB,KAAK,IAAI,GAAG,KAAK,gBAAgB,CAAC;AACvD,WAAK,kBAAkB,IAAI;AAC3B,WAAK,cAAc,6BAA6BA,QAAO,MAAM,KAAK;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,YAAY,0BAAyC;AAC/D,QAAI,CAAC,KAAK,kBAAkB,KAAK,kBAAkB,EAAG;AACtD,UAAM,aAAa,KAAK;AAExB,UAAM,IAAI,QAAc,CAACC,aAAY;AACnC,UAAI,UAAU;AACd,YAAM,SAAS,CAAC,aAA4B;AAC1C,YAAI,QAAS;AACb,kBAAU;AACV,qBAAa,KAAK;AAClB,mBAAW,eAAe,SAAS,OAAO;AAC1C,YAAI,YAAY,KAAK,gBAAgB,GAAG;AACtC,eAAK,OAAO,OAAO;AAAA,YACjB,OAAO;AAAA,YACP,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,UAAU,EAAE,eAAe,KAAK,cAAc;AAAA,UAChD,CAAC;AAAA,QACH;AACA,QAAAA,SAAQ;AAAA,MACV;AACA,YAAM,UAAU,MAAY,OAAO,KAAK;AACxC,YAAM,QAAQ,WAAW,MAAM,OAAO,IAAI,GAAG,KAAK,IAAI,GAAG,SAAS,CAAC;AACnE,iBAAW,KAAK,SAAS,OAAO;AAAA,IAClC,CAAC;AAAA,EACH;AAAA,EAEQ,cAAc,OAAeD,QAAgB,WAA0B;AAC7E,UAAM,OAAOA,UAAS,OAAOA,WAAU,YAAY,UAAUA,UAAS,OAAOA,OAAM,SAAS,WACxFA,OAAM,OACN;AACJ,SAAK,OAAO,OAAO;AAAA,MACjB,OAAO;AAAA,MACP,UAAU;AAAA,MACV,QAAQ;AAAA,MACR;AAAA,MACA,GAAI,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,wBAAwB,EAAE,IAAI,CAAC;AAAA,MACpE,GAAI,YAAY,EAAE,UAAU,EAAE,YAAY,UAAU,EAAE,IAAI,CAAC;AAAA,IAC7D,CAAC;AAAA,EACH;AACF;;;AJpGA,SAAS,sBAAmD;AAC1D,QAAM,cAAc,oBAAoB;AACxC,QAAM,YAAY,OAAO,SAAS,QAAQ,SAAS,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,KAAK,EAAE;AAChF,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,SAAS,gBAAgB,UAAU,QAAQ,gBAAgB,eAAe,SAAS;AAAA,IACnF,UAAU;AAAA,IACV,aAAa;AAAA,IACb,IAAI,QAAQ;AAAA,IACZ,MAAM,QAAQ;AAAA,IACd,YAAY,OAAO,SAAS,SAAS,IAAI,YAAY;AAAA,EACvD;AACF;AAEA,SAAS,qBAA6B;AACpC,SAAO,MAAME,aAAY,CAAC,EAAE,SAAS,KAAK,CAAC;AAC7C;AAEA,SAAS,UAAUC,UAAkC,UAAmC;AACtF,MAAIA,SAAQ,mBAAmB,qBAAqB,aAAa,KAAK,CAACA,SAAQ,aAAa;AAC1F,WAAO;AAAA,EACT;AACA,MAAIA,SAAQ,aAAa,SAAS,SAAS,EAAG,QAAO;AACrD,SAAO,aAAa,KAAKA,SAAQ,cAAc,YAAY;AAC7D;AAEO,IAAM,mBAAN,MAAuB;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,UAAmC,CAAC,GAAG;AACjD,SAAK,YAAY,QAAQ,aAAa,IAAI,uBAAuB;AACjE,SAAK,MAAM,QAAQ,OAAO,KAAK;AAC/B,SAAK,cAAc,QAAQ,eAAe;AAC1C,SAAK,eAAe,QAAQ,gBAAgB;AAAA,EAC9C;AAAA,EAEA,aAAa,OAAyC;AACpD,UAAM,UAAU,MAAM,QAAQ,KAAK;AACnC,QAAI,CAAC,QAAS;AACd,UAAMC,cAAa,6BAA6B,OAAO;AACvD,UAAMD,WAAmC;AAAA,MACvC;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,MACpB,aAAa,KAAK,YAAY;AAAA,MAC9B,YAAY;AAAA,MACZ,gBAAgB,CAAC;AAAA,MACjB,GAAIC,cAAa;AAAA,QACf,aAAaA,YAAW;AAAA,QACxB,aAAaA,YAAW;AAAA,QACxB,QAAQA,YAAW;AAAA,MACrB,IAAI,CAAC;AAAA,MACL,GAAI,MAAM,QAAQ,KAAK,IAAI,EAAE,QAAQ,MAAM,OAAO,KAAK,EAAE,IAAI,CAAC;AAAA,MAC9D,GAAI,MAAM,aAAa,KAAK,IAAI,EAAE,aAAa,MAAM,YAAY,KAAK,EAAE,IAAI,CAAC;AAAA,MAC7E,GAAI,MAAM,SAAS,KAAK,IAAI,EAAE,SAAS,MAAM,QAAQ,KAAK,EAAE,IAAI,CAAC;AAAA,IACnE;AACA,0BAAsBD,QAAO;AAC7B,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,SAAS,QAAsB;AAC7B,UAAMA,WAAU,wBAAwB;AACxC,UAAM,mBAAmB,OAAO,KAAK;AACrC,QAAI,CAACA,YAAW,CAAC,iBAAkB;AACnC,IAAAA,SAAQ,SAAS;AACjB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,gBAAgB,QAA+B;AAC7C,UAAMA,WAAU,wBAAwB;AACxC,QAAI,CAACA,SAAS;AACd,WAAO,OAAOA,SAAQ,gBAAgB,wBAAwB,MAAM,CAAC;AAAA,EACvE;AAAA,EAEA,qBAA2B;AACzB,UAAMA,WAAU,wBAAwB;AACxC,QAAIA,SAAS,CAAAA,SAAQ,iBAAiB;AAAA,EACxC;AAAA,EAEA,eAAe,aAA2B;AACxC,UAAMA,WAAU,wBAAwB;AACxC,UAAM,wBAAwB,YAAY,KAAK;AAC/C,QAAIA,YAAW,sBAAuB,CAAAA,SAAQ,cAAc;AAAA,EAC9D;AAAA,EAEA,qBAAqB,WAA0B;AAC7C,UAAMA,WAAU,wBAAwB;AACxC,QAAIA,YAAW,UAAW,CAAAA,SAAQ,cAAc;AAAA,EAClD;AAAA,EAEA,gBAAgB,WAAW,GAAS;AAClC,UAAMA,WAAU,wBAAwB;AACxC,QAAI,CAACA,SAAS;AACd,SAAK,WAAW;AAChB,UAAM,SAAS,UAAUA,UAAS,QAAQ;AAC1C,QAAIA,SAAQ,UAAUA,SAAQ,eAAeA,SAAQ,QAAQ;AAC3D,WAAK,KAAKA,SAAQ,aAAa;AAAA,QAC7B,GAAGA,SAAQ;AAAA,QACX,cAAcA,SAAQ;AAAA,QACtB,QAAQA,SAAQ;AAAA,QAChB;AAAA,QACA,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,IAAIA,SAAQ,SAAS;AAAA,QACvD,GAAIA,SAAQ,cAAc,EAAE,YAAYA,SAAQ,YAAY,IAAI,CAAC;AAAA,MACnE,CAAC;AAAA,IACH;AACA,0BAAsB;AAAA,EACxB;AAAA,EAEA,MAAM,MAAM,WAAmC;AAC7C,UAAM,KAAK,UAAU,MAAM,SAAS;AAAA,EACtC;AAAA,EAEQ,aAAmB;AACzB,UAAMA,WAAU,wBAAwB;AACxC,QAAI,CAACA,UAAS,UAAU,CAACA,SAAQ,eAAe,CAACA,SAAQ,UAAUA,SAAQ,WAAY;AACvF,IAAAA,SAAQ,aAAa;AACrB,SAAK,KAAKA,SAAQ,aAAa;AAAA,MAC7B,cAAcA,SAAQ;AAAA,MACtB,QAAQA,SAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEQ,KAAK,OAAe,QAA+B;AACzD,UAAMA,WAAU,wBAAwB;AACxC,QAAI,CAACA,UAAS,OAAQ;AACtB,UAAM,SAAgC;AAAA,MACpC,GAAG,KAAK,aAAa;AAAA,MACrB,SAASA,SAAQ;AAAA,MACjB,GAAIA,SAAQ,UAAU,EAAE,UAAUA,SAAQ,QAAQ,IAAI,CAAC;AAAA,MACvD,GAAIA,SAAQ,cAAc,EAAE,cAAcA,SAAQ,YAAY,IAAI,CAAC;AAAA,IACrE;AACA,SAAK,UAAU,KAAK;AAAA,MAClB,QAAQA,SAAQ;AAAA,MAChB;AAAA,MACA,QAAQ,wBAAwB,EAAE,GAAG,QAAQ,GAAG,OAAO,CAAC;AAAA,IAC1D,CAAC;AAAA,EACH;AACF;AAEA,IAAI;AAEG,SAAS,6BAA+C;AAC7D,qBAAmB,IAAI,iBAAiB;AACxC,SAAO;AACT;;;AKhLO,SAAS,4BAA4B,QAA+B;AACzE,6BAA2B,EAAE,gBAAgB,MAAM;AACrD;AAGO,SAAS,8BAAoC;AAClD,6BAA2B,EAAE,mBAAmB;AAClD;AAGO,SAAS,wBAAwB,aAA2B;AACjE,6BAA2B,EAAE,eAAe,WAAW;AACzD;;;AChBO,SAAS,oBAAoB,OAAuB;AACzD,MAAI,QAAQ,KAAK,OAAO,KAAM,QAAO;AACrC,MAAI,QAAQ,MAAM,OAAO,KAAM,QAAO;AACtC,MAAI,QAAQ,MAAM,OAAO,KAAM,QAAO;AACtC,SAAO;AACT;AAEO,SAAS,sBAAsB,KAAoD;AACxF,MAAI,IAAI,WAAW,eAAe,EAAG,QAAO;AAC5C,MAAI,IAAI,WAAW,eAAe,EAAG,QAAO;AAC5C,MAAI,IAAI,WAAW,eAAe,EAAG,QAAO;AAC5C,SAAO;AACT;;;ACJA,SAAS,aAAa;AA0Cf,SAAS,uBAAuB,QAA2B,UAA4B;AAC5F,QAAM,cAAc,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY;AAC9E,QAAM,QAAQ,OAAO,WAAW,CAAC,GAC9B,OAAO,CAAC,SAAiC,MAAM,SAAS,UAAU,OAAQ,KAAwB,SAAS,QAAQ,EACnH,IAAI,CAAC,SAAS,KAAK,KAAK,KAAK,CAAC,EAC9B,OAAO,OAAO,EACd,KAAK,IAAI;AACZ,QAAM,UAAU,QAAQ;AACxB,QAAM,oBAAoB,OAAO,qBAAqB,OAAO,OAAO,sBAAsB,WACtF,OAAO,oBACP;AACJ,QAAM,gBAAgB,oBAClB,GAAG,OAAO,IAAI,KAAK,UAAU,iBAAiB,CAAC,KAC/C;AACJ,QAAM,UAAU;AAAA,IACd,GAAI,cAAc,EAAE,cAAc,YAAY,IAAI,CAAC;AAAA,IACnD,GAAI,oBAAoB,EAAE,oBAAoB,kBAAkB,IAAI,CAAC;AAAA,EACvE;AACA,MAAI,gBAAgB,YAAY,SAAS,qBAAqB,KAAK,YAAY,SAAS,uBAAuB,IAAI;AACjH,WAAO,IAAI,SAAS,UAAU,gBAAgB,SAAS,EAAE,GAAG,SAAS,UAAU,SAAS,WAAW,MAAM,CAAC;AAAA,EAC5G;AACA,MAAI,sBAAsB,aAAa,aAAa,GAAG;AACrD,WAAO,mBAAmB,aAAa,eAAe,OAAO;AAAA,EAC/D;AACA,MAAI,aAAa,SAAS,aAAa,GAAG;AACxC,WAAO,IAAI,SAAS,UAAU,qBAAqB,SAAS,EAAE,GAAG,SAAS,UAAU,QAAQ,WAAW,MAAM,CAAC;AAAA,EAChH;AACA,MAAI,aAAa,SAAS,gBAAgB,GAAG;AAC3C,WAAO,IAAI,SAAS,UAAU,gBAAgB,SAAS,EAAE,GAAG,SAAS,UAAU,QAAQ,WAAW,MAAM,CAAC;AAAA,EAC3G;AACA,MAAI,aAAa,SAAS,SAAS,GAAG;AACpC,WAAO,IAAI,SAAS,UAAU,oBAAoB,SAAS,EAAE,GAAG,SAAS,UAAU,WAAW,WAAW,KAAK,CAAC;AAAA,EACjH;AACA,MAAI,gBAAgB,YAAY,SAAS,gBAAgB,KAAK,YAAY,SAAS,0BAA0B,IAAI;AAC/G,WAAO,IAAI,SAAS,UAAU,4BAA4B,SAAS,EAAE,GAAG,SAAS,UAAU,cAAc,WAAW,MAAM,CAAC;AAAA,EAC7H;AACA,MAAI,gBAAgB,YAAY,SAAS,qBAAqB,KAAK,YAAY,SAAS,sBAAsB,IAAI;AAChH,WAAO,IAAI,SAAS,UAAU,sBAAsB,SAAS,EAAE,GAAG,SAAS,UAAU,YAAY,WAAW,KAAK,CAAC;AAAA,EACpH;AACA,SAAO,IAAI;AAAA,IACT,UAAU;AAAA,IACV;AAAA,IACA,OAAO,KAAK,OAAO,EAAE,SAAS,EAAE,GAAG,SAAS,UAAU,YAAY,WAAW,MAAM,IAAI;AAAA,EACzF;AACF;AAaA,SAAS,iBAAiBE,QAAwD;AAChF,QAAM,UAAUA,OAAM,WAAW;AACjC,MAAI,2BAA2B,KAAK,OAAO,GAAG;AAC5C,WAAO,IAAI,SAAS,UAAU,cAAc,SAAS;AAAA,MACnD,GAAGA;AAAA,MACH,UAAU;AAAA,MACV,WAAW;AAAA,MACX,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACA,QAAM,UAAU,EAAE,GAAGA,QAAO,UAAU,cAAc,WAAW,MAAM;AACrE,MAAI,OAAOA,OAAM,IAAI,MAAM,QAAQ;AACjC,WAAO,IAAI,SAAS,UAAU,4BAA4B,SAAS,OAAO;AAAA,EAC5E;AACA,MAAI,OAAOA,OAAM,IAAI,MAAM,QAAQ;AACjC,WAAO,IAAI,SAAS,UAAU,qBAAqB,SAAS,OAAO;AAAA,EACrE;AACA,SAAO,IAAI,SAAS,UAAU,mBAAmB,SAASA,MAAK;AACjE;AAEA,IAAI,gBAAgB;AAEpB,eAAe,qBAAqB,UAAuC;AACzE,QAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACjD,MAAI;AACJ,MAAI;AACF,UAAM,SAAS,OAAO,KAAK,MAAM,IAAI,IAAe;AACpD,QAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,EAAG,WAAU;AAAA,EAChF,QAAQ;AAAA,EAER;AACA,QAAM,cAAc,SAAS,SAAS,OAAO,QAAQ,UAAU,WAC3D,QAAQ,QACR;AACJ,QAAM,kBAAkB,aAAa,QAAQ,OAAO,YAAY,SAAS,WACrE,YAAY,OACZ;AACJ,QAAM,cAAc,CAAC,SAAS,MAAM,SAAS,WAAW,aAAa,MAAM,iBAAiB,IAAI,EAC7F,KAAK,CAAC,UAA2B,OAAO,UAAU,QAAQ;AAC7D,QAAM,iBAAiB,CAAC,SAAS,SAAS,aAAa,SAAS,OAAO,SAAS,UAAU,WAAW,QAAQ,QAAQ,MAAS,EAC3H,KAAK,CAAC,UAA2B,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,CAAC,MAClF,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI;AAClC,QAAM,UAAU;AAAA,IACd,QAAQ,SAAS;AAAA,IACjB,GAAI,cAAc,EAAE,cAAc,YAAY,IAAI,CAAC;AAAA,EACrD;AACA,MAAI,sBAAsB,aAAa,cAAc,GAAG;AACtD,WAAO,mBAAmB,aAAa,gBAAgB,OAAO;AAAA,EAChE;AACA,MAAI,SAAS,WAAW,IAAK,QAAO,IAAI,SAAS,UAAU,iBAAiB,kBAAkB,mBAAmB,OAAO;AACxH,MAAI,SAAS,WAAW,OAAO,gBAAgB,wBAAwB;AACrE,WAAO,IAAI,SAAS,UAAU,sBAAsB,kBAAkB,iCAAiC;AAAA,MACrG,GAAG;AAAA,MACH,UAAU;AAAA,MACV,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACA,MAAI,SAAS,WAAW,OAAO,gBAAgB,uBAAuB;AACpE,WAAO,IAAI,SAAS,UAAU,qBAAqB,kBAAkB,qCAAqC;AAAA,MACxG,GAAG;AAAA,MACH,UAAU;AAAA,MACV,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACA,MAAI,SAAS,WAAW,IAAK,QAAO,IAAI,SAAS,UAAU,gBAAgB,kBAAkB,uBAAuB,OAAO;AAC3H,MAAI,eAAe,iEAAiE,KAAK,WAAW,GAAG;AACrG,WAAO,IAAI,SAAS,UAAU,4BAA4B,kBAAkB,sDAAsD;AAAA,MAChI,GAAG;AAAA,MACH,UAAU;AAAA,MACV,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACA,MAAI,SAAS,UAAU,IAAK,QAAO,IAAI,SAAS,UAAU,cAAc,kBAAkB,iBAAiB,SAAS,cAAc,SAAS,MAAM,IAAI,OAAO;AAC5J,SAAO,IAAI,SAAS,UAAU,mBAAmB,kBAAkB,mBAAmB,SAAS,cAAc,SAAS,MAAM,IAAI,OAAO;AACzI;AAEA,SAAS,aAAa,MAAuB;AAC3C,QAAM,YAAsB,CAAC;AAC7B,aAAW,QAAQ,KAAK,MAAM,OAAO,GAAG;AACtC,QAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,gBAAU,KAAK,KAAK,MAAM,QAAQ,MAAM,EAAE,UAAU,CAAC;AAAA,IACvD;AAAA,EACF;AAEA,MAAI,UAAU,WAAW,GAAG;AAC1B,UAAM,IAAI,SAAS,UAAU,cAAc,kCAAkC;AAAA,EAC/E;AAEA,MAAI;AACF,WAAO,KAAK,MAAM,UAAU,KAAK,IAAI,CAAC;AAAA,EACxC,QAAQ;AACN,UAAM,IAAI,SAAS,UAAU,cAAc,0CAA0C;AAAA,EACvF;AACF;AAEA,eAAe,uBAAuB,UAAsC;AAC1E,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,SAAS,UAAU,cAAc,8BAA8B,EAAE,QAAQ,SAAS,OAAO,CAAC;AAAA,EACtG;AAEA,MAAI,QAAQ,WAAW,QAAQ,KAAK,QAAQ,WAAW,OAAO,GAAG;AAC/D,WAAO,aAAa,OAAO;AAAA,EAC7B;AAEA,MAAI;AACF,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,UAAM,IAAI,SAAS,UAAU,cAAc,qCAAqC,EAAE,QAAQ,SAAS,OAAO,CAAC;AAAA,EAC7G;AACF;AAEA,SAAS,kBAAkB,SAAmC;AAC5D,MAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,UAAM,IAAI,SAAS,UAAU,cAAc,kCAAkC;AAAA,EAC/E;AACA,SAAO;AACT;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAA+B;AACzC,SAAK,UAAU,QAAQ,QAAQ,QAAQ,QAAQ,EAAE;AACjD,SAAK,SAAS,QAAQ;AACtB,SAAK,YAAY,QAAQ,aAAa;AACtC,SAAK,SAAS,QAAQ,SAAS,WAAW;AAC1C,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EAEA,MAAM,SACJ,UACA,MACA,UAA2B,CAAC,GACA;AAC5B,UAAM,aAAa,QAAQ,cAAc;AACzC,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,WAAW;AAAA,MACb;AAAA,MACA,OAAO,UAAU,IAAI,QAAQ;AAAA,MAC7B,EAAE,WAAW,SAAS;AAAA,IACxB;AACA,QAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,YAAM,IAAI,SAAS,UAAU,cAAc,qCAAqC;AAAA,IAClF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,eACZ,YACA,QACA,QACA,WACA,UACkB;AAClB,UAAM,SAAS,aAAa;AAAA,MAC1B,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,MACR,MAAM,QAAQ,UAAU;AAAA,MACxB,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IACjC,GAAG,KAAK,MAAM;AACd,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,SAAS;AACjE,QAAI,OAAO,UAAU,YAAY,WAAW,OAAO;AACjD,MAAC,MAAyB,MAAM;AAAA,IAClC;AAEA,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,KAAK,OAAO,GAAG,KAAK,OAAO,QAAQ,UAAU,QAAQ;AAAA,QACpE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,UAAU;AAAA,UACV,kBAAkB,KAAK;AAAA,UACvB,wBAAwB;AAAA,QAC1B;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,SAAS;AAAA,UACT,IAAI;AAAA,UACJ;AAAA,UACA;AAAA,QACF,CAAC;AAAA;AAAA;AAAA;AAAA,QAID,YAAY,IAAI,MAAM;AAAA,UACpB,gBAAgB,KAAK;AAAA,UACrB,aAAa,KAAK;AAAA,QACpB,CAAC;AAAA,QACD,QAAQ,WAAW;AAAA,MACrB,CAAwC;AAAA,IAC1C,SAASA,QAAO;AACd,UAAIA,kBAAiB,SAASA,OAAM,SAAS,cAAc;AACzD,cAAM,eAAe,IAAI,SAAS,UAAU,oBAAoB,2BAA2B,KAAK,SAAS,IAAI;AAC7G,eAAO,QAAQ,YAAY;AAC3B,cAAM;AAAA,MACR;AACA,YAAM,UAAUA,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK;AACrE,YAAM,eAAe,IAAI,SAAS,UAAU,eAAe,kBAAkB,OAAO,EAAE;AACtF,aAAO,QAAQ,YAAY;AAC3B,YAAM;AAAA,IACR,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAY,MAAM,qBAAqB,QAAQ;AACrD,aAAO,QAAQ,WAAW,SAAS,MAAM;AACzC,YAAM;AAAA,IACR;AAEA,QAAI;AACF,YAAM,UAAU,kBAAkB,MAAM,uBAAuB,QAAQ,CAAC;AACxE,UAAI,QAAQ,OAAO;AACjB,cAAM,iBAAiB,QAAQ,KAAK;AAAA,MACtC;AACA,UAAI,QAAQ,WAAW,QAAW;AAChC,cAAM,IAAI,SAAS,UAAU,cAAc,gCAAgC;AAAA,MAC7E;AACA,aAAO,QAAQ,SAAS,MAAM;AAC9B,aAAO,QAAQ;AAAA,IACjB,SAASA,QAAO;AACd,aAAO,QAAQA,QAAO,SAAS,MAAM;AACrC,YAAMA;AAAA,IACR;AAAA,EACF;AACF;;;AClTA,SAAS,cAAc,QAA2B,WAA4C;AAC5F,MAAI,OAAO,QAAS,OAAM,uBAAuB,QAAQ,GAAG,SAAS,SAAS;AAC9E,QAAM,QAAQ,OAAO,WAAW,CAAC,GAC9B,OAAO,CAAC,SAAS,MAAM,SAAS,MAAM,EACtC,IAAI,CAAC,SAAU,KAA4B,IAAI,EAC/C,KAAK,CAAC,UAA2B,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,CAAC;AACxF,MAAI,CAAC,KAAM,OAAM,IAAI,SAAS,UAAU,cAAc,WAAW,SAAS,8BAA8B;AACxG,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,EAAG,OAAM,IAAI,MAAM,eAAe;AACnG,WAAO;AAAA,EACT,QAAQ;AACN,UAAM,IAAI,SAAS,UAAU,cAAc,WAAW,SAAS,2BAA2B;AAAA,EAC5F;AACF;AAEO,IAAM,mBAAN,MAAuB;AAAA,EACX;AAAA,EAEjB,YAAY,SAAkC;AAC5C,SAAK,MAAM,IAAI,cAAc,OAAO;AAAA,EACtC;AAAA,EAEA,MAAM,aAAsC;AAC1C,UAAM,OAAO,cAAc,MAAM,KAAK,IAAI,SAAS,iBAAiB,CAAC,GAAG,EAAE,YAAY,MAAM,CAAC,GAAG,gBAAgB;AAChH,QAAI,OAAO,KAAK,WAAW,YAAY,OAAO,KAAK,SAAS,UAAU;AACpE,YAAM,IAAI,SAAS,UAAU,cAAc,iCAAiC;AAAA,IAC9E;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,mBAAmB,MAA+C;AACtE,QAAI,KAAK,WAAW,KAAK,KAAK,SAAS,MAAM,KAAK,KAAK,CAAC,QAAQ,CAAC,IAAI,WAAW,SAAS,CAAC,GAAG;AAC3F,YAAM,IAAI,SAAS,UAAU,kBAAkB,sCAAsC;AAAA,IACvF;AACA,UAAM,OAAO;AAAA,MACX,MAAM,KAAK,IAAI,SAAS,yBAAyB,EAAE,KAAK,GAAG,EAAE,YAAY,MAAM,CAAC;AAAA,MAChF;AAAA,IACF;AACA,QAAI,CAAC,MAAM,QAAQ,KAAK,OAAO,EAAG,OAAM,IAAI,SAAS,UAAU,cAAc,kCAAkC;AAC/G,UAAM,UAAW,KAAK,QAAkC,IAAI,CAAC,WAAW;AAAA,MACtE,GAAG;AAAA,MACH,GAAI,MAAM,WAAW,aAAa,OAAO,MAAM,kBAAkB,WAC7D,EAAE,iBAAiB,KAAK,IAAI,MAAM,aAAa,EAAE,IACjD,CAAC;AAAA,IACP,EAAE;AACF,WAAO;AAAA,MACL;AAAA,MACA,GAAI,OAAO,KAAK,SAAS,WAAW,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,IAC7D;AAAA,EACF;AACF;;;AClFA,IAAM,gCAAgC;AACtC,IAAM,4BAAyC,EAAE,QAAQ,MAAM,OAAU;AAQzE,SAAS,eAAe,OAAoC;AAC1D,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACpE;AAEA,eAAsB,sBACpB,SACA,aACA,SACA,UAA4B,2BAA2B,GACvD,UAAwC,CAAC,GAC1B;AACf,MAAI;AACF,UAAM,cAAc,eAAe,OAAO;AAC1C,UAAM,UAAU,QAAQ,eAAe,IAAI,gBAAgB,GAAG,aAAa;AAC3E,UAAM,cAAc,eAAe,YAAY,SAAS,KACnD,eAAe,QAAQ,IAAI,qBAAqB,CAAC,KACjD,eAAe,OAAO,kBAAkB;AAC7C,YAAQ,aAAa;AAAA,MACnB,SAAS;AAAA,MACT,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,MACrC,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC/B,CAAC;AAED,QAAI,QAAQ,IAAI,2BAA2B,MAAM,IAAK;AACtD,UAAM,SAAS,eAAe,OAAO,MAAM;AAC3C,QAAI,CAAC,OAAQ;AACb,UAAM,UAAU,eAAe,YAAY,OAAO,KAAK,OAAO;AAC9D,UAAM,WAAW,MAAM,IAAI,iBAAiB;AAAA,MAC1C;AAAA,MACA;AAAA,MACA,WAAW,QAAQ,qBAAqB;AAAA,MACxC,QAAQ;AAAA,MACR,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,IAClD,CAAC,EAAE,WAAW;AACd,UAAM,SAAS,eAAe,SAAS,MAAM;AAC7C,QAAI,OAAQ,SAAQ,SAAS,MAAM;AAAA,EACrC,QAAQ;AAAA,EAER;AACF;AASO,SAAS,8BACd,WACA,UAA4B,2BAA2B,GACjD;AACN,UAAQ,qBAAqB,SAAS;AACxC;AAEO,SAAS,yBACd,WAAW,GACX,UAA4B,2BAA2B,GACjD;AACN,UAAQ,gBAAgB,QAAQ;AAClC;AAEA,eAAsB,eACpB,WACA,UAA4B,2BAA2B,GACxC;AACf,QAAM,QAAQ,MAAM,SAAS;AAC/B;;;ACnDO,SAAS,YAAe,MAAc,MAAS,MAAuC;AAC3F,SAAO,EAAE,IAAI,MAAM,MAAM,MAAM,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC,EAAG;AAC3D;AAEO,SAAS,UAAU,MAAc,MAAc,SAAiB,SAAwC;AAC7G,uBAAqB,MAAM,OAAO;AAClC,QAAM,WAAW,WAAW,OAAO,YAAY,YAAY,CAAC,MAAM,QAAQ,OAAO,IAC7E,UACA;AACJ,SAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA,OAAO;AAAA,MACL;AAAA,MACA,GAAI,OAAO,UAAU,aAAa,WAAW,EAAE,UAAU,SAAS,SAAS,IAAI,CAAC;AAAA,MAChF,GAAI,OAAO,UAAU,SAAS,WAAW,EAAE,MAAM,SAAS,KAAK,IAAI,CAAC;AAAA,MACpE;AAAA,MACA,GAAI,OAAO,UAAU,cAAc,YAAY,EAAE,WAAW,SAAS,UAAU,IAAI,CAAC;AAAA,MACpF,GAAI,OAAO,UAAU,aAAa,WAAW,EAAE,UAAU,SAAS,SAAS,IAAI,CAAC;AAAA,MAChF,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC7C;AAAA,EACF;AACF;AAKO,SAAS,UAAa,UAAiC;AAC5D,UAAQ,OAAO,MAAM,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI,IAAI;AAC/D;;;ACpDO,SAAS,KAAK,SAAuB;AAC1C,UAAQ,IAAI,OAAO;AACrB;AAEO,SAAS,QAAQ,SAAuB;AAC7C,UAAQ,IAAI,UAAK,OAAO,EAAE;AAC5B;AAEO,SAAS,KAAK,SAAuB;AAC1C,UAAQ,MAAM,UAAK,OAAO,EAAE;AAC9B;AAEO,SAAS,MAAM,SAAuB;AAC3C,uBAAqB,QAAW,OAAO;AACvC,UAAQ,MAAM,UAAK,OAAO,EAAE;AAC9B;AAEO,SAAS,QAAQ,OAAqB;AAC3C,UAAQ,IAAI;AAAA,EAAK,KAAK,EAAE;AACxB,UAAQ,IAAI,SAAI,OAAO,MAAM,MAAM,CAAC;AACtC;;;A1BDA,SAAS,qBAAqB,KAAkC;AAC9D,MAAI,OAAgB;AACpB,SAAO,KAAK,QAAQ;AAClB,WAAO,KAAK;AAAA,EACd;AACA,SAAO,KAAK,KAAK,EAAE;AACrB;AASA,IAAM,sBAA2C,CAAC,MAAM,MAAM,WAAW,IAAI;AAE7E,eAAsB,uBACpB,QACA,aACA,OAA6B,CAAC,GACE;AAChC,QAAM,OAAO,OAAO,MAAM,KAAK;AAC/B,MAAI,OAAO,SAAS,UAAa,CAAC,MAAM;AACtC,UAAM,IAAI,SAAS,UAAU,kBAAkB,0BAA0B;AAAA,EAC3E;AACA,MAAI,OAAO,aAAa,UAAa,CAAC,oBAAoB,SAAS,OAAO,QAA6B,GAAG;AACxG,UAAM,IAAI,SAAS,UAAU,kBAAkB,8BAA8B,oBAAoB,KAAK,IAAI,CAAC,EAAE;AAAA,EAC/G;AAEA,QAAM,cAAc,KAAK,eAAe,IAAI,gBAAgB;AAC5D,QAAM,OAAO,kBAAkB,aAAa,WAAW;AACvD,QAAM,WAAW,OAAO;AACxB,iBAAe,aAAa,8BAA8B;AAAA,IACxD,UAAU,SAAS;AAAA,IACnB,UAAU,YAAY;AAAA,IACtB,aAAa,OAAO,eAAe;AAAA,EACrC,CAAC;AAED,QAAM,UAAU,MAAM,IAAI,oBAAoB;AAAA,IAC5C,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK;AAAA,IACb,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,EAC5C,CAAC,EAAE,gBAAgB;AAAA,IACjB,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC;AAAA,IACrC,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC;AAAA,EAC/C,CAAC;AAED,MAAI,OAAO,eAAe,MAAM;AAC9B,gBAAY,OAAO,EAAE,oBAAoB,QAAQ,YAAY,CAAC;AAC9D,mBAAe,aAAa,6BAA6B,EAAE,cAAc,QAAQ,YAAY,CAAC;AAAA,EAChG;AACA,iBAAe,aAAa,qBAAqB,EAAE,cAAc,QAAQ,YAAY,CAAC;AACtF,SAAO;AAAA,IACL,cAAc,QAAQ;AAAA,IACtB,MAAM,QAAQ;AAAA,IACd,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC;AAAA,IAC7C,aAAa,OAAO,eAAe;AAAA,EACrC;AACF;AAEA,SAAS,qBAAqBC,QAAgB,UAAmB,MAAoB;AACnF,QAAM,WAAWA,kBAAiB,WAC9BA,SACA,IAAI,SAAS,UAAU,cAAcA,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK,CAAC;AAC/F,MAAI,SAAU,WAAU,UAAU,MAAM,SAAS,MAAM,SAAS,SAAS,SAAS,OAAO,CAAC;AAAA,MACrF,CAAM,MAAM,SAAS,OAAO;AACjC,UAAQ,WAAW;AACrB;AAEO,SAAS,uBAAuB,OAA6B,CAAC,GAAY;AAC/E,QAAM,KAAK,IAAI,QAAQ,WAAW,EAAE,YAAY,sBAAsB;AAEtE,KAAG,QAAQ,QAAQ,EAChB,YAAY,wBAAwB,EACpC,OAAO,iBAAiB,gBAAgB,EACxC,OAAO,yBAAyB,4CAA4C,EAC5E,OAAO,iBAAiB,mDAAmD,EAC3E,OAAO,OAAO,MAAkE,QAAiB;AAChG,UAAM,WAAW,aAAa,GAAG;AACjC,QAAI;AACF,YAAM,SAAS,MAAM,uBAAuB,MAAM,eAAe,GAAG,GAAG,IAAI;AAC3E,8BAAwB,OAAO,YAAY;AAC3C,kCAA4B;AAAA,QAC1B,aAAa,OAAO;AAAA,QACpB,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,MACzD,CAAC;AACD,UAAI,UAAU;AACZ,kBAAU,YAAY,qBAAqB,QAAQ;AAAA,UACjD,GAAI,CAAC,OAAO,cACR,CAAC,EAAE,SAAS,wBAAwB,OAAO,YAAY,IAAI,aAAa,kCAAkC,CAAC,IAC3G,CAAC;AAAA,UACL,EAAE,SAAS,sBAAsB,OAAO,YAAY,8BAA8B,aAAa,oBAAoB;AAAA,QACrH,CAAC,CAAC;AAAA,MACJ,OAAO;AACL,QAAM,QAAQ,sBAAsB,OAAO,YAAY,EAAE;AACzD,QAAM,KAAK,WAAW,OAAO,IAAI,EAAE;AACnC,YAAI,OAAO,SAAU,CAAM,KAAK,eAAe,OAAO,QAAQ,EAAE;AAChE,QAAM,KAAK,cAAc,OAAO,cAAc,QAAQ,IAAI,EAAE;AAAA,MAC9D;AAAA,IACF,SAASA,QAAO;AACd,2BAAqBA,QAAO,UAAU,mBAAmB;AAAA,IAC3D;AAAA,EACF,CAAC;AAEH,KAAG,QAAQ,KAAK,EACb,YAAY,sBAAsB,EAClC,SAAS,kBAAkB,cAAc,EACzC,OAAO,CAAC,aAAqB,OAAgB,QAAiB;AAC7D,UAAM,WAAW,aAAa,GAAG;AAEjC,QAAI,CAAC,eAAe,YAAY,KAAK,MAAM,IAAI;AAC7C,UAAI,UAAU;AACZ,kBAAU,UAAU,iBAAiB,UAAU,kBAAkB,2BAA2B,CAAC;AAAA,MAC/F,OAAO;AACL,QAAM,MAAM,2BAA2B;AAAA,MACzC;AACA,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,cAAc,KAAK,eAAe,IAAI,gBAAgB;AAC5D,gBAAY,OAAO,EAAE,oBAAoB,YAAY,KAAK,EAAE,CAAC;AAC7D,4BAAwB,YAAY,KAAK,CAAC;AAE1C,QAAI,UAAU;AACZ,gBAAU,YAAY,iBAAiB;AAAA,QACrC,cAAc,YAAY,KAAK;AAAA,MACjC,GAAG;AAAA,QACD,EAAE,SAAS,kCAAkC;AAAA,QAC7C,EAAE,SAAS,0CAA0C;AAAA,MACvD,CAAC,CAAC;AAAA,IACJ,OAAO;AACL,MAAM,QAAQ,qBAAqB,YAAY,KAAK,CAAC,EAAE;AAAA,IACzD;AAAA,EACF,CAAC;AAEH,KAAG,QAAQ,SAAS,EACjB,YAAY,wBAAwB,EACpC,OAAO,CAAC,OAAgB,QAAiB;AACxC,UAAM,WAAW,aAAa,GAAG;AACjC,UAAM,cAAc,KAAK,eAAe,IAAI,gBAAgB;AAC5D,UAAM,SAAS,YAAY,aAAa;AAGxC,UAAM,WAAW,qBAAqB,GAAG;AACzC,UAAM,cAAc,QAAQ,IAAI,qBAAqB;AACrD,UAAM,cAAc,YAAY,eAAe,OAAO;AAEtD,UAAM,SAAS,WACX,SACA,cACE,QACA,OAAO,qBACL,WACA;AAER,QAAI,CAAC,aAAa;AAChB,UAAI,UAAU;AACZ,kBAAU;AAAA,UACR;AAAA,UACA,UAAU;AAAA,UACV;AAAA,UACA,EAAE,MAAM,sCAAsC;AAAA,QAChD,CAAC;AAAA,MACH,OAAO;AACL,QAAM,MAAM,mBAAmB;AAC/B,QAAM,KAAK,4CAA4C;AACvD,QAAM,KAAK,oCAAoC;AAAA,MACjD;AACA,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,4BAAwB,WAAW;AACnC,gCAA4B,EAAE,eAAe,KAAK,CAAC;AAEnD,QAAI,UAAU;AACZ,gBAAU,YAAY,qBAAqB;AAAA,QACzC,cAAc;AAAA,QACd;AAAA,MACF,CAAC,CAAC;AAAA,IACJ,OAAO;AACL,MAAM,KAAK,cAAc,WAAW,EAAE;AACtC,MAAM,KAAK,aAAa,MAAM,EAAE;AAAA,IAClC;AAAA,EACF,CAAC;AAEH,SAAO;AACT;;;A2B1MA,SAAS,WAAAC,UAAS,cAAc;;;ACJzB,IAAM,8CAA8C;AAyB3D,SAAS,YAAY,QAA2B,UAA2B;AACzE,MAAI,OAAO,QAAS,OAAM,uBAAuB,QAAQ,QAAQ;AACjE,QAAM,QAAQ,OAAO,WAAW,CAAC,GAC9B,OAAO,CAAC,SAAiC,MAAM,SAAS,UAAU,OAAQ,KAAwB,SAAS,QAAQ,EACnH,IAAI,CAAC,SAAS,KAAK,IAAI,EACvB,KAAK,IAAI,EACT,KAAK;AACR,MAAI,CAAC,KAAM,OAAM,IAAI,SAAS,UAAU,cAAc,GAAG,QAAQ,kBAAkB;AACnF,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,UAAM,IAAI,SAAS,UAAU,cAAc,GAAG,QAAQ,yBAAyB;AAAA,EACjF;AACF;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,aAAa,OAAwC;AAC5D,MAAI,UAAU,aAAa,UAAU,gBAAgB,UAAU,eAAe,UAAU,YAAY,UAAU,aAAa;AACzH,WAAO;AAAA,EACT;AACA,QAAM,IAAI,SAAS,UAAU,cAAc,sCAAsC,OAAO,KAAK,CAAC,EAAE;AAClG;AAEA,SAAS,gBAAgB,OAAgC;AACvD,MAAI,UAAU,WAAW,UAAU,WAAW,UAAU,QAAS,QAAO;AACxE,QAAM,IAAI,SAAS,UAAU,cAAc,qCAAqC,OAAO,KAAK,CAAC,EAAE;AACjG;AAEO,IAAM,4BAAN,MAAgC;AAAA,EACrC,YAA6B,KAAoB;AAApB;AAAA,EAAqB;AAAA,EAArB;AAAA,EAE7B,MAAM,OAAO,QAQ0B;AACrC,mBAAe,oBAAoB,sBAAsB;AAAA,MACvD,cAAc,OAAO;AAAA,MACrB,YAAY,OAAO;AAAA,MACnB,MAAM,OAAO;AAAA,MACb,iBAAiB,OAAO;AAAA,IAC1B,CAAC;AACD,UAAM,SAAS,MAAM,KAAK,IAAI,SAAS,iCAAiC;AAAA,MACtE,cAAc,OAAO;AAAA,MACrB,WAAW,OAAO;AAAA,MAClB,QAAQ,OAAO;AAAA,MACf,eAAe,OAAO;AAAA,MACtB,GAAI,OAAO,QAAQ,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,MAC9C,OAAO,OAAO;AAAA,MACd,gBAAgB,OAAO;AAAA,IACzB,CAAC;AACD,UAAM,UAAU,YAAY,QAAQ,oCAAoC;AACxE,QAAI,CAAC,SAAS,OAAO,KAChB,OAAO,QAAQ,WAAW,YAAY,QAAQ,OAAO,WAAW,KAChE,OAAO,QAAQ,YAAY,YAAY,QAAQ,QAAQ,WAAW,KAClE,OAAO,QAAQ,gBAAgB,YAAY,QAAQ,YAAY,WAAW,KAC1E,OAAO,QAAQ,WAAW,WAAW;AACxC,YAAM,IAAI,SAAS,UAAU,cAAc,8CAA8C;AAAA,IAC3F;AACA,UAAM,aAAwC;AAAA,MAC5C,SAAS,QAAQ;AAAA,MACjB,GAAI,OAAO,QAAQ,cAAc,WAAW,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;AAAA,MAChF,WAAW,gBAAgB,QAAQ,SAAS;AAAA,MAC5C,QAAQ,QAAQ,WAAW;AAAA,MAC3B,QAAQ,aAAa,QAAQ,MAAM;AAAA,MACnC,QAAQ,QAAQ;AAAA,MAChB,aAAa,QAAQ;AAAA,IACvB;AACA,QAAI,WAAW,gBAAgB,OAAO,eAAe,WAAW,cAAc,OAAO,WAAW;AAC9F,YAAM,IAAI,SAAS,UAAU,cAAc,iEAAiE;AAAA,IAC9G;AACA,mBAAe,oBAAoB,uBAAuB;AAAA,MACxD,SAAS,WAAW;AAAA,MACpB,UAAU,WAAW;AAAA,MACrB,QAAQ,WAAW;AAAA,MACnB,QAAQ,WAAW;AAAA,IACrB,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,aAAqB,QAA8C;AAC7E,mBAAe,oBAAoB,iBAAiB,EAAE,SAAS,QAAQ,cAAc,YAAY,CAAC;AAClG,UAAM,SAAS,MAAM,KAAK,IAAI,SAAS,gCAAgC;AAAA,MACrE,cAAc;AAAA,MACd;AAAA,IACF,CAAC;AACD,UAAM,UAAU,YAAY,QAAQ,+BAA+B;AACnE,UAAM,OAAO,SAAS,OAAO,KAAK,SAAS,QAAQ,IAAI,IAAI,QAAQ,OAAO;AAC1E,QAAI,CAAC,QACA,OAAO,KAAK,WAAW,YACvB,OAAO,KAAK,gBAAgB,YAC5B,CAAC,MAAM,QAAQ,KAAK,UAAU,GAAG;AACpC,YAAM,IAAI,SAAS,UAAU,cAAc,yCAAyC;AAAA,IACtF;AACA,QAAI,CAAC,KAAK,WAAW,MAAM,CAAC,QAAQ,OAAO,QAAQ,QAAQ,GAAG;AAC5D,YAAM,IAAI,SAAS,UAAU,cAAc,0CAA0C;AAAA,IACvF;AACA,QAAI,OAAO,KAAK,aAAa,YAAY,CAAC,OAAO,SAAS,KAAK,QAAQ,GAAG;AACxE,YAAM,IAAI,SAAS,UAAU,cAAc,mCAAmC;AAAA,IAChF;AACA,QAAI,KAAK,UAAU,QAAQ,KAAK,UAAU,WACpC,CAAC,SAAS,KAAK,KAAK,KAAK,OAAO,KAAK,MAAM,SAAS,YAAY,OAAO,KAAK,MAAM,YAAY,WAAW;AAC7G,YAAM,IAAI,SAAS,UAAU,cAAc,wCAAwC;AAAA,IACrF;AACA,UAAM,aAAa,KAAK;AACxB,UAAM,WAAgC;AAAA,MACpC,GAAI,OAAO,KAAK,YAAY,WAAW,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,MACpE,GAAI,OAAO,KAAK,cAAc,WAAW,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,MAC1E,OAAO,SAAS,KAAK,KAAK,KAAK,OAAO,KAAK,MAAM,SAAS,YAAY,OAAO,KAAK,MAAM,YAAY,WAChG,EAAE,MAAM,KAAK,MAAM,MAAM,SAAS,KAAK,MAAM,QAAQ,IACrD;AAAA,MACJ,WAAW,gBAAgB,KAAK,SAAS;AAAA,MACzC;AAAA,MACA,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,QAAQ,CAAC;AAAA,MAClD,QAAQ,aAAa,KAAK,MAAM;AAAA,MAChC,QAAQ,KAAK;AAAA,MACb,GAAI,OAAO,KAAK,cAAc,WAAW,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,MAC1E,aAAa,KAAK;AAAA,IACpB;AACA,QAAI,SAAS,WAAW,UAAU,SAAS,gBAAgB,aAAa;AACtE,YAAM,IAAI,SAAS,UAAU,cAAc,mEAAmE;AAAA,IAChH;AACA,mBAAe,oBAAoB,mBAAmB;AAAA,MACpD,SAAS;AAAA,MACT,QAAQ,SAAS;AAAA,MACjB,UAAU,SAAS;AAAA,MACnB,cAAc,SAAS,WAAW;AAAA,MAClC,WAAW,SAAS,UAAU;AAAA,IAChC,CAAC;AACD,WAAO;AAAA,EACT;AACF;;;AChIO,IAAM,yBAAN,MAA6B;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAAwC;AAClD,SAAK,UAAU,QAAQ,QAAQ,QAAQ,QAAQ,EAAE;AACjD,SAAK,SAAS,QAAQ;AACtB,SAAK,SAAS,QAAQ,SAAS,WAAW;AAC1C,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EAEA,MAAM,aAA6C;AACjD,UAAM,SAAS,aAAa;AAAA,MAC1B,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,GAAG,KAAK,MAAM;AAEd,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,KAAK,OAAO,GAAG,KAAK,OAAO,8BAA8B;AAAA,QACxE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,UAAU;AAAA,UACV,cAAc;AAAA,UACd,kBAAkB,KAAK;AAAA,QACzB;AAAA,QACA,MAAM;AAAA,MACR,CAAC;AAAA,IACH,SAASC,QAAO;AACd,YAAM,UAAUA,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK;AACrE,YAAM,eAAe,IAAI,SAAS,UAAU,eAAe,kBAAkB,OAAO,EAAE;AACtF,aAAO,QAAQ,YAAY;AAC3B,YAAM;AAAA,IACR;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,YAAY,IAAI,SAAS,UAAU,iBAAiB,mBAAmB,EAAE,QAAQ,IAAI,CAAC;AAC5F,aAAO,QAAQ,WAAW,SAAS,MAAM;AACzC,YAAM;AAAA,IACR;AACA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,cAAc,IAAI;AAAA,QACtB,UAAU;AAAA,QACV,sCAAsC,SAAS,MAAM;AAAA,QACrD,EAAE,QAAQ,SAAS,OAAO;AAAA,MAC5B;AACA,aAAO,QAAQ,aAAa,SAAS,MAAM;AAC3C,YAAM;AAAA,IACR;AAEA,QAAI;AACJ,QAAI;AACF,aAAO,MAAM,SAAS,KAAK;AAAA,IAC7B,QAAQ;AACN,YAAM,aAAa,IAAI,SAAS,UAAU,cAAc,0CAA0C;AAClG,aAAO,QAAQ,YAAY,SAAS,MAAM;AAC1C,YAAM;AAAA,IACR;AAEA,UAAM,WAAW,KAAK,MAAM;AAC5B,QAAI,KAAK,SAAS,aAAa,CAAC,MAAM,QAAQ,QAAQ,KAAK,SAAS,KAAK,CAAC,SAAS,CAAC,sBAAsB,IAAI,CAAC,GAAG;AAChH,YAAM,aAAa,IAAI;AAAA,QACrB,UAAU;AAAA,QACV,KAAK,SAAS;AAAA,MAChB;AACA,aAAO,QAAQ,YAAY,SAAS,MAAM;AAC1C,YAAM;AAAA,IACR;AAEA,WAAO,QAAQ,SAAS,QAAQ,EAAE,aAAa,SAAS,OAAO,CAAC;AAChE,WAAO;AAAA,EACT;AACF;AAEA,SAAS,sBAAsB,OAA8C;AAC3E,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,OAAO;AACb,QAAM,gBAAgB,CAAC,cACrB,MAAM,QAAQ,SAAS,KAAK,UAAU,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ;AAElF,QAAM,yBAAyB,KAAK,uBAAuB,UACzD,cAAc,KAAK,kBAAkB,KAClC,KAAK,mBAAmB,MAAM,CAAC,UAAU,CAAC,QAAQ,SAAS,SAAS,SAAS,MAAM,EAAE,SAAS,KAAK,CAAC;AAEzG,QAAM,sBAAsB,CAAC,UAC3B,UAAU,UAAa,UAAU,QAAS,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,KAAK,SAAS;AAE7G,SAAO,OAAO,KAAK,OAAO,YACrB,OAAO,KAAK,oBAAoB,aAC/B,KAAK,SAAS,QAAQ,OAAO,KAAK,SAAS,cAC3C,KAAK,UAAU,QAAQ,OAAO,KAAK,UAAU,aAC9C,OAAO,KAAK,gBAAgB,YAC5B,cAAc,KAAK,KAAK,KACxB,cAAc,KAAK,aAAa,MAC/B,KAAK,cAAc,UAAa,cAAc,KAAK,SAAS,MAC7D,0BACA,oBAAoB,KAAK,yBAAyB,KAClD,oBAAoB,KAAK,yBAAyB,KAClD,cAAc,KAAK,IAAI,KACvB,CAAC,CAAC,KAAK,oBAAoB,OAAO,KAAK,qBAAqB,YAAY,CAAC,MAAM,QAAQ,KAAK,gBAAgB,MAC3G,KAAK,iBAAiB,UAAa,KAAK,iBAAiB,QAAQ,OAAO,KAAK,iBAAiB,cAC/F,OAAO,KAAK,eAAe;AAClC;;;AC7IA,IAAM,kBAA0C;AAAA,EAC9C,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,OAAO;AAAA,EACP,cAAc;AAAA,EACd,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,eAAe;AAAA,EACf,SAAS;AAAA,EACT,SAAS;AACX;AAIA,IAAM,kBAA0C;AAAA,EAC9C,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,cAAc;AAAA,EACd,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA,EACb,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,YAAY;AAAA,EACZ,oBAAoB;AACtB;AAIA,IAAM,kBAA0C;AAAA,EAC9C,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,MAAM;AACR;AAMA,SAAS,kBAAkB,QAA6C;AACtE,MAAI,WAAW,QAAS,QAAO;AAC/B,MAAI,WAAW,QAAS,QAAO;AAC/B,SAAO;AACT;AAEA,SAAS,oBAAoB,QAA6B;AACxD,SAAO,WAAW,UAAU,oBAAoB,YAAY,MAAM;AACpE;AAOO,SAAS,gBAAgB,OAAe,QAA6B;AAC1E,QAAM,MAAM,kBAAkB,MAAM;AACpC,QAAM,OAAO,IAAI,KAAK;AACtB,MAAI,CAAC,MAAM;AACT,mBAAe,aAAa,wBAAwB,EAAE,QAAQ,MAAM,GAAG,MAAM;AAC7E,UAAM,YAAY,OAAO,KAAK,GAAG,EAAE,KAAK,IAAI;AAC5C,UAAM,IAAI;AAAA,MACR,UAAU;AAAA,MACV,WAAW,MAAM,YAAY,KAAK,iBAAiB,SAAS;AAAA,MAC5D;AAAA,QACE,UAAU;AAAA,QACV,WAAW;AAAA,QACX,MAAM,sCAAsC,MAAM;AAAA,QAClD;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,iBAAe,aAAa,kBAAkB,EAAE,QAAQ,OAAO,KAAK,CAAC;AACrE,SAAO;AACT;AAWO,SAAS,iBAAiB,QAA4D;AAC3F,QAAM,MAAM,kBAAkB,MAAM;AACpC,SAAO,OAAO,QAAQ,GAAG,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO,EAAE,MAAM,KAAK,EAAE;AACnE;AAOO,SAAS,iBAAiB,MAAc,QAAyC;AACtF,QAAM,SAAS,oBAAoB,MAAM;AACzC,MAAI,CAAC,KAAK,WAAW,MAAM,KAAK,KAAK,WAAW,OAAO,OAAQ,QAAO;AACtE,QAAM,QAAQ,iBAAiB,MAAM,EAAE,KAAK,CAAC,UAAU,MAAM,SAAS,IAAI;AAC1E,SAAO,OAAO,QAAQ,KAAK,MAAM,OAAO,MAAM;AAChD;;;ACvGA,SAAS,qBAAqB,OAAuB;AACnD,SAAO,MAAM,YAAY,EAAE,QAAQ,eAAe,EAAE;AACtD;AAEA,SAAS,yBAAyB,SAA8B,OAAwB;AACtF,QAAM,SAAS,iBAAiB,OAAO;AACvC,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,YAAY,qBAAqB,KAAK;AAC5C,QAAM,aAAa,iBAAiB,QAAQ,iBAAiB,MAAM;AACnE,QAAM,UAAU;AAAA,IACd,QAAQ;AAAA,IACR;AAAA,IACA,cAAc,QAAQ,QAAQ,GAAG,UAAU,GAAG,QAAQ,KAAK,KAAK;AAAA,EAClE,EAAE,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ;AAC9D,SAAO,QAAQ,KAAK,CAAC,UAAU,qBAAqB,KAAK,MAAM,SAAS;AAC1E;AAEO,SAAS,iBAAiB,SAAuD;AACtF,MAAI,QAAQ,gBAAgB,WAAW,iBAAiB,EAAG,QAAO;AAClE,MAAI,QAAQ,gBAAgB,WAAW,iBAAiB,EAAG,QAAO;AAClE,MAAI,QAAQ,gBAAgB,WAAW,iBAAiB,EAAG,QAAO;AAClE,SAAO;AACT;AAEA,SAAS,oBAAoB,YAAoE;AAC/F,SAAO,CAAC,GAAG,UAAU,EAAE,KAAK,CAAC,MAAM,UACjC,KAAK,aAAa,MAAM,cAAc,KAAK,KAAK,MAAM,EACvD,EAAE,CAAC;AACN;AAEO,SAAS,4BACd,SACA,gBACwB;AACxB,QAAM,SAAS,iBAAiB,OAAO;AACvC,MAAI,CAAC,UAAW,kBAAkB,WAAW,gBAAiB;AAC5D,UAAM,IAAI;AAAA,MACR,UAAU;AAAA,MACV,YAAY,QAAQ,EAAE,eAAe,UAAU,gBAAgB,UAAU,iBAAiB,SAAS,cAAc,KAAK,EAAE;AAAA,MACxH;AAAA,QACE,UAAU;AAAA,QACV,WAAW;AAAA,QACX,UAAU,QAAQ;AAAA,QAClB,GAAI,iBAAiB,EAAE,iBAAiB,eAAe,IAAI,CAAC;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AACA,QAAM,MAAM,iBAAiB,QAAQ,iBAAiB,MAAM;AAC5D,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,SAAS,UAAU,qBAAqB,YAAY,QAAQ,EAAE,wBAAwB,MAAM,gBAAgB;AAAA,MACpH,UAAU;AAAA,MACV,WAAW;AAAA,MACX,UAAU,QAAQ;AAAA,IACpB,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL;AAAA,IACA,UAAU,QAAQ;AAAA,IAClB,SAAS,QAAQ;AAAA,IACjB,MAAM,QAAQ,QAAQ,QAAQ,SAAS;AAAA,IACvC,GAAI,QAAQ,QAAQ,EAAE,SAAS,QAAQ,MAAM,IAAI,CAAC;AAAA,IAClD,SAAS;AAAA,IACT,eAAe;AAAA,EACjB;AACF;AAEO,SAAS,qBACd,SACA,UACqB;AACrB,MAAI,SAAS,YAAY,SAAS,SAAS,SAAS,UAAU;AAC5D,UAAM,IAAI,SAAS,UAAU,kBAAkB,kDAAkD;AAAA,EACnG;AACA,MAAI,SAAS,WAAW,CAAC,SAAS,OAAO;AACvC,UAAM,IAAI,SAAS,UAAU,kBAAkB,6BAA6B;AAAA,EAC9E;AACA,MAAI,CAAC,SAAS,WAAW,CAAC,SAAS,OAAO;AACxC,UAAM,IAAI,SAAS,UAAU,kBAAkB,4CAA4C;AAAA,EAC7F;AACA,MAAI,SAAS,SAAS;AACpB,UAAM,UAAU,aAAa,SAAS,OAAO;AAC7C,UAAMC,YAAW,QAAQ,KAAK,CAAC,YAAY,QAAQ,OAAO,OAAO;AACjE,QAAIA,UAAU,QAAOA;AACrB,UAAM,IAAI,SAAS,UAAU,qBAAqB,YAAY,OAAO,wDAAwD;AAAA,MAC3H,UAAU;AAAA,MACV,WAAW;AAAA,MACX,MAAM;AAAA,MACN,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,QAAM,QAAQ,QAAQ,OAAO,CAAC,YAAY,yBAAyB,SAAS,SAAS,KAAM,CAAC;AAC5F,QAAM,aAAa,SAAS,UACxB,MAAM,OAAO,CAAC,YAAY,QAAQ,UAAU,SAAS,OAAO,IAC5D;AACJ,QAAM,WAAW,oBAAoB,UAAU;AAC/C,MAAI,SAAU,QAAO;AACrB,QAAM,IAAI;AAAA,IACR,UAAU;AAAA,IACV,SAAS,UACL,SAAS,SAAS,KAAK,2BAA2B,SAAS,OAAO,2CAClE,SAAS,SAAS,KAAK;AAAA,IAC3B;AAAA,MACE,UAAU;AAAA,MACV,WAAW;AAAA,MACX,MAAM;AAAA,MACN,OAAO,SAAS;AAAA,MAChB,GAAI,SAAS,UAAU,EAAE,SAAS,SAAS,QAAQ,IAAI,CAAC;AAAA,IAC1D;AAAA,EACF;AACF;AAEA,SAAS,aAAa,OAAuB;AAC3C,MAAI,CAAC,QAAQ,KAAK,KAAK,GAAG;AACxB,UAAM,IAAI,SAAS,UAAU,kBAAkB,sBAAsB,KAAK,qDAAqD;AAAA,EACjI;AACA,QAAM,KAAK,OAAO,KAAK;AACvB,MAAI,CAAC,OAAO,cAAc,EAAE,KAAK,MAAM,GAAG;AACxC,UAAM,IAAI,SAAS,UAAU,kBAAkB,sBAAsB,KAAK,qDAAqD;AAAA,EACjI;AACA,SAAO;AACT;AAEA,eAAsB,sBAAsB,SAAwE;AAClH,MAAI,QAAQ,WAAW,QAAQ,SAAS;AACtC,UAAM,IAAI,SAAS,UAAU,kBAAkB,+CAA+C;AAAA,EAChG;AAEA,MAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ,SAAS;AACxC,UAAM,gBAAgB;AAAA,MACpB,KAAK,QAAQ;AAAA,MACb,UAAU,gBAAgB,QAAQ,OAAO,QAAQ,MAAM;AAAA,IACzD;AACA,QAAI,CAAC,QAAQ,qBAAsB,QAAO;AAE1C,UAAMC,WAAU,MAAM,IAAI,uBAAuB;AAAA,MAC/C,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ;AAAA,MAChB,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,IAClD,CAAC,EAAE,WAAW;AACd,UAAM,aAAaA,SAAQ,OAAO,CAAC,YACjC,iBAAiB,OAAO,MAAM,QAAQ,WAClC,QAAQ,oBAAoB,cAAc,YAAY,yBAAyB,SAAS,QAAQ,KAAK,EAC1G;AACD,QAAI,WAAW,WAAW,GAAG;AAC3B,YAAM,IAAI;AAAA,QACR,UAAU;AAAA,QACV,SAAS,QAAQ,KAAK;AAAA,QACtB;AAAA,UACE,UAAU;AAAA,UACV,WAAW;AAAA,UACX,MAAM;AAAA,UACN,OAAO,QAAQ;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AACA,UAAMD,YAAW,WAAW,KAAK,CAAC,YAAY,QAAQ,oBAAoB,cAAc,YAAY,QAAQ,UAAU,IAAI,KACrH,oBAAoB,UAAU;AACnC,QAAI,CAACA,UAAU,QAAO,EAAE,GAAG,eAAe,eAAe,YAAY;AACrE,WAAO,EAAE,GAAG,4BAA4BA,WAAU,QAAQ,MAAM,GAAG,KAAK,QAAQ,MAAM;AAAA,EACxF;AAEA,QAAM,UAAU,MAAM,IAAI,uBAAuB;AAAA,IAC/C,SAAS,QAAQ;AAAA,IACjB,QAAQ,QAAQ;AAAA,IAChB,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,EAClD,CAAC,EAAE,WAAW;AAEd,QAAM,WAAW,qBAAqB,SAAS,QAAQ,UACnD,EAAE,SAAS,QAAQ,QAAQ,IAC3B,EAAE,OAAO,QAAQ,OAAO,SAAS,QAAQ,QAAQ,CAAC;AACtD,QAAM,YAAY,4BAA4B,UAAU,QAAQ,MAAM;AACtE,SAAO,QAAQ,UAAU,YAAY,EAAE,GAAG,WAAW,KAAK,QAAQ,MAAM;AAC1E;AAEO,SAAS,gCAAgC,WAA6C;AAC3F,SAAO,CAAC,GAAG,IAAI,IAAI,UAAU,SAAS,sBAAsB,CAAC,CAAC,CAAC;AACjE;AAEO,SAAS,+BACd,WACA,UACgE;AAChE,QAAM,gBAAgB,UAAU,SAAS,YAAY,CAAC,GAAG,KAAK;AAC9D,MAAI,WAAW,SAAS;AACxB,MAAI,iBAAiB,kBAAkB,KAAK,aAAa,GAAG;AAC1D,eAAW,OAAO,aAAa;AAAA,EACjC,WAAW,eAAe;AACxB,UAAM,QAAQ,0CAA0C,KAAK,aAAa;AAC1E,QAAI,MAAO,YAAW,OAAO,MAAM,CAAC,CAAC;AAAA,EACvC;AACA,SAAO;AAAA,IACL,aAAa,UAAU,SAAS,cAAc,CAAC,KAAK,SAAS;AAAA,IAC7D,YAAY,UAAU,SAAS,MAAM,CAAC,KAAK,SAAS;AAAA,IACpD,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC;AAAA,EAC/C;AACF;AAEA,SAAS,qBAAqB,OAAuB;AACnD,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,SAAO,eAAe,aAAa,SAAS;AAC9C;AAEO,SAAS,yBACd,WACA,QACM;AACN,QAAM,UAAU,UAAU;AAC1B,MAAI,CAAC,QAAS;AAEd,MAAI,OAAO,eAAe,QAAQ,cAAc,SAAS,GAAG;AAC1D,UAAM,YAAY,qBAAqB,OAAO,WAAW;AACzD,UAAM,YAAY,QAAQ,cAAc,IAAI,oBAAoB;AAChE,QAAI,CAAC,UAAU,SAAS,SAAS,GAAG;AAClC,YAAM,IAAI;AAAA,QACR,UAAU;AAAA,QACV,GAAG,UAAU,QAAQ,UAAU,GAAG,kCAAkC,OAAO,WAAW,gBAAgB,QAAQ,cAAc,KAAK,IAAI,CAAC;AAAA,QACtI;AAAA,UACE,UAAU;AAAA,UACV,WAAW;AAAA,UACX,OAAO;AAAA,UACP,UAAU,OAAO;AAAA,UACjB,WAAW,QAAQ;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,cAAc,QAAQ,MAAM,SAAS,GAAG;AACjD,UAAM,YAAY,OAAO,WAAW,KAAK,EAAE,YAAY;AACvD,QAAI,CAAC,QAAQ,MAAM,KAAK,CAAC,SAAS,KAAK,KAAK,EAAE,YAAY,MAAM,SAAS,GAAG;AAC1E,YAAM,IAAI;AAAA,QACR,UAAU;AAAA,QACV,GAAG,UAAU,QAAQ,UAAU,GAAG,gCAAgC,OAAO,UAAU,gBAAgB,QAAQ,MAAM,KAAK,IAAI,CAAC;AAAA,QAC3H;AAAA,UACE,UAAU;AAAA,UACV,WAAW;AAAA,UACX,OAAO;AAAA,UACP,UAAU,OAAO;AAAA,UACjB,WAAW,QAAQ;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,aAAa,UAAa,QAAQ,aAAa,QAAQ,UAAU,SAAS,GAAG;AACtF,UAAM,YAAY,QAAQ,UAAU,KAAK,CAAC,UAAU;AAClD,YAAM,QAAQ,MAAM,KAAK;AACzB,UAAI,kBAAkB,KAAK,KAAK,EAAG,QAAO,OAAO,KAAK,MAAM,OAAO;AACnE,YAAM,QAAQ,0CAA0C,KAAK,KAAK;AAClE,aAAO,UAAU,QAAQ,OAAO,YAAa,OAAO,MAAM,CAAC,CAAC,KAAK,OAAO,YAAa,OAAO,MAAM,CAAC,CAAC;AAAA,IACtG,CAAC;AACD,QAAI,CAAC,WAAW;AACd,YAAM,IAAI;AAAA,QACR,UAAU;AAAA,QACV,GAAG,UAAU,QAAQ,UAAU,GAAG,8BAA8B,OAAO,QAAQ,iBAAiB,CAAC,GAAG,IAAI,IAAI,QAAQ,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,QAC1I;AAAA,UACE,UAAU;AAAA,UACV,WAAW;AAAA,UACX,OAAO;AAAA,UACP,UAAU,OAAO;AAAA,UACjB,WAAW,CAAC,GAAG,IAAI,IAAI,QAAQ,SAAS,CAAC;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,WAK/B;AACA,SAAO;AAAA,IACL,KAAK,UAAU;AAAA,IACf,GAAI,UAAU,YAAY,SAAY,EAAE,UAAU,UAAU,QAAQ,IAAI,CAAC;AAAA,IACzE,GAAI,UAAU,OAAO,EAAE,MAAM,UAAU,KAAK,IAAI,CAAC;AAAA,IACjD,GAAI,UAAU,UAAU,EAAE,SAAS,UAAU,QAAQ,IAAI,CAAC;AAAA,EAC5D;AACF;AAGO,SAAS,iBAAiB,WAA2C;AAC1E,MAAI,UAAU,YAAY,OAAW,QAAO,cAAc,UAAU,OAAO;AAC3E,MAAI,UAAU,QAAS,QAAO,WAAW,UAAU,GAAG,cAAc,UAAU,OAAO;AACrF,SAAO,WAAW,UAAU,GAAG;AACjC;;;AC9SA,SAAS,gBAAAE,eAAc,iBAAAC,gBAAe,kBAAAC,iBAAgB,aAAAC,YAAW,cAAAC,aAAY,aAAAC,kBAAiB;AAC9F,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAC9B,SAAS,eAAAC,oBAAmB;AAkDrB,SAAS,iBAAyB;AACvC,SAAO,UAAUC,aAAY,CAAC,EAAE,SAAS,KAAK;AAChD;AAIO,IAAM,YAAN,MAAgB;AAAA,EACJ;AAAA,EACA;AAAA,EAEjB,YAAY,SAA4B;AACtC,SAAK,YAAY,SAAS,aAAa,iBAAiB;AACxD,SAAK,YAAYC,MAAK,KAAK,WAAW,aAAa;AAAA,EACrD;AAAA;AAAA,EAGA,eAAuB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,QAKQ;AACb,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,UAAM,OAAmB;AAAA,MACvB,IAAI,eAAe;AAAA,MACnB,aAAa,OAAO;AAAA,MACpB,SAAS,OAAO;AAAA,MAChB,UAAU,OAAO;AAAA,MACjB,WAAW,OAAO;AAAA,MAClB,QAAQ;AAAA,MACR,cAAc,CAAC;AAAA,MACf,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AAEA,SAAK,WAAW;AAChB,iBAAa,GAAG,KAAK,SAAS,SAAS,MAAM;AAC3C,MAAAC,gBAAe,KAAK,WAAW,KAAK,UAAU,IAAI,IAAI,MAAM,EAAE,UAAU,SAAS,MAAM,IAAM,CAAC;AAC9F,MAAAC,WAAU,KAAK,WAAW,GAAK;AAAA,IACjC,CAAC;AACD,mBAAe,cAAc,gBAAgB,EAAE,SAAS,KAAK,IAAI,MAAM,KAAK,SAAS,CAAC;AACtF,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OACE,QACA,SAGwB;AACxB,SAAK,WAAW;AAChB,UAAM,OAAO,aAAa,GAAG,KAAK,SAAS,SAAS,MAAM;AACxD,YAAM,QAAQ,KAAK,SAAS;AAC5B,YAAM,MAAM,MAAM,UAAU,CAAC,SAAS,KAAK,OAAO,MAAM;AACxD,UAAI,QAAQ,GAAI,QAAO;AAEvB,YAAM,QAAQ,MAAM,GAAG;AACvB,UAAI,QAAQ,WAAW,OAAW,OAAM,SAAS,QAAQ;AACzD,UAAI,QAAQ,iBAAiB,OAAW,OAAM,eAAe,QAAQ;AACrE,UAAI,QAAQ,cAAc,OAAW,OAAM,YAAY,QAAQ;AAC/D,UAAI,QAAQ,kBAAkB,OAAW,OAAM,gBAAgB,QAAQ;AACvE,UAAI,QAAQ,mBAAmB,OAAW,OAAM,iBAAiB,QAAQ;AACzE,UAAI,QAAQ,mBAAmB,OAAW,OAAM,iBAAiB,QAAQ;AACzE,UAAI,QAAQ,cAAc,OAAW,OAAM,YAAY,QAAQ;AAC/D,UAAI,QAAQ,aAAa,OAAW,OAAM,WAAW,QAAQ;AAC7D,UAAI,QAAQ,iBAAiB,OAAW,OAAM,eAAe,QAAQ;AACrE,UAAI,QAAQ,UAAU,KAAM,QAAO,MAAM;AAAA,eAChC,QAAQ,UAAU,OAAW,OAAM,QAAQ,QAAQ;AAC5D,YAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,WAAK,UAAU,KAAK;AACpB,aAAO;AAAA,IACT,CAAC;AACD,QAAI,CAAC,MAAM;AACT,qBAAe,cAAc,uBAAuB,EAAE,SAAS,QAAQ,QAAQ,YAAY,GAAG,MAAM;AACpG,aAAO;AAAA,IACT;AACA,mBAAe,cAAc,gBAAgB,EAAE,SAAS,QAAQ,QAAQ,KAAK,OAAO,CAAC;AACrF,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAwC;AAC1C,UAAM,QAAQ,KAAK,SAAS;AAC5B,UAAM,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AAC9C,mBAAe,cAAc,aAAa,EAAE,SAAS,QAAQ,OAAO,SAAS,OAAU,CAAC;AACxF,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,WAAW,QAAwC;AACjD,UAAM,QAAQ,KAAK,SAAS;AAC5B,UAAM,OAAO,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,UAAU,KAAK,kBAAkB,MAAM;AACrF,mBAAe,cAAc,uBAAuB;AAAA,MAClD,SAAS;AAAA,MACT,OAAO,SAAS;AAAA,MAChB,YAAY,MAAM,OAAO,SAAS,UAAU,OAAO,YAAY;AAAA,IACjE,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,OAA8B;AACjC,UAAM,QAAQ,KAAK,SAAS;AAC5B,UAAM,QAAQ;AACd,QAAI,UAAU,UAAa,QAAQ,GAAG;AACpC,YAAM,SAAS,MAAM,MAAM,GAAG,KAAK;AACnC,qBAAe,cAAc,eAAe,EAAE,OAAO,OAAO,QAAQ,MAAM,CAAC;AAC3E,aAAO;AAAA,IACT;AACA,mBAAe,cAAc,eAAe,EAAE,OAAO,MAAM,OAAO,CAAC;AACnE,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,WAAyB;AAC/B,QAAI,CAACC,YAAW,KAAK,SAAS,EAAG,QAAO,CAAC;AACzC,QAAI;AACF,YAAM,MAAMC,cAAa,KAAK,WAAW,OAAO;AAChD,YAAM,QAAQ,IAAI,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,MAAM,EAAE;AAClE,aAAO,MAAM,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAe;AAAA,IAC3D,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA,EAGQ,UAAU,OAA2B;AAC3C,SAAK,WAAW;AAChB,UAAM,UAAU,MAAM,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI;AACjE,IAAAC,eAAc,KAAK,WAAW,SAAS,EAAE,UAAU,SAAS,MAAM,IAAM,CAAC;AACzE,IAAAH,WAAU,KAAK,WAAW,GAAK;AAAA,EACjC;AAAA;AAAA,EAGQ,aAAmB;AACzB,UAAM,MAAMI,SAAQ,KAAK,SAAS;AAClC,QAAI,CAACH,YAAW,GAAG,GAAG;AACpB,MAAAI,WAAU,KAAK,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAAA,IACjD;AACA,IAAAL,WAAU,KAAK,GAAK;AAAA,EACtB;AACF;;;AC9MA,SAAS,gBAAAM,eAAc,iBAAAC,gBAAe,aAAAC,YAAW,cAAAC,aAAY,aAAa,aAAAC,kBAAiB;AAC3F,SAAS,QAAAC,aAAY;AACrB,SAAS,eAAAC,oBAAmB;AAkErB,SAAS,mBAA2B;AACzC,SAAO,aAAaC,aAAY,CAAC,EAAE,SAAS,KAAK;AACnD;AAOA,SAAS,YAAY,MAAsB;AACzC,QAAM,QAAQ,KAAK,QAAQ,cAAc,EAAE,EAAE,MAAM,GAAG;AAEtD,QAAM,SAAS,MAAM,CAAC,KAAK;AAC3B,QAAM,WAAW,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG;AACxC,QAAM,QAAQ,SAAS,OAAO,CAAC,EAAE,YAAY,IAAI,SAAS,MAAM,CAAC;AACjE,SAAO,GAAG,KAAK,IAAI,MAAM;AAC3B;AAKA,SAAS,kBAAkB,WAAoD;AAC7E,QAAM,OAA6B,CAAC;AACpC,aAAW,KAAK,WAAW;AACzB,SAAK,KAAK;AAAA,MACR,SAAS,qBAAqB,EAAE,GAAG;AAAA,MACnC,aAAa;AAAA,IACf,CAAC;AAED,QAAI,EAAE,IAAI,WAAW,eAAe,GAAG;AACrC,WAAK,KAAK;AAAA,QACR,SAAS,8BAA8B,EAAE,GAAG;AAAA,QAC5C,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAIA,IAAI,sBAAsB;AAE1B,SAAS,8BAA8B,GAAoB,GAA4B;AACrF,QAAM,YAAY,EAAE,WAAW,cAAc,EAAE,UAAU;AACzD,MAAI,cAAc,EAAG,QAAO;AAE5B,QAAM,YAAY,OAAO,EAAE,qBAAqB,WAAW,EAAE,mBAAmB;AAChF,QAAM,YAAY,OAAO,EAAE,qBAAqB,WAAW,EAAE,mBAAmB;AAChF,QAAM,WAAW,YAAY;AAC7B,MAAI,aAAa,EAAG,QAAO;AAE3B,SAAO,EAAE,UAAU,cAAc,EAAE,SAAS;AAC9C;AAEO,IAAM,eAAN,MAAmB;AAAA,EACP;AAAA,EACA;AAAA,EAEjB,YAAY,SAA+B;AACzC,SAAK,YAAY,SAAS,aAAa,iBAAiB;AACxD,SAAK,cAAcC,MAAK,KAAK,WAAW,UAAU;AAAA,EACpD;AAAA;AAAA,EAGA,eAAuB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,QAA0C;AACrD,UAAM,WAAW,iBAAiB;AAClC,UAAM,YAAYA,MAAK,KAAK,aAAa,QAAQ;AAGjD,IAAAC,WAAU,WAAW,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AACrD,IAAAA,WAAUD,MAAK,WAAW,WAAW,GAAG,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AACxE,IAAAE,WAAU,KAAK,WAAW,GAAK;AAC/B,IAAAA,WAAU,KAAK,aAAa,GAAK;AACjC,IAAAA,WAAU,WAAW,GAAK;AAC1B,IAAAA,WAAUF,MAAK,WAAW,WAAW,GAAG,GAAK;AAE7C,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAGnC,UAAM,WAA4B;AAAA,MAChC,gBAAgB;AAAA,MAChB,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,kBAAkB,EAAE;AAAA,MACpB,GAAI,OAAO,YAAY,EAAE,YAAY,OAAO,UAAU,IAAI,CAAC;AAAA,MAC3D,cAAc,OAAO;AAAA,MACrB,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO;AAAA,MAChB,MAAM,OAAO;AAAA,MACb,YAAY,OAAO;AAAA,MACnB,WAAW,OAAO;AAAA,IACpB;AAGA,UAAM,gBAAgB,OAAO,UAAU;AACvC,UAAM,YAAY,OAAO,KAAK,SAAS,OAAO,IAC1C,UACA,OAAO,KAAK,SAAS,OAAO,KAAK,OAAO,KAAK,SAAS,OAAO,IAC3D,UACA;AAEN,QAAI;AACJ,QAAI;AACJ,UAAM,eAAqC,CAAC;AAE5C,QAAI,OAAO,WAAW,aAAa;AACjC,YAAM,WAAW,OAAO,UAAU,OAAO,IAAI,OAAO,UAAU,IAAI,KAAK;AACvE,qBAAe,aAAa,aAAa,GAAG,QAAQ,IAAI,SAAS,GAAG,kBAAkB,IAAI,MAAM,EAAE;AAClG,qBAAe,OAAO,UAAU,SAAS,IACrC,2BAA2B,OAAO,UAAU,CAAC,EAAG,GAAG,2BACnD;AACJ,mBAAa,KAAK,GAAG,kBAAkB,OAAO,SAAS,CAAC;AAAA,IAC1D,OAAO;AACL,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,qBAAe,sBAAsB,MAAM;AAC3C,qBAAe,QAAQ,OAAO,MAAM,gBAAgB,OAAO,OAAO,QAAQ,SAAS;AACnF,mBAAa,KAAK;AAAA,QAChB,SAAS,sBAAsB,OAAO,MAAM;AAAA,QAC5C,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAEA,UAAM,UAA0B;AAAA,MAC9B,OAAO,YAAY,OAAO,IAAI;AAAA,MAC9B,QAAQ,OAAO;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,MACf,MAAM;AAAA,IACR;AAGA,UAAM,eAAeA,MAAK,WAAW,eAAe;AACpD,UAAM,cAAcA,MAAK,WAAW,cAAc;AAClD,IAAAG,eAAc,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI,MAAM,EAAE,UAAU,SAAS,MAAM,IAAM,CAAC;AACxG,IAAAA,eAAc,aAAa,KAAK,UAAU,SAAS,MAAM,CAAC,IAAI,MAAM,EAAE,UAAU,SAAS,MAAM,IAAM,CAAC;AACtG,IAAAD,WAAU,cAAc,GAAK;AAC7B,IAAAA,WAAU,aAAa,GAAK;AAC5B,mBAAe,iBAAiB,mBAAmB;AAAA,MACjD,WAAW;AAAA,MACX,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO;AAAA,MACf,gBAAgB,OAAO,UAAU;AAAA,IACnC,CAAC;AAED,WAAO,EAAE,UAAU,WAAW,UAAU,QAAQ;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,UAAyG;AACjH,UAAM,YAAYF,MAAK,KAAK,aAAa,QAAQ;AACjD,UAAM,eAAeA,MAAK,WAAW,eAAe;AACpD,UAAM,cAAcA,MAAK,WAAW,cAAc;AAElD,QAAI,CAACI,YAAW,YAAY,KAAK,CAACA,YAAW,WAAW,GAAG;AACzD,qBAAe,iBAAiB,gBAAgB,EAAE,WAAW,UAAU,OAAO,MAAM,CAAC;AACrF,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,WAA4B,KAAK,MAAMC,cAAa,cAAc,OAAO,CAAC;AAChF,YAAM,UAA0B,KAAK,MAAMA,cAAa,aAAa,OAAO,CAAC;AAC7E,qBAAe,iBAAiB,gBAAgB,EAAE,WAAW,UAAU,OAAO,KAAK,CAAC;AACpF,aAAO,EAAE,UAAU,SAAS,UAAU;AAAA,IACxC,QAAQ;AACN,qBAAe,iBAAiB,gBAAgB,EAAE,WAAW,UAAU,OAAO,OAAO,QAAQ,UAAU,GAAG,MAAM;AAChH,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,QAAuG;AACvH,UAAM,UAAU,KAAK,aAAa;AAClC,eAAW,KAAK,SAAS;AACvB,UAAI,EAAE,YAAY,QAAQ;AACxB,eAAO,KAAK,UAAU,EAAE,SAAS;AAAA,MACnC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAmG;AACjG,UAAM,UAAU,KAAK,aAAa;AAClC,QAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,YAAQ,KAAK,6BAA6B;AAC1C,WAAO,KAAK,UAAU,QAAQ,CAAC,EAAG,SAAS;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,OAAmC;AAC7C,UAAM,UAAU,KAAK,aAAa;AAClC,YAAQ,KAAK,6BAA6B;AAC1C,QAAI,UAAU,UAAa,QAAQ,GAAG;AACpC,aAAO,QAAQ,MAAM,GAAG,KAAK;AAAA,IAC/B;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAkC;AACxC,QAAI,CAACD,YAAW,KAAK,WAAW,EAAG,QAAO,CAAC;AAE3C,UAAM,UAAU,YAAY,KAAK,aAAa,EAAE,eAAe,KAAK,CAAC;AACrE,UAAM,YAA+B,CAAC;AAEtC,eAAW,SAAS,SAAS;AAC3B,UAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,YAAM,eAAeJ,MAAK,KAAK,aAAa,MAAM,MAAM,eAAe;AACvE,UAAI,CAACI,YAAW,YAAY,EAAG;AAE/B,UAAI;AACF,cAAM,WAA4B,KAAK,MAAMC,cAAa,cAAc,OAAO,CAAC;AAChF,kBAAU,KAAK,QAAQ;AAAA,MACzB,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;AC3SO,SAAS,wBACd,QAC2C;AAC3C,QAAM,QAAQ,OAAO,gBAAgB,IAAI,aAAa,EAAE,WAAW,OAAO,UAAU,aAAa,EAAE,CAAC;AAEpG,MAAI;AACF,UAAM,aAAa;AAAA,MACjB,QAAQ,OAAO,KAAK;AAAA,MACpB,aAAa,OAAO,KAAK;AAAA,MACzB,SAAS,OAAO,KAAK;AAAA,MACrB,MAAM,OAAO,KAAK;AAAA,MAClB,WAAW,OAAO,KAAK;AAAA,MACvB,WAAW,OAAO;AAAA,MAClB,QAAQ,OAAO;AAAA,MACf,GAAI,OAAO,QAAQ,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,IAChD,CAAC;AACD,WAAO;AAAA,EACT,SAASC,QAAO;AACd,UAAM,UAAUA,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK;AACrE,mBAAe,iBAAiB,yBAAyB;AAAA,MACvD,SAAS,OAAO,KAAK;AAAA,MACrB,QAAQ,OAAO;AAAA,IACjB,GAAG,MAAM;AACT,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,4EAA4E,OAAO;AAAA,IAC9F;AAAA,EACF;AACF;;;ACtCA,IAAM,aAA6C;AAAA,EACjD,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AACT;AAEA,IAAM,YAA4C;AAAA,EAChD,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AACT;AAEO,SAAS,sBAAsB,QAAkD;AACtF,MAAI,WAAW,UAAW,QAAO;AACjC,MAAI,WAAW,aAAc,QAAO;AACpC,SAAO;AACT;AAEO,SAAS,eAAe,MAA2B;AACxD,SAAO,KAAK,WAAW,eAAe,KAAK,WAAW,YAAY,KAAK,WAAW;AACpF;AAEA,SAAS,qBAAqB,MAAqC;AACjE,QAAM,SAAS,WAAW,KAAK,SAAS;AACxC,QAAM,aAAa,KAAK,WAAW,KAAK,CAAC,QAAQ,CAAC,IAAI,WAAW,MAAM,CAAC;AACxE,MAAI,YAAY;AACd,UAAM,IAAI,SAAS,UAAU,cAAc,WAAW,KAAK,SAAS,+CAA+C;AAAA,MACjH,SAAS,KAAK;AAAA,MACd,KAAK;AAAA,IACP,CAAC;AAAA,EACH;AACA,MAAI,KAAK,WAAW,eAAe,KAAK,WAAW,WAAW,GAAG;AAC/D,UAAM,IAAI,SAAS,UAAU,cAAc,gBAAgB,KAAK,MAAM,kCAAkC;AAAA,EAC1G;AACA,SAAO,KAAK;AACd;AAEA,SAAS,uBAAuB,QAIc;AAC5C,QAAM,eAAe,OAAO,gBAAgB,IAAI,aAAa,EAAE,WAAW,OAAO,UAAU,aAAa,EAAE,CAAC;AAC3G,MAAI,aAAa,kBAAkB,OAAO,KAAK,EAAE,EAAG,QAAO;AAC3D,QAAM,SAAS,OAAO,KAAK,WAAW,YAAY,OAAO,KAAK,WAAW;AACzE,SAAO,wBAAwB;AAAA,IAC7B,WAAW,OAAO;AAAA,IAClB;AAAA,IACA,MAAM,OAAO;AAAA,IACb,WAAW,OAAO,KAAK,aAAa,IAAI,CAAC,SAAS;AAAA,MAChD;AAAA,MACA,WAAW,OAAO,KAAK,YAAY,UAAU,OAAO,KAAK,SAAS,IAAI;AAAA,IACxE,EAAE;AAAA,IACF,QAAQ,SAAS,WAAW;AAAA,IAC5B,GAAI,SAAS;AAAA,MACX,OAAO,OAAO,KAAK,SAAS;AAAA,QAC1B,MAAM,OAAO,KAAK,WAAW,cAAc,yBAAyB,UAAU;AAAA,QAC9E,SAAS,OAAO,KAAK,WAAW,cAAc,6BAA6B;AAAA,MAC7E;AAAA,IACF,IAAI,CAAC;AAAA,EACP,CAAC;AACH;AAEA,eAAsB,sBAAsB,QAU6E;AACvH,QAAM,aAAa,MAAM,OAAO,OAAO,OAAO;AAAA,IAC5C,aAAa,OAAO,KAAK;AAAA,IACzB,WAAW,OAAO;AAAA,IAClB,QAAQ,OAAO;AAAA,IACf,eAAe,OAAO,KAAK;AAAA,IAC3B,GAAI,OAAO,QAAQ,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,IAC9C,OAAO,OAAO;AAAA,IACd,gBAAgB,OAAO,KAAK;AAAA,EAC9B,CAAC;AACD,QAAM,UAAU,OAAO,UAAU,OAAO,OAAO,KAAK,IAAI;AAAA,IACtD,eAAe,WAAW;AAAA,IAC1B,gBAAgB,WAAW;AAAA,IAC3B,gBAAgB,OAAO,eAAe,QAAQ,QAAQ,EAAE;AAAA,IACxD,WAAW,WAAW;AAAA;AAAA;AAAA;AAAA,IAItB,QAAQ,WAAW,WAAW,eAAe,WAAW,WAAW,YAAY,WAAW,WAAW,cACjG,YACA,sBAAsB,WAAW,MAAM;AAAA,IAC3C,UAAU;AAAA,IACV,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,IACrC,OAAO;AAAA,EACT,CAAC;AACD,MAAI,CAAC,QAAS,OAAM,IAAI,SAAS,UAAU,cAAc,4CAA4C,OAAO,KAAK,EAAE,EAAE;AACrH,iBAAe,oBAAoB,qBAAqB;AAAA,IACtD,eAAe,QAAQ;AAAA,IACvB,iBAAiB,WAAW;AAAA,IAC5B,QAAQ,QAAQ;AAAA,EAClB,CAAC;AACD,QAAM,oBAAoB,WAAW,WAAW,eAAe,WAAW,WAAW,YAAY,WAAW,WAAW;AACvH,MAAI,CAAC,kBAAmB,QAAO,EAAE,YAAY,MAAM,QAAQ;AAC3D,QAAM,SAAS,MAAM,wBAAwB;AAAA,IAC3C,QAAQ,OAAO;AAAA,IACf,WAAW,OAAO;AAAA,IAClB,cAAc,OAAO;AAAA,IACrB,MAAM;AAAA,EACR,CAAC;AACD,MAAI,OAAO,KAAK,WAAW,YAAY,OAAO,KAAK,WAAW,aAAa;AACzE,UAAM,IAAI;AAAA,MACR,UAAU;AAAA,MACV,OAAO,KAAK,OAAO,WAAW,2BAA2B,OAAO,KAAK,aAAa,IAAI,OAAO,KAAK,MAAM;AAAA,MACxG;AAAA,QACE,iBAAiB,OAAO,KAAK;AAAA,QAC7B,gBAAgB,OAAO,KAAK;AAAA,QAC5B,GAAI,OAAO,KAAK,QAAQ,EAAE,eAAe,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,YAAY,GAAG,OAAO;AACjC;AAEA,eAAsB,wBAAwB,QAKoC;AAChF,MAAI,CAAC,OAAO,KAAK,eAAe;AAC9B,QAAI,eAAe,OAAO,IAAI,EAAG,QAAO,EAAE,MAAM,OAAO,KAAK;AAC5D,UAAM,IAAI,SAAS,UAAU,gBAAgB,QAAQ,OAAO,KAAK,EAAE,uCAAuC;AAAA,EAC5G;AACA,QAAM,UAAU,MAAM,OAAO,OAAO,MAAM,OAAO,KAAK,aAAa,OAAO,KAAK,aAAa;AAC5F,MAAI,OAAO,KAAK,aAAa,OAAO,KAAK,cAAc,QAAQ,WAAW;AACxE,UAAM,IAAI,SAAS,UAAU,cAAc,gEAAgE;AAAA,MACzG,SAAS,QAAQ;AAAA,MACjB,mBAAmB,OAAO,KAAK;AAAA,MAC/B,oBAAoB,QAAQ;AAAA,IAC9B,CAAC;AAAA,EACH;AACA,QAAM,eAAe,qBAAqB,OAAO;AACjD,QAAM,UAAU,OAAO,UAAU,OAAO,OAAO,KAAK,IAAI;AAAA,IACtD,gBAAgB,QAAQ;AAAA,IACxB,WAAW,QAAQ;AAAA,IACnB,QAAQ,sBAAsB,QAAQ,MAAM;AAAA,IAC5C,UAAU,QAAQ;AAAA,IAClB;AAAA,IACA,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,IACrC,OAAO,QAAQ;AAAA,EACjB,CAAC;AACD,MAAI,CAAC,QAAS,OAAM,IAAI,SAAS,UAAU,cAAc,kDAAkD,OAAO,KAAK,EAAE,EAAE;AAC3H,iBAAe,oBAAoB,2BAA2B;AAAA,IAC5D,eAAe,QAAQ;AAAA,IACvB,iBAAiB,QAAQ;AAAA,IACzB,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,IAClB,cAAc,QAAQ,aAAa;AAAA,EACrC,CAAC;AACD,MAAI,CAAC,eAAe,OAAO,EAAG,QAAO,EAAE,MAAM,QAAQ;AACrD,QAAM,iBAAiB,uBAAuB;AAAA,IAC5C,WAAW,OAAO;AAAA,IAClB,cAAc,OAAO;AAAA,IACrB,MAAM;AAAA,EACR,CAAC;AACD,iBAAe,oBAAoB,2BAA2B;AAAA,IAC5D,eAAe,QAAQ;AAAA,IACvB,iBAAiB,QAAQ;AAAA,IACzB,QAAQ,QAAQ;AAAA,IAChB,iBAAiB,mBAAmB;AAAA,EACtC,CAAC;AACD,SAAO,EAAE,MAAM,SAAS,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC,EAAG;AACxE;;;AC1LO,IAAM,uBAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAkCA,IAAM,YAAY,CAAC,KAAc,SAAS,WAA2B,EAAE,MAAM,YAAY,KAAK,OAAO;AACrG,IAAM,SAAS,CAAC,SAAkC,EAAE,MAAM,UAAU,IAAI;AACxE,IAAM,YAAY,CAAC,KAAc,SAAS,WAA2B,EAAE,MAAM,YAAY,KAAK,OAAO;AACrG,IAAM,YAAY,CAAC,SAAkC,EAAE,MAAM,YAAY,IAAI;AAE7E,IAAM,mBAAmB,CAAC,cAAc,kBAAkB;AAC1D,IAAM,kBAAkB,CAAC,cAAc,eAAe,YAAY;AAClE,IAAM,gBAAgB,CAAC,cAAc,oBAAoB,eAAe,eAAe,YAAY;AAEnG,SAAS,eAAe,SAAgD;AACtE,MAAI,YAAY,OAAO;AACrB,WAAO;AAAA,MACL,QAAQ,EAAE,OAAO,UAAU,CAAC,GAAG,OAAO,UAAU,GAAG,IAAI,EAAE;AAAA,MACzD,OAAO;AAAA,MACP,UAAU;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AAAA,IACL,QAAQ,EAAE,OAAO,UAAU,EAAE,GAAG,OAAO,UAAU,CAAC,GAAG,OAAO,UAAU,CAAC,EAAE;AAAA,IACzE,OAAO;AAAA,EACT;AACF;AAEA,SAAS,iBAAiB,SAAgD;AACxE,MAAI,SAAS,YAAY,MAAM,iBAAiB;AAC9C,WAAO;AAAA,MACL,QAAQ,EAAE,OAAO,OAAO,GAAG,OAAO,UAAU,EAAE;AAAA,MAC9C,OAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AAAA,IACL,QAAQ,EAAE,OAAO,OAAO,EAAE;AAAA,IAC1B,OAAO,YAAY,QAAQ,mBAAmB,CAAC,cAAc,oBAAoB,aAAa;AAAA,EAChG;AACF;AAEA,SAAS,gBAAgB,SAAgD;AACvE,MAAI,YAAY,eAAe,YAAY,kBAAkB,YAAY,YAAY;AACnF,WAAO;AAAA,MACL,QAAQ,EAAE,OAAO,UAAU,CAAC,EAAE;AAAA,MAC9B,OAAO,CAAC,eAAe,YAAY;AAAA,IACrC;AAAA,EACF;AACA,MAAI,YAAY,UAAU;AACxB,WAAO;AAAA,MACL,QAAQ,EAAE,OAAO,UAAU,CAAC,EAAE;AAAA,MAC9B,OAAO,CAAC,cAAc,oBAAoB,eAAe,YAAY;AAAA,IACvE;AAAA,EACF;AACA,SAAO;AAAA,IACL,QAAQ,EAAE,OAAO,UAAU,CAAC,EAAE;AAAA,IAC9B,OAAO;AAAA,EACT;AACF;AAMO,SAAS,qBAAqB,UAAkB,SAAiD;AACtG,MAAI,aAAa,qBAAsB,QAAO,eAAe,OAAO;AACpE,MAAI,aAAa,uBAAwB,QAAO,iBAAiB,OAAO;AACxE,MAAI,aAAa,sBAAuB,QAAO,gBAAgB,OAAO;AAEtE,QAAM,YAA+C;AAAA,IACnD,2BAA2B;AAAA;AAAA;AAAA,MAGzB,QAAQ,EAAE,OAAO,UAAU,CAAC,GAAG,OAAO,UAAU,CAAC,GAAG,OAAO,UAAU,CAAC,EAAE;AAAA,MACxE,OAAO;AAAA,IACT;AAAA,IACA,2BAA2B;AAAA,MACzB,QAAQ,EAAE,OAAO,UAAU,EAAE,GAAG,OAAO,UAAU,EAAE,GAAG,OAAO,UAAU,EAAE,EAAE;AAAA,MAC3E,OAAO;AAAA,MACP,UAAU;AAAA,IACZ;AAAA,IACA,2BAA2B;AAAA,MACzB,QAAQ,EAAE,OAAO,UAAU,CAAC,GAAG,OAAO,UAAU,CAAC,GAAG,OAAO,UAAU,CAAC,EAAE;AAAA,MACxE,OAAO,CAAC,GAAG,eAAe,gBAAgB;AAAA,MAC1C,qBAAqB;AAAA,IACvB;AAAA,IACA,sBAAsB;AAAA;AAAA,MAEpB,QAAQ,EAAE,OAAO,UAAU,CAAC,GAAG,OAAO,UAAU,GAAG,IAAI,EAAE;AAAA,MACzD,OAAO;AAAA,MACP,UAAU;AAAA,IACZ;AAAA,IACA,sBAAsB;AAAA,MACpB,QAAQ,EAAE,OAAO,UAAU,CAAC,GAAG,OAAO,UAAU,GAAG,IAAI,EAAE;AAAA,MACzD,OAAO,CAAC,cAAc,oBAAoB,eAAe,YAAY;AAAA,IACvE;AAAA,IACA,4BAA4B;AAAA,MAC1B,QAAQ,EAAE,OAAO,OAAO,CAAC,GAAG,OAAO,UAAU,GAAG,IAAI,EAAE;AAAA,MACtD,OAAO;AAAA,MACP,UAAU;AAAA,IACZ;AAAA,IACA,6BAA6B;AAAA,MAC3B,QAAQ,EAAE,OAAO,UAAU,GAAG,IAAI,EAAE;AAAA,MACpC,OAAO;AAAA,IACT;AAAA,IACA,gCAAgC;AAAA,MAC9B,QAAQ,EAAE,OAAO,UAAU,GAAG,IAAI,EAAE;AAAA,MACpC,OAAO,CAAC,kBAAkB;AAAA,IAC5B;AAAA,IACA,qCAAqC;AAAA,MACnC,QAAQ,EAAE,OAAO,UAAU,CAAC,EAAE;AAAA,MAC9B,OAAO;AAAA,IACT;AAAA,IACA,2BAA2B;AAAA,MACzB,QAAQ,EAAE,OAAO,UAAU,CAAC,EAAE;AAAA,MAC9B,OAAO,CAAC,cAAc,oBAAoB,eAAe,YAAY;AAAA,IACvE;AAAA,IACA,6BAA6B;AAAA,MAC3B,QAAQ,EAAE,OAAO,UAAU,CAAC,EAAE;AAAA,MAC9B,OAAO,CAAC,cAAc,oBAAoB,eAAe,YAAY;AAAA,IACvE;AAAA,IACA,sBAAsB,EAAE,QAAQ,EAAE,OAAO,OAAO,EAAE,EAAE;AAAA,IACpD,0BAA0B,EAAE,QAAQ,EAAE,OAAO,OAAO,EAAE,EAAE;AAAA,IACxD,yBAAyB,EAAE,QAAQ,EAAE,OAAO,OAAO,EAAE,EAAE;AAAA,IACvD,2BAA2B,EAAE,QAAQ,EAAE,OAAO,OAAO,EAAE,EAAE;AAAA,IACzD,qBAAqB,EAAE,QAAQ,EAAE,OAAO,UAAU,GAAG,IAAI,EAAE,EAAE;AAAA,IAC7D,yBAAyB,EAAE,QAAQ,EAAE,OAAO,UAAU,CAAC,EAAE,EAAE;AAAA,EAC7D;AACA,SAAO,UAAU,QAAQ;AAC3B;AAEO,SAAS,8BAA8B,UAAkB,SAA0D;AACxH,QAAM,WAAW,qBAAqB,UAAU,OAAO;AACvD,MAAI,CAAC,SAAU,QAAO;AACtB,SAAO;AAAA,IACL,OAAO,SAAS,OAAO,UAAU;AAAA,IACjC,OAAO,SAAS,OAAO,UAAU;AAAA,IACjC,OAAO,SAAS,OAAO,UAAU;AAAA,EACnC;AACF;AAGO,SAAS,2BAA2B,UAAkB,SAA2B;AACtF,QAAM,WAAW,qBAAqB,UAAU,OAAO;AAEvD,MAAI,CAAC,YAAY,CAAC,SAAS,MAAO,QAAO;AACzC,SAAO,SAAS,MAAM,SAAS,YAAY;AAC7C;AAEA,SAAS,cAAc,QAAwC;AAC7D,SAAO,CAAC,GAAG,IAAI,KAAK,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC;AACjF;AAEA,SAAS,gBAAgB,QAAkB,MAA6B,QAAsB;AAC5F,QAAM,UAAU,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,WAAW,MAAM,CAAC;AAChE,MAAI,SAAS;AACX,UAAM,IAAI,SAAS,UAAU,kBAAkB,SAAS,IAAI,wBAAwB,MAAM,UAAU,OAAO,EAAE;AAAA,EAC/G;AACF;AAEA,SAAS,gBAAgB,SAAiB,UAAmC,CAAC,GAAa;AACzF,SAAO,IAAI,SAAS,UAAU,4BAA4B,SAAS;AAAA,IACjE,UAAU;AAAA,IACV,WAAW;AAAA,IACX,GAAG;AAAA,EACL,CAAC;AACH;AAEA,SAAS,gBACP,MACA,UACA,MACA,QACA,OACM;AACN,MAAI,OAAO,WAAW,EAAG;AACzB,MAAI,CAAC,OAAO;AACV,UAAM,gBAAgB,GAAG,QAAQ,qBAAqB,IAAI,gBAAgB,EAAE,OAAO,KAAK,CAAC;AAAA,EAC3F;AACA,MAAI,MAAM,QAAQ,UAAa,OAAO,SAAS,MAAM,KAAK;AACxD,UAAM,gBAAgB,GAAG,QAAQ,qBAAqB,MAAM,GAAG,IAAI,IAAI,yBAAyB,OAAO,MAAM,KAAK;AAAA,MAChH,OAAO;AAAA,MACP,UAAU,OAAO;AAAA,MACjB,eAAe,MAAM;AAAA,IACvB,CAAC;AAAA,EACH;AACA,MAAI,MAAM,UAAU,OAAO,SAAS,GAAG;AACrC,UAAM,gBAAgB,GAAG,QAAQ,sBAAsB,IAAI,eAAe,EAAE,OAAO,MAAM,UAAU,OAAO,QAAQ,eAAe,EAAE,CAAC;AAAA,EACtI;AACA,OAAK,MAAM,IAAI,IAAI,MAAM,SAAS,OAAO,CAAC,IAAI;AAChD;AAEA,SAAS,UAAU,UAA6B,MAA0C;AACxF,QAAM,iBAAiB,KAAK,OAAO,SAAS,KAAK,OAAO,SAAS,KAAK,OAAO;AAC7E,MAAI,mBAAmB,EAAG,QAAO;AACjC,MAAI,SAAS,OAAO,SAAS,YAAY,EAAG,QAAO;AACnD,MAAI,KAAK,OAAO,UAAU,KAAK,OAAO,OAAQ,QAAO;AACrD,MAAI,SAAS,OAAO,SAAS,aAAa,EAAG,QAAO;AACpD,MAAI,KAAK,OAAO,WAAW,KAAK,SAAS,OAAO,SAAS,kBAAkB,EAAG,QAAO;AACrF,MAAI,KAAK,OAAO,WAAW,KAAK,SAAS,OAAO,SAAS,aAAa,EAAG,QAAO;AAChF,SAAO;AACT;AAEO,SAAS,wBAAwB,OAOoD;AAC1F,QAAM,aAA8B;AAAA,IAClC,QAAQ,cAAc,MAAM,MAAM;AAAA,IAClC,QAAQ,cAAc,MAAM,MAAM;AAAA,IAClC,QAAQ,cAAc,MAAM,MAAM;AAAA,EACpC;AACA,kBAAgB,WAAW,QAAQ,UAAU,eAAe;AAC5D,kBAAgB,WAAW,QAAQ,UAAU,eAAe;AAC5D,kBAAgB,WAAW,QAAQ,UAAU,eAAe;AAE5D,QAAM,iBAAiB,WAAW,OAAO,SAAS,WAAW,OAAO,SAAS,WAAW,OAAO;AAC/F,QAAM,WAAW,qBAAqB,MAAM,UAAU,MAAM,OAAO;AACnE,MAAI,CAAC,UAAU;AACb,QAAI,mBAAmB,EAAG,QAAO,EAAE,MAAM,CAAC,GAAG,MAAM,cAAc,WAAW;AAC5E,UAAM,IAAI;AAAA,MACR,UAAU;AAAA,MACV,GAAG,MAAM,QAAQ;AAAA,MACjB,EAAE,UAAU,cAAc,WAAW,OAAO,MAAM,MAAM,SAAS;AAAA,IACnE;AAAA,EACF;AACA,MAAI,SAAS,aAAa,UAAa,iBAAiB,SAAS,UAAU;AACzE,UAAM,gBAAgB,GAAG,MAAM,QAAQ,qBAAqB,SAAS,QAAQ,+BAA+B,cAAc,KAAK;AAAA,MAC7H,OAAO;AAAA,MACP,UAAU;AAAA,MACV,eAAe,SAAS;AAAA,IAC1B,CAAC;AAAA,EACH;AACA,MAAI,SAAS,uBAAuB,WAAW,OAAO,SAAS,KAC1D,WAAW,OAAO,WAAW,KAAK,WAAW,OAAO,WAAW,GAAG;AACrE,UAAM,gBAAgB,GAAG,MAAM,QAAQ,oEAAoE,EAAE,OAAO,QAAQ,CAAC;AAAA,EAC/H;AAEA,QAAM,OAAO,MAAM,QAAQ,MAAM,SAAS,SAAS,MAAM,OAAO,UAAU,UAAU,UAAU;AAC9F,MAAI,MAAM,QAAQ,MAAM,SAAS,UAAU,CAAC,SAAS,OAAO;AAC1D,UAAM,IAAI;AAAA,MACR,UAAU;AAAA,MACV,GAAG,MAAM,QAAQ;AAAA,MACjB,EAAE,UAAU,cAAc,WAAW,OAAO,OAAO,QAAQ,UAAU,MAAM,KAAK;AAAA,IAClF;AAAA,EACF;AACA,MAAI,SAAS,SAAS,CAAC,SAAS,MAAM,SAAS,IAAI,GAAG;AACpD,UAAM,IAAI;AAAA,MACR,UAAU;AAAA,MACV,GAAG,MAAM,QAAQ,qBAAqB,IAAI,sBAAsB,SAAS,MAAM,KAAK,IAAI,CAAC;AAAA,MACzF,EAAE,UAAU,cAAc,WAAW,OAAO,OAAO,QAAQ,UAAU,MAAM,WAAW,SAAS,MAAM;AAAA,IACvG;AAAA,EACF;AACA,MAAI,SAAS,gBAAgB,iBAAiB,GAAG;AAC/C,UAAM,gBAAgB,iEAAiE,EAAE,OAAO,aAAa,CAAC;AAAA,EAChH;AACA,OAAK,SAAS,sBAAsB,SAAS,sBACvC,WAAW,OAAO,WAAW,KAAK,WAAW,OAAO,SAAS,KAAK,WAAW,OAAO,SAAS,IAAI;AACrG,UAAM,gBAAgB,GAAG,IAAI,iEAAiE,EAAE,OAAO,cAAc,KAAK,CAAC;AAAA,EAC7H;AACA,MAAI,SAAS,kBACP,WAAW,OAAO,WAAW,KAAK,WAAW,OAAO,SAAS,KAAK,WAAW,OAAO,SAAS,IAAI;AACrG,UAAM,gBAAgB,6EAA6E,EAAE,OAAO,cAAc,KAAK,CAAC;AAAA,EAClI;AACA,MAAI,SAAS,kBACP,WAAW,OAAO,WAAW,KAAK,WAAW,OAAO,SAAS,KAAK,WAAW,OAAO,SAAS,IAAI;AACrG,UAAM,gBAAgB,wFAAwF,EAAE,OAAO,cAAc,KAAK,CAAC;AAAA,EAC7I;AACA,MAAI,SAAS,gBAAgB,mBAAmB,GAAG;AACjD,UAAM,gBAAgB,0FAA0F,EAAE,OAAO,cAAc,KAAK,CAAC;AAAA,EAC/I;AAEA,QAAM,OAAgC,CAAC;AACvC,kBAAgB,MAAM,MAAM,UAAU,SAAS,WAAW,QAAQ,SAAS,OAAO,KAAK;AACvF,kBAAgB,MAAM,MAAM,UAAU,SAAS,WAAW,QAAQ,SAAS,OAAO,KAAK;AACvF,kBAAgB,MAAM,MAAM,UAAU,SAAS,WAAW,QAAQ,SAAS,OAAO,KAAK;AACvF,MAAI,SAAS,MAAO,MAAK,eAAe;AACxC,SAAO,EAAE,MAAM,MAAM,WAAW;AAClC;;;ACvSA,IAAM,gBAAgB,EAAE,OAAO,OAAO,OAAO,OAAO,OAAO,MAAM;AAG1D,SAAS,4BAA4B,QAAoE;AAC9G,MAAI,aAAiE;AAErE,MAAI,OAAO,SAAS,WAAW,iBAAiB,GAAG;AACjD,iBAAa,EAAE,OAAO,MAAM,OAAO,OAAO,OAAO,MAAM;AAAA,EACzD,WAAW,OAAO,SAAS,WAAW,iBAAiB,GAAG;AACxD,iBAAa,8BAA8B,OAAO,UAAU,OAAO,OAAO,KAAK;AAAA,EACjF,WAAW,OAAO,aAAa,6BAA6B;AAK1D,UAAM,eAAe,IAAI,IAAI,OAAO,SAAS,sBAAsB,CAAC,MAAM,CAAC;AAC3E,iBAAa;AAAA,MACX,OAAO,aAAa,IAAI,OAAO;AAAA,MAC/B,OAAO;AAAA,MACP,OAAO,aAAa,IAAI,OAAO;AAAA,IACjC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,WAAW,SAAS,OAAO,SAAS,8BAA8B;AAAA,IACzE,OAAO,WAAW;AAAA,IAClB,OAAO,WAAW;AAAA,IAClB,MAAM;AAAA,EACR;AACF;AAEO,SAAS,+BAA+B,QAAwE;AACrH,QAAM,uBAAuB,OAAO,OAAO,SAAS,8BAA8B,YAC7E,OAAO,QAAQ,4BAA4B;AAChD,SAAO;AAAA,IACL,OAAO,4BAA4B,MAAM;AAAA,IACzC,uBAAuB,CAAC,yBACtB,CAAC,OAAO,SAAS,WAAW,iBAAiB,KAC1C,2BAA2B,OAAO,UAAU,OAAO,OAAO;AAAA,EAEjE;AACF;AAEO,SAAS,6BAA6B,QAA6C;AACxF,MAAI,+BAA+B,MAAM,EAAE,sBAAuB;AAClE,QAAM,qBAAqB,OAAO,SAAS;AAC3C,QAAM,uBAAuB,OAAO,uBAAuB,YAAY,qBAAqB;AAC5F,QAAM,IAAI;AAAA,IACR,UAAU;AAAA,IACV,uBACI,GAAG,OAAO,QAAQ,OAAO,OAAO,OAAO,QAAQ,sBAAsB,kBAAkB,sBACvF,GAAG,OAAO,QAAQ,OAAO,OAAO,OAAO,QAAQ;AAAA,IACnD;AAAA,MACE,UAAU;AAAA,MACV,WAAW;AAAA,MACX,GAAI,uBAAuB;AAAA,QACzB,OAAO;AAAA,QACP,UAAU;AAAA,QACV,eAAe;AAAA,MACjB,IAAI;AAAA,QACF,OAAO;AAAA,QACP,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACF;AAGO,SAAS,4BAA4B,QAAuC,OAAqB;AACtG,QAAM,MAAM,OAAO,SAAS;AAC5B,QAAM,MAAM,OAAO,SAAS;AAC5B,MAAI,OAAO,QAAQ,YAAY,QAAQ,KAAK;AAC1C,UAAM,IAAI;AAAA,MACR,UAAU;AAAA,MACV,GAAG,OAAO,QAAQ,OAAO,OAAO,OAAO,QAAQ,sBAAsB,GAAG,+BAA+B,KAAK;AAAA,MAC5G;AAAA,QACE,UAAU;AAAA,QACV,WAAW;AAAA,QACX,OAAO;AAAA,QACP,UAAU;AAAA,QACV,eAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACA,MAAI,UAAU,EAAG;AACjB,MAAI,CAAC,4BAA4B,MAAM,EAAE,OAAO;AAC9C,UAAM,IAAI;AAAA,MACR,UAAU;AAAA,MACV,GAAG,OAAO,QAAQ,OAAO,OAAO,OAAO,QAAQ;AAAA,MAC/C;AAAA,QACE,UAAU;AAAA,QACV,WAAW;AAAA,QACX,OAAO;AAAA,QACP,UAAU;AAAA,QACV,GAAI,QAAQ,IAAI,EAAE,eAAe,EAAE,IAAI,CAAC;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO,QAAQ,YAAY,QAAQ,KAAK;AAC1C,UAAM,IAAI;AAAA,MACR,UAAU;AAAA,MACV,GAAG,OAAO,QAAQ,OAAO,OAAO,OAAO,QAAQ,qBAAqB,GAAG,+BAA+B,KAAK;AAAA,MAC3G;AAAA,QACE,UAAU;AAAA,QACV,WAAW;AAAA,QACX,OAAO;AAAA,QACP,UAAU;AAAA,QACV,eAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACF;;;AChHA,SAAS,UAAU,OAAoD;AACrE,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG,QAAO;AACxE,QAAM,UAAU,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,UAAqC,OAAO,MAAM,CAAC,MAAM,QAAQ;AAC/G,SAAO,OAAO,YAAY,OAAO;AACnC;AAEA,SAAS,SAAS,KAAyC,YAAoD;AAC7G,MAAI,CAAC,OAAO,CAAC,WAAY,QAAO;AAChC,QAAM,QAAQ,IAAI,UAAU;AAC5B,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,MAAM,OAAO,KAAK,GAAG,EAAE,KAAK,CAAC,SAAS,KAAK,YAAY,MAAM,WAAW,YAAY,CAAC;AAC3F,SAAO,MAAM,IAAI,GAAG,IAAI;AAC1B;AAEA,SAAS,eAAe,OAAoC;AAC1D,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,SAAS,IAAI,QAAQ;AACrF;AAEA,SAAS,QAAQ,OAAuB;AACtC,QAAM,YAAY,OAAO,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,CAAC,IAAI;AAClE,SAAO,SAAS,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,SAAS,CAAC;AAClE;AAEO,SAAS,oBAAoB,OAAsC;AACxE,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,OAAO,MAAM,SAAS,SAAS,SAAS;AAC9C,QAAM,UAAU,QAAQ,gBAAgB,WAAW,iBAAiB;AACpE,QAAM,mBAAmB,QAAQ,uBAAuB;AACxD,QAAM,yBAAyB,MAAM,0BAA0B;AAC/D,MAAI,MAAM,aAAa,WAAc,CAAC,OAAO,SAAS,MAAM,QAAQ,KAAK,MAAM,YAAY,IAAI;AAC7F,UAAM,IAAI,SAAS,UAAU,kBAAkB,oCAAoC;AAAA,EACrF;AACA,MAAI,CAAC,OAAO,SAAS,sBAAsB,KAAK,yBAAyB,GAAG;AAC1E,UAAM,IAAI,SAAS,UAAU,kBAAkB,mDAAmD;AAAA,EACpG;AAEA,QAAM,aAAa,QAAQ;AAC3B,QAAM,WAAW,eAAe,QAAQ,qBAAqB,KAAK;AAClE,QAAM,OAAO,SAAS,SAAS,WAAW;AAC1C,QAAM,mBAAmB,UAAU,QAAQ,kBAAkB;AAC7D,QAAM,iBAAiB,UAAU,QAAQ,4BAA4B,KAAK;AAC1E,QAAM,kBAAkB,UAAU,QAAQ,6BAA6B;AACvE,QAAM,gBAAgB,UAAU,QAAQ,uCAAuC,KAAK;AACpF,QAAM,gBAAgB,SAAS,SAAS,iBAAiB;AACzD,QAAM,eAAe,SAAS,SAAS,gBAAgB;AACvD,QAAM,aAAa,yBAAyB,IAAI,eAAe;AAC/D,MAAI,oBAAoB,MAAM;AAC9B,MAAI,QAAQ,oBAAoB,+BAC3B,MAAM,cACN,SAAS,YAAY,MAAM,UAAU,MAAM,UAC3C,YAAY,KAAK,MAAM,UAAU,GAAG;AACvC,UAAM,UAAU,MAAM,SAAS,KAAK,EAAE,YAAY,MAC5C,MAAM,WAAW,YAAY,MAAM,OAAO,QAAQ;AACxD,UAAM,WAAW,GAAG,MAAM,UAAU,IAAI,OAAO;AAC/C,QAAI,SAAS,YAAY,QAAQ,MAAM,UAAa,SAAS,eAAe,QAAQ,MAAM,QAAW;AACnG,0BAAoB;AAAA,IACtB;AAAA,EACF;AACA,QAAM,QAAQ,yBAAyB,IAAI,SAAS,cAAc,iBAAiB,IAAI,WAClF,SAAS,eAAe,iBAAiB,KACzC;AACL,QAAM,eAAe,QAAQ,iBAAiB,QAAQ,eAAe,QAAQ,sBAAsB,MAAM;AACzG,QAAM,kBAAkB,eAAgB,QAAQ,yBAAoC,MAAM;AAC1F,QAAM,gBAAgB,OAAO;AAC7B,QAAM,WAAW,MAAM,aAAa,UAAU,KAAK;AACnD,QAAM,iBAAiB,aAAa,SAAY,YAAY,UAAU,yBAAyB,KAAK;AACpG,QAAM,SAAS,WAAW,mBAAmB,SACzC,QAAQ,gBAAgB,cAAc,IACtC,oBAAoB,aAAa,SAC/B,QAAQ,gBAAgB,QAAQ,IAChC,eACE,QAAQ,aAAa,IACrB;AAER,SAAO;AAAA,IACL,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb;AAAA,IACA,cAAc,WAAW,mBAAmB,WAAW;AAAA,IACvD,GAAI,mBAAmB,WAAc,WAAW,oBAAoB,EAAE,iBAAiB,eAAe,IAAI,CAAC;AAAA,IAC3G,eAAe;AAAA,IACf,UAAU,QAAQ;AAAA,IAClB,YAAY,QAAQ,QAAQ,QAAQ,SAAS,QAAQ;AAAA,IACrD,QAAQ;AAAA,EACV;AACF;;;ACzEO,SAAS,4BACd,WACA,WACA,MAC6B;AAC7B,QAAM,UAAU,UAAU;AAC1B,QAAM,QAAQ,UAAU,oBAAoB;AAAA,IAC1C,SAAS;AAAA;AAAA;AAAA,IAGT,MAAM;AAAA,IACN,GAAI,OAAO,KAAK,aAAa,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,IACvE,GAAI,OAAO,KAAK,eAAe,WAAW,EAAE,YAAY,KAAK,WAAW,IAAI,CAAC;AAAA,IAC7E,GAAI,OAAO,KAAK,YAAY,WAAW,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,IACpE,GAAI,OAAO,KAAK,2BAA2B,WACvC,EAAE,wBAAwB,KAAK,uBAAuB,IACtD,CAAC;AAAA,EACP,CAAC,IAAI;AACL,SAAO;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,MACR,WAAW;AAAA,MACX,UAAU;AAAA,QACR,QAAQ;AAAA,QACR,oBAAoB,gCAAgC,SAAS;AAAA,QAC7D,0BAA0B;AAAA,QAC1B,2BAA2B,+BAA+B,SAAS;AAAA,QACnE,GAAI,cAAc,UAAU;AAAA,UAC1B,kBAAkB;AAAA,YAChB,kBAAkB;AAAA,YAClB,WAAW,SAAS,6BAA6B;AAAA,YACjD,WAAW,SAAS,6BAA6B;AAAA,YACjD,QAAQ,OAAO,SAAS,8BAA8B,WAAW,YAAqB;AAAA,YACtF,WAAW,SAAS,8BAA8B;AAAA,UACpD;AAAA,QACF,IAAI,CAAC;AAAA,QACL,aAAa;AAAA,UACX,eAAe,SAAS,iBAAiB,CAAC;AAAA,UAC1C,WAAW,SAAS,aAAa,CAAC;AAAA,UAClC,OAAO,SAAS,SAAS,CAAC;AAAA,QAC5B;AAAA,MACF;AAAA,MACA,YAAY;AAAA,MACZ,iBAAiB,UAAU;AAAA,MAC3B,UAAU,UAAU,WAAW;AAAA,MAC/B,SAAS,UAAU,WAAW;AAAA,IAChC;AAAA,IACA,UAAU;AAAA,MACR,QAAQ,UACJ,GAAG,OAAO,UAAU,sDAAsD,mEAC1E;AAAA,MACJ,QAAQ,OAAO,oBAAoB;AAAA,IACrC;AAAA,IACA,UAAU,UAAU,CAAC,IAAI,UAAU,kBAAkB,cAAc,CAAC;AAAA,MAClE,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC,IAAI,CAAC;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEO,SAAS,sBAAsB,QAAqC,UAAyB;AAClG,MAAI,UAAU;AACZ,cAAU,YAAY,sBAAsB,MAAM,CAAC;AACnD;AAAA,EACF;AACA,EAAM,QAAQ,8DAA8D;AAC5E,MAAI,OAAO,SAAS,aAAa,KAAM,CAAM,KAAK,eAAe,OAAO,SAAS,QAAQ,EAAE;AAC3F,EAAM,KAAK,eAAe,OAAO,SAAS,eAAe,EAAE;AAC3D,MAAI,OAAO,SAAS,QAAS,CAAM,KAAK,eAAe,OAAO,SAAS,OAAO,EAAE;AAChF,EAAM,KAAK,eAAe,OAAO,SAAS,UAAU,SAAS,GAAG,OAAO,SAAS,WAAW,OAAO,iBAAiB,EAAE,EAAE;AACvH,EAAM,KAAK,gBAAgB,KAAK,UAAU,OAAO,SAAS,SAAS,CAAC,EAAE;AACtE,aAAW,WAAW,OAAO,SAAU,CAAM,KAAK,GAAG,QAAQ,IAAI,KAAK,QAAQ,OAAO,EAAE;AACzF;;;AChHO,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;;;AbiEnC,IAAM,aAAa;AACnB,IAAM,cAAc;AAKpB,SAAS,iBAAiB,UAAmC,aAG3D;AAEA,QAAM,OAAO,SAAS;AACtB,MAAI,MAAM;AACR,WAAO,EAAE,aAAa,MAAM,QAAQ,OAAO;AAAA,EAC7C;AAEA,QAAM,SAAS,QAAQ,IAAI,qBAAqB;AAChD,MAAI,QAAQ;AACV,WAAO,EAAE,aAAa,QAAQ,QAAQ,MAAM;AAAA,EAC9C;AAEA,QAAM,SAAS,YAAY,aAAa;AACxC,MAAI,OAAO,oBAAoB;AAC7B,WAAO,EAAE,aAAa,OAAO,oBAAoB,QAAQ,SAAS;AAAA,EACpE;AAEA,QAAM,IAAI;AAAA,IACR,UAAU;AAAA,IACV;AAAA,EACF;AACF;AA4CA,SAAS,oBAAoB,MAAsB;AACjD,QAAM,QAAQ,gBAAgB,KAAK,KAAK,KAAK,CAAC;AAC9C,MAAI,CAAC,MAAO,OAAM,IAAI,SAAS,UAAU,kBAAkB,uBAAuB,IAAI,8BAA8B;AACpH,QAAM,QAAQ,OAAO,MAAM,CAAC,CAAC;AAC7B,QAAM,SAAS,OAAO,MAAM,CAAC,CAAC;AAC9B,MAAI,SAAS,KAAK,UAAU,EAAG,OAAM,IAAI,SAAS,UAAU,kBAAkB,uBAAuB,IAAI,gCAAgC;AACzI,QAAM,MAAM,CAAC,GAAW,MAAsB,MAAM,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC;AACxE,QAAM,UAAU,IAAI,OAAO,MAAM;AACjC,SAAO,GAAG,QAAQ,OAAO,IAAI,SAAS,OAAO;AAC/C;AAEA,SAAS,kBACP,WACA,QAC4E;AAC5E,QAAM,WAAW,+BAA+B,WAAW,EAAE,aAAa,OAAO,YAAY,KAAK,CAAC;AACnG,QAAM,cAAc,OAAO,gBAAgB,OAAO,OAAO,oBAAoB,OAAO,IAAI,IAAI,SAAS;AACrG,QAAM,aAAa,OAAO,cAAc,SAAS;AACjD,MAAI;AACJ,MAAI,UAAU,aAAa,wBAAwB;AACjD,UAAM,CAAC,QAAQ,GAAG,SAAS,CAAC,IAAI,YAAY,MAAM,GAAG,EAAE,IAAI,MAAM;AACjE,UAAM,OAAO,UAAU,SAAS,cAAc,QAAQ,SAAS,cAAc;AAC7E,WAAO,EAAE,KAAK;AAAA,EAChB,OAAO;AACL,WAAO,EAAE,aAAa,WAAW;AAAA,EACnC;AACA,2BAAyB,WAAW,EAAE,aAAa,WAAW,CAAC;AAC/D,SAAO,EAAE,MAAM,aAAa,WAAW;AACzC;AAGA,SAAS,qBAAqB,MAAwD;AACpF,QAAM,EAAE,QAAQ,GAAG,KAAK,IAAI;AAC5B,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,MAAM,QAAQ,MAAM,IAAI,EAAE,iBAAiB,OAAO,IAAI,CAAC;AAAA,EAC7D;AACF;AAEA,eAAe,oBACb,QACA,MACA,QACA,SACA,MACA,sBAKC;AACD,QAAM,YAAY,MAAM,sBAAsB;AAAA,IAC5C,QAAQ;AAAA,IACR,OAAO,OAAO;AAAA,IACd,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,KAAK;AAAA,EACd,CAAC;AACD,MAAI,SAAS,OAAQ,8BAA6B,SAAS;AAAA,MACtD,6BAA4B,WAAW,CAAC;AAC7C,QAAM,QAAQ,kBAAkB,WAAW,MAAM;AACjD,SAAO;AAAA,IACL;AAAA,IACA,UAAU,EAAE,aAAa,MAAM,aAAa,YAAY,MAAM,WAAW;AAAA,IACzE,MAAM;AAAA,MACJ,QAAQ,OAAO;AAAA,MACf,GAAI,SAAS,SAAS,EAAE,QAAQ,CAAE,OAA2B,KAAK,EAAE,IAAI,CAAC;AAAA,MACzE,GAAG,MAAM;AAAA,MACT,GAAI,UAAU,UAAU,EAAE,SAAS,UAAU,QAAQ,IAAI,CAAC;AAAA,IAC5D;AAAA,EACF;AACF;AAEA,eAAsB,oBACpB,QACA,MACA,QACA,SACA,MACsC;AACtC,QAAM,EAAE,WAAW,KAAK,IAAI,MAAM,oBAAoB,QAAQ,MAAM,QAAQ,SAAS,MAAM,IAAI;AAC/F,SAAO,4BAA4B,WAAW,SAAS,IAAI;AAC7D;AAOA,eAAsB,iBACpB,QACA,aACA,QACA,SACA,OAAyB,CAAC,GACA;AAC1B,QAAM,YAAY,KAAK,aAAa,IAAI,UAAU;AAElD,QAAM,WAAW,MAAM,oBAAoB,QAAQ,QAAQ,QAAQ,SAAS,MAAM,IAAI;AACtF,QAAM,EAAE,UAAU,IAAI;AACtB,QAAM,WAAW,UAAU;AAC3B,iBAAe,SAAS,uBAAuB;AAAA,IAC7C,MAAM;AAAA,IACN,OAAO,UAAU;AAAA,IACjB,UAAU,UAAU;AAAA,IACpB,SAAS,UAAU;AAAA,IACnB,cAAc;AAAA,EAChB,CAAC;AAGD,QAAM,WAAoC;AAAA,IACxC,GAAG,SAAS;AAAA,IACZ,cAAc;AAAA,EAChB;AAGA,QAAM,aAAa,+BAA+B,OAAO,MAAM,KAAK,iBAAiB,SAAS,CAAC,GAAG,OAAO,cAAc,mBAAmB,OAAO,WAAW,KAAK,EAAE,GAAG,OAAO,OAAO,WAAW,OAAO,IAAI,KAAK,EAAE,GAAG,OAAO,aAAa,iBAAiB,OAAO,UAAU,KAAK,EAAE;AACjR,QAAM,OAAO,UAAU,OAAO;AAAA,IAC5B;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,WAAW;AAAA,MACT,UAAU;AAAA,MACV,QAAQ,OAAO;AAAA,MACf,OAAO,UAAU;AAAA,MACjB,SAAS,UAAU;AAAA,MACnB,SAAS,UAAU;AAAA,MACnB,eAAe;AAAA,MACf;AAAA,MACA,UAAU;AAAA,QACR,aAAa,SAAS;AAAA,QACtB,MAAM,SAAS;AAAA,QACf,YAAY,SAAS;AAAA,MACvB;AAAA,IACF;AAAA,EACF,CAAC;AAGD,YAAU,OAAO,KAAK,IAAI,EAAE,QAAQ,aAAa,CAAC;AAGlD,QAAM,SAAS,IAAI,cAAc;AAAA,IAC/B;AAAA,IACA;AAAA,IACA,OAAO,KAAK;AAAA,IACZ,WAAW,KAAK,sBAAsB;AAAA,EACxC,CAAC;AAED,MAAI;AACF,UAAM,YAAY,MAAM,sBAAsB;AAAA,MAC5C,QAAQ,IAAI,0BAA0B,MAAM;AAAA,MAC5C;AAAA,MACA,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,WAAW;AAAA,MACX,QAAQ,OAAO;AAAA,MACf,OAAO,UAAU;AAAA,MACjB,gBAAgB;AAAA,MAChB,OAAO,qBAAqB,SAAS,IAAI;AAAA,IAC3C,CAAC;AACD,UAAM,YAAY,UAAU,KAAK,aAAa,IAAI,CAAC,SAAS,EAAE,MAAM,SAAkB,KAAK,WAAW,aAAa,EAAE;AACrH,UAAM,WAAgC,UAAU,iBAAiB,CAAC,UAAU,cAAc,IAAI,CAAC;AAC/F,mBAAe,SAAS,wBAAwB;AAAA,MAC9C,eAAe,KAAK;AAAA,MACpB,iBAAiB,UAAU,WAAW;AAAA,MACtC,QAAQ,UAAU,KAAK;AAAA,IACzB,CAAC;AAED,WAAO;AAAA,MACL,SAAS,UAAU,WAAW;AAAA,MAC9B,eAAe,KAAK;AAAA,MACpB,MAAM;AAAA,MACN,OAAO,iBAAiB,SAAS;AAAA,MACjC,cAAc;AAAA,MACd,QAAQ,UAAU,KAAK;AAAA,MACvB;AAAA,MACA,SAAS,EAAE,cAAc,SAAS,SAAS,aAAa,YAAY,SAAS,SAAS,WAAW;AAAA,MACjG,GAAI,SAAS,SAAS,IAAI,EAAE,SAAS,IAAI,CAAC;AAAA,IAC5C;AAAA,EACF,SAAS,KAAc;AAErB,UAAM,UAAU,eAAe,WAAW,IAAI,OAAO,UAAU;AAC/D,UAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAE9D,QAAI,CAAC,UAAU,IAAI,KAAK,EAAE,GAAG,eAAe;AAC1C,gBAAU,OAAO,KAAK,IAAI,EAAE,QAAQ,UAAU,OAAO,EAAE,MAAM,SAAS,SAAS,OAAO,EAAE,CAAC;AACzF,8BAAwB,EAAE,WAAW,cAAc,KAAK,cAAc,MAAM,WAAW,CAAC,GAAG,QAAQ,UAAU,OAAO,EAAE,MAAM,SAAS,SAAS,OAAO,EAAE,CAAC;AAAA,IAC1J;AACA,mBAAe,SAAS,6BAA6B,EAAE,SAAS,KAAK,IAAI,qBAAqB,UAAU,IAAI,KAAK,EAAE,GAAG,kBAAkB,QAAW,YAAY,QAAQ,GAAG,OAAO;AAGjL,UAAM;AAAA,EACR;AACF;AAUA,eAAsB,iBACpB,QACA,aACA,QACA,SACA,OAAyB,CAAC,GACA;AAC1B,QAAM,YAAY,KAAK,aAAa,IAAI,UAAU;AAElD,QAAM,WAAW,MAAM,oBAAoB,QAAQ,QAAQ,QAAQ,SAAS,MAAM,IAAI;AACtF,QAAM,EAAE,UAAU,IAAI;AACtB,QAAM,WAAW,UAAU;AAC3B,iBAAe,SAAS,uBAAuB;AAAA,IAC7C,MAAM;AAAA,IACN,OAAO,UAAU;AAAA,IACjB,UAAU,UAAU;AAAA,IACpB,SAAS,UAAU;AAAA,IACnB,cAAc;AAAA,EAChB,CAAC;AAED,QAAM,WAAoC;AAAA,IACxC,GAAG,SAAS;AAAA,IACZ,cAAc;AAAA,EAChB;AAEA,QAAM,aAAa,6BAA6B,OAAO,KAAK,cAAc,OAAO,MAAM,KAAK,iBAAiB,SAAS,CAAC,GAAG,OAAO,cAAc,mBAAmB,OAAO,WAAW,KAAK,EAAE,GAAG,OAAO,OAAO,WAAW,OAAO,IAAI,KAAK,EAAE,GAAG,OAAO,aAAa,iBAAiB,OAAO,UAAU,KAAK,EAAE;AACzS,QAAM,OAAO,UAAU,OAAO;AAAA,IAC5B;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,WAAW;AAAA,MACT,UAAU;AAAA,MACV,QAAQ,OAAO;AAAA,MACf,OAAO,UAAU;AAAA,MACjB,SAAS,UAAU;AAAA,MACnB,SAAS,UAAU;AAAA,MACnB,aAAa,OAAO;AAAA,MACpB,eAAe;AAAA,MACf;AAAA,MACA,UAAU;AAAA,QACR,QAAQ,SAAS;AAAA,QACjB,aAAa,SAAS;AAAA,QACtB,MAAM,SAAS;AAAA,QACf,YAAY,SAAS;AAAA,MACvB;AAAA,IACF;AAAA,EACF,CAAC;AAED,YAAU,OAAO,KAAK,IAAI,EAAE,QAAQ,aAAa,CAAC;AAElD,QAAM,SAAS,IAAI,cAAc;AAAA,IAC/B;AAAA,IACA;AAAA,IACA,OAAO,KAAK;AAAA,IACZ,WAAW,KAAK,sBAAsB;AAAA,EACxC,CAAC;AAED,MAAI;AACF,UAAM,YAAY,MAAM,sBAAsB;AAAA,MAC5C,QAAQ,IAAI,0BAA0B,MAAM;AAAA,MAC5C;AAAA,MACA,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,WAAW;AAAA,MACX,QAAQ,OAAO;AAAA,MACf,OAAO,UAAU;AAAA,MACjB,gBAAgB;AAAA,MAChB,OAAO,qBAAqB,SAAS,IAAI;AAAA,IAC3C,CAAC;AACD,UAAM,YAAY,UAAU,KAAK,aAAa,IAAI,CAAC,SAAS,EAAE,MAAM,SAAkB,KAAK,WAAW,aAAa,EAAE;AACrH,UAAM,WAAgC,UAAU,iBAAiB,CAAC,UAAU,cAAc,IAAI,CAAC;AAC/F,mBAAe,SAAS,wBAAwB;AAAA,MAC9C,eAAe,KAAK;AAAA,MACpB,iBAAiB,UAAU,WAAW;AAAA,MACtC,QAAQ,UAAU,KAAK;AAAA,IACzB,CAAC;AAED,WAAO;AAAA,MACL,SAAS,UAAU,WAAW;AAAA,MAC9B,eAAe,KAAK;AAAA,MACpB,MAAM;AAAA,MACN,OAAO,iBAAiB,SAAS;AAAA,MACjC,cAAc;AAAA,MACd,QAAQ,UAAU,KAAK;AAAA,MACvB;AAAA,MACA,SAAS,EAAE,cAAc,SAAS,SAAS,aAAa,YAAY,SAAS,SAAS,WAAW;AAAA,MACjG,GAAI,SAAS,SAAS,IAAI,EAAE,SAAS,IAAI,CAAC;AAAA,IAC5C;AAAA,EACF,SAAS,KAAc;AACrB,UAAM,UAAU,eAAe,WAAW,IAAI,OAAO,UAAU;AAC/D,UAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAE9D,QAAI,CAAC,UAAU,IAAI,KAAK,EAAE,GAAG,eAAe;AAC1C,gBAAU,OAAO,KAAK,IAAI,EAAE,QAAQ,UAAU,OAAO,EAAE,MAAM,SAAS,SAAS,OAAO,EAAE,CAAC;AACzF,8BAAwB,EAAE,WAAW,cAAc,KAAK,cAAc,MAAM,WAAW,CAAC,GAAG,QAAQ,UAAU,OAAO,EAAE,MAAM,SAAS,SAAS,OAAO,EAAE,CAAC;AAAA,IAC1J;AACA,mBAAe,SAAS,6BAA6B,EAAE,SAAS,KAAK,IAAI,qBAAqB,UAAU,IAAI,KAAK,EAAE,GAAG,kBAAkB,QAAW,YAAY,QAAQ,GAAG,OAAO;AAEjL,UAAM;AAAA,EACR;AACF;AAIO,SAAS,mBAAmB,OAAyB,CAAC,GAAY;AACvE,QAAM,QAAQ,IAAIC,SAAQ,OAAO,EAAE,YAAY,2BAA2B;AAE1E,QACG,QAAQ,MAAM,EACd,YAAY,iCAAiC,EAC7C,eAAe,mBAAmB,mBAAmB,EACrD,OAAO,mBAAmB,cAAc,mBAAmB,EAC3D,OAAO,mBAAmB,oCAAoC,EAC9D,OAAO,uBAAuB,yCAAyC,EACvE,OAAO,0BAA0B,6DAA6D,EAC9F,UAAU,IAAI,OAAO,iBAAiB,kDAAkD,EAAE,SAAS,CAAC,EACpG,OAAO,6BAA6B,2DAA2D,EAC/F,OAAO,aAAa,8DAA8D,EAClF,OAAO,OAAO,MAAM,QAAQ;AAC3B,UAAM,WAAW,WAAW,GAAG;AAC/B,UAAM,WAAW,YAAY,GAAG;AAChC,UAAM,cAAc,KAAK,eAAe,IAAI,gBAAgB;AAE5D,QAAI;AAEF,YAAM,OAAO,kBAAkB,UAAU,WAAW;AACpD,YAAM,UAAU,KAAK;AACrB,YAAM,EAAE,YAAY,IAAI,iBAAiB,UAAU,WAAW;AAE9D,YAAM,SAA0B;AAAA,QAC9B,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK;AAAA,QACZ,SAAS,KAAK;AAAA,QACd,SAAS,KAAK;AAAA,QACd,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,YAAY,KAAK;AAAA,MACnB;AACA,UAAI,KAAK,WAAW,MAAM;AACxB,8BAAsB,MAAM,oBAAoB,QAAQ,QAAQ,KAAK,QAAQ,SAAS,IAAI,GAAG,QAAQ;AACrG;AAAA,MACF;AAGA,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA;AAAA,MACF;AACA,kCAA4B;AAAA,QAC1B,YAAY;AAAA,QACZ,iBAAiB;AAAA,QACjB,WAAW,OAAO,MAAM;AAAA,QACxB,GAAI,OAAO,MAAM,aAAa,SAAY,EAAE,UAAU,OAAO,MAAM,SAAS,IAAI,CAAC;AAAA,QACjF,GAAI,OAAO,MAAM,UAAU,EAAE,SAAS,OAAO,MAAM,QAAQ,IAAI,CAAC;AAAA,QAChE,YAAY,OAAO,QAAQ;AAAA,QAC3B,cAAc,OAAO,QAAQ;AAAA,QAC7B,gBAAgB,OAAO,UAAU;AAAA,QACjC,eAAe,OAAO,UAAU,UAAU;AAAA,MAC5C,CAAC;AACD,UAAI,OAAO,UAAU,OAAQ,6BAA4B;AAGzD,UAAI,UAAU;AACZ,kBAAU,YAAY,OAAO,WAAW,cAAc,yBAAyB,wBAAwB;AAAA,UACrG,SAAS,OAAO;AAAA,UAChB,eAAe,OAAO;AAAA,UACtB,MAAM,OAAO;AAAA,UACb,OAAO,OAAO;AAAA,UACd,cAAc,OAAO;AAAA,UACrB,QAAQ,OAAO;AAAA,UACf,WAAW,OAAO;AAAA,UAClB,SAAS,OAAO;AAAA,UAChB,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,QACzD,GAAG;AAAA,UACD,GAAI,OAAO,UAAU,SAAS,IAC1B,CAAC,EAAE,SAAS,qBAAqB,OAAO,UAAU,CAAC,EAAG,GAAG,WAAW,aAAa,gCAAgC,CAAC,IAClH,CAAC;AAAA,UACL,EAAE,SAAS,sBAAsB,OAAO,OAAO,WAAW,aAAa,oBAAoB;AAAA,QAC7F,CAAC,CAAC;AAAA,MACJ,OAAO;AACL,QAAM,QAAQ,OAAO,WAAW,cAAc,iCAAiC,4BAA4B;AAC3G,QAAM,KAAK,cAAc,OAAO,OAAO,EAAE;AACzC,QAAM,KAAK,cAAc,OAAO,MAAM,QAAQ,OAAO,MAAM,GAAG,GAAG,OAAO,MAAM,UAAU,KAAK,OAAO,MAAM,OAAO,MAAM,EAAE,EAAE;AAC3H,mBAAW,OAAO,OAAO,WAAW;AAClC,UAAM,KAAK,cAAc,IAAI,GAAG,EAAE;AAAA,QACpC;AACA,mBAAW,WAAW,OAAO,YAAY,CAAC,GAAG;AAC3C,UAAM,KAAK,YAAY,QAAQ,OAAO,EAAE;AAAA,QAC1C;AACA,YAAI,OAAO,UAAU,SAAS,GAAG;AAC/B,UAAM,KAAK;AAAA,4BAA+B,OAAO,UAAU,CAAC,EAAG,GAAG,EAAE;AAAA,QACtE,OAAO;AACL,UAAM,KAAK;AAAA,2BAA8B,OAAO,OAAO,SAAS;AAAA,QAClE;AAAA,MACF;AAAA,IACF,SAAS,KAAc;AACrB,UAAI,eAAe,UAAU;AAC3B,YAAI,UAAU;AACZ,oBAAU,UAAU,qBAAqB,IAAI,MAAM,IAAI,SAAS,IAAI,OAAO,CAAC;AAAA,QAC9E,OAAO;AACL,UAAM,MAAM,IAAI,OAAO;AAAA,QACzB;AACA,gBAAQ,WAAW;AACnB;AAAA,MACF;AACA,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,UAAI,UAAU;AACZ,kBAAU,UAAU,qBAAqB,UAAU,mBAAmB,GAAG,CAAC;AAAA,MAC5E,OAAO;AACL,QAAM,MAAM,GAAG;AAAA,MACjB;AACA,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,yCAAyC,EACrD,eAAe,iBAAiB,4BAA4B,EAC5D,eAAe,mBAAmB,kBAAkB,EACpD,OAAO,mBAAmB,cAAc,mBAAmB,EAC3D,OAAO,mBAAmB,oCAAoC,EAC9D,OAAO,uBAAuB,yCAAyC,EACvE,OAAO,0BAA0B,6DAA6D,EAC9F,UAAU,IAAI,OAAO,iBAAiB,kDAAkD,EAAE,SAAS,CAAC,EACpG,OAAO,6BAA6B,2DAA2D,EAC/F,OAAO,aAAa,8DAA8D,EAClF,OAAO,OAAO,MAAM,QAAQ;AAC3B,UAAM,WAAW,WAAW,GAAG;AAC/B,UAAM,WAAW,YAAY,GAAG;AAChC,UAAM,cAAc,KAAK,eAAe,IAAI,gBAAgB;AAE5D,QAAI;AAEF,YAAM,OAAO,kBAAkB,UAAU,WAAW;AACpD,YAAM,UAAU,KAAK;AACrB,YAAM,EAAE,YAAY,IAAI,iBAAiB,UAAU,WAAW;AAE9D,YAAM,SAA0B;AAAA,QAC9B,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK;AAAA,QACZ,SAAS,KAAK;AAAA,QACd,SAAS,KAAK;AAAA,QACd,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,YAAY,KAAK;AAAA,MACnB;AACA,UAAI,KAAK,WAAW,MAAM;AACxB,8BAAsB,MAAM,oBAAoB,QAAQ,QAAQ,KAAK,QAAQ,SAAS,IAAI,GAAG,QAAQ;AACrG;AAAA,MACF;AAGA,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA;AAAA,MACF;AACA,kCAA4B;AAAA,QAC1B,YAAY;AAAA,QACZ,iBAAiB;AAAA,QACjB,WAAW,OAAO,MAAM;AAAA,QACxB,GAAI,OAAO,MAAM,aAAa,SAAY,EAAE,UAAU,OAAO,MAAM,SAAS,IAAI,CAAC;AAAA,QACjF,GAAI,OAAO,MAAM,UAAU,EAAE,SAAS,OAAO,MAAM,QAAQ,IAAI,CAAC;AAAA,QAChE,YAAY,OAAO,QAAQ;AAAA,QAC3B,cAAc,OAAO,QAAQ;AAAA,QAC7B,gBAAgB,OAAO,UAAU;AAAA,QACjC,eAAe,OAAO,UAAU,UAAU;AAAA,MAC5C,CAAC;AACD,UAAI,OAAO,UAAU,OAAQ,6BAA4B;AAGzD,UAAI,UAAU;AACZ,kBAAU,YAAY,OAAO,WAAW,cAAc,yBAAyB,wBAAwB;AAAA,UACrG,SAAS,OAAO;AAAA,UAChB,eAAe,OAAO;AAAA,UACtB,MAAM,OAAO;AAAA,UACb,OAAO,OAAO;AAAA,UACd,cAAc,OAAO;AAAA,UACrB,QAAQ,OAAO;AAAA,UACf,WAAW,OAAO;AAAA,UAClB,SAAS,OAAO;AAAA,UAChB,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,QACzD,GAAG;AAAA,UACD,GAAI,OAAO,UAAU,SAAS,IAC1B,CAAC,EAAE,SAAS,qBAAqB,OAAO,UAAU,CAAC,EAAG,GAAG,WAAW,aAAa,gCAAgC,CAAC,IAClH,CAAC;AAAA,UACL,EAAE,SAAS,sBAAsB,OAAO,OAAO,WAAW,aAAa,oBAAoB;AAAA,QAC7F,CAAC,CAAC;AAAA,MACJ,OAAO;AACL,QAAM,QAAQ,OAAO,WAAW,cAAc,8BAA8B,sBAAsB;AAClG,QAAM,KAAK,cAAc,OAAO,OAAO,EAAE;AACzC,QAAM,KAAK,cAAc,OAAO,MAAM,QAAQ,OAAO,MAAM,GAAG,GAAG,OAAO,MAAM,UAAU,KAAK,OAAO,MAAM,OAAO,MAAM,EAAE,EAAE;AAC3H,QAAM,KAAK,cAAc,KAAK,KAAK,EAAE;AACrC,mBAAW,OAAO,OAAO,WAAW;AAClC,UAAM,KAAK,cAAc,IAAI,GAAG,EAAE;AAAA,QACpC;AACA,mBAAW,WAAW,OAAO,YAAY,CAAC,GAAG;AAC3C,UAAM,KAAK,YAAY,QAAQ,OAAO,EAAE;AAAA,QAC1C;AACA,YAAI,OAAO,UAAU,SAAS,GAAG;AAC/B,UAAM,KAAK;AAAA,4BAA+B,OAAO,UAAU,CAAC,EAAG,GAAG,EAAE;AAAA,QACtE,OAAO;AACL,UAAM,KAAK;AAAA,2BAA8B,OAAO,OAAO,SAAS;AAAA,QAClE;AAAA,MACF;AAAA,IACF,SAAS,KAAc;AACrB,UAAI,eAAe,UAAU;AAC3B,YAAI,UAAU;AACZ,oBAAU,UAAU,qBAAqB,IAAI,MAAM,IAAI,SAAS,IAAI,OAAO,CAAC;AAAA,QAC9E,OAAO;AACL,UAAM,MAAM,IAAI,OAAO;AAAA,QACzB;AACA,gBAAQ,WAAW;AACnB;AAAA,MACF;AACA,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,UAAI,UAAU;AACZ,kBAAU,UAAU,qBAAqB,UAAU,mBAAmB,GAAG,CAAC;AAAA,MAC5E,OAAO;AACL,QAAM,MAAM,GAAG;AAAA,MACjB;AACA,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;;;AcrpBA,SAAS,WAAAC,gBAAe;AAkFxB,IAAM,yBAAyB;AAI/B,IAAMC,cAAa;AACnB,IAAMC,eAAc;AAEpB,SAAS,wBAAwB,OAA0B;AACzD,MAAI,OAAO,UAAU,YAAY,MAAO,QAAO,CAAC,KAAK;AACrD,SAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,OAAO,CAAC,SAAyB,OAAO,SAAS,YAAY,KAAK,SAAS,CAAC,IAAI,CAAC;AACvH;AAGA,SAAS,qBAAqB,MAAwD;AACpF,QAAM,EAAE,UAAU,QAAQ,GAAG,KAAK,IAAI;AACtC,QAAM,kBAAkB,CAAC,GAAG,oBAAI,IAAI;AAAA,IAClC,GAAG,wBAAwB,QAAQ;AAAA,IACnC,GAAG,wBAAwB,MAAM;AAAA,EACnC,CAAC,CAAC;AACF,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,gBAAgB,SAAS,IAAI,EAAE,gBAAgB,IAAI,CAAC;AAAA,EAC1D;AACF;AAEA,SAASC,kBAAiB,UAAmC,aAG3D;AACA,QAAM,OAAO,SAAS;AACtB,MAAI,MAAM;AACR,WAAO,EAAE,aAAa,MAAM,QAAQ,OAAO;AAAA,EAC7C;AAEA,QAAM,SAAS,QAAQ,IAAI,qBAAqB;AAChD,MAAI,QAAQ;AACV,WAAO,EAAE,aAAa,QAAQ,QAAQ,MAAM;AAAA,EAC9C;AAEA,QAAM,SAAS,YAAY,aAAa;AACxC,MAAI,OAAO,oBAAoB;AAC7B,WAAO,EAAE,aAAa,OAAO,oBAAoB,QAAQ,SAAS;AAAA,EACpE;AAEA,QAAM,IAAI;AAAA,IACR,UAAU;AAAA,IACV;AAAA,EACF;AACF;AAIA,SAAS,cAAc,OAAwB;AAC7C,QAAM,WAAW,OAAO,UAAU,WAAW,QAAQ,OAAO,SAAS,OAAO,KAAK,GAAG,EAAE;AACtF,MAAI,CAAC,OAAO,UAAU,QAAQ,KAAK,YAAY,GAAG;AAChD,UAAM,IAAI;AAAA,MACR,UAAU;AAAA,MACV,qBAAqB,OAAO,KAAK,CAAC;AAAA,IACpC;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,wBACb,QACA,QACA,SACA,MACA,sBACA;AACA,QAAM,YAAY,MAAM,sBAAsB;AAAA,IAC5C,QAAQ;AAAA,IACR,OAAO,OAAO;AAAA,IACd,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,KAAK;AAAA,EACd,CAAC;AACD,QAAM,WAAW,+BAA+B,WAAW;AAAA,IACzD,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ,CAAC;AACD,QAAM,WAAW,OAAO,aAAa,SAAY,SAAS,WAAY,cAAc,OAAO,QAAQ;AACnG,QAAM,cAAc,OAAO,eAAe,SAAS;AACnD,QAAM,aAAa,OAAO,cAAc,SAAS;AACjD,+BAA6B,SAAS;AACtC,2BAAyB,WAAW;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,MACJ,QAAQ,OAAO;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,UAAU,aAAa,yBAAyB,EAAE,cAAc,aAAa,IAAI,CAAC;AAAA,MACtF,GAAI,UAAU,UAAU,EAAE,SAAS,UAAU,QAAQ,IAAI,CAAC;AAAA,IAC5D;AAAA,EACF;AACF;AAEA,eAAe,6BACb,QACA,QACA,SACA,MACA,sBACA;AACA,QAAM,YAAY,MAAM,sBAAsB;AAAA,IAC5C,QAAQ;AAAA,IACR,OAAO,OAAO;AAAA,IACd,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,KAAK;AAAA,EACd,CAAC;AACD,QAAM,WAAW,+BAA+B,WAAW;AAAA,IACzD,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ,CAAC;AACD,QAAM,WAAW,OAAO,aAAa,SAAY,SAAS,WAAY,cAAc,OAAO,QAAQ;AACnG,QAAM,cAAc,OAAO,eAAe,SAAS;AACnD,QAAM,aAAa,OAAO,cAAc,SAAS;AACjD,QAAM,aAAa,wBAAwB;AAAA,IACzC,UAAU,UAAU;AAAA,IACpB,SAAS,UAAU;AAAA,IACnB,QAAQ,CAAC,GAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,IAAI,CAAC,GAAI,GAAI,OAAO,UAAU,CAAC,CAAE;AAAA,IAC1E,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO;AAAA,IACf,MAAM,OAAO;AAAA,EACf,CAAC;AACD,QAAM,sBAAsB,WAAW,WAAW,OAAO,SACrD,WAAW,WAAW,OAAO,SAC7B,WAAW,WAAW,OAAO;AACjC,MAAI,wBAAwB,EAAG,8BAA6B,SAAS;AAAA,MAChE,6BAA4B,WAAW,WAAW,WAAW,OAAO,MAAM;AAC/E,2BAAyB,WAAW;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,MACJ,QAAQ,OAAO;AAAA,MACf,GAAG,WAAW;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,UAAU,UAAU,EAAE,SAAS,UAAU,QAAQ,IAAI,CAAC;AAAA,IAC5D;AAAA,EACF;AACF;AAEA,eAAsB,oBACpB,QACA,MACA,QACA,SACA,MACsC;AACtC,QAAM,WAAW,SAAS,SACtB,MAAM,wBAAwB,QAA2B,QAAQ,SAAS,MAAM,IAAI,IACpF,MAAM,6BAA6B,QAA4B,QAAQ,SAAS,MAAM,IAAI;AAC9F,SAAO,4BAA4B,SAAS,WAAW,SAAS,SAAS,IAAI;AAC/E;AAGA,eAAsB,iBACpB,QACA,aACA,QACA,SACA,OAAyB,CAAC,GACJ;AACtB,QAAM,YAAY,KAAK,aAAa,IAAI,UAAU;AAElD,QAAM,WAAW,MAAM,wBAAwB,QAAQ,QAAQ,SAAS,MAAM,IAAI;AAClF,QAAM,EAAE,UAAU,aAAa,YAAY,UAAU,IAAI;AACzD,QAAM,WAAW,UAAU;AAC3B,iBAAe,SAAS,uBAAuB;AAAA,IAC7C,MAAM;AAAA,IACN,OAAO,UAAU;AAAA,IACjB,UAAU,UAAU;AAAA,IACpB,SAAS,UAAU;AAAA,IACnB,cAAc;AAAA,EAChB,CAAC;AAGD,QAAM,WAAoC;AAAA,IACxC,GAAG,SAAS;AAAA,IACZ,cAAc;AAAA,EAChB;AAGA,QAAM,aAAa,+BAA+B,OAAO,MAAM,KAAK,iBAAiB,SAAS,CAAC,eAAe,QAAQ,mBAAmB,WAAW,iBAAiB,UAAU;AAC/K,QAAM,OAAO,UAAU,OAAO;AAAA,IAC5B;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,WAAW;AAAA,MACT,UAAU;AAAA,MACV,QAAQ,OAAO;AAAA,MACf,OAAO,UAAU;AAAA,MACjB,SAAS,UAAU;AAAA,MACnB,SAAS,UAAU;AAAA,MACnB,eAAe;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAGD,YAAU,OAAO,KAAK,IAAI,EAAE,QAAQ,aAAa,CAAC;AAGlD,QAAM,SAAS,IAAI,cAAc;AAAA,IAC/B;AAAA,IACA;AAAA,IACA,OAAO,KAAK;AAAA,IACZ,WAAW,KAAK,sBAAsB;AAAA,EACxC,CAAC;AAED,MAAI;AACF,UAAM,YAAY,MAAM,sBAAsB;AAAA,MAC5C,QAAQ,IAAI,0BAA0B,MAAM;AAAA,MAC5C;AAAA,MACA,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,WAAW;AAAA,MACX,QAAQ,OAAO;AAAA,MACf,OAAO,UAAU;AAAA,MACjB,gBAAgB;AAAA,MAChB,OAAO,qBAAqB,SAAS,IAAI;AAAA,IAC3C,CAAC;AACD,UAAM,YAAY,UAAU,KAAK,aAAa,IAAI,CAAC,SAAS,EAAE,MAAM,SAAkB,KAAK,WAAW,YAAY,EAAE;AACpH,UAAM,WAAgC,UAAU,iBAAiB,CAAC,UAAU,cAAc,IAAI,CAAC;AAC/F,mBAAe,SAAS,wBAAwB;AAAA,MAC9C,eAAe,KAAK;AAAA,MACpB,iBAAiB,UAAU,WAAW;AAAA,MACtC,QAAQ,UAAU,KAAK;AAAA,IACzB,CAAC;AAED,WAAO;AAAA,MACL,SAAS,UAAU,WAAW;AAAA,MAC9B,eAAe,KAAK;AAAA,MACpB,MAAM;AAAA,MACN,OAAO,iBAAiB,SAAS;AAAA,MACjC,cAAc;AAAA,MACd,QAAQ,UAAU,KAAK;AAAA,MACvB,iBAAiB;AAAA,MACjB;AAAA,MACA,SAAS,EAAE,kBAAkB,UAAU,cAAc,aAAa,WAAW;AAAA,MAC7E,GAAI,SAAS,SAAS,IAAI,EAAE,SAAS,IAAI,CAAC;AAAA,IAC5C;AAAA,EACF,SAAS,KAAc;AACrB,UAAM,UAAU,eAAe,WAAW,IAAI,OAAO,UAAU;AAC/D,UAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAE9D,QAAI,CAAC,UAAU,IAAI,KAAK,EAAE,GAAG,eAAe;AAC1C,gBAAU,OAAO,KAAK,IAAI,EAAE,QAAQ,UAAU,OAAO,EAAE,MAAM,SAAS,SAAS,OAAO,EAAE,CAAC;AACzF,8BAAwB,EAAE,WAAW,cAAc,KAAK,cAAc,MAAM,WAAW,CAAC,GAAG,QAAQ,UAAU,OAAO,EAAE,MAAM,SAAS,SAAS,OAAO,EAAE,CAAC;AAAA,IAC1J;AACA,mBAAe,SAAS,6BAA6B,EAAE,SAAS,KAAK,IAAI,qBAAqB,UAAU,IAAI,KAAK,EAAE,GAAG,kBAAkB,QAAW,YAAY,QAAQ,GAAG,OAAO;AAEjL,UAAM;AAAA,EACR;AACF;AAKA,eAAsB,kBACpB,QACA,aACA,QACA,SACA,OAAyB,CAAC,GACJ;AACtB,QAAM,YAAY,KAAK,aAAa,IAAI,UAAU;AAElD,QAAM,WAAW,MAAM,6BAA6B,QAAQ,QAAQ,SAAS,MAAM,IAAI;AACvF,QAAM,EAAE,UAAU,aAAa,YAAY,UAAU,IAAI;AACzD,QAAM,WAAW,UAAU;AAC3B,QAAM,qBAAqB,SAAS;AACpC,iBAAe,SAAS,uBAAuB;AAAA,IAC7C,MAAM,mBAAmB;AAAA,IACzB,OAAO,UAAU;AAAA,IACjB,UAAU,UAAU;AAAA,IACpB,SAAS,UAAU;AAAA,IACnB,cAAc;AAAA,IACd,uBAAuB,mBAAmB,WAAW,OAAO;AAAA,IAC5D,uBAAuB,mBAAmB,WAAW,OAAO;AAAA,IAC5D,uBAAuB,mBAAmB,WAAW,OAAO;AAAA,EAC9D,CAAC;AAED,QAAM,WAAoC;AAAA,IACxC,GAAG,SAAS;AAAA,IACZ,cAAc;AAAA,EAChB;AAEA,QAAM,gBAAgB;AAAA,IACpB,GAAG,mBAAmB,WAAW,OAAO,IAAI,CAAC,QAAQ,WAAW,GAAG,EAAE;AAAA,IACrE,GAAG,mBAAmB,WAAW,OAAO,IAAI,CAAC,QAAQ,WAAW,GAAG,EAAE;AAAA,IACrE,GAAG,mBAAmB,WAAW,OAAO,IAAI,CAAC,QAAQ,WAAW,GAAG,EAAE;AAAA,EACvE,EAAE,KAAK,GAAG;AACV,QAAM,aAAa,yBAAyB,aAAa,cAAc,OAAO,MAAM,KAAK,iBAAiB,SAAS,CAAC,eAAe,QAAQ,mBAAmB,WAAW,iBAAiB,UAAU,WAAW,mBAAmB,IAAI;AACtO,QAAM,OAAO,UAAU,OAAO;AAAA,IAC5B;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,WAAW;AAAA,MACT,UAAU;AAAA,MACV,QAAQ,OAAO;AAAA,MACf,OAAO,UAAU;AAAA,MACjB,SAAS,UAAU;AAAA,MACnB,SAAS,UAAU;AAAA,MACnB,aAAa,mBAAmB,WAAW,OAAO,CAAC;AAAA,MACnD,cAAc,mBAAmB,WAAW;AAAA,MAC5C,cAAc,mBAAmB,WAAW;AAAA,MAC5C,cAAc,mBAAmB,WAAW;AAAA,MAC5C,cAAc,mBAAmB;AAAA,MACjC,eAAe;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAED,YAAU,OAAO,KAAK,IAAI,EAAE,QAAQ,aAAa,CAAC;AAElD,QAAM,SAAS,IAAI,cAAc;AAAA,IAC/B;AAAA,IACA;AAAA,IACA,OAAO,KAAK;AAAA,IACZ,WAAW,KAAK,sBAAsB;AAAA,EACxC,CAAC;AAED,MAAI;AACF,UAAM,YAAY,MAAM,sBAAsB;AAAA,MAC5C,QAAQ,IAAI,0BAA0B,MAAM;AAAA,MAC5C;AAAA,MACA,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,WAAW;AAAA,MACX,QAAQ,OAAO;AAAA,MACf,OAAO,UAAU;AAAA,MACjB,gBAAgB;AAAA,MAChB,OAAO,qBAAqB,SAAS,IAAI;AAAA,IAC3C,CAAC;AACD,UAAM,YAAY,UAAU,KAAK,aAAa,IAAI,CAAC,SAAS,EAAE,MAAM,SAAkB,KAAK,WAAW,YAAY,EAAE;AACpH,UAAM,WAAgC,UAAU,iBAAiB,CAAC,UAAU,cAAc,IAAI,CAAC;AAC/F,mBAAe,SAAS,wBAAwB;AAAA,MAC9C,eAAe,KAAK;AAAA,MACpB,iBAAiB,UAAU,WAAW;AAAA,MACtC,QAAQ,UAAU,KAAK;AAAA,IACzB,CAAC;AAED,WAAO;AAAA,MACL,SAAS,UAAU,WAAW;AAAA,MAC9B,eAAe,KAAK;AAAA,MACpB,MAAM;AAAA,MACN,OAAO,iBAAiB,SAAS;AAAA,MACjC,cAAc;AAAA,MACd,QAAQ,UAAU,KAAK;AAAA,MACvB,iBAAiB,mBAAmB;AAAA,MACpC;AAAA,MACA,SAAS,EAAE,kBAAkB,UAAU,cAAc,aAAa,WAAW;AAAA,MAC7E,GAAI,SAAS,SAAS,IAAI,EAAE,SAAS,IAAI,CAAC;AAAA,IAC5C;AAAA,EACF,SAAS,KAAc;AACrB,UAAM,UAAU,eAAe,WAAW,IAAI,OAAO,UAAU;AAC/D,UAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAE9D,QAAI,CAAC,UAAU,IAAI,KAAK,EAAE,GAAG,eAAe;AAC1C,gBAAU,OAAO,KAAK,IAAI,EAAE,QAAQ,UAAU,OAAO,EAAE,MAAM,SAAS,SAAS,OAAO,EAAE,CAAC;AACzF,8BAAwB,EAAE,WAAW,cAAc,KAAK,cAAc,MAAM,WAAW,CAAC,GAAG,QAAQ,UAAU,OAAO,EAAE,MAAM,SAAS,SAAS,OAAO,EAAE,CAAC;AAAA,IAC1J;AACA,mBAAe,SAAS,6BAA6B,EAAE,SAAS,KAAK,IAAI,qBAAqB,UAAU,IAAI,KAAK,EAAE,GAAG,kBAAkB,QAAW,YAAY,QAAQ,GAAG,OAAO;AAEjL,UAAM;AAAA,EACR;AACF;AAIO,SAAS,mBAAmB,OAAyB,CAAC,GAAY;AACvE,QAAM,QAAQ,IAAIC,SAAQ,OAAO,EAAE,YAAY,2BAA2B;AAE1E,QACG,QAAQ,MAAM,EACd,YAAY,iCAAiC,EAC7C,eAAe,mBAAmB,mBAAmB,EACrD,OAAO,mBAAmB,cAAc,mBAAmB,EAC3D,OAAO,mBAAmB,oCAAoC,EAC9D,OAAO,uBAAuB,yCAAyC,EACvE,OAAO,wBAAwB,8DAA8D,EAC7F,OAAO,0BAA0B,uDAAuD,EACxF,OAAO,6BAA6B,2DAA2D,EAC/F,OAAO,aAAa,8DAA8D,EAClF,OAAO,OAAO,MAAM,QAAQ;AAC3B,UAAM,WAAWH,YAAW,GAAG;AAC/B,UAAM,WAAWC,aAAY,GAAG;AAChC,UAAM,cAAc,KAAK,eAAe,IAAI,gBAAgB;AAE5D,QAAI;AACF,YAAM,OAAO,kBAAkB,UAAU,WAAW;AACpD,YAAM,UAAU,KAAK;AACrB,YAAM,EAAE,YAAY,IAAIC,kBAAiB,UAAU,WAAW;AAE9D,YAAM,SAA0B;AAAA,QAC9B,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK;AAAA,QACZ,SAAS,KAAK;AAAA,QACd,SAAS,KAAK;AAAA,QACd,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,cAAc,KAAK,QAAQ,EAAE,IAAI,CAAC;AAAA,QAChF,aAAa,KAAK;AAAA,QAClB,YAAY,KAAK;AAAA,MACnB;AACA,UAAI,KAAK,WAAW,MAAM;AACxB,8BAAsB,MAAM,oBAAoB,QAAQ,QAAQ,KAAK,QAAQ,SAAS,IAAI,GAAG,QAAQ;AACrG;AAAA,MACF;AACA,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA;AAAA,MACF;AACA,kCAA4B;AAAA,QAC1B,YAAY;AAAA,QACZ,iBAAiB;AAAA,QACjB,WAAW,OAAO,MAAM;AAAA,QACxB,GAAI,OAAO,MAAM,aAAa,SAAY,EAAE,UAAU,OAAO,MAAM,SAAS,IAAI,CAAC;AAAA,QACjF,GAAI,OAAO,MAAM,UAAU,EAAE,SAAS,OAAO,MAAM,QAAQ,IAAI,CAAC;AAAA,QAChE,kBAAkB,OAAO,QAAQ;AAAA,QACjC,YAAY,OAAO,QAAQ;AAAA,QAC3B,cAAc,OAAO,QAAQ;AAAA,QAC7B,gBAAgB,OAAO,UAAU;AAAA,QACjC,eAAe,OAAO,UAAU,UAAU;AAAA,MAC5C,CAAC;AACD,UAAI,OAAO,UAAU,OAAQ,6BAA4B;AAEzD,UAAI,UAAU;AACZ,kBAAU,YAAY,OAAO,WAAW,cAAc,yBAAyB,wBAAwB;AAAA,UACrG,SAAS,OAAO;AAAA,UAChB,eAAe,OAAO;AAAA,UACtB,MAAM,OAAO;AAAA,UACb,OAAO,OAAO;AAAA,UACd,cAAc,OAAO;AAAA,UACrB,QAAQ,OAAO;AAAA,UACf,WAAW,OAAO;AAAA,UAClB,SAAS,OAAO;AAAA,UAChB,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,QACzD,GAAG;AAAA,UACD,GAAI,OAAO,UAAU,SAAS,IAC1B,CAAC,EAAE,SAAS,qBAAqB,OAAO,UAAU,CAAC,EAAG,GAAG,WAAW,aAAa,gCAAgC,CAAC,IAClH,CAAC;AAAA,UACL,EAAE,SAAS,sBAAsB,OAAO,OAAO,WAAW,aAAa,oBAAoB;AAAA,QAC7F,CAAC,CAAC;AAAA,MACJ,OAAO;AACL,QAAM,QAAQ,OAAO,WAAW,cAAc,iCAAiC,4BAA4B;AAC3G,QAAM,KAAK,eAAe,OAAO,OAAO,EAAE;AAC1C,QAAM,KAAK,eAAe,OAAO,MAAM,QAAQ,OAAO,MAAM,GAAG,GAAG,OAAO,MAAM,UAAU,KAAK,OAAO,MAAM,OAAO,MAAM,EAAE,EAAE;AAC5H,QAAM,KAAK,eAAe,OAAO,QAAQ,gBAAgB,GAAG;AAC5D,mBAAW,OAAO,OAAO,WAAW;AAClC,UAAM,KAAK,eAAe,IAAI,GAAG,EAAE;AAAA,QACrC;AACA,mBAAW,WAAW,OAAO,YAAY,CAAC,GAAG;AAC3C,UAAM,KAAK,YAAY,QAAQ,OAAO,EAAE;AAAA,QAC1C;AACA,YAAI,OAAO,UAAU,SAAS,GAAG;AAC/B,UAAM,KAAK;AAAA,4BAA+B,OAAO,UAAU,CAAC,EAAG,GAAG,EAAE;AAAA,QACtE,OAAO;AACL,UAAM,KAAK;AAAA,2BAA8B,OAAO,OAAO,SAAS;AAAA,QAClE;AAAA,MACF;AAAA,IACF,SAAS,KAAc;AACrB,UAAI,eAAe,UAAU;AAC3B,YAAI,UAAU;AACZ,oBAAU,UAAU,qBAAqB,IAAI,MAAM,IAAI,SAAS,IAAI,OAAO,CAAC;AAAA,QAC9E,OAAO;AACL,UAAM,MAAM,IAAI,OAAO;AAAA,QACzB;AACA,gBAAQ,WAAW;AACnB;AAAA,MACF;AACA,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,UAAI,UAAU;AACZ,kBAAU,UAAU,qBAAqB,UAAU,mBAAmB,GAAG,CAAC;AAAA,MAC5E,OAAO;AACL,QAAM,MAAM,GAAG;AAAA,MACjB;AACA,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,UAAU,EAClB,YAAY,iFAAiF,EAC7F,eAAe,mBAAmB,mBAAmB,EACrD,OAAO,oBAAoB,2EAA2E,EACtG,OAAO,oBAAoB,2EAA2E,EACtG,OAAO,oBAAoB,2EAA2E,EACtG,OAAO,iBAAiB,0BAA0B,qBAAqB,KAAK,IAAI,CAAC,KAAK,MAAM,EAC5F,OAAO,mBAAmB,cAAc,mBAAmB,EAC3D,OAAO,mBAAmB,oCAAoC,EAC9D,OAAO,uBAAuB,yCAAyC,EACvE,OAAO,wBAAwB,8DAA8D,EAC7F,OAAO,0BAA0B,uDAAuD,EACxF,OAAO,6BAA6B,2DAA2D,EAC/F,OAAO,aAAa,8DAA8D,EAClF,OAAO,OAAO,MAAM,QAAQ;AAC3B,UAAM,WAAWF,YAAW,GAAG;AAC/B,UAAM,WAAWC,aAAY,GAAG;AAChC,UAAM,cAAc,KAAK,eAAe,IAAI,gBAAgB;AAC5D,QAAI;AACF,YAAM,gBAAgB,OAAO,KAAK,IAAI;AACtC,UAAI,kBAAkB,UAAU,CAAC,qBAAqB,SAAS,aAAkC,GAAG;AAClG,cAAM,IAAI;AAAA,UACR,UAAU;AAAA,UACV,uBAAuB,aAAa,oBAAoB,qBAAqB,KAAK,IAAI,CAAC;AAAA,QACzF;AAAA,MACF;AACA,YAAM,OAAO,kBAAkB,UAAU,WAAW;AACpD,YAAM,EAAE,YAAY,IAAIC,kBAAiB,UAAU,WAAW;AAC9D,YAAM,SAA2B;AAAA,QAC/B,QAAQ,KAAK;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,MAAM;AAAA,QACN,OAAO,KAAK;AAAA,QACZ,SAAS,KAAK;AAAA,QACd,SAAS,KAAK;AAAA,QACd,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,cAAc,KAAK,QAAQ,EAAE,IAAI,CAAC;AAAA,QAChF,aAAa,KAAK;AAAA,QAClB,YAAY,KAAK;AAAA,MACnB;AACA,UAAI,KAAK,WAAW,MAAM;AACxB,8BAAsB,MAAM,oBAAoB,QAAQ,cAAc,KAAK,QAAQ,KAAK,SAAS,IAAI,GAAG,QAAQ;AAChH;AAAA,MACF;AACA,YAAM,SAAS,MAAM,kBAAkB,QAAQ,aAAa,KAAK,QAAQ,KAAK,SAAS,IAAI;AAE3F,kCAA4B;AAAA,QAC1B,YAAY;AAAA,QACZ,iBAAiB,OAAO,mBAAmB;AAAA,QAC3C,WAAW,OAAO,MAAM;AAAA,QACxB,GAAI,OAAO,MAAM,aAAa,SAAY,EAAE,UAAU,OAAO,MAAM,SAAS,IAAI,CAAC;AAAA,QACjF,GAAI,OAAO,MAAM,UAAU,EAAE,SAAS,OAAO,MAAM,QAAQ,IAAI,CAAC;AAAA,QAChE,kBAAkB,OAAO,QAAQ;AAAA,QACjC,YAAY,OAAO,QAAQ;AAAA,QAC3B,cAAc,OAAO,QAAQ;AAAA,QAC7B,uBAAuB,KAAK,OAAO,UAAU;AAAA,QAC7C,uBAAuB,KAAK,OAAO,UAAU;AAAA,QAC7C,uBAAuB,KAAK,OAAO,UAAU;AAAA,QAC7C,gBAAgB,OAAO,UAAU;AAAA,QACjC,eAAe,OAAO,UAAU,UAAU;AAAA,MAC5C,CAAC;AACD,UAAI,OAAO,UAAU,OAAQ,6BAA4B;AAEzD,UAAI,UAAU;AACZ,kBAAU,YAAY,OAAO,WAAW,cAAc,yBAAyB,wBAAwB;AAAA,UACrG,SAAS,OAAO;AAAA,UAChB,eAAe,OAAO;AAAA,UACtB,MAAM,OAAO;AAAA,UACb,OAAO,OAAO;AAAA,UACd,iBAAiB,OAAO;AAAA,UACxB,cAAc,OAAO;AAAA,UACrB,QAAQ,OAAO;AAAA,UACf,YAAY;AAAA,YACV,QAAQ,KAAK,SAAS,CAAC;AAAA,YACvB,QAAQ,KAAK,SAAS,CAAC;AAAA,YACvB,QAAQ,KAAK,SAAS,CAAC;AAAA,UACzB;AAAA,UACA,WAAW,OAAO;AAAA,UAClB,SAAS,OAAO;AAAA,UAChB,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,QACzD,GAAG;AAAA,UACD,GAAI,OAAO,UAAU,SAAS,IAC1B,CAAC,EAAE,SAAS,qBAAqB,OAAO,UAAU,CAAC,EAAG,GAAG,WAAW,aAAa,gCAAgC,CAAC,IAClH,CAAC;AAAA,UACL,EAAE,SAAS,sBAAsB,OAAO,OAAO,WAAW,aAAa,oBAAoB;AAAA,QAC7F,CAAC,CAAC;AAAA,MACJ,OAAO;AACL,QAAM,QAAQ,OAAO,WAAW,cAAc,iCAAiC,4BAA4B;AAC3G,QAAM,KAAK,eAAe,OAAO,OAAO,EAAE;AAC1C,QAAM,KAAK,eAAe,OAAO,MAAM,QAAQ,OAAO,MAAM,GAAG,GAAG,OAAO,MAAM,UAAU,KAAK,OAAO,MAAM,OAAO,MAAM,EAAE,EAAE;AAC5H,QAAM,KAAK,eAAe,OAAO,eAAe,EAAE;AAClD,QAAM,KAAK,eAAe,KAAK,OAAO,UAAU,CAAC,WAAW,KAAK,OAAO,UAAU,CAAC,WAAW,KAAK,OAAO,UAAU,CAAC,QAAQ;AAC7H,mBAAW,YAAY,OAAO,UAAW,CAAM,KAAK,eAAe,SAAS,GAAG,EAAE;AACjF,mBAAW,WAAW,OAAO,YAAY,CAAC,EAAG,CAAM,KAAK,YAAY,QAAQ,OAAO,EAAE;AACrF,YAAI,OAAO,UAAU,WAAW,EAAG,CAAM,KAAK;AAAA,2BAA8B,OAAO,OAAO,SAAS;AAAA,MACrG;AAAA,IACF,SAAS,KAAc;AACrB,UAAI,eAAe,UAAU;AAC3B,YAAI,SAAU,WAAU,UAAU,qBAAqB,IAAI,MAAM,IAAI,SAAS,IAAI,OAAO,CAAC;AAAA,YACrF,CAAM,MAAM,IAAI,OAAO;AAAA,MAC9B,OAAO;AACL,cAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,YAAI,SAAU,WAAU,UAAU,qBAAqB,UAAU,mBAAmB,OAAO,CAAC;AAAA,YACvF,CAAM,MAAM,OAAO;AAAA,MAC1B;AACA,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,oCAAoC,EAChD,eAAe,iBAAiB,4BAA4B,EAC5D,eAAe,mBAAmB,mBAAmB,EACrD,OAAO,mBAAmB,cAAc,mBAAmB,EAC3D,OAAO,mBAAmB,oCAAoC,EAC9D,OAAO,uBAAuB,yCAAyC,EACvE,OAAO,wBAAwB,8DAA8D,EAC7F,OAAO,0BAA0B,uDAAuD,EACxF,OAAO,6BAA6B,2DAA2D,EAC/F,OAAO,aAAa,8DAA8D,EAClF,OAAO,OAAO,MAAM,QAAQ;AAC3B,UAAM,WAAWF,YAAW,GAAG;AAC/B,UAAM,WAAWC,aAAY,GAAG;AAChC,UAAM,cAAc,KAAK,eAAe,IAAI,gBAAgB;AAE5D,QAAI;AACF,YAAM,OAAO,kBAAkB,UAAU,WAAW;AACpD,YAAM,UAAU,KAAK;AACrB,YAAM,EAAE,YAAY,IAAIC,kBAAiB,UAAU,WAAW;AAE9D,YAAM,SAA2B;AAAA,QAC/B,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK;AAAA,QACZ,SAAS,KAAK;AAAA,QACd,SAAS,KAAK;AAAA,QACd,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,cAAc,KAAK,QAAQ,EAAE,IAAI,CAAC;AAAA,QAChF,aAAa,KAAK;AAAA,QAClB,YAAY,KAAK;AAAA,MACnB;AACA,UAAI,KAAK,WAAW,MAAM;AACxB,8BAAsB,MAAM,oBAAoB,QAAQ,cAAc,KAAK,QAAQ,SAAS,IAAI,GAAG,QAAQ;AAC3G;AAAA,MACF;AACA,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA;AAAA,MACF;AACA,kCAA4B;AAAA,QAC1B,YAAY;AAAA,QACZ,iBAAiB;AAAA,QACjB,WAAW,OAAO,MAAM;AAAA,QACxB,GAAI,OAAO,MAAM,aAAa,SAAY,EAAE,UAAU,OAAO,MAAM,SAAS,IAAI,CAAC;AAAA,QACjF,GAAI,OAAO,MAAM,UAAU,EAAE,SAAS,OAAO,MAAM,QAAQ,IAAI,CAAC;AAAA,QAChE,kBAAkB,OAAO,QAAQ;AAAA,QACjC,YAAY,OAAO,QAAQ;AAAA,QAC3B,cAAc,OAAO,QAAQ;AAAA,QAC7B,gBAAgB,OAAO,UAAU;AAAA,QACjC,eAAe,OAAO,UAAU,UAAU;AAAA,MAC5C,CAAC;AACD,UAAI,OAAO,UAAU,OAAQ,6BAA4B;AAEzD,UAAI,UAAU;AACZ,kBAAU,YAAY,OAAO,WAAW,cAAc,yBAAyB,wBAAwB;AAAA,UACrG,SAAS,OAAO;AAAA,UAChB,eAAe,OAAO;AAAA,UACtB,MAAM,OAAO;AAAA,UACb,OAAO,OAAO;AAAA,UACd,cAAc,OAAO;AAAA,UACrB,QAAQ,OAAO;AAAA,UACf,WAAW,OAAO;AAAA,UAClB,SAAS,OAAO;AAAA,UAChB,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,QACzD,GAAG;AAAA,UACD,GAAI,OAAO,UAAU,SAAS,IAC1B,CAAC,EAAE,SAAS,qBAAqB,OAAO,UAAU,CAAC,EAAG,GAAG,WAAW,aAAa,gCAAgC,CAAC,IAClH,CAAC;AAAA,UACL,EAAE,SAAS,sBAAsB,OAAO,OAAO,WAAW,aAAa,oBAAoB;AAAA,QAC7F,CAAC,CAAC;AAAA,MACJ,OAAO;AACL,QAAM,QAAQ,OAAO,WAAW,cAAc,4CAA4C,qCAAqC;AAC/H,QAAM,KAAK,eAAe,OAAO,OAAO,EAAE;AAC1C,QAAM,KAAK,eAAe,OAAO,MAAM,QAAQ,OAAO,MAAM,GAAG,GAAG,OAAO,MAAM,UAAU,KAAK,OAAO,MAAM,OAAO,MAAM,EAAE,EAAE;AAC5H,QAAM,KAAK,eAAe,KAAK,KAAK,EAAE;AACtC,QAAM,KAAK,eAAe,OAAO,QAAQ,gBAAgB,GAAG;AAC5D,mBAAW,OAAO,OAAO,WAAW;AAClC,UAAM,KAAK,eAAe,IAAI,GAAG,EAAE;AAAA,QACrC;AACA,mBAAW,WAAW,OAAO,YAAY,CAAC,GAAG;AAC3C,UAAM,KAAK,YAAY,QAAQ,OAAO,EAAE;AAAA,QAC1C;AACA,YAAI,OAAO,UAAU,SAAS,GAAG;AAC/B,UAAM,KAAK;AAAA,4BAA+B,OAAO,UAAU,CAAC,EAAG,GAAG,EAAE;AAAA,QACtE,OAAO;AACL,UAAM,KAAK;AAAA,2BAA8B,OAAO,OAAO,SAAS;AAAA,QAClE;AAAA,MACF;AAAA,IACF,SAAS,KAAc;AACrB,UAAI,eAAe,UAAU;AAC3B,YAAI,UAAU;AACZ,oBAAU,UAAU,qBAAqB,IAAI,MAAM,IAAI,SAAS,IAAI,OAAO,CAAC;AAAA,QAC9E,OAAO;AACL,UAAM,MAAM,IAAI,OAAO;AAAA,QACzB;AACA,gBAAQ,WAAW;AACnB;AAAA,MACF;AACA,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,UAAI,UAAU;AACZ,kBAAU,UAAU,qBAAqB,UAAU,mBAAmB,GAAG,CAAC;AAAA,MAC5E,OAAO;AACL,QAAM,MAAM,GAAG;AAAA,MACjB;AACA,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;;;ACx0BA,SAAS,WAAAE,gBAAe;AAgCxB,IAAM,kBAAkB;AACxB,IAAM,YAAY;AAClB,IAAM,gBAAgB,CAAC,OAAO,OAAO,OAAO,UAAU;AA2CtD,SAASC,kBAAiB,UAAmC,aAAsC;AACjG,QAAM,OAAO,SAAS;AACtB,MAAI,OAAO,SAAS,YAAY,KAAM,QAAO;AAC7C,QAAM,UAAU,QAAQ,IAAI,qBAAqB,GAAG,KAAK;AACzD,MAAI,QAAS,QAAO;AACpB,QAAM,aAAa,YAAY,aAAa,EAAE;AAC9C,MAAI,WAAY,QAAO;AACvB,QAAM,IAAI,SAAS,UAAU,oBAAoB,4DAA4D;AAC/G;AAEA,SAASC,eAAc,QAAwC;AAC7D,SAAO,CAAC,GAAG,IAAI,KAAK,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC;AACjF;AAEA,SAAS,kBAAkB,QAAkB,QAAgB,OAAqB;AAChF,QAAM,UAAU,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,WAAW,MAAM,CAAC;AAChE,MAAI,SAAS;AACX,UAAM,IAAI,SAAS,UAAU,kBAAkB,GAAG,KAAK,aAAa,MAAM,UAAU,OAAO,EAAE;AAAA,EAC/F;AACF;AAEA,SAAS,kBAAkB,OAA2B,MAAc,KAAa,KAAmB;AAClG,MAAI,UAAU,OAAW;AACzB,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,OAAO,QAAQ,KAAK;AACzD,UAAM,gBAAgB,GAAG,IAAI,oBAAoB,GAAG,QAAQ,GAAG,KAAK,EAAE,OAAO,MAAM,UAAU,OAAO,SAAS,KAAK,SAAS,IAAI,CAAC;AAAA,EAClI;AACF;AAEA,SAAS,gBAAgB,SAAiB,UAAmC,CAAC,GAAa;AACzF,SAAO,IAAI,SAAS,UAAU,4BAA4B,SAAS;AAAA,IACjE,UAAU;AAAA,IACV,WAAW;AAAA,IACX,GAAG;AAAA,EACL,CAAC;AACH;AAEA,SAAS,mBACP,UACA,QACA,SACA,aACiG;AACjG,QAAM,SAAS,OAAO,OAAO,KAAK;AAClC,MAAI,CAAC,OAAQ,OAAM,IAAI,SAAS,UAAU,kBAAkB,iCAAiC;AAC7F,QAAM,YAAYA,eAAc,OAAO,SAAS;AAChD,QAAM,kBAAkBA,eAAc,OAAO,eAAe;AAC5D,oBAAkB,WAAW,iBAAiB,kBAAkB;AAChE,oBAAkB,iBAAiB,iBAAiB,kBAAkB;AAEtE,MAAI,aAAa,iBAAiB;AAChC,QAAI,WAAW,YAAY,kBAAkB;AAC3C,YAAM,gBAAgB,6DAA6D,OAAO,KAAK,EAAE,OAAO,WAAW,UAAU,SAAS,WAAW,CAAC,gBAAgB,EAAE,CAAC;AAAA,IACvK;AACA,QAAI,UAAU,SAAS,KAAK,gBAAgB,SAAS,GAAG;AACtD,YAAM,gBAAgB,4EAA4E,EAAE,OAAO,aAAa,CAAC;AAAA,IAC3H;AACA,QAAI,UAAU,SAAS,EAAG,OAAM,gBAAgB,mDAAmD,EAAE,OAAO,SAAS,UAAU,UAAU,QAAQ,eAAe,EAAE,CAAC;AACnK,QAAI,gBAAgB,SAAS,EAAG,OAAM,gBAAgB,kDAAkD,EAAE,OAAO,SAAS,UAAU,gBAAgB,QAAQ,eAAe,EAAE,CAAC;AAC9K,QAAI,OAAO,UAAU,OAAO,QAAQ,OAAO,gBAAgB,OAAO,mBAAmB;AACnF,YAAM,gBAAgB,wFAAwF,EAAE,OAAO,eAAe,CAAC;AAAA,IACzI;AACA,sBAAkB,OAAO,cAAc,mBAAmB,KAAK,GAAG;AAClE,sBAAkB,OAAO,WAAW,gBAAgB,KAAK,EAAE;AAC3D,sBAAkB,OAAO,YAAY,iBAAiB,KAAK,GAAG;AAC9D,QAAI,OAAO,eAAe,WAAc,CAAC,OAAO,UAAU,OAAO,UAAU,KAAK,OAAO,cAAc,IAAI;AACvG,YAAM,gBAAgB,6CAA6C,EAAE,OAAO,eAAe,UAAU,OAAO,WAAW,CAAC;AAAA,IAC1H;AACA,UAAM,cAAc;AAAA,MAClB,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,MACjD,GAAI,OAAO,mBAAmB,SAAY,EAAE,iBAAiB,OAAO,eAAe,IAAI,CAAC;AAAA,MACxF,GAAI,OAAO,iBAAiB,SAAY,EAAE,eAAe,OAAO,aAAa,IAAI,CAAC;AAAA,MAClF,GAAI,OAAO,cAAc,SAAY,EAAE,YAAY,OAAO,UAAU,IAAI,CAAC;AAAA,MACzE,GAAI,OAAO,eAAe,SAAY,EAAE,aAAa,OAAO,WAAW,IAAI,CAAC;AAAA,MAC5E,GAAI,OAAO,eAAe,SAAY,EAAE,aAAa,OAAO,WAAW,IAAI,CAAC;AAAA,IAC9E;AACA,WAAO;AAAA,MACL,MAAM;AAAA,QACJ;AAAA,QACA,GAAI,UAAU,SAAS,EAAE,UAAU,UAAU,IAAI,CAAC;AAAA,QAClD,GAAI,gBAAgB,SAAS,EAAE,gBAAgB,IAAI,CAAC;AAAA,QACpD,GAAI,OAAO,KAAK,WAAW,EAAE,SAAS,EAAE,YAAY,IAAI,CAAC;AAAA,QACzD,cAAc;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,UAAU,SAAS,oBAAoB,gBAAgB,SAAS,oBAAoB;AAAA,IAC5F;AAAA,EACF;AAEA,MAAI,aAAa,WAAW;AAC1B,QAAI,WAAW,YAAY,gBAAgB,YAAY,YAAY;AACjE,YAAM,gBAAgB,iEAAiE,OAAO,KAAK,EAAE,OAAO,WAAW,UAAU,SAAS,WAAW,CAAC,cAAc,UAAU,EAAE,CAAC;AAAA,IACnL;AACA,QAAI,UAAU,UAAU,gBAAgB,UAAU,OAAO,UAAU,OAAO,mBAAmB,UACxF,OAAO,iBAAiB,UAAa,OAAO,cAAc,UAC1D,OAAO,eAAe,UAAa,OAAO,eAAe,QAAW;AACvE,YAAM,gBAAgB,4EAA4E,EAAE,OAAO,qBAAqB,CAAC;AAAA,IACnI;AACA,UAAM,SAAS,OAAO,WAAW;AACjC,UAAM,eAAe,OAAO,iBAAiB;AAC7C,QAAI,CAAC,UAAU,OAAO,MAAM;AAC1B,YAAM,gBAAgB,uCAAuC,EAAE,OAAO,QAAQ,UAAU,SAAS,CAAC;AAAA,IACpG;AACA,UAAM,OAAO,OAAO,MAAM,KAAK,MAAM,UAAU,eAAe,SAAS;AACvE,WAAO;AAAA,MACL,MAAM;AAAA,QACJ;AAAA;AAAA;AAAA;AAAA;AAAA,QAKA;AAAA,QACA,GAAI,UAAU,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,QACjC,GAAI,CAAC,SAAS,EAAE,sBAAsB,OAAO,IAAI,CAAC;AAAA,QAClD;AAAA,QACA,mBAAmB,OAAO,sBAAsB;AAAA,QAChD,GAAI,UAAU,EAAE,SAAS,QAAQ,IAAI,CAAC;AAAA,QACtC,cAAc;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,SAAS,iBAAiB;AAAA,IAClC;AAAA,EACF;AAEA,QAAM,IAAI,SAAS,UAAU,qBAAqB,sCAAsC,QAAQ,IAAI;AAAA,IAClG,UAAU;AAAA,IACV,WAAW;AAAA,IACX,MAAM;AAAA,EACR,CAAC;AACH;AAEA,SAAS,uBAAuB,UAAkB,gBAAyC;AACzF,MAAI,CAAC,eAAgB;AACrB,QAAM,eAAe,mBAAmB,eAAe,kBAAkB;AACzE,MAAI,aAAa,aAAc;AAC/B,QAAM,IAAI;AAAA,IACR,UAAU;AAAA,IACV,aAAa,cAAc,kCAAkC,QAAQ;AAAA,IACrE;AAAA,MACE,UAAU;AAAA,MACV,WAAW;AAAA,MACX,MAAM,SAAS,cAAc,iCAAiC,mBAAmB,eAAe,SAAS,YAAY;AAAA,MACrH,eAAe;AAAA,MACf,eAAe;AAAA,IACjB;AAAA,EACF;AACF;AAEA,eAAe,oBACb,QACA,aACA,QACA,SACA,MACA,sBACA,gBACA;AACA,QAAM,YAAY,MAAM,sBAAsB;AAAA,IAC5C,QAAQ;AAAA,IACR,OAAO,OAAO;AAAA,IACd,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,KAAK;AAAA,EACd,CAAC;AACD,yBAAuB,UAAU,UAAU,cAAc;AACzD,QAAM,WAAW,mBAAmB,UAAU,UAAU,QAAQ,UAAU,SAAS,WAAW;AAC9F,MAAI,SAAS,gBAAgB,WAAW,KAAK,SAAS,UAAU,WAAW,GAAG;AAC5E,iCAA6B,SAAS;AAAA,EACxC,OAAO;AACL,gCAA4B,WAAW,SAAS,gBAAgB,MAAM;AACtE,QAAI,SAAS,UAAU,SAAS,KAAK,CAAC,4BAA4B,SAAS,EAAE,OAAO;AAClF,YAAM;AAAA,QACJ,GAAG,UAAU,QAAQ,UAAU,GAAG;AAAA,QAClC;AAAA,UACE,OAAO;AAAA,UACP,UAAU,SAAS,UAAU;AAAA,UAC7B,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,qBACpB,QACA,aACA,QACA,SACA,OAAyB,CAAC,GAC1B,gBAC8B;AAC9B,QAAM,YAAY,KAAK,aAAa,IAAI,UAAU;AAClD,QAAM,UAAU,MAAM,oBAAoB,QAAQ,aAAa,QAAQ,SAAS,MAAM,MAAM,cAAc;AAC1G,QAAM,EAAE,UAAU,UAAU,IAAI;AAChC,iBAAe,SAAS,uBAAuB;AAAA,IAC7C,MAAM,SAAS;AAAA,IACf,OAAO,UAAU;AAAA,IACjB,UAAU,UAAU;AAAA,IACpB,SAAS,UAAU;AAAA,IACnB,uBAAuB,SAAS,UAAU;AAAA,IAC1C,uBAAuB,SAAS,gBAAgB;AAAA,IAChD,eAAe,OAAO;AAAA,IACtB,kBAAkB,OAAO,mBAAmB;AAAA,IAC5C,aAAa,OAAO,WAAW;AAAA,IAC/B,cAAc,OAAO,iBAAiB;AAAA,IACtC,cAAc;AAAA,EAChB,CAAC;AAED,QAAM,cAAc,kBAAkB;AACtC,QAAM,UAAU,gBAAgB,WAAW,cAAc,OAAO,MAAM,KAAK,iBAAiB,SAAS,CAAC;AACtG,QAAM,OAAO,UAAU,OAAO;AAAA,IAC5B;AAAA,IACA;AAAA,IACA,UAAU,UAAU;AAAA,IACpB,WAAW;AAAA,MACT,UAAU;AAAA,MACV,QAAQ,OAAO;AAAA,MACf,OAAO,UAAU;AAAA,MACjB,SAAS,UAAU;AAAA,MACnB,SAAS,UAAU;AAAA,MACnB,eAAe,UAAU;AAAA,MACzB;AAAA,MACA,MAAM,SAAS;AAAA,MACf,qBAAqB,SAAS,UAAU;AAAA,MACxC,qBAAqB,SAAS,gBAAgB;AAAA,MAC9C,UAAU;AAAA,QACR,QAAQ,OAAO;AAAA,QACf,gBAAgB,OAAO;AAAA,QACvB,QAAQ,OAAO;AAAA,QACf,cAAc,OAAO;AAAA,MACvB;AAAA,IACF;AAAA,EACF,CAAC;AACD,YAAU,OAAO,KAAK,IAAI,EAAE,QAAQ,aAAa,CAAC;AAClD,QAAM,SAAS,IAAI,cAAc;AAAA,IAC/B;AAAA,IACA;AAAA,IACA,OAAO,KAAK;AAAA,IACZ,WAAW,KAAK,4BAA4B;AAAA,EAC9C,CAAC;AAED,MAAI;AACF,UAAM,YAAY,MAAM,sBAAsB;AAAA,MAC5C,QAAQ,IAAI,0BAA0B,MAAM;AAAA,MAC5C;AAAA,MACA,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,WAAW;AAAA,MACX,QAAQ,OAAO;AAAA,MACf,OAAO,UAAU;AAAA,MACjB,gBAAgB;AAAA,MAChB,OAAO,SAAS;AAAA,IAClB,CAAC;AACD,UAAM,YAAY,UAAU,KAAK,aAAa,IAAI,CAAC,SAAS,EAAE,MAAM,SAAkB,KAAK,WAAW,aAAa,EAAE;AACrH,UAAM,WAAgC,UAAU,iBAAiB,CAAC,UAAU,cAAc,IAAI,CAAC;AAC/F,mBAAe,SAAS,wBAAwB;AAAA,MAC9C,eAAe,KAAK;AAAA,MACpB,iBAAiB,UAAU,WAAW;AAAA,MACtC,QAAQ,UAAU,KAAK;AAAA,IACzB,CAAC;AACD,WAAO;AAAA,MACL,SAAS,UAAU,WAAW;AAAA,MAC9B,eAAe,KAAK;AAAA,MACpB,MAAM,UAAU;AAAA,MAChB,OAAO,iBAAiB,SAAS;AAAA,MACjC,cAAc;AAAA,MACd,QAAQ,UAAU,KAAK;AAAA,MACvB;AAAA,MACA,GAAI,SAAS,SAAS,EAAE,SAAS,IAAI,CAAC;AAAA,IACxC;AAAA,EACF,SAASC,QAAO;AACd,UAAM,OAAOA,kBAAiB,WAAWA,OAAM,OAAO,UAAU;AAChE,UAAM,UAAUA,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK;AACrE,QAAI,CAAC,UAAU,IAAI,KAAK,EAAE,GAAG,eAAe;AAC1C,gBAAU,OAAO,KAAK,IAAI,EAAE,QAAQ,UAAU,OAAO,EAAE,MAAM,QAAQ,EAAE,CAAC;AACxE,8BAAwB,EAAE,WAAW,cAAc,KAAK,cAAc,MAAM,WAAW,CAAC,GAAG,QAAQ,UAAU,OAAO,EAAE,MAAM,QAAQ,EAAE,CAAC;AAAA,IACzI;AACA,mBAAe,SAAS,6BAA6B,EAAE,SAAS,KAAK,IAAI,qBAAqB,UAAU,IAAI,KAAK,EAAE,GAAG,kBAAkB,QAAW,YAAY,KAAK,GAAG,OAAO;AAC9K,UAAMA;AAAA,EACR;AACF;AAEA,SAAS,eAAe,OAAgB,MAAkC;AACxE,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,SAAS,OAAO,KAAK;AAC3B,MAAI,CAAC,OAAO,SAAS,MAAM,EAAG,OAAM,IAAI,SAAS,UAAU,kBAAkB,GAAG,IAAI,oBAAoB;AACxG,SAAO;AACT;AAEA,eAAsB,oBACpB,QACA,aACA,QACA,SACA,MACA,gBACsC;AACtC,QAAM,EAAE,UAAU,UAAU,IAAI,MAAM;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,4BAA4B,EAAE,GAAG,SAAS,KAAK;AACrD,SAAO,0BAA0B;AACjC,SAAO,4BAA4B,WAAW,SAAS,yBAAyB;AAClF;AAEA,SAAS,iBAAiB,MAA+B,aAAqD;AAC5G,QAAM,SAAS,KAAK;AACpB,MAAI,WAAW,UAAa,CAAC,cAAc,SAAS,MAA2B,GAAG;AAChF,UAAM,IAAI,SAAS,UAAU,kBAAkB,yBAAyB,MAAM,cAAc,cAAc,KAAK,IAAI,CAAC,GAAG;AAAA,EACzH;AACA,SAAO;AAAA,IACL,QAAQ,OAAO,KAAK,MAAM;AAAA,IAC1B,OAAO,eAAe,OAAO,KAAK,SAAS,YAAY;AAAA,IACvD,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,IACd,WAAW,KAAK;AAAA,IAChB,iBAAiB,KAAK;AAAA,IACtB;AAAA,IACA,gBAAgB,KAAK,aAAa,OAAO,OAAO;AAAA,IAChD,cAAc,eAAe,KAAK,cAAc,iBAAiB;AAAA,IACjE,WAAW,eAAe,KAAK,WAAW,cAAc;AAAA,IACxD,YAAY,eAAe,KAAK,YAAY,eAAe;AAAA,IAC3D,YAAY,eAAe,KAAK,YAAY,eAAe;AAAA,IAC3D,QAAQ,KAAK,WAAW;AAAA,IACxB,MAAM,KAAK;AAAA,IACX,cAAc,KAAK,iBAAiB;AAAA,IACpC,mBAAmB,KAAK,sBAAsB;AAAA,EAChD;AACF;AAEA,eAAe,gBACb,MACA,KACA,MACA,aACe;AACf,QAAM,WAAW,aAAa,GAAG;AACjC,QAAM,WAAW,eAAe,GAAG;AACnC,QAAM,cAAc,KAAK,eAAe,IAAI,gBAAgB;AAC5D,MAAI;AACF,UAAM,OAAO,kBAAkB,UAAU,WAAW;AACpD,UAAM,cAAcF,kBAAiB,UAAU,WAAW;AAC1D,UAAM,SAAS,iBAAiB,MAAM,WAAW;AACjD,QAAI,KAAK,WAAW,MAAM;AACxB,4BAAsB,MAAM,oBAAoB,QAAQ,aAAa,KAAK,QAAQ,KAAK,SAAS,MAAM,WAAW,GAAG,QAAQ;AAC5H;AAAA,IACF;AACA,UAAM,SAAS,MAAM,qBAAqB,QAAQ,aAAa,KAAK,QAAQ,KAAK,SAAS,MAAM,WAAW;AAC3G,UAAM,iBAAiB,OAAO,SAAS,YAClC,OAAO,SAAS,iBAAiB,sBACjC,OAAO,WAAW,SAAS,oBAAoB,OAAO,iBAAiB,SAAS,oBAAoB;AACzG,gCAA4B;AAAA,MAC1B,YAAY;AAAA,MACZ,iBAAiB;AAAA,MACjB,WAAW,OAAO,MAAM;AAAA,MACxB,GAAI,OAAO,MAAM,aAAa,SAAY,EAAE,UAAU,OAAO,MAAM,SAAS,IAAI,CAAC;AAAA,MACjF,GAAI,OAAO,MAAM,UAAU,EAAE,SAAS,OAAO,MAAM,QAAQ,IAAI,CAAC;AAAA,MAChE,uBAAuB,OAAO,WAAW,UAAU;AAAA,MACnD,uBAAuB,OAAO,iBAAiB,UAAU;AAAA,MACzD,GAAI,OAAO,SAAS,EAAE,eAAe,OAAO,OAAO,IAAI,CAAC;AAAA,MACxD,kBAAkB,OAAO,mBAAmB;AAAA,MAC5C,aAAa,OAAO,WAAW;AAAA,MAC/B,cAAc,OAAO,iBAAiB;AAAA,MACtC,gBAAgB,OAAO,UAAU;AAAA,MACjC,eAAe,OAAO,UAAU,UAAU;AAAA,IAC5C,CAAC;AACD,QAAI,OAAO,UAAU,OAAQ,6BAA4B;AAEzD,QAAI,UAAU;AACZ,gBAAU,YAAY,OAAO,WAAW,cAAc,yBAAyB,wBAAwB;AAAA,QACrG,SAAS,OAAO;AAAA,QAChB,eAAe,OAAO;AAAA,QACtB,MAAM,OAAO;AAAA,QACb,OAAO,OAAO;AAAA,QACd,cAAc,OAAO;AAAA,QACrB,QAAQ,OAAO;AAAA,QACf,WAAW,OAAO;AAAA,QAClB,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,MACzD,GAAG;AAAA,QACD,GAAI,OAAO,UAAU,SAAS,CAAC,EAAE,SAAS,qBAAqB,OAAO,UAAU,CAAC,EAAG,GAAG,WAAW,aAAa,gCAAgC,CAAC,IAAI,CAAC;AAAA,QACrJ,EAAE,SAAS,sBAAsB,OAAO,OAAO,WAAW,aAAa,oBAAoB;AAAA,MAC7F,CAAC,CAAC;AAAA,IACJ,OAAO;AACL,MAAM,QAAQ,OAAO,WAAW,cAAc,iCAAiC,4BAA4B;AAC3G,MAAM,KAAK,cAAc,OAAO,OAAO,EAAE;AACzC,MAAM,KAAK,cAAc,OAAO,MAAM,QAAQ,OAAO,MAAM,GAAG,GAAG,OAAO,MAAM,UAAU,KAAK,OAAO,MAAM,OAAO,MAAM,EAAE,EAAE;AAC3H,iBAAW,YAAY,OAAO,UAAW,CAAM,KAAK,cAAc,SAAS,GAAG,EAAE;AAChF,iBAAW,WAAW,OAAO,YAAY,CAAC,EAAG,CAAM,KAAK,YAAY,QAAQ,OAAO,EAAE;AACrF,UAAI,OAAO,UAAU,WAAW,EAAG,CAAM,KAAK;AAAA,2BAA8B,OAAO,OAAO,SAAS;AAAA,IACrG;AAAA,EACF,SAASE,QAAO;AACd,UAAM,OAAOA,kBAAiB,WAAWA,OAAM,OAAO,UAAU;AAChE,UAAM,UAAUA,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK;AACrE,QAAI,SAAU,WAAU,UAAU,qBAAqB,MAAM,SAASA,kBAAiB,WAAWA,OAAM,UAAU,MAAS,CAAC;AAAA,QACvH,CAAM,MAAM,OAAO;AACxB,YAAQ,WAAW;AAAA,EACrB;AACF;AAEA,SAAS,oBAAoB,SAA2B;AACtD,SAAO,QACJ,OAAO,mBAAmB,+CAA+C,EACzE,OAAO,uBAAuB,8CAA8C,EAC5E,OAAO,oBAAoB,kCAAkC,EAC7D,OAAO,oBAAoB,iCAAiC,EAC5D,OAAO,qBAAqB,kBAAkB,cAAc,KAAK,IAAI,CAAC,GAAG,EACzE,OAAO,cAAc,2BAA2B,EAChD,OAAO,4BAA4B,kCAAkC,EACrE,OAAO,yBAAyB,8BAA8B,EAC9D,OAAO,0BAA0B,oBAAoB,EACrD,OAAO,0BAA0B,qCAAqC,EACtE,OAAO,aAAa,8DAA8D;AACvF;AAEA,SAAS,eAAe,SAA2B;AACjD,SAAO,QACJ,OAAO,mBAAmB,yCAAyC,EACnE,OAAO,uBAAuB,wCAAwC,EACtE,OAAO,YAAY,8BAA8B,EACjD,OAAO,iBAAiB,8BAA8B,EACtD,OAAO,kBAAkB,6BAA6B,EACtD,OAAO,yBAAyB,mDAAmD,EACnF,OAAO,aAAa,8DAA8D;AACvF;AAEO,SAAS,mBAAmB,OAAyB,CAAC,GAAY;AACvE,QAAM,QAAQ,IAAIC,SAAQ,OAAO,EAAE,YAAY,qCAAqC;AACpF,QACG,QAAQ,UAAU,EAClB,YAAY,wCAAwC,EACpD,eAAe,mBAAmB,8DAA8D,EAChG,OAAO,mBAAmB,mCAAmC,mBAAmB,EAChF,OAAO,mBAAmB,oCAAoC,EAC9D,OAAO,uBAAuB,yCAAyC,EACvE,OAAO,oBAAoB,6CAA6C,EACxE,OAAO,oBAAoB,4CAA4C,EACvE,OAAO,qBAAqB,6BAA6B,cAAc,KAAK,IAAI,CAAC,GAAG,EACpF,OAAO,cAAc,sCAAsC,EAC3D,OAAO,4BAA4B,6CAA6C,EAChF,OAAO,yBAAyB,yCAAyC,EACzE,OAAO,0BAA0B,+BAA+B,EAChE,OAAO,0BAA0B,gDAAgD,EACjF,OAAO,YAAY,mCAAmC,EACtD,OAAO,iBAAiB,mCAAmC,EAC3D,OAAO,kBAAkB,uCAAuC,EAChE,OAAO,yBAAyB,mDAAmD,EACnF,OAAO,aAAa,8DAA8D,EAClF,OAAO,OAAO,MAAM,QAAQ,MAAM,gBAAgB,MAAM,KAAK,IAAI,CAAC;AAErE,sBAAoB,MACjB,QAAQ,YAAY,EACpB,YAAY,0CAA0C,EACtD,eAAe,mBAAmB,mBAAmB,CAAC,EACtD,OAAO,OAAO,MAAM,QAAQ,MAAM,gBAAgB,MAAM,KAAK,MAAM,YAAY,CAAC;AAEnF,iBAAe,MACZ,QAAQ,MAAM,EACd,YAAY,0BAA0B,EACtC,eAAe,mBAAmB,yDAAyD,CAAC,EAC5F,OAAO,OAAO,MAAM,QAAQ,MAAM,gBAAgB,MAAM,KAAK,MAAM,MAAM,CAAC;AAC7E,SAAO;AACT;;;AC1iBA,SAAS,WAAAC,gBAAe;AAcxB,SAAS,qBAAqB,OAAe,OAAuB;AAClE,QAAM,SAAS,OAAO,KAAK;AAC3B,MAAI,CAAC,OAAO,UAAU,MAAM,KAAK,UAAU,GAAG;AAC5C,UAAM,IAAI,SAAS,UAAU,kBAAkB,GAAG,KAAK,8BAA8B;AAAA,EACvF;AACA,SAAO;AACT;AAEA,SAAS,UAAU,MAAwB;AACzC,EAAM,KAAK,GAAG,KAAK,iBAAiB,KAAK,EAAE,KAAK,KAAK,MAAM,KAAK,KAAK,QAAQ,KAAK,KAAK,SAAS,EAAE;AACpG;AAEA,SAAS,gBAAgBC,QAAgB,UAAmB,MAAoB;AAC9E,QAAM,WAAWA,kBAAiB,WAC9BA,SACA,IAAI,SAAS,UAAU,cAAcA,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK,CAAC;AAC/F,uBAAqB,SAAS,MAAM,SAAS,OAAO;AACpD,MAAI,SAAU,WAAU,UAAU,MAAM,SAAS,MAAM,SAAS,SAAS,SAAS,OAAO,CAAC;AAAA,MACrF,CAAM,MAAM,SAAS,OAAO;AACjC,UAAQ,WAAW;AACrB;AAUA,SAAS,kBAAkB,KAAc,MAAuB,gBAAoD;AAClH,QAAM,cAAc,KAAK,eAAe,IAAI,gBAAgB;AAC5D,QAAM,OAAO,kBAAkB,eAAe,GAAG,GAAG,WAAW;AAC/D,SAAO,IAAI,0BAA0B,IAAI,cAAc;AAAA,IACrD,SAAS,kBAAkB,KAAK;AAAA,IAChC,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,WAAW;AAAA,EACb,CAAC,CAAC;AACJ;AAEA,eAAe,YAAY,UAAsB,KAAc,MAA4C;AACzG,MAAI,CAAC,SAAS,iBAAiB,eAAe,QAAQ,EAAG,QAAO;AAChE,QAAM,YAAY,KAAK,aAAa,IAAI,UAAU;AAClD,QAAM,SAAS,MAAM,wBAAwB;AAAA,IAC3C,QAAQ,kBAAkB,KAAK,MAAM,SAAS,cAAc;AAAA,IAC5D;AAAA,IACA,cAAc,KAAK;AAAA,IACnB,MAAM;AAAA,EACR,CAAC;AACD,SAAO,OAAO;AAChB;AAEO,SAAS,kBAAkB,OAAwB,CAAC,GAAY;AACrE,QAAM,OAAO,IAAIC,SAAQ,MAAM,EAAE,YAAY,4BAA4B;AAEzE,OACG,QAAQ,MAAM,EACd,YAAY,mBAAmB,EAC/B,OAAO,mBAAmB,2BAA2B,IAAI,EACzD,OAAO,CAAC,MAAyB,QAAiB;AACjD,UAAM,WAAW,aAAa,GAAG;AACjC,QAAI;AACF,YAAM,QAAQ,qBAAqB,KAAK,OAAO,OAAO;AACtD,YAAM,SAAS,KAAK,aAAa,IAAI,UAAU,GAAG,KAAK,KAAK;AAC5D,kCAA4B,EAAE,YAAY,MAAM,QAAQ,MAAM,CAAC;AAC/D,qBAAe,QAAQ,eAAe,EAAE,OAAO,MAAM,QAAQ,MAAM,CAAC;AACpE,UAAI,SAAU,WAAU,YAAY,aAAa,EAAE,OAAO,OAAO,MAAM,OAAO,CAAC,CAAC;AAAA,WAC3E;AACH,QAAM,QAAQ,cAAc;AAC5B,mBAAW,YAAY,MAAO,WAAU,QAAQ;AAChD,YAAI,MAAM,WAAW,EAAG,CAAM,KAAK,uBAAuB;AAAA,MAC5D;AAAA,IACF,SAASD,QAAO;AACd,sBAAgBA,QAAO,UAAU,WAAW;AAAA,IAC9C;AAAA,EACF,CAAC;AAEH,OACG,QAAQ,QAAQ,EAChB,YAAY,iBAAiB,EAC7B,SAAS,aAAa,SAAS,EAC/B,OAAO,OAAO,IAAY,OAAgB,QAAiB;AAC1D,UAAM,WAAW,aAAa,GAAG;AACjC,QAAI;AACF,YAAM,QAAQ,KAAK,aAAa,IAAI,UAAU;AAC9C,UAAI,WAAW,MAAM,WAAW,EAAE;AAClC,UAAI,CAAC,SAAU,OAAM,IAAI,SAAS,UAAU,gBAAgB,mBAAmB,EAAE,EAAE;AACnF,iBAAW,MAAM,YAAY,UAAU,KAAK,EAAE,GAAG,MAAM,WAAW,MAAM,CAAC;AACzE,kCAA4B,EAAE,aAAa,SAAS,OAAO,CAAC;AAC5D,qBAAe,QAAQ,oBAAoB,EAAE,SAAS,IAAI,QAAQ,SAAS,OAAO,CAAC;AACnF,UAAI,SAAU,WAAU,YAAY,eAAe,EAAE,MAAM,SAAS,CAAC,CAAC;AAAA,UACjE,WAAU,QAAQ;AAAA,IACzB,SAASA,QAAO;AACd,sBAAgBA,QAAO,UAAU,aAAa;AAAA,IAChD;AAAA,EACF,CAAC;AAEH,OACG,QAAQ,MAAM,EACd,YAAY,6BAA6B,EACzC,SAAS,aAAa,SAAS,EAC/B,OAAO,uBAAuB,iBAAiB,KAAK,EACpD,OAAO,OAAO,IAAY,MAA2B,QAAiB;AACrE,UAAM,WAAW,aAAa,GAAG;AACjC,QAAI;AACF,YAAM,iBAAiB,qBAAqB,KAAK,SAAS,SAAS;AACnE,YAAM,QAAQ,KAAK,aAAa,IAAI,UAAU;AAC9C,YAAM,WAAW,KAAK,IAAI,IAAI,iBAAiB;AAC/C,UAAI,WAAW,MAAM,WAAW,EAAE;AAClC,UAAI,CAAC,SAAU,OAAM,IAAI,SAAS,UAAU,gBAAgB,mBAAmB,EAAE,EAAE;AACnF,aAAO,CAAC,eAAe,QAAQ,KAAK,KAAK,IAAI,IAAI,UAAU;AACzD,mBAAW,MAAM,YAAY,UAAU,KAAK,EAAE,GAAG,MAAM,WAAW,MAAM,CAAC;AACzE,YAAI,CAAC,eAAe,QAAQ,GAAG;AAC7B,gBAAM,cAAc,KAAK,IAAI,GAAG,WAAW,KAAK,IAAI,CAAC;AACrD,gBAAM,IAAI,QAAQ,CAACE,aAAY,WAAWA,UAAS,KAAK,IAAI,KAAK,kBAAkB,KAAO,WAAW,CAAC,CAAC;AAAA,QACzG;AAAA,MACF;AACA,UAAI,CAAC,eAAe,QAAQ,GAAG;AAC7B,cAAM,IAAI,SAAS,UAAU,cAAc,8BAA8B,EAAE,UAAU,cAAc,IAAI;AAAA,MACzG;AACA,kCAA4B,EAAE,aAAa,SAAS,QAAQ,iBAAiB,eAAe,CAAC;AAC7F,qBAAe,QAAQ,uBAAuB,EAAE,SAAS,IAAI,QAAQ,SAAS,OAAO,CAAC;AACtF,UAAI,SAAU,WAAU,YAAY,aAAa,EAAE,MAAM,SAAS,CAAC,CAAC;AAAA,UAC/D,WAAU,QAAQ;AAAA,IACzB,SAASF,QAAO;AACd,sBAAgBA,QAAO,UAAU,WAAW;AAAA,IAC9C;AAAA,EACF,CAAC;AAEH,SAAO;AACT;;;ACxIA,SAAS,WAAAG,gBAAe;AAExB,SAAS,aAAa;;;ACsCf,IAAM,wBAAN,MAA4B;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAA8B;AACxC,SAAK,UAAU,QAAQ,QAAQ,QAAQ,QAAQ,EAAE;AACjD,SAAK,SAAS,QAAQ;AACtB,SAAK,SAAS,QAAQ,SAAS,WAAW;AAC1C,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,SAAS,KAAmC;AAChD,QAAI,CAAC,OAAO,CAAC,IAAI,WAAW,SAAS,GAAG;AACtC,YAAM,IAAI;AAAA,QACR,UAAU;AAAA,QACV,sBAAsB,GAAG;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,aAAa,mBAAmB,GAAG;AACzC,UAAM,MAAM,GAAG,KAAK,OAAO,kCAAkC,UAAU;AACvE,UAAM,SAAS,aAAa;AAAA,MAC1B,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,GAAG,KAAK,MAAM;AAEd,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,KAAK,OAAO,KAAK;AAAA,QAChC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,kBAAkB,KAAK;AAAA,QACzB;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAc;AACrB,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,YAAMC,SAAQ,IAAI,SAAS,UAAU,eAAe,kBAAkB,GAAG,EAAE;AAC3E,aAAO,QAAQA,MAAK;AACpB,YAAMA;AAAA,IACR;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAMA,SAAQ,IAAI,SAAS,UAAU,kBAAkB,2BAA2B;AAClF,aAAO,QAAQA,QAAO,SAAS,MAAM;AACrC,YAAMA;AAAA,IACR;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAMA,SAAQ,IAAI,SAAS,UAAU,iBAAiB,mBAAmB,EAAE,QAAQ,IAAI,CAAC;AACxF,aAAO,QAAQA,QAAO,SAAS,MAAM;AACrC,YAAMA;AAAA,IACR;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAMA,SAAQ,IAAI;AAAA,QAChB,UAAU;AAAA,QACV,uCAAuC,GAAG;AAAA,MAC5C;AACA,aAAO,QAAQA,QAAO,SAAS,MAAM;AACrC,YAAMA;AAAA,IACR;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACjD,YAAMA,SAAQ,IAAI;AAAA,QAChB,UAAU;AAAA,QACV,QAAQ,SAAS,MAAM,KAAK,QAAQ,SAAS,UAAU;AAAA,QACvD,EAAE,QAAQ,SAAS,OAAO;AAAA,MAC5B;AACA,aAAO,QAAQA,QAAO,SAAS,MAAM;AACrC,YAAMA;AAAA,IACR;AAEA,QAAI;AACJ,QAAI;AACF,aAAQ,MAAM,SAAS,KAAK;AAAA,IAC9B,QAAQ;AACN,YAAMA,SAAQ,IAAI,SAAS,UAAU,cAAc,mCAAmC;AACtF,aAAO,QAAQA,QAAO,SAAS,MAAM;AACrC,YAAMA;AAAA,IACR;AAEA,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,MAAM;AAC/B,YAAMA,SAAQ,IAAI;AAAA,QAChB,UAAU;AAAA,QACV,KAAK,SAAS;AAAA,MAChB;AACA,aAAO,QAAQA,QAAO,SAAS,MAAM;AACrC,YAAMA;AAAA,IACR;AAEA,WAAO,QAAQ,SAAS,QAAQ,EAAE,aAAa,KAAK,KAAK,MAAM,SAAS,KAAK,KAAK,QAAQ,CAAC;AAC3F,WAAO,KAAK;AAAA,EACd;AACF;;;ACnJA,SAAS,OAAO,iBAAiB;AACjC,SAAS,cAAAC,aAAY,YAAAC,iBAAgB;AACrC,SAAS,UAAU,WAAAC,UAAS,QAAAC,OAAM,WAAAC,gBAAe;AA6BjD,SAAS,cAAc,KAAmB;AACxC,MAAI,CAAC,OAAO,CAAC,IAAI,WAAW,SAAS,GAAG;AACtC,UAAM,IAAI;AAAA,MACR,UAAU;AAAA,MACV,sBAAsB,GAAG;AAAA,IAC3B;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,KAAqB;AAC5C,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,UAAM,OAAO,SAAS,OAAO,QAAQ;AACrC,QAAI,QAAQ,SAAS,OAAO,SAAS,IAAK,QAAO;AAAA,EACnD,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,KAAa,QAAyB;AAC/D,QAAM,eAAe,gBAAgB,GAAG;AACxC,MAAI,CAAC,OAAQ,QAAOC,SAAQ,QAAQ,IAAI,GAAG,YAAY;AAEvD,QAAM,WAAWA,SAAQ,MAAM;AAC/B,MAAIC,YAAW,QAAQ,KAAKC,UAAS,QAAQ,EAAE,YAAY,GAAG;AAC5D,WAAOC,MAAK,UAAU,YAAY;AAAA,EACpC;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,aAA4B,QAAyB;AAC/E,MAAI,aAAa,YAAY,EAAE,SAAS,kBAAkB,EAAG,QAAO;AACpE,QAAM,SAAS,OAAO,SAAS,GAAG,GAAG,EAAE,SAAS,MAAM,EAAE,UAAU;AAClE,SAAO,OAAO,WAAW,GAAG,MAAM,OAAO,SAAS,SAAW,KAAK,OAAO,SAAS,QAAU;AAC9F;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAA+B;AACzC,SAAK,UAAU,QAAQ,QAAQ,QAAQ,QAAQ,EAAE;AACjD,SAAK,SAAS,QAAQ;AACtB,SAAK,SAAS,QAAQ,SAAS,WAAW;AAC1C,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EAEA,WAAW,KAAa,UAA+B,CAAC,GAAW;AACjE,kBAAc,GAAG;AACjB,UAAM,SAAS,IAAI,gBAAgB;AACnC,WAAO,IAAI,OAAO,GAAG;AACrB,QAAI,QAAQ,SAAU,QAAO,IAAI,YAAY,QAAQ,QAAQ;AAC7D,QAAI,OAAO,QAAQ,cAAc,UAAW,QAAO,IAAI,MAAM,QAAQ,YAAY,MAAM,GAAG;AAC1F,WAAO,GAAG,KAAK,OAAO,qBAAqB,OAAO,SAAS,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAM,SAAS,KAAa,UAAmC,CAAC,GAAoC;AAClG,kBAAc,GAAG;AACjB,UAAM,MAAM,KAAK,WAAW,KAAK,OAAO;AACxC,UAAM,aAAa,kBAAkB,KAAK,QAAQ,MAAM;AACxD,UAAM,SAAS,aAAa;AAAA,MAC1B,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,GAAG,KAAK,MAAM;AAEd,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,KAAK,OAAO,KAAK;AAAA,QAChC,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS;AAAA,UACP,kBAAkB,KAAK;AAAA,UACvB,UAAU;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAc;AACrB,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,YAAMC,SAAQ,IAAI,SAAS,UAAU,eAAe,kBAAkB,GAAG,EAAE;AAC3E,aAAO,QAAQA,MAAK;AACpB,YAAMA;AAAA,IACR;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAMA,SAAQ,IAAI,SAAS,UAAU,iBAAiB,mBAAmB,EAAE,QAAQ,IAAI,CAAC;AACxF,aAAO,QAAQA,QAAO,SAAS,MAAM;AACrC,YAAMA;AAAA,IACR;AACA,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAMA,SAAQ,IAAI,SAAS,UAAU,kBAAkB,+BAA+B,GAAG,IAAI,EAAE,QAAQ,IAAI,CAAC;AAC5G,aAAO,QAAQA,QAAO,SAAS,MAAM;AACrC,YAAMA;AAAA,IACR;AACA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACjD,YAAMA,SAAQ,IAAI;AAAA,QAChB,UAAU;AAAA,QACV,QAAQ,SAAS,MAAM,KAAK,QAAQ,SAAS,UAAU;AAAA,QACvD,EAAE,QAAQ,SAAS,OAAO;AAAA,MAC5B;AACA,aAAO,QAAQA,QAAO,SAAS,MAAM;AACrC,YAAMA;AAAA,IACR;AAEA,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,UAAM,SAAS,OAAO,KAAK,MAAM,SAAS,YAAY,CAAC;AACvD,QAAI,mBAAmB,aAAa,MAAM,GAAG;AAC3C,UAAI,UAAU;AACd,UAAI;AACF,cAAM,OAAO,KAAK,MAAM,OAAO,SAAS,MAAM,CAAC;AAC/C,kBAAU,KAAK,WAAW,KAAK,SAAS,KAAK,QAAQ;AAAA,MACvD,QAAQ;AAAA,MAER;AACA,YAAMA,SAAQ,IAAI,SAAS,UAAU,cAAc,OAAO;AAC1D,aAAO,QAAQA,QAAO,SAAS,MAAM;AACrC,YAAMA;AAAA,IACR;AAEA,WAAO,QAAQ,SAAS,QAAQ,EAAE,OAAO,OAAO,YAAY,WAAW,YAAY,CAAC;AAEpF,UAAM,MAAMC,SAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD,UAAM,UAAU,YAAY,MAAM;AAClC,mBAAe,UAAU,kBAAkB,EAAE,OAAO,OAAO,YAAY,WAAW,YAAY,CAAC;AAE/F,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,OAAO;AAAA,MACd,UAAU;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;;;AFzJA,IAAMC,cAAa;AAMnB,SAAS,cAAc,SAAuD;AAC5E,QAAM,cAAc,IAAI,gBAAgB;AACxC,QAAM,OAAO,kBAAkB,eAAe,OAAO,GAAG,WAAW;AACnE,SAAO,EAAE,QAAQ,KAAK,QAAQ,SAAS,KAAK,QAAQ;AACtD;AAEA,SAAS,SAAS,MAAuB;AACvC,QAAM,UAAU,QAAQ,aAAa,WACjC,SACA,QAAQ,aAAa,UACnB,QACA;AACN,QAAM,OAAO,QAAQ,aAAa,UAAU,CAAC,MAAM,SAAS,IAAI,IAAI,IAAI,CAAC,IAAI;AAC7E,MAAI;AACF,UAAM,QAAQ,MAAM,SAAS,MAAM,EAAE,UAAU,MAAM,OAAO,SAAS,CAAC;AACtE,UAAM,MAAM;AACZ,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,sBAA+B;AAC7C,QAAM,SAAS,IAAIC,SAAQ,QAAQ,EAAE,YAAY,sBAAsB;AAEvE,SACG,QAAQ,KAAK,EACb,YAAY,sCAAsC,EAClD,SAAS,SAAS,wCAAwC,EAC1D,OAAO,OAAO,KAAa,OAAgB,QAAiB;AAC3D,UAAM,WAAWD,YAAW,GAAG;AAE/B,QAAI;AACF,YAAM,EAAE,QAAQ,QAAQ,IAAI,cAAc,GAAG;AAC7C,YAAM,SAAS,IAAI,sBAAsB,EAAE,SAAS,OAAO,CAAC;AAC5D,YAAM,MAAM,MAAM,OAAO,SAAS,GAAG;AACrC,kCAA4B;AAAA,QAC1B,eAAe,sBAAsB,GAAG;AAAA,QACxC,gBAAgB,IAAI;AAAA,QACpB,cAAc,IAAI,YAAY;AAAA,MAChC,CAAC;AAED,UAAI,UAAU;AACZ,kBAAU,YAAY,cAAc;AAAA,UAClC,IAAI,IAAI;AAAA,UACR,MAAM,IAAI;AAAA,UACV,cAAc,IAAI;AAAA,UAClB,QAAQ,IAAI;AAAA,UACZ,YAAY,IAAI;AAAA,UAChB,aAAa,IAAI;AAAA,UACjB,SAAS,IAAI;AAAA,UACb,eAAe,IAAI;AAAA,UACnB,OAAO,IAAI;AAAA,UACX,YAAY,IAAI;AAAA,UAChB,YAAY,IAAI;AAAA,QAClB,CAAC,CAAC;AAAA,MACJ,OAAO;AACL,QAAM,QAAQ,mBAAmB;AACjC,QAAM,KAAK,iBAAiB,IAAI,EAAE,EAAE;AACpC,QAAM,KAAK,iBAAiB,IAAI,IAAI,EAAE;AACtC,QAAM,KAAK,iBAAiB,IAAI,YAAY,EAAE;AAC9C,QAAM,KAAK,iBAAiB,IAAI,eAAe,EAAE;AACjD,QAAM,KAAK,iBAAiB,IAAI,OAAO,EAAE;AACzC,YAAI,IAAI,eAAe;AACrB,UAAM,KAAK,iBAAiB,IAAI,aAAa,EAAE;AAAA,QACjD;AACA,QAAM,KAAK,gBAAgB;AAC3B,mBAAW,KAAK,IAAI,aAAa;AAC/B,UAAM,KAAK,SAAS,CAAC,EAAE;AAAA,QACzB;AACA,QAAM,KAAK,iBAAiB,IAAI,UAAU,EAAE;AAAA,MAC9C;AAAA,IACF,SAAS,KAAc;AACrB,UAAI,eAAe,UAAU;AAC3B,YAAI,UAAU;AACZ,oBAAU,UAAU,cAAc,IAAI,MAAM,IAAI,SAAS,IAAI,OAAO,CAAC;AAAA,QACvE,OAAO;AACL,UAAM,MAAM,IAAI,OAAO;AAAA,QACzB;AACA,gBAAQ,WAAW;AACnB;AAAA,MACF;AACA,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,UAAI,UAAU;AACZ,kBAAU,UAAU,cAAc,UAAU,cAAc,GAAG,CAAC;AAAA,MAChE,OAAO;AACL,QAAM,MAAM,GAAG;AAAA,MACjB;AACA,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,MAAM,EACd,YAAY,iDAAiD,EAC7D,SAAS,SAAS,aAAa,EAC/B,OAAO,uBAAuB,+BAA+B,EAC7D,OAAO,qBAAqB,0CAA0C,EACtE,OAAO,QAAQ,2BAA2B,EAC1C,OAAO,aAAa,2CAA2C,EAC/D,OAAO,OAAO,KAAa,MAA4E,QAAiB;AACvH,UAAM,WAAWA,YAAW,GAAG;AAE/B,QAAI;AACF,YAAM,EAAE,QAAQ,QAAQ,IAAI,cAAc,GAAG;AAC7C,YAAM,SAAS,IAAI,cAAc,EAAE,SAAS,OAAO,CAAC;AACpD,YAAM,SAAS,MAAM,OAAO,SAAS,KAAK;AAAA,QACxC,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,QACf,WAAW,KAAK;AAAA,MAClB,CAAC;AACD,YAAM,aAAa,KAAK,SAAS;AACjC,YAAM,SAAS,aAAa,SAAS,OAAO,IAAI,IAAI;AACpD,kCAA4B;AAAA,QAC1B,eAAe,sBAAsB,GAAG;AAAA,QACxC,aAAa,oBAAoB,OAAO,KAAK;AAAA,QAC7C,WAAW,KAAK,OAAO;AAAA,QACvB,gBAAgB;AAAA,QAChB;AAAA,MACF,CAAC;AAED,UAAI,UAAU;AACZ,kBAAU,YAAY,eAAe;AAAA,UACnC,KAAK,OAAO;AAAA,UACZ,MAAM,OAAO;AAAA,UACb,OAAO,OAAO;AAAA,UACd,WAAW,OAAO;AAAA,UAClB;AAAA,QACF,CAAC,CAAC;AAAA,MACJ,OAAO;AACL,QAAM,QAAQ,eAAe,OAAO,IAAI,EAAE;AAC1C,QAAM,KAAK,aAAa,OAAO,GAAG,EAAE;AACpC,QAAM,KAAK,aAAa,OAAO,KAAK,EAAE;AACtC,YAAI,OAAO,SAAU,CAAM,KAAK,aAAa,OAAO,QAAQ,EAAE;AAC9D,QAAM,KAAK,aAAa,MAAM,EAAE;AAAA,MAClC;AAAA,IACF,SAAS,KAAc;AACrB,UAAI,eAAe,UAAU;AAC3B,YAAI,UAAU;AACZ,oBAAU,UAAU,eAAe,IAAI,MAAM,IAAI,SAAS,IAAI,OAAO,CAAC;AAAA,QACxE,OAAO;AACL,UAAM,MAAM,IAAI,OAAO;AAAA,QACzB;AACA,gBAAQ,WAAW;AACnB;AAAA,MACF;AACA,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,UAAI,UAAU;AACZ,kBAAU,UAAU,eAAe,UAAU,cAAc,GAAG,CAAC;AAAA,MACjE,OAAO;AACL,QAAM,MAAM,GAAG;AAAA,MACjB;AACA,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;;;AG/KA,SAAS,WAAAE,gBAAe;AAmDjB,IAAM,2BAA2B;AAAA,EACtC,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,0BAA0B;AAAA,EAC1B,kCAAkC;AAAA,EAClC,mCAAmC;AAAA,EACnC,iBAAiB;AACnB;AASA,IAAM,eAA6B;AAAA,EACjC;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,eAAe;AAAA,IACf,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,eAAe;AAAA,IACf,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,eAAe;AAAA,IACf,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,eAAe;AAAA,IACf,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,eAAe;AAAA,IACf,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,eAAe;AAAA,IACf,kBAAkB;AAAA,EACpB;AACF;AAOO,SAAS,kBAAgC;AAC9C,SAAO,CAAC,GAAG,YAAY;AACzB;AAKO,SAAS,UAAU,UAAiC,QAAmC;AAC5F,QAAM,SAAsB,CAAC;AAE7B,aAAW,WAAW,UAAU;AAC9B,UAAM,cAAc,QAAQ,gBAAgB,WAAW,iBAAiB,IACpE,UACA,QAAQ,gBAAgB,WAAW,iBAAiB,IAClD,UACA,QAAQ,gBAAgB,WAAW,iBAAiB,IAClD,UACF;AACN,QAAI,CAAC,eAAgB,UAAU,gBAAgB,OAAS;AACxD,UAAM,MAAM,iBAAiB,QAAQ,iBAAiB,WAAW;AACjE,QAAI,CAAC,IAAK;AACV,WAAO,KAAK;AAAA,MACV,IAAI,QAAQ;AAAA,MACZ,MAAM,QAAQ,QAAQ,QAAQ,SAAS;AAAA,MACvC;AAAA,MACA,QAAQ;AAAA,MACR,SAAS,QAAQ;AAAA,MACjB,UAAU,EAAE,UAAU,QAAQ,IAAI,UAAU,CAAC,cAAc,OAAO,QAAQ,EAAE,CAAC,EAAE;AAAA,MAC/E,oBAAoB,QAAQ,sBAAsB,CAAC;AAAA,MACnD,0BAA0B,MAAM,QAAQ,QAAQ,kBAAkB;AAAA,MAClE,2BAA2B,QAAQ,6BAA6B;AAAA,MAChE,2BAA2B,QAAQ,6BAA6B;AAAA,MAChE,2BAA2B,+BAA+B;AAAA,QACxD,UAAU,QAAQ;AAAA,QAClB,GAAI,QAAQ,QAAQ,EAAE,SAAS,QAAQ,MAAM,IAAI,CAAC;AAAA,QAClD,SAAS;AAAA,MACX,CAAC;AAAA,MACD,aAAa,QAAQ;AAAA,MACrB,OAAO,QAAQ;AAAA,MACf,eAAe,QAAQ;AAAA,MACvB,WAAW,QAAQ,aAAa,CAAC;AAAA,MACjC,aAAa,QAAQ,oBAAoB,CAAC;AAAA,MAC1C,MAAM,QAAQ;AAAA,MACd,cAAc,QAAQ,iBAAiB;AAAA,IACzC,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAKA,SAASC,YAAW,KAAuB;AACzC,MAAI,OAAgB;AACpB,SAAO,KAAK,QAAQ;AAClB,WAAO,KAAK;AAAA,EACd;AACA,SAAO,KAAK,KAAK,EAAE,SAAS;AAC9B;AAIO,SAAS,qBAAqB,OAA2B,CAAC,GAAY;AAC3E,QAAM,UAAU,IAAIC,SAAQ,SAAS,EAAE,YAAY,8BAA8B;AAEjF,UACG,QAAQ,cAAc,EACtB,YAAY,mCAAmC,EAC/C,OAAO,CAAC,OAAO,QAAQ;AACtB,UAAM,WAAWD,YAAW,GAAG;AAC/B,UAAM,OAAO,gBAAgB;AAC7B,gCAA4B,EAAE,YAAY,KAAK,OAAO,CAAC;AACvD,mBAAe,WAAW,uBAAuB,EAAE,OAAO,KAAK,OAAO,CAAC;AAEvE,QAAI,UAAU;AACZ,gBAAU,YAAY,wBAAwB;AAAA,QAC5C,cAAc;AAAA,MAChB,GAAG;AAAA,QACD,EAAE,SAAS,gCAAgC,aAAa,wBAAwB;AAAA,MAClF,CAAC,CAAC;AAAA,IACJ,OAAO;AACL,MAAM,QAAQ,wBAAwB;AACtC,iBAAW,OAAO,MAAM;AACtB,QAAM,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,MAAM,GAAG;AAC1C,QAAM,KAAK,OAAO,IAAI,WAAW,EAAE;AACnC,QAAM,KAAK,sBAAsB,IAAI,aAAa,EAAE;AACpD,QAAM,KAAK,gBAAgB,IAAI,gBAAgB,EAAE;AACjD,QAAM,KAAK,EAAE;AAAA,MACf;AAAA,IACF;AAAA,EACF,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,YAAY,uBAAuB,EACnC,OAAO,qBAAqB,2CAA2C,EACvE,OAAO,OAAO,MAAM,QAAQ;AAC3B,UAAM,WAAWA,YAAW,GAAG;AAC/B,UAAM,YAAY,KAAK;AACvB,QAAI,cAAc,UAAa,cAAc,WAAW,cAAc,WAAW,cAAc,SAAS;AACtG,YAAM,IAAI,SAAS,UAAU,kBAAkB,0BAA0B,SAAS,qCAAqC;AAAA,IACzH;AACA,UAAM,SAAS;AACf,UAAM,cAAc,KAAK,eAAe,IAAI,gBAAgB;AAC5D,UAAM,OAAO,kBAAkB,eAAe,GAAG,GAAG,WAAW;AAC/D,UAAM,SAAS,IAAI,uBAAuB;AAAA,MACxC,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,IAC5C,CAAC;AACD,UAAM,WAAW,MAAM,OAAO,WAAW;AACzC,UAAM,SAAS,UAAU,UAAU,MAAM;AACzC,gCAA4B;AAAA,MAC1B,YAAY,OAAO;AAAA,MACnB,qBAAqB,SAAS;AAAA,MAC9B,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,IAC7B,CAAC;AACD,mBAAe,WAAW,iBAAiB;AAAA,MACzC,OAAO,OAAO;AAAA,MACd,qBAAqB,SAAS;AAAA,MAC9B,QAAQ;AAAA,MACR,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,IAC7B,CAAC;AAED,QAAI,UAAU;AACZ,gBAAU,YAAY,kBAAkB;AAAA,QACtC;AAAA,QACA,OAAO,OAAO;AAAA,QACd,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,GAAI,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACzC,GAAG;AAAA,QACD,EAAE,SAAS,sCAAsC,aAAa,oBAAoB;AAAA,MACpF,CAAC,CAAC;AAAA,IACJ,OAAO;AACL,YAAM,QAAQ,SAAS,aAAa,MAAM,YAAY;AACtD,MAAM,QAAQ,KAAK;AACnB,iBAAW,KAAK,QAAQ;AACtB,QAAM,KAAK,KAAK,EAAE,IAAI,KAAK,EAAE,GAAG,MAAM,EAAE,MAAM,GAAG;AACjD,QAAM,KAAK,eAAe,EAAE,WAAW,GAAG,EAAE,eAAe,uBAAoB,EAAE,EAAE;AACnF,YAAI,EAAE,QAAS,CAAM,KAAK,gBAAgB,EAAE,OAAO,EAAE;AACrD,QAAM,KAAK,0BAA0B,EAAE,EAAE,EAAE;AAAA,MAC7C;AACA,MAAM,KAAK;AAAA,WAAc,OAAO,MAAM,SAAS;AAAA,IACjD;AAAA,EACF,CAAC;AAEH,SAAO;AACT;;;AC5QA,SAAS,WAAAE,gBAAe;AAexB,SAAS,6BAA6B,OAAqB,MAAkB;AAC3E,MAAI,KAAK,WAAW,eAAe,KAAK,WAAW,SAAU,QAAO;AACpE,QAAM,YAAY,KAAK,cACjB,KAAK,SAAS,SAAS,OAAO,IAAI,UAAU,KAAK,SAAS,SAAS,OAAO,KAAK,KAAK,SAAS,SAAS,OAAO,IAAI,UAAU;AACjI,SAAO,MAAM,aAAa;AAAA,IACxB,QAAQ,KAAK;AAAA,IACb,aAAa,KAAK;AAAA,IAClB,SAAS,KAAK;AAAA,IACd,MAAM,KAAK;AAAA,IACX,WAAW,KAAK;AAAA,IAChB,WAAW,KAAK,aAAa,IAAI,CAAC,SAAS;AAAA,MACzC;AAAA,MACA,WAAW,cAAc,UAAU,cAAc,cAAc,UAAU,eAAe;AAAA,IAC1F,EAAE;AAAA,IACF,QAAQ,KAAK;AAAA,IACb,GAAI,KAAK,QAAQ,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,MAAM,SAAS,KAAK,MAAM,QAAQ,EAAE,IAAI,CAAC;AAAA,EACxF,CAAC;AACH;AAEA,SAAS,iBAAiB,OAAqB,MAAqC;AAClF,SAAO,KAAK,aAAa,IAAI,UAAU,EAAE,WAAW,MAAM,aAAa,EAAE,CAAC;AAC5E;AAsBO,SAAS,qBAAqB,OAA2B,CAAC,GAAkB;AACjF,QAAM,QAAQ,KAAK,gBAAgB,IAAI,aAAa;AACpD,MAAI,SAAS,MAAM,UAAU;AAE7B,MAAI,CAAC,QAAQ;AACX,UAAM,eAAe,iBAAiB,OAAO,IAAI,EAC9C,KAAK,EACL,KAAK,CAAC,SAAS,KAAK,WAAW,eAAe,KAAK,WAAW,QAAQ;AACzE,QAAI,cAAc;AAChB,UAAI;AACF,cAAM,UAAU,6BAA6B,OAAO,YAAY;AAChE,YAAI,QAAS,UAAS,EAAE,UAAU,QAAQ,UAAU,SAAS,QAAQ,SAAS,WAAW,QAAQ,UAAU;AAAA,MAC7G,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM,UAAU;AAAA,QAChB,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,WAAW,OAAO,SAAS;AAAA,MAC3B,YAAY,OAAO;AAAA,MACnB,SAAS,OAAO,SAAS;AAAA,MACzB,UAAU,OAAO;AAAA,MACjB,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AACF;AAKO,SAAS,qBAAqB,QAAgB,OAA2B,CAAC,GAAkB;AACjG,QAAM,QAAQ,KAAK,gBAAgB,IAAI,aAAa;AACpD,MAAI,SAAS,MAAM,kBAAkB,MAAM;AAE3C,MAAI,CAAC,QAAQ;AACX,UAAM,OAAO,iBAAiB,OAAO,IAAI,EAAE,WAAW,MAAM;AAC5D,QAAI,MAAM;AACR,UAAI;AACF,cAAM,UAAU,6BAA6B,OAAO,IAAI;AACxD,YAAI,QAAS,UAAS,EAAE,UAAU,QAAQ,UAAU,SAAS,QAAQ,SAAS,WAAW,QAAQ,UAAU;AAAA,MAC7G,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM,UAAU;AAAA,QAChB,SAAS,oCAAoC,MAAM;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,WAAW,OAAO,SAAS;AAAA,MAC3B,YAAY,OAAO;AAAA,MACnB,SAAS,OAAO,SAAS;AAAA,MACzB,UAAU,OAAO;AAAA,MACjB,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AACF;AAKA,SAASC,YAAW,KAAuB;AACzC,MAAI,OAAgB;AACpB,SAAO,KAAK,QAAQ;AAClB,WAAO,KAAK;AAAA,EACd;AACA,SAAO,KAAK,KAAK,EAAE,SAAS;AAC9B;AAEA,SAAS,kBAAkB,MAAgD;AACzE,EAAM,QAAQ,gBAAgB;AAC9B,EAAM,KAAK,kBAAkB,KAAK,SAAS,EAAE;AAC7C,EAAM,KAAK,kBAAkB,KAAK,OAAO,EAAE;AAC3C,EAAM,KAAK,kBAAkB,KAAK,QAAQ,MAAM,EAAE;AAClD,EAAM,KAAK,kBAAkB,KAAK,QAAQ,KAAK,EAAE;AACjD,EAAM,KAAK,kBAAkB,KAAK,QAAQ,aAAa,EAAE;AACzD,EAAM,KAAK,kBAAkB,KAAK,UAAU,EAAE;AAC9C,MAAI,KAAK,SAAS,UAAU,SAAS,GAAG;AACtC,IAAM,KAAK,cAAc;AACzB,eAAW,KAAK,KAAK,SAAS,WAAW;AACvC,MAAM,KAAK,SAAS,EAAE,GAAG,KAAK,EAAE,aAAa,SAAS,GAAG;AAAA,IAC3D;AAAA,EACF;AACA,MAAI,KAAK,QAAQ,KAAK,SAAS,GAAG;AAChC,IAAM,KAAK,iBAAiB;AAC5B,eAAW,KAAK,KAAK,QAAQ,MAAM;AACjC,MAAM,KAAK,OAAO,EAAE,OAAO,EAAE;AAAA,IAC/B;AAAA,EACF;AACF;AAIO,SAAS,qBAAqB,OAA2B,CAAC,GAAY;AAC3E,QAAM,UAAU,IAAIC,SAAQ,SAAS,EAAE,YAAY,wCAAwC;AAE3F,UACG,QAAQ,QAAQ,EAChB,YAAY,qCAAqC,EACjD,OAAO,CAAC,OAAO,QAAQ;AACtB,UAAM,WAAWD,YAAW,GAAG;AAC/B,UAAM,SAAS,qBAAqB,IAAI;AAExC,QAAI,OAAO,MAAM,OAAO,MAAM;AAC5B,kCAA4B;AAAA,QAC1B,OAAO;AAAA,QACP,gBAAgB,OAAO,KAAK,SAAS,UAAU;AAAA,MACjD,CAAC;AACD,UAAI,UAAU;AACZ,kBAAU,YAAY,kBAAkB;AAAA,UACtC,WAAW,OAAO,KAAK;AAAA,UACvB,YAAY,OAAO,KAAK;AAAA,UACxB,SAAS,OAAO,KAAK;AAAA,UACrB,UAAU,OAAO,KAAK;AAAA,UACtB,SAAS,OAAO,KAAK;AAAA,QACvB,GAAG,OAAO,KAAK,QAAQ,IAAI,CAAC;AAAA,MAC9B,OAAO;AACL,0BAAkB,OAAO,IAAI;AAAA,MAC/B;AAAA,IACF,OAAO;AACL,UAAI,UAAU;AACZ,kBAAU;AAAA,UACR;AAAA,UACA,OAAO,MAAO;AAAA,UACd,OAAO,MAAO;AAAA,QAChB,CAAC;AAAA,MACH,OAAO;AACL,QAAM,MAAM,OAAO,MAAO,OAAO;AAAA,MACnC;AACA,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,YAAY,yCAAyC,EACrD,SAAS,aAAa,oBAAoB,EAC1C,OAAO,CAAC,QAAQ,OAAO,QAAQ;AAC9B,UAAM,WAAWA,YAAW,GAAG;AAC/B,UAAM,SAAS,qBAAqB,QAAQ,IAAI;AAEhD,QAAI,OAAO,MAAM,OAAO,MAAM;AAC5B,kCAA4B;AAAA,QAC1B,OAAO;AAAA,QACP,gBAAgB,OAAO,KAAK,SAAS,UAAU;AAAA,MACjD,CAAC;AACD,UAAI,UAAU;AACZ,kBAAU,YAAY,kBAAkB;AAAA,UACtC,WAAW,OAAO,KAAK;AAAA,UACvB,YAAY,OAAO,KAAK;AAAA,UACxB,SAAS,OAAO,KAAK;AAAA,UACrB,UAAU,OAAO,KAAK;AAAA,UACtB,SAAS,OAAO,KAAK;AAAA,QACvB,GAAG,OAAO,KAAK,QAAQ,IAAI,CAAC;AAAA,MAC9B,OAAO;AACL,0BAAkB,OAAO,IAAI;AAAA,MAC/B;AAAA,IACF,OAAO;AACL,UAAI,UAAU;AACZ,kBAAU;AAAA,UACR;AAAA,UACA,OAAO,MAAO;AAAA,UACd,OAAO,MAAO;AAAA,QAChB,CAAC;AAAA,MACH,OAAO;AACL,QAAM,MAAM,OAAO,MAAO,OAAO;AAAA,MACnC;AACA,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;;;ACjQA,SAAS,WAAAE,gBAAe;AACxB,SAAS,YAAAC,WAAU,WAAAC,gBAAe;AAClC,SAAS,UAAU,YAAY;;;ACJ/B,SAAS,eAAe;AAKjB,IAAM,qBAAqB,oBAAI,IAAI;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,qBAAqB,oBAAI,IAAI;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,qBAAqB,oBAAI,IAAI;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,kBAAkB,OAAuB;AACvD,SAAO,MAAM,KAAK,EAAE,YAAY,EAAE,QAAQ,QAAQ,EAAE;AACtD;AAEO,SAAS,kBAAkB,UAA4C;AAC5E,QAAM,aAAa,kBAAkB,QAAQ;AAC7C,MAAI,mBAAmB,IAAI,UAAU,EAAG,QAAO;AAC/C,MAAI,mBAAmB,IAAI,UAAU,EAAG,QAAO;AAC/C,MAAI,mBAAmB,IAAI,UAAU,EAAG,QAAO;AAC/C,SAAO;AACT;AAEO,SAAS,sBAAsB,UAAsC;AAC1E,QAAM,MAAM,kBAAkB,QAAQ,QAAQ,CAAC;AAC/C,SAAO,IAAI,SAAS,IAAI,MAAM;AAChC;AAEO,SAAS,0BAA0B,UAAgC;AACxE,QAAM,aAAa,kBAAkB,QAAQ;AAC7C,QAAM,SAAS,kBAAkB,UAAU;AAC3C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR,UAAU;AAAA,MACV,0BAA0B,cAAc,SAAS;AAAA,IACnD;AAAA,EACF;AACA,SAAO;AACT;;;ACxDA,SAASC,UAAS,OAAqD;AACrE,SAAO,SAAS,OAAO,UAAU,WAAW,QAAmC;AACjF;AAEA,eAAe,kBAAkB,UAA0C;AACzE,QAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACjD,MAAI,CAAC,KAAK,KAAK,EAAG,QAAO,CAAC;AAC1B,MAAI;AAAE,WAAO,KAAK,MAAM,IAAI;AAAA,EAAkB,QACxC;AAAE,UAAM,IAAI,SAAS,UAAU,cAAc,yCAAyC,EAAE,QAAQ,SAAS,OAAO,CAAC;AAAA,EAAG;AAC5H;AAEA,SAAS,eAAe,QAAgB,UAAiC;AACvE,QAAM,OAAO,SAAS,OAAO;AAC7B,QAAM,UAAU,SAAS,OAAO,WAAW,uBAAuB,MAAM;AACxE,QAAM,UAAU,EAAE,QAAQ,KAAK;AAC/B,MAAI,WAAW,IAAK,QAAO,IAAI,SAAS,UAAU,iBAAiB,WAAW,mBAAmB,OAAO;AACxG,MAAI,WAAW,OAAO,SAAS,sBAAuB,QAAO,IAAI,SAAS,UAAU,qBAAqB,SAAS,OAAO;AACzH,MAAI,WAAW,OAAO,SAAS,sBAAuB,QAAO,IAAI,SAAS,UAAU,qBAAqB,SAAS,OAAO;AACzH,MAAI,WAAW,OAAO,SAAS,oBAAqB,QAAO,IAAI,SAAS,UAAU,mBAAmB,SAAS,OAAO;AACrH,MAAI,sBAAsB,MAAM,OAAO,GAAG;AACxC,WAAO,mBAAmB,MAAM,SAAS,OAAO;AAAA,EAClD;AACA,MAAI,CAAC,cAAc,qBAAqB,qBAAqB,wBAAwB,wBAAwB,EAAE,SAAS,QAAQ,EAAE,GAAG;AACnI,WAAO,IAAI,SAAS,UAAU,kBAAkB,SAAS,OAAO;AAAA,EAClE;AACA,SAAO,IAAI,SAAS,UAAU,cAAc,SAAS,OAAO;AAC9D;AAEA,SAAS,kBAAkB,UAAyC;AAClE,MAAI,SAAS,OAAO,MAAO,OAAM,eAAe,KAAK,QAAQ;AAC7D,QAAM,OAAOA,UAAS,SAAS,IAAI;AACnC,MAAI,CAAC,KAAM,OAAM,IAAI,SAAS,UAAU,cAAc,2CAA2C;AACjG,QAAM,UAAU,KAAK;AACrB,QAAM,WAAW,KAAK;AACtB,QAAM,UAAU,KAAK;AACrB,QAAM,OAAO,KAAK;AAClB,QAAM,cAAc,KAAK;AACzB,MAAI,OAAO,YAAY,YAAY,CAAC,QAAS,OAAM,IAAI,SAAS,UAAU,cAAc,+CAA+C;AACvI,MAAI,OAAO,aAAa,YAAY,aAAa,gBAAgB,OAAO,GAAI,OAAM,IAAI,SAAS,UAAU,cAAc,gDAAgD;AACvK,MAAI,SAAS,WAAW,SAAS,WAAW,SAAS,QAAS,OAAM,IAAI,SAAS,UAAU,cAAc,+CAA+C;AACxJ,MAAI,OAAO,YAAY,YAAY,CAAC,QAAQ,WAAW,UAAU,IAAI,GAAG,EAAG,OAAM,IAAI,SAAS,UAAU,cAAc,qDAAqD;AAC3K,MAAI,OAAO,gBAAgB,YAAY,CAAC,YAAa,OAAM,IAAI,SAAS,UAAU,cAAc,mDAAmD;AACnJ,SAAO,EAAE,SAAS,UAAU,SAAS,MAAM,YAAY;AACzD;AAEO,IAAM,sBAAN,MAA0B;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAAqC;AAC/C,SAAK,UAAU,QAAQ,QAAQ,QAAQ,QAAQ,EAAE;AACjD,SAAK,SAAS,QAAQ;AACtB,SAAK,SAAS,QAAQ,SAAS,WAAW;AAC1C,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EAEA,MAAM,WAAW,SAAuD;AACtE,UAAM,WAAW,kBAAkB,QAAQ,QAAQ;AACnD,UAAM,OAAO,kBAAkB,QAAQ;AACvC,QAAI,CAAC,KAAM,OAAM,IAAI,SAAS,UAAU,kBAAkB,0BAA0B,YAAY,SAAS,EAAE;AAC3G,QAAI,CAAC,QAAQ,YAAY,KAAK,EAAG,OAAM,IAAI,SAAS,UAAU,oBAAoB,0BAA0B;AAC5G,UAAM,SAAS,IAAI,gBAAgB,EAAE,cAAc,QAAQ,aAAa,WAAW,SAAS,CAAC;AAC7F,QAAI,QAAQ,SAAU,QAAO,IAAI,aAAa,QAAQ,QAAQ;AAC9D,QAAI,QAAQ,aAAc,QAAO,IAAI,kBAAkB,QAAQ,YAAY;AAC3E,UAAM,SAAS,aAAa;AAAA,MAC1B,QAAQ;AAAA,MAA0B,WAAW;AAAA,MAA0B,QAAQ;AAAA,MAAQ,MAAM;AAAA,MAC7F,UAAU,EAAE,cAAc,QAAQ,aAAa,WAAW,UAAU,MAAM,OAAO,QAAQ,OAAO,WAAW;AAAA,IAC7G,GAAG,KAAK,MAAM;AACd,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,KAAK,OAAO,GAAG,KAAK,OAAO,6BAA6B,OAAO,SAAS,CAAC,IAAI;AAAA,QAC5F,QAAQ;AAAA,QACR,SAAS,EAAE,kBAAkB,KAAK,QAAQ,gBAAgB,4BAA4B,UAAU,mBAAmB;AAAA,QACnH,MAAM,QAAQ;AAAA,MAChB,CAAgB;AAAA,IAClB,SAAS,KAAc;AACrB,YAAMC,SAAQ,IAAI,SAAS,UAAU,eAAe,kBAAkB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AACxH,aAAO,QAAQA,MAAK;AACpB,YAAMA;AAAA,IACR;AACA,QAAI;AACF,YAAM,WAAW,MAAM,kBAAkB,QAAQ;AACjD,UAAI,CAAC,SAAS,GAAI,OAAM,eAAe,SAAS,QAAQ,QAAQ;AAChE,YAAM,SAAS,kBAAkB,QAAQ;AACzC,UAAI,OAAO,gBAAgB,QAAQ,YAAa,OAAM,IAAI,SAAS,UAAU,cAAc,6CAA6C;AACxI,UAAI,OAAO,SAAS,KAAM,OAAM,IAAI,SAAS,UAAU,cAAc,2CAA2C;AAChH,aAAO,QAAQ,SAAS,QAAQ,EAAE,UAAU,OAAO,SAAS,MAAM,OAAO,KAAK,CAAC;AAC/E,aAAO;AAAA,IACT,SAASA,QAAO;AACd,aAAO,QAAQA,QAAO,SAAS,MAAM;AACrC,YAAMA;AAAA,IACR;AAAA,EACF;AACF;;;ACxGA,SAAS,kBAAkB;AAC3B,SAAS,wBAAwB;;;ACN1B,IAAM,4BAA4B,KAAK,OAAO;AAC9C,IAAM,uBAAuB,MAAM,OAAO;;;ACDjD,SAAS,YAAY;AACrB,YAAY,QAAQ;AACpB,SAAS,YAAY;AAiCrB,SAASC,UAAS,OAAqD;AACrE,SAAO,SAAS,OAAO,UAAU,WAAW,QAAmC;AACjF;AAEA,SAAS,cAAc,UAA0B;AAC/C,UAAQ,SAAS,YAAY,GAAG;AAAA,IAC9B,KAAK;AAAO,aAAO;AAAA,IACnB,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAO,aAAO;AAAA,IACnB,KAAK;AAAO,aAAO;AAAA,IACnB,KAAK;AAAO,aAAO;AAAA,IACnB;AAAS,aAAO;AAAA,EAClB;AACF;AAEA,IAAM,YAAN,MAAM,WAAU;AAAA,EAKd,YACmB,UACjB,UACiB,aACjB,WACA,MACA;AALiB;AAEA;AAIjB,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,OAAO,KAAK,IAAI,GAAG,YAAY,WAAW;AAAA,EACjD;AAAA,EATmB;AAAA,EAEA;AAAA,EAPV;AAAA,EACA;AAAA,EACA;AAAA,EAcT,MAAM,QAAQ,GAAG,MAAM,KAAK,MAAM,cAAc,KAAK,MAAiB;AACpE,UAAM,gBAAgB,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAM,QAAQ,IAAI,KAAK,OAAO,QAAQ,KAAK,CAAC;AAC5F,UAAM,cAAc,KAAK,IAAI,eAAe,KAAK,IAAI,KAAK,MAAM,MAAM,IAAI,KAAK,OAAO,MAAM,GAAG,CAAC;AAChG,WAAO,IAAI;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,cAAc;AAAA,MACnB,KAAK,cAAc;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,cAAoC;AACxC,UAAM,SAAS,MAAM,KAAK,KAAK,UAAU,GAAG;AAC5C,QAAI;AACF,YAAM,QAAQ,OAAO,YAAY,KAAK,IAAI;AAC1C,UAAI,SAAS;AACb,aAAO,SAAS,MAAM,YAAY;AAChC,cAAM,EAAE,UAAU,IAAI,MAAM,OAAO,KAAK,OAAO,QAAQ,MAAM,aAAa,QAAQ,KAAK,cAAc,MAAM;AAC3G,YAAI,cAAc,EAAG,OAAM,IAAI,MAAM,uDAAuD;AAC5F,kBAAU;AAAA,MACZ;AACA,aAAO,MAAM,OAAO,MAAM,MAAM,YAAY,MAAM,aAAa,MAAM,UAAU;AAAA,IACjF,UAAE;AACA,YAAM,OAAO,MAAM;AAAA,IACrB;AAAA,EACF;AACF;AAEA,eAAe,cAAc,SAAgD;AAC3E,QAAM,WAAW,cAAc,QAAQ,QAAQ;AAC/C,QAAMC,cAA8G;AACpH,MAAIA,aAAY;AACd,UAAM,OAAO,MAAMA,YAAW,QAAQ,UAAU,EAAE,MAAM,SAAS,CAAC;AAClE,WAAO,IAAI,KAAK,CAAC,IAAI,GAAG,QAAQ,UAAU,EAAE,MAAM,SAAS,CAAC;AAAA,EAC9D;AAGA,SAAO,IAAI,UAAU,QAAQ,UAAU,QAAQ,UAAU,GAAG,QAAQ,UAAU,QAAQ;AACxF;AAEA,SAAS,aAAaC,OAA+B,OAA4B;AAC/E,QAAM,QAAQF,UAASE,MAAK,KAAK;AACjC,QAAM,SAAS,CAAC,aAAa,WAAW,WAAW;AACnD,QAAM,OAAwC,CAAC;AAC/C,aAAW,SAAS,QAAQ;AAC1B,UAAM,QAAQ,QAAQ,KAAK;AAC3B,QAAI,OAAO,UAAU,SAAU,MAAK,KAAK,IAAI;AAC7C,QAAI,OAAO,UAAU,SAAU,MAAK,KAAK,IAAI,kBAAkB,OAAO,KAAK;AAAA,EAC7E;AACA,SAAO,OAAO,KAAK,IAAI,EAAE,SAAS,IAAI,KAAK,UAAU,IAAI,IAAI;AAC/D;AAEA,SAAS,kBAAkB,SAAiB,OAA4B;AACtE,MAAI,WAAW;AACf,aAAW,SAAS,CAAC,MAAM,aAAa,MAAM,iBAAiB,MAAM,YAAY,GAAG;AAClF,QAAI,MAAO,YAAW,SAAS,MAAM,KAAK,EAAE,KAAK,YAAY;AAAA,EAC/D;AACA,SAAO,SAAS,MAAM,GAAG,GAAG;AAC9B;AAGA,SAAS,6BAAyC;AAChD,QAAM,UAAU;AAChB,QAAM,YAAoD,CAAC;AAC3D,QAAM,UAAU,CAAC,KAAa,UAAyB;AACrD,QAAI,QAAQ,GAAG,MAAM,OAAW;AAChC,YAAQ,GAAG,IAAI;AACf,cAAU,KAAK,EAAE,KAAK,MAAM,CAAC;AAAA,EAC/B;AACA,UAAQ,QAAQ,IAAI;AACpB,UAAQ,aAAa,EAAE,WAAW,cAAc,QAAQ,OAAO,GAAG,CAAC;AACnE,UAAQ,UAAU,UAAU;AAC5B,MAAI,CAAC,QAAQ,YAAY;AACvB,YAAQ,cAAc,MAAM,eAAe;AAAA,MACzC,SAA6B;AAAA,MAC7B,QAAsB;AAAA,MACtB,SAA+D;AAAA,MAC/D,UAAgE;AAAA,MAChE,kBAAkB,MAAkB;AAClC,aAAK,KAAK,YAAY,EAAE,KAAK,YAAU;AACrC,eAAK,SAAS;AACd,eAAK,SAAS,EAAE,QAAQ,KAAK,CAAC;AAAA,QAChC,GAAG,CAAAC,WAAS;AACV,eAAK,QAAQA,kBAAiB,QAAQA,SAAQ,IAAI,MAAM,OAAOA,MAAK,CAAC;AACrE,eAAK,UAAU,EAAE,QAAQ,KAAK,CAAC;AAAA,QACjC,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AACA,UAAQ,kBAAkB,uBAAuB;AACjD,SAAO,MAAM;AACX,eAAW,EAAE,KAAK,MAAM,KAAK,UAAU,QAAQ,GAAG;AAChD,UAAI,QAAQ,GAAG,MAAM,MAAO,QAAO,QAAQ,GAAG;AAAA,IAChD;AAAA,EACF;AACF;AAEA,SAAS,kCAA8C;AACrD,QAAM,eAAe,QAAQ;AAC7B,QAAM,eAAe,IAAI,SAA0B;AACjD,QAAI,KAAK,CAAC,MAAM,qCAAsC;AACtD,iBAAa,GAAG,IAAI;AAAA,EACtB;AACA,UAAQ,OAAO;AACf,SAAO,MAAM;AACX,QAAI,QAAQ,SAAS,aAAc,SAAQ,OAAO;AAAA,EACpD;AACF;AAEA,IAAM,kBAAN,MAAsB;AAAA,EACpB,aAAgD;AAAA,EAC/B,YAAY,oBAAI,IAA2C;AAAA,EAC5E,iBAAiB,MAAc,UAA0C;AACvE,UAAM,MAAM,KAAK,UAAU,IAAI,IAAI,KAAK,oBAAI,IAAI;AAChD,QAAI,IAAI,QAAQ;AAChB,SAAK,UAAU,IAAI,MAAM,GAAG;AAAA,EAC9B;AAAA,EACA,oBAAoB,MAAc,UAA0C;AAC1E,SAAK,UAAU,IAAI,IAAI,GAAG,OAAO,QAAQ;AAAA,EAC3C;AAAA,EACA,SAAS,MAAc,OAAsB;AAC3C,QAAI,SAAS,WAAY,MAAK,aAAa,KAAK;AAChD,eAAW,YAAY,KAAK,UAAU,IAAI,IAAI,KAAK,CAAC,EAAG,UAAS,KAAK;AAAA,EACvE;AACF;AAEA,IAAM,0BAAN,cAAsC,gBAAgB;AAAA,EACpD,aAAa;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAoB;AAAA,EACpB,eAAe;AAAA,EACf,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,SAAS,IAAI,gBAAgB;AAAA,EAC7B,qBAA0C;AAAA,EAC1C,SAA4C;AAAA,EAC5C,UAA6C;AAAA,EAC7C,YAA+C;AAAA,EAC/C,UAA6C;AAAA,EACrC,SAAS;AAAA,EACT,MAAM;AAAA,EACG,UAAU,IAAI,QAAQ;AAAA,EAC/B,kBAAkB,IAAI,QAAQ;AAAA,EAC9B,aAAqC;AAAA,EACrC,UAAU;AAAA,EAElB,KAAK,QAAgB,KAAmB;AACtC,SAAK,SAAS,OAAO,YAAY;AACjC,SAAK,MAAM;AACX,SAAK,iBAAiB,CAAC;AAAA,EACzB;AAAA,EACA,iBAAiB,MAAc,OAAqB;AAAE,SAAK,QAAQ,IAAI,MAAM,KAAK;AAAA,EAAG;AAAA,EACrF,kBAAkB,MAA6B;AAAE,WAAO,KAAK,gBAAgB,IAAI,IAAI;AAAA,EAAG;AAAA,EACxF,wBAAgC;AAC9B,WAAO,CAAC,GAAG,KAAK,gBAAgB,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,KAAK,KAAK;AAAA,CAAM,EAAE,KAAK,EAAE;AAAA,EAClG;AAAA,EACA,mBAAyB;AAAA,EAA4B;AAAA,EACrD,QAAc;AACZ,SAAK,UAAU;AACf,SAAK,YAAY,MAAM;AAAA,EACzB;AAAA,EACA,KAAK,MAAiC;AAAE,SAAK,KAAK,UAAU,QAAQ,IAAI;AAAA,EAAG;AAAA,EACnE,iBAAiB,OAAqB;AAC5C,SAAK,aAAa;AAClB,SAAK,qBAAqB;AAC1B,SAAK,SAAS,oBAAoB,CAAC,CAAC;AAAA,EACtC;AAAA,EACQ,KAAK,MAA8C,OAAsB;AAC/E,UAAM,UAAU,KAAK,KAAK,IAAI,EAAE;AAChC,cAAU,KAAK;AACf,SAAK,SAAS,MAAM,KAAK;AAAA,EAC3B;AAAA,EACA,MAAc,UAAU,MAAyC;AAC/D,SAAK,aAAa,IAAI,gBAAgB;AACtC,UAAM,QAAQ,KAAK,UAAU,IAAI,WAAW,MAAM,KAAK,YAAY,MAAM,SAAS,GAAG,KAAK,OAAO,IAAI;AACrG,QAAI;AACF,YAAM,OAAoB,EAAE,QAAQ,KAAK,QAAQ,SAAS,KAAK,SAAS,QAAQ,KAAK,WAAW,OAAO;AACvG,YAAM,cAAc,gBAAgB,YAAY,MAAM,KAAK,YAAY,IAAI;AAC3E,UAAI,KAAK,WAAW,SAAS,KAAK,WAAW,UAAU,gBAAgB,KAAM,MAAK,OAAO;AACzF,YAAM,QAAQ,gBAAgB,aAAa,gBAAgB,OAAO,KAAK,OAAO,gBAAgB,cAAc,KAAK,aAAa;AAC9H,WAAK,OAAO,SAAS,YAAY,EAAE,kBAAkB,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAClF,YAAM,WAAW,MAAM,MAAM,KAAK,KAAK,IAAI;AAC3C,WAAK,SAAS,SAAS;AACvB,WAAK,aAAa,SAAS;AAC3B,WAAK,kBAAkB,SAAS;AAChC,WAAK,iBAAiB,CAAC;AACvB,YAAM,QAAQ,MAAM,SAAS,YAAY;AACzC,WAAK,iBAAiB,CAAC;AACvB,UAAI,KAAK,iBAAiB,cAAe,MAAK,WAAW;AAAA,eAChD,KAAK,iBAAiB,OAAQ,MAAK,WAAW,IAAI,KAAK,CAAC,KAAK,CAAC;AAAA,WAClE;AACH,aAAK,eAAe,IAAI,YAAY,EAAE,OAAO,KAAK;AAClD,aAAK,WAAW,KAAK,iBAAiB,SAAS,KAAK,MAAM,KAAK,gBAAgB,MAAM,IAAI,KAAK;AAAA,MAChG;AACA,WAAK,OAAO,SAAS,YAAY,EAAE,kBAAkB,QAAQ,GAAG,QAAQ,OAAO,MAAM,CAAC;AACtF,WAAK,iBAAiB,CAAC;AACvB,WAAK,KAAK,QAAQ,CAAC,CAAC;AAAA,IACtB,SAASA,QAAO;AACd,UAAI,KAAK,WAAW,OAAO,QAAS,MAAK,KAAK,KAAK,UAAU,UAAU,WAAW,EAAE,OAAAA,OAAM,CAAC;AAAA,UACtF,MAAK,KAAK,SAAS,EAAE,OAAAA,OAAM,CAAC;AAAA,IACnC,UAAE;AACA,UAAI,MAAO,cAAa,KAAK;AAAA,IAC/B;AAAA,EACF;AACF;AAEA,eAAe,cAAc,SAAkD;AAC7E,QAAM,EAAE,SAAS,SAAS,IAAI,MAAM,OAAO,aAAa;AACxD,QAAM,OAAO,MAAM,cAAc,OAAO;AACxC,QAAM,WAAW,IAAI,SAAS;AAAA,IAC5B,OAAO,QAAQ,MAAM;AAAA,IACrB,QAAQ,QAAQ,MAAM;AAAA,IACtB,QAAQ,QAAQ;AAAA,IAChB,aAAa,EAAE,WAAW,QAAQ,MAAM,UAAU;AAAA,IAClD,OAAO;AAAA,IACP,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,EACnB,CAAC;AACD,QAAM,MAAM,SAAS,QAAQ;AAAA,IAC3B;AAAA,IACA,UAAU,QAAQ;AAAA,IAClB,eAAe,IAAI,QAAQ,SAAS,QAAQ,QAAQ,EAAE,CAAC;AAAA,IACvD,UAAU,EAAE,GAAG,QAAQ,MAAM,UAAU,aAAa,QAAQ,MAAM,SAAS,gBAAe,oBAAI,KAAK,GAAE,YAAY,EAAE;AAAA,IACnH,MAAM;AAAA,EACR,CAAC;AACD,SAAO,MAAM,IAAI,QAAgB,CAACC,UAAS,WAAW;AACpD,QAAI,UAAU;AACd,UAAM,YAAY,QAAQ,aAAa,KAAK,KAAK;AACjD,UAAM,UAAU,WAAW,MAAM;AAC/B,UAAI;AAAE,iBAAS,OAAO,GAAG;AAAA,MAAG,QAAQ;AAAA,MAAiC;AACrE,aAAO,MAAM,OAAO,IAAI,SAAS,UAAU,cAAc,qCAAqC,SAAS,IAAI,CAAC,CAAC;AAAA,IAC/G,GAAG,SAAS;AACZ,UAAM,UAAU,MAAY;AAC1B,mBAAa,OAAO;AACpB,eAAS,eAAe,YAAY,UAAU;AAC9C,eAAS,eAAe,YAAY,UAAU;AAC9C,eAAS,eAAe,SAAS,OAAO;AACxC,UAAI;AAAE,iBAAS,WAAW,GAAG;AAAA,MAAG,QAAQ;AAAA,MAAyC;AAAA,IACnF;AACA,UAAM,SAAS,CAAC,aAA+B;AAC7C,UAAI,QAAS;AACb,gBAAU;AACV,cAAQ;AACR,eAAS;AAAA,IACX;AACA,UAAM,YAAY,CAACF,UAA2CA,MAAK,QAAQ;AAC3E,UAAM,aAAa,CAACA,UAAwC;AAC1D,UAAI,UAAUA,KAAI,KAAK,OAAOA,MAAK,YAAY,SAAU,SAAQ,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAMA,MAAK,OAAO,CAAC,CAAC,CAAC;AAAA,IACnI;AACA,UAAM,aAAa,CAACA,UAAwC;AAC1D,UAAI,CAAC,UAAUA,KAAI,EAAG;AACtB,YAAM,SAASF,UAASE,MAAK,YAAY;AACzC,YAAM,MAAM,QAAQ,OAAO,QAAQ;AACnC,aAAO,MAAM;AACX,YAAI,OAAO,QAAQ,YAAY,IAAK,CAAAE,SAAQ,GAAG;AAAA,YAC1C,QAAO,IAAI,SAAS,UAAU,cAAc,kCAAkC,CAAC;AAAA,MACtF,CAAC;AAAA,IACH;AACA,UAAM,UAAU,CAACF,UAAwC;AACvD,UAAI,CAAC,UAAUA,KAAI,EAAG;AACtB,aAAO,MAAM,OAAO,IAAI,SAAS,UAAU,cAAc,6BAA6B,aAAaA,OAAM,QAAQ,MAAM,QAAQ,CAAC,EAAE,CAAC,CAAC;AAAA,IACtI;AACA,aAAS,GAAG,YAAY,UAAU;AAClC,aAAS,GAAG,YAAY,UAAU;AAClC,aAAS,GAAG,SAAS,OAAO;AAC5B,QAAI;AAAE,eAAS,MAAM,GAAG;AAAA,IAAG,SACpBC,QAAO;AACZ,YAAM,UAAU,kBAAkBA,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK,GAAG,QAAQ,MAAM,QAAQ;AAChH,aAAO,MAAM,OAAO,IAAI,SAAS,UAAU,cAAc,sCAAsC,OAAO,EAAE,CAAC,CAAC;AAAA,IAC5G;AAAA,EACF,CAAC;AACH;AAEO,IAAM,0BAA6C,OAAM,YAAW;AACzE,QAAM,iBAAiB,2BAA2B;AAClD,QAAM,iBAAiB,gCAAgC;AACvD,MAAI;AACF,WAAO,MAAM,cAAc,OAAO;AAAA,EACpC,UAAE;AACA,mBAAe;AACf,mBAAe;AAAA,EACjB;AACF;;;AF5SA,SAASE,UAAS,OAAqD;AACrE,SAAO,SAAS,OAAO,UAAU,WAAW,QAAmC;AACjF;AAEA,eAAe,SAAS,UAAoB,WAAqD;AAC/F,QAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACjD,MAAI;AACJ,MAAI;AAAE,WAAO,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC;AAAA,EAAG,QACrC;AAAE,UAAM,IAAI,SAAS,UAAU,cAAc,8BAA8B,SAAS,IAAI,EAAE,QAAQ,SAAS,OAAO,CAAC;AAAA,EAAG;AAC5H,QAAM,WAAWA,UAAS,IAAI,KAAK,CAAC;AACpC,MAAI,CAAC,SAAS,MAAM,SAAS,YAAY,OAAO;AAC9C,UAAMC,SAAQ,SAAS;AACvB,UAAM,UAAU,OAAOA,WAAU,WAC7BA,SACA,OAAOD,UAASC,MAAK,GAAG,YAAY,WAClCD,UAASC,MAAK,EAAG,UACjB,GAAG,SAAS,iBAAiB,SAAS,MAAM;AAClD,UAAM,UAAU,EAAE,QAAQ,SAAS,QAAQ,OAAO,OAAOA,WAAU,WAAWA,SAAQ,OAAU;AAChG,QAAI,SAAS,WAAW,IAAK,OAAM,IAAI,SAAS,UAAU,iBAAiB,SAAS,OAAO;AAC3F,QAAI,SAAS,WAAW,IAAK,OAAM,IAAI,SAAS,UAAU,qBAAqB,SAAS,OAAO;AAC/F,QAAI,SAAS,WAAW,IAAK,OAAM,IAAI,SAAS,UAAU,qBAAqB,SAAS,OAAO;AAC/F,QAAI,SAAS,WAAW,IAAK,OAAM,IAAI,SAAS,UAAU,mBAAmB,SAAS,OAAO;AAC7F,QAAI,SAAS,WAAW,IAAK,OAAM,IAAI,SAAS,UAAU,kBAAkB,SAAS,OAAO;AAC5F,UAAM,IAAI,SAAS,UAAU,cAAc,SAAS,OAAO;AAAA,EAC7D;AACA,SAAO;AACT;AAEA,eAAe,QAAQ,UAAmC;AACxD,QAAM,OAAO,WAAW,KAAK;AAC7B,mBAAiB,SAAS,iBAAiB,QAAQ,EAAG,MAAK,OAAO,KAAe;AACjF,SAAO,KAAK,OAAO,KAAK;AAC1B;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAAC,aAAW,WAAWA,UAAS,EAAE,CAAC;AACvD;AAEA,SAAS,iBAAiB,OAAyC;AACjE,QAAM,QAAQF,UAAS,KAAK;AAC5B,QAAM,MAAMA,UAAS,OAAO,QAAQ;AACpC,SAAO,OAAO,OAAO,UAAU,YAC1B,OAAO,SAAS,MAAM,KAAK,KAC3B,OAAO,MAAM,cAAc,YAAY,MAAM,UAAU,SAAS,KAChE,OAAO,MAAM,WAAW,YAAY,MAAM,OAAO,SAAS,KAC1D,OAAO,KAAK,gBAAgB,YAAY,IAAI,YAAY,SAAS,KACjE,OAAO,IAAI,oBAAoB,YAAY,IAAI,gBAAgB,SAAS,KACxE,OAAO,IAAI,iBAAiB,YAAY,IAAI,aAAa,SAAS,KAClE,OAAO,IAAI,gBAAgB,YAAY,IAAI,YAAY,SAAS;AACvE;AAEO,IAAM,sBAAN,MAA0B;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAAqC;AAC/C,SAAK,UAAU,QAAQ,QAAQ,QAAQ,QAAQ,EAAE;AACjD,SAAK,SAAS,QAAQ;AACtB,SAAK,QAAQ,QAAQ,SAAS,WAAW;AACzC,SAAK,SAAS,QAAQ;AACtB,SAAK,eAAe,QAAQ,gBAAgB;AAC5C,SAAK,iBAAiB,QAAQ,kBAAkB;AAChD,SAAK,YAAY,QAAQ,aAAa,KAAK,KAAK;AAAA,EAClD;AAAA,EAEQ,QAAQ,OAAO,OAA+B;AACpD,WAAO,EAAE,kBAAkB,KAAK,QAAQ,QAAQ,oBAAoB,GAAI,OAAO,EAAE,gBAAgB,mBAAmB,IAAI,CAAC,EAAG;AAAA,EAC9H;AAAA,EAEA,MAAc,QAAQ,KAAa,MAAmB,WAAsC;AAC1F,QAAI;AACF,aAAO,MAAM,KAAK,MAAM,KAAK,IAAI;AAAA,IACnC,SAASC,QAAO;AACd,YAAM,IAAI,SAAS,UAAU,eAAe,GAAG,SAAS,mBAAmBA,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK,CAAC,EAAE;AAAA,IACrI;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,SAA6D;AAC5E,QAAI,CAAC,QAAQ,YAAY,KAAK,EAAG,OAAM,IAAI,SAAS,UAAU,oBAAoB,0BAA0B;AAC5G,QAAI,CAAC,QAAQ,SAAS,KAAK,EAAG,OAAM,IAAI,SAAS,UAAU,kBAAkB,uBAAuB;AACpG,UAAM,WAAW,kBAAkB,QAAQ,QAAQ;AACnD,QAAI,kBAAkB,QAAQ,MAAM,SAAS;AAC3C,YAAM,IAAI,SAAS,UAAU,kBAAkB,+CAA+C,YAAY,SAAS,EAAE;AAAA,IACvH;AACA,QAAI,CAAC,OAAO,cAAc,QAAQ,QAAQ,KAAK,QAAQ,YAAY,GAAG;AACpE,YAAM,IAAI,SAAS,UAAU,kBAAkB,sCAAsC;AAAA,IACvF;AACA,QAAI,QAAQ,WAAW,sBAAsB;AAC3C,YAAM,IAAI,SAAS,UAAU,mBAAmB,uBAAuB,oBAAoB,iBAAiB;AAAA,IAC9G;AACA,UAAM,MAAM,aAAa;AAAA,MACvB,QAAQ;AAAA,MAA0B,WAAW;AAAA,MAAwB,QAAQ;AAAA,MAAQ,MAAM;AAAA,MAC3F,UAAU,EAAE,cAAc,QAAQ,aAAa,OAAO,QAAQ,SAAS;AAAA,IACzE,GAAG,KAAK,MAAM;AACd,QAAI;AACF,YAAM,QAAQ,IAAI,gBAAgB,EAAE,aAAa,QAAQ,aAAa,UAAU,OAAO,QAAQ,QAAQ,EAAE,CAAC;AAC1G,YAAM,gBAAgB,MAAM,KAAK;AAAA,QAC/B,GAAG,KAAK,OAAO,2BAA2B,KAAK;AAAA,QAC/C,EAAE,QAAQ,OAAO,SAAS,KAAK,QAAQ,EAAE;AAAA,QACzC;AAAA,MACF;AACA,YAAM,gBAAgB,MAAM,SAAS,eAAe,kBAAkB;AACtE,YAAM,QAAQ,cAAc;AAC5B,UAAI,CAAC,iBAAiB,KAAK,GAAG;AAC5B,cAAM,IAAI,SAAS,UAAU,cAAc,mCAAmC;AAAA,MAChF;AACA,YAAM,CAAC,KAAK,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC1C,KAAK,aAAa;AAAA,UAChB,UAAU,QAAQ;AAAA,UAClB,UAAU,QAAQ;AAAA,UAClB,UAAU,QAAQ;AAAA,UAClB;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,YAAY,QAAQ;AAAA,QACtB,CAAC;AAAA,QACD,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AACD,YAAM,iBAAiB,MAAM,KAAK,QAAQ,GAAG,KAAK,OAAO,4BAA4B;AAAA,QACnF,QAAQ;AAAA,QACR,SAAS,KAAK,QAAQ,IAAI;AAAA,QAC1B,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,UACA,aAAa,QAAQ;AAAA,UACrB,kBAAkB,QAAQ;AAAA,UAC1B,eAAe,QAAQ;AAAA,UACvB;AAAA,QACF,CAAC;AAAA,MACH,GAAG,mBAAmB;AACtB,YAAM,iBAAiB,MAAM,SAAS,gBAAgB,mBAAmB;AACzE,YAAM,SAASD,UAAS,eAAe,IAAI;AAC3C,UAAI,OAAO,QAAQ,YAAY,YAAY,OAAO,OAAO,WAAW,UAAU;AAC5E,cAAM,IAAI,SAAS,UAAU,cAAc,oCAAoC;AAAA,MACjF;AACA,YAAM,SAAS,MAAM,KAAK,iBAAiB,OAAO,QAAQ,QAAQ,WAAW;AAC7E,UAAI,QAAQ,KAAK,EAAE,UAAU,OAAO,SAAS,SAAS,OAAO,OAAO,CAAC;AACrE,aAAO;AAAA,QACL,SAAS,OAAO;AAAA,QAChB,UAAU,gBAAgB,OAAO,OAAO;AAAA,QACxC,SAAS,OAAO;AAAA,QAChB,QAAQ,OAAO;AAAA,QACf,aAAa,QAAQ;AAAA,MACvB;AAAA,IACF,SAASC,QAAO;AACd,UAAI,QAAQA,MAAK;AACjB,YAAMA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,iBAAiB,QAAgB,aAA6C;AAC1F,UAAM,WAAW,KAAK,IAAI,IAAI,KAAK;AACnC,WAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,YAAM,QAAQ,IAAI,gBAAgB,EAAE,QAAQ,YAAY,CAAC;AACzD,YAAM,WAAW,MAAM,KAAK;AAAA,QAC1B,GAAG,KAAK,OAAO,+BAA+B,KAAK;AAAA,QACnD,EAAE,QAAQ,OAAO,SAAS,KAAK,QAAQ,EAAE;AAAA,QACzC;AAAA,MACF;AACA,YAAM,WAAW,MAAM,SAAS,UAAU,sBAAsB;AAChE,YAAM,OAAOD,UAAS,SAAS,IAAI;AACnC,UAAI,CAAC,QAAQ,OAAO,KAAK,WAAW,SAAU,OAAM,IAAI,SAAS,UAAU,cAAc,uCAAuC;AAChI,WAAK,KAAK,WAAW,eAAe,KAAK,WAAW,eAAe,OAAO,KAAK,cAAc,YAAY,KAAK,UAAU,WAAW,eAAe,EAAG,QAAO;AAC5J,UAAI,KAAK,WAAW,YAAY,KAAK,WAAW,aAAa;AAC3D,cAAM,IAAI,SAAS,UAAU,cAAc,KAAK,gBAAgB,KAAK,aAAa,iBAAiB,KAAK,MAAM,EAAE;AAAA,MAClH;AACA,YAAM,MAAM,KAAK,cAAc;AAAA,IACjC;AACA,UAAM,IAAI,SAAS,UAAU,cAAc,iCAAiC,KAAK,SAAS,MAAM,EAAE,SAAS,OAAO,CAAC;AAAA,EACrH;AACF;;;AH3KA,IAAMG,cAAa;AACnB,IAAMC,eAAc;AAEpB,SAASC,kBAAiB,UAAmC,aAAsC;AACjG,QAAM,OAAO,SAAS;AACtB,MAAI,OAAO,SAAS,YAAY,KAAM,QAAO;AAC7C,QAAM,SAAS,QAAQ,IAAI,qBAAqB;AAChD,MAAI,OAAQ,QAAO;AACnB,QAAM,SAAS,YAAY,aAAa;AACxC,MAAI,OAAO,mBAAoB,QAAO,OAAO;AAC7C,QAAM,IAAI,SAAS,UAAU,oBAAoB,4DAA4D;AAC/G;AAEA,SAAS,uBAAuB,KAAa,QAA4B;AACvE,QAAM,iBAAiB,UAAU,MAAM;AACvC,MAAI,CAAC,IAAI,WAAW,cAAc,GAAG;AACnC,UAAM,IAAI,SAAS,UAAU,cAAc,uDAAuD,cAAc,EAAE;AAAA,EACpH;AACF;AAEO,SAAS,mBAAmB,QAAsB,UAAkB,UAAkB,WAAW,OAAgB;AACtH,SAAO,WAAW,YAAY,YAAY,aAAa,SAAS,YAAY;AAC9E;AAEA,eAAe,2BAA2B,UAAkB,QAAsC;AAChG,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,OAAO,QAAQ;AAAA,EAClC,QAAQ;AACN,UAAM,IAAI,SAAS,UAAU,kBAAkB,mBAAmB,QAAQ,EAAE;AAAA,EAC9E;AACA,MAAI,CAAC,SAAS,OAAO,GAAG;AACtB,UAAM,IAAI,SAAS,UAAU,kBAAkB,eAAe,QAAQ,EAAE;AAAA,EAC1E;AACA,MAAI,SAAS,QAAQ,GAAG;AACtB,UAAM,IAAI,SAAS,UAAU,kBAAkB,kBAAkB,QAAQ,EAAE;AAAA,EAC7E;AACA,SAAO,SAAS;AAClB;AAEA,eAAsB,kBACpB,QACA,WAAoC,CAAC,GACrC,OAA0B,CAAC,GACO;AAClC,QAAM,cAAc,KAAK,eAAe,IAAI,gBAAgB;AAC5D,QAAM,aAAa,KAAK,YAAY;AACpC,QAAM,SAAS,KAAK,QAAQ;AAE5B,QAAM,OAAO,kBAAkB,UAAU,WAAW;AACpD,QAAM,UAAU,KAAK;AACrB,QAAM,eAAeC,SAAQ,OAAO,IAAI;AACxC,QAAM,WAAW,MAAM,2BAA2B,cAAc,MAAM;AAEtE,QAAM,eAAe,OAAO,YAAY,sBAAsB,YAAY;AAC1E,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI,SAAS,UAAU,kBAAkB,qCAAqC,OAAO,IAAI,qBAAqB;AAAA,EACtH;AACA,QAAM,WAAW,kBAAkB,YAAY;AAC/C,QAAM,SAAS,0BAA0B,QAAQ;AACjD,MAAI,OAAO,QAAQ,QAAQ,WAAW,SAAS;AAC7C,UAAM,IAAI,SAAS,UAAU,kBAAkB,qCAAqC;AAAA,EACtF;AACA,iBAAe,UAAU,yBAAyB,EAAE,WAAW,UAAU,QAAQ,MAAM,SAAS,CAAC;AAEjG,QAAM,cAAcD,kBAAiB,UAAU,WAAW;AAC1D,QAAM,WAAW,OAAO,YAAYE,UAAS,YAAY;AAEzD,QAAM,SAAS,mBAAmB,QAAQ,UAAU,UAAU,OAAO,QAAQ,IAAI;AACjF,MAAI,QAAQ;AACV,QAAI,OAAO,cAAc;AACvB,YAAM,IAAI,SAAS,UAAU,kBAAkB,yDAAyD;AAAA,IAC1G;AACA,UAAMC,gBAAe,IAAI,oBAAoB;AAAA,MAC3C;AAAA,MACA,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,cAAc,KAAK;AAAA,MACnB,gBAAgB,KAAK;AAAA,MACrB,WAAW,KAAK;AAAA,IAClB,CAAC;AACD,UAAMC,YAAW,MAAMD,cAAa,WAAW,EAAE,UAAU,cAAc,UAAU,UAAU,UAAU,YAAY,CAAC;AACpH,2BAAuBC,UAAS,SAAS,OAAO;AAChD,mBAAe,UAAU,wBAAwB,EAAE,UAAUA,UAAS,SAAS,SAASA,UAAS,QAAQ,MAAM,UAAU,cAAc,YAAY,CAAC;AACpJ,WAAO;AAAA,MACL,KAAKA,UAAS;AAAA,MACd,UAAUA,UAAS;AAAA,MACnB,WAAWA,UAAS;AAAA,MACpB,UAAUA,UAAS;AAAA,MACnB,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,WAAW;AAAA,MACX,MAAM;AAAA,MACN,UAAU;AAAA,MACV,cAAc;AAAA,MACd,aAAa;AAAA,MACb,SAASA,UAAS;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,WAAW,YAAY;AAE5C,QAAM,eAAe,IAAI,oBAAoB,EAAE,SAAS,QAAQ,KAAK,QAAQ,OAAO,KAAK,MAAM,CAAC;AAChG,QAAM,WAAW,MAAM,aAAa,WAAW,EAAE,QAAQ,aAAa,UAAU,UAAU,cAAc,OAAO,aAAa,CAAC;AAC7H,iBAAe,UAAU,oBAAoB,EAAE,UAAU,SAAS,SAAS,QAAQ,SAAS,MAAM,MAAM,UAAU,cAAc,YAAY,CAAC;AAE7I,yBAAuB,SAAS,SAAS,SAAS,IAAI;AACtD,MAAI,SAAS,SAAS,QAAQ;AAC5B,UAAM,IAAI,SAAS,UAAU,cAAc,0CAA0C,SAAS,IAAI,EAAE;AAAA,EACtG;AACA,iBAAe,UAAU,4BAA4B,EAAE,UAAU,SAAS,SAAS,QAAQ,SAAS,MAAM,cAAc,YAAY,CAAC;AAErI,SAAO;AAAA,IACL,KAAK,SAAS;AAAA,IACd,UAAU,SAAS;AAAA,IACnB,WAAW,SAAS;AAAA,IACpB,UAAU,SAAS;AAAA,IACnB,QAAQ,SAAS;AAAA,IACjB,WAAW;AAAA,IACX,WAAW;AAAA,IACX,MAAM;AAAA,IACN,UAAU;AAAA,IACV,cAAc;AAAA,IACd,aAAa;AAAA,EACf;AACF;AAEO,SAAS,oBAAoB,OAA0B,CAAC,GAAY;AACzE,QAAM,SAAS,IAAIC,SAAQ,QAAQ,EAAE,YAAY,sCAAsC;AAEvF,SACG,QAAQ,MAAM,EACd,YAAY,uCAAuC,EACnD,SAAS,UAAU,iBAAiB,EACpC,OAAO,gBAAgB,2CAA2C,EAClE,OAAO,iBAAiB,sCAAsC,EAC9D,OAAO,+BAA+B,0CAA0C,EAChF,OAAO,SAAS,8CAA8C,EAC9D,OAAO,YAAY,4DAA4D,EAC/E,OAAO,OAAO,MAAc,MAAgG,QAAiB;AAC5I,UAAM,WAAWP,YAAW,GAAG;AAC/B,UAAM,WAAWC,aAAY,GAAG;AAChC,QAAI;AACF,YAAM,SAAS,MAAM,kBAAkB;AAAA,QACrC;AAAA,QACA,UAAU,KAAK;AAAA,QACf,UAAU,KAAK;AAAA,QACf,cAAc,KAAK;AAAA,QACnB,QAAQ,KAAK,WAAW;AAAA,QACxB,KAAK,KAAK,QAAQ;AAAA,MACpB,GAAG,UAAU,IAAI;AACjB,kCAA4B;AAAA,QAC1B,YAAY,OAAO;AAAA,QACnB,gBAAgB,OAAO;AAAA,QACvB,aAAa,oBAAoB,OAAO,IAAI;AAAA,QAC5C,aAAa,OAAO,eAAe;AAAA,QACnC,YAAY,KAAK,QAAQ;AAAA,QACzB,UAAU,OAAO;AAAA,MACnB,CAAC;AAED,UAAI,UAAU;AACZ,kBAAU,YAAY,eAAe,QAAQ;AAAA,UAC3C,EAAE,SAAS,sBAAsB,OAAO,GAAG,WAAW,aAAa,6BAA6B;AAAA,QAClG,CAAC,CAAC;AAAA,MACJ,OAAO;AACL,QAAM,QAAQ,aAAa,OAAO,GAAG,EAAE;AACvC,QAAM,KAAK,aAAa,OAAO,MAAM,EAAE;AACvC,QAAM,KAAK,aAAa,OAAO,SAAS,EAAE;AAC1C,QAAM,KAAK,aAAa,OAAO,IAAI,QAAQ;AAC3C,QAAM,KAAK,aAAa,OAAO,eAAe,QAAQ,EAAE;AACxD,YAAI,OAAO,QAAS,CAAM,KAAK,aAAa,OAAO,OAAO,EAAE;AAC5D,YAAI,OAAO,UAAW,CAAM,KAAK,aAAa,OAAO,SAAS,EAAE;AAChE,QAAM,KAAK,aAAa,OAAO,WAAW,QAAQ,OAAO,YAAY,MAAM,IAAI,EAAE;AAAA,MACnF;AAAA,IACF,SAAS,KAAc;AACrB,UAAI,eAAe,UAAU;AAC3B,YAAI,SAAU,WAAU,UAAU,eAAe,IAAI,MAAM,IAAI,SAAS,IAAI,OAAO,CAAC;AAAA,YAC/E,CAAM,MAAM,IAAI,OAAO;AAC5B,gBAAQ,WAAW;AACnB;AAAA,MACF;AACA,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,UAAI,SAAU,WAAU,UAAU,eAAe,UAAU,cAAc,GAAG,CAAC;AAAA,UACxE,CAAM,MAAM,GAAG;AACpB,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;;;AMrPA,SAAS,WAAAO,iBAAe;AAYxB,SAAS,aAAa,KAAuB;AAC3C,MAAI,OAAO;AACX,SAAO,KAAK,OAAQ,QAAO,KAAK;AAChC,SAAO,KAAK,KAAK,EAAE,SAAS;AAC9B;AAEA,SAASC,sBAAqB,OAA2B,MAAkC;AACzF,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,SAAS,OAAO,SAAS,OAAO,EAAE;AACxC,MAAI,CAAC,OAAO,UAAU,MAAM,KAAK,UAAU,GAAG;AAC5C,UAAM,IAAI,SAAS,UAAU,kBAAkB,GAAG,IAAI,8BAA8B;AAAA,EACtF;AACA,SAAO;AACT;AAEA,SAAS,YAAY,MAA2I;AAC9J,QAAM,SAAqB,CAAC,SAAS,QAAQ,QAAQ,OAAO;AAC5D,QAAM,aAA4B,CAAC,eAAe,KAAK;AACvD,MAAI,KAAK,SAAS,CAAC,OAAO,SAAS,KAAK,KAAiB,GAAG;AAC1D,UAAM,IAAI,SAAS,UAAU,kBAAkB,sBAAsB,KAAK,KAAK,GAAG;AAAA,EACpF;AACA,MAAI,KAAK,YAAY,CAAC,WAAW,SAAS,KAAK,QAAuB,GAAG;AACvE,UAAM,IAAI,SAAS,UAAU,kBAAkB,yBAAyB,KAAK,QAAQ,GAAG;AAAA,EAC1F;AACA,MAAI,KAAK,SAAS,OAAO,MAAM,KAAK,MAAM,KAAK,KAAK,CAAC,GAAG;AACtD,UAAM,IAAI,SAAS,UAAU,kBAAkB,8BAA8B,KAAK,KAAK,GAAG;AAAA,EAC5F;AACA,SAAO;AAAA,IACL,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAkB,IAAI,CAAC;AAAA,IACtD,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,IAC7C,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,SAAwB,IAAI,CAAC;AAAA,IAClE,GAAI,KAAK,QAAQ,EAAE,SAAS,KAAK,MAAM,IAAI,CAAC;AAAA,IAC5C,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,IAChD,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,IAC1C,GAAI,KAAK,QAAQ,EAAE,OAAOA,sBAAqB,KAAK,OAAO,SAAS,EAAE,IAAI,CAAC;AAAA,EAC7E;AACF;AAEA,SAAS,iBAAiB,SAA2B;AACnD,SAAO,QACJ,OAAO,mBAAmB,iCAAiC,EAC3D,OAAO,qBAAqB,6BAA6B,EACzD,OAAO,yBAAyB,2BAA2B,EAC3D,OAAO,sBAAsB,4BAA4B,EACzD,OAAO,oBAAoB,yCAAyC,EACpE,OAAO,uBAAuB,6CAA6C,EAC3E,OAAO,mBAAmB,kCAAkC;AACjE;AAEA,SAAS,YAAYC,QAAgB,UAAmB,MAAoB;AAC1E,QAAM,WAAWA,kBAAiB,WAC9BA,SACA,IAAI,SAAS,UAAU,cAAcA,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK,CAAC;AAC/F,MAAI,SAAU,WAAU,UAAU,MAAM,SAAS,MAAM,SAAS,SAAS,SAAS,OAAO,CAAC;AAAA,MACrF,CAAM,MAAM,SAAS,OAAO;AACjC,UAAQ,WAAW;AACrB;AAEO,SAAS,kBAAkB,OAAwB,CAAC,GAAY;AACrE,QAAM,OAAO,IAAIC,UAAQ,MAAM,EAAE,YAAY,iCAAiC;AAE9E,mBAAiB,KAAK,QAAQ,MAAM,EAAE,YAAY,iCAAiC,CAAC,EACjF,OAAO,CAAC,MAAM,QAAQ;AACrB,UAAM,WAAW,aAAa,GAAG;AACjC,QAAI;AACF,YAAM,QAAQ,KAAK,YAAY,IAAI,SAAS;AAC5C,YAAM,SAAS,YAAY,IAAI;AAC/B,YAAM,UAAU,MAAM,KAAK,MAAM;AACjC,kCAA4B;AAAA,QAC1B,aAAa,QAAQ;AAAA,QACrB,YAAY,OAAO,OAAO,MAAM,EAAE,KAAK,CAAC,UAAU,UAAU,MAAS;AAAA,MACvE,CAAC;AACD,UAAI,UAAU;AACZ,kBAAU,YAAY,aAAa,EAAE,MAAM,MAAM,MAAM,OAAO,QAAQ,QAAQ,QAAQ,CAAC,CAAC;AAAA,MAC1F,WAAW,QAAQ,WAAW,GAAG;AAC/B,QAAM,KAAK;AAAA,UAA2B,MAAM,IAAI,EAAE;AAAA,MACpD,OAAO;AACL,QAAM,QAAQ,SAAS,QAAQ,MAAM,GAAG;AACxC,mBAAW,SAAS,SAAS;AAC3B,gBAAM,SAAS,MAAM,MAAM,SAAS,WAAW,MAAM,KAAK,MAAM,KAAK;AACrE,UAAM,KAAK,GAAG,MAAM,SAAS,IAAI,MAAM,MAAM,YAAY,CAAC,IAAI,MAAM,MAAM,IAAI,MAAM,KAAK,GAAG,MAAM,EAAE;AAAA,QACtG;AAAA,MACF;AAAA,IACF,SAASD,QAAO;AACd,kBAAYA,QAAO,UAAU,WAAW;AAAA,IAC1C;AAAA,EACF,CAAC;AAEH;AAAA,IACE,KAAK,QAAQ,QAAQ,EAClB,YAAY,4BAA4B,EACxC,eAAe,uBAAuB,gCAAgC,EACtE,OAAO,qBAAqB,gCAAgC,OAAO,EACnE,OAAO,WAAW,mCAAmC;AAAA,EAC1D,EAAE,OAAO,CAAC,MAAM,QAAQ;AACtB,UAAM,WAAW,aAAa,GAAG;AACjC,QAAI;AACF,UAAI,KAAK,WAAW,UAAU,KAAK,WAAW,SAAS;AACrD,cAAM,IAAI,SAAS,UAAU,kBAAkB,0BAA0B,KAAK,MAAM,GAAG;AAAA,MACzF;AACA,YAAM,QAAQ,KAAK,YAAY,IAAI,SAAS;AAC5C,YAAM,SAAS,MAAM,OAAO;AAAA,QAC1B,QAAQ,KAAK;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,QAAQ,YAAY,IAAI;AAAA,QACxB,OAAO,KAAK,UAAU;AAAA,MACxB,CAAC;AACD,kCAA4B;AAAA,QAC1B,QAAQ,OAAO;AAAA,QACf,aAAa,OAAO;AAAA,QACpB,aAAa,oBAAoB,OAAO,KAAK;AAAA,MAC/C,CAAC;AACD,UAAI,SAAU,WAAU,YAAY,eAAe,MAAM,CAAC;AAAA,UACrD,CAAM,QAAQ,YAAY,OAAO,KAAK,mBAAmB,OAAO,IAAI,EAAE;AAAA,IAC7E,SAASA,QAAO;AACd,kBAAYA,QAAO,UAAU,aAAa;AAAA,IAC5C;AAAA,EACF,CAAC;AAED,OAAK,QAAQ,MAAM,EAChB,YAAY,8BAA8B,EAC1C,OAAO,CAAC,OAAO,QAAQ;AACtB,UAAM,WAAW,aAAa,GAAG;AACjC,UAAM,QAAQ,KAAK,YAAY,IAAI,SAAS;AAC5C,gCAA4B,EAAE,gBAAgB,KAAK,CAAC;AACpD,QAAI,SAAU,WAAU,YAAY,aAAa,EAAE,MAAM,MAAM,KAAK,CAAC,CAAC;AAAA,QACjE,CAAM,KAAK,MAAM,IAAI;AAAA,EAC5B,CAAC;AAEH,SAAO;AACT;;;AC9IA,SAAS,WAAAE,iBAAe;AA4BxB,SAAS,QAAQ,UAAmC,MAAwC;AAC1F,QAAM,cAAc,KAAK,eAAe,IAAI,gBAAgB;AAC5D,QAAM,OAAO,kBAAkB,UAAU,WAAW;AACpD,SAAO,EAAE,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC,EAAG;AACpG;AAEA,eAAsB,qBAAqB,KAA6C;AACtF,QAAM,UAAU,MAAM,IAAI,iBAAiB,GAAG,EAAE,WAAW;AAC3D,SAAO;AAAA,IACL,QAAQ,QAAQ;AAAA,IAChB,MAAM,QAAQ;AAAA,IACd,GAAI,OAAO,QAAQ,gBAAgB,WAAW,EAAE,aAAa,QAAQ,YAAY,IAAI,CAAC;AAAA,IACtF,GAAI,MAAM,QAAQ,QAAQ,cAAc,IAAI,EAAE,gBAAgB,QAAQ,eAAe,IAAI,CAAC;AAAA,EAC5F;AACF;AAEA,eAAsB,kBAAkB,MAAgB,KAAmD;AACzG,SAAO,MAAM,IAAI,iBAAiB,GAAG,EAAE,mBAAmB,IAAI;AAChE;AAEA,eAAsB,mBACpB,QACA,KACsH;AACtH,QAAM,CAAC,QAAQ,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC1C,IAAI,uBAAuB,GAAG,EAAE,WAAW;AAAA,IAC3C,IAAI,iBAAiB,GAAG,EAAE,WAAW;AAAA,EACvC,CAAC;AACD,QAAM,UAAU,qBAAqB,QAAQ;AAAA,IAC3C,GAAI,OAAO,UAAU,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;AAAA,IACpD,GAAI,OAAO,QAAQ,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,IAC9C,GAAI,OAAO,UAAU,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;AAAA,EACtD,CAAC;AACD,QAAM,YAAY,4BAA4B,OAAO;AACrD,2BAAyB,WAAW;AAAA,IAClC,GAAI,OAAO,aAAa,SAAY,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,IACrE,GAAI,OAAO,aAAa,EAAE,YAAY,OAAO,WAAW,IAAI,CAAC;AAAA,EAC/D,CAAC;AACD,QAAM,QAAQ,oBAAoB;AAAA,IAChC;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,GAAI,OAAO,aAAa,SAAY,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,IACrE,GAAI,OAAO,aAAa,EAAE,YAAY,OAAO,WAAW,IAAI,CAAC;AAAA,IAC7D,GAAI,OAAO,UAAU,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;AAAA,IACpD,GAAI,OAAO,2BAA2B,SAAY,EAAE,wBAAwB,OAAO,uBAAuB,IAAI,CAAC;AAAA,EACjH,CAAC;AACD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO,iBAAiB,SAAS;AAAA,IACjC,kBAAkB,QAAQ;AAAA,IAC1B,YAAY,QAAQ,UAAU,MAAM;AAAA,EACtC;AACF;AAEA,SAAS,aAAa,OAAe,MAAc,YAAY,OAAe;AAC5E,QAAM,SAAS,OAAO,KAAK;AAC3B,MAAI,CAAC,OAAO,SAAS,MAAM,MAAM,YAAY,SAAS,IAAI,UAAU,IAAI;AACtE,UAAM,IAAI,SAAS,UAAU,kBAAkB,GAAG,IAAI,YAAY,YAAY,qBAAqB,UAAU,EAAE;AAAA,EACjH;AACA,SAAO;AACT;AAEA,SAASC,aAAYC,QAAgB,UAAmB,MAAoB;AAC1E,QAAM,WAAWA,kBAAiB,WAC9BA,SACA,IAAI,SAAS,UAAU,cAAcA,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK,CAAC;AAC/F,MAAI,SAAU,WAAU,UAAU,MAAM,SAAS,MAAM,SAAS,SAAS,SAAS,OAAO,CAAC;AAAA,MACrF,CAAM,MAAM,SAAS,OAAO;AACjC,UAAQ,WAAW;AACrB;AAEO,SAAS,oBAAoB,OAA0B,CAAC,GAAY;AACzE,QAAM,SAAS,IAAIC,UAAQ,QAAQ,EAAE,YAAY,kEAAkE;AAEnH,SAAO,QAAQ,SAAS,EAAE,YAAY,iDAAiD,EAAE,OAAO,OAAO,OAAO,QAAQ;AACpH,UAAM,WAAW,aAAa,GAAG;AACjC,QAAI;AACF,YAAM,SAAS,MAAM,qBAAqB,QAAQ,eAAe,GAAG,GAAG,IAAI,CAAC;AAC5E,kCAA4B,EAAE,MAAM,OAAO,KAAK,CAAC;AACjD,UAAI,SAAU,WAAU,YAAY,kBAAkB,MAAM,CAAC;AAAA,WACxD;AACH,QAAM,QAAQ,qBAAqB,OAAO,MAAM,EAAE;AAClD,QAAM,KAAK,WAAW,OAAO,IAAI,EAAE;AAAA,MACrC;AAAA,IACF,SAASD,QAAO;AAAE,MAAAD,aAAYC,QAAO,UAAU,gBAAgB;AAAA,IAAG;AAAA,EACpE,CAAC;AAED,SAAO,QAAQ,MAAM,EAClB,YAAY,yDAAyD,EACrE,SAAS,aAAa,8BAA8B,EACpD,OAAO,OAAO,MAAgB,OAAO,QAAQ;AAC5C,UAAM,WAAW,aAAa,GAAG;AACjC,QAAI;AACF,YAAM,SAAS,MAAM,kBAAkB,MAAM,QAAQ,eAAe,GAAG,GAAG,IAAI,CAAC;AAC/E,kCAA4B;AAAA,QAC1B,WAAW,KAAK;AAAA,QAChB,eAAe,OAAO,QAAQ,OAAO,CAAC,UAAU,MAAM,WAAW,SAAS,EAAE;AAAA,QAC5E,iBAAiB,OAAO,QAAQ,OAAO,CAAC,UAAU,MAAM,WAAW,WAAW,EAAE;AAAA,QAChF,iBAAiB,OAAO,QAAQ,OAAO,CAAC,UAAU,MAAM,WAAW,WAAW,EAAE;AAAA,MAClF,CAAC;AACD,UAAI,SAAU,WAAU,YAAY,eAAe,MAAM,CAAC;AAAA,UACrD,YAAW,SAAS,OAAO,SAAS;AACvC,QAAM,KAAK,GAAG,MAAM,GAAG,KAAK,MAAM,MAAM,GAAG,MAAM,oBAAoB,SAAY,kBAAe,MAAM,eAAe,YAAY,EAAE,EAAE;AACrI,YAAI,MAAM,mBAAoB,CAAM,KAAK,KAAK,MAAM,kBAAkB,EAAE;AAAA,MAC1E;AAAA,IACF,SAASA,QAAO;AAAE,MAAAD,aAAYC,QAAO,UAAU,aAAa;AAAA,IAAG;AAAA,EACjE,CAAC;AAEH,SAAO,QAAQ,OAAO,EACnB,YAAY,mEAAmE,EAC/E,OAAO,mBAAmB,oCAAoC,EAC9D,OAAO,mBAAmB,+BAA+B,EACzD,OAAO,uBAAuB,2DAA2D,EACzF,OAAO,wBAAwB,+BAA+B,EAC9D,OAAO,6BAA6B,6BAA6B,EACjE,OAAO,uBAAuB,wBAAwB,EACtD,OAAO,wCAAwC,6BAA6B,GAAG,EAC/E,OAAO,OAAO,MAAwJ,QAAQ;AAC7K,UAAM,WAAW,aAAa,GAAG;AACjC,QAAI;AACF,YAAM,SAAS,MAAM,mBAAmB;AAAA,QACtC,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,QAChD,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,QAC1C,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,QAChD,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,aAAa,KAAK,UAAU,UAAU,EAAE,IAAI,CAAC;AAAA,QAC3F,GAAI,KAAK,aAAa,EAAE,YAAY,KAAK,WAAW,IAAI,CAAC;AAAA,QACzD,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,QAChD,wBAAwB,aAAa,KAAK,wBAAwB,4BAA4B,IAAI;AAAA,MACpG,GAAG,QAAQ,eAAe,GAAG,GAAG,IAAI,CAAC;AACrC,kCAA4B;AAAA,QAC1B,GAAI,OAAO,MAAM,aAAa,SAAY,EAAE,UAAU,OAAO,MAAM,SAAS,IAAI,CAAC;AAAA,QACjF,WAAW,OAAO,MAAM;AAAA,QACxB,GAAI,OAAO,MAAM,UAAU,EAAE,SAAS,OAAO,MAAM,QAAQ,IAAI,CAAC;AAAA,QAChE,GAAI,KAAK,WAAW,EAAE,kBAAkB,OAAO,KAAK,QAAQ,EAAE,IAAI,CAAC;AAAA,QACnE,GAAI,KAAK,aAAa,EAAE,YAAY,KAAK,WAAW,IAAI,CAAC;AAAA,QACzD,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,QAChD,kBAAkB,OAAO;AAAA,QACzB,YAAY,OAAO;AAAA,MACrB,CAAC;AACD,UAAI,SAAU,WAAU,YAAY,gBAAgB,MAAM,CAAC;AAAA,WACtD;AACH,QAAM,QAAQ,qBAAqB,OAAO,gBAAgB,EAAE;AAC5D,QAAM,KAAK,gBAAgB,OAAO,gBAAgB,SAAM,OAAO,aAAa,eAAe,cAAc,EAAE;AAC3G,QAAM,KAAK,OAAO,MAAM;AAAA,MAC1B;AAAA,IACF,SAASA,QAAO;AAAE,MAAAD,aAAYC,QAAO,UAAU,cAAc;AAAA,IAAG;AAAA,EAClE,CAAC;AAEH,SAAO;AACT;;;ACjLA,SAAS,WAAAE,iBAAe;AAWxB,SAAS,aAAa,OAAwB;AAC5C,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,KAAK;AACzB,YAAQ,IAAI,aAAa,YAAY,IAAI,aAAa,YAAY,IAAI,aAAa,OAAO,CAAC,IAAI,UAAU,CAAC,IAAI;AAAA,EAChH,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,kBAAkB,OAAwB,CAAC,GAAY;AACrE,QAAM,OAAO,IAAIC,UAAQ,MAAM,EAAE,YAAY,8BAA8B;AAE3E,OAAK,QAAQ,OAAO,EACjB,YAAY,mDAAmD,EAC/D,OAAO,mBAAmB,8CAA8C,EACxE,OAAO,oBAAoB,+CAA+C,EAC1E,OAAO,CAAC,MAA6C,QAAiB;AACrE,UAAM,WAAW,aAAa,GAAG;AACjC,UAAM,SAAS,KAAK,QAAQ,KAAK,KAAK,QAAQ,IAAI,gBAAgB,GAAG,KAAK;AAC1E,QAAI,CAAC,QAAQ;AACX,YAAM,UAAU;AAChB,UAAI,SAAU,WAAU,UAAU,cAAc,UAAU,kBAAkB,OAAO,CAAC;AAAA,UAC/E,CAAM,MAAM,OAAO;AACxB,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,cAAc,eAAe,GAAG,EAAE;AACxC,UAAM,WAAW,KAAK,YAAY,OAAO,gBAAgB,WAAW,cAAc,UAAa,KAAK;AACpG,QAAI,WAAW,CAAC,aAAa,OAAO,GAAG;AACrC,YAAM,UAAU;AAChB,UAAI,SAAU,WAAU,UAAU,cAAc,UAAU,kBAAkB,OAAO,CAAC;AAAA,UAC/E,CAAM,MAAM,OAAO;AACxB,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,cAAc,KAAK,eAAe,IAAI,gBAAgB;AAC5D,gBAAY,OAAO,EAAE,QAAQ,GAAI,UAAU,EAAE,SAAS,QAAQ,QAAQ,OAAO,EAAE,EAAE,IAAI,CAAC,EAAG,CAAC;AAC1F,UAAM,YAAY,YAAY,KAAK;AACnC,UAAM,aAAa,YAAY,cAAc;AAE7C,QAAI,UAAU;AACZ,gBAAU,YAAY,cAAc;AAAA,QAClC,eAAe;AAAA,QACf,UAAU,UAAU;AAAA,QACpB,aAAa;AAAA,MACf,CAAC,CAAC;AAAA,IACJ,OAAO;AACL,MAAM,QAAQ,oBAAoB,UAAU,EAAE;AAC9C,MAAM,KAAK,eAAe,UAAU,OAAO,EAAE;AAAA,IAC/C;AAAA,EACF,CAAC;AAEH,SAAO;AACT;;;AClEA,SAAS,WAAAC,iBAAe;;;ACAxB,OAAO,gBAAgB;AACvB,OAAO,YAAY;AACnB,SAAS,cAAAC,mBAAkB;;;ACF3B,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,aAAY;AAmBd,SAAS,qBAA6B;AAC3C,MAAI,QAAQ,IAAI,oBAAoB,GAAG,KAAK,EAAG,QAAO,QAAQ,IAAI,oBAAoB,EAAG,KAAK;AAC9F,MAAI,QAAQ,aAAa,SAAS;AAChC,UAAM,eAAe,QAAQ,IAAI,cAAc,GAAG,KAAK;AACvD,WAAOC,MAAK,gBAAgBA,MAAKC,SAAQ,GAAG,WAAW,OAAO,GAAG,YAAY;AAAA,EAC/E;AACA,SAAOD,MAAKC,SAAQ,GAAG,UAAU,SAAS,YAAY;AACxD;AAEO,SAAS,oBAA4B;AAC1C,SAAO,QAAQ,IAAI,uBAAuB,GAAG,KAAK,KAAKD,MAAK,mBAAmB,GAAG,cAAc;AAClG;AAEA,SAAS,SAAS,OAAiC;AACjD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAC5D;AAEO,SAAS,qBAAqB,OAAO,kBAAkB,GAAqB;AACjF,MAAI,CAACE,YAAW,IAAI,GAAG;AACrB,UAAM,IAAI;AAAA,MACR,UAAU;AAAA,MACV,qGAAqG,oBAAoB;AAAA,MACzH,EAAE,MAAM,WAAW,MAAM;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAMC,cAAa,MAAM,MAAM,EAAE,QAAQ,WAAW,EAAE,CAAC;AAAA,EACvE,SAASC,QAAO;AACd,UAAM,IAAI,SAAS,UAAU,cAAc,mCAAmC,IAAI,IAAI;AAAA,MACpF;AAAA,MACA,OAAOA,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK;AAAA,IAC9D,CAAC;AAAA,EACH;AAEA,QAAM,SAAS;AACf,MACE,OAAO,kBAAkB,KACtB,OAAO,YAAY,SACnB,CAAC,SAAS,OAAO,WAAW,KAC5B,CAAC,SAAS,OAAO,WAAW,KAC5B,CAAC,SAAS,OAAO,OAAO,KACxB,CAAC,SAAS,OAAO,WAAW,KAC5B,CAAC,SAAS,OAAO,SAAS,KAC1B,CAAC,SAAS,OAAO,QAAQ,KACzB,CAAC,SAAS,OAAO,OAAO,KACxB,CAAC,SAAS,OAAO,SAAS,GAC7B;AACA,UAAM,IAAI,SAAS,UAAU,cAAc,+BAA+B,IAAI,IAAI,EAAE,KAAK,CAAC;AAAA,EAC5F;AAEA,QAAM,mBAAmB,oBAAoB;AAC7C,MAAI,OAAO,gBAAgB,kBAAkB;AAC3C,UAAM,IAAI;AAAA,MACR,UAAU;AAAA,MACV,+BAA+B,OAAO,WAAW,0BAA0B,gBAAgB;AAAA,MAC3F,EAAE,MAAM,uBAAuB,OAAO,aAAa,mBAAmB,iBAAiB;AAAA,IACzF;AAAA,EACF;AACA,MAAI,OAAO,gBAAgB,sBAAsB;AAC/C,UAAM,IAAI;AAAA,MACR,UAAU;AAAA,MACV,2BAA2B,OAAO,WAAW,wCAAwC,oBAAoB;AAAA,MACzG,EAAE,MAAM,mBAAmB,OAAO,aAAa,eAAe,qBAAqB;AAAA,IACrF;AAAA,EACF;AAEA,SAAO;AACT;;;ADtEO,IAAM,uBAAsC,CAAC,YAAY,MAAM,YAAY,IAAI,QAAQ,CAACC,UAAS,WAAW;AACjH,QAAM,QAAQ,WAAW,YAAY,MAAM;AAAA,IACzC,OAAO,QAAQ,UAAU,YAAY,CAAC,UAAU,QAAQ,MAAM;AAAA,IAC9D,KAAK,QAAQ;AAAA,EACf,CAAC;AACD,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,CAAC,QAAQ,SAAS;AACpB,UAAM,QAAQ,YAAY,MAAM;AAChC,UAAM,QAAQ,YAAY,MAAM;AAChC,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAAE,gBAAU;AAAA,IAAO,CAAC;AAChE,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAAE,gBAAU;AAAA,IAAO,CAAC;AAAA,EAClE;AACA,QAAM,GAAG,SAAS,MAAM;AACxB,QAAM,GAAG,SAAS,CAAC,SAASA,SAAQ,EAAE,UAAU,QAAQ,GAAG,QAAQ,OAAO,CAAC,CAAC;AAC9E,CAAC;AAaD,SAAS,QAAQ,QAA0B,MAA0B;AACnE,SAAO,OAAO,WAAW,CAAC,GAAG,MAAM,cAAc,OAAO,QAAQ,IAAI;AACtE;AAEA,eAAe,WACb,QACA,YACA,MACA,SACwB;AACxB,MAAI;AACJ,MAAI;AACF,aAAS,MAAM,OAAO,YAAY,MAAM,EAAE,SAAS,QAAQ,YAAY,KAAK,CAAC;AAAA,EAC/E,SAASC,QAAO;AACd,UAAM,IAAI,SAAS,UAAU,mBAAmB,6BAA6B,QAAQ,SAAS,KAAK;AAAA,MACjG,OAAOA,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK;AAAA,MAC5D,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACA,MAAI,OAAO,aAAa,GAAG;AACzB,UAAM,IAAI,SAAS,UAAU,mBAAmB,oBAAoB,QAAQ,SAAS,KAAK;AAAA,MACxF,WAAW,OAAO;AAAA,MAClB,QAAQ,OAAO,OAAO,KAAK,KAAK;AAAA,MAChC,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,aAAgB,QAAgB,WAAsB;AAC7D,MAAI;AACF,WAAO,KAAK,MAAM,OAAO,KAAK,CAAC;AAAA,EACjC,QAAQ;AACN,UAAM,IAAI,SAAS,UAAU,mBAAmB,mCAAmC,SAAS,KAAK;AAAA,MAC/F,QAAQ,OAAO,KAAK;AAAA,MACpB,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACF;AAEO,SAAS,oBAAoB,KAAqB;AACvD,QAAM,aAAa,IAAI,KAAK,EAAE,QAAQ,YAAY,EAAE;AACpD,MAAI,OAAO,MAAM,UAAU,MAAM,MAAM;AACrC,UAAM,IAAI;AAAA,MACR,UAAU;AAAA,MACV,wBAAwB,GAAG;AAAA,IAC7B;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,qCAAqC,SAAuB;AAC1E,QAAM,cAAc,oBAAoB;AACxC,QAAM,UAAU,wBAAwB;AACxC,MAAI,CAAC,QAAQ,SAAS;AACpB,UAAM,IAAI;AAAA,MACR,UAAU;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACA,QAAM,aAAa,OAAO,WAAW,OAAO;AAC5C,MAAI,QAAQ,eAAe,eAAe,eAAe,MAAM;AAC7D,UAAM,IAAI;AAAA,MACR,UAAU;AAAA,MACV,wDAAwD,OAAO;AAAA,IACjE;AAAA,EACF;AACA,MAAI,QAAQ,eAAe,cAAc,eAAe,MAAM;AAC5D,UAAM,IAAI;AAAA,MACR,UAAU;AAAA,MACV,OAAO,WAAW,8CAA8C,OAAO;AAAA,IACzE;AAAA,EACF;AACF;AAEA,SAAS,2BAA6C;AACpD,QAAM,UAAU,wBAAwB;AACxC,MAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ,SAAS;AACxC,UAAM,IAAI;AAAA,MACR,UAAU;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAS,qBAAqB;AACpC,MAAI,OAAO,YAAY,QAAQ,SAAS;AACtC,UAAM,IAAI,SAAS,UAAU,cAAc,4BAA4B,OAAO,OAAO,qBAAqB,QAAQ,OAAO,IAAI;AAAA,EAC/H;AACA,SAAO;AACT;AAEA,eAAe,eACb,QACA,UACA,QACiB;AACjB,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA,OAAO;AAAA,IACP,QAAQ,QAAQ,CAAC,QAAQ,GAAG,OAAO,WAAW,IAAI,QAAQ,IAAI,WAAW,QAAQ,CAAC;AAAA,IAClF,EAAE,WAAW,aAAa,QAAQ,GAAG;AAAA,EACvC;AACA,QAAM,QAAQ,aAAsB,OAAO,QAAQ,aAAa,QAAQ,EAAE;AAC1E,MAAI,OAAO,UAAU,YAAY,OAAO,MAAM,KAAK,MAAM,MAAM;AAC7D,UAAM,IAAI,SAAS,UAAU,mBAAmB,wCAAwC,QAAQ,MAAM;AAAA,MACpG;AAAA,MACA,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACA,uCAAqC,KAAK;AAC1C,SAAO;AACT;AAEA,eAAe,uBAAuB,QAA0B,UAAkB,QAAsC;AACtH,MAAI,CAACC,YAAW,OAAO,SAAS,GAAG;AACjC,UAAM,IAAI,SAAS,UAAU,mBAAmB,sCAAsC,OAAO,SAAS,EAAE;AAAA,EAC1G;AACA,QAAM,SAAS,MAAM,WAAW,QAAQ,OAAO,UAAU,CAAC,OAAO,WAAW,WAAW,GAAG;AAAA,IACxF,WAAW;AAAA,EACb,CAAC;AACD,MAAI,OAAO,OAAO,KAAK,MAAM,UAAU;AACrC,UAAM,IAAI,SAAS,UAAU,mBAAmB,8CAA8C;AAAA,MAC5F;AAAA,MACA,QAAQ,OAAO,OAAO,KAAK;AAAA,MAC3B,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACF;AAEA,eAAe,uBACb,QACA,SACA,QACe;AACf,QAAM;AAAA,IACJ;AAAA,IACA,OAAO;AAAA,IACP,QAAQ,QAAQ;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,GAAG,OAAO,WAAW,IAAI,OAAO;AAAA,IAClC,CAAC;AAAA,IACD,EAAE,SAAS,MAAM,WAAW,cAAc,OAAO,WAAW,IAAI,OAAO,GAAG;AAAA,EAC5E;AACA,QAAM,uBAAuB,QAAQ,SAAS,MAAM;AACtD;AAEA,eAAe,oBACb,QACA,SACA,QACe;AACf,MAAI;AACF,UAAM,uBAAuB,QAAQ,SAAS,MAAM;AAAA,EACtD,SAASD,QAAO;AACd,QAAI,WAAqD;AACzD,QAAI;AACJ,QAAI,OAAO,MAAM,WAAW,MAAM,QAAQ,OAAO,IAAI,aAAa,OAAO,GAAG;AAC1E,UAAI;AACF,cAAM,uBAAuB,QAAQ,aAAa,MAAM;AACxD,mBAAW;AAAA,MACb,SAAS,SAAS;AAChB,mBAAW;AACX,wBAAgB,mBAAmB,QAAQ,QAAQ,UAAU,OAAO,OAAO;AAAA,MAC7E;AAAA,IACF;AACA,UAAM,IAAI,SAAS,UAAU,mBAAmB,qBAAqB,OAAO,WAAW,IAAI,OAAO,KAAK;AAAA,MACrG,OAAOA,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK;AAAA,MAC5D;AAAA,MACA,GAAI,gBAAgB,EAAE,gBAAgB,cAAc,IAAI,CAAC;AAAA,MACzD,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACF;AAEA,eAAsB,UACpB,UAAgD,CAAC,GACjD,SAAwB,sBACY;AACpC,QAAM,UAAU,wBAAwB;AACxC,MAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ,SAAS;AACxC,yCAAqC,WAAW;AAChD,UAAM,IAAI,MAAM,aAAa;AAAA,EAC/B;AACA,QAAM,SAAS,yBAAyB;AACxC,QAAM,gBAAgB,MAAM,eAAe,QAAQ,QAAQ,SAAS,MAAM;AAC1E,QAAM,kBAAkB,OAAO,GAAG,eAAe,WAAW;AAC5D,QAAM,gBAAgB,CAAC,QAAQ,UAAU,mBAAmB,QAAQ,UAAU;AAC9E,MAAI,eAAe;AACjB,UAAM,oBAAoB,QAAQ,eAAe,MAAM;AAAA,EACzD;AACA,SAAO;AAAA,IACL,aAAa,oBAAoB;AAAA,IACjC,SAAS,OAAO;AAAA,IAChB,UAAU,QAAQ;AAAA,IAClB,kBAAkB;AAAA,IAClB,SAAS;AAAA,IACT,kBAAkB;AAAA,IAClB,SAAS;AAAA,IACT,cAAc,QAAQ,UAAU;AAAA,EAClC;AACF;AAEA,eAAsB,kBACpB,YACA,SAAwB,sBACY;AACpC,QAAM,SAAS,yBAAyB;AACxC,QAAM,UAAU,oBAAoB,UAAU;AAC9C,uCAAqC,OAAO;AAC5C,QAAM,WAAW,MAAM,eAAe,QAAQ,SAAS,MAAM;AAC7D,QAAM,oBAAoB,QAAQ,UAAU,MAAM;AAClD,SAAO;AAAA,IACL,aAAa,oBAAoB;AAAA,IACjC,SAAS,OAAO;AAAA,IAChB,UAAU,OAAO;AAAA,IACjB,kBAAkB;AAAA,IAClB,SAAS;AAAA,IACT,kBAAkB,OAAO,GAAG,UAAU,WAAW;AAAA,IACjD,SAAS,OAAO,IAAI,aAAa,QAAQ;AAAA,IACzC,cAAc;AAAA,EAChB;AACF;AAEA,eAAsB,gBACpB,SAAwB,sBACiE;AACzF,QAAM,UAAU,wBAAwB;AACxC,QAAM,SAAS,yBAAyB;AACxC,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA,OAAO;AAAA,IACP,QAAQ,QAAQ,CAAC,QAAQ,OAAO,aAAa,YAAY,QAAQ,CAAC;AAAA,IAClE,EAAE,WAAW,uBAAuB;AAAA,EACtC;AACA,QAAM,MAAM,aAAsB,OAAO,QAAQ,sBAAsB;AACvE,QAAM,SAAS,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,GAAG;AAC9C,QAAM,WAAW,OACd,OAAO,CAAC,UAA2B,OAAO,UAAU,YAAY,OAAO,MAAM,KAAK,MAAM,IAAI,EAC5F,OAAO,CAAC,UAAU,QAAQ,eAAe,aAAa,OAAO,WAAW,KAAK,MAAM,OAAO,OAAO,WAAW,KAAK,MAAM,IAAI,EAC3H,KAAK,OAAO,QAAQ;AACvB,SAAO,EAAE,aAAa,oBAAoB,GAAG,SAAS,OAAO,aAAa,UAAU,QAAQ,SAAU,SAAS;AACjH;;;AD/RA,SAAS,eAAe,MAAc,QAA+C,SAAwB;AAC3G,MAAI,aAAa,OAAO,GAAG;AACzB,cAAU,YAAY,MAAM,MAAM,CAAC;AACnC;AAAA,EACF;AACA,MAAI,OAAO,cAAc;AACvB,QAAI,OAAO,iBAAkB,CAAM,KAAK,qBAAqB,OAAO,gBAAgB,OAAO,OAAO,OAAO,KAAK,OAAO,QAAQ,GAAG;AAAA,aACvH,OAAO,qBAAqB,OAAO,QAAS,CAAM,QAAQ,UAAU,OAAO,gBAAgB,mBAAmB,OAAO,QAAQ,IAAI;AAAA,QACrI,CAAM,KAAK,mBAAmB,OAAO,gBAAgB,kCAAkC,OAAO,OAAO,mCAAmC;AAC7I;AAAA,EACF;AACA,MAAI,OAAO,QAAS,CAAM,QAAQ,UAAU,OAAO,gBAAgB,OAAO,OAAO,OAAO,EAAE;AAAA,MACrF,CAAM,QAAQ,UAAU,OAAO,OAAO,wBAAwB;AACrE;AAEO,SAAS,sBAA+B;AAC7C,SAAO,IAAIE,UAAQ,QAAQ,EACxB,YAAY,+DAA+D,EAC3E,OAAO,WAAW,2CAA2C,EAC7D,OAAO,WAAW,yDAAyD,EAC3E,OAAO,OAAO,SAA+C,YAAqB;AACjF,mBAAe,cAAc,MAAM,UAAU,OAAO,GAAG,OAAO;AAAA,EAChE,CAAC;AACL;AAEO,SAAS,uBAAgC;AAC9C,SAAO,IAAIA,UAAQ,SAAS,EACzB,YAAY,2CAA2C,EACvD,SAAS,aAAa,sEAAsE,EAC5F,OAAO,OAAO,SAAiB,UAAmB,YAAqB;AACtE,mBAAe,eAAe,MAAM,kBAAkB,OAAO,GAAG,OAAO;AAAA,EACzE,CAAC;AACL;AAEO,SAAS,wBAAiC;AAC/C,SAAO,IAAIA,UAAQ,UAAU,EAC1B,YAAY,uDAAuD,EACnE,OAAO,OAAO,UAAmB,YAAqB;AACrD,UAAM,SAAS,MAAM,gBAAgB;AACrC,QAAI,aAAa,OAAO,GAAG;AACzB,gBAAU,YAAY,gBAAgB,MAAM,CAAC;AAC7C;AAAA,IACF;AACA,IAAM,QAAQ,8BAA8B,OAAO,WAAW,GAAG;AACjE,QAAI,OAAO,SAAS,WAAW,EAAG,CAAM,KAAK,6BAA6B;AAAA,QACrE,QAAO,SAAS,QAAQ,CAAC,YAAkB,KAAK,OAAO,CAAC;AAAA,EAC/D,CAAC;AACL;;;A3DgEA,SAAS,qBAAqB;AAC9B,SAAS,WAAAC,gBAAe;AACxB,SAAS,oBAAoB;AAtFtB,SAAS,gBAAyB;AACvC,QAAM,UAAU,IAAIC,UAAQ;AAE5B,UACG,KAAK,QAAQ,EACb,YAAY,uDAAuD,EACnE,QAAQ,aAAa,iBAAiB,4BAA4B,EAClE,OAAO,UAAU,8BAA8B,EAC/C,OAAO,oBAAoB,uBAAuB,EAClD,OAAO,oBAAoB,uBAAuB,EAClD,OAAO,aAAa,6BAA6B,EACjD,OAAO,cAAc,wBAAwB;AAGhD,UAAQ,WAAW,kBAAkB,CAAC;AACtC,UAAQ,WAAW,uBAAuB,CAAC;AAC3C,UAAQ,WAAW,mBAAmB,CAAC;AACvC,UAAQ,WAAW,mBAAmB,CAAC;AACvC,UAAQ,WAAW,mBAAmB,CAAC;AACvC,UAAQ,WAAW,kBAAkB,CAAC;AACtC,UAAQ,WAAW,oBAAoB,CAAC;AACxC,UAAQ,WAAW,qBAAqB,CAAC;AACzC,UAAQ,WAAW,qBAAqB,CAAC;AACzC,UAAQ,WAAW,oBAAoB,CAAC;AACxC,UAAQ,WAAW,kBAAkB,CAAC;AACtC,UAAQ,WAAW,oBAAoB,CAAC;AACxC,UAAQ,WAAW,oBAAoB,CAAC;AACxC,UAAQ,WAAW,qBAAqB,CAAC;AACzC,UAAQ,WAAW,sBAAsB,CAAC;AAE1C,UAAQ,KAAK,aAAa,OAAO,OAAO,kBAAkB;AACxD,UAAM,QAAkB,CAAC;AACzB,QAAI,UAA0B;AAC9B,WAAO,SAAS,QAAQ;AACtB,YAAM,KAAK,QAAQ,KAAK,CAAC;AACzB,gBAAU,QAAQ;AAAA,IACpB;AACA,UAAM,UAAU,MAAM,QAAQ,EAAE,KAAK,GAAG;AACxC,UAAM,UAAU,CAAC,QAAQ,WAAW,OAAO,IAAI,kBAAkB,OAAO,IAAI;AAC5E,UAAM,sBAAsB,eAAe,SAAS,OAAO;AAAA,EAC7D,CAAC;AAED,UAAQ,KAAK,cAAc,MAAM;AAC/B,UAAM,WAAW,OAAO,QAAQ,aAAa,WAAW,QAAQ,WAAW;AAC3E,kCAA8B,oBAAoB,GAAG,SAAS,IAAI;AAClE,6BAAyB,QAAQ;AACjC,yBAAqB,QAAQ;AAAA,EAC/B,CAAC;AAED,SAAO;AACT;AAEA,eAAsB,WAAW,SAAkB,MAAiC;AAClF,UAAQ,aAAa;AACrB,MAAI;AACF,UAAM,QAAQ,WAAW,IAAI;AAC7B,WAAO,OAAO,QAAQ,aAAa,WAAW,QAAQ,WAAW;AAAA,EACnE,SAASC,QAAO;AACd,QAAIA,kBAAiB,mBAAmBA,OAAM,SAAS,6BAA6BA,OAAM,SAAS,sBAAsB;AACvH,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,oBAAoB,EAAG,mBAAkB,WAAW;AACzD,UAAM,WAAWA,kBAAiB,WAC9BA,SACAA,kBAAiB,iBACf,IAAI,SAAS,UAAU,kBAAkBA,OAAM,OAAO,IACtD,IAAI,SAAS,UAAU,cAAcA,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK,CAAC;AACjG,QAAI,QAAQ,KAAK,EAAE,SAAS,MAAM;AAChC,gBAAU,UAAU,aAAa,SAAS,MAAM,SAAS,SAAS,SAAS,OAAO,CAAC;AAAA,IACrF,OAAO;AACL,2BAAqB,SAAS,MAAM,SAAS,OAAO;AACpD,UAAI,EAAEA,kBAAiB,gBAAiB,CAAM,MAAM,SAAS,OAAO;AAAA,IACtE;AACA,YAAQ,WAAW;AACnB,kCAA8B,SAAS,IAAI;AAC3C,6BAAyB,CAAC;AAC1B,yBAAqB,CAAC;AACtB,WAAO;AAAA,EACT;AACF;AAQA,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,cAAc,QAAQ,KAAK,CAAC,MAAM,SAAY,aAAaF,SAAQ,QAAQ,KAAK,CAAC,CAAC,CAAC,IAAI;AAC7F,IAAM,SAAS,gBAAgB;AAE/B,IAAI,QAAQ;AACV,QAAM,UAAU,cAAc;AAC9B,aAAW,SAAS,QAAQ,IAAI,EAAE,KAAK,OAAO,aAAa;AAGzD,UAAM,eAAe;AAIrB,YAAQ,KAAK,QAAQ;AAAA,EACvB,CAAC;AACH;","names":["Command","readFileSync","writeFileSync","mkdirSync","existsSync","chmodSync","join","randomBytes","statSync","unlinkSync","join","error","join","statSync","unlinkSync","context","randomBytes","context","join","existsSync","readFileSync","writeFileSync","chmodSync","mkdirSync","randomBytes","error","context","randomBytes","error","randomBytes","AsyncLocalStorage","context","error","resolve","randomBytes","context","definition","error","error","Command","error","selected","catalog","readFileSync","writeFileSync","appendFileSync","mkdirSync","existsSync","chmodSync","join","dirname","randomBytes","randomBytes","join","appendFileSync","chmodSync","existsSync","readFileSync","writeFileSync","dirname","mkdirSync","readFileSync","writeFileSync","mkdirSync","existsSync","chmodSync","join","randomBytes","randomBytes","join","mkdirSync","chmodSync","writeFileSync","existsSync","readFileSync","error","Command","Command","isJsonMode","getRootOpts","requireWorkspace","Command","Command","requireWorkspace","normalizeUris","error","Command","Command","error","Command","resolve","Command","error","existsSync","statSync","dirname","join","resolve","resolve","existsSync","statSync","join","error","dirname","isJsonMode","Command","Command","isJsonMode","Command","Command","isJsonMode","Command","Command","basename","resolve","asObject","error","asObject","openAsBlob","info","error","resolve","asObject","error","resolve","isJsonMode","getRootOpts","requireWorkspace","resolve","basename","uploadClient","uploaded","Command","Command","parsePositiveInteger","error","Command","Command","handleError","error","Command","Command","Command","Command","existsSync","existsSync","readFileSync","homedir","join","join","homedir","existsSync","readFileSync","error","resolve","error","existsSync","Command","resolve","Command","error"]}
|