@stephenyang/stephen 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/ak/command.ts","../src/ak/output.ts","../src/ak/crypto.ts","../src/ak/schema.ts","../src/ak/types.ts","../src/ak/service.ts","../src/ak/runtime.ts","../src/disk/command.ts","../src/disk/output.ts","../src/disk/service.ts","../src/video/command.ts","../src/video/sniff/browser-provider.ts","../src/video/sniff/candidate.ts","../src/video/utils.ts","../src/video/sniff/service.ts","../src/video/types.ts","../src/video/sniff/http-provider.ts","../src/video/download/direct-driver.ts","../src/video/download/media-request.ts","../src/video/download/hls-driver.ts","../src/video/download/browser-driver.ts","../src/video/download/resolver.ts","../src/video/download/service.ts","../src/video/compress/service.ts","../src/video/compress/preset.ts","../src/video/compress/ffmpeg.ts","../src/video/output.ts","../src/36kr/command.ts","../src/36kr/output.ts","../src/36kr/types.ts","../src/36kr/service.ts","../src/toutiao/command.ts","../src/toutiao/output.ts","../src/toutiao/types.ts","../src/toutiao/service.ts","../src/hn/command.ts","../src/hn/output.ts","../src/hn/types.ts","../src/hn/service.ts","../src/ak/database.ts","../src/ak/repository.ts","../src/disk/runtime.ts","../src/video/runtime.ts","../src/36kr/runtime.ts","../src/toutiao/runtime.ts","../src/hn/runtime.ts"],"sourcesContent":["import { mkdirSync, realpathSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { createInterface } from 'node:readline/promises';\nimport { stdin as input, stdout as output } from 'node:process';\nimport envPaths from 'env-paths';\n\nimport { createAkCli, type AkCliDependencies } from './ak/command.js';\nimport { createAkDatabase } from './ak/database.js';\nimport { AkRepository } from './ak/repository.js';\nimport {\n AkStorageInitError,\n loadAkConfig,\n resolveAkDatabasePath,\n type StephenCliPaths\n} from './ak/runtime.js';\nimport {\n createDiskCleanupRuntime,\n resolveDiskCleanupRoots,\n type DiskCleanupRuntime\n} from './disk/runtime.js';\nimport { createDefaultVideoRuntime, type VideoRuntime } from './video/runtime.js';\nimport { createDefaultKr36Runtime, type Kr36Runtime } from './36kr/runtime.js';\nimport { createDefaultToutiaoRuntime, type ToutiaoRuntime } from './toutiao/runtime.js';\nimport { createDefaultHackerNewsRuntime, type HackerNewsRuntime } from './hn/runtime.js';\n\n/* v8 ignore next */\nconst createDefaultReadline = () => createInterface({ input, output });\n\nexport interface CreateCliOverrides\n extends Partial<Omit<AkCliDependencies, 'getRepository'>> {\n diskRuntime?: DiskCleanupRuntime;\n env?: NodeJS.ProcessEnv;\n hackerNewsRuntime?: HackerNewsRuntime;\n paths?: StephenCliPaths;\n repository?: AkRepository;\n kr36Runtime?: Kr36Runtime;\n toutiaoRuntime?: ToutiaoRuntime;\n videoRuntime?: VideoRuntime;\n}\n\nexport function createCli(overrides: CreateCliOverrides = {}) {\n const paths = overrides.paths ?? (envPaths('stephen') as StephenCliPaths);\n const runtimeEnv = overrides.env ?? process.env;\n const masterKey = overrides.masterKey ?? Buffer.from('0123456789abcdef0123456789abcdef', 'utf8');\n const diskRuntime = overrides.diskRuntime ?? createDiskCleanupRuntime();\n const hackerNewsRuntime = overrides.hackerNewsRuntime ?? createDefaultHackerNewsRuntime();\n const kr36Runtime = overrides.kr36Runtime ?? createDefaultKr36Runtime();\n const toutiaoRuntime = overrides.toutiaoRuntime ?? createDefaultToutiaoRuntime();\n const videoRuntime = overrides.videoRuntime ?? createDefaultVideoRuntime();\n\n // Use promise caching to prevent race conditions when multiple concurrent\n // calls to getRepository() occur before the first initialization completes.\n // This pattern ensures only one repository instance is created even if\n // initialization were to involve async operations in the future.\n let repositoryCache:\n | { promise: Promise<AkRepository>; repository: AkRepository }\n | null = overrides.repository\n ? { promise: Promise.resolve(overrides.repository), repository: overrides.repository }\n : null;\n\n const getRepository = (): AkRepository => {\n // Fast path: synchronous repository already available (from override)\n if (repositoryCache && overrides.repository) {\n return overrides.repository;\n }\n\n // Slow path: initialize or return cached promise's resolved value\n if (!repositoryCache) {\n const config = loadAkConfig(paths.config);\n const resolvedDatabasePath = resolveAkDatabasePath({\n config,\n defaultDataDir: paths.data,\n env: runtimeEnv\n });\n\n mkdirSync(dirname(resolvedDatabasePath.path), { recursive: true });\n\n let repository: AkRepository;\n try {\n repository = new AkRepository(createAkDatabase(resolvedDatabasePath.path));\n } catch (error) {\n throw new AkStorageInitError(resolvedDatabasePath.path, error);\n }\n\n repositoryCache = { promise: Promise.resolve(repository), repository };\n }\n\n // With synchronous initialization, repositoryCache.repository is always available.\n // The promise caching pattern above ensures thread-safety for async scenarios.\n return repositoryCache.repository;\n };\n\n return createAkCli({\n confirm: overrides.confirm ?? defaultConfirm,\n diskRuntime,\n env: runtimeEnv,\n getRepository,\n hackerNewsRuntime,\n kr36Runtime,\n masterKey,\n now: overrides.now ?? (() => new Date().toISOString()),\n paths,\n resolveDiskCleanupRoots: () => resolveDiskCleanupRoots(runtimeEnv),\n stderr: overrides.stderr ?? ((value) => process.stderr.write(value)),\n stdout: overrides.stdout ?? ((value) => process.stdout.write(value)),\n toutiaoRuntime,\n videoRuntime\n });\n}\n\nexport async function defaultConfirm(\n message: string,\n createReadline: () => Pick<ReturnType<typeof createInterface>, 'question' | 'close'> = createDefaultReadline\n): Promise<boolean> {\n const readline = createReadline();\n\n try {\n const answer = await readline.question(`${message} [y/N] `);\n return answer.trim().toLowerCase() === 'y';\n } finally {\n readline.close();\n }\n}\n\n/* c8 ignore start */\nexport function isMainEntrypoint(moduleUrl: string, argv: string[]): boolean {\n const scriptPath = argv[1];\n\n if (!scriptPath) {\n return false;\n }\n\n return realpathSync(fileURLToPath(moduleUrl)) === realpathSync(scriptPath);\n}\n\nif (isMainEntrypoint(import.meta.url, process.argv)) {\n const cli = createCli();\n void cli.run(process.argv.slice(2)).then((exitCode) => {\n process.exitCode = exitCode;\n });\n}\n/* c8 ignore end */\n","import { Command } from 'commander';\nimport { ZodError, z } from 'zod';\nimport { table } from 'table';\n\nimport { renderAkErrorAsJson, renderAkRecordsAsJson, renderAkRecordsAsTable } from './output.js';\nimport { AkService, AkServiceError } from './service.js';\nimport type { AkRepository } from './repository.js';\nimport { normalizeAkEnv } from './schema.js';\nimport { AK_RECOMMENDED_ENVS } from './types.js';\nimport {\n assertSupportedConfigKey,\n getConfigEntry,\n listConfigEntries,\n setConfigValue,\n type ConfigKey,\n type StephenCliPaths\n} from './runtime.js';\nimport { registerDiskCommands } from '../disk/command.js';\nimport { DiskCleanupService } from '../disk/service.js';\nimport type { DiskCleanupRuntime, DiskCleanupRoots } from '../disk/runtime.js';\nimport { handleVideoCommandError, registerVideoCommands } from '../video/command.js';\nimport type { VideoRuntime } from '../video/runtime.js';\nimport { handleKr36CommandError, registerKr36Commands } from '../36kr/command.js';\nimport type { Kr36Runtime } from '../36kr/runtime.js';\nimport { handleToutiaoCommandError, registerToutiaoCommands } from '../toutiao/command.js';\nimport type { ToutiaoRuntime } from '../toutiao/runtime.js';\nimport { handleHackerNewsCommandError, registerHackerNewsCommands } from '../hn/command.js';\nimport type { HackerNewsRuntime } from '../hn/runtime.js';\n\nexport interface AkCliDependencies {\n confirm: (message: string) => Promise<boolean>;\n diskRuntime: DiskCleanupRuntime;\n env: NodeJS.ProcessEnv;\n getRepository: () => AkRepository;\n hackerNewsRuntime: HackerNewsRuntime;\n kr36Runtime: Kr36Runtime;\n masterKey: Buffer;\n now: () => string;\n paths: StephenCliPaths;\n resolveDiskCleanupRoots: () => DiskCleanupRoots;\n stderr: (value: string) => void;\n stdout: (value: string) => void;\n toutiaoRuntime: ToutiaoRuntime;\n videoRuntime: VideoRuntime;\n}\n\nexport interface AkCliRunner {\n run: (args: string[]) => Promise<number>;\n}\n\nconst envSchema = z.string().transform((value, context) => {\n try {\n return normalizeAkEnv(value);\n } catch (error) {\n context.addIssue({\n code: 'custom',\n message: (error as Error).message\n });\n return z.NEVER;\n }\n});\nconst envDescription = `environment (recommended: ${AK_RECOMMENDED_ENVS.join(', ')}; custom values allowed)`;\n\nconst addOptionsSchema = z.object({\n email: z.string().optional(),\n env: envSchema,\n key: z.string(),\n phone: z.string().optional(),\n rawKey: z.boolean().optional(),\n userId: z.string().optional(),\n userName: z.string().optional()\n});\n\nconst listOptionsSchema = z.object({\n env: envSchema.optional(),\n field: z.string().optional(),\n format: z.enum(['json', 'table']).default('json'),\n limit: z.number().int().positive().max(100).default(50),\n query: z.string().optional(),\n rawKey: z.boolean().optional()\n});\n\nconst getOptionsSchema = z.object({\n env: envSchema.optional(),\n format: z.enum(['json', 'table']).default('json'),\n id: z.string().optional(),\n key: z.string().optional(),\n rawKey: z.boolean().optional()\n});\n\nconst updateOptionsSchema = z.object({\n email: z.string().optional(),\n env: envSchema.optional(),\n format: z.enum(['json', 'table']).default('json'),\n id: z.string().optional(),\n key: z.string().optional(),\n phone: z.string().optional(),\n rawKey: z.boolean().optional(),\n userId: z.string().optional(),\n userName: z.string().optional()\n});\n\nconst deleteOptionsSchema = z.object({\n env: envSchema.optional(),\n format: z.enum(['json', 'table']).default('json'),\n id: z.string().optional(),\n key: z.string().optional(),\n yes: z.boolean().default(false)\n});\n\nconst configFormatSchema = z.object({\n format: z.enum(['json', 'table']).default('json')\n});\n\nconst configGetOptionsSchema = z.object({\n format: z.enum(['json', 'table']).default('json'),\n key: z.string()\n});\n\nconst configSetOptionsSchema = z.object({\n format: z.enum(['json', 'table']).default('json'),\n key: z.string(),\n value: z.string()\n});\n\nexport function createAkCli(dependencies: AkCliDependencies): AkCliRunner {\n const program = new Command();\n const createService = () =>\n new AkService({\n masterKey: dependencies.masterKey,\n now: dependencies.now,\n repository: dependencies.getRepository()\n });\n const createDiskCleanupService = () => {\n const roots = dependencies.resolveDiskCleanupRoots();\n\n return new DiskCleanupService({\n runtime: dependencies.diskRuntime,\n systemRoot: roots.systemRoot,\n userProfileRoot: roots.userProfileRoot\n });\n };\n\n program\n .name('stephen')\n .description('A personal TypeScript CLI for agent-friendly workflows.')\n .showHelpAfterError()\n .exitOverride();\n program.configureOutput({\n outputError: (value) => dependencies.stderr(value),\n writeErr: (value) => dependencies.stderr(value),\n writeOut: (value) => dependencies.stdout(value)\n });\n\n const ak = program.command('ak').description('Manage API key records.');\n const config = program.command('config').description('Manage local CLI configuration.');\n registerDiskCommands(program, {\n createDiskCleanupService,\n stdout: dependencies.stdout\n });\n registerVideoCommands(program, {\n runtime: dependencies.videoRuntime,\n stderr: dependencies.stderr,\n stdout: dependencies.stdout\n });\n registerKr36Commands(program, {\n runtime: dependencies.kr36Runtime,\n stderr: dependencies.stderr,\n stdout: dependencies.stdout\n });\n registerToutiaoCommands(program, {\n runtime: dependencies.toutiaoRuntime,\n stderr: dependencies.stderr,\n stdout: dependencies.stdout\n });\n registerHackerNewsCommands(program, {\n runtime: dependencies.hackerNewsRuntime,\n stderr: dependencies.stderr,\n stdout: dependencies.stdout\n });\n\n ak.command('add')\n .requiredOption('-e, --env <env>', envDescription)\n .requiredOption('-k, --key <key>', 'api key')\n .option('-u, --user-id <userId>', 'user id')\n .option('-n, --user-name <userName>', 'user name')\n .option('-m, --email <email>', 'email')\n .option('-p, --phone <phone>', 'phone')\n .option('--raw-key', 'show the raw key in the output')\n .action((options) => {\n const parsed = addOptionsSchema.parse(options);\n writeRecords([createService().add(parsed)], 'json', parsed.rawKey ?? false, 50, dependencies);\n });\n\n ak.command('get')\n .option('--id <id>', 'record id')\n .option('-e, --env <env>', envDescription)\n .option('-k, --key <key>', 'api key')\n .option('--raw-key', 'show the raw key in the output')\n .option('--format <format>', 'output format', 'json')\n .option('-t, --table', 'render as a table')\n .action((options) => {\n const parsed = getOptionsSchema.parse(applyTableShortcut(options));\n writeRecords(\n [createService().get(parsed)],\n parsed.format,\n parsed.rawKey ?? false,\n 1,\n dependencies\n );\n });\n\n ak.command('list')\n .option('-e, --env <env>', envDescription)\n .option('-q, --query <query>', 'fuzzy query')\n .option('-f, --field <field>', 'query fields')\n .option('--limit <limit>', 'result limit', parseLimit, 50)\n .option('--raw-key', 'show the raw key in the output')\n .option('--format <format>', 'output format', 'json')\n .option('-t, --table', 'render as a table')\n .action((options) => {\n const parsed = listOptionsSchema.parse(applyTableShortcut(options));\n writeRecords(\n createService().list(parsed),\n parsed.format,\n parsed.rawKey ?? false,\n parsed.limit,\n dependencies\n );\n });\n\n ak.command('update')\n .option('--id <id>', 'record id')\n .option('-e, --env <env>', envDescription)\n .option('-k, --key <key>', 'api key')\n .option('-u, --user-id <userId>', 'user id')\n .option('-n, --user-name <userName>', 'user name')\n .option('-m, --email <email>', 'email')\n .option('-p, --phone <phone>', 'phone')\n .option('--raw-key', 'show the raw key in the output')\n .option('--format <format>', 'output format', 'json')\n .option('-t, --table', 'render as a table')\n .action((options) => {\n const parsed = updateOptionsSchema.parse(applyTableShortcut(options));\n writeRecords(\n [createService().update(parsed)],\n parsed.format,\n parsed.rawKey ?? false,\n 1,\n dependencies\n );\n });\n\n ak.command('delete')\n .option('--id <id>', 'record id')\n .option('-e, --env <env>', envDescription)\n .option('-k, --key <key>', 'api key')\n .option('--yes', 'skip confirmation')\n .option('--format <format>', 'output format', 'json')\n .option('-t, --table', 'render as a table')\n .action(async (options) => {\n const parsed = deleteOptionsSchema.parse(applyTableShortcut(options));\n\n if (!parsed.yes) {\n const confirmed = await dependencies.confirm('Delete the API key record?');\n if (!confirmed) {\n throw new AkServiceError('ABORTED', 'Delete operation cancelled.', 2);\n }\n }\n\n const service = createService();\n const record = service.get(parsed);\n const deleted = service.delete(parsed);\n if (!deleted) {\n throw new AkServiceError('STORAGE_ERROR', 'Failed to delete the API key record.', 6);\n }\n writeRecords([record], parsed.format, false, 1, dependencies);\n });\n\n config.command('list')\n .option('--format <format>', 'output format', 'json')\n .option('-t, --table', 'render as a table')\n .action((options) => {\n const parsed = configFormatSchema.parse(applyTableShortcut(options));\n const entries = listConfigEntries({\n configDir: dependencies.paths.config,\n dataDir: dependencies.paths.data,\n env: dependencies.env\n });\n\n writeConfigEntries(entries, parsed.format, dependencies);\n });\n\n config.command('get')\n .argument('<key>', 'config key')\n .option('--format <format>', 'output format', 'json')\n .option('-t, --table', 'render as a table')\n .action((key, options) => {\n const parsed = configGetOptionsSchema.parse({\n ...applyTableShortcut(options),\n key\n });\n assertSupportedConfigKey(parsed.key);\n const entry = getConfigEntry(parsed.key, {\n configDir: dependencies.paths.config,\n dataDir: dependencies.paths.data,\n env: dependencies.env\n });\n\n writeConfigEntries([entry], parsed.format, dependencies);\n });\n\n config.command('set')\n .argument('<key>', 'config key')\n .argument('<value>', 'config value')\n .option('--format <format>', 'output format', 'json')\n .option('-t, --table', 'render as a table')\n .action((key, value, options) => {\n const parsed = configSetOptionsSchema.parse({\n ...applyTableShortcut(options),\n key,\n value\n });\n assertSupportedConfigKey(parsed.key);\n setConfigValue(parsed.key, parsed.value, {\n configDir: dependencies.paths.config\n });\n const entry = getConfigEntry(parsed.key, {\n configDir: dependencies.paths.config,\n dataDir: dependencies.paths.data,\n env: dependencies.env\n });\n\n writeConfigEntries([entry], parsed.format, dependencies);\n });\n\n return {\n run: async (args: string[]) => {\n try {\n await program.parseAsync(['node', 'stephen', ...args], {\n from: 'node'\n });\n return 0;\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 'commander.helpDisplayed') {\n return 0;\n }\n\n if (isCliError(error)) {\n dependencies.stderr(\n `${renderAkErrorAsJson(error.code, error.message, 'details' in error ? error.details : undefined)}\\n`\n );\n return error.exitCode;\n }\n\n const videoExitCode = handleVideoCommandError(error, {\n stderr: dependencies.stderr\n });\n\n /* c8 ignore start */\n if (videoExitCode !== undefined) {\n return videoExitCode;\n }\n /* c8 ignore end */\n\n const kr36ExitCode = handleKr36CommandError(error, {\n stderr: dependencies.stderr\n });\n\n if (kr36ExitCode !== undefined) {\n return kr36ExitCode;\n }\n\n const toutiaoExitCode = handleToutiaoCommandError(error, {\n stderr: dependencies.stderr\n });\n\n if (toutiaoExitCode !== undefined) {\n return toutiaoExitCode;\n }\n\n const hackerNewsExitCode = handleHackerNewsCommandError(error, {\n stderr: dependencies.stderr\n });\n\n if (hackerNewsExitCode !== undefined) {\n return hackerNewsExitCode;\n }\n\n if (error instanceof ZodError) {\n dependencies.stderr(\n `${renderAkErrorAsJson('INVALID_ARGUMENT', error.issues[0]!.message)}\\n`\n );\n return 2;\n }\n\n if (error instanceof Error && 'exitCode' in error && typeof error.exitCode === 'number') {\n return error.exitCode;\n }\n\n const message = error instanceof Error ? error.message : 'Unexpected error.';\n dependencies.stderr(`${renderAkErrorAsJson('UNEXPECTED_ERROR', message)}\\n`);\n return 1;\n }\n }\n };\n}\n\nfunction isCliError(\n error: unknown\n): error is Pick<AkServiceError, 'code' | 'exitCode' | 'message'> & { details?: unknown } {\n return (\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string' &&\n 'exitCode' in error &&\n typeof error.exitCode === 'number'\n );\n}\n\nfunction parseLimit(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (Number.isNaN(parsed)) {\n throw new Error(`Invalid limit: '${value}' is not a number`);\n }\n return parsed;\n}\n\nexport function applyTableShortcut<T extends { format?: string; table?: boolean }>(options: T): T & {\n format: 'json' | 'table';\n} {\n if (options.table) {\n return {\n ...options,\n format: 'table'\n };\n }\n\n if (options.format) {\n return {\n ...options,\n format: options.format as 'json' | 'table'\n };\n }\n\n throw new Error('Output format is required for this command.');\n}\n\nfunction writeRecords(\n records: Parameters<typeof renderAkRecordsAsJson>[0],\n format: 'json' | 'table',\n _rawKey: boolean,\n limit: number,\n dependencies: Pick<AkCliDependencies, 'stdout'>\n): void {\n if (format === 'table') {\n dependencies.stdout(`${renderAkRecordsAsTable(records)}\\n`);\n return;\n }\n\n dependencies.stdout(`${renderAkRecordsAsJson(records, limit)}\\n`);\n}\n\nfunction writeConfigEntries(\n entries: ReturnType<typeof listConfigEntries>,\n format: 'json' | 'table',\n dependencies: Pick<AkCliDependencies, 'stdout'>\n): void {\n if (format === 'table') {\n dependencies.stdout(`${renderConfigEntriesAsTable(entries)}\\n`);\n return;\n }\n\n dependencies.stdout(`${renderConfigEntriesAsJson(entries)}\\n`);\n}\n\nfunction renderConfigEntriesAsJson(entries: ReturnType<typeof listConfigEntries>): string {\n return JSON.stringify(\n {\n ok: true,\n data: entries,\n meta: {\n count: entries.length\n }\n },\n null,\n 2\n );\n}\n\nfunction renderConfigEntriesAsTable(entries: ReturnType<typeof listConfigEntries>): string {\n return table([\n ['key', 'value', 'source', 'fileValue', 'envValue', 'defaultValue'],\n ...entries.map((entry) => [\n entry.key,\n entry.value,\n entry.source,\n entry.fileValue ?? '',\n entry.envValue ?? '',\n entry.defaultValue\n ])\n ]);\n}\n","import { table } from 'table';\n\nimport type { AkEnv } from './types.js';\n\nexport interface AkRecordView {\n createdAt: string;\n email: string | null;\n env: AkEnv;\n id: string;\n key: string;\n phone: string | null;\n updatedAt: string;\n userId: string | null;\n userName: string | null;\n}\n\nexport function renderAkRecordsAsJson(records: AkRecordView[], limit: number): string {\n const serializedRecords = records.map((record) => ({\n id: record.id,\n env: record.env,\n userId: record.userId,\n userName: record.userName,\n email: record.email,\n phone: record.phone,\n key: record.key,\n createdAt: record.createdAt,\n updatedAt: record.updatedAt\n }));\n\n return JSON.stringify(\n {\n ok: true,\n data: serializedRecords,\n meta: {\n count: serializedRecords.length,\n limit\n }\n },\n null,\n 2\n );\n}\n\nexport function renderAkErrorAsJson(code: string, message: string, details?: unknown): string {\n return JSON.stringify(\n {\n ok: false,\n error: {\n code,\n ...(details === undefined ? {} : { details }),\n message\n }\n },\n null,\n 2\n );\n}\n\nexport function renderAkRecordsAsTable(records: AkRecordView[]): string {\n return table([\n ['id', 'env', 'userId', 'userName', 'email', 'phone', 'key', 'updatedAt'],\n ...records.map((record) => [\n record.id,\n record.env,\n record.userId ?? '',\n record.userName ?? '',\n record.email ?? '',\n record.phone ?? '',\n record.key,\n record.updatedAt\n ])\n ]);\n}\n","import { createCipheriv, createDecipheriv, createHash, randomBytes } from 'node:crypto';\n\nconst ENCRYPTION_ALGORITHM = 'aes-256-gcm';\nconst IV_LENGTH = 12;\nconst AUTH_TAG_LENGTH = 16;\nconst PREFIX_LENGTH = 12;\n\nexport function createAkId(key: string): string {\n return createHash('sha1').update(key).digest('hex');\n}\n\nexport function deriveAkSearchPrefix(key: string, length = PREFIX_LENGTH): string {\n return key.slice(0, length);\n}\n\nexport function encryptAkKey(masterKey: Buffer, key: string): string {\n const iv = randomBytes(IV_LENGTH);\n const cipher = createCipheriv(ENCRYPTION_ALGORITHM, masterKey, iv, {\n authTagLength: AUTH_TAG_LENGTH\n });\n const encrypted = Buffer.concat([cipher.update(key, 'utf8'), cipher.final()]);\n const tag = cipher.getAuthTag();\n\n return [iv.toString('base64url'), tag.toString('base64url'), encrypted.toString('base64url')].join('.');\n}\n\nexport function decryptAkKey(masterKey: Buffer, payload: string): string {\n const [ivPart, tagPart, encryptedPart] = payload.split('.');\n\n if (!ivPart || !tagPart || !encryptedPart) {\n throw new Error('Invalid encrypted API key payload.');\n }\n\n const decipher = createDecipheriv(\n ENCRYPTION_ALGORITHM,\n masterKey,\n Buffer.from(ivPart, 'base64url'),\n {\n authTagLength: AUTH_TAG_LENGTH\n }\n );\n\n decipher.setAuthTag(Buffer.from(tagPart, 'base64url'));\n\n return Buffer.concat([\n decipher.update(Buffer.from(encryptedPart, 'base64url')),\n decipher.final()\n ]).toString('utf8');\n}\n","import { z } from 'zod';\n\nimport {\n AK_QUERY_FIELDS,\n AK_RECOMMENDED_ENVS,\n type AkQueryField\n} from './types.js';\n\nconst envRecommendationMessage = `Recommended values: ${AK_RECOMMENDED_ENVS.join(', ')}.`;\nconst akEnvSchema = z.string().transform((value, context) => {\n try {\n return normalizeAkEnv(value);\n } catch (error) {\n context.addIssue({\n code: 'custom',\n message: (error as Error).message\n });\n return z.NEVER;\n }\n});\n\nexport function normalizeAkKey(value: string): string {\n const normalized = value.trim();\n\n if (normalized.length === 0) {\n throw new Error('API key cannot be empty.');\n }\n\n return normalized;\n}\n\nexport function normalizeAkEnv(value: string): string {\n const normalized = value.trim();\n\n if (normalized.length === 0) {\n throw new Error(`Environment is required. ${envRecommendationMessage}`);\n }\n\n if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(normalized)) {\n throw new Error(\n `Environment must use letters, numbers, \".\", \"_\" or \"-\". ${envRecommendationMessage}`\n );\n }\n\n return normalized;\n}\n\nexport function maskKey(value: string): string {\n if (value.length <= 4) {\n return '*'.repeat(value.length);\n }\n\n if (value.length <= 8) {\n return `${value.slice(0, 2)}${'*'.repeat(value.length - 4)}${value.slice(-2)}`;\n }\n\n return `${value.slice(0, 4)}${'*'.repeat(value.length - 8)}${value.slice(-4)}`;\n}\n\nconst nullableTextField = z\n .string()\n .trim()\n .min(1)\n .optional()\n .transform((value) => value ?? undefined);\n\nexport const addAkRecordInputSchema = z.object({\n email: nullableTextField,\n env: akEnvSchema,\n key: z.string().transform(normalizeAkKey),\n phone: nullableTextField,\n userId: nullableTextField,\n userName: nullableTextField\n});\n\nexport const listAkRecordsInputSchema = z.object({\n env: akEnvSchema.optional(),\n field: z.string().trim().optional(),\n limit: z.number().int().positive().max(100).default(50),\n query: z.string().trim().min(1).optional()\n});\n\nexport function parseAkQueryFields(value: string | undefined): AkQueryField[] {\n if (!value) {\n return [...AK_QUERY_FIELDS];\n }\n\n return value.split(',').map((field) => {\n const normalized = field.trim();\n\n if (!AK_QUERY_FIELDS.includes(normalized as AkQueryField)) {\n throw new Error(`Unsupported query field: ${normalized}.`);\n }\n\n return normalized as AkQueryField;\n });\n}\n\nexport { AK_QUERY_FIELDS, AK_RECOMMENDED_ENVS };\n","export const AK_RECOMMENDED_ENVS = [\n 'bzy-pre',\n 'bzy-prod',\n 'op-pre',\n 'op-prod',\n 'gitee',\n 'github',\n 'gitlab'\n] as const;\n\nexport const AK_ENVS = AK_RECOMMENDED_ENVS;\n\nexport type AkEnv = string;\n\nexport const AK_QUERY_FIELDS = [\n 'userId',\n 'userName',\n 'email',\n 'phone',\n 'key'\n] as const;\n\nexport type AkQueryField = (typeof AK_QUERY_FIELDS)[number];\n\nexport interface AkRecord {\n id: string;\n env: AkEnv;\n userId: string | null;\n userName: string | null;\n email: string | null;\n phone: string | null;\n keyCiphertext: string;\n keySearchPrefix: string;\n createdAt: string;\n updatedAt: string;\n}\n","import {\n createAkId,\n decryptAkKey,\n deriveAkSearchPrefix,\n encryptAkKey\n} from './crypto.js';\nimport { AkRepository } from './repository.js';\nimport {\n addAkRecordInputSchema,\n maskKey,\n normalizeAkKey,\n parseAkQueryFields\n} from './schema.js';\nimport type { AkEnv, AkQueryField } from './types.js';\nimport type { AkRecordView } from './output.js';\n\nexport interface AkServiceDependencies {\n masterKey: Buffer;\n now: () => string;\n repository: AkRepository;\n}\n\nexport interface AkGetInput {\n env?: AkEnv | undefined;\n id?: string | undefined;\n key?: string | undefined;\n rawKey?: boolean | undefined;\n}\n\nexport interface AkListInput {\n env?: AkEnv | undefined;\n field?: string | undefined;\n limit?: number | undefined;\n query?: string | undefined;\n rawKey?: boolean | undefined;\n}\n\nexport interface AkUpdateInput {\n email?: string | null | undefined;\n env?: AkEnv | undefined;\n id?: string | undefined;\n key?: string | undefined;\n phone?: string | null | undefined;\n rawKey?: boolean | undefined;\n userId?: string | null | undefined;\n userName?: string | null | undefined;\n}\n\nexport interface AkDeleteInput {\n env?: AkEnv | undefined;\n id?: string | undefined;\n key?: string | undefined;\n}\n\nexport class AkServiceError extends Error {\n readonly code: string;\n readonly exitCode: number;\n\n constructor(code: string, message: string, exitCode: number) {\n super(message);\n this.code = code;\n this.exitCode = exitCode;\n this.name = 'AkServiceError';\n }\n}\n\nexport class AkService {\n readonly #masterKey: Buffer;\n readonly #now: () => string;\n readonly #repository: AkRepository;\n\n constructor(dependencies: AkServiceDependencies) {\n this.#masterKey = dependencies.masterKey;\n this.#now = dependencies.now;\n this.#repository = dependencies.repository;\n }\n\n add(input: {\n email?: string | undefined;\n env: AkEnv;\n key: string;\n phone?: string | undefined;\n rawKey?: boolean | undefined;\n userId?: string | undefined;\n userName?: string | undefined;\n }): AkRecordView {\n const parsed = addAkRecordInputSchema.parse(input);\n const key = normalizeAkKey(parsed.key);\n const id = createAkId(key);\n const now = this.#now();\n\n this.#repository.insert({\n createdAt: now,\n email: normalizeNullableFieldForInsert(parsed.email),\n env: parsed.env,\n id,\n keyCiphertext: encryptAkKey(this.#masterKey, key),\n keySearchPrefix: deriveAkSearchPrefix(key),\n phone: normalizeNullableFieldForInsert(parsed.phone),\n updatedAt: now,\n userId: normalizeNullableFieldForInsert(parsed.userId),\n userName: normalizeNullableFieldForInsert(parsed.userName)\n });\n\n const record = this.#repository.getById(id);\n\n if (!record) {\n throw new AkServiceError('STORAGE_ERROR', 'Failed to load the newly created record.', 6);\n }\n\n return this.#toView(record, Boolean(input.rawKey));\n }\n\n get(input: AkGetInput): AkRecordView {\n const record = this.#findRecord(input);\n\n if (!record) {\n throw new AkServiceError('RECORD_NOT_FOUND', 'No API key record matched the query.', 3);\n }\n\n return this.#toView(record, Boolean(input.rawKey));\n }\n\n list(input: AkListInput): AkRecordView[] {\n const fields = parseFields(input.field);\n const limit = input.limit ?? 50;\n const filters = {\n fields,\n limit,\n ...(input.env ? { env: input.env } : {}),\n ...(input.query ? { query: input.query } : {})\n };\n const results = this.#repository.list(filters);\n\n return results.map((record) => this.#toView(record, Boolean(input.rawKey)));\n }\n\n update(input: AkUpdateInput): AkRecordView {\n const record = this.#findRecord(input);\n\n if (!record) {\n throw new AkServiceError('RECORD_NOT_FOUND', 'No API key record matched the query.', 3);\n }\n\n const normalizedEmail = normalizeNullableField(input.email);\n const normalizedPhone = normalizeNullableField(input.phone);\n const normalizedUserId = normalizeNullableField(input.userId);\n const normalizedUserName = normalizeNullableField(input.userName);\n const updated = this.#repository.updateMetadata({\n ...(normalizedEmail === undefined ? {} : { email: normalizedEmail }),\n id: record.id,\n ...(normalizedPhone === undefined ? {} : { phone: normalizedPhone }),\n updatedAt: this.#now(),\n ...(normalizedUserId === undefined ? {} : { userId: normalizedUserId }),\n ...(normalizedUserName === undefined ? {} : { userName: normalizedUserName })\n });\n\n if (!updated) {\n throw new AkServiceError('STORAGE_ERROR', 'Failed to update the API key record.', 6);\n }\n\n return this.#toView(updated, Boolean(input.rawKey));\n }\n\n delete(input: AkDeleteInput): boolean {\n const record = this.#findRecord(input);\n\n if (!record) {\n throw new AkServiceError('RECORD_NOT_FOUND', 'No API key record matched the query.', 3);\n }\n\n return this.#repository.deleteById(record.id);\n }\n\n #findRecord(input: AkGetInput | AkUpdateInput | AkDeleteInput) {\n if (input.id) {\n return this.#repository.getById(input.id);\n }\n\n if (input.env && input.key) {\n const normalizedKey = normalizeAkKey(input.key);\n return this.#repository.getByEnvAndId(input.env, createAkId(normalizedKey));\n }\n\n throw new AkServiceError(\n 'INVALID_ARGUMENT',\n 'Provide either --id or the pair of --env and --key.',\n 2\n );\n }\n\n #toView(\n record: {\n createdAt: string;\n email: string | null;\n env: AkEnv;\n id: string;\n keyCiphertext: string;\n phone: string | null;\n updatedAt: string;\n userId: string | null;\n userName: string | null;\n },\n rawKey: boolean\n ): AkRecordView {\n const key = decryptAkKey(this.#masterKey, record.keyCiphertext);\n\n return {\n createdAt: record.createdAt,\n email: record.email,\n env: record.env,\n id: record.id,\n key: rawKey ? key : maskKey(key),\n phone: record.phone,\n updatedAt: record.updatedAt,\n userId: record.userId,\n userName: record.userName\n };\n }\n}\n\nfunction normalizeNullableField(value: string | null | undefined): string | null | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (value === null) {\n return null;\n }\n\n const normalized = value.trim();\n return normalized.length === 0 ? null : normalized;\n}\n\nfunction normalizeNullableFieldForInsert(value: string | null | undefined): string | null {\n return normalizeNullableField(value) ?? null;\n}\n\nfunction parseFields(value: string | undefined): AkQueryField[] {\n try {\n return parseAkQueryFields(value);\n } catch (error) {\n /* v8 ignore next */\n const message = error instanceof Error ? error.message : 'Invalid query fields.';\n throw new AkServiceError('INVALID_ARGUMENT', message, 2);\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { z } from 'zod';\n\nexport const AK_DB_PATH_ENV_VAR = 'STEPHEN_AK_DB_PATH';\nexport const LEGACY_AK_DB_PATH_ENV_VAR = 'STEPHEN_CLI_AK_DB_PATH';\nexport const AK_CONFIG_FILE_NAME = 'config.json';\nexport const CONFIG_KEYS = ['ak.dbPath'] as const;\n\nexport type ConfigKey = (typeof CONFIG_KEYS)[number];\n\nexport interface StephenCliPaths {\n cache: string;\n config: string;\n data: string;\n log: string;\n temp: string;\n}\n\nexport interface AkConfig {\n ak?: {\n dbPath?: string | undefined;\n } | undefined;\n}\n\nexport interface ResolveAkDatabasePathInput {\n config: AkConfig;\n defaultDataDir: string;\n env: NodeJS.ProcessEnv;\n}\n\nexport interface ResolvedAkDatabasePath {\n path: string;\n source: 'config' | 'default' | 'env';\n}\n\nexport interface ConfigEntry {\n configFilePath: string;\n defaultValue: string;\n envValue: string | null;\n fileValue: string | null;\n key: ConfigKey;\n source: ResolvedAkDatabasePath['source'];\n value: string;\n}\n\nexport class AkConfigError extends Error {\n readonly code = 'CONFIG_ERROR';\n readonly exitCode = 2;\n\n constructor(message: string) {\n super(message);\n this.name = 'AkConfigError';\n }\n}\n\nexport class AkStorageInitError extends Error {\n readonly code = 'STORAGE_ERROR';\n readonly exitCode = 6;\n\n constructor(path: string, cause: unknown) {\n const detail = cause instanceof Error ? cause.message : 'Unknown storage error.';\n\n super(\n `Failed to open the ak database at \"${path}\". Check ${formatAkDbPathEnvVarHelp()}, the local config file, and the parent directory permissions. Details: ${detail}`\n );\n this.name = 'AkStorageInitError';\n }\n}\n\nconst akConfigSchema = z\n .object({\n ak: z\n .object({\n dbPath: z.string().optional()\n })\n .optional()\n })\n .passthrough();\n\nexport function getAkConfigFilePath(configDir: string): string {\n return join(configDir, AK_CONFIG_FILE_NAME);\n}\n\nexport function loadAkConfig(configDir: string): AkConfig {\n const configFilePath = getAkConfigFilePath(configDir);\n\n if (!existsSync(configFilePath)) {\n return {};\n }\n\n return parseAkConfig(readFileSync(configFilePath, 'utf8'), configFilePath);\n}\n\nexport function saveAkConfig(configDir: string, config: AkConfig): void {\n const configFilePath = getAkConfigFilePath(configDir);\n mkdirSync(dirname(configFilePath), { recursive: true });\n writeFileSync(`${configFilePath}`, `${JSON.stringify(config, null, 2)}\\n`, 'utf8');\n}\n\nexport function parseAkConfig(contents: string, configFilePath = AK_CONFIG_FILE_NAME): AkConfig {\n let parsedJson: unknown;\n\n try {\n parsedJson = JSON.parse(contents);\n } catch {\n throw new AkConfigError(\n `Failed to parse the local config file at \"${configFilePath}\". Fix the JSON or set ${formatAkDbPathEnvVarHelp()} to the full ak.db path on this machine.`\n );\n }\n\n const parsed = akConfigSchema.safeParse(parsedJson);\n\n if (!parsed.success) {\n throw new AkConfigError(\n `Invalid ak config in \"${configFilePath}\". Expected ak.dbPath to be a string when provided. Fix the config file or set ${formatAkDbPathEnvVarHelp()} to the full ak.db path on this machine.`\n );\n }\n\n return parsed.data;\n}\n\nexport function resolveAkDatabasePath(\n input: ResolveAkDatabasePathInput\n): ResolvedAkDatabasePath {\n const configPath = normalizeConfiguredPath(input.config.ak?.dbPath, 'ak.dbPath');\n\n if (configPath) {\n return {\n path: configPath,\n source: 'config'\n };\n }\n\n const envPath = getConfiguredAkDbPathFromEnv(input.env);\n\n if (envPath) {\n return {\n path: normalizeConfiguredPath(envPath.value, envPath.source)!,\n source: 'env'\n };\n }\n\n return {\n path: join(input.defaultDataDir, 'ak.db'),\n source: 'default'\n };\n}\n\nexport function getConfigEntry(\n key: ConfigKey,\n input: {\n configDir: string;\n dataDir: string;\n env: NodeJS.ProcessEnv;\n }\n): ConfigEntry {\n assertSupportedConfigKey(key);\n\n const config = loadAkConfig(input.configDir);\n const resolved = resolveAkDatabasePath({\n config,\n defaultDataDir: input.dataDir,\n env: input.env\n });\n const envValue = normalizeResolvedValue(getConfiguredAkDbPathFromEnv(input.env)?.value);\n const fileValue = normalizeResolvedValue(config.ak?.dbPath);\n\n return {\n configFilePath: getAkConfigFilePath(input.configDir),\n defaultValue: join(input.dataDir, 'ak.db'),\n envValue,\n fileValue,\n key,\n source: resolved.source,\n value: resolved.path\n };\n}\n\nexport function listConfigEntries(input: {\n configDir: string;\n dataDir: string;\n env: NodeJS.ProcessEnv;\n}): ConfigEntry[] {\n return CONFIG_KEYS.map((key) => getConfigEntry(key, input));\n}\n\nexport function setConfigValue(\n key: ConfigKey,\n value: string,\n input: {\n configDir: string;\n }\n): AkConfig {\n assertSupportedConfigKey(key);\n const normalizedValue = normalizeConfiguredPath(value, key);\n const config = loadAkConfig(input.configDir);\n const nextConfig: AkConfig = {\n ...config,\n ak: {\n ...(config.ak ?? {}),\n dbPath: normalizedValue\n }\n };\n\n saveAkConfig(input.configDir, nextConfig);\n\n return nextConfig;\n}\n\nexport function assertSupportedConfigKey(key: string): asserts key is ConfigKey {\n if (!CONFIG_KEYS.includes(key as ConfigKey)) {\n throw new AkConfigError(\n `Unsupported config key: ${key}. Supported keys: ${CONFIG_KEYS.join(', ')}.`\n );\n }\n}\n\nfunction normalizeConfiguredPath(value: string | undefined, source: string): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const normalized = value.trim();\n\n if (normalized.length === 0) {\n throw new AkConfigError(\n `${source} is configured but empty. Set it to the full ak.db path, or remove it to fall back to the next storage path source.`\n );\n }\n\n return normalized;\n}\n\nfunction normalizeResolvedValue(value: string | undefined): string | null {\n if (value === undefined) {\n return null;\n }\n\n return value.trim();\n}\n\nfunction getConfiguredAkDbPathFromEnv(\n env: NodeJS.ProcessEnv\n): { source: string; value: string } | undefined {\n const primaryValue = env[AK_DB_PATH_ENV_VAR];\n\n if (primaryValue !== undefined) {\n return {\n source: AK_DB_PATH_ENV_VAR,\n value: primaryValue\n };\n }\n\n const legacyValue = env[LEGACY_AK_DB_PATH_ENV_VAR];\n\n if (legacyValue !== undefined) {\n return {\n source: LEGACY_AK_DB_PATH_ENV_VAR,\n value: legacyValue\n };\n }\n\n return undefined;\n}\n\nfunction formatAkDbPathEnvVarHelp(): string {\n return `${AK_DB_PATH_ENV_VAR} (preferred) or ${LEGACY_AK_DB_PATH_ENV_VAR} (legacy)`;\n}\n","import type { Command } from 'commander';\nimport { z } from 'zod';\n\nimport { renderDiskCleanupReportAsJson, renderDiskCleanupReportAsTable } from './output.js';\nimport { DiskCleanupService } from './service.js';\n\nexport interface DiskCommandDependencies {\n createDiskCleanupService: () => DiskCleanupService;\n stdout: (value: string) => void;\n}\n\nconst diskCleanupOptionsSchema = z.object({\n apply: z.boolean().default(false),\n confirm: z.boolean().default(false),\n disableHibernate: z.boolean().default(false),\n format: z.enum(['json', 'table']).default('json'),\n level: z.enum(['safe', 'dev', 'system', 'deep']).default('safe')\n});\n\nexport function registerDiskCommands(\n program: Command,\n dependencies: DiskCommandDependencies\n): void {\n const disk = program.command('disk').description('Inspect and clean conservative disk caches.');\n\n disk.command('cleanup')\n .option('--apply', 'execute cleanup instead of previewing it')\n .option('--confirm', 'confirm apply for system or deep cleanup levels')\n .option('--disable-hibernate', 'disable Windows hibernation during apply mode')\n .option('--format <format>', 'output format', 'json')\n .option('--level <level>', 'cleanup level: safe, dev, system, or deep', 'safe')\n .option('-t, --table', 'render as a table')\n .action(async (options) => {\n const parsed = diskCleanupOptionsSchema.parse(applyDiskTableShortcut(options));\n const report = await dependencies.createDiskCleanupService().cleanup({\n apply: parsed.apply,\n confirm: parsed.confirm,\n disableHibernate: parsed.disableHibernate,\n level: parsed.level\n });\n\n if (parsed.format === 'table') {\n dependencies.stdout(`${renderDiskCleanupReportAsTable(report)}\\n`);\n return;\n }\n\n dependencies.stdout(`${renderDiskCleanupReportAsJson(report)}\\n`);\n });\n}\n\nexport function applyDiskTableShortcut<T extends { format?: string; table?: boolean }>(options: T): T & {\n format: 'json' | 'table';\n} {\n if (options.table) {\n return {\n ...options,\n format: 'table'\n };\n }\n\n if (options.format) {\n return {\n ...options,\n format: options.format as 'json' | 'table'\n };\n }\n\n /* v8 ignore next */\n throw new Error('Output format is required for this command.');\n}\n","import { table } from 'table';\n\nimport type { DiskCleanupReport } from './types.js';\n\nexport function renderDiskCleanupReportAsJson(report: DiskCleanupReport): string {\n return JSON.stringify(\n {\n ok: true,\n data: report,\n meta: {\n count: report.targets.length,\n estimatedReclaimBytes: report.estimatedReclaimBytes,\n estimatedReclaimGB: report.estimatedReclaimGB\n }\n },\n null,\n 2\n );\n}\n\nexport function renderDiskCleanupReportAsTable(report: DiskCleanupReport): string {\n const targetTable = table([\n ['label', 'status', 'sizeGB', 'exists', 'requiresAdmin', 'path'],\n ...report.targets.map((target) => [\n target.label,\n target.status,\n String(target.sizeGB),\n target.exists ? 'yes' : 'no',\n target.requiresAdministrator ? 'yes' : 'no',\n target.path\n ])\n ]);\n\n if (!report.downloads) {\n return targetTable;\n }\n\n return `${targetTable}\\nDownloads top entries\\n${table([\n ['kind', 'sizeGB', 'path'],\n ...report.downloads.topEntries.map((entry) => [entry.kind, String(entry.sizeGB), entry.path])\n ])}`;\n}\n","import { win32 } from 'node:path';\n\nimport type { DiskCleanupLevel, DiskCleanupReport, DiskCleanupTarget } from './types.js';\nimport type { DiskCleanupRuntime } from './runtime.js';\n\nexport { type DiskCleanupRuntime } from './runtime.js';\n\nexport interface DiskCleanupServiceDependencies {\n runtime: DiskCleanupRuntime;\n systemRoot: string;\n userProfileRoot: string;\n}\n\nexport interface DiskCleanupOptions {\n apply: boolean;\n confirm: boolean;\n disableHibernate: boolean;\n level: DiskCleanupLevel;\n}\n\ninterface DiskCleanupTargetDefinition {\n args?: string[];\n action: DiskCleanupTarget['action'];\n command?: string;\n label: string;\n path: string;\n requiresAdministrator: boolean;\n}\n\nexport interface DiskCleanupErrorDetails {\n report: DiskCleanupReport;\n}\n\nexport class DiskCleanupServiceError extends Error {\n code: string;\n details?: DiskCleanupErrorDetails;\n exitCode: number;\n\n constructor(code: string, message: string, exitCode = 2, details?: DiskCleanupErrorDetails) {\n super(message);\n this.code = code;\n if (details) {\n this.details = details;\n }\n this.exitCode = exitCode;\n }\n}\n\nexport class DiskCleanupService {\n private readonly runtime: DiskCleanupRuntime;\n private readonly systemRoot: string;\n private readonly userProfileRoot: string;\n\n constructor(dependencies: DiskCleanupServiceDependencies) {\n this.runtime = dependencies.runtime;\n this.systemRoot = dependencies.systemRoot;\n this.userProfileRoot = dependencies.userProfileRoot;\n }\n\n async cleanup(options: DiskCleanupOptions): Promise<DiskCleanupReport> {\n if (requiresConfirmation(options.level) && options.apply && !options.confirm) {\n throw new DiskCleanupServiceError(\n 'DISK_CLEANUP_CONFIRMATION_REQUIRED',\n 'Disk cleanup level requires --confirm before apply.'\n );\n }\n\n const targetDefinitions = this.getTargets(options.level);\n const targets: DiskCleanupTarget[] = [];\n const failures: string[] = [];\n let estimatedReclaimBytes = 0;\n\n for (const target of targetDefinitions) {\n const inspection =\n target.action === 'run-command'\n ? { exists: true, isDirectory: false, sizeBytes: 0 }\n : await this.runtime.inspectPath(target.path);\n estimatedReclaimBytes += inspection.sizeBytes;\n\n let status: DiskCleanupTarget['status'] = inspection.exists\n ? (options.apply ? 'cleaned' : 'planned')\n : 'missing';\n let error: string | undefined;\n\n if (options.apply && inspection.exists) {\n try {\n if (target.action === 'clear-directory-contents') {\n await this.runtime.clearDirectoryContents(target.path);\n }\n if (target.action === 'run-command') {\n await this.runtime.runCommand(target.command!, target.args ?? []);\n }\n if (target.action === 'inspect-only') {\n status = 'planned';\n }\n } catch (cause) {\n error = getErrorMessage(cause);\n failures.push(`${target.label}: ${error}`);\n status = 'failed';\n }\n }\n\n targets.push({\n action: target.action,\n ...(target.command ? { command: target.command } : {}),\n ...(target.args ? { args: target.args } : {}),\n exists: inspection.exists,\n label: target.label,\n path: target.path,\n requiresAdministrator: target.requiresAdministrator,\n sizeBytes: inspection.sizeBytes,\n sizeGB: bytesToGb(inspection.sizeBytes),\n status,\n ...(error ? { error } : {})\n });\n }\n\n const hibernation: DiskCleanupReport['hibernation'] = {\n requested: options.disableHibernate,\n status: 'skipped'\n };\n\n if (options.apply && options.disableHibernate) {\n try {\n await this.runtime.disableHibernation();\n hibernation.status = 'disabled';\n } catch (error) {\n hibernation.status = 'failed';\n hibernation.error = getErrorMessage(error);\n failures.push(`hibernation: ${hibernation.error}`);\n }\n }\n\n const report: DiskCleanupReport = {\n ...(options.level === 'deep' ? { downloads: await this.getDownloadsReport() } : {}),\n estimatedReclaimBytes,\n estimatedReclaimGB: bytesToGb(estimatedReclaimBytes),\n hibernation,\n level: options.level,\n mode: options.apply ? 'apply' : 'preview',\n systemRoot: this.systemRoot,\n targets,\n userProfileRoot: this.userProfileRoot\n };\n\n if (failures.length > 0) {\n throw new DiskCleanupServiceError(\n 'DISK_CLEANUP_ERROR',\n 'Disk cleanup encountered failures.',\n 2,\n {\n report\n }\n );\n };\n\n return report;\n }\n\n private async getDownloadsReport(): Promise<NonNullable<DiskCleanupReport['downloads']>> {\n const path = win32.join(this.userProfileRoot, 'Downloads');\n return {\n path,\n topEntries: await this.runtime.listTopEntriesBySize(path, 100)\n };\n }\n\n private getTargets(level: DiskCleanupLevel): DiskCleanupTargetDefinition[] {\n if (level === 'safe') {\n return this.getSafeTargets();\n }\n\n if (level === 'dev') {\n return dedupeTargets([...this.getSafeTargets(), ...this.getDevTargets()]);\n }\n\n if (level === 'system') {\n return dedupeTargets([...this.getSafeTargets(), ...this.getSystemTargets()]);\n }\n\n return dedupeTargets([...this.getSafeTargets(), ...this.getDevTargets(), ...this.getSystemTargets()]);\n }\n\n private getSafeTargets(): DiskCleanupTargetDefinition[] {\n return [\n {\n action: 'clear-directory-contents',\n label: 'npm cache',\n path: win32.join(this.userProfileRoot, 'AppData', 'Local', 'npm-cache'),\n requiresAdministrator: false\n },\n {\n action: 'clear-directory-contents',\n label: 'NuGet cache',\n path: win32.join(this.userProfileRoot, 'AppData', 'Local', 'NuGet'),\n requiresAdministrator: false\n },\n {\n action: 'clear-directory-contents',\n label: 'Generic cache',\n path: win32.join(this.userProfileRoot, '.cache'),\n requiresAdministrator: false\n },\n {\n action: 'clear-directory-contents',\n label: 'Maven repository cache',\n path: win32.join(this.userProfileRoot, '.m2'),\n requiresAdministrator: false\n },\n {\n action: 'clear-directory-contents',\n label: 'User temp',\n path: win32.join(this.userProfileRoot, 'AppData', 'Local', 'Temp'),\n requiresAdministrator: false\n },\n {\n action: 'clear-directory-contents',\n label: 'Windows Update download cache',\n path: win32.join(this.systemRoot, 'SoftwareDistribution', 'Download'),\n requiresAdministrator: true\n }\n ];\n }\n\n private getDevTargets(): DiskCleanupTargetDefinition[] {\n return [\n {\n action: 'clear-directory-contents',\n label: 'Gradle cache',\n path: win32.join(this.userProfileRoot, '.gradle', 'caches'),\n requiresAdministrator: false\n },\n {\n action: 'clear-directory-contents',\n label: 'pnpm store',\n path: win32.join(this.userProfileRoot, '.pnpm-store'),\n requiresAdministrator: false\n },\n {\n action: 'clear-directory-contents',\n label: 'pnpm local store',\n path: win32.join(this.userProfileRoot, 'AppData', 'Local', 'pnpm', 'store'),\n requiresAdministrator: false\n },\n {\n action: 'clear-directory-contents',\n label: 'Yarn cache',\n path: win32.join(this.userProfileRoot, 'AppData', 'Local', 'Yarn', 'Cache'),\n requiresAdministrator: false\n },\n {\n action: 'clear-directory-contents',\n label: 'pip cache',\n path: win32.join(this.userProfileRoot, 'AppData', 'Local', 'pip', 'Cache'),\n requiresAdministrator: false\n }\n ];\n }\n\n private getSystemTargets(): DiskCleanupTargetDefinition[] {\n return [\n {\n action: 'clear-directory-contents',\n label: 'Windows temp',\n path: win32.join(this.systemRoot, 'Temp'),\n requiresAdministrator: true\n },\n {\n action: 'run-command',\n args: ['/Online', '/Cleanup-Image', '/StartComponentCleanup'],\n command: 'dism.exe',\n label: 'DISM component cleanup',\n path: 'dism.exe /Online /Cleanup-Image /StartComponentCleanup',\n requiresAdministrator: true\n }\n ];\n }\n}\n\nfunction bytesToGb(value: number): number {\n return Number((value / (1024 ** 3)).toFixed(2));\n}\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : 'Unknown error';\n}\n\nfunction requiresConfirmation(level: DiskCleanupLevel): boolean {\n return level === 'system' || level === 'deep';\n}\n\nfunction dedupeTargets(targets: DiskCleanupTargetDefinition[]): DiskCleanupTargetDefinition[] {\n const seen = new Set<string>();\n const result: DiskCleanupTargetDefinition[] = [];\n\n for (const target of targets) {\n const key = `${target.action}:${target.command ?? target.path}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n result.push(target);\n }\n\n return result;\n}\n","import type { Command } from 'commander';\nimport { z } from 'zod';\n\nimport { BrowserVideoSniffProvider } from './sniff/browser-provider.js';\nimport { VideoSniffService } from './sniff/service.js';\nimport { HttpVideoSniffProvider } from './sniff/http-provider.js';\nimport { DirectVideoDownloadDriver } from './download/direct-driver.js';\nimport { HlsVideoDownloadDriver } from './download/hls-driver.js';\nimport { BrowserDownloadDriver } from './download/browser-driver.js';\nimport { VideoDownloadService } from './download/service.js';\nimport { VideoCompressionService } from './compress/service.js';\nimport {\n renderVideoCandidatesAsJson,\n renderVideoCandidatesAsTable,\n renderVideoCommandErrorAsJson,\n renderVideoCompressionResultAsJson,\n renderVideoDownloadResultAsJson,\n renderVideoOperationAsTable\n} from './output.js';\nimport type { VideoRuntime } from './runtime.js';\nimport { VideoCommandError } from './types.js';\n\nexport interface VideoCommandDependencies {\n runtime: VideoRuntime;\n stderr: (value: string) => void;\n stdout: (value: string) => void;\n}\n\nconst sniffOptionsSchema = z.object({\n format: z.enum(['json', 'table']).default('json'),\n mode: z.enum(['auto', 'browser', 'http']).default('auto'),\n proxy: z.string().optional(),\n skipProxy: z.boolean().default(false)\n});\n\nconst downloadOptionsSchema = z.object({\n format: z.enum(['json', 'table']).default('json'),\n mode: z.enum(['auto', 'browser', 'http']).default('auto'),\n outputDir: z.string().optional(),\n proxy: z.string().optional(),\n skipProxy: z.boolean().default(false)\n});\n\nconst compressOptionsSchema = z.object({\n audioBitrate: z.string().optional(),\n format: z.enum(['json', 'table']).default('json'),\n outputPath: z.string().optional(),\n resolution: z.string().optional(),\n videoBitrate: z.string().optional()\n});\n\nexport function registerVideoCommands(\n program: Command,\n dependencies: VideoCommandDependencies\n): void {\n const video = program.command('video').description('Inspect, download, and compress video media.');\n const browserProvider = new BrowserVideoSniffProvider({\n runtime: dependencies.runtime\n });\n const httpProvider = new HttpVideoSniffProvider({\n runtime: dependencies.runtime\n });\n const sniffService = new VideoSniffService({\n browserProvider: (sourceUrl, opts) => browserProvider.sniff(sourceUrl, opts),\n httpProvider: (sourceUrl, opts) => httpProvider.sniff(sourceUrl, opts)\n });\n const browserDriver = new BrowserDownloadDriver();\n const downloadService = new VideoDownloadService({\n directDriver: new DirectVideoDownloadDriver({\n runtime: dependencies.runtime\n }),\n hlsDriver: new HlsVideoDownloadDriver({\n runtime: dependencies.runtime\n }),\n sniffService,\n browserDriver\n });\n const compressionService = new VideoCompressionService({\n runtime: dependencies.runtime\n });\n\n video.command('sniff')\n .argument('<input>', 'page url or media url')\n .option('--mode <mode>', 'sniff mode', 'auto')\n .option('--format <format>', 'output format', 'json')\n .option('-t, --table', 'render as a table')\n .option('--proxy <proxy>', 'proxy URL')\n .option('--skip-proxy', 'disable proxy')\n .action(async (input, options) => {\n const parsed = sniffOptionsSchema.parse(applyVideoTableShortcut(options));\n const result = await sniffService.sniff({\n mode: parsed.mode,\n sourceUrl: input,\n ...(parsed.proxy ? { proxyUrl: parsed.proxy } : {}),\n ...(parsed.skipProxy ? { noProxy: true } : {})\n });\n\n if (parsed.format === 'table') {\n dependencies.stdout(`${renderVideoCandidatesAsTable(result)}\\n`);\n return;\n }\n\n dependencies.stdout(`${renderVideoCandidatesAsJson(result)}\\n`);\n });\n\n video.command('download')\n .argument('<input>', 'page url, m3u8 url, or mp4 url')\n .option('--mode <mode>', 'sniff mode', 'auto')\n .option('--output-dir <outputDir>', 'output directory')\n .option('--format <format>', 'output format', 'json')\n .option('-t, --table', 'render as a table')\n .option('--proxy <proxy>', 'proxy URL')\n .option('--skip-proxy', 'disable proxy')\n .action(async (input, options) => {\n const parsed = downloadOptionsSchema.parse(applyVideoTableShortcut(options));\n const result = await downloadService.download({\n input,\n mode: parsed.mode,\n ...(parsed.outputDir ? { outputDir: parsed.outputDir } : {}),\n ...(parsed.proxy ? { proxyUrl: parsed.proxy } : {}),\n ...(parsed.skipProxy ? { noProxy: true } : {})\n });\n\n if (parsed.format === 'table') {\n dependencies.stdout(\n `${renderVideoOperationAsTable([\n ['field', 'value'],\n ['mediaType', result.mediaType],\n ['outputPath', result.outputPath]\n ])}\\n`\n );\n return;\n }\n\n dependencies.stdout(`${renderVideoDownloadResultAsJson(result)}\\n`);\n });\n\n video.command('compress')\n .argument('<input>', 'local input video path')\n .option('--output-path <outputPath>', 'output path')\n .option('--resolution <resolution>', 'target resolution, such as 1280x720')\n .option('--video-bitrate <videoBitrate>', 'target video bitrate')\n .option('--audio-bitrate <audioBitrate>', 'target audio bitrate')\n .option('--format <format>', 'output format', 'json')\n .option('-t, --table', 'render as a table')\n .action(async (input, options) => {\n const parsed = compressOptionsSchema.parse(applyVideoTableShortcut(options));\n const result = await compressionService.compress({\n inputPath: input,\n ...(parsed.audioBitrate ? { audioBitrate: parsed.audioBitrate } : {}),\n ...(parsed.outputPath ? { outputPath: parsed.outputPath } : {}),\n ...(parsed.resolution ? { resolution: parsed.resolution } : {}),\n ...(parsed.videoBitrate ? { videoBitrate: parsed.videoBitrate } : {})\n });\n\n if (parsed.format === 'table') {\n dependencies.stdout(\n `${renderVideoOperationAsTable([\n ['field', 'value'],\n ['codec', result.codec],\n ['outputPath', result.outputPath]\n ])}\\n`\n );\n return;\n }\n\n dependencies.stdout(`${renderVideoCompressionResultAsJson(result)}\\n`);\n });\n}\n\nexport function handleVideoCommandError(\n error: unknown,\n dependencies: Pick<VideoCommandDependencies, 'stderr'>\n): number | undefined {\n if (error instanceof VideoCommandError) {\n const details = (error as { details?: unknown }).details;\n dependencies.stderr(\n `${renderVideoCommandErrorAsJson(\n error.code,\n error.message,\n details\n )}\\n`\n );\n return error.exitCode;\n }\n\n return undefined;\n}\n\nexport function applyVideoTableShortcut<T extends { format?: string; table?: boolean }>(options: T): T & {\n format: 'json' | 'table';\n} {\n if (options.table) {\n return {\n ...options,\n format: 'table'\n };\n }\n\n if (options.format) {\n return {\n ...options,\n format: options.format as 'json' | 'table'\n };\n }\n\n throw new Error('Output format is required for this command.');\n}\n","import type { VideoRuntime } from '../runtime.js';\nimport type { VideoCandidate } from '../types.js';\n\nexport class BrowserVideoSniffProvider {\n private readonly runtime: Pick<VideoRuntime, 'launchBrowserSniffer'>;\n\n constructor(dependencies: { runtime: Pick<VideoRuntime, 'launchBrowserSniffer'> }) {\n this.runtime = dependencies.runtime;\n }\n\n sniff(sourceUrl: string, options?: { noProxy?: boolean; proxyUrl?: string }): Promise<VideoCandidate[]> {\n return this.runtime.launchBrowserSniffer(sourceUrl, options);\n }\n}\n","import type { VideoCandidate, VideoCandidateOrigin, VideoCandidateType } from '../types.js';\n\nexport function createVideoCandidate(\n type: VideoCandidateType,\n url: string,\n origin: VideoCandidateOrigin,\n confidence = 0.5\n): VideoCandidate {\n return {\n confidence,\n mimeType: type === 'm3u8' ? 'application/vnd.apple.mpegurl' : 'video/mp4',\n origin,\n type,\n url\n };\n}\n\nexport function rankVideoCandidates(candidates: VideoCandidate[]): VideoCandidate[] {\n const deduped = new Map<string, VideoCandidate>();\n\n /* c8 ignore start */\n for (const candidate of candidates) {\n const existing = deduped.get(candidate.url);\n\n if (!existing || (candidate.confidence ?? 0) > (existing.confidence ?? 0)) {\n deduped.set(candidate.url, candidate);\n }\n }\n\n return [...deduped.values()].sort((left, right) => {\n const confidenceDelta = (right.confidence ?? 0) - (left.confidence ?? 0);\n\n if (confidenceDelta !== 0) {\n return confidenceDelta;\n }\n\n if (left.type === right.type) {\n return 0;\n }\n\n return left.type === 'm3u8' ? -1 : 1;\n });\n /* c8 ignore end */\n}\n\nexport function extractVideoCandidatesFromText(\n text: string,\n origin: Exclude<VideoCandidateOrigin, 'network' | 'direct-input'>\n): VideoCandidate[] {\n const matches = text.matchAll(/https?:\\/\\/[^\\s\"'<>]+?\\.(m3u8|mp4)(?:\\?[^\\s\"'<>]*)?/gi);\n\n return rankVideoCandidates(\n [...matches].map((match) =>\n createVideoCandidate(match[1]?.toLowerCase() === 'm3u8' ? 'm3u8' : 'mp4', match[0], origin, origin === 'html' ? 0.75 : 0.65)\n )\n );\n}\n","export function optional<T, K extends string>(key: K, value: T): Partial<Record<K, T>> {\n return (value !== undefined && value !== null && value !== '' ? { [key]: value } : {}) as Partial<\n Record<K, T>\n >;\n}\n","import { rankVideoCandidates } from './candidate.js';\nimport type { VideoCandidate, VideoSniffMode, VideoSniffResult } from '../types.js';\nimport { optional } from '../utils.js';\n\nexport interface VideoSniffServiceDependencies {\n browserProvider: (sourceUrl: string, options?: { noProxy?: boolean; proxyUrl?: string }) => Promise<VideoCandidate[]>;\n httpProvider: (sourceUrl: string, options?: { noProxy?: boolean; proxyUrl?: string }) => Promise<VideoCandidate[]>;\n}\n\nexport class VideoSniffService {\n private readonly browserProvider: VideoSniffServiceDependencies['browserProvider'];\n private readonly httpProvider: VideoSniffServiceDependencies['httpProvider'];\n\n constructor(dependencies: VideoSniffServiceDependencies) {\n this.browserProvider = dependencies.browserProvider;\n this.httpProvider = dependencies.httpProvider;\n }\n\n async sniff(options: { mode: VideoSniffMode; sourceUrl: string; noProxy?: boolean; proxyUrl?: string }): Promise<VideoSniffResult> {\n const providerOptions = buildProviderOptions(options);\n\n if (options.mode === 'http') {\n return this.createResult('http', options.sourceUrl, await this.httpProvider(options.sourceUrl, providerOptions));\n }\n\n if (options.mode === 'browser') {\n return this.createResult(\n 'browser',\n options.sourceUrl,\n await this.browserProvider(options.sourceUrl, providerOptions)\n );\n }\n\n try {\n return this.createResult(\n 'browser',\n options.sourceUrl,\n await this.browserProvider(options.sourceUrl, providerOptions)\n );\n } catch (error) {\n if (error instanceof Error && 'recoverable' in error && error.recoverable === true) {\n return this.createResult('http', options.sourceUrl, await this.httpProvider(options.sourceUrl, providerOptions));\n }\n\n throw error;\n }\n }\n\n private createResult(\n mode: 'browser' | 'http',\n sourceUrl: string,\n candidates: VideoCandidate[]\n ): VideoSniffResult {\n return {\n candidates: rankVideoCandidates(candidates),\n mode,\n sourceUrl\n };\n }\n}\n\nfunction buildProviderOptions(options: {\n noProxy?: boolean;\n proxyUrl?: string;\n}): {\n noProxy?: boolean;\n proxyUrl?: string;\n} {\n return {\n ...optional('noProxy', options.noProxy),\n ...optional('proxyUrl', options.proxyUrl)\n };\n}\n","export type VideoSniffMode = 'auto' | 'browser' | 'http';\nexport type VideoCandidateType = 'm3u8' | 'mp4';\nexport type VideoCandidateOrigin = 'network' | 'html' | 'script' | 'direct-input';\n\nexport interface VideoCandidate {\n confidence?: number;\n mimeType?: string;\n origin: VideoCandidateOrigin;\n type: VideoCandidateType;\n url: string;\n}\n\nexport interface VideoSniffResult {\n candidates: VideoCandidate[];\n mode: Exclude<VideoSniffMode, 'auto'>;\n sourceUrl: string;\n}\n\nexport interface VideoDownloadResult {\n bytesWritten?: number;\n mediaType: VideoCandidateType;\n outputPath: string;\n sourceUrl: string;\n}\n\nexport interface VideoCompressionOptions {\n audioBitrate?: string;\n inputPath: string;\n outputPath?: string;\n resolution?: string;\n videoBitrate?: string;\n}\n\nexport interface VideoCompressionResult {\n audioBitrate: string;\n audioCodec: 'aac';\n codec: 'libx265';\n inputPath: string;\n outputPath: string;\n resolution?: string;\n videoBitrate?: string;\n}\n\nexport class VideoCommandError extends Error {\n code: string;\n details?: unknown;\n exitCode: number;\n recoverable: boolean;\n\n constructor(\n code: string,\n message: string,\n exitCode = 2,\n details?: unknown,\n recoverable = false\n ) {\n super(message);\n this.code = code;\n if (details !== undefined) {\n this.details = details;\n }\n this.exitCode = exitCode;\n this.recoverable = recoverable;\n }\n}\n","import { extractVideoCandidatesFromText } from './candidate.js';\nimport type { VideoRuntime } from '../runtime.js';\nimport { VideoCommandError, type VideoCandidate } from '../types.js';\n\nexport class HttpVideoSniffProvider {\n private readonly runtime: Pick<VideoRuntime, 'fetch'>;\n\n constructor(dependencies: { runtime: Pick<VideoRuntime, 'fetch'> }) {\n this.runtime = dependencies.runtime;\n }\n\n async sniff(sourceUrl: string, options?: { noProxy?: boolean; proxyUrl?: string }): Promise<VideoCandidate[]> {\n const response = await this.runtime.fetch(sourceUrl);\n\n if (!response.ok) {\n throw new VideoCommandError(\n 'VIDEO_SNIFF_FAILED',\n `Failed to inspect ${sourceUrl}. HTTP ${response.status}.`\n );\n }\n\n const text = await response.text();\n return extractVideoCandidatesFromText(text, 'html');\n }\n}\n","import { basename, win32 } from 'node:path';\n\nimport { SingleBar } from 'cli-progress';\n\nimport type { VideoRuntime } from '../runtime.js';\nimport { VideoCommandError, type VideoDownloadResult } from '../types.js';\nimport { createMediaRequestInit } from './media-request.js';\n\nasync function fetchWithProxy(\n url: string,\n runtime: Pick<VideoRuntime, 'fetch'>,\n options?: { noProxy?: boolean; proxyUrl?: string }\n): Promise<Awaited<ReturnType<VideoRuntime['fetch']>>> {\n const init = createMediaRequestInit(url);\n\n if (options?.noProxy) {\n return await runtime.fetch(url, init);\n }\n\n const proxyUrl = options?.proxyUrl ?? process.env.HTTP_PROXY ?? process.env.HTTPS_PROXY;\n if (!proxyUrl) {\n return await runtime.fetch(url, init);\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // @ts-ignore -- https-proxy-agent uses exports map that NodeNext can't resolve in dynamic import\n const mod = (await import('https-proxy-agent')) as any;\n // eslint-disable-next-line @typescript-eslint/no-explicit any\n const response = await runtime.fetch(url, { ...init, agent: new mod.HttpsProxyAgent(proxyUrl) } as any);\n return response;\n } catch (error) {\n // Fall back to direct connection\n console.warn(`[stephen] Proxy connection failed (${proxyUrl}), falling back to direct connection: ${error instanceof Error ? error.message : String(error)}`);\n return await runtime.fetch(url, init);\n }\n}\n\nexport class DirectVideoDownloadDriver {\n private readonly runtime: Pick<VideoRuntime, 'fetch' | 'writeFile'>;\n\n constructor(dependencies: { runtime: Pick<VideoRuntime, 'fetch' | 'writeFile'> }) {\n this.runtime = dependencies.runtime;\n }\n\n async download(options: {\n outputDir?: string;\n outputPath?: string;\n sourceUrl: string;\n noProxy?: boolean;\n proxyUrl?: string;\n }): Promise<VideoDownloadResult> {\n let response: Awaited<ReturnType<DirectVideoDownloadDriver['runtime']['fetch']>>;\n\n try {\n response = await fetchWithProxy(\n options.sourceUrl,\n this.runtime,\n buildProxyOptions(options)\n );\n } catch (error) {\n throw new VideoCommandError(\n 'VIDEO_DOWNLOAD_FAILED',\n `Failed to download ${options.sourceUrl}.`,\n 2,\n {\n cause: error instanceof Error ? error.message : String(error)\n }\n );\n }\n\n if (!response.ok) {\n throw new VideoCommandError(\n 'VIDEO_DOWNLOAD_FAILED',\n `Failed to download ${options.sourceUrl}. HTTP ${response.status}.`\n );\n }\n\n const outputPath = options.outputPath ?? win32.join(options.outputDir ?? '.', inferFileName(options.sourceUrl));\n\n // Streaming download with progress bar\n const contentLength = response.headers.get('content-length');\n const totalBytes = contentLength ? parseInt(contentLength, 10) : undefined;\n let buffer: Buffer;\n\n /* c8 ignore start */\n if (response.body && totalBytes && totalBytes > 0) {\n buffer = await this.downloadWithProgress(response.body, totalBytes, outputPath);\n } else {\n buffer = await this.downloadAsBuffer(response);\n }\n /* c8 ignore stop */\n\n await this.runtime.writeFile(outputPath, buffer);\n\n const downloadedBytes = buffer.byteLength;\n if (downloadedBytes > 0) {\n console.error(`Downloaded ${formatBytes(downloadedBytes)} to ${outputPath}`);\n }\n\n return {\n bytesWritten: buffer.byteLength,\n mediaType: 'mp4',\n outputPath,\n sourceUrl: options.sourceUrl\n };\n }\n\n /* c8 ignore start */ private async downloadWithProgress(\n body: ReadableStream<Uint8Array>,\n totalBytes: number,\n _outputPath: string\n ): Promise<Buffer> {\n const reader = body.getReader();\n const chunks: Uint8Array[] = [];\n let receivedBytes = 0;\n const startTime = Date.now();\n\n const progressBar = new SingleBar({\n format: createProgressFormatter(startTime, 24),\n barCompleteChar: '█',\n barIncompleteChar: '░',\n hideCursor: true,\n fps: 10,\n barsize: 24\n });\n\n progressBar.start(totalBytes, 0);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n receivedBytes += value.length;\n progressBar.update(receivedBytes);\n }\n } finally {\n progressBar.stop();\n reader.releaseLock();\n }\n\n return Buffer.concat(chunks);\n }\n\n private async downloadAsBuffer(\n response: Awaited<ReturnType<DirectVideoDownloadDriver['runtime']['fetch']>>\n ): Promise<Buffer> {\n const payload = await response.arrayBuffer();\n return payload instanceof Uint8Array ? Buffer.from(payload) : Buffer.from(payload);\n }\n}\n\nfunction createProgressFormatter(startTime: number, barsize: number) {\n return (_options: unknown, params: { progress: number; value: number; total: number; eta: number }): string => {\n const elapsed = (Date.now() - startTime) / 1000;\n const speed = elapsed > 0 ? params.value / elapsed : 0;\n\n const completeCount = Math.round(params.progress * barsize);\n const bar = '█'.repeat(completeCount) + '░'.repeat(barsize - completeCount);\n\n const percentage = (params.progress * 100).toFixed(1);\n return `Downloading ${bar} ${percentage}% | ${formatBytes(speed)}/s | ETA ${formatETA(params.eta)} | ${formatBytes(params.value)} / ${formatBytes(params.total)}`;\n };\n}\n\nfunction inferFileName(sourceUrl: string): string {\n const name = basename(new URL(sourceUrl).pathname);\n return name || 'video.mp4';\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\nfunction formatETA(seconds: number): string {\n if (!isFinite(seconds) || seconds <= 0) return '--:--';\n const s = Math.round(seconds);\n if (s >= 3600) {\n const h = Math.floor(s / 3600);\n const m = Math.floor((s % 3600) / 60);\n const sec = s % 60;\n return `${h}:${String(m).padStart(2, '0')}:${String(sec).padStart(2, '0')}`;\n }\n const m = Math.floor(s / 60);\n const sec = s % 60;\n return `${m}:${String(sec).padStart(2, '0')}`;\n}\n\nfunction buildProxyOptions(options: {\n noProxy?: boolean;\n proxyUrl?: string;\n}): {\n noProxy?: boolean;\n proxyUrl?: string;\n} {\n return {\n ...(options.noProxy === undefined ? {} : { noProxy: options.noProxy }),\n ...(options.proxyUrl === undefined ? {} : { proxyUrl: options.proxyUrl })\n };\n}\n/* c8 ignore stop */\n","export function createMediaRequestInit(sourceUrl: string): RequestInit {\n const url = new URL(sourceUrl);\n\n return {\n headers: {\n referer: `${url.protocol}//${url.host}/`,\n 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0 Safari/537.36'\n }\n };\n}\n","import { basename, extname, win32 } from 'node:path';\n\nimport type { VideoRuntime } from '../runtime.js';\nimport { VideoCommandError, type VideoDownloadResult } from '../types.js';\nimport { createMediaRequestInit } from './media-request.js';\n\nexport class HlsVideoDownloadDriver {\n private readonly runtime: Pick<VideoRuntime, 'fetch' | 'writeFile'>;\n\n constructor(dependencies: { runtime: Pick<VideoRuntime, 'fetch' | 'writeFile'> }) {\n this.runtime = dependencies.runtime;\n }\n\n async download(options: {\n outputDir?: string;\n outputPath?: string;\n sourceUrl: string;\n }): Promise<VideoDownloadResult> {\n const playlistResponse = await this.runtime.fetch(\n options.sourceUrl,\n createMediaRequestInit(options.sourceUrl)\n );\n\n if (!playlistResponse.ok) {\n throw new VideoCommandError(\n 'VIDEO_DOWNLOAD_FAILED',\n `Failed to download ${options.sourceUrl}. HTTP ${playlistResponse.status}.`\n );\n }\n\n const playlist = await playlistResponse.text();\n const segmentUrls = parsePlaylistResourceUrls(playlist, options.sourceUrl);\n\n const chunks: Buffer[] = [];\n\n // Fetch all segments concurrently\n const segmentResponses = await Promise.all(\n segmentUrls.map((segmentUrl) => this.runtime.fetch(segmentUrl, createMediaRequestInit(segmentUrl)))\n );\n\n for (let i = 0; i < segmentResponses.length; i++) {\n const segmentResponse = segmentResponses[i];\n const segmentUrl = segmentUrls[i];\n\n if (!segmentResponse || !segmentUrl) {\n throw new VideoCommandError(\n 'VIDEO_DOWNLOAD_FAILED',\n `Failed to download segment ${i}.`\n );\n }\n\n if (!segmentResponse.ok) {\n throw new VideoCommandError(\n 'VIDEO_DOWNLOAD_FAILED',\n `Failed to download ${segmentUrl}. HTTP ${segmentResponse.status}.`\n );\n }\n\n const payload = await segmentResponse.arrayBuffer();\n chunks.push(payload instanceof Uint8Array ? Buffer.from(payload) : Buffer.from(payload));\n }\n\n const merged = Buffer.concat(chunks);\n const outputPath =\n options.outputPath ??\n win32.join(options.outputDir ?? '.', `${stripExtension(basename(new URL(options.sourceUrl).pathname))}.ts`);\n await this.runtime.writeFile(outputPath, merged);\n\n return {\n bytesWritten: merged.byteLength,\n mediaType: 'm3u8',\n outputPath,\n sourceUrl: options.sourceUrl\n };\n }\n}\n\nfunction stripExtension(value: string): string {\n const extension = extname(value);\n return extension.length === 0 ? value : value.slice(0, -extension.length);\n}\n\nfunction parsePlaylistResourceUrls(playlist: string, sourceUrl: string): string[] {\n const urls: string[] = [];\n\n for (const rawLine of playlist.split(/\\r?\\n/u)) {\n const line = rawLine.trim();\n\n if (line.length === 0) {\n continue;\n }\n\n const mapUri = /^#EXT-X-MAP:.*URI=\"([^\"]+)\"/u.exec(line)?.[1];\n if (mapUri) {\n urls.push(new URL(mapUri, sourceUrl).toString());\n continue;\n }\n\n if (!line.startsWith('#')) {\n urls.push(new URL(line, sourceUrl).toString());\n }\n }\n\n return urls;\n}\n","import { join } from 'node:path';\n\nimport { VideoCommandError, type VideoDownloadResult } from '../types.js';\n\nexport class BrowserDownloadDriver {\n async download(options: {\n outputDir?: string;\n outputPath?: string;\n sourceUrl: string;\n }): Promise<VideoDownloadResult> {\n const outputPath = options.outputPath ?? join(options.outputDir ?? '.', this.inferFileName(options.sourceUrl));\n\n const { chromium } = await this.loadPlaywright();\n if (!chromium) {\n throw new VideoCommandError(\n 'VIDEO_BROWSER_UNAVAILABLE',\n 'Browser download requires Playwright Chromium support.',\n 2,\n undefined,\n true\n );\n }\n\n const browser = await chromium.launch({ headless: true });\n try {\n const context = await browser.newContext();\n const page = await context.newPage();\n\n const downloadPromise = page.waitForEvent('download');\n await page.goto(options.sourceUrl, { waitUntil: 'load' });\n await page.waitForTimeout(2000);\n\n const download = await downloadPromise;\n await download.saveAs(outputPath);\n\n return {\n mediaType: 'mp4',\n outputPath,\n sourceUrl: options.sourceUrl\n };\n } finally {\n await browser.close();\n }\n }\n\n private async loadPlaywright(): Promise<{ chromium?: import('playwright').BrowserType<import('playwright').Browser> }> {\n try {\n return await loadOptionalModule('playwright') as { chromium?: import('playwright').BrowserType<import('playwright').Browser> };\n } catch {\n throw new VideoCommandError(\n 'VIDEO_BROWSER_UNAVAILABLE',\n 'Browser download requires Playwright. Install it with: npm install playwright',\n 2,\n undefined,\n true\n );\n }\n }\n\n private inferFileName(sourceUrl: string): string {\n try {\n const url = new URL(sourceUrl);\n const name = url.pathname.split('/').pop();\n return name && name.length > 0 ? name : 'video.mp4';\n } catch {\n return 'video.mp4';\n }\n }\n}\n\nconst loadOptionalModule = new Function(\n 'specifier',\n 'return import(specifier);'\n) as (specifier: string) => Promise<unknown>;\n","import { VideoCommandError } from '../types.js';\n\nexport function encodeUrlPath(pathname: string): string {\n const segments = pathname.split('/');\n return segments\n .map((segment) => {\n if (segment.length > 0 && segment.charCodeAt(0) > 127) {\n return encodeURIComponent(segment);\n }\n return segment;\n })\n .join('/');\n}\n\nexport type VideoInputClassification =\n | { kind: 'm3u8'; url: string }\n | { kind: 'mp4'; url: string }\n | { kind: 'page'; url: string };\n\nexport function classifyVideoInput(input: string): VideoInputClassification {\n let url: URL;\n try {\n url = new URL(input);\n } catch {\n // Input might contain unencoded Chinese characters - try URL encoding the path\n const urlObj = new URL(input.startsWith('http') ? input : `https://${input}`);\n urlObj.pathname = encodeUrlPath(urlObj.pathname);\n url = urlObj;\n }\n\n if (!['http:', 'https:'].includes(url.protocol)) {\n throw new VideoCommandError('VIDEO_UNSUPPORTED_INPUT', `Unsupported video input: ${input}`);\n }\n\n if (/\\.m3u8(?:\\?|$)/i.test(url.href)) {\n return {\n kind: 'm3u8',\n url: url.href\n };\n }\n\n if (/\\.mp4(?:\\?|$)/i.test(url.href)) {\n return {\n kind: 'mp4',\n url: url.href\n };\n }\n\n return {\n kind: 'page',\n url: url.href\n };\n}\n","import { classifyVideoInput } from './resolver.js';\nimport { optional } from '../utils.js';\nimport { VideoCommandError, type VideoDownloadResult, type VideoSniffMode } from '../types.js';\nimport type { VideoSniffService } from '../sniff/service.js';\nimport type { DirectVideoDownloadDriver } from './direct-driver.js';\nimport type { HlsVideoDownloadDriver } from './hls-driver.js';\nimport type { BrowserDownloadDriver } from './browser-driver.js';\n\nexport interface VideoDownloadServiceDependencies {\n directDriver: Pick<DirectVideoDownloadDriver, 'download'>;\n hlsDriver: Pick<HlsVideoDownloadDriver, 'download'>;\n sniffService: Pick<VideoSniffService, 'sniff'>;\n browserDriver?: Pick<BrowserDownloadDriver, 'download'>;\n}\n\nexport class VideoDownloadService {\n private readonly directDriver: VideoDownloadServiceDependencies['directDriver'];\n private readonly hlsDriver: VideoDownloadServiceDependencies['hlsDriver'];\n private readonly sniffService: VideoDownloadServiceDependencies['sniffService'];\n private readonly browserDriver: VideoDownloadServiceDependencies['browserDriver'];\n\n constructor(dependencies: VideoDownloadServiceDependencies) {\n this.directDriver = dependencies.directDriver;\n this.hlsDriver = dependencies.hlsDriver;\n this.sniffService = dependencies.sniffService;\n this.browserDriver = dependencies.browserDriver;\n }\n\n async download(options: {\n input: string;\n mode: VideoSniffMode;\n outputDir?: string;\n outputPath?: string;\n noProxy?: boolean;\n proxyUrl?: string;\n }): Promise<VideoDownloadResult> {\n const classified = classifyVideoInput(options.input);\n\n // For page URLs, use browser driver if available (respects system proxy, handles cookies/sessions)\n if (classified.kind === 'page' && this.browserDriver) {\n const sniffed = await this.sniffService.sniff({\n mode: options.mode,\n sourceUrl: classified.url,\n ...buildProxyOptions(options)\n });\n const candidate = sniffed.candidates[0];\n if (!candidate) {\n throw new VideoCommandError(\n 'VIDEO_NO_CANDIDATE',\n 'No supported media candidate was detected for the provided input.'\n );\n }\n if (candidate.type === 'm3u8') {\n return this.hlsDriver.download(buildDownloadTargetOptions(options, candidate.url));\n }\n return this.browserDriver.download(buildDownloadTargetOptions(options, candidate.url));\n }\n\n if (classified.kind === 'm3u8') {\n return this.hlsDriver.download(buildDownloadTargetOptions(options, classified.url));\n }\n\n // For direct mp4 URLs, try browser driver first if available (handles cookie/session auth).\n // Then fall back to direct fetch.\n if (this.browserDriver) {\n try {\n return await this.browserDriver.download(buildDownloadTargetOptions(options, classified.url));\n } catch (error) {\n // If browser driver fails due to PLAYWRIGHT not available, fall through to direct\n if (error instanceof VideoCommandError && error.code === 'VIDEO_BROWSER_UNAVAILABLE') {\n // Browser not available, fall through to direct drivers\n } else if (!isBrowserDownloadTimeout(error)) {\n throw error;\n }\n }\n }\n\n // Direct drivers fallback\n if (classified.kind === 'mp4') {\n return this.directDriver.download(buildDownloadTargetOptions(options, classified.url));\n }\n\n // Fallback: sniff then use direct/hls driver\n const sniffed = await this.sniffService.sniff({\n mode: options.mode,\n sourceUrl: classified.url,\n ...buildProxyOptions(options)\n });\n const candidate = sniffed.candidates[0];\n\n if (!candidate) {\n throw new VideoCommandError(\n 'VIDEO_NO_CANDIDATE',\n 'No supported media candidate was detected for the provided input.'\n );\n }\n\n if (candidate.type === 'mp4') {\n return this.directDriver.download(buildDownloadTargetOptions(options, candidate.url));\n }\n\n return this.hlsDriver.download(buildDownloadTargetOptions(options, candidate.url));\n }\n}\n\nfunction isBrowserDownloadTimeout(error: unknown): boolean {\n return error instanceof Error && error.message.includes('waiting for event \"download\"');\n}\n\nfunction buildProxyOptions(options: {\n noProxy?: boolean;\n proxyUrl?: string;\n}): {\n noProxy?: boolean;\n proxyUrl?: string;\n} {\n return {\n ...(options.noProxy === undefined ? {} : { noProxy: options.noProxy }),\n ...(options.proxyUrl === undefined ? {} : { proxyUrl: options.proxyUrl })\n };\n}\n\nfunction buildDownloadTargetOptions(\n options: {\n outputDir?: string;\n outputPath?: string;\n noProxy?: boolean;\n proxyUrl?: string;\n },\n sourceUrl: string\n): {\n outputDir?: string;\n outputPath?: string;\n sourceUrl: string;\n noProxy?: boolean;\n proxyUrl?: string;\n} {\n return {\n ...optional('outputDir', options.outputDir),\n ...optional('outputPath', options.outputPath),\n ...optional('noProxy', options.noProxy),\n ...optional('proxyUrl', options.proxyUrl),\n sourceUrl\n };\n}\n","import { extname, win32 } from 'node:path';\n\nimport type { VideoRuntime } from '../runtime.js';\nimport { buildFfmpegArgs, probeFfmpegResult } from './ffmpeg.js';\nimport { VIDEO_COMPRESSION_DEFAULTS } from './preset.js';\nimport {\n VideoCommandError,\n type VideoCompressionOptions,\n type VideoCompressionResult\n} from '../types.js';\n\nexport class VideoCompressionService {\n private readonly runtime: Pick<VideoRuntime, 'execFile'>;\n\n constructor(dependencies: { runtime: Pick<VideoRuntime, 'execFile'> }) {\n this.runtime = dependencies.runtime;\n }\n\n async compress(options: VideoCompressionOptions): Promise<VideoCompressionResult> {\n const probe = await this.runtime.execFile('ffmpeg', ['-version']);\n\n if (!probeFfmpegResult(probe)) {\n throw new VideoCommandError(\n 'VIDEO_FFMPEG_MISSING',\n 'ffmpeg is required for video compression.'\n );\n }\n\n const outputPath = options.outputPath ?? replaceExtension(options.inputPath, '.mp4');\n const execResult = await this.runtime.execFile(\n 'ffmpeg',\n buildFfmpegArgs({\n inputPath: options.inputPath,\n outputPath,\n ...(options.audioBitrate ? { audioBitrate: options.audioBitrate } : {}),\n ...(options.resolution ? { resolution: options.resolution } : {}),\n ...(options.videoBitrate ? { videoBitrate: options.videoBitrate } : {})\n })\n );\n\n if (execResult.code !== 0) {\n throw new VideoCommandError(\n 'VIDEO_COMPRESSION_FAILED',\n execResult.stderr || 'Video compression failed.'\n );\n }\n\n return {\n audioBitrate: options.audioBitrate ?? VIDEO_COMPRESSION_DEFAULTS.audioBitrate,\n audioCodec: VIDEO_COMPRESSION_DEFAULTS.audioCodec,\n codec: VIDEO_COMPRESSION_DEFAULTS.videoCodec,\n inputPath: options.inputPath,\n outputPath,\n ...(options.resolution ? { resolution: options.resolution } : {}),\n ...(options.videoBitrate ? { videoBitrate: options.videoBitrate } : {})\n };\n }\n}\n\nfunction replaceExtension(path: string, nextExtension: string): string {\n const currentExtension = extname(path);\n return currentExtension.length === 0\n ? `${path}${nextExtension}`\n : `${path.slice(0, -currentExtension.length)}${nextExtension}`;\n}\n","export const VIDEO_COMPRESSION_DEFAULTS = {\n audioBitrate: '64k',\n audioCodec: 'aac',\n container: 'mp4',\n videoCodec: 'libx265'\n} as const;\n","import { VIDEO_COMPRESSION_DEFAULTS } from './preset.js';\n\nexport interface FfmpegCommandOptions {\n audioBitrate?: string;\n inputPath: string;\n outputPath: string;\n resolution?: string;\n videoBitrate?: string;\n}\n\nexport function buildFfmpegArgs(options: FfmpegCommandOptions): string[] {\n const args = [\n '-i',\n options.inputPath,\n '-c:v',\n VIDEO_COMPRESSION_DEFAULTS.videoCodec\n ];\n\n if (options.videoBitrate) {\n args.push('-b:v', options.videoBitrate);\n }\n\n if (options.resolution) {\n const [width, height] = options.resolution.split('x');\n args.push('-vf', `scale=${width}:${height}`);\n }\n\n args.push(\n '-c:a',\n VIDEO_COMPRESSION_DEFAULTS.audioCodec,\n '-b:a',\n options.audioBitrate ?? VIDEO_COMPRESSION_DEFAULTS.audioBitrate,\n options.outputPath\n );\n\n return args;\n}\n\nexport function probeFfmpegResult(result: { code: number; stderr: string; stdout: string }): boolean {\n return result.code === 0 && result.stdout.includes('ffmpeg version');\n}\n","import { table } from 'table';\n\nimport type {\n VideoCompressionResult,\n VideoDownloadResult,\n VideoSniffResult\n} from './types.js';\n\nexport function renderVideoCandidatesAsJson(result: VideoSniffResult): string {\n return JSON.stringify(\n {\n ok: true,\n data: result,\n meta: {\n count: result.candidates.length\n }\n },\n null,\n 2\n );\n}\n\nexport function renderVideoDownloadResultAsJson(result: VideoDownloadResult): string {\n return JSON.stringify(\n {\n ok: true,\n data: result\n },\n null,\n 2\n );\n}\n\nexport function renderVideoCompressionResultAsJson(result: VideoCompressionResult): string {\n return JSON.stringify(\n {\n ok: true,\n data: result\n },\n null,\n 2\n );\n}\n\nexport function renderVideoCommandErrorAsJson(\n code: string,\n message: string,\n details?: unknown\n): string {\n return JSON.stringify(\n {\n ok: false,\n error: {\n code,\n message,\n ...(details === undefined ? {} : { details })\n }\n },\n null,\n 2\n );\n}\n\nexport function renderVideoCandidatesAsTable(result: VideoSniffResult): string {\n return renderVideoOperationAsTable([\n ['type', 'url', 'origin', 'mode'],\n ...result.candidates.map((candidate) => [\n candidate.type,\n candidate.url,\n candidate.origin,\n result.mode\n ])\n ]);\n}\n\nexport function renderVideoOperationAsTable(rows: string[][]): string {\n return table(rows);\n}\n","import type { Command } from 'commander';\nimport { z } from 'zod';\n\nimport {\n renderKr36ArticleAsJson,\n renderKr36CommandErrorAsJson,\n renderKr36InformationListAsJson,\n renderKr36InformationListAsTable\n} from './output.js';\nimport type { Kr36Runtime } from './runtime.js';\nimport { Kr36ArticleService } from './service.js';\nimport { Kr36CommandError } from './types.js';\n\nexport interface Kr36CommandDependencies {\n runtime: Kr36Runtime;\n stderr: (value: string) => void;\n stdout: (value: string) => void;\n}\n\nconst articleOptionsSchema = z.object({\n format: z.enum(['json']).default('json')\n});\n\nconst informationListOptionsSchema = z.object({\n format: z.enum(['json', 'table']).default('json'),\n pages: z.number().int().min(1).max(20).default(1),\n table: z.boolean().optional()\n});\n\nexport function registerKr36Commands(\n program: Command,\n dependencies: Kr36CommandDependencies\n): void {\n const kr36 = program.command('36kr').description('Fetch and parse 36kr content.');\n const articleService = new Kr36ArticleService(dependencies.runtime);\n\n kr36.command('article')\n .argument('<articleId>', '36kr article id')\n .option('--format <format>', 'output format', 'json')\n .action(async (articleId, options) => {\n articleOptionsSchema.parse(options);\n const article = await articleService.getArticle(articleId);\n dependencies.stdout(`${renderKr36ArticleAsJson(article)}\\n`);\n });\n\n kr36.command('list')\n .argument('<channel>', '36kr information channel: AI or technology')\n .option('--pages <pages>', 'number of pages to fetch', parsePages, 1)\n .option('--format <format>', 'output format', 'json')\n .option('-t, --table', 'render as a table')\n .action(async (channel, options) => {\n const parsed = informationListOptionsSchema.parse(applyTableShortcut(options));\n const list = await articleService.getInformationList({\n channel,\n pages: parsed.pages\n });\n dependencies.stdout(\n parsed.format === 'table'\n ? `${renderKr36InformationListAsTable(list)}\\n`\n : `${renderKr36InformationListAsJson(list)}\\n`\n );\n });\n}\n\nexport function handleKr36CommandError(\n error: unknown,\n dependencies: Pick<Kr36CommandDependencies, 'stderr'>\n): number | undefined {\n if (error instanceof Kr36CommandError) {\n dependencies.stderr(\n `${renderKr36CommandErrorAsJson(error.code, error.message, error.details)}\\n`\n );\n return error.exitCode;\n }\n\n return undefined;\n}\n\nfunction parsePages(value: string): number {\n const parsed = Number(value);\n\n if (!Number.isInteger(parsed)) {\n throw new Kr36CommandError(\n 'KR36_INVALID_PAGES',\n '36kr list pages must be an integer between 1 and 20.',\n 2,\n {\n pages: value\n }\n );\n }\n\n return parsed;\n}\n\nfunction applyTableShortcut<T extends { format?: string; table?: boolean }>(options: T): T & {\n format: 'json' | 'table';\n} {\n if (options.table) {\n return {\n ...options,\n format: 'table'\n };\n }\n\n return {\n ...options,\n format: (options.format ?? 'json') as 'json' | 'table'\n };\n}\n","import { table } from 'table';\n\nimport type { Kr36Article, Kr36InformationList } from './types.js';\n\nexport function renderKr36ArticleAsJson(article: Kr36Article): string {\n return JSON.stringify(\n {\n ok: true,\n data: article\n },\n null,\n 2\n );\n}\n\nexport function renderKr36InformationListAsJson(list: Kr36InformationList): string {\n return JSON.stringify(\n {\n ok: true,\n data: list\n },\n null,\n 2\n );\n}\n\nexport function renderKr36InformationListAsTable(list: Kr36InformationList): string {\n return table([\n ['id', 'title', 'author', 'publishTime', 'url'],\n ...list.items.map((item) => [\n String(item.id),\n item.title,\n item.authorName ?? '',\n item.publishTime?.local ?? '',\n item.url\n ])\n ]);\n}\n\nexport function renderKr36CommandErrorAsJson(\n code: string,\n message: string,\n details?: unknown\n): string {\n return JSON.stringify(\n {\n ok: false,\n error: {\n code,\n message,\n ...(details === undefined ? {} : { details })\n }\n },\n null,\n 2\n );\n}\n","export interface Kr36Request {\n headers: Record<string, string>;\n url: string;\n}\n\nexport interface Kr36JsonRequest {\n body: unknown;\n headers: Record<string, string>;\n url: string;\n}\n\nexport interface Kr36ArticleAuthor {\n face?: string;\n id?: number;\n name: string;\n route?: string;\n summary?: string;\n title?: string;\n}\n\nexport interface Kr36ArticleImage {\n index: number;\n size: string | null;\n url: string;\n}\n\nexport interface Kr36ArticleStats {\n authorArticleCount: number;\n collect: number;\n comment: number;\n favoriteCount: number;\n likeCount: number;\n praise: number;\n}\n\nexport interface Kr36ArticleOrganization {\n briefIntro?: string;\n id: number;\n identityName?: string;\n logo?: string;\n name: string;\n}\n\nexport interface Kr36ArticleListItem {\n author?: string;\n content?: string;\n id: number;\n image?: string;\n publishTime?: number;\n route?: string;\n title: string;\n}\n\nexport interface Kr36Article {\n author: Kr36ArticleAuthor;\n companyCertifyNick?: string;\n content: {\n html: string;\n paragraphs: string[];\n };\n coverImage?: string;\n id: string;\n imageSources: Array<{ name: string; url: string }>;\n images: Kr36ArticleImage[];\n latestArticles: Kr36ArticleListItem[];\n newestArticles: Kr36ArticleListItem[];\n nextArticle?: Kr36ArticleListItem;\n organizations: Kr36ArticleOrganization[];\n publishTime: {\n iso: string;\n local: string;\n ms: number;\n };\n relatedArticles: Kr36ArticleListItem[];\n request: Kr36Request;\n sourceType?: string;\n stats: Kr36ArticleStats;\n summary: string;\n title: string;\n url: string;\n}\n\nexport type Kr36InformationChannel = 'AI' | 'technology';\n\nexport interface Kr36InformationItem {\n authorName?: string;\n authorRoute?: string;\n id: number;\n image?: string;\n publishTime?: {\n iso: string;\n local: string;\n ms: number;\n };\n route?: string;\n summary?: string;\n title: string;\n url: string;\n}\n\nexport interface Kr36InformationList {\n channel: Kr36InformationChannel;\n items: Kr36InformationItem[];\n meta: {\n fetchedPages: number;\n hasNextPage: number;\n nextPageCallback: string;\n pageSize: number;\n totalItems: number;\n };\n request: {\n firstPage: Kr36Request;\n nextPageEndpoint: string;\n };\n}\n\nexport class Kr36CommandError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly exitCode: number,\n public readonly details?: unknown\n ) {\n super(message);\n this.name = 'Kr36CommandError';\n }\n}\n","import type { Kr36Runtime } from './runtime.js';\nimport {\n Kr36CommandError,\n type Kr36Article,\n type Kr36ArticleAuthor,\n type Kr36ArticleImage,\n type Kr36ArticleListItem,\n type Kr36ArticleOrganization,\n type Kr36ArticleStats,\n type Kr36InformationChannel,\n type Kr36InformationItem,\n type Kr36InformationList,\n type Kr36JsonRequest,\n type Kr36Request\n} from './types.js';\n\nexport const KR36_BROWSER_HEADERS: Record<string, string> = {\n Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',\n 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',\n 'Cache-Control': 'no-cache',\n Pragma: 'no-cache',\n Referer: 'https://36kr.com/',\n 'Sec-Fetch-Dest': 'document',\n 'Sec-Fetch-Mode': 'navigate',\n 'Sec-Fetch-Site': 'same-origin',\n 'Sec-Fetch-User': '?1',\n 'Upgrade-Insecure-Requests': '1',\n 'User-Agent':\n 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'\n};\n\nconst KR36_INFORMATION_ENDPOINT = 'https://gateway.36kr.com/api/mis/nav/ifm/subNav/flow';\nconst KR36_INFORMATION_PAGE_SIZE = 30;\nconst KR36_SUPPORTED_CHANNELS = new Set<Kr36InformationChannel>(['AI', 'technology']);\n\nconst KR36_JSON_HEADERS: Record<string, string> = {\n Accept: 'application/json, text/plain, */*',\n 'Accept-Language': KR36_BROWSER_HEADERS['Accept-Language']!,\n 'Content-Type': 'application/json;charset=UTF-8',\n Origin: 'https://36kr.com',\n 'User-Agent': KR36_BROWSER_HEADERS['User-Agent']!\n};\n\ninterface Kr36InitialState {\n articleDetail?: {\n articleDetailData?: {\n data?: Kr36RawArticle;\n };\n articleRecommendData?: Kr36RawRecommendData;\n favoriteCount?: number;\n likeCount?: number;\n organArticleData?: {\n data?: {\n organizationList?: Kr36ArticleOrganization[];\n };\n };\n latestArticle?: {\n articleLatestList?: Array<{ id: number; title: string }>;\n };\n };\n information?: {\n informationList?: Kr36RawInformationList;\n };\n}\n\ninterface Kr36RawArticle {\n author?: string;\n authorFace?: string;\n authorId?: number;\n authorRoute?: string;\n companyCertifyNick?: string;\n imgSources?: Array<{ name: string; url: string }>;\n itemId?: number;\n popinImage?: string;\n publishTime?: number;\n sourceType?: string;\n summary?: string;\n widgetContent?: string;\n widgetTitle?: string;\n}\n\ninterface Kr36RawRecommendData {\n authorFace?: string;\n authorName?: string;\n authorSummary?: string;\n authorTitle?: string;\n newestItemList?: Array<{\n itemContent?: string;\n itemId: number;\n itemRoute?: string;\n itemTitle: string;\n publishTime?: number;\n }>;\n nextItem?: {\n authorId?: number;\n itemContent?: string;\n itemId: number;\n itemRoute?: string;\n itemTitle: string;\n publishTime?: number;\n };\n relateArticleList?: Array<{\n author?: string;\n authorName?: string;\n itemId: number;\n route?: string;\n widgetImage?: string;\n widgetTitle: string;\n }>;\n statArticle?: number;\n statCollect?: number;\n statComment?: number;\n statPraise?: number;\n}\n\ninterface Kr36RawInformationList {\n hasNextPage?: number;\n itemList?: Kr36RawInformationItem[];\n pageCallback?: string;\n}\n\ninterface Kr36RawInformationItem {\n itemId: number;\n route?: string;\n templateMaterial?: {\n authorName?: string;\n authorRoute?: string;\n publishTime?: number;\n summary?: string;\n widgetImage?: string;\n widgetTitle?: string;\n };\n}\n\ninterface Kr36InformationFlowResponse {\n code?: number;\n data?: Kr36RawInformationList;\n msg?: string;\n}\n\nexport class Kr36ArticleService {\n constructor(private readonly runtime: Pick<Kr36Runtime, 'fetchArticleHtml' | 'fetchJson'>) {}\n\n async getArticle(articleId: string): Promise<Kr36Article> {\n assertArticleId(articleId);\n const request = buildKr36ArticleRequest(articleId);\n const html = await this.runtime.fetchArticleHtml(request);\n const initialState = parseInitialState(html);\n const articleDetail = initialState.articleDetail;\n const rawArticle = articleDetail?.articleDetailData?.data;\n\n if (!rawArticle) {\n throw new Kr36CommandError(\n 'KR36_PARSE_ERROR',\n '36kr article data was not found in window.initialState.',\n 2\n );\n }\n\n const contentHtml = rawArticle.widgetContent ?? '';\n const recommend = articleDetail?.articleRecommendData ?? {};\n const publishTime = rawArticle.publishTime ?? 0;\n const article: Kr36Article = {\n author: buildAuthor(rawArticle, recommend),\n content: {\n html: contentHtml,\n paragraphs: extractParagraphs(contentHtml)\n },\n id: String(rawArticle.itemId ?? articleId),\n imageSources: rawArticle.imgSources ?? [],\n images: extractImages(contentHtml),\n latestArticles: (articleDetail?.latestArticle?.articleLatestList ?? []).map((item) => ({\n id: item.id,\n title: item.title\n })),\n newestArticles: (recommend.newestItemList ?? []).map((item) => {\n const listItem: Kr36ArticleListItem = {\n id: item.itemId,\n title: item.itemTitle\n };\n\n if (item.itemContent !== undefined) {\n listItem.content = item.itemContent;\n }\n if (item.publishTime !== undefined) {\n listItem.publishTime = item.publishTime;\n }\n if (item.itemRoute !== undefined) {\n listItem.route = item.itemRoute;\n }\n\n return listItem;\n }),\n organizations: articleDetail?.organArticleData?.data?.organizationList ?? [],\n publishTime: {\n iso: publishTime ? new Date(publishTime).toISOString() : '',\n local: publishTime ? formatChinaTime(publishTime) : '',\n ms: publishTime\n },\n relatedArticles: (recommend.relateArticleList ?? []).map((item) => {\n const listItem: Kr36ArticleListItem = {\n id: item.itemId,\n title: item.widgetTitle\n };\n const author = item.author ?? item.authorName;\n\n if (author !== undefined) {\n listItem.author = author;\n }\n if (item.widgetImage !== undefined) {\n listItem.image = item.widgetImage;\n }\n if (item.route !== undefined) {\n listItem.route = item.route;\n }\n\n return listItem;\n }),\n request,\n stats: buildStats(articleDetail?.likeCount, articleDetail?.favoriteCount, recommend),\n summary: rawArticle.summary ?? '',\n title: rawArticle.widgetTitle ?? '',\n url: request.url\n };\n\n if (rawArticle.companyCertifyNick !== undefined) {\n article.companyCertifyNick = rawArticle.companyCertifyNick;\n }\n\n if (rawArticle.popinImage !== undefined) {\n article.coverImage = rawArticle.popinImage;\n }\n\n if (recommend.nextItem) {\n article.nextArticle = {\n id: recommend.nextItem.itemId,\n title: recommend.nextItem.itemTitle\n };\n\n if (recommend.nextItem.itemContent !== undefined) {\n article.nextArticle.content = recommend.nextItem.itemContent;\n }\n if (recommend.nextItem.publishTime !== undefined) {\n article.nextArticle.publishTime = recommend.nextItem.publishTime;\n }\n if (recommend.nextItem.itemRoute !== undefined) {\n article.nextArticle.route = recommend.nextItem.itemRoute;\n }\n }\n\n if (rawArticle.sourceType !== undefined) {\n article.sourceType = rawArticle.sourceType;\n }\n\n return article;\n }\n\n async getInformationList(options: {\n channel: string;\n pages?: number;\n }): Promise<Kr36InformationList> {\n const channel = parseInformationChannel(options.channel);\n const pageLimit = normalizePages(options.pages);\n const firstPageRequest = buildKr36InformationFirstPageRequest(channel);\n const firstPageHtml = await this.runtime.fetchArticleHtml(firstPageRequest);\n const firstPageState = parseInitialState(firstPageHtml);\n const firstPageList = firstPageState.information?.informationList;\n\n if (!firstPageList) {\n throw new Kr36CommandError(\n 'KR36_PARSE_ERROR',\n '36kr information list data was not found in window.initialState.',\n 2\n );\n }\n\n const items = [...mapInformationItems(firstPageList.itemList ?? [])];\n let pageCallback = firstPageList.pageCallback ?? '';\n let hasNextPage = firstPageList.hasNextPage ?? 0;\n let fetchedPages = 1;\n\n while (fetchedPages < pageLimit && hasNextPage && pageCallback) {\n const request = buildKr36InformationNextPageRequest(channel, pageCallback);\n const response = parseInformationFlowResponse(await this.runtime.fetchJson(request));\n const nextList = response.data ?? {};\n\n items.push(...mapInformationItems(nextList.itemList ?? []));\n pageCallback = nextList.pageCallback ?? '';\n hasNextPage = nextList.hasNextPage ?? 0;\n fetchedPages += 1;\n }\n\n return {\n channel,\n items,\n meta: {\n fetchedPages,\n hasNextPage,\n nextPageCallback: pageCallback,\n pageSize: KR36_INFORMATION_PAGE_SIZE,\n totalItems: items.length\n },\n request: {\n firstPage: firstPageRequest,\n nextPageEndpoint: KR36_INFORMATION_ENDPOINT\n }\n };\n }\n}\n\nexport function buildKr36ArticleUrl(articleId: string): string {\n assertArticleId(articleId);\n return `https://36kr.com/p/${articleId}?f=rss`;\n}\n\nexport function buildKr36ArticleRequest(articleId: string): Kr36Request {\n return {\n headers: KR36_BROWSER_HEADERS,\n url: buildKr36ArticleUrl(articleId)\n };\n}\n\nexport function buildKr36InformationFirstPageRequest(channel: Kr36InformationChannel): Kr36Request {\n return {\n headers: KR36_BROWSER_HEADERS,\n url: `https://36kr.com/information/${channel}/`\n };\n}\n\nexport function buildKr36InformationNextPageRequest(\n channel: Kr36InformationChannel,\n pageCallback: string,\n timestamp = Date.now()\n): Kr36JsonRequest {\n return {\n body: {\n partner_id: 'web',\n timestamp,\n param: {\n subnavType: 1,\n subnavNick: channel,\n pageSize: KR36_INFORMATION_PAGE_SIZE,\n pageEvent: 1,\n pageCallback,\n siteId: 1,\n platformId: 2\n }\n },\n headers: {\n ...KR36_JSON_HEADERS,\n Referer: `https://36kr.com/information/${channel}/`\n },\n url: KR36_INFORMATION_ENDPOINT\n };\n}\n\nfunction assertArticleId(articleId: string): void {\n if (!/^\\d+$/.test(articleId)) {\n throw new Kr36CommandError(\n 'KR36_INVALID_ARTICLE_ID',\n '36kr article id must contain digits only.',\n 2,\n {\n articleId\n }\n );\n }\n}\n\nfunction parseInformationChannel(channel: string): Kr36InformationChannel {\n if (KR36_SUPPORTED_CHANNELS.has(channel as Kr36InformationChannel)) {\n return channel as Kr36InformationChannel;\n }\n\n throw new Kr36CommandError(\n 'KR36_INVALID_CHANNEL',\n '36kr list only supports AI and technology channels.',\n 2,\n {\n channel,\n supportedChannels: [...KR36_SUPPORTED_CHANNELS]\n }\n );\n}\n\nfunction normalizePages(pages: number | undefined): number {\n const value = pages ?? 1;\n\n if (!Number.isInteger(value) || value < 1 || value > 20) {\n throw new Kr36CommandError(\n 'KR36_INVALID_PAGES',\n '36kr list pages must be an integer between 1 and 20.',\n 2,\n {\n pages: value\n }\n );\n }\n\n return value;\n}\n\nfunction parseInitialState(html: string): Kr36InitialState {\n const match = /window\\.initialState=(\\{[\\s\\S]*?\\})\\s*;?\\s*<\\/script>/.exec(html);\n\n if (!match?.[1]) {\n throw new Kr36CommandError(\n 'KR36_PARSE_ERROR',\n 'window.initialState was not found in the 36kr article page.',\n 2\n );\n }\n\n try {\n return JSON.parse(match[1]) as Kr36InitialState;\n } catch (error) {\n throw new Kr36CommandError(\n 'KR36_PARSE_ERROR',\n 'Failed to parse window.initialState from the 36kr article page.',\n 2,\n {\n cause: error instanceof Error ? error.message : String(error)\n }\n );\n }\n}\n\nfunction extractImages(html: string): Kr36ArticleImage[] {\n return [...html.matchAll(/<img\\b[^>]*>/gi)].map((match, index) => {\n const tag = match[0];\n return {\n index: index + 1,\n size: getAttribute(tag, 'data-img-size-val'),\n url: getAttribute(tag, 'src') ?? ''\n };\n }).filter((image) => image.url);\n}\n\nfunction parseInformationFlowResponse(jsonText: string): Kr36InformationFlowResponse {\n try {\n const response = JSON.parse(jsonText) as Kr36InformationFlowResponse;\n\n if (response.code !== 0) {\n throw new Kr36CommandError(\n 'KR36_REQUEST_FAILED',\n response.msg || '36kr information flow request failed.',\n 1,\n {\n code: response.code\n }\n );\n }\n\n return response;\n } catch (error) {\n if (error instanceof Kr36CommandError) {\n throw error;\n }\n\n throw new Kr36CommandError(\n 'KR36_PARSE_ERROR',\n 'Failed to parse 36kr information flow response.',\n 2,\n {\n cause: error instanceof Error ? error.message : String(error)\n }\n );\n }\n}\n\nfunction mapInformationItems(items: Kr36RawInformationItem[]): Kr36InformationItem[] {\n return items.map((item) => {\n const material = item.templateMaterial ?? {};\n const mapped: Kr36InformationItem = {\n id: item.itemId,\n title: material.widgetTitle ?? '',\n url: `https://36kr.com/p/${item.itemId}`\n };\n\n if (material.authorName !== undefined) {\n mapped.authorName = material.authorName;\n }\n if (material.authorRoute !== undefined) {\n mapped.authorRoute = material.authorRoute;\n }\n if (material.widgetImage !== undefined) {\n mapped.image = material.widgetImage;\n }\n if (material.publishTime !== undefined) {\n mapped.publishTime = {\n iso: new Date(material.publishTime).toISOString(),\n local: formatChinaTime(material.publishTime),\n ms: material.publishTime\n };\n }\n if (item.route !== undefined) {\n mapped.route = item.route;\n }\n if (material.summary !== undefined) {\n mapped.summary = material.summary;\n }\n\n return mapped;\n });\n}\n\nfunction extractParagraphs(html: string): string[] {\n return html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n .replace(/<[^>]+>/g, '\\n')\n .split(/\\n+/)\n .map((value) => decodeHtmlEntities(value).trim())\n .filter(Boolean);\n}\n\nfunction getAttribute(tag: string, name: string): string | null {\n const match = new RegExp(`${name}=[\"']([^\"']+)[\"']`, 'i').exec(tag);\n return match?.[1] ?? null;\n}\n\nfunction decodeHtmlEntities(value: string): string {\n return value\n .replace(/&nbsp;/g, ' ')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&amp;/g, '&');\n}\n\nfunction buildStats(\n likeCount: number | undefined,\n favoriteCount: number | undefined,\n recommend: Kr36RawRecommendData\n): Kr36ArticleStats {\n return {\n authorArticleCount: recommend.statArticle ?? 0,\n collect: recommend.statCollect ?? 0,\n comment: recommend.statComment ?? 0,\n favoriteCount: favoriteCount ?? 0,\n likeCount: likeCount ?? 0,\n praise: recommend.statPraise ?? 0\n };\n}\n\nfunction buildAuthor(\n rawArticle: Kr36RawArticle,\n recommend: Kr36RawRecommendData\n): Kr36ArticleAuthor {\n const author: Kr36ArticleAuthor = {\n name: rawArticle.author ?? recommend.authorName ?? ''\n };\n const face = rawArticle.authorFace ?? recommend.authorFace;\n\n if (face !== undefined) {\n author.face = face;\n }\n if (rawArticle.authorId !== undefined) {\n author.id = rawArticle.authorId;\n }\n if (rawArticle.authorRoute !== undefined) {\n author.route = rawArticle.authorRoute;\n }\n if (recommend.authorSummary !== undefined) {\n author.summary = recommend.authorSummary;\n }\n if (recommend.authorTitle !== undefined) {\n author.title = recommend.authorTitle;\n }\n\n return author;\n}\n\nfunction formatChinaTime(timestampMs: number): string {\n const formatter = new Intl.DateTimeFormat('sv-SE', {\n day: '2-digit',\n hour: '2-digit',\n hour12: false,\n minute: '2-digit',\n month: '2-digit',\n second: '2-digit',\n timeZone: 'Asia/Shanghai',\n year: 'numeric'\n });\n\n return formatter.format(new Date(timestampMs));\n}\n","import type { Command } from 'commander';\nimport { z } from 'zod';\n\nimport {\n renderToutiaoArticleAsJson,\n renderToutiaoAuthorAsJson,\n renderToutiaoAuthorAsTable,\n renderToutiaoCommandErrorAsJson,\n renderToutiaoListAsJson,\n renderToutiaoListAsTable\n} from './output.js';\nimport type { ToutiaoRuntime } from './runtime.js';\nimport { ToutiaoService } from './service.js';\nimport { ToutiaoCommandError } from './types.js';\n\nexport interface ToutiaoCommandDependencies {\n runtime: ToutiaoRuntime;\n stderr: (value: string) => void;\n stdout: (value: string) => void;\n}\n\nconst listOptionsSchema = z.object({\n format: z.enum(['json', 'table']).default('json'),\n pages: z.number().int().min(1).max(5).default(1),\n table: z.boolean().optional()\n});\n\nconst articleOptionsSchema = z.object({\n format: z.enum(['json']).default('json')\n});\n\nconst authorOptionsSchema = z.object({\n format: z.enum(['json', 'table']).default('json'),\n pages: z.number().int().min(1).max(5).default(1),\n table: z.boolean().optional(),\n withContent: z.boolean().default(false)\n});\n\nexport function registerToutiaoCommands(\n program: Command,\n dependencies: ToutiaoCommandDependencies\n): void {\n const toutiao = program.command('toutiao').description('Fetch Toutiao channel and search content.');\n const service = new ToutiaoService({ runtime: dependencies.runtime });\n\n toutiao.command('article')\n .argument('<article>', 'Toutiao article id or URL')\n .option('--format <format>', 'output format', 'json')\n .action(async (article, options) => {\n articleOptionsSchema.parse(options);\n const result = await service.article(article);\n dependencies.stdout(`${renderToutiaoArticleAsJson(result)}\\n`);\n });\n\n toutiao.command('list')\n .argument('<source>', 'Toutiao source: tech, AI, 光刻机, 芯片, or 半导体')\n .option('--pages <pages>', 'number of pages to fetch', parsePages, 1)\n .option('--format <format>', 'output format', 'json')\n .option('-t, --table', 'render as a table')\n .action(async (source, options) => {\n const parsed = listOptionsSchema.parse(applyTableShortcut(options));\n const result = await service.list({\n pages: parsed.pages,\n source\n });\n dependencies.stdout(\n parsed.format === 'table'\n ? `${renderToutiaoListAsTable(result)}\\n`\n : `${renderToutiaoListAsJson(result)}\\n`\n );\n });\n\n toutiao.command('author')\n .argument('<author>', 'Toutiao author token or /c/user/token/<token>/ homepage URL')\n .option('--pages <pages>', 'number of pages to fetch', parsePages, 1)\n .option('--with-content', 'also fetch detail content for each author article')\n .option('--format <format>', 'output format', 'json')\n .option('-t, --table', 'render as a table')\n .action(async (author, options) => {\n const parsed = authorOptionsSchema.parse(applyTableShortcut(options));\n const result = await service.author(author, {\n pages: parsed.pages,\n withContent: parsed.withContent\n });\n dependencies.stdout(\n parsed.format === 'table'\n ? `${renderToutiaoAuthorAsTable(result)}\\n`\n : `${renderToutiaoAuthorAsJson(result)}\\n`\n );\n });\n}\n\nexport function handleToutiaoCommandError(\n error: unknown,\n dependencies: Pick<ToutiaoCommandDependencies, 'stderr'>\n): number | undefined {\n if (error instanceof ToutiaoCommandError) {\n dependencies.stderr(\n `${renderToutiaoCommandErrorAsJson(error.code, error.message, error.details)}\\n`\n );\n return error.exitCode;\n }\n\n return undefined;\n}\n\nfunction parsePages(value: string): number {\n const parsed = Number(value);\n\n if (!Number.isInteger(parsed)) {\n throw new ToutiaoCommandError(\n 'TOUTIAO_INVALID_PAGES',\n 'Toutiao list pages must be an integer between 1 and 5.',\n 2,\n {\n pages: value\n }\n );\n }\n\n return parsed;\n}\n\nfunction applyTableShortcut<T extends { format?: string; table?: boolean }>(options: T): T & {\n format: 'json' | 'table';\n} {\n if (options.table) {\n return {\n ...options,\n format: 'table'\n };\n }\n\n return {\n ...options,\n format: (options.format ?? 'json') as 'json' | 'table'\n };\n}\n","import { table } from 'table';\n\nimport type { ToutiaoArticle, ToutiaoAuthorResult, ToutiaoListResult } from './types.js';\n\nexport function renderToutiaoListAsJson(result: ToutiaoListResult): string {\n return JSON.stringify(\n {\n ok: true,\n data: result\n },\n null,\n 2\n );\n}\n\nexport function renderToutiaoListAsTable(result: ToutiaoListResult): string {\n return table([\n ['id', 'title', 'author', 'publishTime', 'comments', 'url'],\n ...result.items.map((item) => [\n item.id,\n item.title,\n item.authorName ?? '',\n item.publishTime?.local ?? '',\n item.commentCount === undefined ? '' : String(item.commentCount),\n item.url\n ])\n ]);\n}\n\nexport function renderToutiaoArticleAsJson(article: ToutiaoArticle): string {\n return JSON.stringify(\n {\n ok: true,\n data: article\n },\n null,\n 2\n );\n}\n\nexport function renderToutiaoAuthorAsJson(result: ToutiaoAuthorResult): string {\n return JSON.stringify(\n {\n ok: true,\n data: result\n },\n null,\n 2\n );\n}\n\nexport function renderToutiaoAuthorAsTable(result: ToutiaoAuthorResult): string {\n return table([\n ['id', 'title', 'author', 'publishTime', 'comments', 'url'],\n ...result.items.map((item) => [\n item.id,\n item.title,\n item.authorName ?? '',\n item.publishTime?.local ?? '',\n item.commentCount === undefined ? '' : String(item.commentCount),\n item.url\n ])\n ]);\n}\n\nexport function renderToutiaoCommandErrorAsJson(\n code: string,\n message: string,\n details?: unknown\n): string {\n return JSON.stringify(\n {\n ok: false,\n error: {\n code,\n message,\n ...(details === undefined ? {} : { details })\n }\n },\n null,\n 2\n );\n}\n","export type ToutiaoSource = 'tech' | 'AI' | '光刻机' | '芯片' | '半导体';\n\nexport interface ToutiaoItem {\n abstract?: string;\n authorName?: string;\n commentCount?: number;\n id: string;\n image?: string;\n publishTime?: {\n iso: string;\n local: string;\n seconds: number;\n };\n sourceUrl?: string;\n title: string;\n url: string;\n}\n\nexport interface ToutiaoListResult {\n hasMore: boolean;\n items: ToutiaoItem[];\n keyword?: string;\n meta: {\n fetchedPages: number;\n totalItems: number;\n };\n next?: {\n maxBehotTime?: number;\n offset?: number;\n };\n source: ToutiaoSource;\n}\n\nexport interface ToutiaoAuthorRuntimeResult {\n authorToken: string;\n hasMore: boolean;\n items: ToutiaoItem[];\n next?: {\n maxBehotTime?: number;\n offset?: number;\n };\n}\n\nexport interface ToutiaoAuthorResult extends ToutiaoAuthorRuntimeResult {\n articles?: ToutiaoArticle[];\n meta: {\n fetchedPages: number;\n totalArticles?: number;\n totalItems: number;\n withContent: boolean;\n };\n request: {\n input: string;\n url: string;\n };\n}\n\nexport interface ToutiaoArticle {\n authorName?: string;\n content: {\n paragraphs: string[];\n text: string;\n };\n id: string;\n publishTimeText?: string;\n request: {\n input: string;\n url: string;\n };\n title: string;\n url: string;\n}\n\nexport interface ToutiaoRuntimeListResult {\n hasMore: boolean;\n items: ToutiaoItem[];\n keyword?: string;\n next?: {\n maxBehotTime?: number;\n offset?: number;\n };\n source: ToutiaoSource;\n}\n\nexport class ToutiaoCommandError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly exitCode: number,\n public readonly details?: unknown\n ) {\n super(message);\n this.name = 'ToutiaoCommandError';\n }\n}\n","import type { ToutiaoRuntime } from './runtime.js';\nimport {\n ToutiaoCommandError,\n type ToutiaoArticle,\n type ToutiaoAuthorResult,\n type ToutiaoListResult,\n type ToutiaoSource\n} from './types.js';\n\nconst SUPPORTED_SOURCES = new Set<ToutiaoSource>(['tech', 'AI', '光刻机', '芯片', '半导体']);\n\nexport class ToutiaoService {\n constructor(private readonly dependencies: { runtime: ToutiaoRuntime }) {}\n\n async article(input: string): Promise<ToutiaoArticle> {\n const url = buildToutiaoArticleUrl(input);\n\n return this.dependencies.runtime.fetchArticle({\n input,\n url\n });\n }\n\n async author(input: string, options: {\n pages?: number;\n withContent?: boolean;\n } = {}): Promise<ToutiaoAuthorResult> {\n const authorToken = buildToutiaoAuthorToken(input);\n const pages = normalizePages(options.pages);\n const url = buildToutiaoAuthorUrl(authorToken);\n const runtimeResult = await this.dependencies.runtime.fetchAuthorArticles({\n authorToken,\n pages,\n url\n });\n const withContent = options.withContent ?? false;\n const result: ToutiaoAuthorResult = {\n ...runtimeResult,\n meta: {\n fetchedPages: pages,\n totalItems: runtimeResult.items.length,\n withContent\n },\n request: {\n input,\n url\n }\n };\n\n if (withContent) {\n const articles: ToutiaoArticle[] = [];\n\n for (const item of runtimeResult.items) {\n articles.push(await this.dependencies.runtime.fetchArticle({\n input: item.id,\n url: buildToutiaoArticleUrl(item.url || item.id)\n }));\n }\n\n result.articles = articles;\n result.meta.totalArticles = articles.length;\n }\n\n return result;\n }\n\n async list(options: {\n pages?: number;\n source: string;\n }): Promise<ToutiaoListResult> {\n const source = parseSource(options.source);\n const pages = normalizePages(options.pages);\n const runtimeResult = source === 'tech'\n ? await this.dependencies.runtime.fetchTechnologyChannel({ pages })\n : await this.dependencies.runtime.fetchKeywordInformation({\n keyword: source,\n pages,\n source\n });\n\n return {\n ...runtimeResult,\n meta: {\n fetchedPages: pages,\n totalItems: runtimeResult.items.length\n }\n };\n }\n}\n\nexport function buildToutiaoAuthorToken(input: string): string {\n const trimmed = input.trim();\n\n if (/^[A-Za-z0-9._-]+$/.test(trimmed) && trimmed.length >= 12) {\n return trimmed;\n }\n\n try {\n const url = new URL(trimmed);\n const token = /\\/c\\/user\\/token\\/([^/?#]+)/.exec(url.pathname)?.[1];\n\n if (token && isToutiaoHost(url.hostname)) {\n return decodeURIComponent(token);\n }\n } catch {\n // Fall through to the explicit command error below.\n }\n\n throw new ToutiaoCommandError(\n 'TOUTIAO_INVALID_AUTHOR',\n 'Toutiao author must be a user token or a /c/user/token/<token>/ homepage URL.',\n 2,\n {\n input\n }\n );\n}\n\nexport function buildToutiaoAuthorUrl(authorToken: string): string {\n return `https://www.toutiao.com/c/user/token/${encodeURIComponent(authorToken)}/`;\n}\n\nexport function buildToutiaoArticleUrl(input: string): string {\n const trimmed = input.trim();\n\n if (/^\\d+$/.test(trimmed)) {\n return `https://www.toutiao.com/article/${trimmed}/`;\n }\n\n try {\n const url = new URL(trimmed);\n const id = /(?:article|group)\\/(\\d+)/.exec(url.pathname)?.[1]\n ?? /^\\/a(\\d+)/.exec(url.pathname)?.[1];\n\n if (id && isToutiaoHost(url.hostname)) {\n return `https://www.toutiao.com/article/${id}/`;\n }\n\n const nextUrl = url.searchParams.get('url');\n\n if (nextUrl) {\n return buildToutiaoArticleUrl(nextUrl);\n }\n } catch {\n // Fall through to the explicit command error below.\n }\n\n throw new ToutiaoCommandError(\n 'TOUTIAO_INVALID_ARTICLE',\n 'Toutiao article must be a numeric id or a toutiao article/group URL.',\n 2,\n {\n input\n }\n );\n}\n\nfunction isToutiaoHost(hostname: string): boolean {\n return hostname === 'www.toutiao.com' || hostname === 'toutiao.com';\n}\n\nfunction parseSource(source: string): ToutiaoSource {\n if (SUPPORTED_SOURCES.has(source as ToutiaoSource)) {\n return source as ToutiaoSource;\n }\n\n throw new ToutiaoCommandError(\n 'TOUTIAO_INVALID_SOURCE',\n 'Toutiao list only supports tech, AI, 光刻机, 芯片, and 半导体.',\n 2,\n {\n source,\n supportedSources: [...SUPPORTED_SOURCES]\n }\n );\n}\n\nfunction normalizePages(pages: number | undefined): number {\n const value = pages ?? 1;\n\n if (!Number.isInteger(value) || value < 1 || value > 5) {\n throw new ToutiaoCommandError(\n 'TOUTIAO_INVALID_PAGES',\n 'Toutiao list pages must be an integer between 1 and 5.',\n 2,\n {\n pages: value\n }\n );\n }\n\n return value;\n}\n","import type { Command } from 'commander';\nimport { z } from 'zod';\n\nimport {\n renderHackerNewsCommandErrorAsJson,\n renderHackerNewsSearchAsJson,\n renderHackerNewsSearchAsTable,\n renderHackerNewsStoriesAsJson,\n renderHackerNewsStoriesAsTable\n} from './output.js';\nimport type { HackerNewsRuntime } from './runtime.js';\nimport { HackerNewsService } from './service.js';\nimport { HackerNewsCommandError, type HackerNewsStorySource } from './types.js';\n\nexport interface HackerNewsCommandDependencies {\n runtime: HackerNewsRuntime;\n stderr: (value: string) => void;\n stdout: (value: string) => void;\n}\n\nconst storiesOptionsSchema = z.object({\n format: z.enum(['json', 'table']).default('json'),\n limit: z.number().int().default(30),\n table: z.boolean().optional()\n});\n\nconst searchOptionsSchema = z.object({\n format: z.enum(['json', 'table']).default('json'),\n limit: z.number().int().default(30),\n sort: z.enum(['relevance', 'date']).default('relevance'),\n table: z.boolean().optional()\n});\n\nexport function registerHackerNewsCommands(\n program: Command,\n dependencies: HackerNewsCommandDependencies\n): void {\n const hn = program.command('hn').description('Fetch Hacker News stories and search results.');\n const service = new HackerNewsService({ runtime: dependencies.runtime });\n\n for (const source of ['top', 'new', 'best'] as const) {\n hn.command(source)\n .option('--limit <limit>', 'number of stories to fetch', parseLimit, 30)\n .option('--format <format>', 'output format', 'json')\n .option('-t, --table', 'render as a table')\n .action(async (options) => {\n const parsed = storiesOptionsSchema.parse(applyTableShortcut(options));\n const result = await service.stories({\n limit: parsed.limit,\n source\n });\n dependencies.stdout(\n parsed.format === 'table'\n ? `${renderHackerNewsStoriesAsTable(result)}\\n`\n : `${renderHackerNewsStoriesAsJson(result)}\\n`\n );\n });\n }\n\n hn.command('search')\n .argument('<query>', 'search query')\n .option('--limit <limit>', 'number of search results to fetch', parseLimit, 30)\n .option('--sort <sort>', 'search sort: relevance or date', 'relevance')\n .option('--format <format>', 'output format', 'json')\n .option('-t, --table', 'render as a table')\n .action(async (query, options) => {\n const parsed = searchOptionsSchema.parse(applyTableShortcut(options));\n const result = await service.search({\n limit: parsed.limit,\n query,\n sort: parsed.sort\n });\n dependencies.stdout(\n parsed.format === 'table'\n ? `${renderHackerNewsSearchAsTable(result)}\\n`\n : `${renderHackerNewsSearchAsJson(result)}\\n`\n );\n });\n}\n\nexport function handleHackerNewsCommandError(\n error: unknown,\n dependencies: Pick<HackerNewsCommandDependencies, 'stderr'>\n): number | undefined {\n if (error instanceof HackerNewsCommandError) {\n dependencies.stderr(\n `${renderHackerNewsCommandErrorAsJson(error.code, error.message, error.details)}\\n`\n );\n return error.exitCode;\n }\n\n return undefined;\n}\n\nfunction parseLimit(value: string): number {\n const parsed = Number(value);\n\n if (!Number.isInteger(parsed)) {\n throw new HackerNewsCommandError(\n 'HN_INVALID_LIMIT',\n 'Hacker News limit must be an integer between 1 and 100.',\n 2,\n {\n limit: value\n }\n );\n }\n\n return parsed;\n}\n\nfunction applyTableShortcut<T extends { format?: string; table?: boolean }>(options: T): T & {\n format: 'json' | 'table';\n} {\n if (options.table) {\n return {\n ...options,\n format: 'table'\n };\n }\n\n return {\n ...options,\n format: (options.format ?? 'json') as 'json' | 'table'\n };\n}\n","import { table } from 'table';\n\nimport type { HackerNewsSearchResult, HackerNewsStoriesResult } from './types.js';\n\nexport function renderHackerNewsStoriesAsJson(result: HackerNewsStoriesResult): string {\n return JSON.stringify(\n {\n ok: true,\n data: result\n },\n null,\n 2\n );\n}\n\nexport function renderHackerNewsStoriesAsTable(result: HackerNewsStoriesResult): string {\n return table([\n ['id', 'title', 'author', 'score', 'comments', 'time', 'url'],\n ...result.items.map((item) => [\n String(item.id),\n item.title,\n item.author ?? '',\n item.score === undefined ? '' : String(item.score),\n item.commentCount === undefined ? '' : String(item.commentCount),\n item.time?.iso ?? '',\n item.url\n ])\n ]);\n}\n\nexport function renderHackerNewsSearchAsJson(result: HackerNewsSearchResult): string {\n return JSON.stringify(\n {\n ok: true,\n data: result\n },\n null,\n 2\n );\n}\n\nexport function renderHackerNewsSearchAsTable(result: HackerNewsSearchResult): string {\n return table([\n ['id', 'title', 'author', 'score', 'comments', 'time', 'url'],\n ...result.items.map((item) => [\n String(item.id),\n item.title,\n item.author ?? '',\n item.score === undefined ? '' : String(item.score),\n item.commentCount === undefined ? '' : String(item.commentCount),\n item.time?.iso ?? '',\n item.url\n ])\n ]);\n}\n\nexport function renderHackerNewsCommandErrorAsJson(\n code: string,\n message: string,\n details?: unknown\n): string {\n return JSON.stringify(\n {\n ok: false,\n error: {\n code,\n message,\n ...(details === undefined ? {} : { details })\n }\n },\n null,\n 2\n );\n}\n","export type HackerNewsStorySource = 'top' | 'new' | 'best';\nexport type HackerNewsSearchSort = 'relevance' | 'date';\n\nexport interface HackerNewsItem {\n author?: string;\n commentCount?: number;\n id: number;\n score?: number;\n text?: string;\n time?: {\n iso: string;\n seconds: number;\n };\n title: string;\n type: 'story';\n url: string;\n}\n\nexport interface HackerNewsStoriesRuntimeResult {\n items: HackerNewsItem[];\n source: HackerNewsStorySource;\n}\n\nexport interface HackerNewsStoriesResult extends HackerNewsStoriesRuntimeResult {\n meta: {\n limit: number;\n totalItems: number;\n };\n}\n\nexport interface HackerNewsSearchRuntimeResult {\n items: HackerNewsItem[];\n query: string;\n}\n\nexport interface HackerNewsSearchResult extends HackerNewsSearchRuntimeResult {\n meta: {\n limit: number;\n sort: HackerNewsSearchSort;\n totalItems: number;\n };\n}\n\nexport class HackerNewsCommandError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly exitCode: number,\n public readonly details?: unknown\n ) {\n super(message);\n this.name = 'HackerNewsCommandError';\n }\n}\n","import type { HackerNewsRuntime } from './runtime.js';\nimport {\n HackerNewsCommandError,\n type HackerNewsSearchResult,\n type HackerNewsSearchSort,\n type HackerNewsStoriesResult,\n type HackerNewsStorySource\n} from './types.js';\n\nconst SUPPORTED_SOURCES = new Set<HackerNewsStorySource>(['top', 'new', 'best']);\n\nexport class HackerNewsService {\n constructor(private readonly dependencies: { runtime: HackerNewsRuntime }) {}\n\n async stories(options: {\n limit?: number;\n source: string;\n }): Promise<HackerNewsStoriesResult> {\n const source = parseSource(options.source);\n const limit = normalizeLimit(options.limit);\n const runtimeResult = await this.dependencies.runtime.fetchStories({\n limit,\n source\n });\n\n return {\n ...runtimeResult,\n meta: {\n limit,\n totalItems: runtimeResult.items.length\n }\n };\n }\n\n async search(options: {\n limit?: number;\n query: string;\n sort?: HackerNewsSearchSort;\n }): Promise<HackerNewsSearchResult> {\n const query = normalizeQuery(options.query);\n const limit = normalizeLimit(options.limit);\n const sort = options.sort ?? 'relevance';\n const runtimeResult = await this.dependencies.runtime.fetchSearch({\n limit,\n query,\n sort\n });\n\n return {\n ...runtimeResult,\n meta: {\n limit,\n sort,\n totalItems: runtimeResult.items.length\n }\n };\n }\n}\n\nfunction parseSource(source: string): HackerNewsStorySource {\n if (SUPPORTED_SOURCES.has(source as HackerNewsStorySource)) {\n return source as HackerNewsStorySource;\n }\n\n throw new HackerNewsCommandError(\n 'HN_INVALID_SOURCE',\n 'Hacker News list only supports top, new, and best.',\n 2,\n {\n source,\n supportedSources: [...SUPPORTED_SOURCES]\n }\n );\n}\n\nfunction normalizeLimit(limit: number | undefined): number {\n const value = limit ?? 30;\n\n if (!Number.isInteger(value) || value < 1 || value > 100) {\n throw new HackerNewsCommandError(\n 'HN_INVALID_LIMIT',\n 'Hacker News limit must be an integer between 1 and 100.',\n 2,\n {\n limit: value\n }\n );\n }\n\n return value;\n}\n\nfunction normalizeQuery(query: string): string {\n const value = query.trim();\n\n if (value.length === 0) {\n throw new HackerNewsCommandError(\n 'HN_INVALID_QUERY',\n 'Hacker News search query must not be empty.',\n 2\n );\n }\n\n return value;\n}\n","import Database from 'better-sqlite3';\n\nexport type AkDatabase = Database.Database;\n\nexport function createAkDatabase(filename = ':memory:'): AkDatabase {\n const database = new Database(filename);\n\n database.exec(`\n CREATE TABLE IF NOT EXISTS ak_records (\n id TEXT PRIMARY KEY,\n env TEXT NOT NULL,\n user_id TEXT,\n user_name TEXT,\n email TEXT,\n phone TEXT,\n key_ciphertext TEXT NOT NULL,\n key_search_prefix TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_ak_env ON ak_records(env);\n CREATE INDEX IF NOT EXISTS idx_ak_user_id ON ak_records(user_id);\n CREATE INDEX IF NOT EXISTS idx_ak_user_name ON ak_records(user_name);\n CREATE INDEX IF NOT EXISTS idx_ak_email ON ak_records(email);\n CREATE INDEX IF NOT EXISTS idx_ak_phone ON ak_records(phone);\n CREATE INDEX IF NOT EXISTS idx_ak_key_search_prefix ON ak_records(key_search_prefix);\n CREATE INDEX IF NOT EXISTS idx_ak_updated_at ON ak_records(updated_at);\n `);\n\n return database;\n}\n","import Database from 'better-sqlite3';\n\nimport type { AkDatabase } from './database.js';\nimport type { AkEnv, AkQueryField, AkRecord } from './types.js';\n\ninterface AkRecordRow {\n created_at: string;\n email: string | null;\n env: AkEnv;\n id: string;\n key_ciphertext: string;\n key_search_prefix: string;\n phone: string | null;\n updated_at: string;\n user_id: string | null;\n user_name: string | null;\n}\n\nexport interface AkListFilters {\n env?: AkEnv;\n fields?: AkQueryField[];\n limit: number;\n query?: string;\n}\n\nexport interface AkUpdateMetadataInput {\n email?: string | null;\n id: string;\n phone?: string | null;\n updatedAt: string;\n userId?: string | null;\n userName?: string | null;\n}\n\nexport class AkDuplicateRecordError extends Error {\n constructor(id: string) {\n super(`API key record already exists: ${id}.`);\n this.name = 'AkDuplicateRecordError';\n }\n}\n\nexport class AkRepository {\n readonly #database: AkDatabase;\n\n constructor(database: AkDatabase) {\n this.#database = database;\n }\n\n insert(record: AkRecord): void {\n try {\n this.#database\n .prepare(\n `INSERT INTO ak_records (\n id,\n env,\n user_id,\n user_name,\n email,\n phone,\n key_ciphertext,\n key_search_prefix,\n created_at,\n updated_at\n ) VALUES (\n @id,\n @env,\n @userId,\n @userName,\n @email,\n @phone,\n @keyCiphertext,\n @keySearchPrefix,\n @createdAt,\n @updatedAt\n )`\n )\n .run(record);\n } catch (error) {\n if (error instanceof Database.SqliteError && error.code === 'SQLITE_CONSTRAINT_PRIMARYKEY') {\n throw new AkDuplicateRecordError(record.id);\n }\n\n throw error;\n }\n }\n\n getById(id: string): AkRecord | null {\n const row = this.#database\n .prepare('SELECT * FROM ak_records WHERE id = ?')\n .get(id) as AkRecordRow | undefined;\n\n return row ? mapRowToRecord(row) : null;\n }\n\n getByEnvAndId(env: AkEnv, id: string): AkRecord | null {\n const row = this.#database\n .prepare('SELECT * FROM ak_records WHERE env = ? AND id = ?')\n .get(env, id) as AkRecordRow | undefined;\n\n return row ? mapRowToRecord(row) : null;\n }\n\n list(filters: AkListFilters): AkRecord[] {\n const conditions: string[] = [];\n const params: Array<string | number> = [];\n\n if (filters.env) {\n conditions.push('env = ?');\n params.push(filters.env);\n }\n\n if (filters.query && filters.fields && filters.fields.length > 0) {\n const normalizedQuery = filters.query.toLowerCase();\n const fieldConditions = filters.fields.map((field) => {\n if (field === 'key') {\n params.push(`${filters.query}%`);\n return 'key_search_prefix LIKE ?';\n }\n\n const column = fieldToColumn(field);\n params.push(`%${normalizedQuery}%`);\n return `LOWER(COALESCE(${column}, '')) LIKE ?`;\n });\n\n conditions.push(`(${fieldConditions.join(' OR ')})`);\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n params.push(filters.limit);\n\n const rows = this.#database\n .prepare(\n `SELECT * FROM ak_records\n ${whereClause}\n ORDER BY updated_at DESC\n LIMIT ?`\n )\n .all(...params) as AkRecordRow[];\n\n return rows.map(mapRowToRecord);\n }\n\n updateMetadata(input: AkUpdateMetadataInput): AkRecord | null {\n const current = this.getById(input.id);\n\n if (!current) {\n return null;\n }\n\n const row = this.#database\n .prepare(\n `UPDATE ak_records\n SET user_id = @userId,\n user_name = @userName,\n email = @email,\n phone = @phone,\n updated_at = @updatedAt\n WHERE id = @id\n RETURNING *`\n )\n .get({\n email: input.email === undefined ? current.email : input.email,\n id: input.id,\n phone: input.phone === undefined ? current.phone : input.phone,\n updatedAt: input.updatedAt,\n userId: input.userId === undefined ? current.userId : input.userId,\n userName: input.userName === undefined ? current.userName : input.userName\n }) as AkRecordRow | undefined;\n\n if (!row) {\n return null;\n }\n\n return mapRowToRecord(row);\n }\n\n deleteById(id: string): boolean {\n const result = this.#database.prepare('DELETE FROM ak_records WHERE id = ?').run(id);\n\n return result.changes > 0;\n }\n}\n\nfunction fieldToColumn(field: Exclude<AkQueryField, 'key'>): string {\n switch (field) {\n case 'userId':\n return 'user_id';\n case 'userName':\n return 'user_name';\n case 'email':\n return 'email';\n case 'phone':\n return 'phone';\n }\n}\n\nfunction mapRowToRecord(row: AkRecordRow): AkRecord {\n return {\n createdAt: row.created_at,\n email: row.email,\n env: row.env,\n id: row.id,\n keyCiphertext: row.key_ciphertext,\n keySearchPrefix: row.key_search_prefix,\n phone: row.phone,\n updatedAt: row.updated_at,\n userId: row.user_id,\n userName: row.user_name\n };\n}\n","import { readdir, rm, stat } from 'node:fs/promises';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { join, win32 } from 'node:path';\n\nimport type { DiskDownloadsEntry } from './types.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface DiskCleanupRuntime {\n clearDirectoryContents: (path: string) => Promise<void>;\n disableHibernation: () => Promise<void>;\n inspectPath: (path: string) => Promise<{\n exists: boolean;\n isDirectory: boolean;\n sizeBytes: number;\n }>;\n listTopEntriesBySize: (path: string, limit: number) => Promise<DiskDownloadsEntry[]>;\n runCommand: (file: string, args: string[]) => Promise<void>;\n}\n\nexport interface CreateDiskCleanupRuntimeDependencies {\n executeCommand?: (file: string, args: string[]) => Promise<void>;\n}\n\nexport interface DiskCleanupRoots {\n systemRoot: string;\n userProfileRoot: string;\n}\n\nexport function resolveDiskCleanupRoots(env: NodeJS.ProcessEnv): DiskCleanupRoots {\n const userProfileRoot = env.USERPROFILE ?? resolveHomeDrivePath(env);\n const systemRoot = env.SystemRoot ?? 'C:\\\\Windows';\n\n if (!userProfileRoot) {\n throw new Error(\n 'Windows user profile could not be resolved. Set USERPROFILE or HOMEDRIVE and HOMEPATH.'\n );\n }\n\n return {\n systemRoot,\n userProfileRoot\n };\n}\n\nexport function createDiskCleanupRuntime(\n dependencies: CreateDiskCleanupRuntimeDependencies = {}\n): DiskCleanupRuntime {\n const executeCommand =\n dependencies.executeCommand ??\n /* v8 ignore next 3 */\n (async (file: string, args: string[]) => {\n await execFileAsync(file, args);\n });\n\n return {\n clearDirectoryContents: async (path: string) => {\n const entries = await readdir(path, { withFileTypes: true });\n await Promise.all(\n entries.map((entry) =>\n rm(join(path, entry.name), {\n force: true,\n recursive: true\n })\n )\n );\n },\n disableHibernation: async () => {\n await executeCommand('powercfg', ['-h', 'off']);\n },\n inspectPath: async (path: string) => inspectPath(path),\n listTopEntriesBySize: async (path: string, limit: number) => listTopEntriesBySize(path, limit),\n runCommand: async (file: string, args: string[]) => {\n await executeCommand(file, args);\n }\n };\n}\n\nasync function inspectPath(path: string): Promise<{ exists: boolean; isDirectory: boolean; sizeBytes: number }> {\n try {\n const stats = await stat(path);\n\n if (!stats.isDirectory()) {\n return {\n exists: true,\n isDirectory: false,\n sizeBytes: stats.size\n };\n }\n\n const sizeBytes = await getDirectorySize(path);\n return {\n exists: true,\n isDirectory: true,\n sizeBytes\n };\n } catch (error) {\n if (isNotFoundError(error)) {\n return {\n exists: false,\n isDirectory: false,\n sizeBytes: 0\n };\n }\n\n /* v8 ignore next */\n throw error;\n }\n}\n\nasync function getDirectorySize(path: string): Promise<number> {\n const entries = await readdir(path, { withFileTypes: true });\n let total = 0;\n\n for (const entry of entries) {\n const entryPath = join(path, entry.name);\n\n if (entry.isDirectory()) {\n total += await getDirectorySize(entryPath);\n continue;\n }\n\n /* v8 ignore start */\n if (entry.isFile()) {\n total += (await stat(entryPath)).size;\n }\n /* v8 ignore stop */\n }\n\n return total;\n}\n\nasync function listTopEntriesBySize(path: string, limit: number): Promise<DiskDownloadsEntry[]> {\n try {\n const entries = await readdir(path, { withFileTypes: true });\n const measured = await Promise.all(\n entries.map(async (entry): Promise<DiskDownloadsEntry | null> => {\n const entryPath = join(path, entry.name);\n\n if (entry.isDirectory()) {\n return {\n kind: 'directory',\n name: entry.name,\n path: entryPath,\n sizeBytes: await getDirectorySize(entryPath),\n sizeGB: 0\n };\n }\n\n if (entry.isFile()) {\n const stats = await stat(entryPath);\n return {\n kind: 'file',\n name: entry.name,\n path: entryPath,\n sizeBytes: stats.size,\n sizeGB: 0\n };\n }\n\n return null;\n })\n );\n\n return measured\n .filter((entry): entry is DiskDownloadsEntry => entry !== null)\n .map((entry) => ({\n ...entry,\n sizeGB: bytesToGb(entry.sizeBytes)\n }))\n .sort((left, right) => right.sizeBytes - left.sizeBytes)\n .slice(0, limit);\n } catch (error) {\n if (isNotFoundError(error)) {\n return [];\n }\n\n throw error;\n }\n}\n\nfunction bytesToGb(value: number): number {\n return Number((value / (1024 ** 3)).toFixed(2));\n}\n\nfunction resolveHomeDrivePath(env: NodeJS.ProcessEnv): string | null {\n if (!env.HOMEDRIVE || !env.HOMEPATH) {\n return null;\n }\n\n return win32.join(env.HOMEDRIVE, env.HOMEPATH);\n}\n\nfunction isNotFoundError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && 'code' in error && error.code === 'ENOENT';\n}\n","import { execFile as nodeExecFile } from 'node:child_process';\nimport { writeFile as writeFileOnDisk } from 'node:fs/promises';\nimport { promisify } from 'node:util';\n\nimport { createVideoCandidate, rankVideoCandidates } from './sniff/candidate.js';\nimport { VideoCommandError, type VideoCandidate } from './types.js';\n\nexport interface VideoExecResult {\n code: number;\n stderr: string;\n stdout: string;\n}\n\nexport interface VideoFetchResponse {\n arrayBuffer: () => Promise<ArrayBuffer | Uint8Array>;\n body?: ReadableStream<Uint8Array> | null;\n headers: Headers;\n ok: boolean;\n status: number;\n text: () => Promise<string>;\n}\n\nexport interface VideoRuntime {\n execFile: (file: string, args: string[]) => Promise<VideoExecResult>;\n fetch: (input: string, init?: RequestInit) => Promise<VideoFetchResponse>;\n launchBrowserSniffer: (url: string, options?: { noProxy?: boolean; proxyUrl?: string }) => Promise<VideoCandidate[]>;\n writeFile: (path: string, data: Uint8Array) => Promise<void>;\n}\n\nconst execFileAsync = promisify(nodeExecFile);\n\nexport function createDefaultVideoRuntime(): VideoRuntime {\n return {\n execFile: async (file, args) => {\n try {\n const result = await execFileAsync(file, args, { encoding: 'utf8' });\n return {\n code: 0,\n stderr: result.stderr,\n stdout: result.stdout\n };\n } catch (error) {\n const execError = error as Error & { code?: number; stderr?: string; stdout?: string };\n /* c8 ignore start */\n return {\n code: typeof execError.code === 'number' ? execError.code : 1,\n stderr: execError.stderr ?? execError.message,\n stdout: execError.stdout ?? ''\n };\n /* c8 ignore end */\n }\n },\n fetch: async (input, init) => {\n const response = await fetch(input, init);\n return response;\n },\n launchBrowserSniffer: async (url) => sniffWithBrowserRuntime(url),\n writeFile: async (path, data) => {\n await writeFileOnDisk(path, data);\n }\n };\n}\n\nexport async function sniffWithBrowserRuntime(\n url: string,\n loadModule: (specifier: string) => Promise<unknown> = loadOptionalModule\n): Promise<VideoCandidate[]> {\n let playwright: unknown;\n\n try {\n playwright = await loadModule('playwright');\n } catch {\n throw new VideoCommandError(\n 'VIDEO_BROWSER_UNAVAILABLE',\n 'Browser sniff mode requires Playwright to be installed.',\n 2,\n undefined,\n true\n );\n }\n\n const chromium = (playwright as { chromium?: { launch: (options: { headless: boolean }) => Promise<unknown> } }).chromium;\n\n if (!chromium) {\n throw new VideoCommandError(\n 'VIDEO_BROWSER_UNAVAILABLE',\n 'Browser sniff mode requires Playwright Chromium support.',\n 2,\n undefined,\n true\n );\n }\n\n const browser = await chromium.launch({ headless: true });\n const candidates: VideoCandidate[] = [];\n\n try {\n const context = await (browser as {\n newContext: () => Promise<{\n close: () => Promise<void>;\n newPage: () => Promise<{\n goto: (target: string, options: { waitUntil: 'load' | 'networkidle' }) => Promise<void>;\n on: (event: 'response', handler: (response: {\n headers: () => Record<string, string>;\n url: () => string;\n }) => void) => void;\n waitForTimeout: (value: number) => Promise<void>;\n }>;\n }>;\n }).newContext();\n const page = await context.newPage();\n\n page.on('response', (response) => {\n const candidate = createCandidateFromBrowserResponse(response.url(), response.headers()['content-type']);\n\n if (candidate) {\n candidates.push(candidate);\n }\n });\n\n await page.goto(url, { waitUntil: 'load' });\n await page.waitForTimeout(60000);\n await context.close();\n } finally {\n await (browser as { close: () => Promise<void> }).close();\n }\n\n return rankVideoCandidates(candidates);\n}\n\nconst loadOptionalModule = new Function(\n 'specifier',\n 'return import(specifier);'\n) as (specifier: string) => Promise<unknown>;\n\n// Matches video resolution: /avc1/WxH/ or /vid/.../WxH/\nconst VIDEO_RES_RE = /(?:^|\\/)(?:avc1\\/|vid\\/)(?:\\d+\\/){0,2}(\\d+)x(\\d+)/i;\n// Matches audio bitrate: /mp4a/BITRATE/\nconst AUDIO_BITRATE_RE = /\\/mp4a\\/(\\d+)/i;\nconst AUDIO_RE = /\\/mp4a\\//i;\n\nexport function createCandidateFromBrowserResponse(\n url: string,\n contentType?: string\n): VideoCandidate | null {\n const isAudio = AUDIO_RE.test(url);\n\n let qualityBonus = 0;\n\n if (isAudio) {\n const bitrateMatch = AUDIO_BITRATE_RE.exec(url);\n if (bitrateMatch && bitrateMatch[1]) {\n const bitrate = parseInt(bitrateMatch[1], 10);\n // Normalize to 192kbps max\n qualityBonus = Math.min(bitrate / 192_000, 1) * 0.05;\n }\n } else {\n const resMatch = VIDEO_RES_RE.exec(url);\n if (resMatch && resMatch[1] && resMatch[2]) {\n const width = parseInt(resMatch[1], 10);\n const height = parseInt(resMatch[2], 10);\n const pixels = width * height;\n // Normalize to 1920x1080\n qualityBonus = Math.min(pixels / (1920 * 1080), 1) * 0.05;\n }\n }\n\n // .m4s is a DASH fragment, not a playlist — skip it\n if (/\\.m4s(?:\\?|$)/i.test(url)) {\n return null;\n }\n\n if (/\\.m3u8(?:\\?|$)/i.test(url)) {\n if (isAudio) {\n return null;\n }\n return createVideoCandidate('m3u8', url, 'network', qualityBonus);\n }\n\n if (/\\.mp4(?:\\?|$)/i.test(url) || contentType?.includes('video/mp4')) {\n if (isAudio) {\n return null;\n }\n return createVideoCandidate('mp4', url, 'network', qualityBonus);\n }\n\n return null;\n}\n","import { execFile as nodeExecFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nimport { Kr36CommandError, type Kr36JsonRequest, type Kr36Request } from './types.js';\n\nexport interface Kr36Runtime {\n fetchArticleHtml: (request: Kr36Request) => Promise<string>;\n fetchJson: (request: Kr36JsonRequest) => Promise<string>;\n}\n\nconst execFileAsync = promisify(nodeExecFile);\n\nexport function createDefaultKr36Runtime(): Kr36Runtime {\n return {\n fetchArticleHtml: async (request) => fetchWithCurl(request, 'KR36_REQUEST_FAILED'),\n fetchJson: async (request) => fetchWithCurl(request, 'KR36_REQUEST_FAILED')\n };\n}\n\nasync function fetchWithCurl(\n request: Kr36JsonRequest | Kr36Request,\n errorCode: string\n): Promise<string> {\n const args = [\n '--silent',\n '--show-error',\n '--location',\n '--compressed',\n ...Object.entries(request.headers).flatMap(([name, value]) => ['--header', `${name}: ${value}`]),\n ...('body' in request ? ['--data-raw', JSON.stringify(request.body)] : []),\n request.url\n ];\n\n try {\n const result = await execFileAsync('curl', args, {\n encoding: 'utf8',\n maxBuffer: 20 * 1024 * 1024\n });\n return result.stdout;\n } catch (error) {\n const execError = error as Error & { code?: number | string; stderr?: string };\n throw new Kr36CommandError(\n errorCode,\n `Failed to fetch 36kr page: ${execError.stderr || execError.message}`,\n 1,\n {\n curlExitCode: execError.code,\n url: request.url\n }\n );\n }\n}\n","import type { Browser, BrowserContext, Page, Response } from 'playwright';\n\nimport {\n ToutiaoCommandError,\n type ToutiaoArticle,\n type ToutiaoAuthorRuntimeResult,\n type ToutiaoItem,\n type ToutiaoRuntimeListResult,\n type ToutiaoSource\n} from './types.js';\n\nexport interface ToutiaoRuntime {\n fetchArticle: (request: { input: string; url: string }) => Promise<ToutiaoArticle>;\n fetchAuthorArticles: (options: {\n authorToken: string;\n pages: number;\n url: string;\n }) => Promise<ToutiaoAuthorRuntimeResult>;\n fetchKeywordInformation: (options: {\n keyword: ToutiaoSource;\n pages: number;\n source: ToutiaoSource;\n }) => Promise<ToutiaoRuntimeListResult>;\n fetchTechnologyChannel: (options: { pages: number }) => Promise<ToutiaoRuntimeListResult>;\n}\n\nconst TOUTIAO_USER_AGENT =\n 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36';\nconst TECH_CHANNEL_ID = 3189398999;\n\nexport function createDefaultToutiaoRuntime(): ToutiaoRuntime {\n return {\n fetchArticle: async (request) => fetchArticleWithBrowser(request),\n fetchAuthorArticles: async (options) => fetchAuthorArticlesWithBrowser(options),\n fetchKeywordInformation: async (options) => fetchKeywordInformationWithBrowser(options),\n fetchTechnologyChannel: async (options) => fetchTechnologyChannelWithBrowser(options)\n };\n}\n\nasync function fetchArticleWithBrowser(request: {\n input: string;\n url: string;\n}): Promise<ToutiaoArticle> {\n return withToutiaoPage(async (page) => {\n await page.goto(request.url, {\n timeout: 45000,\n waitUntil: 'domcontentloaded'\n });\n await page.waitForTimeout(5000);\n\n const title = await page.locator('h1').first().innerText({ timeout: 5000 }).catch(() => '');\n const paragraphs = await page.locator('article p').evaluateAll((nodes) =>\n nodes.map((node) => (node.textContent ?? '').trim()).filter(Boolean)\n );\n const bodyText = await page.locator('body').innerText({ timeout: 5000 });\n const metadata = extractArticleMetadata(bodyText, title);\n const id = extractArticleId(request.url) ?? extractArticleId(request.input) ?? '';\n\n if (!id || !title || paragraphs.length === 0) {\n throw new ToutiaoCommandError(\n 'TOUTIAO_PARSE_ERROR',\n 'Toutiao article page did not expose title and content.',\n 2,\n {\n input: request.input,\n url: request.url\n }\n );\n }\n\n const article: ToutiaoArticle = {\n content: {\n paragraphs,\n text: paragraphs.join('\\n')\n },\n id,\n request,\n title,\n url: page.url()\n };\n\n if (metadata.authorName !== undefined) {\n article.authorName = metadata.authorName;\n }\n if (metadata.publishTimeText !== undefined) {\n article.publishTimeText = metadata.publishTimeText;\n }\n\n return article;\n });\n}\n\nasync function fetchTechnologyChannelWithBrowser(options: {\n pages: number;\n}): Promise<ToutiaoRuntimeListResult> {\n return withToutiaoPage(async (page) => {\n const feedResponses: ToutiaoFeedResponse[] = [];\n\n page.on('response', (response) => {\n if (!response.url().includes('/api/pc/list/feed')) {\n return;\n }\n\n void response.json().then((json) => {\n feedResponses.push(json as ToutiaoFeedResponse);\n }).catch(() => undefined);\n });\n\n await page.goto('https://www.toutiao.com/?channel=tech&source=ch', {\n timeout: 45000,\n waitUntil: 'domcontentloaded'\n });\n await waitForFeedResponses(page, feedResponses, options.pages);\n\n const items = feedResponses.flatMap((response) => mapFeedItems(response.data ?? []));\n const lastResponse = feedResponses.at(-1);\n\n if (items.length === 0) {\n throw new ToutiaoCommandError(\n 'TOUTIAO_PARSE_ERROR',\n 'Toutiao technology channel did not return feed items.',\n 2\n );\n }\n\n const result: ToutiaoRuntimeListResult = {\n hasMore: lastResponse?.has_more ?? false,\n items,\n source: 'tech'\n };\n\n const next: NonNullable<ToutiaoRuntimeListResult['next']> = {};\n if (lastResponse?.next?.max_behot_time !== undefined) {\n next.maxBehotTime = lastResponse.next.max_behot_time;\n }\n if (lastResponse?.offset !== undefined) {\n next.offset = lastResponse.offset;\n }\n if (Object.keys(next).length > 0) {\n result.next = next;\n }\n\n return result;\n });\n}\n\nasync function fetchAuthorArticlesWithBrowser(options: {\n authorToken: string;\n pages: number;\n url: string;\n}): Promise<ToutiaoAuthorRuntimeResult> {\n return withToutiaoPage(async (page) => {\n const feedResponses: ToutiaoFeedResponse[] = [];\n\n page.on('response', (response) => {\n if (!isAuthorFeedResponseUrl(response.url(), options.authorToken)) {\n return;\n }\n\n void response.json().then((json) => {\n feedResponses.push(json as ToutiaoFeedResponse);\n }).catch(() => undefined);\n });\n\n await page.goto(options.url, {\n timeout: 45000,\n waitUntil: 'domcontentloaded'\n });\n await waitForFeedResponses(page, feedResponses, options.pages);\n\n const seen = new Set<string>();\n const selectedResponses = feedResponses.slice(0, options.pages);\n const items = selectedResponses\n .flatMap((response) => mapFeedItems(response.data ?? []))\n .filter((item) => {\n if (seen.has(item.id)) {\n return false;\n }\n seen.add(item.id);\n return true;\n });\n const lastResponse = selectedResponses.at(-1);\n\n if (items.length === 0) {\n throw new ToutiaoCommandError(\n 'TOUTIAO_PARSE_ERROR',\n 'Toutiao author homepage did not return article feed items.',\n 2,\n {\n authorToken: options.authorToken,\n url: options.url\n }\n );\n }\n\n const result: ToutiaoAuthorRuntimeResult = {\n authorToken: options.authorToken,\n hasMore: lastResponse?.has_more ?? false,\n items\n };\n\n const next: NonNullable<ToutiaoAuthorRuntimeResult['next']> = {};\n if (lastResponse?.next?.max_behot_time !== undefined) {\n next.maxBehotTime = lastResponse.next.max_behot_time;\n }\n if (lastResponse?.offset !== undefined) {\n next.offset = lastResponse.offset;\n }\n if (Object.keys(next).length > 0) {\n result.next = next;\n }\n\n return result;\n });\n}\n\nasync function fetchKeywordInformationWithBrowser(options: {\n keyword: ToutiaoSource;\n pages: number;\n source: ToutiaoSource;\n}): Promise<ToutiaoRuntimeListResult> {\n return withToutiaoPage(async (page) => {\n const items: ToutiaoItem[] = [];\n const seen = new Set<string>();\n let blocked = false;\n\n for (let pageIndex = 0; pageIndex < options.pages; pageIndex += 1) {\n const url = buildSearchUrl(options.keyword, pageIndex);\n\n await page.goto(url, {\n timeout: 45000,\n waitUntil: 'domcontentloaded'\n });\n await page.waitForTimeout(5000);\n\n blocked = blocked || await page.locator('#pc_captcha').count() > 0;\n\n for (const item of await extractSearchItemsFromPage(page, options.keyword)) {\n if (seen.has(item.id)) {\n continue;\n }\n seen.add(item.id);\n items.push(item);\n }\n }\n\n if (blocked && items.length === 0) {\n throw new ToutiaoCommandError(\n 'TOUTIAO_VERIFICATION_REQUIRED',\n 'Toutiao search requires browser verification before returning usable results.',\n 1,\n {\n keyword: options.keyword\n }\n );\n }\n\n if (items.length === 0) {\n throw new ToutiaoCommandError(\n 'TOUTIAO_PARSE_ERROR',\n 'Toutiao search page did not expose result items.',\n 2,\n {\n keyword: options.keyword\n }\n );\n }\n\n return {\n hasMore: true,\n items,\n keyword: options.keyword,\n source: options.source\n };\n });\n}\n\nfunction buildSearchUrl(keyword: string, pageIndex: number): string {\n const params = new URLSearchParams({\n action_type: pageIndex === 0 ? 'search' : 'pagination',\n cur_tab_title: 'news',\n dvpf: 'pc',\n from: 'news',\n keyword,\n page_num: String(pageIndex),\n pd: 'information',\n source: pageIndex === 0 ? 'input' : 'pagination'\n });\n\n return `https://so.toutiao.com/search?${params.toString()}`;\n}\n\nasync function withToutiaoPage<T>(callback: (page: Page) => Promise<T>): Promise<T> {\n let browser: Browser | undefined;\n let context: BrowserContext | undefined;\n\n try {\n const { chromium } = await loadPlaywright();\n browser = await chromium.launch({ headless: true });\n context = await browser.newContext({\n locale: 'zh-CN',\n userAgent: TOUTIAO_USER_AGENT\n });\n const page = await context.newPage();\n\n return await callback(page);\n } finally {\n await context?.close().catch(() => undefined);\n await browser?.close().catch(() => undefined);\n }\n}\n\nasync function waitForFeedResponses(\n page: Page,\n responses: ToutiaoFeedResponse[],\n pages: number\n): Promise<void> {\n const started = Date.now();\n\n while (responses.length < pages && Date.now() - started < 45000) {\n await page.waitForTimeout(1000);\n if (responses.length < pages) {\n await page.mouse.wheel(0, 4000);\n }\n }\n}\n\nasync function loadPlaywright(): Promise<typeof import('playwright')> {\n try {\n return await loadOptionalModule('playwright') as typeof import('playwright');\n } catch {\n throw new ToutiaoCommandError(\n 'TOUTIAO_BROWSER_UNAVAILABLE',\n 'Toutiao collection requires Playwright to be installed.',\n 2\n );\n }\n}\n\ninterface ToutiaoFeedResponse {\n data?: ToutiaoRawFeedItem[];\n has_more?: boolean;\n next?: {\n max_behot_time?: number;\n };\n offset?: number;\n}\n\ninterface ToutiaoRawFeedItem {\n Abstract?: string;\n abstract?: string;\n article_url?: string;\n behot_time?: number;\n comment_count?: number;\n display_url?: string;\n group_id?: string;\n id?: string;\n image_url?: string;\n item_id?: string;\n media_name?: string;\n source?: string;\n source_url?: string;\n title?: string;\n Title?: string;\n}\n\nfunction mapFeedItems(items: ToutiaoRawFeedItem[]): ToutiaoItem[] {\n return items.flatMap((item) => {\n const id = String(item.group_id ?? item.item_id ?? item.id ?? '');\n const title = item.title ?? item.Title ?? '';\n\n if (!id || !title) {\n return [];\n }\n\n const mapped: ToutiaoItem = {\n id,\n title,\n url: normalizeArticleUrl(item.article_url ?? item.display_url ?? item.source_url, id)\n };\n\n const abstract = item.Abstract ?? item.abstract;\n if (abstract !== undefined) {\n mapped.abstract = abstract;\n }\n if (item.comment_count !== undefined) {\n mapped.commentCount = item.comment_count;\n }\n if (item.image_url !== undefined) {\n mapped.image = item.image_url;\n }\n const authorName = item.media_name ?? item.source;\n if (authorName !== undefined) {\n mapped.authorName = authorName;\n }\n if (item.source_url !== undefined) {\n mapped.sourceUrl = item.source_url;\n }\n if (item.behot_time !== undefined) {\n mapped.publishTime = {\n iso: new Date(item.behot_time * 1000).toISOString(),\n local: formatChinaTime(item.behot_time),\n seconds: item.behot_time\n };\n }\n\n return [mapped];\n });\n}\n\nfunction normalizeArticleUrl(value: string | undefined, id: string): string {\n if (!value) {\n return `https://www.toutiao.com/article/${id}/`;\n }\n\n try {\n const url = new URL(value, 'https://www.toutiao.com');\n return parseToutiaoArticleLink(url.toString())?.url ?? `https://www.toutiao.com/article/${id}/`;\n } catch {\n return `https://www.toutiao.com/article/${id}/`;\n }\n}\n\nasync function extractSearchItemsFromPage(page: Page, keyword: string): Promise<ToutiaoItem[]> {\n const anchors = await page.locator('a').evaluateAll((nodes) =>\n nodes.map((node) => ({\n href: (node as HTMLAnchorElement).href,\n text: (node.textContent ?? '').trim().replace(/\\s+/g, ' ')\n }))\n );\n const seen = new Set<string>();\n const items: ToutiaoItem[] = [];\n\n for (const anchor of anchors) {\n const articleLink = parseToutiaoArticleLink(anchor.href);\n\n if (!articleLink || !anchor.text || anchor.text.length < 6 || seen.has(articleLink.id)) {\n continue;\n }\n\n seen.add(articleLink.id);\n items.push({\n id: articleLink.id,\n title: anchor.text.slice(0, 180),\n url: articleLink.url\n });\n\n if (items.length >= 30) {\n break;\n }\n }\n\n if (items.length > 0) {\n return items;\n }\n\n return extractSearchItemsFromText(await page.locator('body').innerText({ timeout: 5000 }), keyword);\n}\n\nfunction extractSearchItemsFromText(text: string, keyword: string): ToutiaoItem[] {\n const blockedPrefixes = new Set([\n '无障碍 今日头条首页 登录 综合 资讯 视频 图片 用户 小视频 微头条 音乐 去抖音搜'\n ]);\n const lines = text\n .split(/\\n+/)\n .map((line) => line.trim())\n .filter((line) => line.length >= 12 && !blockedPrefixes.has(line));\n\n const seen = new Set<string>();\n const items: ToutiaoItem[] = [];\n\n for (const line of lines) {\n const normalized = line.replace(/\\s+/g, ' ');\n if (seen.has(normalized)) {\n continue;\n }\n seen.add(normalized);\n items.push({\n id: createSearchItemId(keyword, normalized, items.length),\n title: normalized.slice(0, 180),\n url: `https://so.toutiao.com/search?keyword=${encodeURIComponent(keyword)}&pd=information&dvpf=pc&source=input`\n });\n\n if (items.length >= 30) {\n break;\n }\n }\n\n return items;\n}\n\nfunction parseToutiaoArticleLink(href: string, depth = 0): { id: string; url: string } | undefined {\n if (depth > 3) {\n return undefined;\n }\n\n const directId = extractArticleId(href);\n\n if (directId) {\n return {\n id: directId,\n url: `https://www.toutiao.com/article/${directId}/`\n };\n }\n\n try {\n const url = new URL(href);\n const nextUrl = url.searchParams.get('url');\n\n if (nextUrl) {\n return parseToutiaoArticleLink(nextUrl, depth + 1);\n }\n } catch {\n return undefined;\n }\n\n return undefined;\n}\n\nfunction extractArticleMetadata(bodyText: string, title: string): {\n authorName?: string;\n publishTimeText?: string;\n} {\n const lines = bodyText.split(/\\n+/).map((line) => line.trim()).filter(Boolean);\n const titleIndex = lines.findIndex((line) => line === title);\n const metadataLine = titleIndex >= 0 ? lines[titleIndex + 1] : undefined;\n const match = metadataLine?.match(/^(.+?)·(.+)$/);\n\n if (!match?.[1] || !match[2]) {\n return {};\n }\n\n return {\n authorName: match[2],\n publishTimeText: match[1]\n };\n}\n\nfunction extractArticleId(value: string): string | undefined {\n return /(?:article|group)\\/(\\d+)/.exec(value)?.[1]\n ?? /\\/a(\\d+)/.exec(value)?.[1]\n ?? (/^\\d+$/.test(value) ? value : undefined);\n}\n\nfunction isAuthorFeedResponseUrl(value: string, authorToken: string): boolean {\n try {\n const url = new URL(value);\n const isProfileArticleFeed = url.pathname.includes('/api/pc/list/feed')\n && (\n url.searchParams.get('category') === 'pc_profile_article'\n || url.searchParams.get('author_token') === authorToken\n );\n const isProfileAllFeed = url.pathname.includes('/api/pc/list/user/feed')\n && url.searchParams.get('category') === 'profile_all'\n && url.searchParams.get('token') === authorToken;\n\n return isProfileArticleFeed || isProfileAllFeed;\n } catch {\n return (\n value.includes('/api/pc/list/feed')\n && (value.includes('pc_profile_article') || value.includes(authorToken))\n ) || (\n value.includes('/api/pc/list/user/feed')\n && value.includes('profile_all')\n && value.includes(authorToken)\n );\n }\n}\n\nfunction createSearchItemId(keyword: string, value: string, index: number): string {\n let hash = 2166136261;\n const input = `${keyword}:${index}:${value}`;\n\n for (const char of input) {\n hash ^= char.charCodeAt(0);\n hash = Math.imul(hash, 16777619);\n }\n\n return `search-${(hash >>> 0).toString(16)}`;\n}\n\nfunction formatChinaTime(timestampSeconds: number): string {\n return new Intl.DateTimeFormat('sv-SE', {\n day: '2-digit',\n hour: '2-digit',\n hour12: false,\n minute: '2-digit',\n month: '2-digit',\n second: '2-digit',\n timeZone: 'Asia/Shanghai',\n year: 'numeric'\n }).format(new Date(timestampSeconds * 1000));\n}\n\nconst loadOptionalModule = new Function(\n 'specifier',\n 'return import(specifier);'\n) as (specifier: string) => Promise<unknown>;\n","import {\n HackerNewsCommandError,\n type HackerNewsItem,\n type HackerNewsSearchRuntimeResult,\n type HackerNewsSearchSort,\n type HackerNewsStoriesRuntimeResult,\n type HackerNewsStorySource\n} from './types.js';\nimport { optional } from '../video/utils.js';\n\nexport interface HackerNewsRuntime {\n fetchSearch: (options: {\n limit: number;\n query: string;\n sort: HackerNewsSearchSort;\n }) => Promise<HackerNewsSearchRuntimeResult>;\n fetchStories: (options: {\n limit: number;\n source: HackerNewsStorySource;\n }) => Promise<HackerNewsStoriesRuntimeResult>;\n}\n\nconst FIREBASE_BASE_URL = 'https://hacker-news.firebaseio.com/v0';\nconst ALGOLIA_BASE_URL = 'https://hn.algolia.com/api/v1';\nconst SOURCE_TO_ENDPOINT: Record<HackerNewsStorySource, string> = {\n best: 'beststories',\n new: 'newstories',\n top: 'topstories'\n};\n\nexport function createDefaultHackerNewsRuntime(): HackerNewsRuntime {\n return {\n fetchSearch: async (options) => fetchSearch(options),\n fetchStories: async (options) => fetchStories(options)\n };\n}\n\nasync function fetchStories(options: {\n limit: number;\n source: HackerNewsStorySource;\n}): Promise<HackerNewsStoriesRuntimeResult> {\n const endpoint = SOURCE_TO_ENDPOINT[options.source];\n const ids = await fetchJson<number[]>(`${FIREBASE_BASE_URL}/${endpoint}.json`);\n const selectedIds = ids.slice(0, Math.max(options.limit * 2, options.limit));\n const rawItems = await Promise.all(\n selectedIds.map((id) => fetchJson<HackerNewsFirebaseItem | null>(`${FIREBASE_BASE_URL}/item/${id}.json`))\n );\n const items = rawItems.flatMap((item) => mapFirebaseItem(item)).slice(0, options.limit);\n\n return {\n items,\n source: options.source\n };\n}\n\nasync function fetchSearch(options: {\n limit: number;\n query: string;\n sort: HackerNewsSearchSort;\n}): Promise<HackerNewsSearchRuntimeResult> {\n const params = new URLSearchParams({\n hitsPerPage: String(options.limit),\n query: options.query,\n tags: 'story'\n });\n const endpoint = options.sort === 'date' ? 'search_by_date' : 'search';\n const response = await fetchJson<HackerNewsAlgoliaResponse>(`${ALGOLIA_BASE_URL}/${endpoint}?${params.toString()}`);\n\n return {\n items: response.hits.flatMap(mapAlgoliaHit).slice(0, options.limit),\n query: options.query\n };\n}\n\nasync function fetchJson<T>(url: string): Promise<T> {\n let response: Response;\n\n try {\n response = await fetch(url, {\n headers: {\n accept: 'application/json',\n 'user-agent': 'stephen-cli/0.1 HackerNews collector'\n }\n });\n } catch (error) {\n throw new HackerNewsCommandError(\n 'HN_FETCH_FAILED',\n 'Failed to fetch Hacker News data.',\n 2,\n {\n cause: error instanceof Error ? error.message : String(error),\n url\n }\n );\n }\n\n if (!response.ok) {\n throw new HackerNewsCommandError(\n 'HN_FETCH_FAILED',\n `Failed to fetch Hacker News data. HTTP ${response.status}.`,\n 2,\n {\n url\n }\n );\n }\n\n return await response.json() as T;\n}\n\ninterface HackerNewsFirebaseItem {\n by?: string;\n dead?: boolean;\n deleted?: boolean;\n descendants?: number;\n id?: number;\n score?: number;\n text?: string;\n time?: number;\n title?: string;\n type?: string;\n url?: string;\n}\n\ninterface HackerNewsAlgoliaResponse {\n hits: HackerNewsAlgoliaHit[];\n}\n\ninterface HackerNewsAlgoliaHit {\n author?: string;\n created_at_i?: number;\n num_comments?: number;\n objectID?: string;\n points?: number;\n story_id?: number;\n title?: string;\n url?: string;\n}\n\nfunction mapFirebaseItem(item: HackerNewsFirebaseItem | null): HackerNewsItem[] {\n if (!item || item.deleted || item.dead || item.type !== 'story' || !item.id || !item.title) {\n return [];\n }\n\n return [\n createItem({\n id: item.id,\n title: item.title,\n url: item.url ?? `https://news.ycombinator.com/item?id=${item.id}`,\n ...optional('author', item.by),\n ...optional('commentCount', item.descendants),\n ...optional('score', item.score),\n ...optional('text', item.text),\n ...optional('timeSeconds', item.time)\n })\n ];\n}\n\nfunction mapAlgoliaHit(hit: HackerNewsAlgoliaHit): HackerNewsItem[] {\n const id = hit.story_id ?? parseNumericId(hit.objectID);\n\n if (!id || !hit.title) {\n return [];\n }\n\n return [\n createItem({\n id,\n title: hit.title,\n url: hit.url ?? `https://news.ycombinator.com/item?id=${id}`,\n ...optional('author', hit.author),\n ...optional('commentCount', hit.num_comments),\n ...optional('score', hit.points),\n ...optional('timeSeconds', hit.created_at_i)\n })\n ];\n}\n\nfunction createItem(input: {\n author?: string;\n commentCount?: number;\n id: number;\n score?: number;\n text?: string;\n timeSeconds?: number;\n title: string;\n url: string;\n}): HackerNewsItem {\n const item: HackerNewsItem = {\n id: input.id,\n title: input.title,\n type: 'story',\n url: input.url\n };\n\n if (input.author !== undefined) {\n item.author = input.author;\n }\n if (input.commentCount !== undefined) {\n item.commentCount = input.commentCount;\n }\n if (input.score !== undefined) {\n item.score = input.score;\n }\n if (input.text !== undefined) {\n item.text = input.text;\n }\n if (input.timeSeconds !== undefined) {\n item.time = {\n iso: new Date(input.timeSeconds * 1000).toISOString(),\n seconds: input.timeSeconds\n };\n }\n\n return item;\n}\n\nfunction parseNumericId(value: string | undefined): number | undefined {\n if (!value || !/^\\d+$/.test(value)) {\n return undefined;\n }\n\n return Number(value);\n}\n"],"mappings":";;;AAAA,SAAS,aAAAA,YAAW,oBAAoB;AACxC,SAAS,WAAAC,gBAAe;AACxB,SAAS,qBAAoC;AAC7C,SAAS,uBAAuB;AAChC,SAAS,SAAS,OAAO,UAAU,cAAc;AACjD,OAAO,cAAc;;;ACLrB,SAAS,eAAe;AACxB,SAAS,UAAU,KAAAC,UAAS;AAC5B,SAAS,SAAAC,cAAa;;;ACFtB,SAAS,aAAa;AAgBf,SAAS,sBAAsB,SAAyB,OAAuB;AACpF,QAAM,oBAAoB,QAAQ,IAAI,CAAC,YAAY;AAAA,IACjD,IAAI,OAAO;AAAA,IACX,KAAK,OAAO;AAAA,IACZ,QAAQ,OAAO;AAAA,IACf,UAAU,OAAO;AAAA,IACjB,OAAO,OAAO;AAAA,IACd,OAAO,OAAO;AAAA,IACd,KAAK,OAAO;AAAA,IACZ,WAAW,OAAO;AAAA,IAClB,WAAW,OAAO;AAAA,EACpB,EAAE;AAEF,SAAO,KAAK;AAAA,IACV;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,OAAO,kBAAkB;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,MAAc,SAAiB,SAA2B;AAC5F,SAAO,KAAK;AAAA,IACV;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,QACL;AAAA,QACA,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,QAAQ;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,uBAAuB,SAAiC;AACtE,SAAO,MAAM;AAAA,IACX,CAAC,MAAM,OAAO,UAAU,YAAY,SAAS,SAAS,OAAO,WAAW;AAAA,IACxE,GAAG,QAAQ,IAAI,CAAC,WAAW;AAAA,MACzB,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO,UAAU;AAAA,MACjB,OAAO,YAAY;AAAA,MACnB,OAAO,SAAS;AAAA,MAChB,OAAO,SAAS;AAAA,MAChB,OAAO;AAAA,MACP,OAAO;AAAA,IACT,CAAC;AAAA,EACH,CAAC;AACH;;;ACxEA,SAAS,gBAAgB,kBAAkB,YAAY,mBAAmB;AAE1E,IAAM,uBAAuB;AAC7B,IAAM,YAAY;AAClB,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AAEf,SAAS,WAAW,KAAqB;AAC9C,SAAO,WAAW,MAAM,EAAE,OAAO,GAAG,EAAE,OAAO,KAAK;AACpD;AAEO,SAAS,qBAAqB,KAAa,SAAS,eAAuB;AAChF,SAAO,IAAI,MAAM,GAAG,MAAM;AAC5B;AAEO,SAAS,aAAa,WAAmB,KAAqB;AACnE,QAAM,KAAK,YAAY,SAAS;AAChC,QAAM,SAAS,eAAe,sBAAsB,WAAW,IAAI;AAAA,IACjE,eAAe;AAAA,EACjB,CAAC;AACD,QAAM,YAAY,OAAO,OAAO,CAAC,OAAO,OAAO,KAAK,MAAM,GAAG,OAAO,MAAM,CAAC,CAAC;AAC5E,QAAM,MAAM,OAAO,WAAW;AAE9B,SAAO,CAAC,GAAG,SAAS,WAAW,GAAG,IAAI,SAAS,WAAW,GAAG,UAAU,SAAS,WAAW,CAAC,EAAE,KAAK,GAAG;AACxG;AAEO,SAAS,aAAa,WAAmB,SAAyB;AACvE,QAAM,CAAC,QAAQ,SAAS,aAAa,IAAI,QAAQ,MAAM,GAAG;AAE1D,MAAI,CAAC,UAAU,CAAC,WAAW,CAAC,eAAe;AACzC,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AAEA,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA,OAAO,KAAK,QAAQ,WAAW;AAAA,IAC/B;AAAA,MACE,eAAe;AAAA,IACjB;AAAA,EACF;AAEA,WAAS,WAAW,OAAO,KAAK,SAAS,WAAW,CAAC;AAErD,SAAO,OAAO,OAAO;AAAA,IACnB,SAAS,OAAO,OAAO,KAAK,eAAe,WAAW,CAAC;AAAA,IACvD,SAAS,MAAM;AAAA,EACjB,CAAC,EAAE,SAAS,MAAM;AACpB;;;AChDA,SAAS,SAAS;;;ACAX,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,IAAM,kBAAkB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ADZA,IAAM,2BAA2B,uBAAuB,oBAAoB,KAAK,IAAI,CAAC;AACtF,IAAM,cAAc,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,YAAY;AAC3D,MAAI;AACF,WAAO,eAAe,KAAK;AAAA,EAC7B,SAAS,OAAO;AACd,YAAQ,SAAS;AAAA,MACf,MAAM;AAAA,MACN,SAAU,MAAgB;AAAA,IAC5B,CAAC;AACD,WAAO,EAAE;AAAA,EACX;AACF,CAAC;AAEM,SAAS,eAAe,OAAuB;AACpD,QAAM,aAAa,MAAM,KAAK;AAE9B,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AAEA,SAAO;AACT;AAEO,SAAS,eAAe,OAAuB;AACpD,QAAM,aAAa,MAAM,KAAK;AAE9B,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,IAAI,MAAM,4BAA4B,wBAAwB,EAAE;AAAA,EACxE;AAEA,MAAI,CAAC,+BAA+B,KAAK,UAAU,GAAG;AACpD,UAAM,IAAI;AAAA,MACR,2DAA2D,wBAAwB;AAAA,IACrF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,QAAQ,OAAuB;AAC7C,MAAI,MAAM,UAAU,GAAG;AACrB,WAAO,IAAI,OAAO,MAAM,MAAM;AAAA,EAChC;AAEA,MAAI,MAAM,UAAU,GAAG;AACrB,WAAO,GAAG,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,OAAO,MAAM,SAAS,CAAC,CAAC,GAAG,MAAM,MAAM,EAAE,CAAC;AAAA,EAC9E;AAEA,SAAO,GAAG,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,OAAO,MAAM,SAAS,CAAC,CAAC,GAAG,MAAM,MAAM,EAAE,CAAC;AAC9E;AAEA,IAAM,oBAAoB,EACvB,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,SAAS,EACT,UAAU,CAAC,UAAU,SAAS,MAAS;AAEnC,IAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK,EAAE,OAAO,EAAE,UAAU,cAAc;AAAA,EACxC,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AACZ,CAAC;AAEM,IAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,KAAK,YAAY,SAAS;AAAA,EAC1B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE;AAAA,EACtD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAC3C,CAAC;AAEM,SAAS,mBAAmB,OAA2C;AAC5E,MAAI,CAAC,OAAO;AACV,WAAO,CAAC,GAAG,eAAe;AAAA,EAC5B;AAEA,SAAO,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,UAAU;AACrC,UAAM,aAAa,MAAM,KAAK;AAE9B,QAAI,CAAC,gBAAgB,SAAS,UAA0B,GAAG;AACzD,YAAM,IAAI,MAAM,4BAA4B,UAAU,GAAG;AAAA,IAC3D;AAEA,WAAO;AAAA,EACT,CAAC;AACH;;;AE1CO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EAC/B;AAAA,EACA;AAAA,EAET,YAAY,MAAc,SAAiB,UAAkB;AAC3D,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,YAAN,MAAgB;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,cAAqC;AAC/C,SAAK,aAAa,aAAa;AAC/B,SAAK,OAAO,aAAa;AACzB,SAAK,cAAc,aAAa;AAAA,EAClC;AAAA,EAEA,IAAIC,QAQa;AACf,UAAM,SAAS,uBAAuB,MAAMA,MAAK;AACjD,UAAM,MAAM,eAAe,OAAO,GAAG;AACrC,UAAM,KAAK,WAAW,GAAG;AACzB,UAAM,MAAM,KAAK,KAAK;AAEtB,SAAK,YAAY,OAAO;AAAA,MACtB,WAAW;AAAA,MACX,OAAO,gCAAgC,OAAO,KAAK;AAAA,MACnD,KAAK,OAAO;AAAA,MACZ;AAAA,MACA,eAAe,aAAa,KAAK,YAAY,GAAG;AAAA,MAChD,iBAAiB,qBAAqB,GAAG;AAAA,MACzC,OAAO,gCAAgC,OAAO,KAAK;AAAA,MACnD,WAAW;AAAA,MACX,QAAQ,gCAAgC,OAAO,MAAM;AAAA,MACrD,UAAU,gCAAgC,OAAO,QAAQ;AAAA,IAC3D,CAAC;AAED,UAAM,SAAS,KAAK,YAAY,QAAQ,EAAE;AAE1C,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,eAAe,iBAAiB,4CAA4C,CAAC;AAAA,IACzF;AAEA,WAAO,KAAK,QAAQ,QAAQ,QAAQA,OAAM,MAAM,CAAC;AAAA,EACnD;AAAA,EAEA,IAAIA,QAAiC;AACnC,UAAM,SAAS,KAAK,YAAYA,MAAK;AAErC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,eAAe,oBAAoB,wCAAwC,CAAC;AAAA,IACxF;AAEA,WAAO,KAAK,QAAQ,QAAQ,QAAQA,OAAM,MAAM,CAAC;AAAA,EACnD;AAAA,EAEA,KAAKA,QAAoC;AACvC,UAAM,SAAS,YAAYA,OAAM,KAAK;AACtC,UAAM,QAAQA,OAAM,SAAS;AAC7B,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA,GAAIA,OAAM,MAAM,EAAE,KAAKA,OAAM,IAAI,IAAI,CAAC;AAAA,MACtC,GAAIA,OAAM,QAAQ,EAAE,OAAOA,OAAM,MAAM,IAAI,CAAC;AAAA,IAC9C;AACA,UAAM,UAAU,KAAK,YAAY,KAAK,OAAO;AAE7C,WAAO,QAAQ,IAAI,CAAC,WAAW,KAAK,QAAQ,QAAQ,QAAQA,OAAM,MAAM,CAAC,CAAC;AAAA,EAC5E;AAAA,EAEA,OAAOA,QAAoC;AACzC,UAAM,SAAS,KAAK,YAAYA,MAAK;AAErC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,eAAe,oBAAoB,wCAAwC,CAAC;AAAA,IACxF;AAEA,UAAM,kBAAkB,uBAAuBA,OAAM,KAAK;AAC1D,UAAM,kBAAkB,uBAAuBA,OAAM,KAAK;AAC1D,UAAM,mBAAmB,uBAAuBA,OAAM,MAAM;AAC5D,UAAM,qBAAqB,uBAAuBA,OAAM,QAAQ;AAChE,UAAM,UAAU,KAAK,YAAY,eAAe;AAAA,MAC9C,GAAI,oBAAoB,SAAY,CAAC,IAAI,EAAE,OAAO,gBAAgB;AAAA,MAClE,IAAI,OAAO;AAAA,MACX,GAAI,oBAAoB,SAAY,CAAC,IAAI,EAAE,OAAO,gBAAgB;AAAA,MAClE,WAAW,KAAK,KAAK;AAAA,MACrB,GAAI,qBAAqB,SAAY,CAAC,IAAI,EAAE,QAAQ,iBAAiB;AAAA,MACrE,GAAI,uBAAuB,SAAY,CAAC,IAAI,EAAE,UAAU,mBAAmB;AAAA,IAC7E,CAAC;AAED,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,eAAe,iBAAiB,wCAAwC,CAAC;AAAA,IACrF;AAEA,WAAO,KAAK,QAAQ,SAAS,QAAQA,OAAM,MAAM,CAAC;AAAA,EACpD;AAAA,EAEA,OAAOA,QAA+B;AACpC,UAAM,SAAS,KAAK,YAAYA,MAAK;AAErC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,eAAe,oBAAoB,wCAAwC,CAAC;AAAA,IACxF;AAEA,WAAO,KAAK,YAAY,WAAW,OAAO,EAAE;AAAA,EAC9C;AAAA,EAEA,YAAYA,QAAmD;AAC7D,QAAIA,OAAM,IAAI;AACZ,aAAO,KAAK,YAAY,QAAQA,OAAM,EAAE;AAAA,IAC1C;AAEA,QAAIA,OAAM,OAAOA,OAAM,KAAK;AAC1B,YAAM,gBAAgB,eAAeA,OAAM,GAAG;AAC9C,aAAO,KAAK,YAAY,cAAcA,OAAM,KAAK,WAAW,aAAa,CAAC;AAAA,IAC5E;AAEA,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QACE,QAWA,QACc;AACd,UAAM,MAAM,aAAa,KAAK,YAAY,OAAO,aAAa;AAE9D,WAAO;AAAA,MACL,WAAW,OAAO;AAAA,MAClB,OAAO,OAAO;AAAA,MACd,KAAK,OAAO;AAAA,MACZ,IAAI,OAAO;AAAA,MACX,KAAK,SAAS,MAAM,QAAQ,GAAG;AAAA,MAC/B,OAAO,OAAO;AAAA,MACd,WAAW,OAAO;AAAA,MAClB,QAAQ,OAAO;AAAA,MACf,UAAU,OAAO;AAAA,IACnB;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,OAA6D;AAC3F,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAM,KAAK;AAC9B,SAAO,WAAW,WAAW,IAAI,OAAO;AAC1C;AAEA,SAAS,gCAAgC,OAAiD;AACxF,SAAO,uBAAuB,KAAK,KAAK;AAC1C;AAEA,SAAS,YAAY,OAA2C;AAC9D,MAAI;AACF,WAAO,mBAAmB,KAAK;AAAA,EACjC,SAAS,OAAO;AAEd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,UAAM,IAAI,eAAe,oBAAoB,SAAS,CAAC;AAAA,EACzD;AACF;;;ACtPA,SAAS,YAAY,WAAW,cAAc,qBAAqB;AACnE,SAAS,SAAS,YAAY;AAC9B,SAAS,KAAAC,UAAS;AAEX,IAAM,qBAAqB;AAC3B,IAAM,4BAA4B;AAClC,IAAM,sBAAsB;AAC5B,IAAM,cAAc,CAAC,WAAW;AAuChC,IAAM,gBAAN,cAA4B,MAAM;AAAA,EAC9B,OAAO;AAAA,EACP,WAAW;AAAA,EAEpB,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,qBAAN,cAAiC,MAAM;AAAA,EACnC,OAAO;AAAA,EACP,WAAW;AAAA,EAEpB,YAAY,MAAc,OAAgB;AACxC,UAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAExD;AAAA,MACE,sCAAsC,IAAI,YAAY,yBAAyB,CAAC,2EAA2E,MAAM;AAAA,IACnK;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAEA,IAAM,iBAAiBA,GACpB,OAAO;AAAA,EACN,IAAIA,GACD,OAAO;AAAA,IACN,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,CAAC,EACA,SAAS;AACd,CAAC,EACA,YAAY;AAER,SAAS,oBAAoB,WAA2B;AAC7D,SAAO,KAAK,WAAW,mBAAmB;AAC5C;AAEO,SAAS,aAAa,WAA6B;AACxD,QAAM,iBAAiB,oBAAoB,SAAS;AAEpD,MAAI,CAAC,WAAW,cAAc,GAAG;AAC/B,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,cAAc,aAAa,gBAAgB,MAAM,GAAG,cAAc;AAC3E;AAEO,SAAS,aAAa,WAAmB,QAAwB;AACtE,QAAM,iBAAiB,oBAAoB,SAAS;AACpD,YAAU,QAAQ,cAAc,GAAG,EAAE,WAAW,KAAK,CAAC;AACtD,gBAAc,GAAG,cAAc,IAAI,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACnF;AAEO,SAAS,cAAc,UAAkB,iBAAiB,qBAA+B;AAC9F,MAAI;AAEJ,MAAI;AACF,iBAAa,KAAK,MAAM,QAAQ;AAAA,EAClC,QAAQ;AACN,UAAM,IAAI;AAAA,MACR,6CAA6C,cAAc,0BAA0B,yBAAyB,CAAC;AAAA,IACjH;AAAA,EACF;AAEA,QAAM,SAAS,eAAe,UAAU,UAAU;AAElD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI;AAAA,MACR,yBAAyB,cAAc,kFAAkF,yBAAyB,CAAC;AAAA,IACrJ;AAAA,EACF;AAEA,SAAO,OAAO;AAChB;AAEO,SAAS,sBACdC,QACwB;AACxB,QAAM,aAAa,wBAAwBA,OAAM,OAAO,IAAI,QAAQ,WAAW;AAE/E,MAAI,YAAY;AACd,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,UAAU,6BAA6BA,OAAM,GAAG;AAEtD,MAAI,SAAS;AACX,WAAO;AAAA,MACL,MAAM,wBAAwB,QAAQ,OAAO,QAAQ,MAAM;AAAA,MAC3D,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM,KAAKA,OAAM,gBAAgB,OAAO;AAAA,IACxC,QAAQ;AAAA,EACV;AACF;AAEO,SAAS,eACd,KACAA,QAKa;AACb,2BAAyB,GAAG;AAE5B,QAAM,SAAS,aAAaA,OAAM,SAAS;AAC3C,QAAM,WAAW,sBAAsB;AAAA,IACrC;AAAA,IACA,gBAAgBA,OAAM;AAAA,IACtB,KAAKA,OAAM;AAAA,EACb,CAAC;AACD,QAAM,WAAW,uBAAuB,6BAA6BA,OAAM,GAAG,GAAG,KAAK;AACtF,QAAM,YAAY,uBAAuB,OAAO,IAAI,MAAM;AAE1D,SAAO;AAAA,IACL,gBAAgB,oBAAoBA,OAAM,SAAS;AAAA,IACnD,cAAc,KAAKA,OAAM,SAAS,OAAO;AAAA,IACzC;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,SAAS;AAAA,IACjB,OAAO,SAAS;AAAA,EAClB;AACF;AAEO,SAAS,kBAAkBA,QAIhB;AAChB,SAAO,YAAY,IAAI,CAAC,QAAQ,eAAe,KAAKA,MAAK,CAAC;AAC5D;AAEO,SAAS,eACd,KACA,OACAA,QAGU;AACV,2BAAyB,GAAG;AAC5B,QAAM,kBAAkB,wBAAwB,OAAO,GAAG;AAC1D,QAAM,SAAS,aAAaA,OAAM,SAAS;AAC3C,QAAM,aAAuB;AAAA,IAC3B,GAAG;AAAA,IACH,IAAI;AAAA,MACF,GAAI,OAAO,MAAM,CAAC;AAAA,MAClB,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,eAAaA,OAAM,WAAW,UAAU;AAExC,SAAO;AACT;AAEO,SAAS,yBAAyB,KAAuC;AAC9E,MAAI,CAAC,YAAY,SAAS,GAAgB,GAAG;AAC3C,UAAM,IAAI;AAAA,MACR,2BAA2B,GAAG,qBAAqB,YAAY,KAAK,IAAI,CAAC;AAAA,IAC3E;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,OAA2B,QAAoC;AAC9F,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAM,KAAK;AAE9B,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,IAAI;AAAA,MACR,GAAG,MAAM;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAA0C;AACxE,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,KAAK;AACpB;AAEA,SAAS,6BACP,KAC+C;AAC/C,QAAM,eAAe,IAAI,kBAAkB;AAE3C,MAAI,iBAAiB,QAAW;AAC9B,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,cAAc,IAAI,yBAAyB;AAEjD,MAAI,gBAAgB,QAAW;AAC7B,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,2BAAmC;AAC1C,SAAO,GAAG,kBAAkB,mBAAmB,yBAAyB;AAC1E;;;AC3QA,SAAS,KAAAC,UAAS;;;ACDlB,SAAS,SAAAC,cAAa;AAIf,SAAS,8BAA8B,QAAmC;AAC/E,SAAO,KAAK;AAAA,IACV;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,OAAO,OAAO,QAAQ;AAAA,QACtB,uBAAuB,OAAO;AAAA,QAC9B,oBAAoB,OAAO;AAAA,MAC7B;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,+BAA+B,QAAmC;AAChF,QAAM,cAAcA,OAAM;AAAA,IACxB,CAAC,SAAS,UAAU,UAAU,UAAU,iBAAiB,MAAM;AAAA,IAC/D,GAAG,OAAO,QAAQ,IAAI,CAAC,WAAW;AAAA,MAChC,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO,OAAO,MAAM;AAAA,MACpB,OAAO,SAAS,QAAQ;AAAA,MACxB,OAAO,wBAAwB,QAAQ;AAAA,MACvC,OAAO;AAAA,IACT,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,OAAO,WAAW;AACrB,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,WAAW;AAAA;AAAA,EAA4BA,OAAM;AAAA,IACrD,CAAC,QAAQ,UAAU,MAAM;AAAA,IACzB,GAAG,OAAO,UAAU,WAAW,IAAI,CAAC,UAAU,CAAC,MAAM,MAAM,OAAO,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC;AAAA,EAC9F,CAAC,CAAC;AACJ;;;AD9BA,IAAM,2BAA2BC,GAAE,OAAO;AAAA,EACxC,OAAOA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAChC,SAASA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAClC,kBAAkBA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAC3C,QAAQA,GAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,EAChD,OAAOA,GAAE,KAAK,CAAC,QAAQ,OAAO,UAAU,MAAM,CAAC,EAAE,QAAQ,MAAM;AACjE,CAAC;AAEM,SAAS,qBACd,SACA,cACM;AACN,QAAM,OAAO,QAAQ,QAAQ,MAAM,EAAE,YAAY,6CAA6C;AAE9F,OAAK,QAAQ,SAAS,EACnB,OAAO,WAAW,0CAA0C,EAC5D,OAAO,aAAa,iDAAiD,EACrE,OAAO,uBAAuB,+CAA+C,EAC7E,OAAO,qBAAqB,iBAAiB,MAAM,EACnD,OAAO,mBAAmB,6CAA6C,MAAM,EAC7E,OAAO,eAAe,mBAAmB,EACzC,OAAO,OAAO,YAAY;AACzB,UAAM,SAAS,yBAAyB,MAAM,uBAAuB,OAAO,CAAC;AAC7E,UAAM,SAAS,MAAM,aAAa,yBAAyB,EAAE,QAAQ;AAAA,MACnE,OAAO,OAAO;AAAA,MACd,SAAS,OAAO;AAAA,MAChB,kBAAkB,OAAO;AAAA,MACzB,OAAO,OAAO;AAAA,IAChB,CAAC;AAED,QAAI,OAAO,WAAW,SAAS;AAC7B,mBAAa,OAAO,GAAG,+BAA+B,MAAM,CAAC;AAAA,CAAI;AACjE;AAAA,IACF;AAEA,iBAAa,OAAO,GAAG,8BAA8B,MAAM,CAAC;AAAA,CAAI;AAAA,EAClE,CAAC;AACL;AAEO,SAAS,uBAAuE,SAErF;AACA,MAAI,QAAQ,OAAO;AACjB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ;AAClB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAGA,QAAM,IAAI,MAAM,6CAA6C;AAC/D;;;AErEA,SAAS,aAAa;AAiCf,IAAM,0BAAN,cAAsC,MAAM;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,MAAc,SAAiB,WAAW,GAAG,SAAmC;AAC1F,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,QAAI,SAAS;AACX,WAAK,UAAU;AAAA,IACjB;AACA,SAAK,WAAW;AAAA,EAClB;AACF;AAEO,IAAM,qBAAN,MAAyB;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,cAA8C;AACxD,SAAK,UAAU,aAAa;AAC5B,SAAK,aAAa,aAAa;AAC/B,SAAK,kBAAkB,aAAa;AAAA,EACtC;AAAA,EAEA,MAAM,QAAQ,SAAyD;AACrE,QAAI,qBAAqB,QAAQ,KAAK,KAAK,QAAQ,SAAS,CAAC,QAAQ,SAAS;AAC5E,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,oBAAoB,KAAK,WAAW,QAAQ,KAAK;AACvD,UAAM,UAA+B,CAAC;AACtC,UAAM,WAAqB,CAAC;AAC5B,QAAI,wBAAwB;AAE5B,eAAW,UAAU,mBAAmB;AACtC,YAAM,aACJ,OAAO,WAAW,gBACd,EAAE,QAAQ,MAAM,aAAa,OAAO,WAAW,EAAE,IACjD,MAAM,KAAK,QAAQ,YAAY,OAAO,IAAI;AAChD,+BAAyB,WAAW;AAEpC,UAAI,SAAsC,WAAW,SAChD,QAAQ,QAAQ,YAAY,YAC7B;AACJ,UAAI;AAEJ,UAAI,QAAQ,SAAS,WAAW,QAAQ;AACtC,YAAI;AACF,cAAI,OAAO,WAAW,4BAA4B;AAChD,kBAAM,KAAK,QAAQ,uBAAuB,OAAO,IAAI;AAAA,UACvD;AACA,cAAI,OAAO,WAAW,eAAe;AACnC,kBAAM,KAAK,QAAQ,WAAW,OAAO,SAAU,OAAO,QAAQ,CAAC,CAAC;AAAA,UAClE;AACA,cAAI,OAAO,WAAW,gBAAgB;AACpC,qBAAS;AAAA,UACX;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,gBAAgB,KAAK;AAC7B,mBAAS,KAAK,GAAG,OAAO,KAAK,KAAK,KAAK,EAAE;AACzC,mBAAS;AAAA,QACX;AAAA,MACF;AAEA,cAAQ,KAAK;AAAA,QACX,QAAQ,OAAO;AAAA,QACf,GAAI,OAAO,UAAU,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;AAAA,QACpD,GAAI,OAAO,OAAO,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA,QAC3C,QAAQ,WAAW;AAAA,QACnB,OAAO,OAAO;AAAA,QACd,MAAM,OAAO;AAAA,QACb,uBAAuB,OAAO;AAAA,QAC9B,WAAW,WAAW;AAAA,QACtB,QAAQ,UAAU,WAAW,SAAS;AAAA,QACtC;AAAA,QACA,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,MAC3B,CAAC;AAAA,IACH;AAEA,UAAM,cAAgD;AAAA,MACpD,WAAW,QAAQ;AAAA,MACnB,QAAQ;AAAA,IACV;AAEA,QAAI,QAAQ,SAAS,QAAQ,kBAAkB;AAC7C,UAAI;AACF,cAAM,KAAK,QAAQ,mBAAmB;AACtC,oBAAY,SAAS;AAAA,MACvB,SAAS,OAAO;AACd,oBAAY,SAAS;AACrB,oBAAY,QAAQ,gBAAgB,KAAK;AACzC,iBAAS,KAAK,gBAAgB,YAAY,KAAK,EAAE;AAAA,MACnD;AAAA,IACF;AAEA,UAAM,SAA4B;AAAA,MAChC,GAAI,QAAQ,UAAU,SAAS,EAAE,WAAW,MAAM,KAAK,mBAAmB,EAAE,IAAI,CAAC;AAAA,MACjF;AAAA,MACA,oBAAoB,UAAU,qBAAqB;AAAA,MACnD;AAAA,MACA,OAAO,QAAQ;AAAA,MACf,MAAM,QAAQ,QAAQ,UAAU;AAAA,MAChC,YAAY,KAAK;AAAA,MACjB;AAAA,MACA,iBAAiB,KAAK;AAAA,IACxB;AAEA,QAAI,SAAS,SAAS,GAAG;AACvB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,qBAA2E;AACvF,UAAM,OAAO,MAAM,KAAK,KAAK,iBAAiB,WAAW;AACzD,WAAO;AAAA,MACL;AAAA,MACA,YAAY,MAAM,KAAK,QAAQ,qBAAqB,MAAM,GAAG;AAAA,IAC/D;AAAA,EACF;AAAA,EAEQ,WAAW,OAAwD;AACzE,QAAI,UAAU,QAAQ;AACpB,aAAO,KAAK,eAAe;AAAA,IAC7B;AAEA,QAAI,UAAU,OAAO;AACnB,aAAO,cAAc,CAAC,GAAG,KAAK,eAAe,GAAG,GAAG,KAAK,cAAc,CAAC,CAAC;AAAA,IAC1E;AAEA,QAAI,UAAU,UAAU;AACtB,aAAO,cAAc,CAAC,GAAG,KAAK,eAAe,GAAG,GAAG,KAAK,iBAAiB,CAAC,CAAC;AAAA,IAC7E;AAEA,WAAO,cAAc,CAAC,GAAG,KAAK,eAAe,GAAG,GAAG,KAAK,cAAc,GAAG,GAAG,KAAK,iBAAiB,CAAC,CAAC;AAAA,EACtG;AAAA,EAEQ,iBAAgD;AACtD,WAAO;AAAA,MACL;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,MAAM,KAAK,KAAK,iBAAiB,WAAW,SAAS,WAAW;AAAA,QACtE,uBAAuB;AAAA,MACzB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,MAAM,KAAK,KAAK,iBAAiB,WAAW,SAAS,OAAO;AAAA,QAClE,uBAAuB;AAAA,MACzB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,MAAM,KAAK,KAAK,iBAAiB,QAAQ;AAAA,QAC/C,uBAAuB;AAAA,MACzB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,MAAM,KAAK,KAAK,iBAAiB,KAAK;AAAA,QAC5C,uBAAuB;AAAA,MACzB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,MAAM,KAAK,KAAK,iBAAiB,WAAW,SAAS,MAAM;AAAA,QACjE,uBAAuB;AAAA,MACzB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,MAAM,KAAK,KAAK,YAAY,wBAAwB,UAAU;AAAA,QACpE,uBAAuB;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBAA+C;AACrD,WAAO;AAAA,MACL;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,MAAM,KAAK,KAAK,iBAAiB,WAAW,QAAQ;AAAA,QAC1D,uBAAuB;AAAA,MACzB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,MAAM,KAAK,KAAK,iBAAiB,aAAa;AAAA,QACpD,uBAAuB;AAAA,MACzB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,MAAM,KAAK,KAAK,iBAAiB,WAAW,SAAS,QAAQ,OAAO;AAAA,QAC1E,uBAAuB;AAAA,MACzB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,MAAM,KAAK,KAAK,iBAAiB,WAAW,SAAS,QAAQ,OAAO;AAAA,QAC1E,uBAAuB;AAAA,MACzB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,MAAM,KAAK,KAAK,iBAAiB,WAAW,SAAS,OAAO,OAAO;AAAA,QACzE,uBAAuB;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBAAkD;AACxD,WAAO;AAAA,MACL;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,MAAM,KAAK,KAAK,YAAY,MAAM;AAAA,QACxC,uBAAuB;AAAA,MACzB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,CAAC,WAAW,kBAAkB,wBAAwB;AAAA,QAC5D,SAAS;AAAA,QACT,OAAO;AAAA,QACP,MAAM;AAAA,QACN,uBAAuB;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,UAAU,OAAuB;AACxC,SAAO,QAAQ,QAAS,QAAQ,GAAI,QAAQ,CAAC,CAAC;AAChD;AAEA,SAAS,gBAAgB,OAAwB;AAC/C,SAAO,iBAAiB,QAAQ,MAAM,UAAU;AAClD;AAEA,SAAS,qBAAqB,OAAkC;AAC9D,SAAO,UAAU,YAAY,UAAU;AACzC;AAEA,SAAS,cAAc,SAAuE;AAC5F,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,SAAwC,CAAC;AAE/C,aAAW,UAAU,SAAS;AAC5B,UAAM,MAAM,GAAG,OAAO,MAAM,IAAI,OAAO,WAAW,OAAO,IAAI;AAC7D,QAAI,KAAK,IAAI,GAAG,GAAG;AACjB;AAAA,IACF;AACA,SAAK,IAAI,GAAG;AACZ,WAAO,KAAK,MAAM;AAAA,EACpB;AAEA,SAAO;AACT;;;AChTA,SAAS,KAAAC,UAAS;;;ACEX,IAAM,4BAAN,MAAgC;AAAA,EACpB;AAAA,EAEjB,YAAY,cAAuE;AACjF,SAAK,UAAU,aAAa;AAAA,EAC9B;AAAA,EAEA,MAAM,WAAmB,SAA+E;AACtG,WAAO,KAAK,QAAQ,qBAAqB,WAAW,OAAO;AAAA,EAC7D;AACF;;;ACXO,SAAS,qBACd,MACA,KACA,QACA,aAAa,KACG;AAChB,SAAO;AAAA,IACL;AAAA,IACA,UAAU,SAAS,SAAS,kCAAkC;AAAA,IAC9D;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,YAAgD;AAClF,QAAM,UAAU,oBAAI,IAA4B;AAGhD,aAAW,aAAa,YAAY;AAClC,UAAM,WAAW,QAAQ,IAAI,UAAU,GAAG;AAE1C,QAAI,CAAC,aAAa,UAAU,cAAc,MAAM,SAAS,cAAc,IAAI;AACzE,cAAQ,IAAI,UAAU,KAAK,SAAS;AAAA,IACtC;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,QAAQ,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,UAAU;AACjD,UAAM,mBAAmB,MAAM,cAAc,MAAM,KAAK,cAAc;AAEtE,QAAI,oBAAoB,GAAG;AACzB,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,SAAS,MAAM,MAAM;AAC5B,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,SAAS,SAAS,KAAK;AAAA,EACrC,CAAC;AAEH;AAEO,SAAS,+BACd,MACA,QACkB;AAClB,QAAM,UAAU,KAAK,SAAS,uDAAuD;AAErF,SAAO;AAAA,IACL,CAAC,GAAG,OAAO,EAAE;AAAA,MAAI,CAAC,UAChB,qBAAqB,MAAM,CAAC,GAAG,YAAY,MAAM,SAAS,SAAS,OAAO,MAAM,CAAC,GAAG,QAAQ,WAAW,SAAS,OAAO,IAAI;AAAA,IAC7H;AAAA,EACF;AACF;;;ACxDO,SAAS,SAA8B,KAAQ,OAAiC;AACrF,SAAQ,UAAU,UAAa,UAAU,QAAQ,UAAU,KAAK,EAAE,CAAC,GAAG,GAAG,MAAM,IAAI,CAAC;AAGtF;;;ACKO,IAAM,oBAAN,MAAwB;AAAA,EACZ;AAAA,EACA;AAAA,EAEjB,YAAY,cAA6C;AACvD,SAAK,kBAAkB,aAAa;AACpC,SAAK,eAAe,aAAa;AAAA,EACnC;AAAA,EAEA,MAAM,MAAM,SAAuH;AACjI,UAAM,kBAAkB,qBAAqB,OAAO;AAEpD,QAAI,QAAQ,SAAS,QAAQ;AAC3B,aAAO,KAAK,aAAa,QAAQ,QAAQ,WAAW,MAAM,KAAK,aAAa,QAAQ,WAAW,eAAe,CAAC;AAAA,IACjH;AAEA,QAAI,QAAQ,SAAS,WAAW;AAC9B,aAAO,KAAK;AAAA,QACV;AAAA,QACA,QAAQ;AAAA,QACR,MAAM,KAAK,gBAAgB,QAAQ,WAAW,eAAe;AAAA,MAC/D;AAAA,IACF;AAEA,QAAI;AACF,aAAO,KAAK;AAAA,QACV;AAAA,QACA,QAAQ;AAAA,QACR,MAAM,KAAK,gBAAgB,QAAQ,WAAW,eAAe;AAAA,MAC/D;AAAA,IACF,SAAS,OAAO;AACd,UAAI,iBAAiB,SAAS,iBAAiB,SAAS,MAAM,gBAAgB,MAAM;AAClF,eAAO,KAAK,aAAa,QAAQ,QAAQ,WAAW,MAAM,KAAK,aAAa,QAAQ,WAAW,eAAe,CAAC;AAAA,MACjH;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,aACN,MACA,WACA,YACkB;AAClB,WAAO;AAAA,MACL,YAAY,oBAAoB,UAAU;AAAA,MAC1C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,SAM5B;AACA,SAAO;AAAA,IACL,GAAG,SAAS,WAAW,QAAQ,OAAO;AAAA,IACtC,GAAG,SAAS,YAAY,QAAQ,QAAQ;AAAA,EAC1C;AACF;;;AC7BO,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YACE,MACA,SACA,WAAW,GACX,SACA,cAAc,OACd;AACA,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,QAAI,YAAY,QAAW;AACzB,WAAK,UAAU;AAAA,IACjB;AACA,SAAK,WAAW;AAChB,SAAK,cAAc;AAAA,EACrB;AACF;;;AC5DO,IAAM,yBAAN,MAA6B;AAAA,EACjB;AAAA,EAEjB,YAAY,cAAwD;AAClE,SAAK,UAAU,aAAa;AAAA,EAC9B;AAAA,EAEA,MAAM,MAAM,WAAmB,SAA+E;AAC5G,UAAM,WAAW,MAAM,KAAK,QAAQ,MAAM,SAAS;AAEnD,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR;AAAA,QACA,qBAAqB,SAAS,UAAU,SAAS,MAAM;AAAA,MACzD;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,+BAA+B,MAAM,MAAM;AAAA,EACpD;AACF;;;ACxBA,SAAS,UAAU,SAAAC,cAAa;AAEhC,SAAS,iBAAiB;;;ACFnB,SAAS,uBAAuB,WAAgC;AACrE,QAAM,MAAM,IAAI,IAAI,SAAS;AAE7B,SAAO;AAAA,IACL,SAAS;AAAA,MACP,SAAS,GAAG,IAAI,QAAQ,KAAK,IAAI,IAAI;AAAA,MACrC,cAAc;AAAA,IAChB;AAAA,EACF;AACF;;;ADDA,eAAe,eACb,KACA,SACA,SACqD;AACrD,QAAM,OAAO,uBAAuB,GAAG;AAEvC,MAAI,SAAS,SAAS;AACpB,WAAO,MAAM,QAAQ,MAAM,KAAK,IAAI;AAAA,EACtC;AAEA,QAAM,WAAW,SAAS,YAAY,QAAQ,IAAI,cAAc,QAAQ,IAAI;AAC5E,MAAI,CAAC,UAAU;AACb,WAAO,MAAM,QAAQ,MAAM,KAAK,IAAI;AAAA,EACtC;AAEA,MAAI;AAGF,UAAM,MAAO,MAAM,OAAO,mBAAmB;AAE7C,UAAM,WAAW,MAAM,QAAQ,MAAM,KAAK,EAAE,GAAG,MAAM,OAAO,IAAI,IAAI,gBAAgB,QAAQ,EAAE,CAAQ;AACtG,WAAO;AAAA,EACT,SAAS,OAAO;AAEd,YAAQ,KAAK,sCAAsC,QAAQ,yCAAyC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAC5J,WAAO,MAAM,QAAQ,MAAM,KAAK,IAAI;AAAA,EACtC;AACF;AAEO,IAAM,4BAAN,MAAgC;AAAA,EACpB;AAAA,EAEjB,YAAY,cAAsE;AAChF,SAAK,UAAU,aAAa;AAAA,EAC9B;AAAA,EAEA,MAAM,SAAS,SAMkB;AAC/B,QAAI;AAEJ,QAAI;AACF,iBAAW,MAAM;AAAA,QACf,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,kBAAkB,OAAO;AAAA,MAC3B;AAAA,IACF,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR;AAAA,QACA,sBAAsB,QAAQ,SAAS;AAAA,QACvC;AAAA,QACA;AAAA,UACE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR;AAAA,QACA,sBAAsB,QAAQ,SAAS,UAAU,SAAS,MAAM;AAAA,MAClE;AAAA,IACF;AAEA,UAAM,aAAa,QAAQ,cAAcC,OAAM,KAAK,QAAQ,aAAa,KAAK,cAAc,QAAQ,SAAS,CAAC;AAG9G,UAAM,gBAAgB,SAAS,QAAQ,IAAI,gBAAgB;AAC3D,UAAM,aAAa,gBAAgB,SAAS,eAAe,EAAE,IAAI;AACjE,QAAI;AAGJ,QAAI,SAAS,QAAQ,cAAc,aAAa,GAAG;AACjD,eAAS,MAAM,KAAK,qBAAqB,SAAS,MAAM,YAAY,UAAU;AAAA,IAChF,OAAO;AACL,eAAS,MAAM,KAAK,iBAAiB,QAAQ;AAAA,IAC/C;AAGA,UAAM,KAAK,QAAQ,UAAU,YAAY,MAAM;AAE/C,UAAM,kBAAkB,OAAO;AAC/B,QAAI,kBAAkB,GAAG;AACvB,cAAQ,MAAM,cAAc,YAAY,eAAe,CAAC,OAAO,UAAU,EAAE;AAAA,IAC7E;AAEA,WAAO;AAAA,MACL,cAAc,OAAO;AAAA,MACrB,WAAW;AAAA,MACX;AAAA,MACA,WAAW,QAAQ;AAAA,IACrB;AAAA,EACF;AAAA;AAAA,EAEsB,MAAc,qBAClC,MACA,YACA,aACiB;AACjB,UAAM,SAAS,KAAK,UAAU;AAC9B,UAAM,SAAuB,CAAC;AAC9B,QAAI,gBAAgB;AACpB,UAAM,YAAY,KAAK,IAAI;AAE3B,UAAM,cAAc,IAAI,UAAU;AAAA,MAChC,QAAQ,wBAAwB,WAAW,EAAE;AAAA,MAC7C,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,MACnB,YAAY;AAAA,MACZ,KAAK;AAAA,MACL,SAAS;AAAA,IACX,CAAC;AAED,gBAAY,MAAM,YAAY,CAAC;AAE/B,QAAI;AACF,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAI,KAAM;AACV,eAAO,KAAK,KAAK;AACjB,yBAAiB,MAAM;AACvB,oBAAY,OAAO,aAAa;AAAA,MAClC;AAAA,IACF,UAAE;AACA,kBAAY,KAAK;AACjB,aAAO,YAAY;AAAA,IACrB;AAEA,WAAO,OAAO,OAAO,MAAM;AAAA,EAC7B;AAAA,EAEA,MAAc,iBACZ,UACiB;AACjB,UAAM,UAAU,MAAM,SAAS,YAAY;AAC3C,WAAO,mBAAmB,aAAa,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO;AAAA,EACnF;AACF;AAEA,SAAS,wBAAwB,WAAmB,SAAiB;AACnE,SAAO,CAAC,UAAmB,WAAoF;AAC7G,UAAM,WAAW,KAAK,IAAI,IAAI,aAAa;AAC3C,UAAM,QAAQ,UAAU,IAAI,OAAO,QAAQ,UAAU;AAErD,UAAM,gBAAgB,KAAK,MAAM,OAAO,WAAW,OAAO;AAC1D,UAAM,MAAM,SAAI,OAAO,aAAa,IAAI,SAAI,OAAO,UAAU,aAAa;AAE1E,UAAM,cAAc,OAAO,WAAW,KAAK,QAAQ,CAAC;AACpD,WAAO,eAAe,GAAG,IAAI,UAAU,OAAO,YAAY,KAAK,CAAC,YAAY,UAAU,OAAO,GAAG,CAAC,MAAM,YAAY,OAAO,KAAK,CAAC,MAAM,YAAY,OAAO,KAAK,CAAC;AAAA,EACjK;AACF;AAEA,SAAS,cAAc,WAA2B;AAChD,QAAM,OAAO,SAAS,IAAI,IAAI,SAAS,EAAE,QAAQ;AACjD,SAAO,QAAQ;AACjB;AAEA,SAAS,YAAY,OAAuB;AAC1C,MAAI,UAAU,EAAG,QAAO;AACxB,QAAM,IAAI;AACV,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,IAAI;AACpC,QAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AAClD,SAAO,YAAY,QAAQ,KAAK,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,MAAM,MAAM,CAAC;AACxE;AAEA,SAAS,UAAU,SAAyB;AAC1C,MAAI,CAAC,SAAS,OAAO,KAAK,WAAW,EAAG,QAAO;AAC/C,QAAM,IAAI,KAAK,MAAM,OAAO;AAC5B,MAAI,KAAK,MAAM;AACb,UAAM,IAAI,KAAK,MAAM,IAAI,IAAI;AAC7B,UAAMC,KAAI,KAAK,MAAO,IAAI,OAAQ,EAAE;AACpC,UAAMC,OAAM,IAAI;AAChB,WAAO,GAAG,CAAC,IAAI,OAAOD,EAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAOC,IAAG,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,EAC3E;AACA,QAAM,IAAI,KAAK,MAAM,IAAI,EAAE;AAC3B,QAAM,MAAM,IAAI;AAChB,SAAO,GAAG,CAAC,IAAI,OAAO,GAAG,EAAE,SAAS,GAAG,GAAG,CAAC;AAC7C;AAEA,SAAS,kBAAkB,SAMzB;AACA,SAAO;AAAA,IACL,GAAI,QAAQ,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,QAAQ,QAAQ;AAAA,IACpE,GAAI,QAAQ,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,QAAQ,SAAS;AAAA,EACzE;AACF;;;AE5MA,SAAS,YAAAC,WAAU,SAAS,SAAAC,cAAa;AAMlC,IAAM,yBAAN,MAA6B;AAAA,EACjB;AAAA,EAEjB,YAAY,cAAsE;AAChF,SAAK,UAAU,aAAa;AAAA,EAC9B;AAAA,EAEA,MAAM,SAAS,SAIkB;AAC/B,UAAM,mBAAmB,MAAM,KAAK,QAAQ;AAAA,MAC1C,QAAQ;AAAA,MACR,uBAAuB,QAAQ,SAAS;AAAA,IAC1C;AAEA,QAAI,CAAC,iBAAiB,IAAI;AACxB,YAAM,IAAI;AAAA,QACR;AAAA,QACA,sBAAsB,QAAQ,SAAS,UAAU,iBAAiB,MAAM;AAAA,MAC1E;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,iBAAiB,KAAK;AAC7C,UAAM,cAAc,0BAA0B,UAAU,QAAQ,SAAS;AAEzE,UAAM,SAAmB,CAAC;AAG1B,UAAM,mBAAmB,MAAM,QAAQ;AAAA,MACrC,YAAY,IAAI,CAAC,eAAe,KAAK,QAAQ,MAAM,YAAY,uBAAuB,UAAU,CAAC,CAAC;AAAA,IACpG;AAEA,aAAS,IAAI,GAAG,IAAI,iBAAiB,QAAQ,KAAK;AAChD,YAAM,kBAAkB,iBAAiB,CAAC;AAC1C,YAAM,aAAa,YAAY,CAAC;AAEhC,UAAI,CAAC,mBAAmB,CAAC,YAAY;AACnC,cAAM,IAAI;AAAA,UACR;AAAA,UACA,8BAA8B,CAAC;AAAA,QACjC;AAAA,MACF;AAEA,UAAI,CAAC,gBAAgB,IAAI;AACvB,cAAM,IAAI;AAAA,UACR;AAAA,UACA,sBAAsB,UAAU,UAAU,gBAAgB,MAAM;AAAA,QAClE;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,gBAAgB,YAAY;AAClD,aAAO,KAAK,mBAAmB,aAAa,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO,CAAC;AAAA,IACzF;AAEA,UAAM,SAAS,OAAO,OAAO,MAAM;AACnC,UAAM,aACJ,QAAQ,cACRC,OAAM,KAAK,QAAQ,aAAa,KAAK,GAAG,eAAeC,UAAS,IAAI,IAAI,QAAQ,SAAS,EAAE,QAAQ,CAAC,CAAC,KAAK;AAC5G,UAAM,KAAK,QAAQ,UAAU,YAAY,MAAM;AAE/C,WAAO;AAAA,MACL,cAAc,OAAO;AAAA,MACrB,WAAW;AAAA,MACX;AAAA,MACA,WAAW,QAAQ;AAAA,IACrB;AAAA,EACF;AACF;AAEA,SAAS,eAAe,OAAuB;AAC7C,QAAM,YAAY,QAAQ,KAAK;AAC/B,SAAO,UAAU,WAAW,IAAI,QAAQ,MAAM,MAAM,GAAG,CAAC,UAAU,MAAM;AAC1E;AAEA,SAAS,0BAA0B,UAAkB,WAA6B;AAChF,QAAM,OAAiB,CAAC;AAExB,aAAW,WAAW,SAAS,MAAM,QAAQ,GAAG;AAC9C,UAAM,OAAO,QAAQ,KAAK;AAE1B,QAAI,KAAK,WAAW,GAAG;AACrB;AAAA,IACF;AAEA,UAAM,SAAS,+BAA+B,KAAK,IAAI,IAAI,CAAC;AAC5D,QAAI,QAAQ;AACV,WAAK,KAAK,IAAI,IAAI,QAAQ,SAAS,EAAE,SAAS,CAAC;AAC/C;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,WAAW,GAAG,GAAG;AACzB,WAAK,KAAK,IAAI,IAAI,MAAM,SAAS,EAAE,SAAS,CAAC;AAAA,IAC/C;AAAA,EACF;AAEA,SAAO;AACT;;;ACxGA,SAAS,QAAAC,aAAY;AAId,IAAM,wBAAN,MAA4B;AAAA,EACjC,MAAM,SAAS,SAIkB;AAC/B,UAAM,aAAa,QAAQ,cAAcC,MAAK,QAAQ,aAAa,KAAK,KAAK,cAAc,QAAQ,SAAS,CAAC;AAE7G,UAAM,EAAE,SAAS,IAAI,MAAM,KAAK,eAAe;AAC/C,QAAI,CAAC,UAAU;AACb,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,MAAM,SAAS,OAAO,EAAE,UAAU,KAAK,CAAC;AACxD,QAAI;AACF,YAAM,UAAU,MAAM,QAAQ,WAAW;AACzC,YAAM,OAAO,MAAM,QAAQ,QAAQ;AAEnC,YAAM,kBAAkB,KAAK,aAAa,UAAU;AACpD,YAAM,KAAK,KAAK,QAAQ,WAAW,EAAE,WAAW,OAAO,CAAC;AACxD,YAAM,KAAK,eAAe,GAAI;AAE9B,YAAM,WAAW,MAAM;AACvB,YAAM,SAAS,OAAO,UAAU;AAEhC,aAAO;AAAA,QACL,WAAW;AAAA,QACX;AAAA,QACA,WAAW,QAAQ;AAAA,MACrB;AAAA,IACF,UAAE;AACA,YAAM,QAAQ,MAAM;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAc,iBAAyG;AACrH,QAAI;AACF,aAAO,MAAM,mBAAmB,YAAY;AAAA,IAC9C,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAc,WAA2B;AAC/C,QAAI;AACF,YAAM,MAAM,IAAI,IAAI,SAAS;AAC7B,YAAM,OAAO,IAAI,SAAS,MAAM,GAAG,EAAE,IAAI;AACzC,aAAO,QAAQ,KAAK,SAAS,IAAI,OAAO;AAAA,IAC1C,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,IAAM,qBAAqB,IAAI;AAAA,EAC7B;AAAA,EACA;AACF;;;ACvEO,SAAS,cAAc,UAA0B;AACtD,QAAM,WAAW,SAAS,MAAM,GAAG;AACnC,SAAO,SACJ,IAAI,CAAC,YAAY;AAChB,QAAI,QAAQ,SAAS,KAAK,QAAQ,WAAW,CAAC,IAAI,KAAK;AACrD,aAAO,mBAAmB,OAAO;AAAA,IACnC;AACA,WAAO;AAAA,EACT,CAAC,EACA,KAAK,GAAG;AACb;AAOO,SAAS,mBAAmBC,QAAyC;AAC1E,MAAI;AACJ,MAAI;AACF,UAAM,IAAI,IAAIA,MAAK;AAAA,EACrB,QAAQ;AAEN,UAAM,SAAS,IAAI,IAAIA,OAAM,WAAW,MAAM,IAAIA,SAAQ,WAAWA,MAAK,EAAE;AAC5E,WAAO,WAAW,cAAc,OAAO,QAAQ;AAC/C,UAAM;AAAA,EACR;AAEA,MAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAS,IAAI,QAAQ,GAAG;AAC/C,UAAM,IAAI,kBAAkB,2BAA2B,4BAA4BA,MAAK,EAAE;AAAA,EAC5F;AAEA,MAAI,kBAAkB,KAAK,IAAI,IAAI,GAAG;AACpC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,IAAI;AAAA,IACX;AAAA,EACF;AAEA,MAAI,iBAAiB,KAAK,IAAI,IAAI,GAAG;AACnC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,IAAI;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,KAAK,IAAI;AAAA,EACX;AACF;;;ACrCO,IAAM,uBAAN,MAA2B;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,cAAgD;AAC1D,SAAK,eAAe,aAAa;AACjC,SAAK,YAAY,aAAa;AAC9B,SAAK,eAAe,aAAa;AACjC,SAAK,gBAAgB,aAAa;AAAA,EACpC;AAAA,EAEA,MAAM,SAAS,SAOkB;AAC/B,UAAM,aAAa,mBAAmB,QAAQ,KAAK;AAGnD,QAAI,WAAW,SAAS,UAAU,KAAK,eAAe;AACpD,YAAMC,WAAU,MAAM,KAAK,aAAa,MAAM;AAAA,QAC5C,MAAM,QAAQ;AAAA,QACd,WAAW,WAAW;AAAA,QACtB,GAAGC,mBAAkB,OAAO;AAAA,MAC9B,CAAC;AACD,YAAMC,aAAYF,SAAQ,WAAW,CAAC;AACtC,UAAI,CAACE,YAAW;AACd,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,UAAIA,WAAU,SAAS,QAAQ;AAC7B,eAAO,KAAK,UAAU,SAAS,2BAA2B,SAASA,WAAU,GAAG,CAAC;AAAA,MACnF;AACA,aAAO,KAAK,cAAc,SAAS,2BAA2B,SAASA,WAAU,GAAG,CAAC;AAAA,IACvF;AAEA,QAAI,WAAW,SAAS,QAAQ;AAC9B,aAAO,KAAK,UAAU,SAAS,2BAA2B,SAAS,WAAW,GAAG,CAAC;AAAA,IACpF;AAIA,QAAI,KAAK,eAAe;AACtB,UAAI;AACF,eAAO,MAAM,KAAK,cAAc,SAAS,2BAA2B,SAAS,WAAW,GAAG,CAAC;AAAA,MAC9F,SAAS,OAAO;AAEd,YAAI,iBAAiB,qBAAqB,MAAM,SAAS,6BAA6B;AAAA,QAEtF,WAAW,CAAC,yBAAyB,KAAK,GAAG;AAC3C,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAGA,QAAI,WAAW,SAAS,OAAO;AAC7B,aAAO,KAAK,aAAa,SAAS,2BAA2B,SAAS,WAAW,GAAG,CAAC;AAAA,IACvF;AAGA,UAAM,UAAU,MAAM,KAAK,aAAa,MAAM;AAAA,MAC5C,MAAM,QAAQ;AAAA,MACd,WAAW,WAAW;AAAA,MACtB,GAAGD,mBAAkB,OAAO;AAAA,IAC9B,CAAC;AACD,UAAM,YAAY,QAAQ,WAAW,CAAC;AAEtC,QAAI,CAAC,WAAW;AACd,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,UAAU,SAAS,OAAO;AAC5B,aAAO,KAAK,aAAa,SAAS,2BAA2B,SAAS,UAAU,GAAG,CAAC;AAAA,IACtF;AAEA,WAAO,KAAK,UAAU,SAAS,2BAA2B,SAAS,UAAU,GAAG,CAAC;AAAA,EACnF;AACF;AAEA,SAAS,yBAAyB,OAAyB;AACzD,SAAO,iBAAiB,SAAS,MAAM,QAAQ,SAAS,8BAA8B;AACxF;AAEA,SAASA,mBAAkB,SAMzB;AACA,SAAO;AAAA,IACL,GAAI,QAAQ,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,QAAQ,QAAQ;AAAA,IACpE,GAAI,QAAQ,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,QAAQ,SAAS;AAAA,EACzE;AACF;AAEA,SAAS,2BACP,SAMA,WAOA;AACA,SAAO;AAAA,IACL,GAAG,SAAS,aAAa,QAAQ,SAAS;AAAA,IAC1C,GAAG,SAAS,cAAc,QAAQ,UAAU;AAAA,IAC5C,GAAG,SAAS,WAAW,QAAQ,OAAO;AAAA,IACtC,GAAG,SAAS,YAAY,QAAQ,QAAQ;AAAA,IACxC;AAAA,EACF;AACF;;;AChJA,SAAS,WAAAE,gBAAsB;;;ACAxB,IAAM,6BAA6B;AAAA,EACxC,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AACd;;;ACKO,SAAS,gBAAgB,SAAyC;AACvE,QAAM,OAAO;AAAA,IACX;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,2BAA2B;AAAA,EAC7B;AAEA,MAAI,QAAQ,cAAc;AACxB,SAAK,KAAK,QAAQ,QAAQ,YAAY;AAAA,EACxC;AAEA,MAAI,QAAQ,YAAY;AACtB,UAAM,CAAC,OAAO,MAAM,IAAI,QAAQ,WAAW,MAAM,GAAG;AACpD,SAAK,KAAK,OAAO,SAAS,KAAK,IAAI,MAAM,EAAE;AAAA,EAC7C;AAEA,OAAK;AAAA,IACH;AAAA,IACA,2BAA2B;AAAA,IAC3B;AAAA,IACA,QAAQ,gBAAgB,2BAA2B;AAAA,IACnD,QAAQ;AAAA,EACV;AAEA,SAAO;AACT;AAEO,SAAS,kBAAkB,QAAmE;AACnG,SAAO,OAAO,SAAS,KAAK,OAAO,OAAO,SAAS,gBAAgB;AACrE;;;AF7BO,IAAM,0BAAN,MAA8B;AAAA,EAClB;AAAA,EAEjB,YAAY,cAA2D;AACrE,SAAK,UAAU,aAAa;AAAA,EAC9B;AAAA,EAEA,MAAM,SAAS,SAAmE;AAChF,UAAM,QAAQ,MAAM,KAAK,QAAQ,SAAS,UAAU,CAAC,UAAU,CAAC;AAEhE,QAAI,CAAC,kBAAkB,KAAK,GAAG;AAC7B,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aAAa,QAAQ,cAAc,iBAAiB,QAAQ,WAAW,MAAM;AACnF,UAAM,aAAa,MAAM,KAAK,QAAQ;AAAA,MACpC;AAAA,MACA,gBAAgB;AAAA,QACd,WAAW,QAAQ;AAAA,QACnB;AAAA,QACA,GAAI,QAAQ,eAAe,EAAE,cAAc,QAAQ,aAAa,IAAI,CAAC;AAAA,QACrE,GAAI,QAAQ,aAAa,EAAE,YAAY,QAAQ,WAAW,IAAI,CAAC;AAAA,QAC/D,GAAI,QAAQ,eAAe,EAAE,cAAc,QAAQ,aAAa,IAAI,CAAC;AAAA,MACvE,CAAC;AAAA,IACH;AAEA,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM,IAAI;AAAA,QACR;AAAA,QACA,WAAW,UAAU;AAAA,MACvB;AAAA,IACF;AAEA,WAAO;AAAA,MACL,cAAc,QAAQ,gBAAgB,2BAA2B;AAAA,MACjE,YAAY,2BAA2B;AAAA,MACvC,OAAO,2BAA2B;AAAA,MAClC,WAAW,QAAQ;AAAA,MACnB;AAAA,MACA,GAAI,QAAQ,aAAa,EAAE,YAAY,QAAQ,WAAW,IAAI,CAAC;AAAA,MAC/D,GAAI,QAAQ,eAAe,EAAE,cAAc,QAAQ,aAAa,IAAI,CAAC;AAAA,IACvE;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,MAAc,eAA+B;AACrE,QAAM,mBAAmBC,SAAQ,IAAI;AACrC,SAAO,iBAAiB,WAAW,IAC/B,GAAG,IAAI,GAAG,aAAa,KACvB,GAAG,KAAK,MAAM,GAAG,CAAC,iBAAiB,MAAM,CAAC,GAAG,aAAa;AAChE;;;AGhEA,SAAS,SAAAC,cAAa;AAQf,SAAS,4BAA4B,QAAkC;AAC5E,SAAO,KAAK;AAAA,IACV;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,OAAO,OAAO,WAAW;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,gCAAgC,QAAqC;AACnF,SAAO,KAAK;AAAA,IACV;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,mCAAmC,QAAwC;AACzF,SAAO,KAAK;AAAA,IACV;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,8BACd,MACA,SACA,SACQ;AACR,SAAO,KAAK;AAAA,IACV;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,QAAQ;AAAA,MAC7C;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,6BAA6B,QAAkC;AAC7E,SAAO,4BAA4B;AAAA,IACjC,CAAC,QAAQ,OAAO,UAAU,MAAM;AAAA,IAChC,GAAG,OAAO,WAAW,IAAI,CAAC,cAAc;AAAA,MACtC,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,OAAO;AAAA,IACT,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,4BAA4B,MAA0B;AACpE,SAAOA,OAAM,IAAI;AACnB;;;AhBjDA,IAAM,qBAAqBC,GAAE,OAAO;AAAA,EAClC,QAAQA,GAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,EAChD,MAAMA,GAAE,KAAK,CAAC,QAAQ,WAAW,MAAM,CAAC,EAAE,QAAQ,MAAM;AAAA,EACxD,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,WAAWA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AACtC,CAAC;AAED,IAAM,wBAAwBA,GAAE,OAAO;AAAA,EACrC,QAAQA,GAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,EAChD,MAAMA,GAAE,KAAK,CAAC,QAAQ,WAAW,MAAM,CAAC,EAAE,QAAQ,MAAM;AAAA,EACxD,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,WAAWA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AACtC,CAAC;AAED,IAAM,wBAAwBA,GAAE,OAAO;AAAA,EACrC,cAAcA,GAAE,OAAO,EAAE,SAAS;AAAA,EAClC,QAAQA,GAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,EAChD,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,cAAcA,GAAE,OAAO,EAAE,SAAS;AACpC,CAAC;AAEM,SAAS,sBACd,SACA,cACM;AACN,QAAM,QAAQ,QAAQ,QAAQ,OAAO,EAAE,YAAY,8CAA8C;AACjG,QAAM,kBAAkB,IAAI,0BAA0B;AAAA,IACpD,SAAS,aAAa;AAAA,EACxB,CAAC;AACD,QAAM,eAAe,IAAI,uBAAuB;AAAA,IAC9C,SAAS,aAAa;AAAA,EACxB,CAAC;AACD,QAAM,eAAe,IAAI,kBAAkB;AAAA,IACzC,iBAAiB,CAAC,WAAW,SAAS,gBAAgB,MAAM,WAAW,IAAI;AAAA,IAC3E,cAAc,CAAC,WAAW,SAAS,aAAa,MAAM,WAAW,IAAI;AAAA,EACvE,CAAC;AACD,QAAM,gBAAgB,IAAI,sBAAsB;AAChD,QAAM,kBAAkB,IAAI,qBAAqB;AAAA,IAC/C,cAAc,IAAI,0BAA0B;AAAA,MAC1C,SAAS,aAAa;AAAA,IACxB,CAAC;AAAA,IACD,WAAW,IAAI,uBAAuB;AAAA,MACpC,SAAS,aAAa;AAAA,IACxB,CAAC;AAAA,IACD;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,qBAAqB,IAAI,wBAAwB;AAAA,IACrD,SAAS,aAAa;AAAA,EACxB,CAAC;AAED,QAAM,QAAQ,OAAO,EAClB,SAAS,WAAW,uBAAuB,EAC3C,OAAO,iBAAiB,cAAc,MAAM,EAC5C,OAAO,qBAAqB,iBAAiB,MAAM,EACnD,OAAO,eAAe,mBAAmB,EACzC,OAAO,mBAAmB,WAAW,EACrC,OAAO,gBAAgB,eAAe,EACtC,OAAO,OAAOC,QAAO,YAAY;AAChC,UAAM,SAAS,mBAAmB,MAAM,wBAAwB,OAAO,CAAC;AACxE,UAAM,SAAS,MAAM,aAAa,MAAM;AAAA,MACtC,MAAM,OAAO;AAAA,MACb,WAAWA;AAAA,MACX,GAAI,OAAO,QAAQ,EAAE,UAAU,OAAO,MAAM,IAAI,CAAC;AAAA,MACjD,GAAI,OAAO,YAAY,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,IAC9C,CAAC;AAED,QAAI,OAAO,WAAW,SAAS;AAC7B,mBAAa,OAAO,GAAG,6BAA6B,MAAM,CAAC;AAAA,CAAI;AAC/D;AAAA,IACF;AAEA,iBAAa,OAAO,GAAG,4BAA4B,MAAM,CAAC;AAAA,CAAI;AAAA,EAChE,CAAC;AAEH,QAAM,QAAQ,UAAU,EACrB,SAAS,WAAW,gCAAgC,EACpD,OAAO,iBAAiB,cAAc,MAAM,EAC5C,OAAO,4BAA4B,kBAAkB,EACrD,OAAO,qBAAqB,iBAAiB,MAAM,EACnD,OAAO,eAAe,mBAAmB,EACzC,OAAO,mBAAmB,WAAW,EACrC,OAAO,gBAAgB,eAAe,EACtC,OAAO,OAAOA,QAAO,YAAY;AAChC,UAAM,SAAS,sBAAsB,MAAM,wBAAwB,OAAO,CAAC;AAC3E,UAAM,SAAS,MAAM,gBAAgB,SAAS;AAAA,MAC5C,OAAAA;AAAA,MACA,MAAM,OAAO;AAAA,MACb,GAAI,OAAO,YAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,MAC1D,GAAI,OAAO,QAAQ,EAAE,UAAU,OAAO,MAAM,IAAI,CAAC;AAAA,MACjD,GAAI,OAAO,YAAY,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,IAC9C,CAAC;AAED,QAAI,OAAO,WAAW,SAAS;AAC7B,mBAAa;AAAA,QACX,GAAG,4BAA4B;AAAA,UAC7B,CAAC,SAAS,OAAO;AAAA,UACjB,CAAC,aAAa,OAAO,SAAS;AAAA,UAC9B,CAAC,cAAc,OAAO,UAAU;AAAA,QAClC,CAAC,CAAC;AAAA;AAAA,MACJ;AACA;AAAA,IACF;AAEA,iBAAa,OAAO,GAAG,gCAAgC,MAAM,CAAC;AAAA,CAAI;AAAA,EACpE,CAAC;AAEH,QAAM,QAAQ,UAAU,EACrB,SAAS,WAAW,wBAAwB,EAC5C,OAAO,8BAA8B,aAAa,EAClD,OAAO,6BAA6B,qCAAqC,EACzE,OAAO,kCAAkC,sBAAsB,EAC/D,OAAO,kCAAkC,sBAAsB,EAC/D,OAAO,qBAAqB,iBAAiB,MAAM,EACnD,OAAO,eAAe,mBAAmB,EACzC,OAAO,OAAOA,QAAO,YAAY;AAChC,UAAM,SAAS,sBAAsB,MAAM,wBAAwB,OAAO,CAAC;AAC3E,UAAM,SAAS,MAAM,mBAAmB,SAAS;AAAA,MAC/C,WAAWA;AAAA,MACX,GAAI,OAAO,eAAe,EAAE,cAAc,OAAO,aAAa,IAAI,CAAC;AAAA,MACnE,GAAI,OAAO,aAAa,EAAE,YAAY,OAAO,WAAW,IAAI,CAAC;AAAA,MAC7D,GAAI,OAAO,aAAa,EAAE,YAAY,OAAO,WAAW,IAAI,CAAC;AAAA,MAC7D,GAAI,OAAO,eAAe,EAAE,cAAc,OAAO,aAAa,IAAI,CAAC;AAAA,IACrE,CAAC;AAED,QAAI,OAAO,WAAW,SAAS;AAC7B,mBAAa;AAAA,QACX,GAAG,4BAA4B;AAAA,UAC7B,CAAC,SAAS,OAAO;AAAA,UACjB,CAAC,SAAS,OAAO,KAAK;AAAA,UACtB,CAAC,cAAc,OAAO,UAAU;AAAA,QAClC,CAAC,CAAC;AAAA;AAAA,MACJ;AACA;AAAA,IACF;AAEA,iBAAa,OAAO,GAAG,mCAAmC,MAAM,CAAC;AAAA,CAAI;AAAA,EACvE,CAAC;AACL;AAEO,SAAS,wBACd,OACA,cACoB;AACpB,MAAI,iBAAiB,mBAAmB;AACtC,UAAM,UAAW,MAAgC;AACjD,iBAAa;AAAA,MACX,GAAG;AAAA,QACD,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,MACF,CAAC;AAAA;AAAA,IACH;AACA,WAAO,MAAM;AAAA,EACf;AAEA,SAAO;AACT;AAEO,SAAS,wBAAwE,SAEtF;AACA,MAAI,QAAQ,OAAO;AACjB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ;AAClB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,6CAA6C;AAC/D;;;AiB9MA,SAAS,KAAAC,UAAS;;;ACDlB,SAAS,SAAAC,cAAa;AAIf,SAAS,wBAAwB,SAA8B;AACpE,SAAO,KAAK;AAAA,IACV;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,gCAAgC,MAAmC;AACjF,SAAO,KAAK;AAAA,IACV;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,iCAAiC,MAAmC;AAClF,SAAOA,OAAM;AAAA,IACX,CAAC,MAAM,SAAS,UAAU,eAAe,KAAK;AAAA,IAC9C,GAAG,KAAK,MAAM,IAAI,CAAC,SAAS;AAAA,MAC1B,OAAO,KAAK,EAAE;AAAA,MACd,KAAK;AAAA,MACL,KAAK,cAAc;AAAA,MACnB,KAAK,aAAa,SAAS;AAAA,MAC3B,KAAK;AAAA,IACP,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,6BACd,MACA,SACA,SACQ;AACR,SAAO,KAAK;AAAA,IACV;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,QAAQ;AAAA,MAC7C;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC4DO,IAAM,mBAAN,cAA+B,MAAM;AAAA,EAC1C,YACkB,MAChB,SACgB,UACA,SAChB;AACA,UAAM,OAAO;AALG;AAEA;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;;;AC9GO,IAAM,uBAA+C;AAAA,EAC1D,QAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,6BAA6B;AAAA,EAC7B,cACE;AACJ;AAEA,IAAM,4BAA4B;AAClC,IAAM,6BAA6B;AACnC,IAAM,0BAA0B,oBAAI,IAA4B,CAAC,MAAM,YAAY,CAAC;AAEpF,IAAM,oBAA4C;AAAA,EAChD,QAAQ;AAAA,EACR,mBAAmB,qBAAqB,iBAAiB;AAAA,EACzD,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,cAAc,qBAAqB,YAAY;AACjD;AAmGO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAA6B,SAA8D;AAA9D;AAAA,EAA+D;AAAA,EAE5F,MAAM,WAAW,WAAyC;AACxD,oBAAgB,SAAS;AACzB,UAAM,UAAU,wBAAwB,SAAS;AACjD,UAAM,OAAO,MAAM,KAAK,QAAQ,iBAAiB,OAAO;AACxD,UAAM,eAAe,kBAAkB,IAAI;AAC3C,UAAM,gBAAgB,aAAa;AACnC,UAAM,aAAa,eAAe,mBAAmB;AAErD,QAAI,CAAC,YAAY;AACf,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAc,WAAW,iBAAiB;AAChD,UAAM,YAAY,eAAe,wBAAwB,CAAC;AAC1D,UAAM,cAAc,WAAW,eAAe;AAC9C,UAAM,UAAuB;AAAA,MAC3B,QAAQ,YAAY,YAAY,SAAS;AAAA,MACzC,SAAS;AAAA,QACP,MAAM;AAAA,QACN,YAAY,kBAAkB,WAAW;AAAA,MAC3C;AAAA,MACA,IAAI,OAAO,WAAW,UAAU,SAAS;AAAA,MACzC,cAAc,WAAW,cAAc,CAAC;AAAA,MACxC,QAAQ,cAAc,WAAW;AAAA,MACjC,iBAAiB,eAAe,eAAe,qBAAqB,CAAC,GAAG,IAAI,CAAC,UAAU;AAAA,QACrF,IAAI,KAAK;AAAA,QACT,OAAO,KAAK;AAAA,MACd,EAAE;AAAA,MACF,iBAAiB,UAAU,kBAAkB,CAAC,GAAG,IAAI,CAAC,SAAS;AAC7D,cAAM,WAAgC;AAAA,UACpC,IAAI,KAAK;AAAA,UACT,OAAO,KAAK;AAAA,QACd;AAEA,YAAI,KAAK,gBAAgB,QAAW;AAClC,mBAAS,UAAU,KAAK;AAAA,QAC1B;AACA,YAAI,KAAK,gBAAgB,QAAW;AAClC,mBAAS,cAAc,KAAK;AAAA,QAC9B;AACA,YAAI,KAAK,cAAc,QAAW;AAChC,mBAAS,QAAQ,KAAK;AAAA,QACxB;AAEA,eAAO;AAAA,MACT,CAAC;AAAA,MACD,eAAe,eAAe,kBAAkB,MAAM,oBAAoB,CAAC;AAAA,MAC3E,aAAa;AAAA,QACX,KAAK,cAAc,IAAI,KAAK,WAAW,EAAE,YAAY,IAAI;AAAA,QACzD,OAAO,cAAc,gBAAgB,WAAW,IAAI;AAAA,QACpD,IAAI;AAAA,MACN;AAAA,MACA,kBAAkB,UAAU,qBAAqB,CAAC,GAAG,IAAI,CAAC,SAAS;AACjE,cAAM,WAAgC;AAAA,UACpC,IAAI,KAAK;AAAA,UACT,OAAO,KAAK;AAAA,QACd;AACA,cAAM,SAAS,KAAK,UAAU,KAAK;AAEnC,YAAI,WAAW,QAAW;AACxB,mBAAS,SAAS;AAAA,QACpB;AACA,YAAI,KAAK,gBAAgB,QAAW;AAClC,mBAAS,QAAQ,KAAK;AAAA,QACxB;AACA,YAAI,KAAK,UAAU,QAAW;AAC5B,mBAAS,QAAQ,KAAK;AAAA,QACxB;AAEA,eAAO;AAAA,MACT,CAAC;AAAA,MACD;AAAA,MACA,OAAO,WAAW,eAAe,WAAW,eAAe,eAAe,SAAS;AAAA,MACnF,SAAS,WAAW,WAAW;AAAA,MAC/B,OAAO,WAAW,eAAe;AAAA,MACjC,KAAK,QAAQ;AAAA,IACf;AAEA,QAAI,WAAW,uBAAuB,QAAW;AAC/C,cAAQ,qBAAqB,WAAW;AAAA,IAC1C;AAEA,QAAI,WAAW,eAAe,QAAW;AACvC,cAAQ,aAAa,WAAW;AAAA,IAClC;AAEA,QAAI,UAAU,UAAU;AACtB,cAAQ,cAAc;AAAA,QACpB,IAAI,UAAU,SAAS;AAAA,QACvB,OAAO,UAAU,SAAS;AAAA,MAC5B;AAEA,UAAI,UAAU,SAAS,gBAAgB,QAAW;AAChD,gBAAQ,YAAY,UAAU,UAAU,SAAS;AAAA,MACnD;AACA,UAAI,UAAU,SAAS,gBAAgB,QAAW;AAChD,gBAAQ,YAAY,cAAc,UAAU,SAAS;AAAA,MACvD;AACA,UAAI,UAAU,SAAS,cAAc,QAAW;AAC9C,gBAAQ,YAAY,QAAQ,UAAU,SAAS;AAAA,MACjD;AAAA,IACF;AAEA,QAAI,WAAW,eAAe,QAAW;AACvC,cAAQ,aAAa,WAAW;AAAA,IAClC;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,mBAAmB,SAGQ;AAC/B,UAAM,UAAU,wBAAwB,QAAQ,OAAO;AACvD,UAAM,YAAY,eAAe,QAAQ,KAAK;AAC9C,UAAM,mBAAmB,qCAAqC,OAAO;AACrE,UAAM,gBAAgB,MAAM,KAAK,QAAQ,iBAAiB,gBAAgB;AAC1E,UAAM,iBAAiB,kBAAkB,aAAa;AACtD,UAAM,gBAAgB,eAAe,aAAa;AAElD,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,CAAC,GAAG,oBAAoB,cAAc,YAAY,CAAC,CAAC,CAAC;AACnE,QAAI,eAAe,cAAc,gBAAgB;AACjD,QAAI,cAAc,cAAc,eAAe;AAC/C,QAAI,eAAe;AAEnB,WAAO,eAAe,aAAa,eAAe,cAAc;AAC9D,YAAM,UAAU,oCAAoC,SAAS,YAAY;AACzE,YAAM,WAAW,6BAA6B,MAAM,KAAK,QAAQ,UAAU,OAAO,CAAC;AACnF,YAAM,WAAW,SAAS,QAAQ,CAAC;AAEnC,YAAM,KAAK,GAAG,oBAAoB,SAAS,YAAY,CAAC,CAAC,CAAC;AAC1D,qBAAe,SAAS,gBAAgB;AACxC,oBAAc,SAAS,eAAe;AACtC,sBAAgB;AAAA,IAClB;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA,kBAAkB;AAAA,QAClB,UAAU;AAAA,QACV,YAAY,MAAM;AAAA,MACpB;AAAA,MACA,SAAS;AAAA,QACP,WAAW;AAAA,QACX,kBAAkB;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,WAA2B;AAC7D,kBAAgB,SAAS;AACzB,SAAO,sBAAsB,SAAS;AACxC;AAEO,SAAS,wBAAwB,WAAgC;AACtE,SAAO;AAAA,IACL,SAAS;AAAA,IACT,KAAK,oBAAoB,SAAS;AAAA,EACpC;AACF;AAEO,SAAS,qCAAqC,SAA8C;AACjG,SAAO;AAAA,IACL,SAAS;AAAA,IACT,KAAK,gCAAgC,OAAO;AAAA,EAC9C;AACF;AAEO,SAAS,oCACd,SACA,cACA,YAAY,KAAK,IAAI,GACJ;AACjB,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,YAAY;AAAA,MACZ;AAAA,MACA,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,WAAW;AAAA,QACX;AAAA,QACA,QAAQ;AAAA,QACR,YAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,GAAG;AAAA,MACH,SAAS,gCAAgC,OAAO;AAAA,IAClD;AAAA,IACA,KAAK;AAAA,EACP;AACF;AAEA,SAAS,gBAAgB,WAAyB;AAChD,MAAI,CAAC,QAAQ,KAAK,SAAS,GAAG;AAC5B,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,SAAyC;AACxE,MAAI,wBAAwB,IAAI,OAAiC,GAAG;AAClE,WAAO;AAAA,EACT;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,MACA,mBAAmB,CAAC,GAAG,uBAAuB;AAAA,IAChD;AAAA,EACF;AACF;AAEA,SAAS,eAAe,OAAmC;AACzD,QAAM,QAAQ,SAAS;AAEvB,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ,IAAI;AACvD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,MAAgC;AACzD,QAAM,QAAQ,wDAAwD,KAAK,IAAI;AAE/E,MAAI,CAAC,QAAQ,CAAC,GAAG;AACf,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACF,WAAO,KAAK,MAAM,MAAM,CAAC,CAAC;AAAA,EAC5B,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,cAAc,MAAkC;AACvD,SAAO,CAAC,GAAG,KAAK,SAAS,gBAAgB,CAAC,EAAE,IAAI,CAAC,OAAO,UAAU;AAChE,UAAM,MAAM,MAAM,CAAC;AACnB,WAAO;AAAA,MACL,OAAO,QAAQ;AAAA,MACf,MAAM,aAAa,KAAK,mBAAmB;AAAA,MAC3C,KAAK,aAAa,KAAK,KAAK,KAAK;AAAA,IACnC;AAAA,EACF,CAAC,EAAE,OAAO,CAAC,UAAU,MAAM,GAAG;AAChC;AAEA,SAAS,6BAA6B,UAA+C;AACnF,MAAI;AACF,UAAM,WAAW,KAAK,MAAM,QAAQ;AAEpC,QAAI,SAAS,SAAS,GAAG;AACvB,YAAM,IAAI;AAAA,QACR;AAAA,QACA,SAAS,OAAO;AAAA,QAChB;AAAA,QACA;AAAA,UACE,MAAM,SAAS;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,iBAAiB,kBAAkB;AACrC,YAAM;AAAA,IACR;AAEA,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,OAAwD;AACnF,SAAO,MAAM,IAAI,CAAC,SAAS;AACzB,UAAM,WAAW,KAAK,oBAAoB,CAAC;AAC3C,UAAM,SAA8B;AAAA,MAClC,IAAI,KAAK;AAAA,MACT,OAAO,SAAS,eAAe;AAAA,MAC/B,KAAK,sBAAsB,KAAK,MAAM;AAAA,IACxC;AAEA,QAAI,SAAS,eAAe,QAAW;AACrC,aAAO,aAAa,SAAS;AAAA,IAC/B;AACA,QAAI,SAAS,gBAAgB,QAAW;AACtC,aAAO,cAAc,SAAS;AAAA,IAChC;AACA,QAAI,SAAS,gBAAgB,QAAW;AACtC,aAAO,QAAQ,SAAS;AAAA,IAC1B;AACA,QAAI,SAAS,gBAAgB,QAAW;AACtC,aAAO,cAAc;AAAA,QACnB,KAAK,IAAI,KAAK,SAAS,WAAW,EAAE,YAAY;AAAA,QAChD,OAAO,gBAAgB,SAAS,WAAW;AAAA,QAC3C,IAAI,SAAS;AAAA,MACf;AAAA,IACF;AACA,QAAI,KAAK,UAAU,QAAW;AAC5B,aAAO,QAAQ,KAAK;AAAA,IACtB;AACA,QAAI,SAAS,YAAY,QAAW;AAClC,aAAO,UAAU,SAAS;AAAA,IAC5B;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,kBAAkB,MAAwB;AACjD,SAAO,KACJ,QAAQ,+BAA+B,EAAE,EACzC,QAAQ,6BAA6B,EAAE,EACvC,QAAQ,YAAY,IAAI,EACxB,MAAM,KAAK,EACX,IAAI,CAAC,UAAU,mBAAmB,KAAK,EAAE,KAAK,CAAC,EAC/C,OAAO,OAAO;AACnB;AAEA,SAAS,aAAa,KAAa,MAA6B;AAC9D,QAAM,QAAQ,IAAI,OAAO,GAAG,IAAI,qBAAqB,GAAG,EAAE,KAAK,GAAG;AAClE,SAAO,QAAQ,CAAC,KAAK;AACvB;AAEA,SAAS,mBAAmB,OAAuB;AACjD,SAAO,MACJ,QAAQ,WAAW,GAAG,EACtB,QAAQ,WAAW,GAAG,EACtB,QAAQ,UAAU,GAAG,EACrB,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,GAAG,EACpB,QAAQ,UAAU,GAAG;AAC1B;AAEA,SAAS,WACP,WACA,eACA,WACkB;AAClB,SAAO;AAAA,IACL,oBAAoB,UAAU,eAAe;AAAA,IAC7C,SAAS,UAAU,eAAe;AAAA,IAClC,SAAS,UAAU,eAAe;AAAA,IAClC,eAAe,iBAAiB;AAAA,IAChC,WAAW,aAAa;AAAA,IACxB,QAAQ,UAAU,cAAc;AAAA,EAClC;AACF;AAEA,SAAS,YACP,YACA,WACmB;AACnB,QAAM,SAA4B;AAAA,IAChC,MAAM,WAAW,UAAU,UAAU,cAAc;AAAA,EACrD;AACA,QAAM,OAAO,WAAW,cAAc,UAAU;AAEhD,MAAI,SAAS,QAAW;AACtB,WAAO,OAAO;AAAA,EAChB;AACA,MAAI,WAAW,aAAa,QAAW;AACrC,WAAO,KAAK,WAAW;AAAA,EACzB;AACA,MAAI,WAAW,gBAAgB,QAAW;AACxC,WAAO,QAAQ,WAAW;AAAA,EAC5B;AACA,MAAI,UAAU,kBAAkB,QAAW;AACzC,WAAO,UAAU,UAAU;AAAA,EAC7B;AACA,MAAI,UAAU,gBAAgB,QAAW;AACvC,WAAO,QAAQ,UAAU;AAAA,EAC3B;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,aAA6B;AACpD,QAAM,YAAY,IAAI,KAAK,eAAe,SAAS;AAAA,IACjD,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,EACR,CAAC;AAED,SAAO,UAAU,OAAO,IAAI,KAAK,WAAW,CAAC;AAC/C;;;AHxjBA,IAAM,uBAAuBC,GAAE,OAAO;AAAA,EACpC,QAAQA,GAAE,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,MAAM;AACzC,CAAC;AAED,IAAM,+BAA+BA,GAAE,OAAO;AAAA,EAC5C,QAAQA,GAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,EAChD,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC;AAAA,EAChD,OAAOA,GAAE,QAAQ,EAAE,SAAS;AAC9B,CAAC;AAEM,SAAS,qBACd,SACA,cACM;AACN,QAAM,OAAO,QAAQ,QAAQ,MAAM,EAAE,YAAY,+BAA+B;AAChF,QAAM,iBAAiB,IAAI,mBAAmB,aAAa,OAAO;AAElE,OAAK,QAAQ,SAAS,EACnB,SAAS,eAAe,iBAAiB,EACzC,OAAO,qBAAqB,iBAAiB,MAAM,EACnD,OAAO,OAAO,WAAW,YAAY;AACpC,yBAAqB,MAAM,OAAO;AAClC,UAAM,UAAU,MAAM,eAAe,WAAW,SAAS;AACzD,iBAAa,OAAO,GAAG,wBAAwB,OAAO,CAAC;AAAA,CAAI;AAAA,EAC7D,CAAC;AAEH,OAAK,QAAQ,MAAM,EAChB,SAAS,aAAa,4CAA4C,EAClE,OAAO,mBAAmB,4BAA4B,YAAY,CAAC,EACnE,OAAO,qBAAqB,iBAAiB,MAAM,EACnD,OAAO,eAAe,mBAAmB,EACzC,OAAO,OAAO,SAAS,YAAY;AAClC,UAAM,SAAS,6BAA6B,MAAM,mBAAmB,OAAO,CAAC;AAC7E,UAAM,OAAO,MAAM,eAAe,mBAAmB;AAAA,MACnD;AAAA,MACA,OAAO,OAAO;AAAA,IAChB,CAAC;AACD,iBAAa;AAAA,MACX,OAAO,WAAW,UACd,GAAG,iCAAiC,IAAI,CAAC;AAAA,IACzC,GAAG,gCAAgC,IAAI,CAAC;AAAA;AAAA,IAC9C;AAAA,EACF,CAAC;AACL;AAEO,SAAS,uBACd,OACA,cACoB;AACpB,MAAI,iBAAiB,kBAAkB;AACrC,iBAAa;AAAA,MACX,GAAG,6BAA6B,MAAM,MAAM,MAAM,SAAS,MAAM,OAAO,CAAC;AAAA;AAAA,IAC3E;AACA,WAAO,MAAM;AAAA,EACf;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,OAAuB;AACzC,QAAM,SAAS,OAAO,KAAK;AAE3B,MAAI,CAAC,OAAO,UAAU,MAAM,GAAG;AAC7B,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmE,SAE1E;AACA,MAAI,QAAQ,OAAO;AACjB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAS,QAAQ,UAAU;AAAA,EAC7B;AACF;;;AI5GA,SAAS,KAAAC,UAAS;;;ACDlB,SAAS,SAAAC,cAAa;AAIf,SAAS,wBAAwB,QAAmC;AACzE,SAAO,KAAK;AAAA,IACV;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,yBAAyB,QAAmC;AAC1E,SAAOA,OAAM;AAAA,IACX,CAAC,MAAM,SAAS,UAAU,eAAe,YAAY,KAAK;AAAA,IAC1D,GAAG,OAAO,MAAM,IAAI,CAAC,SAAS;AAAA,MAC5B,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,cAAc;AAAA,MACnB,KAAK,aAAa,SAAS;AAAA,MAC3B,KAAK,iBAAiB,SAAY,KAAK,OAAO,KAAK,YAAY;AAAA,MAC/D,KAAK;AAAA,IACP,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,2BAA2B,SAAiC;AAC1E,SAAO,KAAK;AAAA,IACV;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,0BAA0B,QAAqC;AAC7E,SAAO,KAAK;AAAA,IACV;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,2BAA2B,QAAqC;AAC9E,SAAOA,OAAM;AAAA,IACX,CAAC,MAAM,SAAS,UAAU,eAAe,YAAY,KAAK;AAAA,IAC1D,GAAG,OAAO,MAAM,IAAI,CAAC,SAAS;AAAA,MAC5B,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,cAAc;AAAA,MACnB,KAAK,aAAa,SAAS;AAAA,MAC3B,KAAK,iBAAiB,SAAY,KAAK,OAAO,KAAK,YAAY;AAAA,MAC/D,KAAK;AAAA,IACP,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,gCACd,MACA,SACA,SACQ;AACR,SAAO,KAAK;AAAA,IACV;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,QAAQ;AAAA,MAC7C;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACEO,IAAM,sBAAN,cAAkC,MAAM;AAAA,EAC7C,YACkB,MAChB,SACgB,UACA,SAChB;AACA,UAAM,OAAO;AALG;AAEA;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;;;ACrFA,IAAM,oBAAoB,oBAAI,IAAmB,CAAC,QAAQ,MAAM,sBAAO,gBAAM,oBAAK,CAAC;AAE5E,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,cAA2C;AAA3C;AAAA,EAA4C;AAAA,EAEzE,MAAM,QAAQC,QAAwC;AACpD,UAAM,MAAM,uBAAuBA,MAAK;AAExC,WAAO,KAAK,aAAa,QAAQ,aAAa;AAAA,MAC5C,OAAAA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAOA,QAAe,UAGxB,CAAC,GAAiC;AACpC,UAAM,cAAc,wBAAwBA,MAAK;AACjD,UAAM,QAAQC,gBAAe,QAAQ,KAAK;AAC1C,UAAM,MAAM,sBAAsB,WAAW;AAC7C,UAAM,gBAAgB,MAAM,KAAK,aAAa,QAAQ,oBAAoB;AAAA,MACxE;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,cAAc,QAAQ,eAAe;AAC3C,UAAM,SAA8B;AAAA,MAClC,GAAG;AAAA,MACH,MAAM;AAAA,QACJ,cAAc;AAAA,QACd,YAAY,cAAc,MAAM;AAAA,QAChC;AAAA,MACF;AAAA,MACA,SAAS;AAAA,QACP,OAAAD;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,aAAa;AACf,YAAM,WAA6B,CAAC;AAEpC,iBAAW,QAAQ,cAAc,OAAO;AACtC,iBAAS,KAAK,MAAM,KAAK,aAAa,QAAQ,aAAa;AAAA,UACzD,OAAO,KAAK;AAAA,UACZ,KAAK,uBAAuB,KAAK,OAAO,KAAK,EAAE;AAAA,QACjD,CAAC,CAAC;AAAA,MACJ;AAEA,aAAO,WAAW;AAClB,aAAO,KAAK,gBAAgB,SAAS;AAAA,IACvC;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,KAAK,SAGoB;AAC7B,UAAM,SAAS,YAAY,QAAQ,MAAM;AACzC,UAAM,QAAQC,gBAAe,QAAQ,KAAK;AAC1C,UAAM,gBAAgB,WAAW,SAC7B,MAAM,KAAK,aAAa,QAAQ,uBAAuB,EAAE,MAAM,CAAC,IAChE,MAAM,KAAK,aAAa,QAAQ,wBAAwB;AAAA,MACxD,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF,CAAC;AAEH,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM;AAAA,QACJ,cAAc;AAAA,QACd,YAAY,cAAc,MAAM;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,wBAAwBD,QAAuB;AAC7D,QAAM,UAAUA,OAAM,KAAK;AAE3B,MAAI,oBAAoB,KAAK,OAAO,KAAK,QAAQ,UAAU,IAAI;AAC7D,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,OAAO;AAC3B,UAAM,QAAQ,8BAA8B,KAAK,IAAI,QAAQ,IAAI,CAAC;AAElE,QAAI,SAAS,cAAc,IAAI,QAAQ,GAAG;AACxC,aAAO,mBAAmB,KAAK;AAAA,IACjC;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAAA;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,sBAAsB,aAA6B;AACjE,SAAO,wCAAwC,mBAAmB,WAAW,CAAC;AAChF;AAEO,SAAS,uBAAuBA,QAAuB;AAC5D,QAAM,UAAUA,OAAM,KAAK;AAE3B,MAAI,QAAQ,KAAK,OAAO,GAAG;AACzB,WAAO,mCAAmC,OAAO;AAAA,EACnD;AAEA,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,OAAO;AAC3B,UAAM,KAAK,2BAA2B,KAAK,IAAI,QAAQ,IAAI,CAAC,KACvD,YAAY,KAAK,IAAI,QAAQ,IAAI,CAAC;AAEvC,QAAI,MAAM,cAAc,IAAI,QAAQ,GAAG;AACrC,aAAO,mCAAmC,EAAE;AAAA,IAC9C;AAEA,UAAM,UAAU,IAAI,aAAa,IAAI,KAAK;AAE1C,QAAI,SAAS;AACX,aAAO,uBAAuB,OAAO;AAAA,IACvC;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAAA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,cAAc,UAA2B;AAChD,SAAO,aAAa,qBAAqB,aAAa;AACxD;AAEA,SAAS,YAAY,QAA+B;AAClD,MAAI,kBAAkB,IAAI,MAAuB,GAAG;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,MACA,kBAAkB,CAAC,GAAG,iBAAiB;AAAA,IACzC;AAAA,EACF;AACF;AAEA,SAASC,gBAAe,OAAmC;AACzD,QAAM,QAAQ,SAAS;AAEvB,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ,GAAG;AACtD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AH3KA,IAAM,oBAAoBC,GAAE,OAAO;AAAA,EACjC,QAAQA,GAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,EAChD,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EAC/C,OAAOA,GAAE,QAAQ,EAAE,SAAS;AAC9B,CAAC;AAED,IAAMC,wBAAuBD,GAAE,OAAO;AAAA,EACpC,QAAQA,GAAE,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,MAAM;AACzC,CAAC;AAED,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EACnC,QAAQA,GAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,EAChD,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EAC/C,OAAOA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC5B,aAAaA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AACxC,CAAC;AAEM,SAAS,wBACd,SACA,cACM;AACN,QAAM,UAAU,QAAQ,QAAQ,SAAS,EAAE,YAAY,2CAA2C;AAClG,QAAM,UAAU,IAAI,eAAe,EAAE,SAAS,aAAa,QAAQ,CAAC;AAEpE,UAAQ,QAAQ,SAAS,EACtB,SAAS,aAAa,2BAA2B,EACjD,OAAO,qBAAqB,iBAAiB,MAAM,EACnD,OAAO,OAAO,SAAS,YAAY;AAClC,IAAAC,sBAAqB,MAAM,OAAO;AAClC,UAAM,SAAS,MAAM,QAAQ,QAAQ,OAAO;AAC5C,iBAAa,OAAO,GAAG,2BAA2B,MAAM,CAAC;AAAA,CAAI;AAAA,EAC/D,CAAC;AAEH,UAAQ,QAAQ,MAAM,EACnB,SAAS,YAAY,mFAA2C,EAChE,OAAO,mBAAmB,4BAA4BC,aAAY,CAAC,EACnE,OAAO,qBAAqB,iBAAiB,MAAM,EACnD,OAAO,eAAe,mBAAmB,EACzC,OAAO,OAAO,QAAQ,YAAY;AACjC,UAAM,SAAS,kBAAkB,MAAMC,oBAAmB,OAAO,CAAC;AAClE,UAAM,SAAS,MAAM,QAAQ,KAAK;AAAA,MAChC,OAAO,OAAO;AAAA,MACd;AAAA,IACF,CAAC;AACD,iBAAa;AAAA,MACX,OAAO,WAAW,UACd,GAAG,yBAAyB,MAAM,CAAC;AAAA,IACnC,GAAG,wBAAwB,MAAM,CAAC;AAAA;AAAA,IACxC;AAAA,EACF,CAAC;AAEH,UAAQ,QAAQ,QAAQ,EACrB,SAAS,YAAY,6DAA6D,EAClF,OAAO,mBAAmB,4BAA4BD,aAAY,CAAC,EACnE,OAAO,kBAAkB,mDAAmD,EAC5E,OAAO,qBAAqB,iBAAiB,MAAM,EACnD,OAAO,eAAe,mBAAmB,EACzC,OAAO,OAAO,QAAQ,YAAY;AACjC,UAAM,SAAS,oBAAoB,MAAMC,oBAAmB,OAAO,CAAC;AACpE,UAAM,SAAS,MAAM,QAAQ,OAAO,QAAQ;AAAA,MAC1C,OAAO,OAAO;AAAA,MACd,aAAa,OAAO;AAAA,IACtB,CAAC;AACD,iBAAa;AAAA,MACX,OAAO,WAAW,UACd,GAAG,2BAA2B,MAAM,CAAC;AAAA,IACrC,GAAG,0BAA0B,MAAM,CAAC;AAAA;AAAA,IAC1C;AAAA,EACF,CAAC;AACL;AAEO,SAAS,0BACd,OACA,cACoB;AACpB,MAAI,iBAAiB,qBAAqB;AACxC,iBAAa;AAAA,MACX,GAAG,gCAAgC,MAAM,MAAM,MAAM,SAAS,MAAM,OAAO,CAAC;AAAA;AAAA,IAC9E;AACA,WAAO,MAAM;AAAA,EACf;AAEA,SAAO;AACT;AAEA,SAASD,YAAW,OAAuB;AACzC,QAAM,SAAS,OAAO,KAAK;AAE3B,MAAI,CAAC,OAAO,UAAU,MAAM,GAAG;AAC7B,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAASC,oBAAmE,SAE1E;AACA,MAAI,QAAQ,OAAO;AACjB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAS,QAAQ,UAAU;AAAA,EAC7B;AACF;;;AIxIA,SAAS,KAAAC,UAAS;;;ACDlB,SAAS,SAAAC,cAAa;AAIf,SAAS,8BAA8B,QAAyC;AACrF,SAAO,KAAK;AAAA,IACV;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,+BAA+B,QAAyC;AACtF,SAAOA,OAAM;AAAA,IACX,CAAC,MAAM,SAAS,UAAU,SAAS,YAAY,QAAQ,KAAK;AAAA,IAC5D,GAAG,OAAO,MAAM,IAAI,CAAC,SAAS;AAAA,MAC5B,OAAO,KAAK,EAAE;AAAA,MACd,KAAK;AAAA,MACL,KAAK,UAAU;AAAA,MACf,KAAK,UAAU,SAAY,KAAK,OAAO,KAAK,KAAK;AAAA,MACjD,KAAK,iBAAiB,SAAY,KAAK,OAAO,KAAK,YAAY;AAAA,MAC/D,KAAK,MAAM,OAAO;AAAA,MAClB,KAAK;AAAA,IACP,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,6BAA6B,QAAwC;AACnF,SAAO,KAAK;AAAA,IACV;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,8BAA8B,QAAwC;AACpF,SAAOA,OAAM;AAAA,IACX,CAAC,MAAM,SAAS,UAAU,SAAS,YAAY,QAAQ,KAAK;AAAA,IAC5D,GAAG,OAAO,MAAM,IAAI,CAAC,SAAS;AAAA,MAC5B,OAAO,KAAK,EAAE;AAAA,MACd,KAAK;AAAA,MACL,KAAK,UAAU;AAAA,MACf,KAAK,UAAU,SAAY,KAAK,OAAO,KAAK,KAAK;AAAA,MACjD,KAAK,iBAAiB,SAAY,KAAK,OAAO,KAAK,YAAY;AAAA,MAC/D,KAAK,MAAM,OAAO;AAAA,MAClB,KAAK;AAAA,IACP,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,mCACd,MACA,SACA,SACQ;AACR,SAAO,KAAK;AAAA,IACV;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,QAAQ;AAAA,MAC7C;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC9BO,IAAM,yBAAN,cAAqC,MAAM;AAAA,EAChD,YACkB,MAChB,SACgB,UACA,SAChB;AACA,UAAM,OAAO;AALG;AAEA;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;;;AC5CA,IAAMC,qBAAoB,oBAAI,IAA2B,CAAC,OAAO,OAAO,MAAM,CAAC;AAExE,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAA6B,cAA8C;AAA9C;AAAA,EAA+C;AAAA,EAE5E,MAAM,QAAQ,SAGuB;AACnC,UAAM,SAASC,aAAY,QAAQ,MAAM;AACzC,UAAM,QAAQ,eAAe,QAAQ,KAAK;AAC1C,UAAM,gBAAgB,MAAM,KAAK,aAAa,QAAQ,aAAa;AAAA,MACjE;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM;AAAA,QACJ;AAAA,QACA,YAAY,cAAc,MAAM;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,SAIuB;AAClC,UAAM,QAAQ,eAAe,QAAQ,KAAK;AAC1C,UAAM,QAAQ,eAAe,QAAQ,KAAK;AAC1C,UAAM,OAAO,QAAQ,QAAQ;AAC7B,UAAM,gBAAgB,MAAM,KAAK,aAAa,QAAQ,YAAY;AAAA,MAChE;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA,YAAY,cAAc,MAAM;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAASA,aAAY,QAAuC;AAC1D,MAAID,mBAAkB,IAAI,MAA+B,GAAG;AAC1D,WAAO;AAAA,EACT;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,MACA,kBAAkB,CAAC,GAAGA,kBAAiB;AAAA,IACzC;AAAA,EACF;AACF;AAEA,SAAS,eAAe,OAAmC;AACzD,QAAM,QAAQ,SAAS;AAEvB,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ,KAAK;AACxD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,OAAuB;AAC7C,QAAM,QAAQ,MAAM,KAAK;AAEzB,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AHpFA,IAAM,uBAAuBE,GAAE,OAAO;AAAA,EACpC,QAAQA,GAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,EAChD,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE;AAAA,EAClC,OAAOA,GAAE,QAAQ,EAAE,SAAS;AAC9B,CAAC;AAED,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EACnC,QAAQA,GAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,EAChD,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE;AAAA,EAClC,MAAMA,GAAE,KAAK,CAAC,aAAa,MAAM,CAAC,EAAE,QAAQ,WAAW;AAAA,EACvD,OAAOA,GAAE,QAAQ,EAAE,SAAS;AAC9B,CAAC;AAEM,SAAS,2BACd,SACA,cACM;AACN,QAAM,KAAK,QAAQ,QAAQ,IAAI,EAAE,YAAY,+CAA+C;AAC5F,QAAM,UAAU,IAAI,kBAAkB,EAAE,SAAS,aAAa,QAAQ,CAAC;AAEvE,aAAW,UAAU,CAAC,OAAO,OAAO,MAAM,GAAY;AACpD,OAAG,QAAQ,MAAM,EACd,OAAO,mBAAmB,8BAA8B,YAAY,EAAE,EACtE,OAAO,qBAAqB,iBAAiB,MAAM,EACnD,OAAO,eAAe,mBAAmB,EACzC,OAAO,OAAO,YAAY;AACzB,YAAM,SAAS,qBAAqB,MAAMC,oBAAmB,OAAO,CAAC;AACrE,YAAM,SAAS,MAAM,QAAQ,QAAQ;AAAA,QACnC,OAAO,OAAO;AAAA,QACd;AAAA,MACF,CAAC;AACD,mBAAa;AAAA,QACX,OAAO,WAAW,UACd,GAAG,+BAA+B,MAAM,CAAC;AAAA,IACzC,GAAG,8BAA8B,MAAM,CAAC;AAAA;AAAA,MAC9C;AAAA,IACF,CAAC;AAAA,EACL;AAEA,KAAG,QAAQ,QAAQ,EAChB,SAAS,WAAW,cAAc,EAClC,OAAO,mBAAmB,qCAAqC,YAAY,EAAE,EAC7E,OAAO,iBAAiB,kCAAkC,WAAW,EACrE,OAAO,qBAAqB,iBAAiB,MAAM,EACnD,OAAO,eAAe,mBAAmB,EACzC,OAAO,OAAO,OAAO,YAAY;AAChC,UAAM,SAAS,oBAAoB,MAAMA,oBAAmB,OAAO,CAAC;AACpE,UAAM,SAAS,MAAM,QAAQ,OAAO;AAAA,MAClC,OAAO,OAAO;AAAA,MACd;AAAA,MACA,MAAM,OAAO;AAAA,IACf,CAAC;AACD,iBAAa;AAAA,MACX,OAAO,WAAW,UACd,GAAG,8BAA8B,MAAM,CAAC;AAAA,IACxC,GAAG,6BAA6B,MAAM,CAAC;AAAA;AAAA,IAC7C;AAAA,EACF,CAAC;AACL;AAEO,SAAS,6BACd,OACA,cACoB;AACpB,MAAI,iBAAiB,wBAAwB;AAC3C,iBAAa;AAAA,MACX,GAAG,mCAAmC,MAAM,MAAM,MAAM,SAAS,MAAM,OAAO,CAAC;AAAA;AAAA,IACjF;AACA,WAAO,MAAM;AAAA,EACf;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,OAAuB;AACzC,QAAM,SAAS,OAAO,KAAK;AAE3B,MAAI,CAAC,OAAO,UAAU,MAAM,GAAG;AAC7B,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAASA,oBAAmE,SAE1E;AACA,MAAI,QAAQ,OAAO;AACjB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAS,QAAQ,UAAU;AAAA,EAC7B;AACF;;;AnC3EA,IAAM,YAAYC,GAAE,OAAO,EAAE,UAAU,CAAC,OAAO,YAAY;AACzD,MAAI;AACF,WAAO,eAAe,KAAK;AAAA,EAC7B,SAAS,OAAO;AACd,YAAQ,SAAS;AAAA,MACf,MAAM;AAAA,MACN,SAAU,MAAgB;AAAA,IAC5B,CAAC;AACD,WAAOA,GAAE;AAAA,EACX;AACF,CAAC;AACD,IAAM,iBAAiB,6BAA6B,oBAAoB,KAAK,IAAI,CAAC;AAElF,IAAM,mBAAmBA,GAAE,OAAO;AAAA,EAChC,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,KAAK;AAAA,EACL,KAAKA,GAAE,OAAO;AAAA,EACd,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,QAAQA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,UAAUA,GAAE,OAAO,EAAE,SAAS;AAChC,CAAC;AAED,IAAMC,qBAAoBD,GAAE,OAAO;AAAA,EACjC,KAAK,UAAU,SAAS;AAAA,EACxB,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,QAAQA,GAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,EAChD,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE;AAAA,EACtD,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,QAAQA,GAAE,QAAQ,EAAE,SAAS;AAC/B,CAAC;AAED,IAAM,mBAAmBA,GAAE,OAAO;AAAA,EAChC,KAAK,UAAU,SAAS;AAAA,EACxB,QAAQA,GAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,EAChD,IAAIA,GAAE,OAAO,EAAE,SAAS;AAAA,EACxB,KAAKA,GAAE,OAAO,EAAE,SAAS;AAAA,EACzB,QAAQA,GAAE,QAAQ,EAAE,SAAS;AAC/B,CAAC;AAED,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EACnC,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,KAAK,UAAU,SAAS;AAAA,EACxB,QAAQA,GAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,EAChD,IAAIA,GAAE,OAAO,EAAE,SAAS;AAAA,EACxB,KAAKA,GAAE,OAAO,EAAE,SAAS;AAAA,EACzB,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,QAAQA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,UAAUA,GAAE,OAAO,EAAE,SAAS;AAChC,CAAC;AAED,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EACnC,KAAK,UAAU,SAAS;AAAA,EACxB,QAAQA,GAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,EAChD,IAAIA,GAAE,OAAO,EAAE,SAAS;AAAA,EACxB,KAAKA,GAAE,OAAO,EAAE,SAAS;AAAA,EACzB,KAAKA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAChC,CAAC;AAED,IAAM,qBAAqBA,GAAE,OAAO;AAAA,EAClC,QAAQA,GAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAClD,CAAC;AAED,IAAM,yBAAyBA,GAAE,OAAO;AAAA,EACtC,QAAQA,GAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,EAChD,KAAKA,GAAE,OAAO;AAChB,CAAC;AAED,IAAM,yBAAyBA,GAAE,OAAO;AAAA,EACtC,QAAQA,GAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,EAChD,KAAKA,GAAE,OAAO;AAAA,EACd,OAAOA,GAAE,OAAO;AAClB,CAAC;AAEM,SAAS,YAAY,cAA8C;AACxE,QAAM,UAAU,IAAI,QAAQ;AAC5B,QAAM,gBAAgB,MACpB,IAAI,UAAU;AAAA,IACZ,WAAW,aAAa;AAAA,IACxB,KAAK,aAAa;AAAA,IAClB,YAAY,aAAa,cAAc;AAAA,EACzC,CAAC;AACH,QAAM,2BAA2B,MAAM;AACrC,UAAM,QAAQ,aAAa,wBAAwB;AAEnD,WAAO,IAAI,mBAAmB;AAAA,MAC5B,SAAS,aAAa;AAAA,MACtB,YAAY,MAAM;AAAA,MAClB,iBAAiB,MAAM;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,UACG,KAAK,SAAS,EACd,YAAY,yDAAyD,EACrE,mBAAmB,EACnB,aAAa;AAChB,UAAQ,gBAAgB;AAAA,IACtB,aAAa,CAAC,UAAU,aAAa,OAAO,KAAK;AAAA,IACjD,UAAU,CAAC,UAAU,aAAa,OAAO,KAAK;AAAA,IAC9C,UAAU,CAAC,UAAU,aAAa,OAAO,KAAK;AAAA,EAChD,CAAC;AAED,QAAM,KAAK,QAAQ,QAAQ,IAAI,EAAE,YAAY,yBAAyB;AACtE,QAAM,SAAS,QAAQ,QAAQ,QAAQ,EAAE,YAAY,iCAAiC;AACtF,uBAAqB,SAAS;AAAA,IAC5B;AAAA,IACA,QAAQ,aAAa;AAAA,EACvB,CAAC;AACD,wBAAsB,SAAS;AAAA,IAC7B,SAAS,aAAa;AAAA,IACtB,QAAQ,aAAa;AAAA,IACrB,QAAQ,aAAa;AAAA,EACvB,CAAC;AACD,uBAAqB,SAAS;AAAA,IAC5B,SAAS,aAAa;AAAA,IACtB,QAAQ,aAAa;AAAA,IACrB,QAAQ,aAAa;AAAA,EACvB,CAAC;AACD,0BAAwB,SAAS;AAAA,IAC/B,SAAS,aAAa;AAAA,IACtB,QAAQ,aAAa;AAAA,IACrB,QAAQ,aAAa;AAAA,EACvB,CAAC;AACD,6BAA2B,SAAS;AAAA,IAClC,SAAS,aAAa;AAAA,IACtB,QAAQ,aAAa;AAAA,IACrB,QAAQ,aAAa;AAAA,EACvB,CAAC;AAED,KAAG,QAAQ,KAAK,EACb,eAAe,mBAAmB,cAAc,EAChD,eAAe,mBAAmB,SAAS,EAC3C,OAAO,0BAA0B,SAAS,EAC1C,OAAO,8BAA8B,WAAW,EAChD,OAAO,uBAAuB,OAAO,EACrC,OAAO,uBAAuB,OAAO,EACrC,OAAO,aAAa,gCAAgC,EACpD,OAAO,CAAC,YAAY;AACnB,UAAM,SAAS,iBAAiB,MAAM,OAAO;AAC7C,iBAAa,CAAC,cAAc,EAAE,IAAI,MAAM,CAAC,GAAG,QAAQ,OAAO,UAAU,OAAO,IAAI,YAAY;AAAA,EAC9F,CAAC;AAEH,KAAG,QAAQ,KAAK,EACb,OAAO,aAAa,WAAW,EAC/B,OAAO,mBAAmB,cAAc,EACxC,OAAO,mBAAmB,SAAS,EACnC,OAAO,aAAa,gCAAgC,EACpD,OAAO,qBAAqB,iBAAiB,MAAM,EACnD,OAAO,eAAe,mBAAmB,EACzC,OAAO,CAAC,YAAY;AACnB,UAAM,SAAS,iBAAiB,MAAME,oBAAmB,OAAO,CAAC;AACjE;AAAA,MACE,CAAC,cAAc,EAAE,IAAI,MAAM,CAAC;AAAA,MAC5B,OAAO;AAAA,MACP,OAAO,UAAU;AAAA,MACjB;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAEH,KAAG,QAAQ,MAAM,EACd,OAAO,mBAAmB,cAAc,EACxC,OAAO,uBAAuB,aAAa,EAC3C,OAAO,uBAAuB,cAAc,EAC5C,OAAO,mBAAmB,gBAAgBC,aAAY,EAAE,EACxD,OAAO,aAAa,gCAAgC,EACpD,OAAO,qBAAqB,iBAAiB,MAAM,EACnD,OAAO,eAAe,mBAAmB,EACzC,OAAO,CAAC,YAAY;AACnB,UAAM,SAASF,mBAAkB,MAAMC,oBAAmB,OAAO,CAAC;AAClE;AAAA,MACE,cAAc,EAAE,KAAK,MAAM;AAAA,MAC3B,OAAO;AAAA,MACP,OAAO,UAAU;AAAA,MACjB,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF,CAAC;AAEH,KAAG,QAAQ,QAAQ,EAChB,OAAO,aAAa,WAAW,EAC/B,OAAO,mBAAmB,cAAc,EACxC,OAAO,mBAAmB,SAAS,EACnC,OAAO,0BAA0B,SAAS,EAC1C,OAAO,8BAA8B,WAAW,EAChD,OAAO,uBAAuB,OAAO,EACrC,OAAO,uBAAuB,OAAO,EACrC,OAAO,aAAa,gCAAgC,EACpD,OAAO,qBAAqB,iBAAiB,MAAM,EACnD,OAAO,eAAe,mBAAmB,EACzC,OAAO,CAAC,YAAY;AACnB,UAAM,SAAS,oBAAoB,MAAMA,oBAAmB,OAAO,CAAC;AACpE;AAAA,MACE,CAAC,cAAc,EAAE,OAAO,MAAM,CAAC;AAAA,MAC/B,OAAO;AAAA,MACP,OAAO,UAAU;AAAA,MACjB;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAEH,KAAG,QAAQ,QAAQ,EAChB,OAAO,aAAa,WAAW,EAC/B,OAAO,mBAAmB,cAAc,EACxC,OAAO,mBAAmB,SAAS,EACnC,OAAO,SAAS,mBAAmB,EACnC,OAAO,qBAAqB,iBAAiB,MAAM,EACnD,OAAO,eAAe,mBAAmB,EACzC,OAAO,OAAO,YAAY;AACzB,UAAM,SAAS,oBAAoB,MAAMA,oBAAmB,OAAO,CAAC;AAEpE,QAAI,CAAC,OAAO,KAAK;AACf,YAAM,YAAY,MAAM,aAAa,QAAQ,4BAA4B;AACzE,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,eAAe,WAAW,+BAA+B,CAAC;AAAA,MACtE;AAAA,IACF;AAEA,UAAM,UAAU,cAAc;AAC9B,UAAM,SAAS,QAAQ,IAAI,MAAM;AACjC,UAAM,UAAU,QAAQ,OAAO,MAAM;AACrC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,eAAe,iBAAiB,wCAAwC,CAAC;AAAA,IACrF;AACA,iBAAa,CAAC,MAAM,GAAG,OAAO,QAAQ,OAAO,GAAG,YAAY;AAAA,EAC9D,CAAC;AAEH,SAAO,QAAQ,MAAM,EAClB,OAAO,qBAAqB,iBAAiB,MAAM,EACnD,OAAO,eAAe,mBAAmB,EACzC,OAAO,CAAC,YAAY;AACnB,UAAM,SAAS,mBAAmB,MAAMA,oBAAmB,OAAO,CAAC;AACnE,UAAM,UAAU,kBAAkB;AAAA,MAChC,WAAW,aAAa,MAAM;AAAA,MAC9B,SAAS,aAAa,MAAM;AAAA,MAC5B,KAAK,aAAa;AAAA,IACpB,CAAC;AAED,uBAAmB,SAAS,OAAO,QAAQ,YAAY;AAAA,EACzD,CAAC;AAEH,SAAO,QAAQ,KAAK,EACjB,SAAS,SAAS,YAAY,EAC9B,OAAO,qBAAqB,iBAAiB,MAAM,EACnD,OAAO,eAAe,mBAAmB,EACzC,OAAO,CAAC,KAAK,YAAY;AACxB,UAAM,SAAS,uBAAuB,MAAM;AAAA,MAC1C,GAAGA,oBAAmB,OAAO;AAAA,MAC7B;AAAA,IACF,CAAC;AACD,6BAAyB,OAAO,GAAG;AACnC,UAAM,QAAQ,eAAe,OAAO,KAAK;AAAA,MACvC,WAAW,aAAa,MAAM;AAAA,MAC9B,SAAS,aAAa,MAAM;AAAA,MAC5B,KAAK,aAAa;AAAA,IACpB,CAAC;AAED,uBAAmB,CAAC,KAAK,GAAG,OAAO,QAAQ,YAAY;AAAA,EACzD,CAAC;AAEH,SAAO,QAAQ,KAAK,EACjB,SAAS,SAAS,YAAY,EAC9B,SAAS,WAAW,cAAc,EAClC,OAAO,qBAAqB,iBAAiB,MAAM,EACnD,OAAO,eAAe,mBAAmB,EACzC,OAAO,CAAC,KAAK,OAAO,YAAY;AAC/B,UAAM,SAAS,uBAAuB,MAAM;AAAA,MAC1C,GAAGA,oBAAmB,OAAO;AAAA,MAC7B;AAAA,MACA;AAAA,IACF,CAAC;AACD,6BAAyB,OAAO,GAAG;AACnC,mBAAe,OAAO,KAAK,OAAO,OAAO;AAAA,MACvC,WAAW,aAAa,MAAM;AAAA,IAChC,CAAC;AACD,UAAM,QAAQ,eAAe,OAAO,KAAK;AAAA,MACvC,WAAW,aAAa,MAAM;AAAA,MAC9B,SAAS,aAAa,MAAM;AAAA,MAC5B,KAAK,aAAa;AAAA,IACpB,CAAC;AAED,uBAAmB,CAAC,KAAK,GAAG,OAAO,QAAQ,YAAY;AAAA,EACzD,CAAC;AAEH,SAAO;AAAA,IACL,KAAK,OAAO,SAAmB;AAC7B,UAAI;AACF,cAAM,QAAQ,WAAW,CAAC,QAAQ,WAAW,GAAG,IAAI,GAAG;AAAA,UACrD,MAAM;AAAA,QACR,CAAC;AACD,eAAO;AAAA,MACT,SAAS,OAAO;AACd,YAAI,iBAAiB,SAAS,UAAU,SAAS,MAAM,SAAS,2BAA2B;AACzF,iBAAO;AAAA,QACT;AAEA,YAAI,WAAW,KAAK,GAAG;AACrB,uBAAa;AAAA,YACX,GAAG,oBAAoB,MAAM,MAAM,MAAM,SAAS,aAAa,QAAQ,MAAM,UAAU,MAAS,CAAC;AAAA;AAAA,UACnG;AACA,iBAAO,MAAM;AAAA,QACf;AAEA,cAAM,gBAAgB,wBAAwB,OAAO;AAAA,UACnD,QAAQ,aAAa;AAAA,QACvB,CAAC;AAGD,YAAI,kBAAkB,QAAW;AAC/B,iBAAO;AAAA,QACT;AAGA,cAAM,eAAe,uBAAuB,OAAO;AAAA,UACjD,QAAQ,aAAa;AAAA,QACvB,CAAC;AAED,YAAI,iBAAiB,QAAW;AAC9B,iBAAO;AAAA,QACT;AAEA,cAAM,kBAAkB,0BAA0B,OAAO;AAAA,UACvD,QAAQ,aAAa;AAAA,QACvB,CAAC;AAED,YAAI,oBAAoB,QAAW;AACjC,iBAAO;AAAA,QACT;AAEA,cAAM,qBAAqB,6BAA6B,OAAO;AAAA,UAC7D,QAAQ,aAAa;AAAA,QACvB,CAAC;AAED,YAAI,uBAAuB,QAAW;AACpC,iBAAO;AAAA,QACT;AAEA,YAAI,iBAAiB,UAAU;AAC7B,uBAAa;AAAA,YACX,GAAG,oBAAoB,oBAAoB,MAAM,OAAO,CAAC,EAAG,OAAO,CAAC;AAAA;AAAA,UACtE;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,iBAAiB,SAAS,cAAc,SAAS,OAAO,MAAM,aAAa,UAAU;AACvF,iBAAO,MAAM;AAAA,QACf;AAEA,cAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,qBAAa,OAAO,GAAG,oBAAoB,oBAAoB,OAAO,CAAC;AAAA,CAAI;AAC3E,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,WACP,OACwF;AACxF,SACE,iBAAiB,SACjB,UAAU,SACV,OAAO,MAAM,SAAS,YACtB,cAAc,SACd,OAAO,MAAM,aAAa;AAE9B;AAEA,SAASC,YAAW,OAAuB;AACzC,QAAM,SAAS,OAAO,SAAS,OAAO,EAAE;AACxC,MAAI,OAAO,MAAM,MAAM,GAAG;AACxB,UAAM,IAAI,MAAM,mBAAmB,KAAK,mBAAmB;AAAA,EAC7D;AACA,SAAO;AACT;AAEO,SAASD,oBAAmE,SAEjF;AACA,MAAI,QAAQ,OAAO;AACjB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ;AAClB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,6CAA6C;AAC/D;AAEA,SAAS,aACP,SACA,QACA,SACA,OACA,cACM;AACN,MAAI,WAAW,SAAS;AACtB,iBAAa,OAAO,GAAG,uBAAuB,OAAO,CAAC;AAAA,CAAI;AAC1D;AAAA,EACF;AAEA,eAAa,OAAO,GAAG,sBAAsB,SAAS,KAAK,CAAC;AAAA,CAAI;AAClE;AAEA,SAAS,mBACP,SACA,QACA,cACM;AACN,MAAI,WAAW,SAAS;AACtB,iBAAa,OAAO,GAAG,2BAA2B,OAAO,CAAC;AAAA,CAAI;AAC9D;AAAA,EACF;AAEA,eAAa,OAAO,GAAG,0BAA0B,OAAO,CAAC;AAAA,CAAI;AAC/D;AAEA,SAAS,0BAA0B,SAAuD;AACxF,SAAO,KAAK;AAAA,IACV;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,OAAO,QAAQ;AAAA,MACjB;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,2BAA2B,SAAuD;AACzF,SAAOE,OAAM;AAAA,IACX,CAAC,OAAO,SAAS,UAAU,aAAa,YAAY,cAAc;AAAA,IAClE,GAAG,QAAQ,IAAI,CAAC,UAAU;AAAA,MACxB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM,aAAa;AAAA,MACnB,MAAM,YAAY;AAAA,MAClB,MAAM;AAAA,IACR,CAAC;AAAA,EACH,CAAC;AACH;;;AuCtfA,OAAO,cAAc;AAId,SAAS,iBAAiB,WAAW,YAAwB;AAClE,QAAM,WAAW,IAAI,SAAS,QAAQ;AAEtC,WAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAqBb;AAED,SAAO;AACT;;;AC/BA,OAAOC,eAAc;AAkCd,IAAM,yBAAN,cAAqC,MAAM;AAAA,EAChD,YAAY,IAAY;AACtB,UAAM,kCAAkC,EAAE,GAAG;AAC7C,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,eAAN,MAAmB;AAAA,EACf;AAAA,EAET,YAAY,UAAsB;AAChC,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,OAAO,QAAwB;AAC7B,QAAI;AACF,WAAK,UACF;AAAA,QACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAuBF,EACC,IAAI,MAAM;AAAA,IACf,SAAS,OAAO;AACd,UAAI,iBAAiBA,UAAS,eAAe,MAAM,SAAS,gCAAgC;AAC1F,cAAM,IAAI,uBAAuB,OAAO,EAAE;AAAA,MAC5C;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,QAAQ,IAA6B;AACnC,UAAM,MAAM,KAAK,UACd,QAAQ,uCAAuC,EAC/C,IAAI,EAAE;AAET,WAAO,MAAM,eAAe,GAAG,IAAI;AAAA,EACrC;AAAA,EAEA,cAAc,KAAY,IAA6B;AACrD,UAAM,MAAM,KAAK,UACd,QAAQ,mDAAmD,EAC3D,IAAI,KAAK,EAAE;AAEd,WAAO,MAAM,eAAe,GAAG,IAAI;AAAA,EACrC;AAAA,EAEA,KAAK,SAAoC;AACvC,UAAM,aAAuB,CAAC;AAC9B,UAAM,SAAiC,CAAC;AAExC,QAAI,QAAQ,KAAK;AACf,iBAAW,KAAK,SAAS;AACzB,aAAO,KAAK,QAAQ,GAAG;AAAA,IACzB;AAEA,QAAI,QAAQ,SAAS,QAAQ,UAAU,QAAQ,OAAO,SAAS,GAAG;AAChE,YAAM,kBAAkB,QAAQ,MAAM,YAAY;AAClD,YAAM,kBAAkB,QAAQ,OAAO,IAAI,CAAC,UAAU;AACpD,YAAI,UAAU,OAAO;AACnB,iBAAO,KAAK,GAAG,QAAQ,KAAK,GAAG;AAC/B,iBAAO;AAAA,QACT;AAEA,cAAM,SAAS,cAAc,KAAK;AAClC,eAAO,KAAK,IAAI,eAAe,GAAG;AAClC,eAAO,kBAAkB,MAAM;AAAA,MACjC,CAAC;AAED,iBAAW,KAAK,IAAI,gBAAgB,KAAK,MAAM,CAAC,GAAG;AAAA,IACrD;AAEA,UAAM,cAAc,WAAW,SAAS,IAAI,SAAS,WAAW,KAAK,OAAO,CAAC,KAAK;AAClF,WAAO,KAAK,QAAQ,KAAK;AAEzB,UAAM,OAAO,KAAK,UACf;AAAA,MACC;AAAA,WACG,WAAW;AAAA;AAAA;AAAA,IAGhB,EACC,IAAI,GAAG,MAAM;AAEhB,WAAO,KAAK,IAAI,cAAc;AAAA,EAChC;AAAA,EAEA,eAAeC,QAA+C;AAC5D,UAAM,UAAU,KAAK,QAAQA,OAAM,EAAE;AAErC,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,KAAK,UACd;AAAA,MACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQF,EACC,IAAI;AAAA,MACH,OAAOA,OAAM,UAAU,SAAY,QAAQ,QAAQA,OAAM;AAAA,MACzD,IAAIA,OAAM;AAAA,MACV,OAAOA,OAAM,UAAU,SAAY,QAAQ,QAAQA,OAAM;AAAA,MACzD,WAAWA,OAAM;AAAA,MACjB,QAAQA,OAAM,WAAW,SAAY,QAAQ,SAASA,OAAM;AAAA,MAC5D,UAAUA,OAAM,aAAa,SAAY,QAAQ,WAAWA,OAAM;AAAA,IACpE,CAAC;AAEH,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,IACT;AAEA,WAAO,eAAe,GAAG;AAAA,EAC3B;AAAA,EAEA,WAAW,IAAqB;AAC9B,UAAM,SAAS,KAAK,UAAU,QAAQ,qCAAqC,EAAE,IAAI,EAAE;AAEnF,WAAO,OAAO,UAAU;AAAA,EAC1B;AACF;AAEA,SAAS,cAAc,OAA6C;AAClE,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,eAAe,KAA4B;AAClD,SAAO;AAAA,IACL,WAAW,IAAI;AAAA,IACf,OAAO,IAAI;AAAA,IACX,KAAK,IAAI;AAAA,IACT,IAAI,IAAI;AAAA,IACR,eAAe,IAAI;AAAA,IACnB,iBAAiB,IAAI;AAAA,IACrB,OAAO,IAAI;AAAA,IACX,WAAW,IAAI;AAAA,IACf,QAAQ,IAAI;AAAA,IACZ,UAAU,IAAI;AAAA,EAChB;AACF;;;ACjNA,SAAS,SAAS,IAAI,YAAY;AAClC,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAC1B,SAAS,QAAAC,OAAM,SAAAC,cAAa;AAI5B,IAAM,gBAAgB,UAAU,QAAQ;AAuBjC,SAAS,wBAAwB,KAA0C;AAChF,QAAM,kBAAkB,IAAI,eAAe,qBAAqB,GAAG;AACnE,QAAM,aAAa,IAAI,cAAc;AAErC,MAAI,CAAC,iBAAiB;AACpB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,yBACd,eAAqD,CAAC,GAClC;AACpB,QAAM,iBACJ,aAAa;AAAA,GAEZ,OAAO,MAAc,SAAmB;AACvC,UAAM,cAAc,MAAM,IAAI;AAAA,EAChC;AAEF,SAAO;AAAA,IACL,wBAAwB,OAAO,SAAiB;AAC9C,YAAM,UAAU,MAAM,QAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;AAC3D,YAAM,QAAQ;AAAA,QACZ,QAAQ;AAAA,UAAI,CAAC,UACX,GAAGD,MAAK,MAAM,MAAM,IAAI,GAAG;AAAA,YACzB,OAAO;AAAA,YACP,WAAW;AAAA,UACb,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,oBAAoB,YAAY;AAC9B,YAAM,eAAe,YAAY,CAAC,MAAM,KAAK,CAAC;AAAA,IAChD;AAAA,IACA,aAAa,OAAO,SAAiB,YAAY,IAAI;AAAA,IACrD,sBAAsB,OAAO,MAAc,UAAkB,qBAAqB,MAAM,KAAK;AAAA,IAC7F,YAAY,OAAO,MAAc,SAAmB;AAClD,YAAM,eAAe,MAAM,IAAI;AAAA,IACjC;AAAA,EACF;AACF;AAEA,eAAe,YAAY,MAAqF;AAC9G,MAAI;AACF,UAAM,QAAQ,MAAM,KAAK,IAAI;AAE7B,QAAI,CAAC,MAAM,YAAY,GAAG;AACxB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,WAAW,MAAM;AAAA,MACnB;AAAA,IACF;AAEA,UAAM,YAAY,MAAM,iBAAiB,IAAI;AAC7C,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,aAAa;AAAA,MACb;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,QAAI,gBAAgB,KAAK,GAAG;AAC1B,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,WAAW;AAAA,MACb;AAAA,IACF;AAGA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,iBAAiB,MAA+B;AAC7D,QAAM,UAAU,MAAM,QAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;AAC3D,MAAI,QAAQ;AAEZ,aAAW,SAAS,SAAS;AAC3B,UAAM,YAAYA,MAAK,MAAM,MAAM,IAAI;AAEvC,QAAI,MAAM,YAAY,GAAG;AACvB,eAAS,MAAM,iBAAiB,SAAS;AACzC;AAAA,IACF;AAGA,QAAI,MAAM,OAAO,GAAG;AAClB,gBAAU,MAAM,KAAK,SAAS,GAAG;AAAA,IACnC;AAAA,EAEF;AAEA,SAAO;AACT;AAEA,eAAe,qBAAqB,MAAc,OAA8C;AAC9F,MAAI;AACF,UAAM,UAAU,MAAM,QAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;AAC3D,UAAM,WAAW,MAAM,QAAQ;AAAA,MAC7B,QAAQ,IAAI,OAAO,UAA8C;AAC/D,cAAM,YAAYA,MAAK,MAAM,MAAM,IAAI;AAEvC,YAAI,MAAM,YAAY,GAAG;AACvB,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,YACZ,MAAM;AAAA,YACN,WAAW,MAAM,iBAAiB,SAAS;AAAA,YAC3C,QAAQ;AAAA,UACV;AAAA,QACF;AAEA,YAAI,MAAM,OAAO,GAAG;AAClB,gBAAM,QAAQ,MAAM,KAAK,SAAS;AAClC,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,YACZ,MAAM;AAAA,YACN,WAAW,MAAM;AAAA,YACjB,QAAQ;AAAA,UACV;AAAA,QACF;AAEA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,WAAO,SACJ,OAAO,CAAC,UAAuC,UAAU,IAAI,EAC7D,IAAI,CAAC,WAAW;AAAA,MACf,GAAG;AAAA,MACH,QAAQE,WAAU,MAAM,SAAS;AAAA,IACnC,EAAE,EACD,KAAK,CAAC,MAAM,UAAU,MAAM,YAAY,KAAK,SAAS,EACtD,MAAM,GAAG,KAAK;AAAA,EACnB,SAAS,OAAO;AACd,QAAI,gBAAgB,KAAK,GAAG;AAC1B,aAAO,CAAC;AAAA,IACV;AAEA,UAAM;AAAA,EACR;AACF;AAEA,SAASA,WAAU,OAAuB;AACxC,SAAO,QAAQ,QAAS,QAAQ,GAAI,QAAQ,CAAC,CAAC;AAChD;AAEA,SAAS,qBAAqB,KAAuC;AACnE,MAAI,CAAC,IAAI,aAAa,CAAC,IAAI,UAAU;AACnC,WAAO;AAAA,EACT;AAEA,SAAOD,OAAM,KAAK,IAAI,WAAW,IAAI,QAAQ;AAC/C;AAEA,SAAS,gBAAgB,OAAgD;AACvE,SAAO,iBAAiB,SAAS,UAAU,SAAS,MAAM,SAAS;AACrE;;;ACpMA,SAAS,YAAY,oBAAoB;AACzC,SAAS,aAAa,uBAAuB;AAC7C,SAAS,aAAAE,kBAAiB;AA2B1B,IAAMC,iBAAgBC,WAAU,YAAY;AAErC,SAAS,4BAA0C;AACxD,SAAO;AAAA,IACL,UAAU,OAAO,MAAM,SAAS;AAC9B,UAAI;AACF,cAAM,SAAS,MAAMD,eAAc,MAAM,MAAM,EAAE,UAAU,OAAO,CAAC;AACnE,eAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ,OAAO;AAAA,UACf,QAAQ,OAAO;AAAA,QACjB;AAAA,MACF,SAAS,OAAO;AACd,cAAM,YAAY;AAElB,eAAO;AAAA,UACL,MAAM,OAAO,UAAU,SAAS,WAAW,UAAU,OAAO;AAAA,UAC5D,QAAQ,UAAU,UAAU,UAAU;AAAA,UACtC,QAAQ,UAAU,UAAU;AAAA,QAC9B;AAAA,MAEF;AAAA,IACF;AAAA,IACA,OAAO,OAAOE,QAAO,SAAS;AAC5B,YAAM,WAAW,MAAM,MAAMA,QAAO,IAAI;AACxC,aAAO;AAAA,IACT;AAAA,IACA,sBAAsB,OAAO,QAAQ,wBAAwB,GAAG;AAAA,IAChE,WAAW,OAAO,MAAM,SAAS;AAC/B,YAAM,gBAAgB,MAAM,IAAI;AAAA,IAClC;AAAA,EACF;AACF;AAEA,eAAsB,wBACpB,KACA,aAAsDC,qBAC3B;AAC3B,MAAI;AAEJ,MAAI;AACF,iBAAa,MAAM,WAAW,YAAY;AAAA,EAC5C,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAY,WAA+F;AAEjH,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,SAAS,OAAO,EAAE,UAAU,KAAK,CAAC;AACxD,QAAM,aAA+B,CAAC;AAEtC,MAAI;AACF,UAAM,UAAU,MAAO,QAYpB,WAAW;AACd,UAAM,OAAO,MAAM,QAAQ,QAAQ;AAEnC,SAAK,GAAG,YAAY,CAAC,aAAa;AAChC,YAAM,YAAY,mCAAmC,SAAS,IAAI,GAAG,SAAS,QAAQ,EAAE,cAAc,CAAC;AAEvG,UAAI,WAAW;AACb,mBAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,IACF,CAAC;AAED,UAAM,KAAK,KAAK,KAAK,EAAE,WAAW,OAAO,CAAC;AAC1C,UAAM,KAAK,eAAe,GAAK;AAC/B,UAAM,QAAQ,MAAM;AAAA,EACtB,UAAE;AACA,UAAO,QAA2C,MAAM;AAAA,EAC1D;AAEA,SAAO,oBAAoB,UAAU;AACvC;AAEA,IAAMA,sBAAqB,IAAI;AAAA,EAC7B;AAAA,EACA;AACF;AAGA,IAAM,eAAe;AAErB,IAAM,mBAAmB;AACzB,IAAM,WAAW;AAEV,SAAS,mCACd,KACA,aACuB;AACvB,QAAM,UAAU,SAAS,KAAK,GAAG;AAEjC,MAAI,eAAe;AAEnB,MAAI,SAAS;AACX,UAAM,eAAe,iBAAiB,KAAK,GAAG;AAC9C,QAAI,gBAAgB,aAAa,CAAC,GAAG;AACnC,YAAM,UAAU,SAAS,aAAa,CAAC,GAAG,EAAE;AAE5C,qBAAe,KAAK,IAAI,UAAU,OAAS,CAAC,IAAI;AAAA,IAClD;AAAA,EACF,OAAO;AACL,UAAM,WAAW,aAAa,KAAK,GAAG;AACtC,QAAI,YAAY,SAAS,CAAC,KAAK,SAAS,CAAC,GAAG;AAC1C,YAAM,QAAQ,SAAS,SAAS,CAAC,GAAG,EAAE;AACtC,YAAM,SAAS,SAAS,SAAS,CAAC,GAAG,EAAE;AACvC,YAAM,SAAS,QAAQ;AAEvB,qBAAe,KAAK,IAAI,UAAU,OAAO,OAAO,CAAC,IAAI;AAAA,IACvD;AAAA,EACF;AAGA,MAAI,iBAAiB,KAAK,GAAG,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,kBAAkB,KAAK,GAAG,GAAG;AAC/B,QAAI,SAAS;AACX,aAAO;AAAA,IACT;AACA,WAAO,qBAAqB,QAAQ,KAAK,WAAW,YAAY;AAAA,EAClE;AAEA,MAAI,iBAAiB,KAAK,GAAG,KAAK,aAAa,SAAS,WAAW,GAAG;AACpE,QAAI,SAAS;AACX,aAAO;AAAA,IACT;AACA,WAAO,qBAAqB,OAAO,KAAK,WAAW,YAAY;AAAA,EACjE;AAEA,SAAO;AACT;;;AC3LA,SAAS,YAAYC,qBAAoB;AACzC,SAAS,aAAAC,kBAAiB;AAS1B,IAAMC,iBAAgBC,WAAUC,aAAY;AAErC,SAAS,2BAAwC;AACtD,SAAO;AAAA,IACL,kBAAkB,OAAO,YAAY,cAAc,SAAS,qBAAqB;AAAA,IACjF,WAAW,OAAO,YAAY,cAAc,SAAS,qBAAqB;AAAA,EAC5E;AACF;AAEA,eAAe,cACb,SACA,WACiB;AACjB,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG,OAAO,QAAQ,QAAQ,OAAO,EAAE,QAAQ,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,YAAY,GAAG,IAAI,KAAK,KAAK,EAAE,CAAC;AAAA,IAC/F,GAAI,UAAU,UAAU,CAAC,cAAc,KAAK,UAAU,QAAQ,IAAI,CAAC,IAAI,CAAC;AAAA,IACxE,QAAQ;AAAA,EACV;AAEA,MAAI;AACF,UAAM,SAAS,MAAMF,eAAc,QAAQ,MAAM;AAAA,MAC/C,UAAU;AAAA,MACV,WAAW,KAAK,OAAO;AAAA,IACzB,CAAC;AACD,WAAO,OAAO;AAAA,EAChB,SAAS,OAAO;AACd,UAAM,YAAY;AAClB,UAAM,IAAI;AAAA,MACR;AAAA,MACA,8BAA8B,UAAU,UAAU,UAAU,OAAO;AAAA,MACnE;AAAA,MACA;AAAA,QACE,cAAc,UAAU;AAAA,QACxB,KAAK,QAAQ;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACF;;;ACzBA,IAAM,qBACJ;AAGK,SAAS,8BAA8C;AAC5D,SAAO;AAAA,IACL,cAAc,OAAO,YAAY,wBAAwB,OAAO;AAAA,IAChE,qBAAqB,OAAO,YAAY,+BAA+B,OAAO;AAAA,IAC9E,yBAAyB,OAAO,YAAY,mCAAmC,OAAO;AAAA,IACtF,wBAAwB,OAAO,YAAY,kCAAkC,OAAO;AAAA,EACtF;AACF;AAEA,eAAe,wBAAwB,SAGX;AAC1B,SAAO,gBAAgB,OAAO,SAAS;AACrC,UAAM,KAAK,KAAK,QAAQ,KAAK;AAAA,MAC3B,SAAS;AAAA,MACT,WAAW;AAAA,IACb,CAAC;AACD,UAAM,KAAK,eAAe,GAAI;AAE9B,UAAM,QAAQ,MAAM,KAAK,QAAQ,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,IAAK,CAAC,EAAE,MAAM,MAAM,EAAE;AAC1F,UAAM,aAAa,MAAM,KAAK,QAAQ,WAAW,EAAE;AAAA,MAAY,CAAC,UAC9D,MAAM,IAAI,CAAC,UAAU,KAAK,eAAe,IAAI,KAAK,CAAC,EAAE,OAAO,OAAO;AAAA,IACrE;AACA,UAAM,WAAW,MAAM,KAAK,QAAQ,MAAM,EAAE,UAAU,EAAE,SAAS,IAAK,CAAC;AACvE,UAAM,WAAW,uBAAuB,UAAU,KAAK;AACvD,UAAM,KAAK,iBAAiB,QAAQ,GAAG,KAAK,iBAAiB,QAAQ,KAAK,KAAK;AAE/E,QAAI,CAAC,MAAM,CAAC,SAAS,WAAW,WAAW,GAAG;AAC5C,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACE,OAAO,QAAQ;AAAA,UACf,KAAK,QAAQ;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAA0B;AAAA,MAC9B,SAAS;AAAA,QACP;AAAA,QACA,MAAM,WAAW,KAAK,IAAI;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,KAAK,IAAI;AAAA,IAChB;AAEA,QAAI,SAAS,eAAe,QAAW;AACrC,cAAQ,aAAa,SAAS;AAAA,IAChC;AACA,QAAI,SAAS,oBAAoB,QAAW;AAC1C,cAAQ,kBAAkB,SAAS;AAAA,IACrC;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,eAAe,kCAAkC,SAEX;AACpC,SAAO,gBAAgB,OAAO,SAAS;AACrC,UAAM,gBAAuC,CAAC;AAE9C,SAAK,GAAG,YAAY,CAAC,aAAa;AAChC,UAAI,CAAC,SAAS,IAAI,EAAE,SAAS,mBAAmB,GAAG;AACjD;AAAA,MACF;AAEA,WAAK,SAAS,KAAK,EAAE,KAAK,CAAC,SAAS;AAClC,sBAAc,KAAK,IAA2B;AAAA,MAChD,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,IAC1B,CAAC;AAED,UAAM,KAAK,KAAK,mDAAmD;AAAA,MACjE,SAAS;AAAA,MACT,WAAW;AAAA,IACb,CAAC;AACD,UAAM,qBAAqB,MAAM,eAAe,QAAQ,KAAK;AAE7D,UAAM,QAAQ,cAAc,QAAQ,CAAC,aAAa,aAAa,SAAS,QAAQ,CAAC,CAAC,CAAC;AACnF,UAAM,eAAe,cAAc,GAAG,EAAE;AAExC,QAAI,MAAM,WAAW,GAAG;AACtB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAmC;AAAA,MACvC,SAAS,cAAc,YAAY;AAAA,MACnC;AAAA,MACA,QAAQ;AAAA,IACV;AAEA,UAAM,OAAsD,CAAC;AAC7D,QAAI,cAAc,MAAM,mBAAmB,QAAW;AACpD,WAAK,eAAe,aAAa,KAAK;AAAA,IACxC;AACA,QAAI,cAAc,WAAW,QAAW;AACtC,WAAK,SAAS,aAAa;AAAA,IAC7B;AACA,QAAI,OAAO,KAAK,IAAI,EAAE,SAAS,GAAG;AAChC,aAAO,OAAO;AAAA,IAChB;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,eAAe,+BAA+B,SAIN;AACtC,SAAO,gBAAgB,OAAO,SAAS;AACrC,UAAM,gBAAuC,CAAC;AAE9C,SAAK,GAAG,YAAY,CAAC,aAAa;AAChC,UAAI,CAAC,wBAAwB,SAAS,IAAI,GAAG,QAAQ,WAAW,GAAG;AACjE;AAAA,MACF;AAEA,WAAK,SAAS,KAAK,EAAE,KAAK,CAAC,SAAS;AAClC,sBAAc,KAAK,IAA2B;AAAA,MAChD,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,IAC1B,CAAC;AAED,UAAM,KAAK,KAAK,QAAQ,KAAK;AAAA,MAC3B,SAAS;AAAA,MACT,WAAW;AAAA,IACb,CAAC;AACD,UAAM,qBAAqB,MAAM,eAAe,QAAQ,KAAK;AAE7D,UAAM,OAAO,oBAAI,IAAY;AAC7B,UAAM,oBAAoB,cAAc,MAAM,GAAG,QAAQ,KAAK;AAC9D,UAAM,QAAQ,kBACX,QAAQ,CAAC,aAAa,aAAa,SAAS,QAAQ,CAAC,CAAC,CAAC,EACvD,OAAO,CAAC,SAAS;AAChB,UAAI,KAAK,IAAI,KAAK,EAAE,GAAG;AACrB,eAAO;AAAA,MACT;AACA,WAAK,IAAI,KAAK,EAAE;AAChB,aAAO;AAAA,IACT,CAAC;AACH,UAAM,eAAe,kBAAkB,GAAG,EAAE;AAE5C,QAAI,MAAM,WAAW,GAAG;AACtB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACE,aAAa,QAAQ;AAAA,UACrB,KAAK,QAAQ;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAqC;AAAA,MACzC,aAAa,QAAQ;AAAA,MACrB,SAAS,cAAc,YAAY;AAAA,MACnC;AAAA,IACF;AAEA,UAAM,OAAwD,CAAC;AAC/D,QAAI,cAAc,MAAM,mBAAmB,QAAW;AACpD,WAAK,eAAe,aAAa,KAAK;AAAA,IACxC;AACA,QAAI,cAAc,WAAW,QAAW;AACtC,WAAK,SAAS,aAAa;AAAA,IAC7B;AACA,QAAI,OAAO,KAAK,IAAI,EAAE,SAAS,GAAG;AAChC,aAAO,OAAO;AAAA,IAChB;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,eAAe,mCAAmC,SAIZ;AACpC,SAAO,gBAAgB,OAAO,SAAS;AACrC,UAAM,QAAuB,CAAC;AAC9B,UAAM,OAAO,oBAAI,IAAY;AAC7B,QAAI,UAAU;AAEd,aAAS,YAAY,GAAG,YAAY,QAAQ,OAAO,aAAa,GAAG;AACjE,YAAM,MAAM,eAAe,QAAQ,SAAS,SAAS;AAErD,YAAM,KAAK,KAAK,KAAK;AAAA,QACnB,SAAS;AAAA,QACT,WAAW;AAAA,MACb,CAAC;AACD,YAAM,KAAK,eAAe,GAAI;AAE9B,gBAAU,WAAW,MAAM,KAAK,QAAQ,aAAa,EAAE,MAAM,IAAI;AAEjE,iBAAW,QAAQ,MAAM,2BAA2B,MAAM,QAAQ,OAAO,GAAG;AAC1E,YAAI,KAAK,IAAI,KAAK,EAAE,GAAG;AACrB;AAAA,QACF;AACA,aAAK,IAAI,KAAK,EAAE;AAChB,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AAEA,QAAI,WAAW,MAAM,WAAW,GAAG;AACjC,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACE,SAAS,QAAQ;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,MAAM,WAAW,GAAG;AACtB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACE,SAAS,QAAQ;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ;AAAA,IAClB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,eAAe,SAAiB,WAA2B;AAClE,QAAM,SAAS,IAAI,gBAAgB;AAAA,IACjC,aAAa,cAAc,IAAI,WAAW;AAAA,IAC1C,eAAe;AAAA,IACf,MAAM;AAAA,IACN,MAAM;AAAA,IACN;AAAA,IACA,UAAU,OAAO,SAAS;AAAA,IAC1B,IAAI;AAAA,IACJ,QAAQ,cAAc,IAAI,UAAU;AAAA,EACtC,CAAC;AAED,SAAO,iCAAiC,OAAO,SAAS,CAAC;AAC3D;AAEA,eAAe,gBAAmB,UAAkD;AAClF,MAAI;AACJ,MAAI;AAEJ,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,MAAM,eAAe;AAC1C,cAAU,MAAM,SAAS,OAAO,EAAE,UAAU,KAAK,CAAC;AAClD,cAAU,MAAM,QAAQ,WAAW;AAAA,MACjC,QAAQ;AAAA,MACR,WAAW;AAAA,IACb,CAAC;AACD,UAAM,OAAO,MAAM,QAAQ,QAAQ;AAEnC,WAAO,MAAM,SAAS,IAAI;AAAA,EAC5B,UAAE;AACA,UAAM,SAAS,MAAM,EAAE,MAAM,MAAM,MAAS;AAC5C,UAAM,SAAS,MAAM,EAAE,MAAM,MAAM,MAAS;AAAA,EAC9C;AACF;AAEA,eAAe,qBACb,MACA,WACA,OACe;AACf,QAAM,UAAU,KAAK,IAAI;AAEzB,SAAO,UAAU,SAAS,SAAS,KAAK,IAAI,IAAI,UAAU,MAAO;AAC/D,UAAM,KAAK,eAAe,GAAI;AAC9B,QAAI,UAAU,SAAS,OAAO;AAC5B,YAAM,KAAK,MAAM,MAAM,GAAG,GAAI;AAAA,IAChC;AAAA,EACF;AACF;AAEA,eAAe,iBAAuD;AACpE,MAAI;AACF,WAAO,MAAMG,oBAAmB,YAAY;AAAA,EAC9C,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AA6BA,SAAS,aAAa,OAA4C;AAChE,SAAO,MAAM,QAAQ,CAAC,SAAS;AAC7B,UAAM,KAAK,OAAO,KAAK,YAAY,KAAK,WAAW,KAAK,MAAM,EAAE;AAChE,UAAM,QAAQ,KAAK,SAAS,KAAK,SAAS;AAE1C,QAAI,CAAC,MAAM,CAAC,OAAO;AACjB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,SAAsB;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,KAAK,oBAAoB,KAAK,eAAe,KAAK,eAAe,KAAK,YAAY,EAAE;AAAA,IACtF;AAEA,UAAM,WAAW,KAAK,YAAY,KAAK;AACvC,QAAI,aAAa,QAAW;AAC1B,aAAO,WAAW;AAAA,IACpB;AACA,QAAI,KAAK,kBAAkB,QAAW;AACpC,aAAO,eAAe,KAAK;AAAA,IAC7B;AACA,QAAI,KAAK,cAAc,QAAW;AAChC,aAAO,QAAQ,KAAK;AAAA,IACtB;AACA,UAAM,aAAa,KAAK,cAAc,KAAK;AAC3C,QAAI,eAAe,QAAW;AAC5B,aAAO,aAAa;AAAA,IACtB;AACA,QAAI,KAAK,eAAe,QAAW;AACjC,aAAO,YAAY,KAAK;AAAA,IAC1B;AACA,QAAI,KAAK,eAAe,QAAW;AACjC,aAAO,cAAc;AAAA,QACnB,KAAK,IAAI,KAAK,KAAK,aAAa,GAAI,EAAE,YAAY;AAAA,QAClD,OAAOC,iBAAgB,KAAK,UAAU;AAAA,QACtC,SAAS,KAAK;AAAA,MAChB;AAAA,IACF;AAEA,WAAO,CAAC,MAAM;AAAA,EAChB,CAAC;AACH;AAEA,SAAS,oBAAoB,OAA2B,IAAoB;AAC1E,MAAI,CAAC,OAAO;AACV,WAAO,mCAAmC,EAAE;AAAA,EAC9C;AAEA,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,OAAO,yBAAyB;AACpD,WAAO,wBAAwB,IAAI,SAAS,CAAC,GAAG,OAAO,mCAAmC,EAAE;AAAA,EAC9F,QAAQ;AACN,WAAO,mCAAmC,EAAE;AAAA,EAC9C;AACF;AAEA,eAAe,2BAA2B,MAAY,SAAyC;AAC7F,QAAM,UAAU,MAAM,KAAK,QAAQ,GAAG,EAAE;AAAA,IAAY,CAAC,UACnD,MAAM,IAAI,CAAC,UAAU;AAAA,MACnB,MAAO,KAA2B;AAAA,MAClC,OAAO,KAAK,eAAe,IAAI,KAAK,EAAE,QAAQ,QAAQ,GAAG;AAAA,IAC3D,EAAE;AAAA,EACJ;AACA,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,QAAuB,CAAC;AAE9B,aAAW,UAAU,SAAS;AAC5B,UAAM,cAAc,wBAAwB,OAAO,IAAI;AAEvD,QAAI,CAAC,eAAe,CAAC,OAAO,QAAQ,OAAO,KAAK,SAAS,KAAK,KAAK,IAAI,YAAY,EAAE,GAAG;AACtF;AAAA,IACF;AAEA,SAAK,IAAI,YAAY,EAAE;AACvB,UAAM,KAAK;AAAA,MACT,IAAI,YAAY;AAAA,MAChB,OAAO,OAAO,KAAK,MAAM,GAAG,GAAG;AAAA,MAC/B,KAAK,YAAY;AAAA,IACnB,CAAC;AAED,QAAI,MAAM,UAAU,IAAI;AACtB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,2BAA2B,MAAM,KAAK,QAAQ,MAAM,EAAE,UAAU,EAAE,SAAS,IAAK,CAAC,GAAG,OAAO;AACpG;AAEA,SAAS,2BAA2B,MAAc,SAAgC;AAChF,QAAM,kBAAkB,oBAAI,IAAI;AAAA,IAC9B;AAAA,EACF,CAAC;AACD,QAAM,QAAQ,KACX,MAAM,KAAK,EACX,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,UAAU,MAAM,CAAC,gBAAgB,IAAI,IAAI,CAAC;AAEnE,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,QAAuB,CAAC;AAE9B,aAAW,QAAQ,OAAO;AACxB,UAAM,aAAa,KAAK,QAAQ,QAAQ,GAAG;AAC3C,QAAI,KAAK,IAAI,UAAU,GAAG;AACxB;AAAA,IACF;AACA,SAAK,IAAI,UAAU;AACnB,UAAM,KAAK;AAAA,MACT,IAAI,mBAAmB,SAAS,YAAY,MAAM,MAAM;AAAA,MACxD,OAAO,WAAW,MAAM,GAAG,GAAG;AAAA,MAC9B,KAAK,yCAAyC,mBAAmB,OAAO,CAAC;AAAA,IAC3E,CAAC;AAED,QAAI,MAAM,UAAU,IAAI;AACtB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,wBAAwB,MAAc,QAAQ,GAA4C;AACjG,MAAI,QAAQ,GAAG;AACb,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,iBAAiB,IAAI;AAEtC,MAAI,UAAU;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,KAAK,mCAAmC,QAAQ;AAAA,IAClD;AAAA,EACF;AAEA,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,IAAI;AACxB,UAAM,UAAU,IAAI,aAAa,IAAI,KAAK;AAE1C,QAAI,SAAS;AACX,aAAO,wBAAwB,SAAS,QAAQ,CAAC;AAAA,IACnD;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,UAAkB,OAGhD;AACA,QAAM,QAAQ,SAAS,MAAM,KAAK,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO;AAC7E,QAAM,aAAa,MAAM,UAAU,CAAC,SAAS,SAAS,KAAK;AAC3D,QAAM,eAAe,cAAc,IAAI,MAAM,aAAa,CAAC,IAAI;AAC/D,QAAM,QAAQ,cAAc,MAAM,cAAc;AAEhD,MAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG;AAC5B,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AAAA,IACL,YAAY,MAAM,CAAC;AAAA,IACnB,iBAAiB,MAAM,CAAC;AAAA,EAC1B;AACF;AAEA,SAAS,iBAAiB,OAAmC;AAC3D,SAAO,2BAA2B,KAAK,KAAK,IAAI,CAAC,KAC5C,WAAW,KAAK,KAAK,IAAI,CAAC,MACzB,QAAQ,KAAK,KAAK,IAAI,QAAQ;AACtC;AAEA,SAAS,wBAAwB,OAAe,aAA8B;AAC5E,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,KAAK;AACzB,UAAM,uBAAuB,IAAI,SAAS,SAAS,mBAAmB,MAElE,IAAI,aAAa,IAAI,UAAU,MAAM,wBAClC,IAAI,aAAa,IAAI,cAAc,MAAM;AAEhD,UAAM,mBAAmB,IAAI,SAAS,SAAS,wBAAwB,KAClE,IAAI,aAAa,IAAI,UAAU,MAAM,iBACrC,IAAI,aAAa,IAAI,OAAO,MAAM;AAEvC,WAAO,wBAAwB;AAAA,EACjC,QAAQ;AACN,WACE,MAAM,SAAS,mBAAmB,MAC9B,MAAM,SAAS,oBAAoB,KAAK,MAAM,SAAS,WAAW,MAEtE,MAAM,SAAS,wBAAwB,KACpC,MAAM,SAAS,aAAa,KAC5B,MAAM,SAAS,WAAW;AAAA,EAEjC;AACF;AAEA,SAAS,mBAAmB,SAAiB,OAAe,OAAuB;AACjF,MAAI,OAAO;AACX,QAAMC,SAAQ,GAAG,OAAO,IAAI,KAAK,IAAI,KAAK;AAE1C,aAAW,QAAQA,QAAO;AACxB,YAAQ,KAAK,WAAW,CAAC;AACzB,WAAO,KAAK,KAAK,MAAM,QAAQ;AAAA,EACjC;AAEA,SAAO,WAAW,SAAS,GAAG,SAAS,EAAE,CAAC;AAC5C;AAEA,SAASD,iBAAgB,kBAAkC;AACzD,SAAO,IAAI,KAAK,eAAe,SAAS;AAAA,IACtC,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,EACR,CAAC,EAAE,OAAO,IAAI,KAAK,mBAAmB,GAAI,CAAC;AAC7C;AAEA,IAAMD,sBAAqB,IAAI;AAAA,EAC7B;AAAA,EACA;AACF;;;AC/jBA,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;AACzB,IAAM,qBAA4D;AAAA,EAChE,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AACP;AAEO,SAAS,iCAAoD;AAClE,SAAO;AAAA,IACL,aAAa,OAAO,YAAY,YAAY,OAAO;AAAA,IACnD,cAAc,OAAO,YAAY,aAAa,OAAO;AAAA,EACvD;AACF;AAEA,eAAe,aAAa,SAGgB;AAC1C,QAAM,WAAW,mBAAmB,QAAQ,MAAM;AAClD,QAAM,MAAM,MAAM,UAAoB,GAAG,iBAAiB,IAAI,QAAQ,OAAO;AAC7E,QAAM,cAAc,IAAI,MAAM,GAAG,KAAK,IAAI,QAAQ,QAAQ,GAAG,QAAQ,KAAK,CAAC;AAC3E,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,YAAY,IAAI,CAAC,OAAO,UAAyC,GAAG,iBAAiB,SAAS,EAAE,OAAO,CAAC;AAAA,EAC1G;AACA,QAAM,QAAQ,SAAS,QAAQ,CAAC,SAAS,gBAAgB,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,KAAK;AAEtF,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,QAAQ;AAAA,EAClB;AACF;AAEA,eAAe,YAAY,SAIgB;AACzC,QAAM,SAAS,IAAI,gBAAgB;AAAA,IACjC,aAAa,OAAO,QAAQ,KAAK;AAAA,IACjC,OAAO,QAAQ;AAAA,IACf,MAAM;AAAA,EACR,CAAC;AACD,QAAM,WAAW,QAAQ,SAAS,SAAS,mBAAmB;AAC9D,QAAM,WAAW,MAAM,UAAqC,GAAG,gBAAgB,IAAI,QAAQ,IAAI,OAAO,SAAS,CAAC,EAAE;AAElH,SAAO;AAAA,IACL,OAAO,SAAS,KAAK,QAAQ,aAAa,EAAE,MAAM,GAAG,QAAQ,KAAK;AAAA,IAClE,OAAO,QAAQ;AAAA,EACjB;AACF;AAEA,eAAe,UAAa,KAAyB;AACnD,MAAI;AAEJ,MAAI;AACF,eAAW,MAAM,MAAM,KAAK;AAAA,MAC1B,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,cAAc;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR;AAAA,MACA,0CAA0C,SAAS,MAAM;AAAA,MACzD;AAAA,MACA;AAAA,QACE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,SAAS,KAAK;AAC7B;AA+BA,SAAS,gBAAgB,MAAuD;AAC9E,MAAI,CAAC,QAAQ,KAAK,WAAW,KAAK,QAAQ,KAAK,SAAS,WAAW,CAAC,KAAK,MAAM,CAAC,KAAK,OAAO;AAC1F,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,MACT,IAAI,KAAK;AAAA,MACT,OAAO,KAAK;AAAA,MACZ,KAAK,KAAK,OAAO,wCAAwC,KAAK,EAAE;AAAA,MAChE,GAAG,SAAS,UAAU,KAAK,EAAE;AAAA,MAC7B,GAAG,SAAS,gBAAgB,KAAK,WAAW;AAAA,MAC5C,GAAG,SAAS,SAAS,KAAK,KAAK;AAAA,MAC/B,GAAG,SAAS,QAAQ,KAAK,IAAI;AAAA,MAC7B,GAAG,SAAS,eAAe,KAAK,IAAI;AAAA,IACtC,CAAC;AAAA,EACH;AACF;AAEA,SAAS,cAAc,KAA6C;AAClE,QAAM,KAAK,IAAI,YAAY,eAAe,IAAI,QAAQ;AAEtD,MAAI,CAAC,MAAM,CAAC,IAAI,OAAO;AACrB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,MACT;AAAA,MACA,OAAO,IAAI;AAAA,MACX,KAAK,IAAI,OAAO,wCAAwC,EAAE;AAAA,MAC1D,GAAG,SAAS,UAAU,IAAI,MAAM;AAAA,MAChC,GAAG,SAAS,gBAAgB,IAAI,YAAY;AAAA,MAC5C,GAAG,SAAS,SAAS,IAAI,MAAM;AAAA,MAC/B,GAAG,SAAS,eAAe,IAAI,YAAY;AAAA,IAC7C,CAAC;AAAA,EACH;AACF;AAEA,SAAS,WAAWG,QASD;AACjB,QAAM,OAAuB;AAAA,IAC3B,IAAIA,OAAM;AAAA,IACV,OAAOA,OAAM;AAAA,IACb,MAAM;AAAA,IACN,KAAKA,OAAM;AAAA,EACb;AAEA,MAAIA,OAAM,WAAW,QAAW;AAC9B,SAAK,SAASA,OAAM;AAAA,EACtB;AACA,MAAIA,OAAM,iBAAiB,QAAW;AACpC,SAAK,eAAeA,OAAM;AAAA,EAC5B;AACA,MAAIA,OAAM,UAAU,QAAW;AAC7B,SAAK,QAAQA,OAAM;AAAA,EACrB;AACA,MAAIA,OAAM,SAAS,QAAW;AAC5B,SAAK,OAAOA,OAAM;AAAA,EACpB;AACA,MAAIA,OAAM,gBAAgB,QAAW;AACnC,SAAK,OAAO;AAAA,MACV,KAAK,IAAI,KAAKA,OAAM,cAAc,GAAI,EAAE,YAAY;AAAA,MACpD,SAASA,OAAM;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,OAA+C;AACrE,MAAI,CAAC,SAAS,CAAC,QAAQ,KAAK,KAAK,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,KAAK;AACrB;;;A9CpMA,IAAM,wBAAwB,MAAM,gBAAgB,EAAE,OAAO,OAAO,CAAC;AAc9D,SAAS,UAAU,YAAgC,CAAC,GAAG;AAC5D,QAAM,QAAQ,UAAU,SAAU,SAAS,SAAS;AACpD,QAAM,aAAa,UAAU,OAAO,QAAQ;AAC5C,QAAM,YAAY,UAAU,aAAa,OAAO,KAAK,oCAAoC,MAAM;AAC/F,QAAM,cAAc,UAAU,eAAe,yBAAyB;AACtE,QAAM,oBAAoB,UAAU,qBAAqB,+BAA+B;AACxF,QAAM,cAAc,UAAU,eAAe,yBAAyB;AACtE,QAAM,iBAAiB,UAAU,kBAAkB,4BAA4B;AAC/E,QAAM,eAAe,UAAU,gBAAgB,0BAA0B;AAMzE,MAAI,kBAEO,UAAU,aACjB,EAAE,SAAS,QAAQ,QAAQ,UAAU,UAAU,GAAG,YAAY,UAAU,WAAW,IACnF;AAEJ,QAAM,gBAAgB,MAAoB;AAExC,QAAI,mBAAmB,UAAU,YAAY;AAC3C,aAAO,UAAU;AAAA,IACnB;AAGA,QAAI,CAAC,iBAAiB;AACpB,YAAM,SAAS,aAAa,MAAM,MAAM;AACxC,YAAM,uBAAuB,sBAAsB;AAAA,QACjD;AAAA,QACA,gBAAgB,MAAM;AAAA,QACtB,KAAK;AAAA,MACP,CAAC;AAED,MAAAC,WAAUC,SAAQ,qBAAqB,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAEjE,UAAI;AACJ,UAAI;AACF,qBAAa,IAAI,aAAa,iBAAiB,qBAAqB,IAAI,CAAC;AAAA,MAC3E,SAAS,OAAO;AACd,cAAM,IAAI,mBAAmB,qBAAqB,MAAM,KAAK;AAAA,MAC/D;AAEA,wBAAkB,EAAE,SAAS,QAAQ,QAAQ,UAAU,GAAG,WAAW;AAAA,IACvE;AAIA,WAAO,gBAAgB;AAAA,EACzB;AAEA,SAAO,YAAY;AAAA,IACjB,SAAS,UAAU,WAAW;AAAA,IAC9B;AAAA,IACA,KAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,UAAU,QAAQ,OAAM,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpD;AAAA,IACA,yBAAyB,MAAM,wBAAwB,UAAU;AAAA,IACjE,QAAQ,UAAU,WAAW,CAAC,UAAU,QAAQ,OAAO,MAAM,KAAK;AAAA,IAClE,QAAQ,UAAU,WAAW,CAAC,UAAU,QAAQ,OAAO,MAAM,KAAK;AAAA,IAClE;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,eACpB,SACA,iBAAuF,uBACrE;AAClB,QAAM,WAAW,eAAe;AAEhC,MAAI;AACF,UAAM,SAAS,MAAM,SAAS,SAAS,GAAG,OAAO,SAAS;AAC1D,WAAO,OAAO,KAAK,EAAE,YAAY,MAAM;AAAA,EACzC,UAAE;AACA,aAAS,MAAM;AAAA,EACjB;AACF;AAGO,SAAS,iBAAiB,WAAmB,MAAyB;AAC3E,QAAM,aAAa,KAAK,CAAC;AAEzB,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,SAAO,aAAa,cAAc,SAAS,CAAC,MAAM,aAAa,UAAU;AAC3E;AAEA,IAAI,iBAAiB,YAAY,KAAK,QAAQ,IAAI,GAAG;AACnD,QAAM,MAAM,UAAU;AACtB,OAAK,IAAI,IAAI,QAAQ,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa;AACrD,YAAQ,WAAW;AAAA,EACrB,CAAC;AACH;","names":["mkdirSync","dirname","z","table","input","z","input","z","table","z","z","win32","win32","m","sec","basename","win32","win32","basename","join","join","input","sniffed","buildProxyOptions","candidate","extname","extname","table","z","input","z","table","z","z","table","input","normalizePages","z","articleOptionsSchema","parsePages","applyTableShortcut","z","table","SUPPORTED_SOURCES","parseSource","z","applyTableShortcut","z","listOptionsSchema","applyTableShortcut","parseLimit","table","Database","input","join","win32","bytesToGb","promisify","execFileAsync","promisify","input","loadOptionalModule","nodeExecFile","promisify","execFileAsync","promisify","nodeExecFile","loadOptionalModule","formatChinaTime","input","input","mkdirSync","dirname"]}